Subversion Repositories Kolibri OS

Rev

Rev 837 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 837 Rev 897
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
7
 
8
$Revision: 709 $
8
$Revision: 897 $
9
 
9
 
10
 
10
 
11
image_of_eax EQU esp+36
11
image_of_eax EQU esp+36
12
image_of_ebx EQU esp+24
12
image_of_ebx EQU esp+24
13
 
13
 
14
; System function 70 - files with long names (LFN)
14
; System function 70 - files with long names (LFN)
15
; diamond, 2006
15
; diamond, 2006
16
 
16
 
17
iglobal
17
iglobal
18
; in this table names must be in lowercase
18
; in this table names must be in lowercase
19
rootdirs:
19
rootdirs:
20
	db	2,'rd'
20
	db	2,'rd'
21
	dd	fs_OnRamdisk
21
	dd	fs_OnRamdisk
22
	dd	fs_NextRamdisk
22
	dd	fs_NextRamdisk
23
	db	7,'ramdisk'
23
	db	7,'ramdisk'
24
	dd	fs_OnRamdisk
24
	dd	fs_OnRamdisk
25
	dd	fs_NextRamdisk
25
	dd	fs_NextRamdisk
26
	db	2,'fd'
26
	db	2,'fd'
27
	dd	fs_OnFloppy
27
	dd	fs_OnFloppy
28
	dd	fs_NextFloppy
28
	dd	fs_NextFloppy
29
	db	10,'floppydisk'
29
	db	10,'floppydisk'
30
	dd	fs_OnFloppy
30
	dd	fs_OnFloppy
31
	dd	fs_NextFloppy
31
	dd	fs_NextFloppy
32
	db	3,'hd0'
32
	db	3,'hd0'
33
	dd	fs_OnHd0
33
	dd	fs_OnHd0
34
	dd	fs_NextHd0
34
	dd	fs_NextHd0
35
	db	3,'hd1'
35
	db	3,'hd1'
36
	dd	fs_OnHd1
36
	dd	fs_OnHd1
37
	dd	fs_NextHd1
37
	dd	fs_NextHd1
38
	db	3,'hd2'
38
	db	3,'hd2'
39
	dd	fs_OnHd2
39
	dd	fs_OnHd2
40
	dd	fs_NextHd2
40
	dd	fs_NextHd2
41
	db	3,'hd3'
41
	db	3,'hd3'
42
	dd	fs_OnHd3
42
	dd	fs_OnHd3
43
	dd	fs_NextHd3
43
	dd	fs_NextHd3
44
;**********************************************
44
;**********************************************
45
	db	3,'cd0'
45
	db	3,'cd0'
46
	dd	fs_OnCd0
46
	dd	fs_OnCd0
47
	dd	fs_NextCd
47
	dd	fs_NextCd
48
	db	3,'cd1'
48
	db	3,'cd1'
49
	dd	fs_OnCd1
49
	dd	fs_OnCd1
50
	dd	fs_NextCd
50
	dd	fs_NextCd
51
	db	3,'cd2'
51
	db	3,'cd2'
52
	dd	fs_OnCd2
52
	dd	fs_OnCd2
53
	dd	fs_NextCd
53
	dd	fs_NextCd
54
	db	3,'cd3'
54
	db	3,'cd3'
55
	dd	fs_OnCd3
55
	dd	fs_OnCd3
56
	dd	fs_NextCd
56
	dd	fs_NextCd
57
;***********************************************
57
;***********************************************
58
	db	0
58
	db	0
59
 
59
 
60
 
60
 
61
virtual_root_query:
61
virtual_root_query:
62
	dd	fs_HasRamdisk
62
	dd	fs_HasRamdisk
63
	db	'rd',0
63
	db	'rd',0
64
	dd	fs_HasFloppy
64
	dd	fs_HasFloppy
65
	db	'fd',0
65
	db	'fd',0
66
	dd	fs_HasHd0
66
	dd	fs_HasHd0
67
	db	'hd0',0
67
	db	'hd0',0
68
	dd	fs_HasHd1
68
	dd	fs_HasHd1
69
	db	'hd1',0
69
	db	'hd1',0
70
	dd	fs_HasHd2
70
	dd	fs_HasHd2
71
	db	'hd2',0
71
	db	'hd2',0
72
	dd	fs_HasHd3
72
	dd	fs_HasHd3
73
	db	'hd3',0
73
	db	'hd3',0
74
;**********************************************
74
;**********************************************
75
	dd	fs_HasCd0
75
	dd	fs_HasCd0
76
	db	'cd0',0
76
	db	'cd0',0
77
	dd	fs_HasCd1
77
	dd	fs_HasCd1
78
	db	'cd1',0
78
	db	'cd1',0
79
	dd	fs_HasCd2
79
	dd	fs_HasCd2
80
	db	'cd2',0
80
	db	'cd2',0
81
	dd	fs_HasCd3
81
	dd	fs_HasCd3
82
	db	'cd3',0
82
	db	'cd3',0
83
;**********************************************
83
;**********************************************
84
	dd	0
84
	dd	0
85
 
85
 
86
fs_additional_handlers:
86
fs_additional_handlers:
87
        dd      biosdisk_handler, biosdisk_enum_root
87
        dd      biosdisk_handler, biosdisk_enum_root
88
; add new handlers here
88
; add new handlers here
89
        dd      0
89
        dd      0
90
 
90
 
91
endg
91
endg
92
 
92
 
93
file_system_lfn:
93
file_system_lfn:
94
; in: eax->fileinfo block
94
; in: eax->fileinfo block
95
; operation codes:
95
; operation codes:
96
; 0 : read file
96
; 0 : read file
97
; 1 : read folder
97
; 1 : read folder
98
; 2 : create/rewrite file
98
; 2 : create/rewrite file
99
; 3 : write/append to file
99
; 3 : write/append to file
100
; 4 : set end of file
100
; 4 : set end of file
101
; 5 : get file/directory attributes structure
101
; 5 : get file/directory attributes structure
102
; 6 : set file/directory attributes structure
102
; 6 : set file/directory attributes structure
103
; 7 : start application
103
; 7 : start application
104
; 8 : delete file
104
; 8 : delete file
105
; 9 : create directory
105
; 9 : create directory
-
 
106
 
-
 
107
    cmp dword [eax], 7
-
 
108
    je .do_exec
106
 
109
 
107
; parse file name
110
; parse file name
108
	xchg	ebx, eax
111
	xchg	ebx, eax
109
	lea	esi, [ebx+20]
112
	lea	esi, [ebx+20]
110
	lodsb
113
	lodsb
111
	test	al, al
114
	test	al, al
112
	jnz	@f
115
	jnz	@f
113
	mov	esi, [esi]
116
	mov	esi, [esi]
114
	lodsb
117
	lodsb
115
@@:
118
@@:
116
	cmp	al, '/'
119
	cmp	al, '/'
117
	jz	.notcurdir
120
	jz	.notcurdir
118
	dec	esi
121
	dec	esi
119
	mov	ebp, esi
122
	mov	ebp, esi
120
	test	al, al
123
	test	al, al
121
	jnz	@f
124
	jnz	@f
122
	xor	ebp, ebp
125
	xor	ebp, ebp
123
@@:
126
@@:
124
	mov	esi, [current_slot]
127
	mov	esi, [current_slot]
125
	mov	esi, [esi+APPDATA.cur_dir]
128
	mov	esi, [esi+APPDATA.cur_dir]
126
	jmp	.parse_normal
129
	jmp	.parse_normal
127
.notcurdir:
130
.notcurdir:
128
	cmp	byte [esi], 0
131
	cmp	byte [esi], 0
129
	jz	.rootdir
132
	jz	.rootdir
130
	call	process_replace_file_name
133
	call	process_replace_file_name
131
.parse_normal:
134
.parse_normal:
132
	cmp dword [ebx], 7
-
 
133
	jne @F
-
 
134
	mov edx, [ebx+4]
-
 
135
	mov ebx, [ebx+8]
-
 
136
	call fs_execute  ; esi+ebp, ebx, edx
-
 
137
	mov [image_of_eax], eax
-
 
138
	ret
-
 
139
@@:
-
 
140
	mov	edi, rootdirs-8
135
	mov	edi, rootdirs-8
141
	xor	ecx, ecx
136
	xor	ecx, ecx
142
	push	esi
137
	push	esi
143
.scan1:
138
.scan1:
144
	pop	esi
139
	pop	esi
145
	add	edi, ecx
140
	add	edi, ecx
146
	scasd
141
	scasd
147
	scasd
