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@19546
|
18
|
pascal@19515
|
19 ;***************************************************************
|
pascal@19515
|
20 ; clear bss
|
pascal@19515
|
21 ;***************************************************************
|
pascal@19546
|
22 mov bx,offset _bss_start
|
pascal@19515
|
23 clearbss:
|
pascal@19546
|
24 mov [byte bx],0 ; clear bss + heap + sp
|
pascal@19546
|
25 inc bx
|
pascal@19546
|
26 jne clearbss
|
pascal@19546
|
27
|
pascal@19546
|
28 ;***************************************************************
|
pascal@19546
|
29 ; check CPU
|
pascal@19546
|
30 ;***************************************************************
|
pascal@19546
|
31
|
pascal@19546
|
32 ; Check for oldies
|
pascal@19546
|
33 mov bh, 0F0h
|
pascal@19546
|
34 pushf
|
pascal@19546
|
35 push bx ; < 286 : flags[12..15] are forced 1
|
pascal@19546
|
36 popf ; = 286 : flags[12..15] are forced 0
|
pascal@19546
|
37 pushf ; > 286 : only flags[15] is forced 0
|
pascal@19546
|
38 pop dx
|
pascal@19546
|
39 popf
|
pascal@19546
|
40 add dh,bh ; NS=386+, NC=286
|
pascal@19546
|
41 ifndef NO386
|
pascal@19546
|
42 js no_vcpi ;it is a 86/186/286, not a 386+
|
pascal@19546
|
43 else
|
pascal@19546
|
44 js endcpu
|
pascal@19546
|
45 endif
|
pascal@19546
|
46 ; Check for vm
|
pascal@19546
|
47 smsw ax ;SMSW cannot be trapped! :-)
|
pascal@19546
|
48 and ax,1 ;MSW_PE
|
pascal@19546
|
49 ; We're in vm
|
pascal@19546
|
50 jnz check_vcpi
|
pascal@19546
|
51
|
pascal@19546
|
52 ; It's a 386 in real mode, chk for paging (crazy but possible)
|
pascal@19546
|
53 mov edx,cr0
|
pascal@19546
|
54 shl edx,1 ;CR0_PG to CF
|
pascal@19546
|
55 jc no_vcpi
|
pascal@19546
|
56 jmp endcpu
|
pascal@19546
|
57
|
pascal@19546
|
58 ;***************************************************************
|
pascal@19546
|
59 ; checks for vcpi
|
pascal@19546
|
60 ;***************************************************************
|
pascal@19546
|
61 label check_vcpi near
|
pascal@19546
|
62 push ds
|
pascal@19546
|
63 ; Check whether it is safe to call 67h (we trust only known EMM managers)
|
pascal@19546
|
64 push 0
|
pascal@19546
|
65 pop ds
|
pascal@19546
|
66 mov ds,[word 67h*4+2]
|
pascal@19546
|
67 cmp [dword 10+4],'0XXX'
|
pascal@19546
|
68 jne skip
|
pascal@19546
|
69 mov eax,'XMME'
|
pascal@19546
|
70 xor eax,[dword 10]
|
pascal@19546
|
71 ; QMME also works (as told by <J.S.Peatfield@damtp.cambridge.ac.uk>)
|
pascal@19546
|
72 shl eax,8
|
pascal@19546
|
73 skip:
|
pascal@19546
|
74 pop ds
|
pascal@19546
|
75 jne no_vcpi
|
pascal@19546
|
76
|
pascal@19546
|
77 ; Check emm manager status and version
|
pascal@19546
|
78 mov ah,40h ; get status
|
pascal@19546
|
79 int 67h
|
pascal@19546
|
80 test ah,ah
|
pascal@19546
|
81 jnz no_vcpi
|
pascal@19546
|
82 mov ah,46h ; get version
|
pascal@19546
|
83 int 67h
|
pascal@19546
|
84 test ah,ah
|
pascal@19546
|
85 jnz no_vcpi
|
pascal@19546
|
86 cmp al,40h ; version must be >= 4.0
|
pascal@19546
|
87 jb no_vcpi
|
pascal@19546
|
88 ; Check vcpi manager status
|
pascal@19546
|
89 ;;mov ax,5A01h ; ALLOCATE RAW PAGES
|
pascal@19546
|
90 ;;mov bx,4
|
pascal@19546
|
91 ;;int 67h
|
pascal@19546
|
92 ;;test ah,ah
|
pascal@19546
|
93 ;;jnz no_vcpi
|
pascal@19546
|
94 ;;push dx ;$ save handle
|
pascal@19546
|
95 mov ax,0DE00h ; check for vcpi present
|
pascal@19546
|
96 int 67h
|
pascal@19546
|
97 mov al,1
|
pascal@19546
|
98 test ah,ah
|
pascal@19546
|
99 jz is386vcpi
|
pascal@19546
|
100 ;;pop dx ;$ handle
|
pascal@19546
|
101 ;;mov ax,4500h ; DEALLOCATE PAGES
|
pascal@19546
|
102 ;;int 67h
|
pascal@19546
|
103 no_vcpi:
|
pascal@19546
|
104 mov bx,offset msg_badcpu
|
pascal@19546
|
105 extrn die:near
|
pascal@19546
|
106 godie:
|
pascal@19546
|
107 jmp near die
|
pascal@19546
|
108 is386vcpi:
|
pascal@19546
|
109 mov [_vcpi],al
|
pascal@19546
|
110 extrn prepare_vcpi:near
|
pascal@19546
|
111 call prepare_vcpi
|
pascal@19546
|
112 ; get_vcpi_interface() || die("VCPI: low 640k: need 1:1 mapping");
|
pascal@19546
|
113 ;extrn _get_vcpi_interface:near
|
pascal@19546
|
114 ;call _get_vcpi_interface
|
pascal@19546
|
115 mov bx,offset msg_badmapping
|
pascal@19546
|
116 jz godie
|
pascal@19546
|
117 endcpu:
|
pascal@19546
|
118
|
pascal@19515
|
119 ;***************************************************************
|
pascal@19515
|
120 ; build argv & argc
|
pascal@19515
|
121 ;***************************************************************
|
pascal@19546
|
122 extrn _heap_top:word
|
pascal@19546
|
123 mov di,[_heap_top]
|
pascal@19546
|
124 ;xor ax,ax
|
pascal@19546
|
125 ;push ax ; envp (already cleared)
|
pascal@19546
|
126 ;mov [word di],ax ; argv[0] = 0 (idem)
|
pascal@19515
|
127 mov si,80h
|
pascal@19515
|
128 cld
|
pascal@19515
|
129 lodsb
|
pascal@19515
|
130 cmp al,7Eh
|
pascal@19515
|
131 jbe alok
|
pascal@19515
|
132 mov al,7Eh
|
pascal@19515
|
133 alok:
|
pascal@19546
|
134 cbw
|
pascal@19515
|
135 xchg ax,bx
|
pascal@19515
|
136 mov [bx+si],bh ; set eos
|
pascal@19515
|
137 argbuild:
|
pascal@19515
|
138 mov bx,2 ; argc * 2
|
pascal@19515
|
139 argeos:
|
pascal@19515
|
140 mov dl,1 ; look for a start of string
|
pascal@19515
|
141 mov [byte si-1],bh ; mark eos
|
pascal@19515
|
142 mov ah,20h ; space will be eos
|
pascal@19515
|
143 arglp:
|
pascal@19515
|
144 lodsb
|
pascal@19515
|
145 cmp al,0h
|
pascal@19515
|
146 je argdone
|
pascal@19515
|
147 cmp al,20h
|
pascal@19515
|
148 jb argeos
|
pascal@19515
|
149 cmp al,ah
|
pascal@19515
|
150 je argeos
|
pascal@19515
|
151 cmp al,27h
|
pascal@19515
|
152 je isargstr
|
pascal@19515
|
153 cmp al,22h
|
pascal@19515
|
154 je isargstr
|
pascal@19515
|
155 or dl,dl
|
pascal@19515
|
156 je arglp ; not start of string
|
pascal@19515
|
157 dec si
|
pascal@19515
|
158 jmp newarg
|
pascal@19515
|
159 isargstr:
|
pascal@19515
|
160 mov ah,al ; expected eos
|
pascal@19515
|
161 newarg:
|
pascal@19515
|
162 mov [word bx+di],si ; argv[argc++] = si
|
pascal@19515
|
163 inc bx
|
pascal@19515
|
164 inc bx
|
pascal@19515
|
165 dec dx
|
pascal@19515
|
166 jmp arglp
|
pascal@19515
|
167 argdone:
|
pascal@19515
|
168 ;mov [word bx+di],0 ; argv[argc] = 0
|
pascal@19546
|
169 lea ax,[bx+di+2]
|
pascal@19546
|
170 mov [_heap_top],ax
|
pascal@19515
|
171 push di ; argv
|
pascal@19515
|
172 shr bx,1
|
pascal@19515
|
173 push bx ; argc
|
pascal@19515
|
174 ifndef filearg
|
pascal@19515
|
175 mov bx,[di+2] ; argv[1]
|
pascal@19515
|
176 cmp [byte bx],'@'
|
pascal@19515
|
177 jne argend
|
pascal@19546
|
178 inc bx
|
pascal@19515
|
179 extrn open:near
|
pascal@19515
|
180 call near open
|
pascal@19515
|
181 jc argend
|
pascal@19515
|
182 pop bx ; trash argc, argv >> 1Kb !
|
pascal@19546
|
183 global read_cmdline:near
|
pascal@19546
|
184 read_cmdline:
|
pascal@19515
|
185 push di
|
pascal@19515
|
186 push ax
|
pascal@19515
|
187 extrn _read:near
|
pascal@19515
|
188 call near _read
|
pascal@19515
|
189 pop bx ; fd for close
|
pascal@19515
|
190 pop si ; si=buffer=argv
|
pascal@19515
|
191 add di,ax
|
pascal@19515
|
192 pop ax ; trash sizemax=argv
|
pascal@19515
|
193 extrn close:near
|
pascal@19515
|
194 call near close
|
pascal@19515
|
195 jmp argbuild
|
pascal@19515
|
196 argend:
|
pascal@19515
|
197 endif
|
pascal@19515
|
198
|
pascal@19515
|
199 ;***************************************************************
|
pascal@19515
|
200 extrn _main:near
|
pascal@19515
|
201 call _main
|
pascal@19538
|
202
|
pascal@19515
|
203 ;***************************************************************
|
pascal@19515
|
204 global exit:near
|
pascal@19515
|
205 exit:
|
pascal@19515
|
206 mov ah,4Ch
|
pascal@19515
|
207 int 21h
|
pascal@19515
|
208 ends _TEXT
|
pascal@19515
|
209
|
pascal@19515
|
210 segment _DATA byte public use16 'DATA'
|
pascal@19515
|
211 global _data_start:byte
|
pascal@19515
|
212 label _data_start byte
|
pascal@19546
|
213 msg_badcpu db "I need 386+ CPU in real mode or under VCPI manager"
|
pascal@19546
|
214 global _vcpi:byte
|
pascal@19546
|
215 _vcpi db 0
|
pascal@19546
|
216 msg_badmapping db "VCPI: low 640k: need 1:1 mapping",0
|
pascal@19546
|
217
|
pascal@19515
|
218 ends _DATA
|
pascal@19515
|
219
|
pascal@19515
|
220 segment _BSS byte public use16 'BSS'
|
pascal@19515
|
221 global _bss_start:byte
|
pascal@19515
|
222 label _bss_start byte
|
pascal@19515
|
223 ends _BSS
|
pascal@19515
|
224
|
pascal@19515
|
225 end _text_start
|
pascal@19515
|
226
|
pascal@19515
|
227 ;###### END OF FILE ############################################
|