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@22180
|
20 overflow db "Out of memory",0
|
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@21757
|
99 ;_fastcall void moverm(bx:struct himem *m);
|
pascal@21757
|
100 ;***************************************************************
|
pascal@21757
|
101
|
pascal@21757
|
102 global @moverm$qp11image_himem:near
|
pascal@21757
|
103 @moverm$qp11image_himem:
|
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@22180
|
132 mov [word ((image_himem bx).fallback)],ax
|
pascal@22180
|
133 mov [word ((image_himem bx).fallback)+2],dx
|
pascal@22180
|
134 add ax,[word ((image_himem bx).size)]
|
pascal@22180
|
135 adc dx,[word ((image_himem bx).size)+2]
|
pascal@22180
|
136 ifdef MOVE_SETUP
|
pascal@22181
|
137 mov di,8000h
|
pascal@22181
|
138 sub di,[bx-4] ; 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@22180
|
171 mov [(image_himem bx).fallback],eax
|
pascal@22180
|
172 add eax,[(image_himem bx).size]
|
pascal@22180
|
173 ifdef MOVE_SETUP
|
pascal@22181
|
174 mov di,8000h
|
pascal@22181
|
175 sub di,[bx-4] ; 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@22229
|
191 les cx,[bx-4] ; rm size
|
pascal@22229
|
192 mov si,es ; rm data
|
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 ############################################
|