142
	scasd
148
	mov	cl, byte [edi]
143
	mov	cl, byte [edi]
149
	test	cl, cl
144
	test	cl, cl
150
	jz	.notfound_try
145
	jz	.notfound_try
151
	inc	edi
146
	inc	edi
152
	push	esi
147
	push	esi
153
@@:
148
@@:
154
	lodsb
149
	lodsb
155
	or	al, 20h
150
	or	al, 20h
156
	scasb
151
	scasb
157
	loopz	@b
152
	loopz	@b
158
	jnz	.scan1
153
	jnz	.scan1
159
	lodsb
154
	lodsb
160
	cmp	al, '/'
155
	cmp	al, '/'
161
	jz	.found1
156
	jz	.found1
162
	test	al, al
157
	test	al, al
163
	jnz	.scan1
158
	jnz	.scan1
164
	pop	eax
159
	pop	eax
165
; directory /xxx
160
; directory /xxx
166
.maindir:
161
.maindir:
167
	mov	esi, [edi+4]
162
	mov	esi, [edi+4]
168
.maindir_noesi:
163
.maindir_noesi:
169
	cmp	dword [ebx], 1
164
	cmp	dword [ebx], 1
170
	jnz	.access_denied
165
	jnz	.access_denied
171
	xor	eax, eax
166
	xor	eax, eax
172
	mov	ebp, [ebx+12]
167
	mov	ebp, [ebx+12]
173
	mov	edx, [ebx+16]
168
	mov	edx, [ebx+16]
174
    ;    add     edx, std_application_base_address
169
    ;    add     edx, std_application_base_address
175
	push	dword [ebx+4]	; first block
170
	push	dword [ebx+4]	; first block
176
	mov	ebx, [ebx+8]	; flags
171
	mov	ebx, [ebx+8]	; flags
177
; ebx=flags, [esp]=first block, ebp=number of blocks, edx=return area, esi='Next' handler
172
; ebx=flags, [esp]=first block, ebp=number of blocks, edx=return area, esi='Next' handler
178
	mov	edi, edx
173
	mov	edi, edx
179
	push    ecx
174
	push    ecx
180
	mov	ecx, 32/4
175
	mov	ecx, 32/4
181
	rep	stosd
176
	rep	stosd
182
	pop     ecx
177
	pop     ecx
183
	mov	byte [edx], 1	; version
178
	mov	byte [edx], 1	; version
184
.maindir_loop:
179
.maindir_loop:
185
	call	esi
180
	call	esi
186
	jc	.maindir_done
181
	jc	.maindir_done
187
	inc	dword [edx+8]
182
	inc	dword [edx+8]
188
	dec	dword [esp]
183
	dec	dword [esp]
189
	jns	.maindir_loop
184
	jns	.maindir_loop
190
	dec	ebp
185
	dec	ebp
191
	js	.maindir_loop
186
	js	.maindir_loop
192
	inc	dword [edx+4]
187
	inc	dword [edx+4]
193
	mov	dword [edi], 0x10	; attributes: folder
188
	mov	dword [edi], 0x10	; attributes: folder
194
	mov	dword [edi+4], 1	; name type: UNICODE
189
	mov	dword [edi+4], 1	; name type: UNICODE
195
	push	eax
190
	push	eax
196
	xor	eax, eax
191
	xor	eax, eax
197
	add	edi, 8
192
	add	edi, 8
198
	push    ecx
193
	push    ecx
199
	mov	ecx, 40/4-2
194
	mov	ecx, 40/4-2
200
	rep	stosd
195
	rep	stosd
201
	pop     ecx
196
	pop     ecx
202
	pop	eax
197
	pop	eax
203
	push	eax edx
198
	push	eax edx
204
; convert number in eax to decimal UNICODE string
199
; convert number in eax to decimal UNICODE string
205
	push	edi
200
	push	edi
206
	push    ecx
201
	push    ecx
207
	push	-'0'
202
	push	-'0'
208
	mov	ecx, 10
203
	mov	ecx, 10
209
@@:
204
@@:
210
	xor	edx, edx
205
	xor	edx, edx
211
	div	ecx
206
	div	ecx
212
	push	edx
207
	push	edx
213
	test	eax, eax
208
	test	eax, eax
214
	jnz	@b
209
	jnz	@b
215
@@:
210
@@:
216
	pop	eax
211
	pop	eax
217
	add	al, '0'
212
	add	al, '0'
218
	stosb
213
	stosb
219
	test	bl, 1		; UNICODE name?
214
	test	bl, 1		; UNICODE name?
220
	jz	.ansi2
215
	jz	.ansi2
221
	mov	byte [edi], 0
216
	mov	byte [edi], 0
222
	inc	edi
217
	inc	edi
223
.ansi2:
218
.ansi2:
224
	test	al, al
219
	test	al, al
225
	jnz	@b
220
	jnz	@b
226
	mov	byte [edi-1], 0
221
	mov	byte [edi-1], 0
227
	pop     ecx
222
	pop     ecx
228
	pop	edi
223
	pop	edi
229
; UNICODE name length is 520 bytes, ANSI - 264
224
; UNICODE name length is 520 bytes, ANSI - 264
230
	add	edi, 520
225
	add	edi, 520
231
	test	bl, 1
226
	test	bl, 1
232
	jnz	@f
227
	jnz	@f
233
	sub	edi, 520-264
228
	sub	edi, 520-264
234
@@:
229
@@:
235
	pop	edx eax
230
	pop	edx eax
236
	jmp	.maindir_loop
231
	jmp	.maindir_loop
237
.maindir_done:
232
.maindir_done:
238
	pop	eax
233
	pop	eax
239
	mov	ebx, [edx+4]
234
	mov	ebx, [edx+4]
240
	xor	eax, eax
235
	xor	eax, eax
241
	dec	ebp
236
	dec	ebp
242
	js	@f
237
	js	@f
243
	mov	al, ERROR_END_OF_FILE
238
	mov	al, ERROR_END_OF_FILE
244
@@:
239
@@:
245
	mov	[image_of_eax], eax
240
	mov	[image_of_eax], eax
246
	mov	[image_of_ebx], ebx
241
	mov	[image_of_ebx], ebx
247
	ret
242
	ret
248
; directory /
243
; directory /
249
.rootdir:
244
.rootdir:
250
	cmp	dword [ebx], 1	; read folder?
245
	cmp	dword [ebx], 1	; read folder?
251
	jz	.readroot
246
	jz	.readroot
252
.access_denied:
247
.access_denied:
253
	mov	dword [image_of_eax], 10      ; access denied
248
	mov	dword [image_of_eax], 10      ; access denied
254
	ret
249
	ret
255
 
250
 
256
.readroot:
251
.readroot:
257
; virtual root folder - special handler
252
; virtual root folder - special handler
258
	mov	esi, virtual_root_query
253
	mov	esi, virtual_root_query
259
	mov	ebp, [ebx+12]
254
	mov	ebp, [ebx+12]
260
	mov	edx, [ebx+16]
255
	mov	edx, [ebx+16]
261
    ;    add     edx, std_application_base_address
256
    ;    add     edx, std_application_base_address
262
	push	dword [ebx+4]	; first block
257
	push	dword [ebx+4]	; first block
263
	mov	ebx, [ebx+8]	; flags
258
	mov	ebx, [ebx+8]	; flags
264
	xor	eax, eax
259
	xor	eax, eax
265
; eax=0, [esp]=first block, ebx=flags, ebp=number of blocks, edx=return area
260
; eax=0, [esp]=first block, ebx=flags, ebp=number of blocks, edx=return area
266
	mov	edi, edx
261
	mov	edi, edx
267
	mov	ecx, 32/4
262
	mov	ecx, 32/4
268
	rep	stosd
263
	rep	stosd
269
	mov	byte [edx], 1	; version
264
	mov	byte [edx], 1	; version
270
.readroot_loop:
265
.readroot_loop:
271
	cmp	dword [esi], eax
266
	cmp	dword [esi], eax
272
	jz	.readroot_done_static
267
	jz	.readroot_done_static
273
	call	dword [esi]
268
	call	dword [esi]
274
	add	esi, 4
269
	add	esi, 4
275
	test	eax, eax
270
	test	eax, eax
276
	jnz	@f
271
	jnz	@f
277
.readroot_next:
272
.readroot_next:
278
	or	ecx, -1
273
	or	ecx, -1
279
	xchg	esi, edi
274
	xchg	esi, edi
280
	repnz	scasb
275
	repnz	scasb
281
	xchg	esi, edi
276
	xchg	esi, edi
