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