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