wok annotate linld/stuff/src/A20.ASM @ rev 24015

Up tazinst (112)
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu Feb 25 10:56:54 2021 +0000 (2021-02-25)
parents a946c1651082
children 61df94a0fa43
rev   line source
pascal@19515 1 ;***************************************************************
pascal@19515 2 ;****** This file is distributed under GPL
pascal@19515 3 ;***************************************************************
pascal@19515 4 ideal
pascal@21984 5 %PAGESIZE 1000
pascal@19515 6 %crefref
pascal@19515 7 %noincl
pascal@19515 8 %nomacs
pascal@19636 9 p8086
pascal@19515 10
pascal@19515 11 group DGROUP _TEXT,_DATA
pascal@19515 12 assume cs:DGROUP,ds:DGROUP
pascal@19515 13
pascal@19515 14 segment _DATA byte public use16 'DATA'
pascal@19515 15
pascal@19515 16 global die:near
pascal@19515 17 enable_a20_methods:
pascal@19515 18 dw _enable_a20_fast, _enable_a20_kbd, _enable_a20_xmm, die
pascal@23996 19 msg_a20 db "A20 broken",0
pascal@22668 20 extrn overflow:byte
pascal@22183 21 ifdef NO386
pascal@23996 22 bzimage86 db "8086 "
pascal@22183 23 endif
pascal@23996 24 global _bzimagestr:byte
pascal@23996 25 _bzimagestr db "bzImage",0
pascal@21758 26 global sssp:dword
pascal@21758 27 global _initrd_desc:dword
pascal@21758 28 _initrd_desc dd 90000218h
pascal@21758 29 org $-4
pascal@21758 30 sssp dd ?
pascal@19515 31
pascal@19515 32 ends _DATA
pascal@19515 33
pascal@19515 34 segment _TEXT byte public use16 'CODE'
pascal@19515 35
pascal@19515 36 global xmm_driver:near
pascal@19515 37 global _enable_a20_xmm:near
pascal@19515 38
pascal@19515 39 ;***************************************************************
pascal@19515 40 ;void enable_a20_kbd();
pascal@19515 41 ;***************************************************************
pascal@19515 42 proc _enable_a20_kbd near
pascal@19515 43
pascal@19515 44 call @@empty_8042
pascal@19515 45 mov al,0D1h ; command write
pascal@19515 46 out 64h,al
pascal@19515 47 call @@empty_8042
pascal@19515 48 mov al,0DFh ; A20 on
pascal@19515 49 out 60h,al
pascal@19515 50
pascal@19515 51 ; This routine checks that the keyboard command queue is empty
pascal@19515 52 ; (after emptying the output buffers)
pascal@19515 53 ; Some machines have delusions that the keyboard buffer is always full
pascal@19515 54 ; with no keyboard attached...
pascal@19515 55 ; If there is no keyboard controller, we will usually get 0xff
pascal@19515 56 ; to all the reads. With each IO taking a microsecond and
pascal@19515 57 ; a timeout of 100,000 iterations, this can take about half a
pascal@19515 58 ; second ("delay" == out to port 0x80). That should be ok,
pascal@19515 59 ; and should also be plenty of time for a real keyboard controller
pascal@19515 60 ; to empty.
pascal@19515 61
pascal@19515 62 @@empty_8042:
pascal@19515 63 xor cx,cx ; 64K iterations
pascal@19515 64 @@loop:
pascal@19515 65 call @@delay ; 8042 status port
pascal@19580 66 in al,64h
pascal@19580 67 test al,3 ; is output or input full?
pascal@19580 68 jz @@break ; no - break loop
pascal@19515 69 test al,1 ;
pascal@19515 70 jz @@no_output
pascal@19515 71 call @@delay ; yes: read it
pascal@19515 72 in al,60h ;
pascal@19515 73 @@no_output:
pascal@19515 74 loop @@loop
pascal@19515 75 @@break:
pascal@19515 76 ret
pascal@19515 77
pascal@19515 78 @@delay: out 80h,al
pascal@19515 79 ret
pascal@19515 80
pascal@19515 81 endp _enable_a20_kbd
pascal@19515 82
pascal@19515 83 ;***************************************************************
pascal@19515 84 ;void enable_a20_fast();
pascal@19515 85 ;***************************************************************
pascal@19515 86 proc _enable_a20_fast near
pascal@19515 87
pascal@19515 88 ; You must preserve the other bits here. Otherwise embarrasing things
pascal@19515 89 ; like laptops powering off on boot happen. Corrected version by Kira
pascal@19515 90 ; Brown from Linux 2.2
pascal@19515 91 in al,92h ;
pascal@19515 92 or al,02h ; "fast A20" version
pascal@19515 93 out 92h,al ; some chips have only this
pascal@19515 94 ret
pascal@19515 95
pascal@19515 96 endp _enable_a20_fast
pascal@19515 97
pascal@22180 98 include "himem.inc"
pascal@22180 99
pascal@19515 100 ;***************************************************************
pascal@22312 101 ;_fastcall void moverm(bx:u16 *p);
pascal@21757 102 ;***************************************************************
pascal@21757 103
pascal@22312 104 global @moverm$qpus:near
pascal@22312 105 @moverm$qpus:
pascal@21757 106 push si di
pascal@24013 107 xor di,di ; default setup 9000:0000
pascal@21757 108 extrn _heap_top:word
pascal@21757 109 ifdef NO386
pascal@22176 110 mov ax,[_heap_top]
pascal@22176 111 mov cl,4
pascal@22176 112 shr ax,cl
pascal@22176 113 mov dx,cs
pascal@23996 114 add dx,ax ; last used segment
pascal@22180 115 mov cx,0fffh
pascal@22288 116 extrn _pm_low:byte
pascal@22288 117 test [_pm_low],cl
pascal@22288 118 jne @zimage
pascal@22183 119 extrn _cpu386:byte
pascal@22183 120 test [_cpu386],cl
pascal@22180 121 jne @bzimage
pascal@24013 122 mov bx,offset bzimage86 ; no himem with 8086 !
pascal@22229 123 @godie:
pascal@22229 124 call near die
pascal@22183 125 @zimage:
pascal@22180 126 xchg ax,dx
pascal@22180 127 cmp ax,cx
pascal@22180 128 jae @sys@ok
pascal@23996 129 xchg ax,cx ; segment min 1000h
pascal@22180 130 @sys@ok:
pascal@24013 131 inc ax ; first free segment
pascal@22180 132 extrn N_LXLSH@4:near
pascal@22180 133 call N_LXLSH@4
pascal@22312 134 mov [word ((image_himem bx+4).fallback)],ax
pascal@22312 135 mov [word ((image_himem bx+4).fallback)+2],dx
pascal@22312 136 add ax,[word ((image_himem bx+4).size)]
pascal@22312 137 adc dx,[word ((image_himem bx+4).size)+2]
pascal@22180 138 ifdef MOVE_SETUP
pascal@22181 139 mov di,8000h
pascal@24013 140 sub di,[bx] ; rm_size
pascal@22181 141 extrn _rm_offset:word
pascal@22181 142 mov [_rm_offset],di
pascal@24013 143 sub ax,di ; -rm_offset
pascal@22180 144 sbb dx,cx
pascal@22180 145 endif
pascal@22180 146 mov cl,12
pascal@24013 147 shl dx,cl ; last sys segment
pascal@24013 148 ifndef LARGE_ZIMAGE
pascal@24013 149 ;jc @jbe_overflow ; >= 1Mb ???
pascal@24013 150 else
pascal@24013 151 ;jnc @bzimage ; < 1Mb
pascal@24013 152 ;mov dh,-1
pascal@24013 153 endif
pascal@22180 154 @bzimage:
pascal@21757 155 extrn _topseg:near
pascal@21757 156 call near _topseg
pascal@21757 157 mov [word sssp+2],ax
pascal@24013 158 and ch,0 ; vcpi flag
pascal@22183 159 org $-1
pascal@22183 160 global _vcpi:byte
pascal@22183 161 _vcpi db ?
pascal@21757 162 else
pascal@21757 163 p386
pascal@22180 164 movzx eax,[word _heap_top]
pascal@21757 165 shr ax,4
pascal@22176 166 mov dx,cs
pascal@23996 167 add ax,dx ; last used segment
pascal@22180 168 mov cx,0fffh
pascal@22288 169 extrn _pm_low:byte
pascal@22288 170 test [_pm_low],cl
pascal@22288 171 je @bzimage
pascal@22180 172 cmp ax,cx
pascal@22180 173 jae @sys@ok
pascal@23996 174 xchg ax,cx ; segment min 1000h
pascal@22180 175 @sys@ok:
pascal@24013 176 inc ax ; first free segment
pascal@22180 177 shl eax,4
pascal@22312 178 mov [(image_himem bx+4).fallback],eax
pascal@22312 179 add eax,[(image_himem bx+4).size]
pascal@22180 180 ifdef MOVE_SETUP
pascal@22181 181 mov di,8000h
pascal@24013 182 sub di,[bx] ; rm_size
pascal@22180 183 extrn _rm_offset:word
pascal@22181 184 mov [_rm_offset],di
pascal@24013 185 movzx ecx,di ; -rm_offset
pascal@22180 186 sub eax,ecx
pascal@22180 187 endif
pascal@24013 188 shr eax,4
pascal@22181 189 mov ch,0
pascal@22180 190 @bzimage:
pascal@22180 191 xchg ax,dx
pascal@22176 192 mov ax,9000h
pascal@22183 193 extrn _vcpi:byte
pascal@22183 194 and ch,[_vcpi]
pascal@21757 195 endif
pascal@23996 196 add dh,ch ; 60k room for malloc_bufv_or_die
pascal@22229 197 cmp ax,dx
pascal@24013 198 ifdef LARGE_ZIMAGE
pascal@24013 199 ja @nooverflow0
pascal@24013 200 extrn _cmdnum:dword
pascal@24013 201 base_himem = (dword _cmdnum+12)
pascal@24013 202 ifdef NO386
pascal@24013 203 les cx,[base_himem]
pascal@24013 204 mov [word ((image_himem bx+4).fallback)],cx
pascal@24013 205 mov [word ((image_himem bx+4).fallback)+2],es
pascal@24013 206 else
pascal@24013 207 mov ecx,[base_himem]
pascal@24013 208 mov [(image_himem bx+4).fallback],ecx
pascal@24013 209 endif
pascal@24013 210 @nooverflow0:
pascal@24013 211 endif
pascal@22312 212 les cx,[bx] ; rm_size
pascal@22312 213 mov si,es ; rm_buf
pascal@24013 214 ifndef LARGE_ZIMAGE
pascal@22229 215 @jbe_overflow:
pascal@21757 216 ; Oops! We can stomp on our toes... better stop now
pascal@21757 217 mov bx,offset overflow
pascal@22229 218 ifdef NO386
pascal@22229 219 jbe @godie
pascal@22229 220 else
pascal@22229 221 ja @nooverflow
pascal@21757 222 call near die
pascal@22180 223 @nooverflow:
pascal@22229 224 endif
pascal@24013 225 endif
pascal@22181 226 mov es,ax
pascal@22170 227 @@move_clear:
pascal@22170 228 movsb
pascal@22176 229 mov [byte si-1],al
pascal@22170 230 loop @@move_clear
pascal@21757 231 ;push ds
pascal@21757 232 ;pop es
pascal@21757 233 ;pop di si
pascal@21757 234 pop di
pascal@21757 235
pascal@21757 236 ;***************************************************************
pascal@19580 237 ;void enable_a20_or_die();
pascal@19580 238 ;***************************************************************
pascal@19580 239 proc _enable_a20_or_die near
pascal@19580 240
pascal@21757 241 ;push si
pascal@19580 242 mov si,offset enable_a20_methods
pascal@19580 243 jmp @@check
pascal@19580 244 @@loop:
pascal@19580 245 lodsw
pascal@19580 246 mov bx,offset msg_a20
pascal@19580 247 call ax
pascal@19580 248 @@check:
pascal@19580 249 ;call _check_a20
pascal@19580 250 ;***************************************************************
pascal@19515 251 ;int check_a20();
pascal@19515 252 ;***************************************************************
pascal@19580 253 ;proc _check_a20 near
pascal@19515 254
pascal@19515 255 ; From linux kernel setup.S:
pascal@19515 256 ; wait until a20 really *is* enabled; it can take a fair amount of
pascal@19515 257 ; time on certain systems; Toshiba Tecras are known to have this
pascal@19515 258 ; problem.
pascal@19515 259
pascal@21757 260 push ds
pascal@19515 261 xor bx,bx
pascal@19515 262 mov ds,bx
pascal@19515 263 mov cx,0FFFFh
pascal@19515 264 mov es,cx
pascal@19515 265 a20lp:
pascal@23996 266 cli ; A20 off A20 on
pascal@23996 267 mov ax,0AA55h ; al ah [bx] al ah [bx] es:[bx+10h]
pascal@23996 268 xchg al,[bx] ; ?? AA 55 ?1 AA 55 ?2
pascal@23996 269 xchg ah,[es:bx+10h] ; ?? 55 AA ?1 ?2 55 AA
pascal@23996 270 xchg al,[bx] ; AA 55 ?? 55 ?2 ?1 AA
pascal@19515 271 cmp al,55h
pascal@19515 272 sti
pascal@23996 273 loopne a20lp
pascal@23996 274 jne a20ko
pascal@23996 275 xchg ah,[es:bx+10h] ; AA ?? 55 55 AA ?1 ?2
pascal@19515 276 a20ko:
pascal@21757 277 ;xchg ax,cx
pascal@21757 278 pop ds
pascal@19580 279 ;ret
pascal@19515 280
pascal@19580 281 ;endp _check_a20
pascal@19515 282
pascal@19515 283 jne @@loop
pascal@21757 284 ;push ds
pascal@21757 285 ;pop es
pascal@19515 286 pop si
pascal@19515 287 ret
pascal@19515 288
pascal@19515 289 endp _enable_a20_or_die
pascal@19515 290
pascal@19515 291 ends _TEXT
pascal@19515 292
pascal@19515 293 end
pascal@19515 294
pascal@19515 295 ;###### END OF FILE ############################################