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@21757
|
20 overflow db "Loaded too close to 9000:0",0
|
pascal@21758
|
21 global sssp:dword
|
pascal@21758
|
22 global _initrd_desc:dword
|
pascal@21758
|
23 _initrd_desc dd 90000218h
|
pascal@21758
|
24 org $-4
|
pascal@21758
|
25 sssp dd ?
|
pascal@19515
|
26
|
pascal@19515
|
27 ends _DATA
|
pascal@19515
|
28
|
pascal@19515
|
29 segment _TEXT byte public use16 'CODE'
|
pascal@19515
|
30
|
pascal@19515
|
31 global xmm_driver:near
|
pascal@19515
|
32 global _enable_a20_xmm:near
|
pascal@19515
|
33
|
pascal@19515
|
34 ;***************************************************************
|
pascal@19515
|
35 ;void enable_a20_kbd();
|
pascal@19515
|
36 ;***************************************************************
|
pascal@19515
|
37 proc _enable_a20_kbd near
|
pascal@19515
|
38
|
pascal@19515
|
39 call @@empty_8042
|
pascal@19515
|
40 mov al,0D1h ; command write
|
pascal@19515
|
41 out 64h,al
|
pascal@19515
|
42 call @@empty_8042
|
pascal@19515
|
43 mov al,0DFh ; A20 on
|
pascal@19515
|
44 out 60h,al
|
pascal@19515
|
45
|
pascal@19515
|
46 ; This routine checks that the keyboard command queue is empty
|
pascal@19515
|
47 ; (after emptying the output buffers)
|
pascal@19515
|
48 ; Some machines have delusions that the keyboard buffer is always full
|
pascal@19515
|
49 ; with no keyboard attached...
|
pascal@19515
|
50 ; If there is no keyboard controller, we will usually get 0xff
|
pascal@19515
|
51 ; to all the reads. With each IO taking a microsecond and
|
pascal@19515
|
52 ; a timeout of 100,000 iterations, this can take about half a
|
pascal@19515
|
53 ; second ("delay" == out to port 0x80). That should be ok,
|
pascal@19515
|
54 ; and should also be plenty of time for a real keyboard controller
|
pascal@19515
|
55 ; to empty.
|
pascal@19515
|
56
|
pascal@19515
|
57 @@empty_8042:
|
pascal@19515
|
58 xor cx,cx ; 64K iterations
|
pascal@19515
|
59 @@loop:
|
pascal@19515
|
60 call @@delay ; 8042 status port
|
pascal@19580
|
61 in al,64h
|
pascal@19580
|
62 test al,3 ; is output or input full?
|
pascal@19580
|
63 jz @@break ; no - break loop
|
pascal@19515
|
64 test al,1 ;
|
pascal@19515
|
65 jz @@no_output
|
pascal@19515
|
66 call @@delay ; yes: read it
|
pascal@19515
|
67 in al,60h ;
|
pascal@19515
|
68 @@no_output:
|
pascal@19515
|
69 loop @@loop
|
pascal@19515
|
70 @@break:
|
pascal@19515
|
71 ret
|
pascal@19515
|
72
|
pascal@19515
|
73 @@delay: out 80h,al
|
pascal@19515
|
74 ret
|
pascal@19515
|
75
|
pascal@19515
|
76 endp _enable_a20_kbd
|
pascal@19515
|
77
|
pascal@19515
|
78 ;***************************************************************
|
pascal@19515
|
79 ;void enable_a20_fast();
|
pascal@19515
|
80 ;***************************************************************
|
pascal@19515
|
81 proc _enable_a20_fast near
|
pascal@19515
|
82
|
pascal@19515
|
83 ; You must preserve the other bits here. Otherwise embarrasing things
|
pascal@19515
|
84 ; like laptops powering off on boot happen. Corrected version by Kira
|
pascal@19515
|
85 ; Brown from Linux 2.2
|
pascal@19515
|
86 in al,92h ;
|
pascal@19515
|
87 or al,02h ; "fast A20" version
|
pascal@19515
|
88 out 92h,al ; some chips have only this
|
pascal@19515
|
89 ret
|
pascal@19515
|
90
|
pascal@19515
|
91 endp _enable_a20_fast
|
pascal@19515
|
92
|
pascal@19515
|
93 ;***************************************************************
|
pascal@21757
|
94 ;_fastcall void moverm(bx:struct himem *m);
|
pascal@21757
|
95 ;***************************************************************
|
pascal@21757
|
96
|
pascal@21757
|
97 global @moverm$qp11image_himem:near
|
pascal@21757
|
98 @moverm$qp11image_himem:
|
pascal@21757
|
99 push si di
|
pascal@21757
|
100 extrn _heap_top:word
|
pascal@21757
|
101 ifdef NO386
|
pascal@21757
|
102 extrn _topseg:near
|
pascal@21757
|
103 call near _topseg
|
pascal@21757
|
104 mov cl,4
|
pascal@21757
|
105 mov [word sssp+2],ax
|
pascal@21757
|
106 xchg ax,dx
|
pascal@21757
|
107 mov ax,[_heap_top]
|
pascal@21757
|
108 shr ax,cl
|
pascal@21757
|
109 else
|
pascal@21757
|
110 p386
|
pascal@21757
|
111 mov ax,[_heap_top]
|
pascal@21757
|
112 shr ax,4
|
pascal@21757
|
113 mov dx,9000h
|
pascal@21757
|
114 endif
|
pascal@21757
|
115 mov es,dx
|
pascal@21757
|
116 mov cx,cs
|
pascal@21757
|
117 add ax,cx
|
pascal@21757
|
118 cmp ax,dx
|
pascal@21757
|
119 jb @@nooverflow
|
pascal@21757
|
120 ; Oops! We can stomp on our toes... better stop now
|
pascal@21757
|
121 mov bx,offset overflow
|
pascal@21757
|
122 call near die
|
pascal@21757
|
123 @@nooverflow:
|
pascal@21757
|
124 mov cx,[bx-5] ; size
|
pascal@21757
|
125 mov si,[bx-2] ; data
|
pascal@21757
|
126 xor di,di
|
pascal@22170
|
127 @@move_clear:
|
pascal@22170
|
128 movsb
|
pascal@22170
|
129 mov [byte si-1],0
|
pascal@22170
|
130 loop @@move_clear
|
pascal@21757
|
131 ;push ds
|
pascal@21757
|
132 ;pop es
|
pascal@21757
|
133 ;pop di si
|
pascal@21757
|
134 pop di
|
pascal@21757
|
135
|
pascal@21757
|
136 ;***************************************************************
|
pascal@19580
|
137 ;void enable_a20_or_die();
|
pascal@19580
|
138 ;***************************************************************
|
pascal@19580
|
139 proc _enable_a20_or_die near
|
pascal@19580
|
140
|
pascal@21757
|
141 ;push si
|
pascal@19580
|
142 mov si,offset enable_a20_methods
|
pascal@19580
|
143 jmp @@check
|
pascal@19580
|
144 @@loop:
|
pascal@19580
|
145 lodsw
|
pascal@19580
|
146 mov bx,offset msg_a20
|
pascal@19580
|
147 call ax
|
pascal@19580
|
148 @@check:
|
pascal@19580
|
149 ;call _check_a20
|
pascal@19580
|
150 ;***************************************************************
|
pascal@19515
|
151 ;int check_a20();
|
pascal@19515
|
152 ;***************************************************************
|
pascal@19580
|
153 ;proc _check_a20 near
|
pascal@19515
|
154
|
pascal@19515
|
155 ; From linux kernel setup.S:
|
pascal@19515
|
156 ; wait until a20 really *is* enabled; it can take a fair amount of
|
pascal@19515
|
157 ; time on certain systems; Toshiba Tecras are known to have this
|
pascal@19515
|
158 ; problem.
|
pascal@19515
|
159
|
pascal@21757
|
160 push ds
|
pascal@19515
|
161 xor bx,bx
|
pascal@19515
|
162 mov ds,bx
|
pascal@19515
|
163 mov cx,0FFFFh
|
pascal@19515
|
164 mov es,cx
|
pascal@19515
|
165 a20lp:
|
pascal@19515
|
166 cli
|
pascal@19515
|
167 mov ax,0AA55h
|
pascal@19515
|
168 xchg al,[bx]
|
pascal@19515
|
169 xchg ah,[es:bx+10h]
|
pascal@19515
|
170 xchg al,[bx]
|
pascal@19515
|
171 xchg ah,[es:bx+10h]
|
pascal@19515
|
172 cmp al,55h
|
pascal@19515
|
173 sti
|
pascal@19515
|
174 a20ko:
|
pascal@19515
|
175 loopne a20lp
|
pascal@21757
|
176 ;xchg ax,cx
|
pascal@21757
|
177 pop ds
|
pascal@19580
|
178 ;ret
|
pascal@19515
|
179
|
pascal@19580
|
180 ;endp _check_a20
|
pascal@19515
|
181
|
pascal@19515
|
182 jne @@loop
|
pascal@21757
|
183 ;push ds
|
pascal@21757
|
184 ;pop es
|
pascal@19515
|
185 pop si
|
pascal@19515
|
186 ret
|
pascal@19515
|
187
|
pascal@19515
|
188 endp _enable_a20_or_die
|
pascal@19515
|
189
|
pascal@19515
|
190 ends _TEXT
|
pascal@19515
|
191
|
pascal@19515
|
192 end
|
pascal@19515
|
193
|
pascal@19515
|
194 ;###### END OF FILE ############################################
|