282
	jmp	.readroot_loop
277
	jmp	.readroot_loop
283
@@:
278
@@:
284
	xor	eax, eax
279
	xor	eax, eax
285
	inc	dword [edx+8]
280
	inc	dword [edx+8]
286
	dec	dword [esp]
281
	dec	dword [esp]
287
	jns	.readroot_next
282
	jns	.readroot_next
288
	dec	ebp
283
	dec	ebp
289
	js	.readroot_next
284
	js	.readroot_next
290
	inc	dword [edx+4]
285
	inc	dword [edx+4]
291
	mov	dword [edi], 0x10	; attributes: folder
286
	mov	dword [edi], 0x10	; attributes: folder
292
	mov	dword [edi+4], ebx	; name type: UNICODE
287
	mov	dword [edi+4], ebx	; name type: UNICODE
293
	add	edi, 8
288
	add	edi, 8
294
	mov	ecx, 40/4-2
289
	mov	ecx, 40/4-2
295
	rep	stosd
290
	rep	stosd
296
	push	edi
291
	push	edi
297
@@:
292
@@:
298
	lodsb
293
	lodsb
299
	stosb
294
	stosb
300
	test	bl, 1
295
	test	bl, 1
301
	jz	.ansi
296
	jz	.ansi
302
	mov	byte [edi], 0
297
	mov	byte [edi], 0
303
	inc	edi
298
	inc	edi
304
.ansi:
299
.ansi:
305
	test	eax, eax
300
	test	eax, eax
306
	jnz	@b
301
	jnz	@b
307
	pop	edi
302
	pop	edi
308
	add	edi, 520
303
	add	edi, 520
309
	test	bl, 1
304
	test	bl, 1
310
	jnz	.readroot_loop
305
	jnz	.readroot_loop
311
	sub	edi, 520-264
306
	sub	edi, 520-264
312
	jmp	.readroot_loop
307
	jmp	.readroot_loop
313
.readroot_done_static:
308
.readroot_done_static:
314
        mov     esi, fs_additional_handlers-8
309
        mov     esi, fs_additional_handlers-8
315
        sub     esp, 16
310
        sub     esp, 16
316
.readroot_ah_loop:
311
.readroot_ah_loop:
317
        add     esi, 8
312
        add     esi, 8
318
        cmp     dword [esi], 0
313
        cmp     dword [esi], 0
319
        jz      .readroot_done
314
        jz      .readroot_done
320
        xor     eax, eax
315
        xor     eax, eax
321
.readroot_ah_loop2:
316
.readroot_ah_loop2:
322
        push    edi
317
        push    edi
323
        lea     edi, [esp+4]
318
        lea     edi, [esp+4]
324
        call    dword [esi+4]
319
        call    dword [esi+4]
325
        pop     edi
320
        pop     edi
326
        test    eax, eax
321
        test    eax, eax
327
        jz      .readroot_ah_loop
322
        jz      .readroot_ah_loop
328
        inc     dword [edx+8]
323
        inc     dword [edx+8]
329
        dec     dword [esp+16]
324
        dec     dword [esp+16]
330
        jns     .readroot_ah_loop2
325
        jns     .readroot_ah_loop2
331
        dec     ebp
326
        dec     ebp
332
        js      .readroot_ah_loop2
327
        js      .readroot_ah_loop2
333
        push    eax
328
        push    eax
334
        xor     eax, eax
329
        xor     eax, eax
335
        inc     dword [edx+4]
330
        inc     dword [edx+4]
336
        mov     dword [edi], 0x10       ; attributes: folder
331
        mov     dword [edi], 0x10       ; attributes: folder
337
        mov     dword [edi+4], ebx
332
        mov     dword [edi+4], ebx
338
        add     edi, 8
333
        add     edi, 8
339
        mov     ecx, 40/4-2
334
        mov     ecx, 40/4-2
340
        rep     stosd
335
        rep     stosd
341
        push    esi edi
336
        push    esi edi
342
        lea     esi, [esp+12]
337
        lea     esi, [esp+12]
343
@@:
338
@@:
344
        lodsb
339
        lodsb
345
        stosb
340
        stosb
346
        test    bl, 1
341
        test    bl, 1
347
        jz      .ansi3
342
        jz      .ansi3
348
        mov     byte [edi], 0
343
        mov     byte [edi], 0
349
        inc     edi
344
        inc     edi
350
.ansi3:
345
.ansi3:
351
        test    al, al
346
        test    al, al
352
        jnz     @b
347
        jnz     @b
353
        pop     edi esi eax
348
        pop     edi esi eax
354
        add     edi, 520
349
        add     edi, 520
355
        test    bl, 1
350
        test    bl, 1
356
        jnz     .readroot_ah_loop2
351
        jnz     .readroot_ah_loop2
357
        sub     edi, 520-264
352
        sub     edi, 520-264
358
        jmp     .readroot_ah_loop2
353
        jmp     .readroot_ah_loop2
359
.readroot_done:
354
.readroot_done:
360
        add     esp, 16
355
        add     esp, 16
361
	pop	eax
356
	pop	eax
362
	mov	ebx, [edx+4]
357
	mov	ebx, [edx+4]
363
	xor	eax, eax
358
	xor	eax, eax
364
	dec	ebp
359
	dec	ebp
365
	js	@f
360
	js	@f
366
	mov	al, ERROR_END_OF_FILE
361
	mov	al, ERROR_END_OF_FILE
367
@@:
362
@@:
368
	mov	[image_of_eax], eax
363
	mov	[image_of_eax], eax
369
	mov	[image_of_ebx], ebx
364
	mov	[image_of_ebx], ebx
370
	ret
365
	ret
371
.notfound_try:
366
.notfound_try:
372
        mov     edi, fs_additional_handlers
367
        mov     edi, fs_additional_handlers
373
@@:
368
@@:
374
        cmp     dword [edi], 0
369
        cmp     dword [edi], 0
375
        jz      @f
370
        jz      @f
376
        call    dword [edi]
371
        call    dword [edi]
377
        scasd
372
        scasd
378
        scasd
373
        scasd
379
        jmp     @b
374
        jmp     @b
380
.notfound:
375
.notfound:
381
	mov	dword [image_of_eax], ERROR_FILE_NOT_FOUND
376
	mov	dword [image_of_eax], ERROR_FILE_NOT_FOUND
382
	and	dword [image_of_ebx], 0
377
	and	dword [image_of_ebx], 0
383
	ret
378
	ret
384
 
379
 
385
.notfounda:
380
.notfounda:
386
        cmp     edi, esp
381
        cmp     edi, esp
387
        jnz     .notfound
382
        jnz     .notfound
388
        add     esp, 8
383
        add     esp, 8
389
        jmp     .notfound
384
        jmp     .notfound
390
 
385
 
391
.found1:
386
.found1:
392
	pop	eax
387
	pop	eax
393
	cmp	byte [esi], 0
388
	cmp	byte [esi], 0
394
	jz	.maindir
389
	jz	.maindir
395
.found2:
390
.found2:
396
; read partition number
391
; read partition number
397
	xor	ecx, ecx
392
	xor	ecx, ecx
398
	xor	eax, eax
393
	xor	eax, eax
399
@@:
394
@@:
400
	lodsb
395
	lodsb
401
	cmp	al, '/'
396
	cmp	al, '/'
402
	jz	.done1
397
	jz	.done1
403
	test	al, al
398
	test	al, al
404
	jz	.done1
399
	jz	.done1
405
	sub	al, '0'
400
	sub	al, '0'
406
	cmp	al, 9
401
	cmp	al, 9
407
	ja	.notfounda
402
	ja	.notfounda
408
	lea	ecx, [ecx*5]
403
	lea	ecx, [ecx*5]
409
	lea	ecx, [ecx*2+eax]
404
	lea	ecx, [ecx*2+eax]
410
	jmp	@b
405
	jmp	@b
411
.done1:
406
.done1:
412
	jecxz	.notfounda
407
	jecxz	.notfounda
413
	test	al, al
408
	test	al, al
414
	jnz	@f
409
	jnz	@f
415
	dec	esi
410
	dec	esi
416
@@:
411
@@:
417
	cmp	byte [esi], 0
412
	cmp	byte [esi], 0
418
	jnz	@f
413
	jnz	@f
419
	test	ebp, ebp
414
	test	ebp, ebp
420
	jz	@f
415
	jz	@f
421
	mov	esi, ebp
416
	mov	esi, ebp
422
	xor	ebp, ebp
417
	xor	ebp, ebp
