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

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