Subversion Repositories Kolibri OS

Rev

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

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