423
@@:
418
@@:
424
; now [edi] contains handler address, ecx - partition number,
419
; now [edi] contains handler address, ecx - partition number,
425
; esi points to ASCIIZ string - rest of name
420
; esi points to ASCIIZ string - rest of name
426
	jmp	dword [edi]
421
	jmp	dword [edi]
-
 
422
 
-
 
423
.do_exec:
-
 
424
          lea ebx, [eax+20]
-
 
425
          cmp byte [ebx],0
-
 
426
          jnz @F
-
 
427
 
-
 
428
          mov ebx, [ebx+1]
-
 
429
@@:
-
 
430
          push  dword [eax+4]
-
 
431
          push  dword [eax+8]
-
 
432
          push  ebx
-
 
433
 
-
 
434
          call _sys_exec
-
 
435
          mov [image_of_eax], eax
-
 
436
          add esp, 12
-
 
437
 
-
 
438
          ret
427
 
439
 
428
; handlers for devices
440
; handlers for devices
429
; in: ecx = 0 => query virtual directory /xxx
441
; in: ecx = 0 => query virtual directory /xxx
430
; in: ecx = partition number
442
; in: ecx = partition number
431
;     esi -> relative (for device) name
443
;     esi -> relative (for device) name
432
;     ebx -> fileinfo
444
;     ebx -> fileinfo
433
;     ebp = 0 or pointer to rest of name from folder addressed by esi
445
;     ebp = 0 or pointer to rest of name from folder addressed by esi
434
; out: [image_of_eax]=image of eax, [image_of_ebx]=image of ebx
446
; out: [image_of_eax]=image of eax, [image_of_ebx]=image of ebx
435
 
447
 
436
fs_OnRamdisk:
448
fs_OnRamdisk:
437
	cmp	ecx, 1
449
	cmp	ecx, 1
438
	jnz	file_system_lfn.notfound
450
	jnz	file_system_lfn.notfound
439
	mov	eax, [ebx]
451
	mov	eax, [ebx]
440
	cmp	eax, fs_NumRamdiskServices
452
	cmp	eax, fs_NumRamdiskServices
441
	jae	.not_impl
453
	jae	.not_impl
442
	mov	ecx, [ebx+12]
454
	mov	ecx, [ebx+12]
443
	mov	edx, [ebx+16]
455
	mov	edx, [ebx+16]
444
   ;     add     edx, std_application_base_address
456
   ;     add     edx, std_application_base_address
445
	add	ebx, 4
457
	add	ebx, 4
446
	call	dword [fs_RamdiskServices + eax*4]
458
	call	dword [fs_RamdiskServices + eax*4]
447
	mov	[image_of_eax], eax
459
	mov	[image_of_eax], eax
448
	mov	[image_of_ebx], ebx
460
	mov	[image_of_ebx], ebx
449
	ret
461
	ret
450
.not_impl:
462
.not_impl:
451
	mov	dword [image_of_eax], 2       ; not implemented
463
	mov	dword [image_of_eax], 2       ; not implemented
452
	ret
464
	ret
453
 
465
 
454
fs_NotImplemented:
466
fs_NotImplemented:
455
	mov	eax, 2
467
	mov	eax, 2
456
	ret
468
	ret
457
 
469
 
458
fs_RamdiskServices:
470
fs_RamdiskServices:
459
	dd	fs_RamdiskRead
471
	dd	fs_RamdiskRead
460
	dd	fs_RamdiskReadFolder
472
	dd	fs_RamdiskReadFolder
461
	dd	fs_RamdiskRewrite
473
	dd	fs_RamdiskRewrite
462
	dd	fs_RamdiskWrite
474
	dd	fs_RamdiskWrite
463
	dd	fs_RamdiskSetFileEnd
475
	dd	fs_RamdiskSetFileEnd
464
	dd	fs_RamdiskGetFileInfo
476
	dd	fs_RamdiskGetFileInfo
465
	dd	fs_RamdiskSetFileInfo
477
	dd	fs_RamdiskSetFileInfo
466
	dd	0
478
	dd	0
467
	dd	fs_RamdiskDelete
479
	dd	fs_RamdiskDelete
468
	dd	fs_RamdiskCreateFolder
480
	dd	fs_RamdiskCreateFolder
469
fs_NumRamdiskServices = ($ - fs_RamdiskServices)/4
481
fs_NumRamdiskServices = ($ - fs_RamdiskServices)/4
470
 
482
 
471
fs_OnFloppy:
483
fs_OnFloppy:
472
	cmp	ecx, 2
484
	cmp	ecx, 2
473
	ja	file_system_lfn.notfound
485
	ja	file_system_lfn.notfound
474
	mov	eax, [ebx]
486
	mov	eax, [ebx]
475
	cmp	eax, fs_NumFloppyServices
487
	cmp	eax, fs_NumFloppyServices
476
	jae	fs_OnRamdisk.not_impl
488
	jae	fs_OnRamdisk.not_impl
477
	call	reserve_flp
489
	call	reserve_flp
478
	mov	[flp_number], cl
490
	mov	[flp_number], cl
479
	mov	ecx, [ebx+12]
491
	mov	ecx, [ebx+12]
480
	mov	edx, [ebx+16]
492
	mov	edx, [ebx+16]
481
   ;     add     edx, std_application_base_address
493
   ;     add     edx, std_application_base_address
482
	add	ebx, 4
494
	add	ebx, 4
483
	call	dword [fs_FloppyServices + eax*4]
495
	call	dword [fs_FloppyServices + eax*4]
484
	and	[flp_status], 0
496
	and	[flp_status], 0
485
	mov	[image_of_eax], eax
497
	mov	[image_of_eax], eax
486
	mov	[image_of_ebx], ebx
498
	mov	[image_of_ebx], ebx
487
	ret
499
	ret
488
 
500
 
489
fs_FloppyServices:
501
fs_FloppyServices:
490
	dd	fs_FloppyRead
502
	dd	fs_FloppyRead
491
	dd	fs_FloppyReadFolder
503
	dd	fs_FloppyReadFolder
492
	dd	fs_FloppyRewrite
504
	dd	fs_FloppyRewrite
493
	dd	fs_FloppyWrite
505
	dd	fs_FloppyWrite
494
	dd	fs_FloppySetFileEnd
506
	dd	fs_FloppySetFileEnd
495
	dd	fs_FloppyGetFileInfo
507
	dd	fs_FloppyGetFileInfo
496
	dd	fs_FloppySetFileInfo
508
	dd	fs_FloppySetFileInfo
497
	dd	0
509
	dd	0
498
	dd	fs_FloppyDelete
510
	dd	fs_FloppyDelete
499
	dd	fs_FloppyCreateFolder
511
	dd	fs_FloppyCreateFolder
500
fs_NumFloppyServices = ($ - fs_FloppyServices)/4
512
fs_NumFloppyServices = ($ - fs_FloppyServices)/4
501
 
513
 
502
fs_OnHd0:
514
fs_OnHd0:
503
	call	reserve_hd1
515
	call	reserve_hd1
504
	mov	[hdbase], 0x1F0
516
	mov	[hdbase], 0x1F0
505
	mov	[hdid], 0
517
	mov	[hdid], 0
506
	push	1
518
	push	1
507
	jmp	fs_OnHd
519
	jmp	fs_OnHd
508
fs_OnHd1:
520
fs_OnHd1:
509
	call	reserve_hd1
521
	call	reserve_hd1
510
	mov	[hdbase], 0x1F0
522
	mov	[hdbase], 0x1F0
511
	mov	[hdid], 0x10
523
	mov	[hdid], 0x10
512
	push	2
524
	push	2
513
	jmp	fs_OnHd
525
	jmp	fs_OnHd
514
fs_OnHd2:
526
fs_OnHd2:
515
	call	reserve_hd1
527
	call	reserve_hd1
516
	mov	[hdbase], 0x170
528
	mov	[hdbase], 0x170
517
	mov	[hdid], 0
529
	mov	[hdid], 0
518
	push	3
530
	push	3
519
	jmp	fs_OnHd
531
	jmp	fs_OnHd
520
fs_OnHd3:
532
fs_OnHd3:
521
	call	reserve_hd1
533
	call	reserve_hd1
522
	mov	[hdbase], 0x170
534
	mov	[hdbase], 0x170
523
	mov	[hdid], 0x10
535
	mov	[hdid], 0x10
524
	push	4
536
	push	4
525
fs_OnHd:
537
fs_OnHd:
526
	call	reserve_hd_channel
538
	call	reserve_hd_channel
527
	pop	eax
539
	pop	eax
528
	mov	[hdpos], eax
