Subversion Repositories Kolibri OS

Rev

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

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