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@24019
|
9
|
pascal@24019
|
10 include "common.inc"
|
pascal@24022
|
11 include "himem.inc"
|
pascal@24022
|
12 include "isostate.inc"
|
pascal@24022
|
13
|
pascal@24022
|
14 ifdef QUICK_BOOT
|
pascal@24022
|
15 CMDNUMCNT = 7
|
pascal@24022
|
16 else
|
pascal@24022
|
17 CMDNUMCNT = 5
|
pascal@24022
|
18 endif
|
pascal@24022
|
19
|
pascal@24022
|
20 macro alloc_isostate
|
pascal@24022
|
21 public _isostate
|
pascal@24022
|
22 _isostate isostate <?>
|
pascal@24022
|
23 org $-ISOSTATE_OVERLAP
|
pascal@24022
|
24 endm
|
pascal@24022
|
25
|
pascal@24022
|
26 macro alloc_image
|
pascal@24022
|
27 rm_size dw ? ; _imgs-4
|
pascal@24022
|
28 rm_buf dw ? ; _imgs-2
|
pascal@24022
|
29 global _imgs:byte
|
pascal@24022
|
30 label _imgs byte
|
pascal@24022
|
31 img_kernel image_himem ?
|
pascal@24022
|
32 img_initrd image_himem ?
|
pascal@24022
|
33 endm
|
pascal@24022
|
34
|
pascal@24022
|
35 macro alloc_misc
|
pascal@24022
|
36 global _cmdnum:word
|
pascal@24022
|
37 label _cmdnum word
|
pascal@24022
|
38 dd CMDNUMCNT dup(?)
|
pascal@24022
|
39
|
pascal@24022
|
40 global _himem_buf:dword
|
pascal@24022
|
41 _himem_buf dd ?
|
pascal@24022
|
42 endm
|
pascal@24019
|
43
|
pascal@19636
|
44 p8086
|
pascal@19515
|
45
|
pascal@19515
|
46 group DGROUP _TEXT,_DATA,_BSS
|
pascal@19515
|
47 assume cs:DGROUP,ds:DGROUP
|
pascal@19515
|
48
|
pascal@19515
|
49 segment _TEXT byte public use16 'CODE'
|
pascal@20451
|
50 ends _TEXT
|
pascal@20451
|
51
|
pascal@20451
|
52 segment _DATA byte public use16 'DATA'
|
pascal@23996
|
53 ;global _data_start:byte
|
pascal@20451
|
54 label _data_start byte
|
pascal@20451
|
55 ifndef NO386
|
pascal@24019
|
56 msg_badcpu db "I need a 386+ in real mode w/o paging"
|
pascal@24019
|
57 ifdef VCPI
|
pascal@22183
|
58 db " or "
|
pascal@22183
|
59 msg_badmapping db "under VCPI 4.0+ manager with low 640k 1:1 mapping"
|
pascal@22183
|
60 global _vcpi:byte
|
pascal@24019
|
61 endif
|
pascal@22183
|
62 _vcpi db 0
|
pascal@20451
|
63 endif
|
pascal@20451
|
64
|
pascal@20451
|
65 ends _DATA
|
pascal@20451
|
66
|
pascal@20451
|
67 segment _BSS byte public use16 'BSS'
|
pascal@21757
|
68
|
pascal@24022
|
69 ifdef ISO9660
|
pascal@24022
|
70 ifndef VCPI
|
pascal@24022
|
71 alloc_isotate
|
pascal@24022
|
72 else
|
pascal@24022
|
73 room_for_isostate = 1
|
pascal@24022
|
74 endif
|
pascal@24022
|
75 endif
|
pascal@24022
|
76
|
pascal@24013
|
77 ifdef ISOHOOK
|
pascal@23996
|
78 extrn _big_cmdline:byte
|
pascal@23996
|
79 db 254 dup(?)
|
pascal@23996
|
80 endif
|
pascal@23996
|
81 ;global _bss_start:byte
|
pascal@20451
|
82 label _bss_start byte
|
pascal@22312
|
83 global stktop:byte
|
pascal@22183
|
84 global _cpu386:byte
|
pascal@22183
|
85 _cpu386 db ?
|
pascal@24019
|
86 ifdef CPU64
|
pascal@22183
|
87 org $-1
|
pascal@20451
|
88 global _cpu_features:dword
|
pascal@20451
|
89 _cpu_features dd ?
|
pascal@24022
|
90 room_for_image = 1
|
pascal@24022
|
91 else
|
pascal@24022
|
92 alloc_image
|
pascal@24019
|
93 endif
|
pascal@24022
|
94
|
pascal@24022
|
95 ifndef BSS_OVERLAP_BOOT
|
pascal@24022
|
96
|
pascal@24022
|
97 ifdef room_for_isostate
|
pascal@24022
|
98 alloc_isostate
|
pascal@24022
|
99 endif
|
pascal@24022
|
100
|
pascal@24022
|
101 ifdef room_for_image
|
pascal@24022
|
102 alloc_image
|
pascal@24022
|
103 endif
|
pascal@24022
|
104
|
pascal@24022
|
105 alloc_misc
|
pascal@24022
|
106
|
pascal@24022
|
107 endif
|
pascal@24022
|
108
|
pascal@20451
|
109 ends _BSS
|
pascal@20451
|
110
|
pascal@20451
|
111 segment _TEXT byte public use16 'CODE'
|
pascal@19515
|
112
|
pascal@19825
|
113 macro cpuid
|
pascal@19825
|
114 db 0fh,0A2h
|
pascal@19825
|
115 endm
|
pascal@19825
|
116
|
pascal@19515
|
117 org 100h
|
pascal@23996
|
118 ;global _text_start:byte
|
pascal@19515
|
119 label _text_start byte
|
pascal@19546
|
120
|
pascal@19515
|
121 ;***************************************************************
|
pascal@19515
|
122 ; clear bss
|
pascal@19515
|
123 ;***************************************************************
|
pascal@21757
|
124 mov sp,offset stktop
|
pascal@23996
|
125 mov bx, 0F000h ; cld ; cli & empty string
|
pascal@22179
|
126 mov si,offset _bss_start
|
pascal@19515
|
127 clearbss:
|
pascal@22312
|
128 mov [si],bl ; clear bss + heap
|
pascal@20426
|
129 inc si
|
pascal@19546
|
130 jne clearbss
|
pascal@19546
|
131
|
pascal@19546
|
132 ;***************************************************************
|
pascal@19546
|
133 ; check CPU
|
pascal@19546
|
134 ;***************************************************************
|
pascal@19546
|
135
|
pascal@19546
|
136 ; Check for oldies
|
pascal@19873
|
137 push bx ; < 286 : flags[12..15] are forced 1
|
pascal@24013
|
138 popf ; = 286 : flags[12..15] are forced 0, cld
|
pascal@19873
|
139 pushf ; > 286 : only flags[15] is forced 0
|
pascal@19873
|
140 pop dx
|
pascal@20451
|
141 add dh,bh ; NS=386+, S+NC=286, S+C=86/186
|
pascal@20451
|
142 ifndef NO386
|
pascal@19873
|
143 mov bx,offset msg_badcpu
|
pascal@22183
|
144 js godie ;it is not a 386+, die
|
pascal@20451
|
145 else
|
pascal@22183
|
146 js endcpu86 ;it is not a 386+, try ELKS & co
|
pascal@19546
|
147 endif
|
pascal@19636
|
148 p386
|
pascal@23996
|
149 mov edx,cs
|
pascal@23996
|
150 shl edx,4 ; edx for prepare_vcpi
|
pascal@23996
|
151 extrn gdt_base_memcpy:word ; gdt_base for memcpy32
|
pascal@23996
|
152 add [dword gdt_base_memcpy],edx
|
pascal@19546
|
153 ; Check for vm
|
pascal@19546
|
154 smsw ax ;SMSW cannot be trapped! :-)
|
pascal@19571
|
155 and al,1 ;MSW_PE
|
pascal@19546
|
156 ; We're in vm
|
pascal@20457
|
157 jnz check_vcpi
|
pascal@20457
|
158
|
pascal@20457
|
159 check_rm_paging:
|
pascal@20457
|
160 ; It's a 386 in real mode, chk for paging (crazy but possible)
|
pascal@20457
|
161 mov eax,cr0
|
pascal@20457
|
162 inc eax ;CR0_PG to S
|
pascal@20457
|
163 jns endcpu386
|
pascal@22183
|
164 ifndef NO386
|
pascal@20457
|
165 p8086
|
pascal@20457
|
166 extrn die:near
|
pascal@20457
|
167 godie:
|
pascal@20457
|
168 call near die
|
pascal@22183
|
169 else
|
pascal@22183
|
170 jmp endcpu86
|
pascal@22183
|
171 endif
|
pascal@19546
|
172
|
pascal@23797
|
173
|
pascal@19546
|
174 ;***************************************************************
|
pascal@19546
|
175 ; checks for vcpi
|
pascal@19546
|
176 ;***************************************************************
|
pascal@19546
|
177 label check_vcpi near
|
pascal@20457
|
178 p386
|
pascal@24019
|
179 ifdef VCPI
|
pascal@24013
|
180 ; Check whether it is safe to call 67h
|
pascal@24013
|
181 xor eax,eax
|
pascal@24022
|
182 push ds
|
pascal@24022
|
183 mov ds,ax
|
pascal@24022
|
184 cmp [dword 67h*4],eax
|
pascal@24022
|
185 pop ds
|
pascal@23996
|
186 je no_vcpi
|
pascal@24013
|
187 mov ah,0DEh ; check for vcpi present
|
pascal@19546
|
188 int 67h
|
pascal@23996
|
189 or ah,ah
|
pascal@19571
|
190 jnz no_vcpi
|
pascal@19546
|
191 is386vcpi:
|
pascal@19546
|
192 extrn prepare_vcpi:near
|
pascal@19546
|
193 call prepare_vcpi
|
pascal@19546
|
194 ; get_vcpi_interface() || die("VCPI: low 640k: need 1:1 mapping");
|
pascal@19546
|
195 ;extrn _get_vcpi_interface:near
|
pascal@19546
|
196 ;call _get_vcpi_interface
|
pascal@22183
|
197 ifndef NO386
|
pascal@19546
|
198 mov bx,offset msg_badmapping
|
pascal@20457
|
199 jnz no_vcpi
|
pascal@22183
|
200 dec [byte bx+_vcpi-msg_badmapping]
|
pascal@22183
|
201 else
|
pascal@22183
|
202 jnz no_vcpi
|
pascal@22183
|
203 extrn _vcpi:byte
|
pascal@22183
|
204 dec [byte _vcpi]
|
pascal@22183
|
205 endif
|
pascal@24019
|
206 endif
|
pascal@23996
|
207 no_vcpi:
|
pascal@20457
|
208 endcpu386:
|
pascal@24019
|
209 ifdef CPU64
|
pascal@20457
|
210 pushfd
|
pascal@20457
|
211 pop dx
|
pascal@20457
|
212 pop ax
|
pascal@20457
|
213 mov bl,al
|
pascal@23996
|
214 xor al,20h ; toggle CPUID feature bit 21 (=> pentium+)
|
pascal@23996
|
215 push ax ; (toggle AC: bit 18 => 486+)
|
pascal@20457
|
216 push dx
|
pascal@20457
|
217 popfd
|
pascal@20457
|
218 pushfd
|
pascal@22203
|
219 pop dx ; dx.1=flags.1=1
|
pascal@20457
|
220 pop ax
|
pascal@20457
|
221 xor al,bl ; clear C
|
pascal@20457
|
222 je @@no_cpuid ; CPUID feature bit changed ?
|
pascal@20457
|
223 mov eax,80000001h ; Extended Processor Info and Feature Bits
|
pascal@20457
|
224 cpuid
|
pascal@23996
|
225 mov dl,-1 ; set 386 flag (assume cpuid => fpu:bit0=1 ?)
|
pascal@22183
|
226 ifdef NO386
|
pascal@22203
|
227 db 66h ; mov [_cpu_features],edx
|
pascal@22203
|
228 @@no_cpuid:
|
pascal@22203
|
229 mov [word _cpu_features],dx ; dl != 0
|
pascal@22203
|
230 else
|
pascal@20457
|
231 mov [_cpu_features],edx
|
pascal@20457
|
232 @@no_cpuid:
|
pascal@22203
|
233 endif
|
pascal@24019
|
234 else
|
pascal@24019
|
235 dec [_cpu386]
|
pascal@24019
|
236 endif
|
pascal@20457
|
237 endcpu86:
|
pascal@19636
|
238 p8086
|
pascal@19546
|
239
|
pascal@19515
|
240 ;***************************************************************
|
pascal@19515
|
241 ; build argv & argc
|
pascal@19515
|
242 ;***************************************************************
|
pascal@19515
|
243 mov si,80h
|
pascal@24013
|
244 ifdef ISOHOOK
|
pascal@23996
|
245 mov bx,offset _big_cmdline
|
pascal@23996
|
246 cmp [byte si],2
|
pascal@23996
|
247 jnb @@user_args
|
pascal@23996
|
248 call @set_cmdline$qpxzc
|
pascal@23996
|
249 @@user_args:
|
pascal@23996
|
250 endif
|
pascal@23996
|
251 lodsb ; size 0..127
|
pascal@19546
|
252 cbw
|
pascal@24013
|
253 ifdef ISOHOOK
|
pascal@23996
|
254 inc ax
|
pascal@23996
|
255 jnz short_cmdline
|
pascal@23996
|
256 mov si,bx
|
pascal@23996
|
257 lodsb ; size 0..254
|
pascal@23996
|
258 short_cmdline:
|
pascal@23996
|
259 dec ax
|
pascal@23996
|
260 endif
|
pascal@19515
|
261 xchg ax,bx
|
pascal@19515
|
262 mov [bx+si],bh ; set eos
|
pascal@24022
|
263
|
pascal@24022
|
264 ;***************************************************************
|
pascal@24022
|
265
|
pascal@24022
|
266 ifdef BSS_OVERLAP_BOOT
|
pascal@24022
|
267 mov al,0
|
pascal@24022
|
268 mov di,100h
|
pascal@24022
|
269 mov cx,offset clean-100h
|
pascal@24022
|
270
|
pascal@24022
|
271 org $-(CMDNUMCNT*4)-4
|
pascal@24022
|
272
|
pascal@24022
|
273 ifdef room_for_image
|
pascal@24022
|
274 org $-2-2-(2*size image_himem)
|
pascal@24022
|
275 endif
|
pascal@24022
|
276
|
pascal@24022
|
277 ifdef room_for_isostate
|
pascal@24022
|
278 org $+ISOSTATE_OVERLAP-size isostate
|
pascal@24022
|
279 alloc_isostate
|
pascal@24022
|
280 endif
|
pascal@24022
|
281
|
pascal@24022
|
282 ifdef room_for_image
|
pascal@24022
|
283 alloc_image
|
pascal@24022
|
284 endif
|
pascal@24022
|
285
|
pascal@24022
|
286 alloc_misc
|
pascal@24022
|
287 clean:
|
pascal@24022
|
288 rep
|
pascal@24022
|
289 stosb
|
pascal@24022
|
290 endif
|
pascal@24022
|
291
|
pascal@24022
|
292 ;***************************************************************
|
pascal@24022
|
293 extrn _bss_end:word
|
pascal@24022
|
294 mov di,offset _bss_end
|
pascal@24022
|
295 global _heap_top
|
pascal@24022
|
296 org $-2
|
pascal@24022
|
297 _heap_top dw ?
|
pascal@23996
|
298 ;xor dx,dx
|
pascal@23996
|
299 ;push dx ; envp (already cleared)
|
pascal@23996
|
300 ;mov [word di],dx ; argv[0] = 0 (idem)
|
pascal@19515
|
301 argbuild:
|
pascal@19515
|
302 mov bx,2 ; argc * 2
|
pascal@19515
|
303 argeos:
|
pascal@20451
|
304 mov cx,1 ; look for a start of string
|
pascal@19515
|
305 mov [byte si-1],bh ; mark eos
|
pascal@19515
|
306 mov ah,20h ; space will be eos
|
pascal@19515
|
307 arglp:
|
pascal@19515
|
308 lodsb
|
pascal@19515
|
309 cmp al,0h
|
pascal@19515
|
310 je argdone
|
pascal@19515
|
311 cmp al,20h
|
pascal@19515
|
312 jb argeos
|
pascal@19515
|
313 cmp al,ah
|
pascal@19515
|
314 je argeos
|
pascal@19515
|
315 cmp al,27h
|
pascal@19515
|
316 je isargstr
|
pascal@19515
|
317 cmp al,22h
|
pascal@19515
|
318 je isargstr
|
pascal@20451
|
319 jcxz arglp ; not start of string
|
pascal@19515
|
320 dec si
|
pascal@19884
|
321 ;jmp newarg
|
pascal@20451
|
322 db 0BAh ; mov dx,im opcode
|
pascal@19515
|
323 isargstr:
|
pascal@19515
|
324 mov ah,al ; expected eos
|
pascal@19515
|
325 newarg:
|
pascal@19515
|
326 mov [word bx+di],si ; argv[argc++] = si
|
pascal@19515
|
327 inc bx
|
pascal@19515
|
328 inc bx
|
pascal@20451
|
329 dec cx
|
pascal@19515
|
330 jmp arglp
|
pascal@23992
|
331
|
pascal@23992
|
332 ;***************************************************************
|
pascal@23992
|
333 ;_fastcall void set_cmdline(bx:const char *filename);
|
pascal@23992
|
334 ;***************************************************************
|
pascal@23992
|
335 global @set_cmdline$qpxzc:near
|
pascal@23992
|
336 proc @set_cmdline$qpxzc near
|
pascal@23992
|
337 extrn openargs:near
|
pascal@23992
|
338 call openargs
|
pascal@23992
|
339 jc @ret
|
pascal@23992
|
340 mov ch,15 ; cx<4096
|
pascal@23992
|
341 mov di,[_heap_top]
|
pascal@23992
|
342 jmp read_cmdline ; read_cmdline(ax,di,cx)
|
pascal@23992
|
343
|
pascal@23992
|
344 endp @set_cmdline$qpxzc
|
pascal@23992
|
345
|
pascal@23992
|
346 ifdef NO386
|
pascal@23992
|
347 ;***************************************************************
|
pascal@23992
|
348 ;u16 topseg();
|
pascal@23992
|
349 ;***************************************************************
|
pascal@23992
|
350 global _topseg:near
|
pascal@23992
|
351 proc _topseg near
|
pascal@23992
|
352
|
pascal@23992
|
353 int 12h
|
pascal@23992
|
354 jnc @@max640k
|
pascal@23992
|
355 mov ax,640 ; 9000
|
pascal@23992
|
356 @@max640k:
|
pascal@23992
|
357 dec ax
|
pascal@23992
|
358 and al,0C0h
|
pascal@23992
|
359 mov cl,6
|
pascal@23992
|
360 shl ax,cl
|
pascal@23992
|
361 @ret:
|
pascal@23992
|
362 ret
|
pascal@23992
|
363
|
pascal@23992
|
364 endp _topseg
|
pascal@24019
|
365 else
|
pascal@24019
|
366 @ret:
|
pascal@24019
|
367 ret
|
pascal@23992
|
368 endif
|
pascal@23992
|
369
|
pascal@24013
|
370 ;***************************************************************
|
pascal@24013
|
371 argdone:
|
pascal@24013
|
372 ;mov [word bx+di],0 ; argv[argc] = 0
|
pascal@24013
|
373 lea ax,[bx+di+2]
|
pascal@24013
|
374 mov [_heap_top],ax
|
pascal@24013
|
375 ;push di ; argv
|
pascal@24013
|
376 ;shr bx,1
|
pascal@24013
|
377 ;push bx ; argc
|
pascal@24013
|
378 ifndef filearg
|
pascal@24013
|
379 mov bx,[di+2] ; argv[1]
|
pascal@24013
|
380 extrn openargs:near
|
pascal@24013
|
381 call near openargs
|
pascal@24013
|
382 jc argend
|
pascal@24013
|
383 ;pop bx ; trash argc, argv >> 1Kb !
|
pascal@24013
|
384 ;pop cx ; sizemax=argv
|
pascal@24013
|
385 dec cx ; sizemax=0ffffh
|
pascal@24013
|
386 read_cmdline:
|
pascal@24013
|
387 mov dx,di
|
pascal@24013
|
388 push dx
|
pascal@24013
|
389 xchg ax,bx
|
pascal@24013
|
390 extrn @read$cxdxbx:near ; read(fd=bx,buffer=dx,size=cx)
|
pascal@24013
|
391 call near @read$cxdxbx
|
pascal@24013
|
392 pop si ; si=buffer=argv
|
pascal@24013
|
393 add di,ax
|
pascal@24013
|
394 ifndef NO_CLOSE
|
pascal@24013
|
395 extrn close:near
|
pascal@24013
|
396 call near close
|
pascal@24013
|
397 endif
|
pascal@24013
|
398 jmp argbuild
|
pascal@24013
|
399 argend:
|
pascal@24013
|
400 endif
|
pascal@24013
|
401
|
pascal@24013
|
402 ;***************************************************************
|
pascal@24013
|
403 ; extrn _main:near
|
pascal@24013
|
404 ; call _main
|
pascal@24013
|
405 ;never return
|
pascal@24013
|
406
|
pascal@24013
|
407 ;***************************************************************
|
pascal@24013
|
408
|
pascal@24013
|
409
|
pascal@19515
|
410 ends _TEXT
|
pascal@19515
|
411
|
pascal@19515
|
412
|
pascal@19515
|
413 end _text_start
|
pascal@19515
|
414
|
pascal@19515
|
415 ;###### END OF FILE ############################################
|