540
	mov	[hdpos], eax
529
	cmp	ecx, 0x100
541
	cmp	ecx, 0x100
530
	jae	fs_OnHdAndBd.nf
542
	jae	fs_OnHdAndBd.nf
531
	cmp	cl, [DRIVE_DATA+1+eax]
543
	cmp	cl, [DRIVE_DATA+1+eax]
532
fs_OnHdAndBd:
544
fs_OnHdAndBd:
533
	jbe	@f
545
	jbe	@f
534
.nf:
546
.nf:
535
	call	free_hd_channel
547
	call	free_hd_channel
536
	and	[hd1_status], 0
548
	and	[hd1_status], 0
537
	mov	dword [image_of_eax], 5       ; not found
549
	mov	dword [image_of_eax], 5       ; not found
538
	ret
550
	ret
539
@@:
551
@@:
540
	mov	[fat32part], ecx
552
	mov	[fat32part], ecx
541
	push	ebx esi
553
	push	ebx esi
542
	call	choice_necessity_partition_1
554
	call	choice_necessity_partition_1
543
	pop	esi ebx
555
	pop	esi ebx
544
	mov	ecx, [ebx+12]
556
	mov	ecx, [ebx+12]
545
	mov	edx, [ebx+16]
557
	mov	edx, [ebx+16]
546
    ;    add     edx, std_application_base_address
558
    ;    add     edx, std_application_base_address
547
	mov	eax, [ebx]
559
	mov	eax, [ebx]
548
	cmp	eax, fs_NumHdServices
560
	cmp	eax, fs_NumHdServices
549
	jae	.not_impl
561
	jae	.not_impl
550
	add	ebx, 4
562
	add	ebx, 4
551
	call	dword [fs_HdServices + eax*4]
563
	call	dword [fs_HdServices + eax*4]
552
	call	free_hd_channel
564
	call	free_hd_channel
553
	and	[hd1_status], 0
565
	and	[hd1_status], 0
554
	mov	[image_of_eax], eax
566
	mov	[image_of_eax], eax
555
	mov	[image_of_ebx], ebx
567
	mov	[image_of_ebx], ebx
556
	ret
568
	ret
557
.not_impl:
569
.not_impl:
558
	call	free_hd_channel
570
	call	free_hd_channel
559
	and	[hd1_status], 0
571
	and	[hd1_status], 0
560
	mov	dword [image_of_eax], 2       ; not implemented
572
	mov	dword [image_of_eax], 2       ; not implemented
561
	ret
573
	ret
562
 
574
 
563
fs_HdServices:
575
fs_HdServices:
564
	dd	fs_HdRead
576
	dd	fs_HdRead
565
	dd	fs_HdReadFolder
577
	dd	fs_HdReadFolder
566
	dd	fs_HdRewrite
578
	dd	fs_HdRewrite
567
	dd	fs_HdWrite
579
	dd	fs_HdWrite
568
	dd	fs_HdSetFileEnd
580
	dd	fs_HdSetFileEnd
569
	dd	fs_HdGetFileInfo
581
	dd	fs_HdGetFileInfo
570
	dd	fs_HdSetFileInfo
582
	dd	fs_HdSetFileInfo
571
	dd	0
583
	dd	0
572
	dd	fs_HdDelete
584
	dd	fs_HdDelete
573
	dd	fs_HdCreateFolder
585
	dd	fs_HdCreateFolder
574
fs_NumHdServices = ($ - fs_HdServices)/4
586
fs_NumHdServices = ($ - fs_HdServices)/4
575
 
587
 
576
;*******************************************************
588
;*******************************************************
577
fs_OnCd0:
589
fs_OnCd0:
578
	call	reserve_cd
590
	call	reserve_cd
579
	mov  [ChannelNumber],1
591
	mov  [ChannelNumber],1
580
	mov  [DiskNumber],0
592
	mov  [DiskNumber],0
581
	push	6
593
	push	6
582
	push	1
594
	push	1
583
	jmp	fs_OnCd
595
	jmp	fs_OnCd
584
fs_OnCd1:
596
fs_OnCd1:
585
	call	reserve_cd
597
	call	reserve_cd
586
	mov  [ChannelNumber],1
598
	mov  [ChannelNumber],1
587
	mov  [DiskNumber],1
599
	mov  [DiskNumber],1
588
	push	4
600
	push	4
589
	push	2
601
	push	2
590
	jmp	fs_OnCd
602
	jmp	fs_OnCd
591
fs_OnCd2:
603
fs_OnCd2:
592
	call	reserve_cd
604
	call	reserve_cd
593
	mov  [ChannelNumber],2
605
	mov  [ChannelNumber],2
594
	mov  [DiskNumber],0
606
	mov  [DiskNumber],0
595
	push	2
607
	push	2
596
	push	3
608
	push	3
597
	jmp	fs_OnCd
609
	jmp	fs_OnCd
598
fs_OnCd3:
610
fs_OnCd3:
599
	call	reserve_cd
611
	call	reserve_cd
600
	mov  [ChannelNumber],2
612
	mov  [ChannelNumber],2
601
	mov  [DiskNumber],1
613
	mov  [DiskNumber],1
602
	push	0
614
	push	0
603
	push	4
615
	push	4
604
fs_OnCd:
616
fs_OnCd:
605
	call	reserve_cd_channel
617
	call	reserve_cd_channel
606
	pop	eax
618
	pop	eax
607
	mov	[cdpos], eax
619
	mov	[cdpos], eax
608
	pop	eax
620
	pop	eax
609
	cmp	ecx, 0x100
621
	cmp	ecx, 0x100
610
	jae	.nf
622
	jae	.nf
611
	push	ecx ebx
623
	push	ecx ebx
612
	mov	cl,al
624
	mov	cl,al
613
	mov	bl,[DRIVE_DATA+1]
625
	mov	bl,[DRIVE_DATA+1]
614
	shr	bl,cl
626
	shr	bl,cl
615
	test	bl,2
627
	test	bl,2
616
	pop	ebx ecx
628
	pop	ebx ecx
617
 
629
 
618
	jnz	@f
630
	jnz	@f
619
.nf:
631
.nf:
620
	call	free_cd_channel
632
	call	free_cd_channel
621
	and    [cd_status], 0
633
	and    [cd_status], 0
622
	mov	dword [image_of_eax], 5       ; not found
634
	mov	dword [image_of_eax], 5       ; not found
623
	ret
635
	ret
624
@@:
636
@@:
625
	mov	ecx, [ebx+12]
637
	mov	ecx, [ebx+12]
626
	mov	edx, [ebx+16]
638
	mov	edx, [ebx+16]
627
    ;    add     edx, std_application_base_address
639
    ;    add     edx, std_application_base_address
628
	mov	eax, [ebx]
640
	mov	eax, [ebx]
629
	cmp	eax,fs_NumCdServices
641
	cmp	eax,fs_NumCdServices
630
	jae	 .not_impl
642
	jae	 .not_impl
631
	add	ebx, 4
643
	add	ebx, 4
632
	call	dword [fs_CdServices + eax*4]
644
	call	dword [fs_CdServices + eax*4]
633
	call	free_cd_channel
645
	call	free_cd_channel
634
	and	[cd_status], 0
646
	and	[cd_status], 0
635
	mov	[image_of_eax], eax
647
	mov	[image_of_eax], eax
636
	mov	[image_of_ebx], ebx
648
	mov	[image_of_ebx], ebx
637
	ret
649
	ret
638
.not_impl:
650
.not_impl:
639
	call	free_cd_channel
651
	call	free_cd_channel
640
	and	[cd_status], 0
652
	and	[cd_status], 0
641
	mov	dword [image_of_eax], 2       ; not implemented
653
	mov	dword [image_of_eax], 2       ; not implemented
642
	ret
654
	ret
643
 
655
 
644
fs_CdServices:
656
fs_CdServices:
645
	dd	fs_CdRead
657
	dd	fs_CdRead
646
	dd	fs_CdReadFolder
658
	dd	fs_CdReadFolder
647
	dd	fs_NotImplemented
659
	dd	fs_NotImplemented
648
	dd	fs_NotImplemented
660
	dd	fs_NotImplemented
649
	dd	fs_NotImplemented
661
	dd	fs_NotImplemented
650
	dd	fs_CdGetFileInfo
662
	dd	fs_CdGetFileInfo
651
	dd	fs_NotImplemented
663
	dd	fs_NotImplemented
652
	dd	0
664
	dd	0
653
	dd	fs_NotImplemented
665
	dd	fs_NotImplemented
