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 _DATA byte public use16 'DATA'
|
pascal@19546
|
14
|
pascal@19546
|
15 tazboot_cmd db "tazboot.cmd",0
|
pascal@19546
|
16
|
pascal@19515
|
17 ends _DATA
|
pascal@19515
|
18
|
pascal@19515
|
19 segment _BSS byte public use16 'BSS'
|
pascal@19515
|
20
|
pascal@19515
|
21 ultoabuf db 12 dup (?)
|
pascal@19515
|
22
|
pascal@19515
|
23 ends _BSS
|
pascal@19515
|
24
|
pascal@19515
|
25 segment _TEXT byte public use16 'CODE'
|
pascal@19515
|
26
|
pascal@19515
|
27 ;***************************************************************
|
pascal@19515
|
28 ;int strcmp(const char* a,const char* b);
|
pascal@19515
|
29 ;***************************************************************
|
pascal@19515
|
30 global _strcmp:near
|
pascal@19515
|
31 proc _strcmp near
|
pascal@19515
|
32
|
pascal@19538
|
33 pop ax ;caller return address
|
pascal@19538
|
34 pop cx ; a
|
pascal@19538
|
35 pop bx ; b
|
pascal@19538
|
36 push bx
|
pascal@19538
|
37 push cx
|
pascal@19538
|
38 push ax
|
pascal@19538
|
39 push si
|
pascal@19538
|
40 mov si,cx
|
pascal@19538
|
41 sub bx,si
|
pascal@19538
|
42 @@lp:
|
pascal@19538
|
43 mov al,[bx+si]
|
pascal@19538
|
44 sub al,[si]
|
pascal@19538
|
45 jnz @@out
|
pascal@19538
|
46 lodsb
|
pascal@19538
|
47 cmp al,0
|
pascal@19538
|
48 jne @@lp
|
pascal@19538
|
49 @@out:
|
pascal@19538
|
50 cbw
|
pascal@19538
|
51 pop si
|
pascal@19538
|
52 ret
|
pascal@19515
|
53
|
pascal@19515
|
54 endp _strcmp
|
pascal@19515
|
55
|
pascal@19515
|
56
|
pascal@19515
|
57 ;***************************************************************
|
pascal@19515
|
58 ;char strstr(const char* a,const char* b);
|
pascal@19515
|
59 ;***************************************************************
|
pascal@19515
|
60 global _strstr:near
|
pascal@19515
|
61 proc _strstr near
|
pascal@19515
|
62
|
pascal@19515
|
63 pop ax ;caller return address
|
pascal@19538
|
64 pop cx ; a
|
pascal@19515
|
65 pop dx ; b
|
pascal@19515
|
66 push dx
|
pascal@19538
|
67 push cx
|
pascal@19515
|
68 push ax
|
pascal@19538
|
69 push si
|
pascal@19515
|
70 @@loop:
|
pascal@19515
|
71 xor ax,ax
|
pascal@19538
|
72 mov si,cx
|
pascal@19538
|
73 cmp [si],al ; *a
|
pascal@19538
|
74 jz @@end ; return ax = NULL
|
pascal@19538
|
75 mov bx,dx
|
pascal@19538
|
76 sub bx,si
|
pascal@19515
|
77 @@match:
|
pascal@19538
|
78 or ah,[bx+si] ; *b
|
pascal@19515
|
79 jz @@found
|
pascal@19538
|
80 lodsb
|
pascal@19538
|
81 sub ah,al
|
pascal@19538
|
82 jz @@match
|
pascal@19538
|
83 inc cx
|
pascal@19538
|
84 jmp @@loop
|
pascal@19515
|
85 @@found:
|
pascal@19515
|
86 xchg ax,cx
|
pascal@19515
|
87 @@end:
|
pascal@19538
|
88 pop si
|
pascal@19515
|
89 ret
|
pascal@19515
|
90
|
pascal@19515
|
91 endp _strstr
|
pascal@19515
|
92
|
pascal@19515
|
93
|
pascal@19515
|
94 ;***************************************************************
|
pascal@19515
|
95 ;int cpuhaslm(void)
|
pascal@19515
|
96 ;***************************************************************
|
pascal@19515
|
97 global _cpuhaslm:near
|
pascal@19515
|
98 proc _cpuhaslm near
|
pascal@19515
|
99
|
pascal@19515
|
100 pushf
|
pascal@19515
|
101 ; Check for oldies
|
pascal@19546
|
102 mov bh, 0F0h
|
pascal@19546
|
103 push bx ; < 286 : flags[12..15] are forced 1
|
pascal@19515
|
104 popf ; = 286 : flags[12..15] are forced 0
|
pascal@19515
|
105 pushf ; > 286 : only flags[15] is forced 0
|
pascal@19515
|
106 pop dx
|
pascal@19515
|
107 popf
|
pascal@19546
|
108 add dh,bh ; NS=386+, NC=286
|
pascal@19515
|
109 clc
|
pascal@19515
|
110 js @@bad ;it is a 86/186/286, not a 386+
|
pascal@19515
|
111 pushfd
|
pascal@19515
|
112 pushfd
|
pascal@19515
|
113 pop ebx
|
pascal@19515
|
114 mov ecx,ebx
|
pascal@19515
|
115 xor ebx,00100000h ; toggle CPUID feature bit 21
|
pascal@19515
|
116 push ebx
|
pascal@19515
|
117 popfd
|
pascal@19515
|
118 pushfd
|
pascal@19515
|
119 pop ebx
|
pascal@19515
|
120 popfd
|
pascal@19515
|
121 xor ebx,ecx
|
pascal@19515
|
122 shr ebx,1+21 ; CPUID feature bit ?
|
pascal@19515
|
123 jnc @@bad
|
pascal@19515
|
124 mov eax,80000001h ; Extended Processor Info and Feature Bits
|
pascal@19515
|
125 db 0Fh,0A2h ; cpuid
|
pascal@19515
|
126 shr edx,1+29 ; LM feature bit ?
|
pascal@19515
|
127 @@bad:
|
pascal@19515
|
128 sbb ax,ax
|
pascal@19515
|
129 ret
|
pascal@19515
|
130
|
pascal@19515
|
131 endp _cpuhaslm
|
pascal@19515
|
132
|
pascal@19515
|
133
|
pascal@19515
|
134 ;***************************************************************
|
pascal@19515
|
135 ;char *progname(void)
|
pascal@19515
|
136 ;***************************************************************
|
pascal@19515
|
137 global _progname:near
|
pascal@19515
|
138 proc _progname near
|
pascal@19515
|
139
|
pascal@19515
|
140 push si di es
|
pascal@19515
|
141 mov ah,30h
|
pascal@19515
|
142 int 21h
|
pascal@19515
|
143 cmp al,3
|
pascal@19515
|
144 mov ax,0
|
pascal@19515
|
145 jb @@skip
|
pascal@19515
|
146 mov es,[cs:2Ch]
|
pascal@19515
|
147 mov cx,-1
|
pascal@19515
|
148 xor di,di
|
pascal@19515
|
149 xor al,al
|
pascal@19515
|
150 @@loop1:
|
pascal@19515
|
151 repne
|
pascal@19515
|
152 scasb
|
pascal@19515
|
153 scasb
|
pascal@19515
|
154 jne @@loop1
|
pascal@19515
|
155 lea si,[di+2]
|
pascal@19515
|
156 mov bx, si
|
pascal@19515
|
157 extrn strlen:near
|
pascal@19515
|
158 call near strlen
|
pascal@19515
|
159 xchg ax,cx
|
pascal@19515
|
160 inc cx
|
pascal@19515
|
161 extrn malloc_or_die:near
|
pascal@19515
|
162 call near malloc_or_die
|
pascal@19515
|
163 xchg ax,di
|
pascal@19515
|
164 push ds
|
pascal@19515
|
165 push ds
|
pascal@19515
|
166 push es
|
pascal@19515
|
167 pop ds
|
pascal@19515
|
168 pop es
|
pascal@19515
|
169 push di
|
pascal@19515
|
170 @@loop2:
|
pascal@19515
|
171 lodsb
|
pascal@19515
|
172 stosb
|
pascal@19515
|
173 or al,al
|
pascal@19515
|
174 jnz @@loop2
|
pascal@19515
|
175 pop ax
|
pascal@19515
|
176 pop ds
|
pascal@19515
|
177 @@skip:
|
pascal@19515
|
178 pop es di si
|
pascal@19515
|
179 ret
|
pascal@19515
|
180
|
pascal@19515
|
181 endp _progname
|
pascal@19515
|
182
|
pascal@19515
|
183
|
pascal@19515
|
184 ;***************************************************************
|
pascal@19515
|
185 ;int chdir(char *path);
|
pascal@19515
|
186 ;***************************************************************
|
pascal@19515
|
187 global _chdir:near
|
pascal@19515
|
188 proc _chdir near
|
pascal@19515
|
189
|
pascal@19515
|
190 pop ax
|
pascal@19515
|
191 pop dx
|
pascal@19515
|
192 push dx
|
pascal@19515
|
193 push ax
|
pascal@19515
|
194 chdir:
|
pascal@19515
|
195 stc
|
pascal@19515
|
196 mov ax,713Bh
|
pascal@19515
|
197 int 21h
|
pascal@19515
|
198 jnc @@end
|
pascal@19515
|
199 mov ah,3Bh
|
pascal@19515
|
200 int 21h
|
pascal@19515
|
201 @@end:
|
pascal@19515
|
202 sbb ax,ax
|
pascal@19515
|
203 ret
|
pascal@19515
|
204
|
pascal@19515
|
205 endp _chdir
|
pascal@19515
|
206
|
pascal@19515
|
207
|
pascal@19515
|
208 ;***************************************************************
|
pascal@19515
|
209 ;int chdirname(char *path)
|
pascal@19515
|
210 ;***************************************************************
|
pascal@19515
|
211 global _chdirname:near
|
pascal@19515
|
212 proc _chdirname near
|
pascal@19515
|
213
|
pascal@19515
|
214 pop ax
|
pascal@19515
|
215 pop bx
|
pascal@19515
|
216 push bx
|
pascal@19515
|
217 push ax
|
pascal@19515
|
218
|
pascal@19515
|
219 cmp [byte bx+1],3Ah
|
pascal@19515
|
220 jne @@nodisk
|
pascal@19515
|
221 mov dl,[bx]
|
pascal@19515
|
222 or dl,20h
|
pascal@19515
|
223 sub dl,61h
|
pascal@19515
|
224 mov ah,0Eh
|
pascal@19515
|
225 push bx
|
pascal@19515
|
226 int 21h
|
pascal@19515
|
227 pop bx
|
pascal@19515
|
228 inc bx
|
pascal@19515
|
229 inc bx
|
pascal@19515
|
230 @@nodisk:
|
pascal@19515
|
231 mov dx,bx
|
pascal@19515
|
232 xor cx,cx
|
pascal@19515
|
233 @@next:
|
pascal@19515
|
234 mov al,[bx]
|
pascal@19515
|
235 cmp al,5Ch
|
pascal@19515
|
236 jne @@tsteos
|
pascal@19515
|
237 mov cx,bx
|
pascal@19515
|
238 @@tsteos:
|
pascal@19515
|
239 inc bx
|
pascal@19515
|
240 or al,al
|
pascal@19515
|
241 jnz @@next
|
pascal@19515
|
242 cbw
|
pascal@19515
|
243 jcxz @@end
|
pascal@19515
|
244 mov bx,cx
|
pascal@19515
|
245 push [word bx]
|
pascal@19515
|
246 mov [bx],al
|
pascal@19515
|
247 push bx
|
pascal@19515
|
248 call chdir
|
pascal@19515
|
249 pop bx
|
pascal@19515
|
250 pop [word bx]
|
pascal@19515
|
251 @@end:
|
pascal@19515
|
252 ret
|
pascal@19515
|
253
|
pascal@19515
|
254 endp _chdirname
|
pascal@19515
|
255
|
pascal@19515
|
256
|
pascal@19515
|
257 ;***************************************************************
|
pascal@19515
|
258 ;char *ultoa(unsigned long n);
|
pascal@19515
|
259 ;***************************************************************
|
pascal@19515
|
260 global _ultoa:near
|
pascal@19515
|
261 proc _ultoa near
|
pascal@19515
|
262
|
pascal@19515
|
263 pop ax
|
pascal@19515
|
264 pop cx
|
pascal@19515
|
265 pop dx
|
pascal@19515
|
266 push dx
|
pascal@19515
|
267 push cx
|
pascal@19515
|
268 push ax ; DX:CX = n
|
pascal@19515
|
269 push si
|
pascal@19515
|
270 mov si,10
|
pascal@19515
|
271 mov bx,offset ultoabuf+11
|
pascal@19515
|
272 @@loop:
|
pascal@19515
|
273 dec bx
|
pascal@19515
|
274 xchg ax,dx
|
pascal@19515
|
275 xor dx,dx
|
pascal@19515
|
276 div si ; DX:AX = 0000:hi(n)
|
pascal@19515
|
277 xchg ax,cx ; CX = hi(n)/10
|
pascal@19515
|
278 div si ; DX:AX = hi(n)%10:lo(n)
|
pascal@19515
|
279 xchg ax,cx ; CX = lo(n/10)
|
pascal@19515
|
280 xchg ax,dx ; DX = hi(n)/10 = hi(n/10)
|
pascal@19515
|
281 add al,'0'
|
pascal@19515
|
282 mov [bx],al
|
pascal@19515
|
283 mov ax,cx
|
pascal@19515
|
284 or ax,dx
|
pascal@19515
|
285 jnz @@loop
|
pascal@19515
|
286 xchg ax,bx
|
pascal@19515
|
287 pop si
|
pascal@19515
|
288 ret
|
pascal@19515
|
289
|
pascal@19515
|
290 endp _ultoa
|
pascal@19515
|
291
|
pascal@19515
|
292
|
pascal@19515
|
293 ;***************************************************************
|
pascal@19515
|
294 ;unsigned long kver2ul(char *kernel_version);
|
pascal@19515
|
295 ;***************************************************************
|
pascal@19515
|
296 global _kver2ul:near
|
pascal@19515
|
297 proc _kver2ul near
|
pascal@19515
|
298
|
pascal@19515
|
299 pop ax
|
pascal@19515
|
300 pop dx
|
pascal@19515
|
301 push dx
|
pascal@19515
|
302 push ax
|
pascal@19515
|
303 push bp si di
|
pascal@19515
|
304 xor di,di
|
pascal@19515
|
305 push di
|
pascal@19515
|
306 push di
|
pascal@19515
|
307 mov bp,sp
|
pascal@19515
|
308 mov si,dx
|
pascal@19515
|
309 inc di
|
pascal@19515
|
310 inc di
|
pascal@19515
|
311 mov cl,4
|
pascal@19515
|
312 @@number:
|
pascal@19515
|
313 xor ax,ax
|
pascal@19515
|
314 @@digit:
|
pascal@19515
|
315 shl al,cl
|
pascal@19515
|
316 shl ax,cl
|
pascal@19515
|
317 lodsb
|
pascal@19515
|
318 sub al,30h
|
pascal@19515
|
319 cmp al,9
|
pascal@19515
|
320 jbe @@digit
|
pascal@19515
|
321 mov [bp+di],ah
|
pascal@19515
|
322 dec di
|
pascal@19515
|
323 jns @@number
|
pascal@19515
|
324 pop ax
|
pascal@19515
|
325 pop dx
|
pascal@19515
|
326 pop di si bp
|
pascal@19546
|
327 kver2ulret:
|
pascal@19515
|
328 ret
|
pascal@19515
|
329
|
pascal@19515
|
330 endp _kver2ul
|
pascal@19515
|
331
|
pascal@19546
|
332
|
pascal@19546
|
333 ;***************************************************************
|
pascal@19546
|
334 ;void try_default_args();
|
pascal@19546
|
335 ;***************************************************************
|
pascal@19546
|
336 global _try_default_args:near
|
pascal@19546
|
337 proc _try_default_args near
|
pascal@19546
|
338
|
pascal@19546
|
339 mov bx,offset tazboot_cmd
|
pascal@19546
|
340 extrn open:near
|
pascal@19546
|
341 call near open
|
pascal@19546
|
342 jc kver2ulret
|
pascal@19546
|
343 mov cx,4096
|
pascal@19546
|
344 extrn _heap_top:word
|
pascal@19546
|
345 mov di,[_heap_top]
|
pascal@19546
|
346 push cx
|
pascal@19546
|
347 extrn read_cmdline:near
|
pascal@19546
|
348 jmp near read_cmdline ; read_cmdline(ax,di,cx)
|
pascal@19546
|
349
|
pascal@19546
|
350 endp _try_default_args
|
pascal@19546
|
351
|
pascal@19515
|
352 ends _TEXT
|
pascal@19515
|
353
|
pascal@19515
|
354 end
|
pascal@19515
|
355
|
pascal@19515
|
356 ;###### END OF FILE ############################################
|