rev |
line source |
pascal@19515
|
1 ;***************************************************************
|
pascal@19515
|
2 ;****** This file is distributed under GPL
|
pascal@19515
|
3 ;***************************************************************
|
pascal@19515
|
4 ideal
|
pascal@19515
|
5 %crefref
|
pascal@19515
|
6 %noincl
|
pascal@19515
|
7 %nomacs
|
pascal@19515
|
8 p386
|
pascal@19515
|
9
|
pascal@19515
|
10 group DGROUP _TEXT,_DATA,_BSS
|
pascal@19515
|
11 assume cs:DGROUP,ds:DGROUP
|
pascal@19515
|
12
|
pascal@19515
|
13 segment _TEXT byte public use16 'CODE'
|
pascal@19515
|
14
|
pascal@19515
|
15 org 100h
|
pascal@19515
|
16 global _text_start:byte
|
pascal@19515
|
17 label _text_start byte
|
pascal@19515
|
18 extrn _bss_end
|
pascal@19515
|
19 ;***************************************************************
|
pascal@19515
|
20 ; clear bss
|
pascal@19515
|
21 ;***************************************************************
|
pascal@19515
|
22 xor ax,ax
|
pascal@19515
|
23 mov di,offset _bss_start
|
pascal@19515
|
24 clearbss:
|
pascal@19515
|
25 mov [di],al
|
pascal@19515
|
26 inc di
|
pascal@19515
|
27 cmp di,sp ; clear bss + heap
|
pascal@19515
|
28 jbe clearbss
|
pascal@19515
|
29 mov di,offset _bss_end
|
pascal@19515
|
30 ;***************************************************************
|
pascal@19515
|
31 ; build argv & argc
|
pascal@19515
|
32 ;***************************************************************
|
pascal@19515
|
33 ; push ax ; envp (int 20h do it for us)
|
pascal@19515
|
34 ;mov [word di],ax ; argv[0] = 0
|
pascal@19515
|
35 mov si,80h
|
pascal@19515
|
36 cld
|
pascal@19515
|
37 lodsb
|
pascal@19515
|
38 cmp al,7Eh
|
pascal@19515
|
39 jbe alok
|
pascal@19515
|
40 mov al,7Eh
|
pascal@19515
|
41 alok:
|
pascal@19515
|
42 xchg ax,bx
|
pascal@19515
|
43 mov [bx+si],bh ; set eos
|
pascal@19515
|
44 argbuild:
|
pascal@19515
|
45 mov bx,2 ; argc * 2
|
pascal@19515
|
46 argeos:
|
pascal@19515
|
47 mov dl,1 ; look for a start of string
|
pascal@19515
|
48 mov [byte si-1],bh ; mark eos
|
pascal@19515
|
49 mov ah,20h ; space will be eos
|
pascal@19515
|
50 arglp:
|
pascal@19515
|
51 lodsb
|
pascal@19515
|
52 cmp al,0h
|
pascal@19515
|
53 je argdone
|
pascal@19515
|
54 cmp al,20h
|
pascal@19515
|
55 jb argeos
|
pascal@19515
|
56 cmp al,ah
|
pascal@19515
|
57 je argeos
|
pascal@19515
|
58 cmp al,27h
|
pascal@19515
|
59 je isargstr
|
pascal@19515
|
60 cmp al,22h
|
pascal@19515
|
61 je isargstr
|
pascal@19515
|
62 or dl,dl
|
pascal@19515
|
63 je arglp ; not start of string
|
pascal@19515
|
64 dec si
|
pascal@19515
|
65 jmp newarg
|
pascal@19515
|
66 isargstr:
|
pascal@19515
|
67 mov ah,al ; expected eos
|
pascal@19515
|
68 newarg:
|
pascal@19515
|
69 mov [word bx+di],si ; argv[argc++] = si
|
pascal@19515
|
70 inc bx
|
pascal@19515
|
71 inc bx
|
pascal@19515
|
72 dec dx
|
pascal@19515
|
73 jmp arglp
|
pascal@19515
|
74 argdone:
|
pascal@19515
|
75 ;mov [word bx+di],0 ; argv[argc] = 0
|
pascal@19515
|
76 lea si,[bx+di+2]
|
pascal@19515
|
77 extrn _heap_top:word
|
pascal@19515
|
78 mov [_heap_top],si
|
pascal@19515
|
79 push di ; argv
|
pascal@19515
|
80 shr bx,1
|
pascal@19515
|
81 push bx ; argc
|
pascal@19515
|
82 ifndef filearg
|
pascal@19515
|
83 mov bx,[di+2] ; argv[1]
|
pascal@19515
|
84 cmp [byte bx],'@'
|
pascal@19515
|
85 jne argend
|
pascal@19515
|
86 inc bx ; al=0 RDONLY
|
pascal@19515
|
87 extrn open:near
|
pascal@19515
|
88 call near open
|
pascal@19515
|
89 jc argend
|
pascal@19515
|
90 pop bx ; trash argc, argv >> 1Kb !
|
pascal@19515
|
91 push di
|
pascal@19515
|
92 push ax
|
pascal@19515
|
93 extrn _read:near
|
pascal@19515
|
94 call near _read
|
pascal@19515
|
95 pop bx ; fd for close
|
pascal@19515
|
96 pop si ; si=buffer=argv
|
pascal@19515
|
97 add di,ax
|
pascal@19515
|
98 pop ax ; trash sizemax=argv
|
pascal@19515
|
99 extrn close:near
|
pascal@19515
|
100 call near close
|
pascal@19515
|
101 jmp argbuild
|
pascal@19515
|
102 argend:
|
pascal@19515
|
103 endif
|
pascal@19515
|
104
|
pascal@19515
|
105 ;***************************************************************
|
pascal@19515
|
106 extrn _is_vm86:near
|
pascal@19515
|
107 call _is_vm86 ; load_image needs that
|
pascal@19515
|
108
|
pascal@19515
|
109 ;***************************************************************
|
pascal@19515
|
110 extrn _main:near
|
pascal@19515
|
111 call _main
|
pascal@19515
|
112 push ax
|
pascal@19515
|
113 push ax
|
pascal@19515
|
114 ;***************************************************************
|
pascal@19515
|
115 ;void exit(int n);
|
pascal@19515
|
116 ;***************************************************************
|
pascal@19515
|
117 global _exit:near
|
pascal@19515
|
118 global exit:near
|
pascal@19515
|
119 _exit:
|
pascal@19515
|
120 pop bx ;caller return address
|
pascal@19515
|
121 pop ax ; n
|
pascal@19515
|
122 exit:
|
pascal@19515
|
123 mov ah,4Ch
|
pascal@19515
|
124 int 21h
|
pascal@19515
|
125 ends _TEXT
|
pascal@19515
|
126
|
pascal@19515
|
127 segment _DATA byte public use16 'DATA'
|
pascal@19515
|
128 global _data_start:byte
|
pascal@19515
|
129 label _data_start byte
|
pascal@19515
|
130 ends _DATA
|
pascal@19515
|
131
|
pascal@19515
|
132 segment _BSS byte public use16 'BSS'
|
pascal@19515
|
133 global _bss_start:byte
|
pascal@19515
|
134 label _bss_start byte
|
pascal@19515
|
135 ends _BSS
|
pascal@19515
|
136
|
pascal@19515
|
137 end _text_start
|
pascal@19515
|
138
|
pascal@19515
|
139 ;###### END OF FILE ############################################
|