654
	dd	fs_NotImplemented
666
	dd	fs_NotImplemented
655
fs_NumCdServices = ($ - fs_CdServices)/4
667
fs_NumCdServices = ($ - fs_CdServices)/4
656
 
668
 
657
;*******************************************************
669
;*******************************************************
658
 
670
 
659
fs_HasRamdisk:
671
fs_HasRamdisk:
660
	mov	al, 1	; we always have ramdisk
672
	mov	al, 1	; we always have ramdisk
661
	ret
673
	ret
662
 
674
 
663
fs_HasFloppy:
675
fs_HasFloppy:
664
	cmp	byte [DRIVE_DATA], 0
676
	cmp	byte [DRIVE_DATA], 0
665
	setnz	al
677
	setnz	al
666
	ret
678
	ret
667
 
679
 
668
fs_HasHd0:
680
fs_HasHd0:
669
	mov	al, [DRIVE_DATA+1]
681
	mov	al, [DRIVE_DATA+1]
670
	and	al, 11000000b
682
	and	al, 11000000b
671
	cmp	al, 01000000b
683
	cmp	al, 01000000b
672
	setz	al
684
	setz	al
673
	ret
685
	ret
674
fs_HasHd1:
686
fs_HasHd1:
675
	mov	al, [DRIVE_DATA+1]
687
	mov	al, [DRIVE_DATA+1]
676
	and	al, 00110000b
688
	and	al, 00110000b
677
	cmp	al, 00010000b
689
	cmp	al, 00010000b
678
	setz	al
690
	setz	al
679
	ret
691
	ret
680
fs_HasHd2:
692
fs_HasHd2:
681
	mov	al, [DRIVE_DATA+1]
693
	mov	al, [DRIVE_DATA+1]
682
	and	al, 00001100b
694
	and	al, 00001100b
683
	cmp	al, 00000100b
695
	cmp	al, 00000100b
684
	setz	al
696
	setz	al
685
	ret
697
	ret
686
fs_HasHd3:
698
fs_HasHd3:
687
	mov	al, [DRIVE_DATA+1]
699
	mov	al, [DRIVE_DATA+1]
688
	and	al, 00000011b
700
	and	al, 00000011b
689
	cmp	al, 00000001b
701
	cmp	al, 00000001b
690
	setz	al
702
	setz	al
691
	ret
703
	ret
692
 
704
 
693
;*******************************************************
705
;*******************************************************
694
fs_HasCd0:
706
fs_HasCd0:
695
	mov	al, [DRIVE_DATA+1]
707
	mov	al, [DRIVE_DATA+1]
696
	and	al, 11000000b
708
	and	al, 11000000b
697
	cmp	al, 10000000b
709
	cmp	al, 10000000b
698
	setz	al
710
	setz	al
699
	ret
711
	ret
700
fs_HasCd1:
712
fs_HasCd1:
701
	mov	al, [DRIVE_DATA+1]
713
	mov	al, [DRIVE_DATA+1]
702
	and	al, 00110000b
714
	and	al, 00110000b
703
	cmp	al, 00100000b
715
	cmp	al, 00100000b
704
	setz	al
716
	setz	al
705
	ret
717
	ret
706
fs_HasCd2:
718
fs_HasCd2:
707
	mov	al, [DRIVE_DATA+1]
719
	mov	al, [DRIVE_DATA+1]
708
	and	al, 00001100b
720
	and	al, 00001100b
709
	cmp	al, 00001000b
721
	cmp	al, 00001000b
710
	setz	al
722
	setz	al
711
	ret
723
	ret
712
fs_HasCd3:
724
fs_HasCd3:
713
	mov	al, [DRIVE_DATA+1]
725
	mov	al, [DRIVE_DATA+1]
714
	and	al, 00000011b
726
	and	al, 00000011b
715
	cmp	al, 00000010b
727
	cmp	al, 00000010b
716
	setz	al
728
	setz	al
717
	ret
729
	ret
718
;*******************************************************
730
;*******************************************************
719
 
731
 
720
; fs_NextXXX functions:
732
; fs_NextXXX functions:
721
; in: eax = partition number, from which start to scan
733
; in: eax = partition number, from which start to scan
722
; out: CF=1 => no more partitions
734
; out: CF=1 => no more partitions
723
;      CF=0 => eax=next partition number
735
;      CF=0 => eax=next partition number
724
 
736
 
725
fs_NextRamdisk:
737
fs_NextRamdisk:
726
; we always have /rd/1
738
; we always have /rd/1
727
	test	eax, eax
739
	test	eax, eax
728
	stc
740
	stc
729
	jnz	@f
741
	jnz	@f
730
	mov	al, 1
742
	mov	al, 1
731
	clc
743
	clc
732
@@:
744
@@:
733
	ret
745
	ret
734
 
746
 
735
fs_NextFloppy:
747
fs_NextFloppy:
736
; we have /fd/1 iff (([DRIVE_DATA] and 0xF0) != 0) and /fd/2 iff (([DRIVE_DATA] and 0x0F) != 0)
748
; we have /fd/1 iff (([DRIVE_DATA] and 0xF0) != 0) and /fd/2 iff (([DRIVE_DATA] and 0x0F) != 0)
737
	test	byte [DRIVE_DATA], 0xF0
749
	test	byte [DRIVE_DATA], 0xF0
738
	jz	.no1
750
	jz	.no1
739
	test	eax, eax
751
	test	eax, eax
740
	jnz	.no1
752
	jnz	.no1
741
	inc	eax
753
	inc	eax
742
	ret	; CF cleared
754
	ret	; CF cleared
743
.no1:
755
.no1:
744
	test	byte [DRIVE_DATA], 0x0F
756
	test	byte [DRIVE_DATA], 0x0F
745
	jz	.no2
757
	jz	.no2
746
	cmp	al, 2
758
	cmp	al, 2
747
	jae	.no2
759
	jae	.no2
748
	mov	al, 2
760
	mov	al, 2
749
	clc
761
	clc
750
	ret
762
	ret
751
.no2:
763
.no2:
752
	stc
764
	stc
753
	ret
765
	ret
754
 
766
 
755
; on hdx, we have partitions from 1 to [0x40002+x]
767
; on hdx, we have partitions from 1 to [0x40002+x]
756
fs_NextHd0:
768
fs_NextHd0:
757
	push	0
769
	push	0
758
	jmp	fs_NextHd
770
	jmp	fs_NextHd
759
fs_NextHd1:
771
fs_NextHd1:
760
	push	1
772
	push	1
761
	jmp	fs_NextHd
773
	jmp	fs_NextHd
762
fs_NextHd2:
774
fs_NextHd2:
763
	push	2
775
	push	2
764
	jmp	fs_NextHd
776
	jmp	fs_NextHd
765
fs_NextHd3:
777
fs_NextHd3:
766
	push	3
778
	push	3
767
fs_NextHd:
779
fs_NextHd:
768
	pop	ecx
780
	pop	ecx
769
	movzx	ecx, byte [DRIVE_DATA+2+ecx]
781
	movzx	ecx, byte [DRIVE_DATA+2+ecx]
770
	cmp	eax, ecx
782
	cmp	eax, ecx
771
	jae	fs_NextFloppy.no2
783
	jae	fs_NextFloppy.no2
772
	inc	eax
784
	inc	eax
773
	clc
785
	clc
774
	ret
786
	ret
775
 
787
 
776
;*******************************************************
788
;*******************************************************
777
fs_NextCd:
789
fs_NextCd:
778
; we always have /cdX/1
790
; we always have /cdX/1
779
	test	eax, eax
791
	test	eax, eax
780
	stc
792
	stc
781
	jnz	@f
793
	jnz	@f
782
	mov	al, 1
794
	mov	al, 1
783
	clc
795
	clc
784
@@:
796
@@:
785
	ret
797
	ret
786
;*******************************************************
798
;*******************************************************
787
 
799
 
788
; Additional FS handlers.
800
; Additional FS handlers.
789
; This handler gets the control each time when fn 70 is called
801
; This handler gets the control each time when fn 70 is called
790
; with unknown item of root subdirectory.
802
; with unknown item of root subdirectory.
791
; in: esi -> name
803
; in: esi -> name
792
;     ebp = 0 or rest of name relative to esi
804
;     ebp = 0 or rest of name relative to esi
793
; out: if the handler processes path, he must not return in file_system_lfn,
805
; out: if the handler processes path, he must not return in file_system_lfn,
794
;      but instead pop return address and return directly to the caller
806
;      but instead pop return address and return directly to the caller
795
;      otherwise simply return
807
;      otherwise simply return
796
 
