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