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

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