808
 
797
; here we test for /bd/... - BIOS disks
809
; here we test for /bd/... - BIOS disks
798
biosdisk_handler:
810
biosdisk_handler:
799
        cmp     [NumBiosDisks], 0
811
        cmp     [NumBiosDisks], 0
800
        jz      .ret
812
        jz      .ret
801
        mov     al, [esi]
813
        mov     al, [esi]
802
        or      al, 20h
814
        or      al, 20h
803
        cmp     al, 'b'
815
        cmp     al, 'b'
804
        jnz     .ret
816
        jnz     .ret
805
        mov     al, [esi+1]
817
        mov     al, [esi+1]
806
        or      al, 20h
818
        or      al, 20h
807
        cmp     al, 'd'
819
        cmp     al, 'd'
808
        jnz     .ret
820
        jnz     .ret
809
        push    esi
821
        push    esi
810
        inc     esi
822
        inc     esi
811
        inc     esi
823
        inc     esi
812
        cmp     byte [esi], '0'
824
        cmp     byte [esi], '0'
813
        jb      .ret2
825
        jb      .ret2
814
        cmp     byte [esi], '9'
826
        cmp     byte [esi], '9'
815
        ja      .ret2
827
        ja      .ret2
816
        xor     edx, edx
828
        xor     edx, edx
817
@@:
829
@@:
818
        lodsb
830
        lodsb
819
        test    al, al
831
        test    al, al
820
        jz      .ok
832
        jz      .ok
821
        cmp     al, '/'
833
        cmp     al, '/'
822
        jz      .ok
834
        jz      .ok
823
        sub     al, '0'
835
        sub     al, '0'
824
        cmp     al, 9
836
        cmp     al, 9
825
        ja      .ret2
837
        ja      .ret2
826
        lea     edx, [edx*5]
838
        lea     edx, [edx*5]
827
        lea     edx, [edx*2+eax]
839
        lea     edx, [edx*2+eax]
828
        jmp     @b
840
        jmp     @b
829
.ret2:
841
.ret2:
830
        pop     esi
842
        pop     esi
831
.ret:
843
.ret:
832
        ret
844
        ret
833
.ok:
845
.ok:
834
        cmp     al, '/'
846
        cmp     al, '/'
835
        jz      @f
847
        jz      @f
836
        dec     esi
848
        dec     esi
837
@@:
849
@@:
838
        add     dl, 80h
850
        add     dl, 80h
839
        xor     ecx, ecx
851
        xor     ecx, ecx
840
@@:
852
@@:
841
        cmp     dl, [BiosDisksData+ecx*4]
853
        cmp     dl, [BiosDisksData+ecx*4]
842
        jz      .ok2
854
        jz      .ok2
843
        inc     ecx
855
        inc     ecx
844
        cmp     ecx, [NumBiosDisks]
856
        cmp     ecx, [NumBiosDisks]
845
        jb      @b
857
        jb      @b
846
        jmp     .ret2
858
        jmp     .ret2
847
.ok2:
859
.ok2:
848
        add     esp, 8
860
        add     esp, 8
849
        test    al, al
861
        test    al, al
850
        jnz     @f
862
        jnz     @f
851
        mov     esi, fs_BdNext
863
        mov     esi, fs_BdNext
852
        jmp     file_system_lfn.maindir_noesi
864
        jmp     file_system_lfn.maindir_noesi
853
@@:
865
@@:
854
        push    ecx
866
        push    ecx
855
        push    fs_OnBd
867
        push    fs_OnBd
856
        mov     edi, esp
868
        mov     edi, esp
857
        jmp     file_system_lfn.found2
869
        jmp     file_system_lfn.found2
858
 
870
 
859
fs_BdNext:
871
fs_BdNext:
860
        cmp     eax, [BiosDiskPartitions+ecx*4]
872
        cmp     eax, [BiosDiskPartitions+ecx*4]
861
	inc	eax
873
	inc	eax
862
	cmc
874
	cmc
863
	ret
875
	ret
864
 
876
 
865
fs_OnBd:
877
fs_OnBd:
866
        pop     edx edx
878
        pop     edx edx
867
; edx = disk number, ecx = partition number
879
; edx = disk number, ecx = partition number
868
; esi+ebp = name
880
; esi+ebp = name
869
	call	reserve_hd1
881
	call	reserve_hd1
870
	add     edx, 0x80
882
	add     edx, 0x80
871
	mov     [hdpos], edx
883
	mov     [hdpos], edx
872
	cmp     ecx, [BiosDiskPartitions+(edx-0x80)*4]
884
	cmp     ecx, [BiosDiskPartitions+(edx-0x80)*4]
873
	jmp     fs_OnHdAndBd
885
	jmp     fs_OnHdAndBd
874
 
886
 
875
; This handler is called when virtual root is enumerated
887
; This handler is called when virtual root is enumerated
876
; and must return all items which can be handled by this.
888
; and must return all items which can be handled by this.
877
; It is called several times, first time with eax=0
889
; It is called several times, first time with eax=0
878
; in: eax = 0 for first call, previously returned value for subsequent calls
890
; in: eax = 0 for first call, previously returned value for subsequent calls
879
; out: eax = 0 => no more items
891
; out: eax = 0 => no more items
880
;      eax != 0 => buffer pointed to by edi contains name of item
892
;      eax != 0 => buffer pointed to by edi contains name of item
881
 
893
 
882
; here we enumerate existing BIOS disks /bd
894
; here we enumerate existing BIOS disks /bd
883
biosdisk_enum_root:
895
biosdisk_enum_root:
884
        cmp     eax, [NumBiosDisks]
896
        cmp     eax, [NumBiosDisks]
885
        jae     .end
897
        jae     .end
886
        push    eax
898
        push    eax
887
        movzx   eax, byte [BiosDisksData+eax*4]
899
        movzx   eax, byte [BiosDisksData+eax*4]
888
        sub     al, 80h
900
        sub     al, 80h
889
        push    eax
901
        push    eax
890
        mov     al, 'b'
902
        mov     al, 'b'
891
        stosb
903
        stosb
892
        mov     al, 'd'
904
        mov     al, 'd'
893
        stosb
905
        stosb
894
        pop     eax
906
        pop     eax
895
        cmp     al, 10
907
        cmp     al, 10
896
        jae     .big
908
        jae     .big
897
        add     al, '0'
909
        add     al, '0'
898
        stosb
910
        stosb
899
        mov     byte [edi], 0
911
        mov     byte [edi], 0
900
        pop     eax
912
        pop     eax
901
        inc     eax
913
        inc     eax
902
        ret
914
        ret
903
.end:
915
.end:
904
        xor     eax, eax
916
        xor     eax, eax
905
        ret
917
        ret
906
.big:
918
.big:
907
        push    ecx
919
        push    ecx
908
        push    -'0'
920
        push    -'0'
909
        mov     ecx, 10
921
        mov     ecx, 10
910
@@:
922
@@:
911
        xor     edx, edx
923
        xor     edx, edx
912
        div     ecx
924
        div     ecx
913
        push    edx
925
        push    edx
914
        test    eax, eax
926
        test    eax, eax
915
        jnz     @b
927
        jnz     @b
916
        xchg    eax, edx
928
        xchg    eax, edx
917
@@:
929
@@:
918
        pop     eax
930
        pop     eax
919
        add     al, '0'
931
        add     al, '0'
920
        stosb
932
        stosb
921
        jnz     @b
933
        jnz     @b
922
        pop     ecx
934
        pop     ecx
923
        pop     eax
935
        pop     eax
924
        inc     eax
936
        inc     eax
925
        ret
937
        ret
926
 
938
 
927
process_replace_file_name:
939
process_replace_file_name:
928
	mov	ebp, [full_file_name_table]
940
	mov	ebp, [full_file_name_table]
929
	mov	edi, [full_file_name_table.size]
941
	mov	edi, [full_file_name_table.size]
930
	dec	edi
942
	dec	edi
931
	shl	edi, 7
943
	shl	edi, 7
932
	add	edi, ebp
944
	add	edi, ebp
933
.loop:
945
.loop:
934
	cmp	edi, ebp
946
	cmp	edi, ebp
935
	jb	.notfound
947
	jb	.notfound
936
	push	esi edi
948
	push	esi edi
937
@@:
949
@@:
938
	cmp	byte [edi], 0
950
	cmp	byte [edi], 0
939
	jz	.dest_done
951
	jz	.dest_done
940
	lodsb
952
	lodsb
941
	test	al, al
953
	test	al, al
