rev |
line source |
pascal@23806
|
1 ;***************************************************************
|
pascal@23806
|
2 ;****** This file is distributed under GPL
|
pascal@23806
|
3 ;***************************************************************
|
pascal@23806
|
4 ideal
|
pascal@23806
|
5 %PAGESIZE 1000
|
pascal@23806
|
6 %crefref
|
pascal@23806
|
7 %noincl
|
pascal@23806
|
8 %nomacs
|
pascal@23806
|
9 p8086
|
pascal@23806
|
10
|
pascal@23806
|
11 group DGROUP _TEXT,_DATA,_BSS
|
pascal@23806
|
12 assume cs:DGROUP,ds:DGROUP
|
pascal@23806
|
13
|
pascal@23806
|
14 segment _TEXT byte public use16 'CODE'
|
pascal@23806
|
15 ends _TEXT
|
pascal@23806
|
16
|
pascal@23806
|
17 segment _DATA byte public use16 'DATA'
|
pascal@23806
|
18 ends _DATA
|
pascal@23806
|
19
|
pascal@23806
|
20 segment _BSS byte public use16 'BSS'
|
pascal@23806
|
21
|
pascal@23806
|
22 include "isostate.inc"
|
pascal@23806
|
23
|
pascal@23806
|
24 public _isostate
|
pascal@23806
|
25 _isostate isostate <?>
|
pascal@23863
|
26 ; org $-7
|
pascal@23806
|
27
|
pascal@23806
|
28 ends _BSS
|
pascal@23806
|
29
|
pascal@23806
|
30 segment _TEXT byte public use16 'CODE'
|
pascal@23806
|
31
|
pascal@23806
|
32 global fold:near
|
pascal@23806
|
33 fold:
|
pascal@23863
|
34 org 0EF00h
|
pascal@23806
|
35 global unfold:near
|
pascal@23806
|
36 unfold:
|
pascal@23863
|
37 jmp iso_open
|
pascal@23863
|
38 extrn @isoreaddir$qv
|
pascal@23863
|
39 dw @isoreaddir$qv
|
pascal@23863
|
40 jmp @readmenu$qv
|
pascal@23863
|
41
|
pascal@23806
|
42 push dx
|
pascal@23806
|
43 call readfd
|
pascal@23806
|
44 push ds
|
pascal@23806
|
45 pop es
|
pascal@23806
|
46 mov di,128h ; TABLE
|
pascal@23806
|
47 mov ax,offset iso_open_hack
|
pascal@23806
|
48 stosw
|
pascal@23806
|
49 mov ax,offset iso_read_hack
|
pascal@23806
|
50 stosw
|
pascal@23806
|
51 mov ax,offset iso_lseek_hack
|
pascal@23806
|
52 stosw
|
pascal@23806
|
53 mov ax,offset iso_close_hack
|
pascal@23806
|
54 stosw
|
pascal@23806
|
55 mov ax,offset iso_cleanup_hack
|
pascal@23806
|
56 stosw
|
pascal@23806
|
57 global @_cpuhaslm$qv:near
|
pascal@23806
|
58 @_cpuhaslm$qv:
|
pascal@23806
|
59 mov ax,[132h]
|
pascal@23806
|
60 and al,20h
|
pascal@23806
|
61 ret
|
pascal@23806
|
62
|
pascal@23806
|
63 iso_open_hack:
|
pascal@23806
|
64 pop ax
|
pascal@23806
|
65 extrn @_isoopen$qv:near
|
pascal@23806
|
66 cmp [byte bx],'!'
|
pascal@23806
|
67 je @readmenu$qv
|
pascal@23806
|
68 xchg ax,bx
|
pascal@23806
|
69 global iso_open:near
|
pascal@23806
|
70 iso_open:
|
pascal@23806
|
71 mov [_isostate.filename2open],ax
|
pascal@23806
|
72 call @_isoopen$qv
|
pascal@23864
|
73 cmp al,1
|
pascal@23863
|
74 cmc
|
pascal@23844
|
75 push bx
|
pascal@23844
|
76 iso_close_hack:
|
pascal@23844
|
77 pop bx
|
pascal@23806
|
78 ret
|
pascal@23806
|
79
|
pascal@23806
|
80
|
pascal@23806
|
81 macro curseek
|
pascal@23806
|
82 push cx
|
pascal@23806
|
83 xor cx,cx
|
pascal@23806
|
84 xor dx,dx
|
pascal@23806
|
85 mov ax,4201h
|
pascal@23806
|
86 call dosfd ; lseek(,0L,SEEK_CUR)
|
pascal@23806
|
87 call @doseek2
|
pascal@23806
|
88 ifndef NO386
|
pascal@23806
|
89 push dx
|
pascal@23806
|
90 push ax
|
pascal@23806
|
91 pop eax
|
pascal@23806
|
92 endif
|
pascal@23806
|
93 pop cx
|
pascal@23806
|
94 endm
|
pascal@23806
|
95
|
pascal@23863
|
96 ;***************************************************************
|
pascal@23863
|
97 ;_fastcall void readmenu(void);
|
pascal@23863
|
98 ;***************************************************************
|
pascal@23863
|
99 global @readmenu$qv:near
|
pascal@23863
|
100 proc @readmenu$qv near
|
pascal@23806
|
101
|
pascal@23844
|
102 mov dx,18
|
pascal@23844
|
103 xor cx,cx
|
pascal@23844
|
104 call lseekset
|
pascal@23844
|
105 mov dx,offset _isostate.filemod
|
pascal@23844
|
106 mov cx,10
|
pascal@23844
|
107 call readfd ; // read x->filemod + x->fileofs & x->filesize
|
pascal@23844
|
108 mov bx,offset _isostate.fileofs
|
pascal@23844
|
109 ; x->fileofs = 0x7FF0 - (x->filesize &= 0xFFFF);
|
pascal@23844
|
110 mov ax,7FF0h
|
pascal@23863
|
111 cwd
|
pascal@23863
|
112 mov [word bx+6],dx
|
pascal@23844
|
113 sub ax,[bx+4]
|
pascal@23863
|
114 mov [word bx+2],dx
|
pascal@23844
|
115 mov [bx],ax
|
pascal@23844
|
116 ; //magic = x->filemod;
|
pascal@23844
|
117
|
pascal@23863
|
118 endp @readmenu$qv
|
pascal@23863
|
119
|
pascal@23806
|
120 ;***************************************************************
|
pascal@23806
|
121 ;_fastcall void isolseek(bx:const unsigned long *offset);
|
pascal@23806
|
122 ;***************************************************************
|
pascal@23806
|
123 global @isolseek$qpxul:near
|
pascal@23806
|
124 proc @isolseek$qpxul near
|
pascal@23806
|
125
|
pascal@23806
|
126 isolseek:
|
pascal@23806
|
127 mov dx,[bx]
|
pascal@23806
|
128 mov cx,[bx+2]
|
pascal@23806
|
129 lseekset:
|
pascal@23806
|
130 mov ax,4200h ; bx=fd cx:dx=offset al=whence
|
pascal@23806
|
131 dosfd:
|
pascal@23806
|
132 mov bx,[_isostate.fd]
|
pascal@23806
|
133 dos:
|
pascal@23806
|
134 int 21h
|
pascal@23806
|
135 failifc:
|
pascal@23806
|
136 jnc @@dosok
|
pascal@23806
|
137 fail:
|
pascal@23806
|
138 sbb ax,ax
|
pascal@23806
|
139 cwd
|
pascal@23806
|
140 @@dosok:
|
pascal@23806
|
141 ret
|
pascal@23806
|
142
|
pascal@23806
|
143 endp @isolseek$qpxul
|
pascal@23806
|
144
|
pascal@23806
|
145 ;***************************************************************
|
pascal@23806
|
146 ;_fastcall int isoreadsector(bx:const unsigned long *offset);
|
pascal@23806
|
147 ;***************************************************************
|
pascal@23806
|
148 global @isoreadsector$qpxul:near
|
pascal@23806
|
149 proc @isoreadsector$qpxul near
|
pascal@23806
|
150
|
pascal@23806
|
151 call isolseek
|
pascal@23806
|
152 jc fail
|
pascal@23806
|
153 mov cx,2560
|
pascal@23806
|
154 mov dx,offset _isostate.buffer
|
pascal@23806
|
155 global readfd:near
|
pascal@23806
|
156 readfd:
|
pascal@23806
|
157 mov ah,3Fh
|
pascal@23806
|
158 jmp dosfd
|
pascal@23806
|
159
|
pascal@23806
|
160 endp @isoreadsector$qpxul
|
pascal@23806
|
161
|
pascal@23806
|
162 ;***************************************************************
|
pascal@23806
|
163 ;_fastcall int strhead(bx:const char* a, ax:const char* b);
|
pascal@23806
|
164 ;***************************************************************
|
pascal@23806
|
165 global @strhead$qpxzct1:near
|
pascal@23806
|
166 proc @strhead$qpxzct1 near
|
pascal@23806
|
167
|
pascal@23806
|
168 @@loop:
|
pascal@23806
|
169 xchg ax,bx
|
pascal@23806
|
170 mov cl,[bx] ; cl = *b++
|
pascal@23806
|
171 inc bx
|
pascal@23806
|
172 or cl,cl ; clear C
|
pascal@23806
|
173 jz failifc ; return 0
|
pascal@23806
|
174 xchg ax,bx
|
pascal@23806
|
175 xor cl,[bx] ; cl -= *a++
|
pascal@23806
|
176 inc bx
|
pascal@23806
|
177 and cl,0dfh ; case insensitive
|
pascal@23806
|
178 jne fail ; return -1
|
pascal@23806
|
179 jmp @@loop
|
pascal@23806
|
180
|
pascal@23806
|
181 endp @strhead$qpxzct1
|
pascal@23806
|
182
|
pascal@23806
|
183 ;***************************************************************
|
pascal@23806
|
184 ;_fastcall int strcmp(bx:const char* a, ax:const char* b);
|
pascal@23806
|
185 ;***************************************************************
|
pascal@23806
|
186 global @strcmp$qpxzct1:near
|
pascal@23806
|
187 proc @strcmp$qpxzct1 near
|
pascal@23806
|
188
|
pascal@23806
|
189 push si
|
pascal@23806
|
190 xchg ax,si
|
pascal@23806
|
191 dec bx
|
pascal@23806
|
192 @@lp:
|
pascal@23806
|
193 inc bx
|
pascal@23806
|
194 lodsb
|
pascal@23806
|
195 sub al,[bx]
|
pascal@23806
|
196 jnz @@out
|
pascal@23806
|
197 or al,[bx]
|
pascal@23806
|
198 jnz @@lp
|
pascal@23806
|
199 @@out:
|
pascal@23806
|
200 cbw
|
pascal@23806
|
201 pop si
|
pascal@23806
|
202 ret
|
pascal@23806
|
203
|
pascal@23806
|
204 endp @strcmp$qpxzct1
|
pascal@23806
|
205
|
pascal@23863
|
206 iso_read_hack:
|
pascal@23863
|
207 ifdef NO386
|
pascal@23863
|
208 push dx
|
pascal@23863
|
209 curseek
|
pascal@23863
|
210 mov bx,[word _isostate.filesize]
|
pascal@23863
|
211 sub bx,ax
|
pascal@23863
|
212 mov ax,[(word _isostate.filesize)+2]
|
pascal@23863
|
213 sbb ax,dx
|
pascal@23863
|
214 ja @@cxok
|
pascal@23863
|
215 je @@rem
|
pascal@23863
|
216 xor cx,cx
|
pascal@23863
|
217 @@rem:
|
pascal@23863
|
218 cmp bx,cx
|
pascal@23863
|
219 ja @@cxok
|
pascal@23863
|
220 mov cx,bx
|
pascal@23863
|
221 @@cxok:
|
pascal@23863
|
222 pop dx
|
pascal@23863
|
223 else
|
pascal@23863
|
224 p386
|
pascal@23863
|
225 push edx
|
pascal@23863
|
226 curseek
|
pascal@23863
|
227 mov edx,[_isostate.filesize]
|
pascal@23863
|
228 sub edx,eax
|
pascal@23863
|
229 jnb @@rem
|
pascal@23863
|
230 xor cx,cx
|
pascal@23863
|
231 @@rem:
|
pascal@23863
|
232 movzx eax,cx
|
pascal@23863
|
233 cmp edx,eax
|
pascal@23863
|
234 ja @@cxok
|
pascal@23863
|
235 mov cx,dx
|
pascal@23863
|
236 @@cxok:
|
pascal@23863
|
237 pop edx
|
pascal@23863
|
238 endif
|
pascal@23863
|
239 or cx,cx
|
pascal@23863
|
240 pop bx
|
pascal@23863
|
241 jmp readfd
|
pascal@23863
|
242
|
pascal@23863
|
243 iso_lseek_hack:
|
pascal@23863
|
244 xchg ax,bx
|
pascal@23863
|
245 pop bx
|
pascal@23863
|
246 ifdef SEEK_CUR
|
pascal@23863
|
247 cmp al,1 ; current
|
pascal@23863
|
248 jne @@nocurrent
|
pascal@23863
|
249 call dosfd ; lseek(,0L,SEEK_CUR)
|
pascal@23863
|
250 jmp @doseek2
|
pascal@23863
|
251 @nocurrent:
|
pascal@23863
|
252 endif
|
pascal@23863
|
253 add dx,[word _isostate.fileofs]
|
pascal@23863
|
254 adc cx,[(word _isostate.fileofs)+2]
|
pascal@23863
|
255 cmp al,0 ; start
|
pascal@23863
|
256 je @@doseek
|
pascal@23863
|
257 add dx,[word _isostate.filesize]
|
pascal@23863
|
258 adc cx,[(word _isostate.filesize)+2]
|
pascal@23863
|
259 @@doseek:
|
pascal@23863
|
260 call lseekset ; lseek(,0L,SEEK_SET)
|
pascal@23863
|
261 @doseek2:
|
pascal@23863
|
262 sub ax,[word _isostate.fileofs]
|
pascal@23863
|
263 sbb dx,[(word _isostate.fileofs)+2]
|
pascal@23863
|
264 ret
|
pascal@23863
|
265
|
pascal@23863
|
266 iso_cleanup_hack:
|
pascal@23863
|
267 mov ah,3Eh ; close file
|
pascal@23863
|
268 jmp dosfd
|
pascal@23806
|
269 ifdef NO386
|
pascal@23806
|
270 global N_LXLSH@ES:near
|
pascal@23806
|
271 N_LXLSH@ES:
|
pascal@23806
|
272 mov dx,es
|
pascal@23806
|
273 global N_LXLSH@:near
|
pascal@23806
|
274 N_LXLSH@:
|
pascal@23806
|
275 mov ch,0
|
pascal@23806
|
276 @@lp:
|
pascal@23806
|
277 shl ax,1
|
pascal@23806
|
278 rcl dx,1
|
pascal@23806
|
279 loop @@lp
|
pascal@23806
|
280 ret
|
pascal@23806
|
281 endif
|
pascal@23806
|
282
|
pascal@23806
|
283 ends _TEXT
|
pascal@23806
|
284
|
pascal@23806
|
285 end
|