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@24019
|
9
|
pascal@24019
|
10 include "common.inc"
|
pascal@24019
|
11
|
pascal@19636
|
12 ifdef NO386
|
pascal@19636
|
13 p8086
|
pascal@19636
|
14 else
|
pascal@19515
|
15 p386
|
pascal@19636
|
16 endif
|
pascal@19515
|
17
|
pascal@23983
|
18 group DGROUP _TEXT
|
pascal@19515
|
19 assume cs:DGROUP,ds:DGROUP
|
pascal@19515
|
20
|
pascal@19515
|
21
|
pascal@19515
|
22 segment _TEXT byte public use16 'CODE'
|
pascal@19515
|
23
|
pascal@19515
|
24 ;***************************************************************
|
pascal@24579
|
25 ;u32 memtop();
|
pascal@19515
|
26 ;***************************************************************
|
pascal@24579
|
27 global _memtop:near
|
pascal@24579
|
28 proc _memtop near
|
pascal@19515
|
29 ;***************************************************************
|
pascal@24015
|
30 ;u32 memtop_e820()
|
pascal@24015
|
31 ;***************************************************************
|
pascal@24015
|
32 ; proc _memtop_e820 near
|
pascal@24015
|
33
|
pascal@24015
|
34 ifdef INT15_E820
|
pascal@24015
|
35
|
pascal@24015
|
36 struc e820 ;struct e820 {
|
pascal@24015
|
37 base dd ?,? ; 0 u64 base;
|
pascal@24015
|
38 length dd ?,? ; 8 u64 length;
|
pascal@24015
|
39 type db ?,?,?,? ;16 u32 type; 1=available
|
pascal@24015
|
40 ends e820 ;};
|
pascal@24015
|
41
|
pascal@24015
|
42 p386
|
pascal@24015
|
43 push ds
|
pascal@24015
|
44 pop es
|
pascal@24015
|
45 push di
|
pascal@24015
|
46 xor ebx,ebx
|
pascal@24015
|
47 @@e820lp:
|
pascal@24015
|
48 mov eax,0E820h
|
pascal@24015
|
49 mov edx,534D4150h ; 'SMAP'
|
pascal@24015
|
50 xor ecx,ecx
|
pascal@24015
|
51 mov cl,size e820
|
pascal@24015
|
52 extrn buf4k:byte
|
pascal@24015
|
53 mov di,offset buf4k
|
pascal@24015
|
54 int 15h
|
pascal@24015
|
55 jc @@err_e820
|
pascal@24015
|
56 ;cmp eax,534D4150h ; 'SMAP'
|
pascal@24015
|
57 ;jne @@err_e820
|
pascal@24015
|
58 cmp [(e820 di).type],1
|
pascal@24015
|
59 jnz @@notavail
|
pascal@24015
|
60 mov eax,[(e820 di).base]
|
pascal@24015
|
61 add eax,[(e820 di).length]
|
pascal@24015
|
62 push eax
|
pascal@24015
|
63 pop ax
|
pascal@24015
|
64 pop dx
|
pascal@24015
|
65 or dh,dh ; > 16M
|
pascal@24015
|
66 je @@notavail
|
pascal@24015
|
67 pop di
|
pascal@24015
|
68 ret
|
pascal@24015
|
69 @@notavail:
|
pascal@24015
|
70 or bx,bx
|
pascal@24015
|
71 jne @@e820lp
|
pascal@24015
|
72 @@err_e820:
|
pascal@24015
|
73 pop di
|
pascal@24015
|
74 endif
|
pascal@24015
|
75
|
pascal@24015
|
76 ; endp _memtop_e820
|
pascal@24015
|
77
|
pascal@24015
|
78 ;***************************************************************
|
pascal@19515
|
79 ;u32 memtop_e801()
|
pascal@19515
|
80 ;***************************************************************
|
pascal@19515
|
81 ; proc _memtop_e801 near
|
pascal@19515
|
82
|
pascal@19515
|
83 xor cx,cx ;fix to work around buggy
|
pascal@19515
|
84 xor dx,dx ; BIOSes which dont clear/set
|
pascal@24015
|
85 mov ax,0E801h ;ax=1kbs in 1-16M bx=64kbs above 16M extended
|
pascal@24015
|
86 int 15h ;cx=1kbs in 1-16M dx=64kbs above 16M configured
|
pascal@20453
|
87 xchg ax,cx ;kludge to handle BIOSes
|
pascal@20453
|
88 jcxz @@use_cxdx ; which report their extended
|
pascal@20453
|
89 ; memory in AX/BX rather than
|
pascal@20453
|
90 ; CX/DX. The spec I have read
|
pascal@19515
|
91 @@use_axbx: mov dx,bx ; seems to indicate AX/BX
|
pascal@19882
|
92 xchg ax,cx ; are more reasonable anyway...
|
pascal@20453
|
93 @@use_cxdx: ;now: dx=64k units above 16m
|
pascal@20453
|
94 ; ax=1k units above 1m below 16m (max 3c00h)
|
pascal@20510
|
95 or dx,dx
|
pascal@24015
|
96 jz @@below16M
|
pascal@19515
|
97 xor ax,ax ;ignore info on low 16M (assume full)
|
pascal@24015
|
98 inc dh ;account for low 16M
|
pascal@19515
|
99 ret
|
pascal@24015
|
100 @@below16M:
|
pascal@24015
|
101 or ax,ax
|
pascal@24015
|
102 jnz tokb ;dx=0 here, ax=kbs above 1m
|
pascal@19515
|
103 @@err:
|
pascal@19515
|
104 ; ret
|
pascal@19515
|
105 ; endp _memtop_e801
|
pascal@19515
|
106
|
pascal@19515
|
107
|
pascal@19515
|
108 ;***************************************************************
|
pascal@19515
|
109 ;u32 memtop_88()
|
pascal@19515
|
110 ;***************************************************************
|
pascal@19515
|
111 ; proc _memtop_88 near
|
pascal@19515
|
112
|
pascal@19515
|
113 mov ah,88h
|
pascal@19515
|
114 int 15h ;ax=kbs above 1m
|
pascal@24015
|
115 test ax,ax ; error: ax=0
|
pascal@20142
|
116 jnz tokb ;happens on big mem systems
|
pascal@19879
|
117
|
pascal@19879
|
118 ;***************************************************************
|
pascal@19879
|
119 ;u32 memtop_cmos()
|
pascal@19879
|
120 ;***************************************************************
|
pascal@19879
|
121
|
pascal@19879
|
122 ;memtop_cmos:
|
pascal@19879
|
123 pushf
|
pascal@19879
|
124 call rdcmos17
|
pascal@19879
|
125 popf
|
pascal@19515
|
126 tokb:
|
pascal@21757
|
127 mov cl,10 ;multiply by 1024
|
pascal@21757
|
128 ifndef NO386
|
pascal@21757
|
129 add ah,4h ;account for 1024 low kb
|
pascal@21757
|
130 setc dl ; (optimized to death)
|
pascal@21757
|
131 shld dx,ax,cl
|
pascal@21757
|
132 shl ax,cl ; (kbytes -> bytes)
|
pascal@21791
|
133 ret
|
pascal@21757
|
134 else
|
pascal@19634
|
135 xor dx,dx
|
pascal@19515
|
136 add ah,4h ;account for 1024 low kb
|
pascal@19515
|
137 adc dx,dx ; (optimized to death)
|
pascal@21791
|
138 db 0A9h ; test ax,0C28Ch
|
pascal@21791
|
139 global N_LXLSH@ES:near
|
pascal@21791
|
140 N_LXLSH@ES:
|
pascal@21791
|
141 mov dx,es
|
pascal@20142
|
142 global N_LXLSH@:near
|
pascal@20142
|
143 N_LXLSH@:
|
pascal@19883
|
144 mov ch,0
|
pascal@19515
|
145 @@lp:
|
pascal@19883
|
146 shl ax,1
|
pascal@19515
|
147 rcl dx,1
|
pascal@19515
|
148 loop @@lp
|
pascal@21791
|
149 ret
|
pascal@21791
|
150 global N_LXLSH@4:near
|
pascal@21791
|
151 N_LXLSH@4:
|
pascal@21791
|
152 xor dx,dx
|
pascal@21791
|
153 mov cl,4
|
pascal@21791
|
154 jmp N_LXLSH@
|
pascal@19515
|
155 endif
|
pascal@19883
|
156
|
pascal@19515
|
157 ; endp _memtop_88
|
pascal@19515
|
158
|
pascal@24579
|
159 ; proc _memtop near
|
pascal@19515
|
160
|
pascal@19515
|
161 ; call _memtop_e801
|
pascal@19515
|
162 ; jnz @@ok
|
pascal@19515
|
163 ; call _memtop_88
|
pascal@19515
|
164 ; jnz @@ok
|
pascal@19879
|
165 ; jmp memtop_cmos
|
pascal@19515
|
166
|
pascal@20142
|
167 rdcmos17: cli
|
pascal@20142
|
168 mov al,18h ; read bytes 17-18 from CMOS
|
pascal@19515
|
169 call @@rdcmos
|
pascal@19515
|
170 mov ah,al
|
pascal@19515
|
171 mov al,17h
|
pascal@19515
|
172 @@rdcmos: out 70h,al
|
pascal@19515
|
173 call @@ret
|
pascal@19515
|
174 in al,71h
|
pascal@19515
|
175 @@ret:
|
pascal@19515
|
176 ret
|
pascal@19515
|
177
|
pascal@19515
|
178
|
pascal@19515
|
179 ;***************************************************************
|
pascal@24579
|
180 ;u32 topload();
|
pascal@19515
|
181 ;***************************************************************
|
pascal@24579
|
182 global _topload:near
|
pascal@24579
|
183 _topload:
|
pascal@24579
|
184 call _memtop
|
pascal@19515
|
185 mov cx,40h ; min 4m
|
pascal@19515
|
186 ; If reported mem is ridiculously low, presume
|
pascal@19515
|
187 ; we had trouble detecting memory size
|
pascal@19515
|
188 cmp dx,cx
|
pascal@19515
|
189 jb @@set
|
pascal@23996
|
190 extrn _cmdnum:dword
|
pascal@23996
|
191 _topmem = _cmdnum+8
|
pascal@20528
|
192 mov cx,[word _topmem+2]
|
pascal@20528
|
193 inc cx ; jcxnz
|
pascal@20528
|
194 loop @@topmemset
|
pascal@20528
|
195 mov ch,10h ; default = max 256m
|
pascal@20528
|
196 @@topmemset:
|
pascal@19515
|
197 ; Kernel can have trouble with initrd at very high addr:
|
pascal@19515
|
198 ; limit mem top to 256m
|
pascal@19515
|
199 cmp dh,ch
|
pascal@19515
|
200 jb @@done
|
pascal@19515
|
201 @@set:
|
pascal@19515
|
202 xchg ax,cx
|
pascal@19515
|
203 cwd
|
pascal@19515
|
204 xchg ax,dx
|
pascal@19515
|
205 @@done:
|
pascal@19515
|
206 ; Round down to page boundary.
|
pascal@19515
|
207 ; Or else initrd's tail may end up in last, partial page.
|
pascal@19515
|
208 ; Kernel will refuse to use such initrd.
|
pascal@19515
|
209 and ax,0f000h
|
pascal@19515
|
210 ;@@ok:
|
pascal@19515
|
211 ret
|
pascal@19515
|
212
|
pascal@24579
|
213 endp _memtop
|
pascal@19515
|
214
|
pascal@19515
|
215 ;***************************************************************
|
pascal@19515
|
216 ;void hook_int15_88();
|
pascal@19515
|
217 ;***************************************************************
|
pascal@19515
|
218 global _hook_int15_88:near
|
pascal@19515
|
219 proc _hook_int15_88 near
|
pascal@19515
|
220
|
pascal@19515
|
221 ifndef xmm_hook
|
pascal@24013
|
222 ;mov ax,4300h
|
pascal@24013
|
223 ;int 2fh
|
pascal@24013
|
224 ;cmp al,80h ; 80h = XMS driver installed
|
pascal@24013
|
225 ;je @@skip
|
pascal@19515
|
226 endif
|
pascal@23983
|
227 saved15:
|
pascal@19883
|
228 xor bx,bx
|
pascal@19883
|
229 mov es,bx
|
pascal@19571
|
230 ifndef NO386
|
pascal@19876
|
231 push cs
|
pascal@19876
|
232 push offset int15_88
|
pascal@19876
|
233 pop eax
|
pascal@19883
|
234 xchg eax,[es:bx+15*4]
|
pascal@23983
|
235 mov [dword saved15],eax
|
pascal@19515
|
236 else
|
pascal@19876
|
237 mov ax,offset int15_88
|
pascal@23996
|
238 call saved15z
|
pascal@23996
|
239 mov ax,cs
|
pascal@23996
|
240 inc bx
|
pascal@23996
|
241 inc bx
|
pascal@23996
|
242 saved15z:
|
pascal@19883
|
243 xchg ax,[es:bx+15*4]
|
pascal@23996
|
244 mov [word bx+saved15],ax
|
pascal@19515
|
245 endif
|
pascal@21757
|
246 ;push ds
|
pascal@21757
|
247 ;pop es
|
pascal@19515
|
248 @@skip:
|
pascal@19515
|
249 ret
|
pascal@19515
|
250 int15_88:
|
pascal@19515
|
251 cmp ah,88h
|
pascal@19515
|
252 je @@do88
|
pascal@23983
|
253 jmp [dword saved15]
|
pascal@19515
|
254 @@do88:
|
pascal@19515
|
255 pushf
|
pascal@23983
|
256 call [dword saved15]
|
pascal@20510
|
257 or ax,ax
|
pascal@19515
|
258 jnz @@iret
|
pascal@19515
|
259
|
pascal@19515
|
260 ;****** Read extended mem size (CMOS bytes 17h,18h (lo,hi))
|
pascal@19515
|
261 call rdcmos17
|
pascal@19515
|
262 @@iret:
|
pascal@19515
|
263 iret
|
pascal@19515
|
264
|
pascal@19515
|
265 endp _hook_int15_88
|
pascal@19515
|
266
|
pascal@19515
|
267 ends _TEXT
|
pascal@19515
|
268
|
pascal@19515
|
269 end
|
pascal@19515
|
270
|
pascal@19515
|
271 ;###### END OF FILE ############################################
|