942
	jz	.cont
954
	jz	.cont
943
	or	al, 20h
955
	or	al, 20h
944
	scasb
956
	scasb
945
	jz	@b
957
	jz	@b
946
	jmp	.cont
958
	jmp	.cont
947
.dest_done:
959
.dest_done:
948
	cmp	byte [esi], 0
960
	cmp	byte [esi], 0
949
	jz	.found
961
	jz	.found
950
	cmp	byte [esi], '/'
962
	cmp	byte [esi], '/'
951
	jnz	.cont
963
	jnz	.cont
952
	inc	esi
964
	inc	esi
953
	jmp	.found
965
	jmp	.found
954
.cont:
966
.cont:
955
	pop	edi esi
967
	pop	edi esi
956
	sub	edi, 128
968
	sub	edi, 128
957
	jmp	.loop
969
	jmp	.loop
958
.found:
970
.found:
959
	pop	edi eax
971
	pop	edi eax
960
	mov	ebp, esi
972
	mov	ebp, esi
961
	cmp	byte [esi], 0
973
	cmp	byte [esi], 0
962
	lea	esi, [edi+64]
974
	lea	esi, [edi+64]
963
	jnz	.ret
975
	jnz	.ret
964
.notfound:
976
.notfound:
965
	xor	ebp, ebp
977
	xor	ebp, ebp
966
.ret:
978
.ret:
967
	ret
979
	ret
968
 
980
 
969
sys_current_directory:
981
sys_current_directory:
970
	mov	esi, [current_slot]
982
	mov	esi, [current_slot]
971
	mov	esi, [esi+APPDATA.cur_dir]
983
	mov	esi, [esi+APPDATA.cur_dir]
972
	mov	edx, esi
984
	mov	edx, esi
973
	dec	eax
985
	dec	eax
974
	jz	.set
986
	jz	.set
975
	dec	eax
987
	dec	eax
976
	jz	.get
988
	jz	.get
977
	ret
989
	ret
978
.get:
990
.get:
979
; sysfunction 30.2: [for app] eax=30,ebx=2,ecx->buffer,edx=len
991
; sysfunction 30.2: [for app] eax=30,ebx=2,ecx->buffer,edx=len
980
; for our code: ebx->buffer,ecx=len
992
; for our code: ebx->buffer,ecx=len
981
@@:
993
@@:
982
	lodsb
994
	lodsb
983
	test	al, al
995
	test	al, al
984
	jnz	@b
996
	jnz	@b
985
	sub	esi, edx
997
	sub	esi, edx
986
	inc	esi
998
	inc	esi
987
	mov	[esp+36], esi
999
	mov	[esp+36], esi
988
	cmp	ecx, esi
1000
	cmp	ecx, esi
989
	jbe	@f
1001
	jbe	@f
990
	mov	ecx, esi
1002
	mov	ecx, esi
991
@@:
1003
@@:
992
	cmp	ecx, 1
1004
	cmp	ecx, 1
993
	jbe	.ret
1005
	jbe	.ret
994
	mov	esi, edx
1006
	mov	esi, edx
995
	mov	edi, ebx
1007
	mov	edi, ebx
996
	mov	al, '/'
1008
	mov	al, '/'
997
	stosb
1009
	stosb
998
	dec	ecx
1010
	dec	ecx
999
	dec	ecx
1011
	dec	ecx
1000
	rep	movsb
1012
	rep	movsb
1001
	mov	byte [edi], 0
1013
	mov	byte [edi], 0
1002
.ret:
1014
.ret:
1003
	ret
1015
	ret
1004
.set:
1016
.set:
1005
; sysfunction 30.1: [for app] eax=30,ebx=1,ecx->string
1017
; sysfunction 30.1: [for app] eax=30,ebx=1,ecx->string
1006
; for our code: ebx->string to set
1018
; for our code: ebx->string to set
1007
@@:
1019
@@:
1008
	inc	esi
1020
	inc	esi
1009
	cmp	byte [esi-1], 0
1021
	cmp	byte [esi-1], 0
1010
	jnz	@b
1022
	jnz	@b
1011
	dec	esi
1023
	dec	esi
1012
	cmp	byte [ebx], '/'
1024
	cmp	byte [ebx], '/'
1013
	jz	.set_absolute
1025
	jz	.set_absolute
1014
; string gives relative path
1026
; string gives relative path
1015
.relative:
1027
.relative:
1016
	cmp	byte [ebx], 0
1028
	cmp	byte [ebx], 0
1017
	jz	.set_ok
1029
	jz	.set_ok
1018
	cmp	word [ebx], '.'
1030
	cmp	word [ebx], '.'
1019
	jz	.set_ok
1031
	jz	.set_ok
1020
	cmp	word [ebx], './'
1032
	cmp	word [ebx], './'
1021
	jnz	@f
1033
	jnz	@f
1022
	add	ebx, 2
1034
	add	ebx, 2
1023
	jmp	.relative
1035
	jmp	.relative
1024
@@:
1036
@@:
1025
	cmp	word [ebx], '..'
1037
	cmp	word [ebx], '..'
1026
	jnz	.doset_relative
1038
	jnz	.doset_relative
1027
	cmp	byte [ebx+2], 0
1039
	cmp	byte [ebx+2], 0
1028
	jz	@f
1040
	jz	@f
1029
	cmp	byte [ebx+2], '/'
1041
	cmp	byte [ebx+2], '/'
1030
	jnz	.doset_relative
1042
	jnz	.doset_relative
1031
@@:
1043
@@:
1032
	dec	esi
1044
	dec	esi
1033
	cmp	byte [esi], '/'
1045
	cmp	byte [esi], '/'
1034
	jnz	@b
1046
	jnz	@b
1035
	mov	byte [esi], 0
1047
	mov	byte [esi], 0
1036
	add	ebx, 3
1048
	add	ebx, 3
1037
	jmp	.relative
1049
	jmp	.relative
1038
.doset_relative:
1050
.doset_relative:
1039
	add	edx, 0x1000
1051
	add	edx, 0x1000
1040
	mov	byte [esi], '/'
1052
	mov	byte [esi], '/'
1041
	inc	esi
1053
	inc	esi
1042
	cmp	esi, edx
1054
	cmp	esi, edx
1043
	jae	.overflow_esi
1055
	jae	.overflow_esi
1044
@@:
1056
@@:
1045
	mov	al, [ebx]
1057
	mov	al, [ebx]
1046
	inc	ebx
1058
	inc	ebx
1047
	mov	[esi], al
1059
	mov	[esi], al
1048
	inc	esi
1060
	inc	esi
1049
	test	al, al
1061
	test	al, al
1050
	jz	.set_ok
1062
	jz	.set_ok
1051
	cmp	esi, edx
1063
	cmp	esi, edx
1052
	jb	@b
1064
	jb	@b
1053
.overflow_esi:
1065
.overflow_esi:
1054
	mov	byte [esi-1], 0 	; force null-terminated string
1066
	mov	byte [esi-1], 0 	; force null-terminated string
1055
.set_ok:
1067
.set_ok:
1056
	ret
1068
	ret
1057
.set_absolute:
1069
.set_absolute:
1058
	lea	esi, [ebx+1]
1070
	lea	esi, [ebx+1]
1059
	call	process_replace_file_name
1071
	call	process_replace_file_name
1060
	mov	edi, edx
1072
	mov	edi, edx
1061
	add	edx, 0x1000
1073
	add	edx, 0x1000
1062
.set_copy:
1074
.set_copy:
1063
	lodsb
1075
	lodsb
1064
	stosb
1076
	stosb
1065
	test	al, al
1077
	test	al, al
1066
	jz	.set_part2
1078
	jz	.set_part2
1067
.set_copy_cont:
1079
.set_copy_cont:
1068
	cmp	edi, edx
1080
	cmp	edi, edx
1069
	jb	.set_copy
1081
	jb	.set_copy
1070
.overflow_edi:
1082
.overflow_edi:
1071
	mov	byte [edi-1], 0
1083
	mov	byte [edi-1], 0
1072
	ret
1084
	ret
1073
.set_part2:
1085
.set_part2:
1074
	mov	esi, ebp
1086
	mov	esi, ebp
1075
	xor	ebp, ebp
1087
	xor	ebp, ebp
1076
	test	esi, esi
1088
	test	esi, esi
1077
	jz	.set_ok
1089
	jz	.set_ok
1078
	mov	byte [edi-1], '/'
1090
	mov	byte [edi-1], '/'
1079
	jmp	.set_copy_cont
1091
	jmp	.set_copy_cont