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 |