wok annotate syslinux/stuff/iso2exe/a20.c @ rev 16515

Prepa for 5.0-RC1
author Christophe Lincoln <pankso@slitaz.org>
date Fri Apr 25 04:31:00 2014 +0200 (2014-04-25)
parents
children 3e7ad70145ce
rev   line source
pascal@16069 1 #ifndef __A20
pascal@16069 2 #define __A20
pascal@16069 3
pascal@16069 4 // http://www.win.tue.nl/~aeb/linux/kbd/A20.html
pascal@16069 5 static void a20enable(void)
pascal@16069 6 {
pascal@16069 7 #asm
pascal@16069 8 call a20test
pascal@16069 9
pascal@16069 10 in al, 0x92 // fast A20
pascal@16069 11 test al, #0x2
pascal@16069 12 jnz no92
pascal@16069 13 or al, #0x2 // Enable A20
pascal@16069 14 and al, #0xFE // Do not reset machine
pascal@16069 15 out 0x92, al
pascal@16069 16 call a20test
pascal@16069 17 no92:
pascal@16069 18 call empty_8042
pascal@16069 19 mov al, #0xD1 // command write
pascal@16069 20 out 0x64, al
pascal@16069 21 call empty_8042
pascal@16069 22 mov al, #0xDF // Enable A20
pascal@16069 23 out 0x60, al
pascal@16069 24 call empty_8042
pascal@16069 25
pascal@16069 26 mov al, #0xFF // Null command, but UHCI wants it
pascal@16069 27 out 0x64, al
pascal@16069 28 call empty_8042
pascal@16069 29 call a20test
pascal@16069 30
pascal@16069 31 mov ax, #0x2401
pascal@16069 32 int 0x15
pascal@16069 33 call a20test
pascal@16069 34
pascal@16069 35 in al, 0xEE // fast enable A20
pascal@16069 36 jmp a20test
pascal@16069 37
pascal@16069 38 empty_8042:
pascal@16069 39 mov ah, #-32
pascal@16069 40 wait_8042:
pascal@16069 41 in al, 0x64
pascal@16069 42 inc ax // FF 32x : no kbd
pascal@16069 43 jz enabled
pascal@16069 44 dec ax
pascal@16069 45 shr ax, #1 // Bit 0: input data
pascal@16069 46 jc data
pascal@16069 47 shr ax, #1 // Bit 1: buffer empty
pascal@16069 48 jc wait_8042
pascal@16069 49 ret
pascal@16069 50 data:
pascal@16069 51 in al, 0x60 // read data
pascal@16069 52 jmp wait_8042
pascal@16069 53 a20test:
pascal@16069 54 push ds
pascal@16069 55 xor cx, cx
pascal@16069 56 xor bx, bx
pascal@16069 57 mov ds, cx // ds = 0000
pascal@16069 58 dec cx
pascal@16069 59 mov gs, cx // gs = FFFF
pascal@16069 60 cli
pascal@16069 61 a1:
pascal@16069 62 mov ax, [bx]
pascal@16069 63 not ax
pascal@16069 64 mov dx, ax
pascal@16069 65 seg gs
pascal@16069 66 xchg dx, [bx+10]
pascal@16069 67 cmp ax, [bx]
pascal@16069 68 seg gs
pascal@16069 69 mov [bx+10], dx
pascal@16069 70 loopne a1
pascal@16069 71 pop ds
pascal@16069 72 xchg ax, cx
pascal@16069 73 sti
pascal@16069 74 jne enabled
pascal@16069 75 pop cx // quit a20enable
pascal@16069 76 enabled:
pascal@16069 77 ret // ax != 0 : enabled
pascal@16069 78 #endasm
pascal@16069 79 }
pascal@16069 80
pascal@16069 81 #define A20HOLDBUFFER 0x80000
pascal@16069 82 static int a20buffer = 0;
pascal@16069 83 static void movehia20(void)
pascal@16069 84 {
pascal@16069 85 if ((mem.base - 0x100000UL) >= 0x10000UL) {
pascal@16069 86 movehi();
pascal@16069 87 return;
pascal@16069 88 }
pascal@16069 89 a20buffer = 1;
pascal@16069 90 #asm
pascal@16069 91 pusha
pascal@16069 92 push #A20HOLDBUFFER/16
pascal@16069 93 pop es
pascal@16069 94 mov di, _mem // mem.base & 0xFFFF
pascal@16069 95 mov si, #_buffer
pascal@16069 96 mov cx, #BUFFERSZ/2
pascal@16069 97 cld
pascal@16069 98 rep
pascal@16069 99 movsw
pascal@16069 100 popa
pascal@16069 101 #endasm
pascal@16069 102 }
pascal@16069 103 #define movehi movehia20
pascal@16069 104
pascal@16069 105 #define REALMODE_SWITCH _realmode_switch_a20
pascal@16069 106 static void realmode_switch_a20(void)
pascal@16069 107 {
pascal@16069 108 if (!a20buffer) return;
pascal@16069 109 a20enable();
pascal@16069 110 #asm
pascal@16069 111 pusha
pascal@16069 112 xor di, di // 30
pascal@16069 113 mov cx, #9 // 2E..1E
pascal@16069 114 a20z1:
pascal@16069 115 push di
pascal@16069 116 loop a20z1
pascal@16069 117 push #0x10
pascal@16069 118 push di // 1A 0x100000
pascal@16069 119 push #-1 // 18
pascal@16069 120 push di // 16
pascal@16069 121 push #A20HOLDBUFFER/0x10000
pascal@16069 122 push di // 12 A20HOLDBUFFER
pascal@16069 123 push #-1 // 10
pascal@16069 124 mov cl, #8 // 0E..00
pascal@16069 125 a20z2:
pascal@16069 126 push di
pascal@16069 127 loop a20z2
pascal@16069 128 mov ch, #0x10000/512
pascal@16069 129 push ss
pascal@16069 130 pop es
pascal@16069 131 mov si, sp
pascal@16069 132 mov ax, #0x8793
pascal@16069 133 mov [si+0x15], al
pascal@16069 134 xchg [si+0x1D], al
pascal@16069 135 xchg [si+0x1F], al // bits 24..31
pascal@16069 136 int 0x15
pascal@16069 137 add sp, #0x30
pascal@16069 138 popa
pascal@16069 139 #endasm
pascal@16069 140 }
pascal@16069 141
pascal@16069 142 #endif