Subversion Repositories Kolibri OS

Rev

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

Rev 2010 Rev 2106
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
7
 
8
$Revision: 2010 $
8
$Revision: 2106 $
9
 
9
 
10
 
10
 
11
uglobal
11
uglobal
12
cd_current_pointer_of_input    dd  0
12
cd_current_pointer_of_input    dd  0
13
cd_current_pointer_of_input_2  dd  0
13
cd_current_pointer_of_input_2  dd  0
14
cd_mem_location 	       dd  0
14
cd_mem_location 	       dd  0
15
cd_counter_block	       dd  0
15
cd_counter_block	       dd  0
16
IDE_Channel_1		       db  0
16
IDE_Channel_1		       db  0
17
IDE_Channel_2		       db  0
17
IDE_Channel_2		       db  0
18
endg
18
endg
19
 
19
 
20
reserve_cd:
20
reserve_cd:
21
 
21
 
22
    cli
22
    cli
23
    cmp   [cd_status],0
23
    cmp   [cd_status],0
24
    je	  reserve_ok2
24
    je	  reserve_ok2
25
 
25
 
26
    sti
26
    sti
27
    call  change_task
27
    call  change_task
28
    jmp   reserve_cd
28
    jmp   reserve_cd
29
 
29
 
30
  reserve_ok2:
30
  reserve_ok2:
31
 
31
 
32
    push  eax
32
    push  eax
33
    mov   eax,[CURRENT_TASK]
33
    mov   eax,[CURRENT_TASK]
34
    shl   eax,5
34
    shl   eax,5
35
    mov   eax,[eax+CURRENT_TASK+TASKDATA.pid]
35
    mov   eax,[eax+CURRENT_TASK+TASKDATA.pid]
36
    mov   [cd_status],eax
36
    mov   [cd_status],eax
37
    pop   eax
37
    pop   eax
38
    sti
38
    sti
39
    ret
39
    ret
40
 
40
 
41
reserve_cd_channel:
41
reserve_cd_channel:
42
    cmp   [ChannelNumber],1
42
    cmp   [ChannelNumber],1
43
    jne   .IDE_Channel_2
43
    jne   .IDE_Channel_2
44
.IDE_Channel_1:
44
.IDE_Channel_1:
45
    cli
45
    cli
46
    cmp   [IDE_Channel_1],0
46
    cmp   [IDE_Channel_1],0
47
    je	  .reserve_ok_1
47
    je	  .reserve_ok_1
48
    sti
48
    sti
49
    call  change_task
49
    call  change_task
50
    jmp   .IDE_Channel_1
50
    jmp   .IDE_Channel_1
51
.IDE_Channel_2:
51
.IDE_Channel_2:
52
    cli
52
    cli
53
    cmp   [IDE_Channel_2],0
53
    cmp   [IDE_Channel_2],0
54
    je	  .reserve_ok_2
54
    je	  .reserve_ok_2
55
    sti
55
    sti
56
    call  change_task
56
    call  change_task
57
    jmp   .IDE_Channel_1
57
    jmp   .IDE_Channel_2
58
.reserve_ok_1:
58
.reserve_ok_1:
59
    mov [IDE_Channel_1],1
59
    mov [IDE_Channel_1],1
-
 
60
    sti
60
    ret
61
    ret
61
.reserve_ok_2:
62
.reserve_ok_2:
62
    mov [IDE_Channel_2],1
63
    mov [IDE_Channel_2],1
-
 
64
    sti
63
    ret
65
    ret
64
 
66
 
65
free_cd_channel:
67
free_cd_channel:
66
    cmp   [ChannelNumber],1
68
    cmp   [ChannelNumber],1
67
    jne   .IDE_Channel_2
69
    jne   .IDE_Channel_2
68
.IDE_Channel_1:
70
.IDE_Channel_1:
69
    mov [IDE_Channel_1],0
71
    mov [IDE_Channel_1],0
70
    sti
72
    sti
71
    ret
73
    ret
72
.IDE_Channel_2:
74
.IDE_Channel_2:
73
    mov [IDE_Channel_2],0
75
    mov [IDE_Channel_2],0
74
    sti
76
    sti
75
    ret
77
    ret
76
 
78
 
77
uglobal
79
uglobal
78
cd_status dd 0
80
cd_status dd 0
79
endg
81
endg
80
 
82
 
81
;----------------------------------------------------------------
83
;----------------------------------------------------------------
82
;
84
;
83
;  fs_CdRead - LFN variant for reading CD disk
85
;  fs_CdRead - LFN variant for reading CD disk
84
;
86
;
85
;  esi  points to filename /dir1/dir2/.../dirn/file,0
87
;  esi  points to filename /dir1/dir2/.../dirn/file,0
86
;  ebx  pointer to 64-bit number = first wanted byte, 0+
88
;  ebx  pointer to 64-bit number = first wanted byte, 0+
87
;       may be ebx=0 - start from first byte
89
;       may be ebx=0 - start from first byte
88
;  ecx  number of bytes to read, 0+
90
;  ecx  number of bytes to read, 0+
89
;  edx  mem location to return data
91
;  edx  mem location to return data
90
;
92
;
91
;  ret ebx = bytes read or 0xffffffff file not found
93
;  ret ebx = bytes read or 0xffffffff file not found
92
;      eax = 0 ok read or other = errormsg
94
;      eax = 0 ok read or other = errormsg
93
;
95
;
94
;--------------------------------------------------------------
96
;--------------------------------------------------------------
95
fs_CdRead:
97
fs_CdRead:
96
    push    edi
98
    push    edi
97
    cmp    byte [esi], 0
99
    cmp    byte [esi], 0
98
    jnz    @f
100
    jnz    @f
99
.noaccess:
101
.noaccess:
100
    pop    edi
102
    pop    edi
101
.noaccess_2:
103
.noaccess_2:
102
    or	  ebx, -1
104
    or	  ebx, -1
103
    mov    eax, ERROR_ACCESS_DENIED
105
    mov    eax, ERROR_ACCESS_DENIED
104
    ret
106
    ret
105
 
107
 
106
.noaccess_3:
108
.noaccess_3:
107
    pop     eax edx ecx edi
109
    pop     eax edx ecx edi
108
    jmp  .noaccess_2
110
    jmp  .noaccess_2
109
 
111
 
110
@@:
112
@@:
111
    call    cd_find_lfn
113
    call    cd_find_lfn
112
    jnc    .found
114
    jnc    .found
113
    pop    edi
115
    pop    edi
114
    cmp   [DevErrorCode],0
116
    cmp   [DevErrorCode],0
115
    jne   .noaccess_2
117
    jne   .noaccess_2
116
    or	  ebx, -1
118
    or	  ebx, -1
117
    mov    eax, ERROR_FILE_NOT_FOUND
119
    mov    eax, ERROR_FILE_NOT_FOUND
118
    ret
120
    ret
119
 
121
 
120
.found:
122
.found:
121
    mov    edi,[cd_current_pointer_of_input]
123
    mov    edi,[cd_current_pointer_of_input]
122
    test   byte [edi+25],10b	; do not allow read directories
124
    test   byte [edi+25],10b	; do not allow read directories
123
    jnz    .noaccess
125
    jnz    .noaccess
124
    test    ebx, ebx
126
    test    ebx, ebx
125
    jz	  .l1
127
    jz	  .l1
126
    cmp    dword [ebx+4], 0
128
    cmp    dword [ebx+4], 0
127
    jz	  @f
129
    jz	  @f
128
	xor	ebx, ebx
130
	xor	ebx, ebx
129
.reteof:
131
.reteof:
130
    mov    eax, 6 ; end of file
132
    mov    eax, 6 ; end of file
131
    pop    edi
133
    pop    edi
132
    ret
134
    ret
133
@@:
135
@@:
134
    mov    ebx, [ebx]
136
    mov    ebx, [ebx]
135
.l1:
137
.l1:
136
	push	ecx edx
138
	push	ecx edx
137
	push	0
139
	push	0
138
	mov	eax, [edi+10] ; ðåàëüíûé ðàçìåð ôàéëîâîé ñåêöèè
140
	mov	eax, [edi+10] ; ðåàëüíûé ðàçìåð ôàéëîâîé ñåêöèè
139
	sub	eax, ebx
141
	sub	eax, ebx
140
	jb	.eof
142
	jb	.eof
141
	cmp	eax, ecx
143
	cmp	eax, ecx
142
	jae	@f
144
	jae	@f
143
	mov	ecx, eax
145
	mov	ecx, eax
144
	mov	byte [esp], 6
146
	mov	byte [esp], 6
145
@@:
147
@@:
146
     mov    eax,[edi+2]
148
     mov    eax,[edi+2]
147
     mov    [CDSectorAddress],eax
149
     mov    [CDSectorAddress],eax
148
; now eax=cluster, ebx=position, ecx=count, edx=buffer for data
150
; now eax=cluster, ebx=position, ecx=count, edx=buffer for data
149
.new_sector:
151
.new_sector:
150
    test    ecx, ecx
152
    test    ecx, ecx
151
    jz	  .done
153
    jz	  .done
152
    sub    ebx, 2048
154
    sub    ebx, 2048
153
    jae    .next
155
    jae    .next
154
    add    ebx, 2048
156
    add    ebx, 2048
155
    jnz    .incomplete_sector
157
    jnz    .incomplete_sector
156
    cmp    ecx, 2048
158
    cmp    ecx, 2048
157
    jb	  .incomplete_sector
159
    jb	  .incomplete_sector
158
; we may read and memmove complete sector
160
; we may read and memmove complete sector
159
    mov  [CDDataBuf_pointer],edx
161
    mov  [CDDataBuf_pointer],edx
160
    call ReadCDWRetr	  ; ÷èòàåì ñåêòîð ôàéëà
162
    call ReadCDWRetr	  ; ÷èòàåì ñåêòîð ôàéëà
161
    cmp   [DevErrorCode],0
163
    cmp   [DevErrorCode],0
162
    jne   .noaccess_3
164
    jne   .noaccess_3
163
    add    edx, 2048
165
    add    edx, 2048
164
    sub    ecx, 2048
166
    sub    ecx, 2048
165
.next:
167
.next:
166
    inc  dword [CDSectorAddress]
168
    inc  dword [CDSectorAddress]
167
    jmp    .new_sector
169
    jmp    .new_sector
168
.incomplete_sector:
170
.incomplete_sector:
169
; we must read and memmove incomplete sector
171
; we must read and memmove incomplete sector
170
    mov  [CDDataBuf_pointer],CDDataBuf
172
    mov  [CDDataBuf_pointer],CDDataBuf
171
    call ReadCDWRetr	  ; ÷èòàåì ñåêòîð ôàéëà
173
    call ReadCDWRetr	  ; ÷èòàåì ñåêòîð ôàéëà
172
    cmp   [DevErrorCode],0
174
    cmp   [DevErrorCode],0
173
    jne   .noaccess_3
175
    jne   .noaccess_3
174
    push    ecx
176
    push    ecx
175
    add    ecx, ebx
177
    add    ecx, ebx
176
    cmp    ecx, 2048
178
    cmp    ecx, 2048
177
    jbe    @f
179
    jbe    @f
178
    mov    ecx, 2048
180
    mov    ecx, 2048
179
@@:
181
@@:
180
    sub    ecx, ebx
182
    sub    ecx, ebx
181
     push edi esi ecx
183
     push edi esi ecx
182
     mov edi,edx
184
     mov edi,edx
183
	lea	esi, [CDDataBuf + ebx]
185
	lea	esi, [CDDataBuf + ebx]
184
     cld
186
     cld
185
     rep movsb
187
     rep movsb
186
     pop ecx esi edi
188
     pop ecx esi edi
187
    add    edx, ecx
189
    add    edx, ecx
188
    sub    [esp], ecx
190
    sub    [esp], ecx
189
    pop    ecx
191
    pop    ecx
190
    xor    ebx, ebx
192
    xor    ebx, ebx
191
    jmp    .next
193
    jmp    .next
192
 
194
 
193
.done:
195
.done:
194
	mov	ebx, edx
196
	mov	ebx, edx
195
	pop	eax edx ecx edi
197
	pop	eax edx ecx edi
196
	sub	ebx, edx
198
	sub	ebx, edx
197
	ret
199
	ret
198
.eof:
200
.eof:
199
	mov	ebx, edx
201
	mov	ebx, edx
200
	pop	eax edx ecx
202
	pop	eax edx ecx
201
	sub	ebx, edx
203
	sub	ebx, edx
202
	jmp	.reteof
204
	jmp	.reteof
203
 
205
 
204
;----------------------------------------------------------------
206
;----------------------------------------------------------------
205
;
207
;
206
;  fs_CdReadFolder - LFN variant for reading CD disk folder
208
;  fs_CdReadFolder - LFN variant for reading CD disk folder
207
;
209
;
208
;  esi  points to filename  /dir1/dir2/.../dirn/file,0
210
;  esi  points to filename  /dir1/dir2/.../dirn/file,0
209
;  ebx  pointer to structure 32-bit number = first wanted block, 0+
211
;  ebx  pointer to structure 32-bit number = first wanted block, 0+
210
;                          & flags (bitfields)
212
;                          & flags (bitfields)
211
; flags: bit 0: 0=ANSI names, 1=UNICODE names
213
; flags: bit 0: 0=ANSI names, 1=UNICODE names
212
;  ecx  number of blocks to read, 0+
214
;  ecx  number of blocks to read, 0+
213
;  edx  mem location to return data
215
;  edx  mem location to return data
214
;
216
;
215
;  ret ebx = blocks read or 0xffffffff folder not found
217
;  ret ebx = blocks read or 0xffffffff folder not found
216
;      eax = 0 ok read or other = errormsg
218
;      eax = 0 ok read or other = errormsg
217
;
219
;
218
;--------------------------------------------------------------
220
;--------------------------------------------------------------
219
fs_CdReadFolder:
221
fs_CdReadFolder:
220
	push	edi
222
	push	edi
221
	call	cd_find_lfn
223
	call	cd_find_lfn
222
	jnc	.found
224
	jnc	.found
223
	pop	edi
225
	pop	edi
224
	cmp	[DevErrorCode], 0
226
	cmp	[DevErrorCode], 0
225
	jne	.noaccess_1
227
	jne	.noaccess_1
226
	or	ebx, -1
228
	or	ebx, -1
227
	mov	eax, ERROR_FILE_NOT_FOUND
229
	mov	eax, ERROR_FILE_NOT_FOUND
228
	ret
230
	ret
229
.found:
231
.found:
230
	mov	edi, [cd_current_pointer_of_input]
232
	mov	edi, [cd_current_pointer_of_input]
231
	test	byte [edi+25], 10b    ; do not allow read directories
233
	test	byte [edi+25], 10b    ; do not allow read directories
232
	jnz	.found_dir
234
	jnz	.found_dir
233
	pop	edi
235
	pop	edi
234
.noaccess_1:
236
.noaccess_1:
235
	or	ebx, -1
237
	or	ebx, -1
236
	mov	eax, ERROR_ACCESS_DENIED
238
	mov	eax, ERROR_ACCESS_DENIED
237
	ret
239
	ret
238
.found_dir:
240
.found_dir:
239
	mov	eax, [edi+2]	; eax=cluster
241
	mov	eax, [edi+2]	; eax=cluster
240
	mov	[CDSectorAddress], eax
242
	mov	[CDSectorAddress], eax
241
	mov	eax, [edi+10]	; ðàçìåð äèðåêòðîðèè
243
	mov	eax, [edi+10]	; ðàçìåð äèðåêòðîðèè
242
.doit:
244
.doit:
243
; init header
245
; init header
244
	push	eax ecx
246
	push	eax ecx
245
	mov	edi, edx
247
	mov	edi, edx
246
	mov	ecx, 32/4
248
	mov	ecx, 32/4
247
	xor	eax, eax
249
	xor	eax, eax
248
	rep	stosd
250
	rep	stosd
249
	pop	ecx eax
251
	pop	ecx eax
250
	mov	byte [edx], 1	; version
252
	mov	byte [edx], 1	; version
251
	mov	[cd_mem_location], edx
253
	mov	[cd_mem_location], edx
252
	add	[cd_mem_location], 32
254
	add	[cd_mem_location], 32
253
; íà÷èíàåì ïåðåáðîñêó ÁÄÂÊ â ÓÑÂÊ
255
; íà÷èíàåì ïåðåáðîñêó ÁÄÂÊ â ÓÑÂÊ
254
;.mainloop:
256
;.mainloop:
255
	mov	[cd_counter_block], dword 0
257
	mov	[cd_counter_block], dword 0
256
	dec	dword [CDSectorAddress]
258
	dec	dword [CDSectorAddress]
257
	push	ecx
259
	push	ecx
258
.read_to_buffer:
260
.read_to_buffer:
259
	inc	dword [CDSectorAddress]
261
	inc	dword [CDSectorAddress]
260
	mov	[CDDataBuf_pointer], CDDataBuf
262
	mov	[CDDataBuf_pointer], CDDataBuf
261
	call	ReadCDWRetr	    ; ÷èòàåì ñåêòîð äèðåêòîðèè
263
	call	ReadCDWRetr	    ; ÷èòàåì ñåêòîð äèðåêòîðèè
262
	cmp	[DevErrorCode], 0
264
	cmp	[DevErrorCode], 0
263
	jne	.noaccess_1
265
	jne	.noaccess_1
264
	call	.get_names_from_buffer
266
	call	.get_names_from_buffer
265
	sub	eax,2048
267
	sub	eax,2048
266
; äèðåêòîðèÿ çàêîí÷èëàñü?
268
; äèðåêòîðèÿ çàêîí÷èëàñü?
267
	ja	.read_to_buffer
269
	ja	.read_to_buffer
268
	mov	edi, [cd_counter_block]
270
	mov	edi, [cd_counter_block]
269
	mov	[edx+8], edi
271
	mov	[edx+8], edi
270
	mov	edi, [ebx]
272
	mov	edi, [ebx]
271
	sub	[edx+4], edi
273
	sub	[edx+4], edi
272
	xor	eax, eax
274
	xor	eax, eax
273
	dec	ecx
275
	dec	ecx
274
	js	@f
276
	js	@f
275
	mov	al, ERROR_END_OF_FILE
277
	mov	al, ERROR_END_OF_FILE
276
@@:
278
@@:
277
	pop	ecx edi
279
	pop	ecx edi
278
	mov	ebx, [edx+4]
280
	mov	ebx, [edx+4]
279
	ret
281
	ret
280
 
282
 
281
.get_names_from_buffer:
283
.get_names_from_buffer:
282
    mov     [cd_current_pointer_of_input_2],CDDataBuf
284
    mov     [cd_current_pointer_of_input_2],CDDataBuf
283
    push    eax esi edi edx
285
    push    eax esi edi edx
284
.get_names_from_buffer_1:
286
.get_names_from_buffer_1:
285
    call    cd_get_name
287
    call    cd_get_name
286
    jc	  .end_buffer
288
    jc	  .end_buffer
287
    inc    dword [cd_counter_block]
289
    inc    dword [cd_counter_block]
288
    mov    eax,[cd_counter_block]
290
    mov    eax,[cd_counter_block]
289
    cmp    [ebx],eax
291
    cmp    [ebx],eax
290
    jae     .get_names_from_buffer_1
292
    jae     .get_names_from_buffer_1
291
    test    ecx, ecx
293
    test    ecx, ecx
292
    jz	  .get_names_from_buffer_1
294
    jz	  .get_names_from_buffer_1
293
    mov   edi,[cd_counter_block]
295
    mov   edi,[cd_counter_block]
294
    mov   [edx+4],edi
296
    mov   [edx+4],edi
295
    dec     ecx
297
    dec     ecx
296
    mov   esi,ebp
298
    mov   esi,ebp
297
    mov   edi,[cd_mem_location]
299
    mov   edi,[cd_mem_location]
298
    add   edi,40
300
    add   edi,40
299
    test   dword [ebx+4], 1 ; 0=ANSI, 1=UNICODE
301
    test   dword [ebx+4], 1 ; 0=ANSI, 1=UNICODE
300
    jnz    .unicode
302
    jnz    .unicode
301
;    jmp  .unicode
303
;    jmp  .unicode
302
.ansi:
304
.ansi:
303
    cmp   [cd_counter_block],2
305
    cmp   [cd_counter_block],2
304
    jbe   .ansi_parent_directory
306
    jbe   .ansi_parent_directory
305
    cld
307
    cld
306
    lodsw
308
    lodsw
307
    xchg ah,al
309
    xchg ah,al
308
    call uni2ansi_char
310
    call uni2ansi_char
309
    cld
311
    cld
310
    stosb
312
    stosb
311
; ïðîâåðêà êîíöà ôàéëà
313
; ïðîâåðêà êîíöà ôàéëà
312
    mov   ax,[esi]
314
    mov   ax,[esi]
313
    cmp   ax,word 3B00h ; ñåïàðàòîð êîíöà ôàéëà ';'
315
    cmp   ax,word 3B00h ; ñåïàðàòîð êîíöà ôàéëà ';'
314
    je	 .cd_get_parameters_of_file_1
316
    je	 .cd_get_parameters_of_file_1
315
; ïðîâåðêà äëÿ ôàéëîâ íå çàêàí÷èâàþùèõñÿ ñåïàðàòîðîì
317
; ïðîâåðêà äëÿ ôàéëîâ íå çàêàí÷èâàþùèõñÿ ñåïàðàòîðîì
316
    movzx   eax,byte [ebp-33]
318
    movzx   eax,byte [ebp-33]
317
    add   eax,ebp
319
    add   eax,ebp
318
    sub   eax,34
320
    sub   eax,34
319
    cmp   esi,eax
321
    cmp   esi,eax
320
    je	 .cd_get_parameters_of_file_1
322
    je	 .cd_get_parameters_of_file_1
321
; ïðîâåðêà êîíöà ïàïêè
323
; ïðîâåðêà êîíöà ïàïêè
322
    movzx   eax,byte [ebp-1]
324
    movzx   eax,byte [ebp-1]
323
    add   eax,ebp
325
    add   eax,ebp
324
    cmp   esi,eax
326
    cmp   esi,eax
325
    jb	 .ansi
327
    jb	 .ansi
326
.cd_get_parameters_of_file_1:
328
.cd_get_parameters_of_file_1:
327
    mov   [edi],byte 0
329
    mov   [edi],byte 0
328
    call  cd_get_parameters_of_file
330
    call  cd_get_parameters_of_file
329
    add   [cd_mem_location],304
331
    add   [cd_mem_location],304
330
    jmp   .get_names_from_buffer_1
332
    jmp   .get_names_from_buffer_1
331
 
333
 
332
.ansi_parent_directory:
334
.ansi_parent_directory:
333
    cmp   [cd_counter_block],2
335
    cmp   [cd_counter_block],2
334
    je	  @f
336
    je	  @f
335
    mov   [edi],byte '.'
337
    mov   [edi],byte '.'
336
    inc   edi
338
    inc   edi
337
    jmp  .cd_get_parameters_of_file_1
339
    jmp  .cd_get_parameters_of_file_1
338
@@:
340
@@:
339
    mov   [edi],word '..'
341
    mov   [edi],word '..'
340
    add   edi,2
342
    add   edi,2
341
    jmp  .cd_get_parameters_of_file_1
343
    jmp  .cd_get_parameters_of_file_1
342
 
344
 
343
.unicode:
345
.unicode:
344
    cmp   [cd_counter_block],2
346
    cmp   [cd_counter_block],2
345
    jbe   .unicode_parent_directory
347
    jbe   .unicode_parent_directory
346
    cld
348
    cld
347
    movsw
349
    movsw
348
; ïðîâåðêà êîíöà ôàéëà
350
; ïðîâåðêà êîíöà ôàéëà
349
    mov   ax,[esi]
351
    mov   ax,[esi]
350
    cmp   ax,word 3B00h ; ñåïàðàòîð êîíöà ôàéëà ';'
352
    cmp   ax,word 3B00h ; ñåïàðàòîð êîíöà ôàéëà ';'
351
    je	 .cd_get_parameters_of_file_2
353
    je	 .cd_get_parameters_of_file_2
352
; ïðîâåðêà äëÿ ôàéëîâ íå çàêàí÷èâàþùèõñÿ ñåïàðàòîðîì
354
; ïðîâåðêà äëÿ ôàéëîâ íå çàêàí÷èâàþùèõñÿ ñåïàðàòîðîì
353
    movzx   eax,byte [ebp-33]
355
    movzx   eax,byte [ebp-33]
354
    add   eax,ebp
356
    add   eax,ebp
355
    sub   eax,34
357
    sub   eax,34
356
    cmp   esi,eax
358
    cmp   esi,eax
357
    je	 .cd_get_parameters_of_file_2
359
    je	 .cd_get_parameters_of_file_2
358
; ïðîâåðêà êîíöà ïàïêè
360
; ïðîâåðêà êîíöà ïàïêè
359
    movzx   eax,byte [ebp-1]
361
    movzx   eax,byte [ebp-1]
360
    add   eax,ebp
362
    add   eax,ebp
361
    cmp   esi,eax
363
    cmp   esi,eax
362
    jb	 .unicode
364
    jb	 .unicode
363
.cd_get_parameters_of_file_2:
365
.cd_get_parameters_of_file_2:
364
    mov   [edi],word 0
366
    mov   [edi],word 0
365
    call  cd_get_parameters_of_file
367
    call  cd_get_parameters_of_file
366
    add   [cd_mem_location],560
368
    add   [cd_mem_location],560
367
    jmp   .get_names_from_buffer_1
369
    jmp   .get_names_from_buffer_1
368
 
370
 
369
.unicode_parent_directory:
371
.unicode_parent_directory:
370
    cmp   [cd_counter_block],2
372
    cmp   [cd_counter_block],2
371
    je	  @f
373
    je	  @f
372
    mov   [edi],word 2E00h ; '.'
374
    mov   [edi],word 2E00h ; '.'
373
    add   edi,2
375
    add   edi,2
374
    jmp   .cd_get_parameters_of_file_2
376
    jmp   .cd_get_parameters_of_file_2
375
@@:
377
@@:
376
    mov   [edi],dword 2E002E00h ; '..'
378
    mov   [edi],dword 2E002E00h ; '..'
377
    add   edi,4
379
    add   edi,4
378
    jmp   .cd_get_parameters_of_file_2
380
    jmp   .cd_get_parameters_of_file_2
379
 
381
 
380
.end_buffer:
382
.end_buffer:
381
    pop   edx edi esi eax
383
    pop   edx edi esi eax
382
    ret
384
    ret
383
 
385
 
384
cd_get_parameters_of_file:
386
cd_get_parameters_of_file:
385
    mov   edi,[cd_mem_location]
387
    mov   edi,[cd_mem_location]
386
cd_get_parameters_of_file_1:
388
cd_get_parameters_of_file_1:
387
; ïîëó÷àåì àòðèáóòû ôàéëà
389
; ïîëó÷àåì àòðèáóòû ôàéëà
388
    xor   eax,eax
390
    xor   eax,eax
389
; ôàéë íå àðõèâèðîâàëñÿ
391
; ôàéë íå àðõèâèðîâàëñÿ
390
    inc   eax
392
    inc   eax
391
    shl   eax,1
393
    shl   eax,1
392
; ýòî êàòàëîã?
394
; ýòî êàòàëîã?
393
    test  [ebp-8],byte 2
395
    test  [ebp-8],byte 2
394
    jz	  .file
396
    jz	  .file
395
    inc   eax
397
    inc   eax
396
.file:
398
.file:
397
; ìåòêà òîìà íå êàê â FAT, â ýòîì âèäå îòñóòñâóåò
399
; ìåòêà òîìà íå êàê â FAT, â ýòîì âèäå îòñóòñâóåò
398
; ôàéë íå ÿâëÿåòñÿ ñèñòåìíûì
400
; ôàéë íå ÿâëÿåòñÿ ñèñòåìíûì
399
    shl   eax,3
401
    shl   eax,3
400
; ôàéë ÿâëÿåòñÿ ñêðûòûì? (àòðèáóò ñóùåñòâîâàíèå)
402
; ôàéë ÿâëÿåòñÿ ñêðûòûì? (àòðèáóò ñóùåñòâîâàíèå)
401
    test  [ebp-8],byte 1
403
    test  [ebp-8],byte 1
402
    jz	  .hidden
404
    jz	  .hidden
403
    inc   eax
405
    inc   eax
404
.hidden:
406
.hidden:
405
    shl   eax,1
407
    shl   eax,1
406
; ôàéë âñåãäà òîëüêî äëÿ ÷òåíèÿ, òàê êàê ýòî CD
408
; ôàéë âñåãäà òîëüêî äëÿ ÷òåíèÿ, òàê êàê ýòî CD
407
    inc   eax
409
    inc   eax
408
    mov   [edi],eax
410
    mov   [edi],eax
409
; ïîëó÷àåì âðåìÿ äëÿ ôàéëà
411
; ïîëó÷àåì âðåìÿ äëÿ ôàéëà
410
;÷àñ
412
;÷àñ
411
    movzx eax,byte [ebp-12]
413
    movzx eax,byte [ebp-12]
412
    shl   eax,8
414
    shl   eax,8
413
;ìèíóòà
415
;ìèíóòà
414
    mov   al,[ebp-11]
416
    mov   al,[ebp-11]
415
    shl   eax,8
417
    shl   eax,8
416
;ñåêóíäà
418
;ñåêóíäà
417
    mov   al,[ebp-10]
419
    mov   al,[ebp-10]
418
;âðåìÿ ñîçäàíèÿ ôàéëà
420
;âðåìÿ ñîçäàíèÿ ôàéëà
419
    mov   [edi+8],eax
421
    mov   [edi+8],eax
420
;âðåìÿ ïîñëåäíåãî äîñòóïà
422
;âðåìÿ ïîñëåäíåãî äîñòóïà
421
    mov   [edi+16],eax
423
    mov   [edi+16],eax
422
;âðåìÿ ïîñëåäíåé çàïèñè
424
;âðåìÿ ïîñëåäíåé çàïèñè
423
    mov   [edi+24],eax
425
    mov   [edi+24],eax
424
; ïîëó÷àåì äàòó äëÿ ôàéëà
426
; ïîëó÷àåì äàòó äëÿ ôàéëà
425
;ãîä
427
;ãîä
426
    movzx eax,byte [ebp-15]
428
    movzx eax,byte [ebp-15]
427
    add   eax,1900
429
    add   eax,1900
428
    shl   eax,8
430
    shl   eax,8
429
;ìåñÿö
431
;ìåñÿö
430
    mov   al,[ebp-14]
432
    mov   al,[ebp-14]
431
    shl   eax,8
433
    shl   eax,8
432
;äåíü
434
;äåíü
433
    mov   al,[ebp-13]
435
    mov   al,[ebp-13]
434
;äàòà ñîçäàíèÿ ôàéëà
436
;äàòà ñîçäàíèÿ ôàéëà
435
    mov   [edi+12],eax
437
    mov   [edi+12],eax
436
;âðåìÿ ïîñëåäíåãî äîñòóïà
438
;âðåìÿ ïîñëåäíåãî äîñòóïà
437
    mov   [edi+20],eax
439
    mov   [edi+20],eax
438
;âðåìÿ ïîñëåäíåé çàïèñè
440
;âðåìÿ ïîñëåäíåé çàïèñè
439
    mov   [edi+28],eax
441
    mov   [edi+28],eax
440
; ïîëó÷àåì òèï äàííûõ èìåíè
442
; ïîëó÷àåì òèï äàííûõ èìåíè
441
    xor   eax,eax
443
    xor   eax,eax
442
    test   dword [ebx+4], 1 ; 0=ANSI, 1=UNICODE
444
    test   dword [ebx+4], 1 ; 0=ANSI, 1=UNICODE
443
    jnz    .unicode_1
445
    jnz    .unicode_1
444
    mov    [edi+4],eax
446
    mov    [edi+4],eax
445
    jmp   @f
447
    jmp   @f
446
.unicode_1:
448
.unicode_1:
447
    inc    eax
449
    inc    eax
448
    mov    [edi+4],eax
450
    mov    [edi+4],eax
449
@@:
451
@@:
450
; ïîëó÷àåì ðàçìåð ôàéëà â áàéòàõ
452
; ïîëó÷àåì ðàçìåð ôàéëà â áàéòàõ
451
    xor   eax,eax
453
    xor   eax,eax
452
    mov   [edi+32+4],eax
454
    mov   [edi+32+4],eax
453
    mov   eax,[ebp-23]
455
    mov   eax,[ebp-23]
454
    mov   [edi+32],eax
456
    mov   [edi+32],eax
455
    ret
457
    ret
456
 
458
 
457
;----------------------------------------------------------------
459
;----------------------------------------------------------------
458
;
460
;
459
;  fs_CdGetFileInfo - LFN variant for CD
461
;  fs_CdGetFileInfo - LFN variant for CD
460
;                     get file/directory attributes structure
462
;                     get file/directory attributes structure
461
;
463
;
462
;----------------------------------------------------------------
464
;----------------------------------------------------------------
463
fs_CdGetFileInfo:
465
fs_CdGetFileInfo:
464
	cmp	byte [esi], 0
466
	cmp	byte [esi], 0
465
	jnz	@f
467
	jnz	@f
466
	mov	eax, 2
468
	mov	eax, 2
467
	ret
469
	ret
468
@@:
470
@@:
469
	push	edi
471
	push	edi
470
	call	cd_find_lfn
472
	call	cd_find_lfn
471
	pushfd
473
	pushfd
472
	cmp	[DevErrorCode], 0
474
	cmp	[DevErrorCode], 0
473
	jz	@f
475
	jz	@f
474
	popfd
476
	popfd
475
	pop	edi
477
	pop	edi
476
	mov	eax, 11
478
	mov	eax, 11
477
	ret
479
	ret
478
@@:
480
@@:
479
	popfd
481
	popfd
480
	jnc	@f
482
	jnc	@f
481
	pop	edi
483
	pop	edi
482
	mov	eax, ERROR_FILE_NOT_FOUND
484
	mov	eax, ERROR_FILE_NOT_FOUND
483
	ret
485
	ret
484
@@:
486
@@:
485
 
487
 
486
	mov	edi, edx
488
	mov	edi, edx
487
	push	ebp
489
	push	ebp
488
	mov	ebp, [cd_current_pointer_of_input]
490
	mov	ebp, [cd_current_pointer_of_input]
489
	add	ebp, 33
491
	add	ebp, 33
490
	call	cd_get_parameters_of_file_1
492
	call	cd_get_parameters_of_file_1
491
	pop	ebp
493
	pop	ebp
492
	and	dword [edi+4], 0
494
	and	dword [edi+4], 0
493
	pop	edi
495
	pop	edi
494
	xor	eax, eax
496
	xor	eax, eax
495
	ret
497
	ret
496
 
498
 
497
;----------------------------------------------------------------
499
;----------------------------------------------------------------
498
cd_find_lfn:
500
cd_find_lfn:
499
  mov	[cd_appl_data],0
501
  mov	[cd_appl_data],0
500
; in: esi+ebp -> name
502
; in: esi+ebp -> name
501
; out: CF=1 - file not found
503
; out: CF=1 - file not found
502
; else CF=0 and [cd_current_pointer_of_input] direntry
504
; else CF=0 and [cd_current_pointer_of_input] direntry
503
	push eax esi
505
	push eax esi
504
; 16 ñåêòîð íà÷àëî íàáîðà äåñêðèïòîðîâ òîìîâ
506
; 16 ñåêòîð íà÷àëî íàáîðà äåñêðèïòîðîâ òîìîâ
505
 
507
 
506
  call	WaitUnitReady
508
  call	WaitUnitReady
507
  cmp	[DevErrorCode],0
509
  cmp	[DevErrorCode],0
508
  jne	.access_denied
510
  jne	.access_denied
509
 
511
 
510
  call	prevent_medium_removal
512
  call	prevent_medium_removal
511
; òåñòîâîå ÷òåíèå
513
; òåñòîâîå ÷òåíèå
512
  mov  [CDSectorAddress],dword 16
514
  mov  [CDSectorAddress],dword 16
513
  mov  [CDDataBuf_pointer],CDDataBuf
515
  mov  [CDDataBuf_pointer],CDDataBuf
514
  call	ReadCDWRetr    ;_1
516
  call	ReadCDWRetr    ;_1
515
   cmp	 [DevErrorCode],0
517
   cmp	 [DevErrorCode],0
516
  jne	.access_denied
518
  jne	.access_denied
517
 
519
 
518
; âû÷èñëåíèå ïîñëåäíåé ñåññèè
520
; âû÷èñëåíèå ïîñëåäíåé ñåññèè
519
  call WaitUnitReady
521
  call WaitUnitReady
520
  cmp	[DevErrorCode],0
522
  cmp	[DevErrorCode],0
521
  jne	.access_denied
523
  jne	.access_denied
522
  call Read_TOC
524
  call Read_TOC
523
  mov  ah,[CDDataBuf+4+4]
525
  mov  ah,[CDDataBuf+4+4]
524
  mov  al,[CDDataBuf+4+5]
526
  mov  al,[CDDataBuf+4+5]
525
  shl  eax,16
527
  shl  eax,16
526
  mov  ah,[CDDataBuf+4+6]
528
  mov  ah,[CDDataBuf+4+6]
527
  mov  al,[CDDataBuf+4+7]
529
  mov  al,[CDDataBuf+4+7]
528
  add  eax,15
530
  add  eax,15
529
  mov  [CDSectorAddress],eax
531
  mov  [CDSectorAddress],eax
530
;  mov  [CDSectorAddress],dword 15
532
;  mov  [CDSectorAddress],dword 15
531
  mov  [CDDataBuf_pointer],CDDataBuf
533
  mov  [CDDataBuf_pointer],CDDataBuf
532
 
534
 
533
.start:
535
.start:
534
	inc  dword [CDSectorAddress]
536
	inc  dword [CDSectorAddress]
535
  call	ReadCDWRetr    ;_1
537
  call	ReadCDWRetr    ;_1
536
   cmp	 [DevErrorCode],0
538
   cmp	 [DevErrorCode],0
537
  jne	.access_denied
539
  jne	.access_denied
538
 
540
 
539
.start_check:
541
.start_check:
540
; ïðîâåðêà íà âøèâîñòü
542
; ïðîâåðêà íà âøèâîñòü
541
	cmp  [CDDataBuf+1],dword 'CD00'
543
	cmp  [CDDataBuf+1],dword 'CD00'
542
	jne  .access_denied
544
	jne  .access_denied
543
	cmp  [CDDataBuf+5],byte '1'
545
	cmp  [CDDataBuf+5],byte '1'
544
	jne  .access_denied
546
	jne  .access_denied
545
; ñåêòîð ÿâëÿåòñÿ òåðìèíàòîðîì íàáîð äåñêðèïòîðîâ òîìîâ?
547
; ñåêòîð ÿâëÿåòñÿ òåðìèíàòîðîì íàáîð äåñêðèïòîðîâ òîìîâ?
546
	cmp  [CDDataBuf],byte 0xff
548
	cmp  [CDDataBuf],byte 0xff
547
	je  .access_denied
549
	je  .access_denied
548
; ñåêòîð ÿâëÿåòñÿ äîïîëíèòåëüíûì è óëó÷øåííûì äåñêðèïòîðîì òîìà?
550
; ñåêòîð ÿâëÿåòñÿ äîïîëíèòåëüíûì è óëó÷øåííûì äåñêðèïòîðîì òîìà?
549
	cmp  [CDDataBuf],byte 0x2
551
	cmp  [CDDataBuf],byte 0x2
550
	jne  .start
552
	jne  .start
551
; ñåêòîð ÿâëÿåòñÿ äîïîëíèòåëüíûì äåñêðèïòîðîì òîìà?
553
; ñåêòîð ÿâëÿåòñÿ äîïîëíèòåëüíûì äåñêðèïòîðîì òîìà?
552
	cmp  [CDDataBuf+6],byte 0x1
554
	cmp  [CDDataBuf+6],byte 0x1
553
	jne  .start
555
	jne  .start
554
 
556
 
555
; ïàðàìåòðû root äèðåêòðîðèè
557
; ïàðàìåòðû root äèðåêòðîðèè
556
	mov  eax,[CDDataBuf+0x9c+2] ; íà÷àëî root äèðåêòðîðèè
558
	mov  eax,[CDDataBuf+0x9c+2] ; íà÷àëî root äèðåêòðîðèè
557
	mov  [CDSectorAddress],eax
559
	mov  [CDSectorAddress],eax
558
	mov  eax,[CDDataBuf+0x9c+10] ; ðàçìåð root äèðåêòðîðèè
560
	mov  eax,[CDDataBuf+0x9c+10] ; ðàçìåð root äèðåêòðîðèè
559
	cmp    byte [esi], 0
561
	cmp    byte [esi], 0
560
	jnz    @f
562
	jnz    @f
561
	mov   [cd_current_pointer_of_input],CDDataBuf+0x9c
563
	mov   [cd_current_pointer_of_input],CDDataBuf+0x9c
562
	jmp   .done
564
	jmp   .done
563
@@:
565
@@:
564
; íà÷èíàåì ïîèñê
566
; íà÷èíàåì ïîèñê
565
.mainloop:
567
.mainloop:
566
	dec  dword [CDSectorAddress]
568
	dec  dword [CDSectorAddress]
567
.read_to_buffer:
569
.read_to_buffer:
568
	inc  dword [CDSectorAddress]
570
	inc  dword [CDSectorAddress]
569
	mov  [CDDataBuf_pointer],CDDataBuf
571
	mov  [CDDataBuf_pointer],CDDataBuf
570
	call ReadCDWRetr	 ; ÷èòàåì ñåêòîð äèðåêòîðèè
572
	call ReadCDWRetr	 ; ÷èòàåì ñåêòîð äèðåêòîðèè
571
	cmp   [DevErrorCode],0
573
	cmp   [DevErrorCode],0
572
	jne   .access_denied
574
	jne   .access_denied
573
	push	ebp
575
	push	ebp
574
	call	cd_find_name_in_buffer
576
	call	cd_find_name_in_buffer
575
	pop	ebp
577
	pop	ebp
576
	jnc	.found
578
	jnc	.found
577
	sub  eax,2048
579
	sub  eax,2048
578
; äèðåêòîðèÿ çàêîí÷èëàñü?
580
; äèðåêòîðèÿ çàêîí÷èëàñü?
579
	cmp  eax,0
581
	cmp  eax,0
580
	ja   .read_to_buffer
582
	ja   .read_to_buffer
581
; íåò èñêîìîãî ýëåìåíòà öåïî÷êè
583
; íåò èñêîìîãî ýëåìåíòà öåïî÷êè
582
.access_denied:
584
.access_denied:
583
	pop  esi eax
585
	pop  esi eax
584
	mov   [cd_appl_data],1
586
	mov   [cd_appl_data],1
585
	stc
587
	stc
586
	ret
588
	ret
587
; èñêîìûé ýëåìåíò öåïî÷êè íàéäåí
589
; èñêîìûé ýëåìåíò öåïî÷êè íàéäåí
588
  .found:
590
  .found:
589
; êîíåö ïóòè ôàéëà
591
; êîíåö ïóòè ôàéëà
590
	cmp    byte [esi-1], 0
592
	cmp    byte [esi-1], 0
591
	jz    .done
593
	jz    .done
592
  .nested:
594
  .nested:
593
	mov    eax,[cd_current_pointer_of_input]
595
	mov    eax,[cd_current_pointer_of_input]
594
	push	dword [eax+2]
596
	push	dword [eax+2]
595
	pop	dword [CDSectorAddress]       ; íà÷àëî äèðåêòîðèè
597
	pop	dword [CDSectorAddress]       ; íà÷àëî äèðåêòîðèè
596
	mov    eax,[eax+2+8]  ; ðàçìåð äèðåêòîðèè
598
	mov    eax,[eax+2+8]  ; ðàçìåð äèðåêòîðèè
597
	jmp    .mainloop
599
	jmp    .mainloop
598
; óêàçàòåëü ôàéëà íàéäåí
600
; óêàçàòåëü ôàéëà íàéäåí
599
   .done:
601
   .done:
600
	test	ebp, ebp
602
	test	ebp, ebp
601
	jz	@f
603
	jz	@f
602
	mov	esi, ebp
604
	mov	esi, ebp
603
	xor	ebp, ebp
605
	xor	ebp, ebp
604
	jmp	.nested
606
	jmp	.nested
605
@@:
607
@@:
606
	pop  esi eax
608
	pop  esi eax
607
	mov   [cd_appl_data],1
609
	mov   [cd_appl_data],1
608
	clc
610
	clc
609
	ret
611
	ret
610
 
612
 
611
cd_find_name_in_buffer:
613
cd_find_name_in_buffer:
612
	mov	[cd_current_pointer_of_input_2],CDDataBuf
614
	mov	[cd_current_pointer_of_input_2],CDDataBuf
613
.start:
615
.start:
614
	call	cd_get_name
616
	call	cd_get_name
615
	jc	.not_found
617
	jc	.not_found
616
	call	cd_compare_name
618
	call	cd_compare_name
617
	jc	.start
619
	jc	.start
618
.found:
620
.found:
619
	clc
621
	clc
620
	ret
622
	ret
621
.not_found:
623
.not_found:
622
	stc
624
	stc
623
	ret
625
	ret
624
 
626
 
625
cd_get_name:
627
cd_get_name:
626
	push eax
628
	push eax
627
	mov   ebp,[cd_current_pointer_of_input_2]
629
	mov   ebp,[cd_current_pointer_of_input_2]
628
	mov   [cd_current_pointer_of_input],ebp
630
	mov   [cd_current_pointer_of_input],ebp
629
	mov   eax,[ebp]
631
	mov   eax,[ebp]
630
	test   eax,eax   ; âõîäû çàêîí÷èëèñü?
632
	test   eax,eax   ; âõîäû çàêîí÷èëèñü?
631
	jz    .next_sector
633
	jz    .next_sector
632
	cmp   ebp,CDDataBuf+2048     ; áóôåð çàêîí÷èëñÿ?
634
	cmp   ebp,CDDataBuf+2048     ; áóôåð çàêîí÷èëñÿ?
633
	jae   .next_sector
635
	jae   .next_sector
634
	movzx eax, byte [ebp]
636
	movzx eax, byte [ebp]
635
	add   [cd_current_pointer_of_input_2],eax ; ñëåäóþùèé âõîä êàòàëîãà
637
	add   [cd_current_pointer_of_input_2],eax ; ñëåäóþùèé âõîä êàòàëîãà
636
	add   ebp,33 ; óêàçàòåëü óñòàíîâëåí íà íà÷àëî èìåíè
638
	add   ebp,33 ; óêàçàòåëü óñòàíîâëåí íà íà÷àëî èìåíè
637
	pop   eax
639
	pop   eax
638
	clc
640
	clc
639
	ret
641
	ret
640
.next_sector:
642
.next_sector:
641
	pop  eax
643
	pop  eax
642
	stc
644
	stc
643
	ret
645
	ret
644
 
646
 
645
cd_compare_name:
647
cd_compare_name:
646
; compares ASCIIZ-names, case-insensitive (cp866 encoding)
648
; compares ASCIIZ-names, case-insensitive (cp866 encoding)
647
; in: esi->name, ebp->name
649
; in: esi->name, ebp->name
648
; out: if names match: ZF=1 and esi->next component of name
650
; out: if names match: ZF=1 and esi->next component of name
649
;      else: ZF=0, esi is not changed
651
;      else: ZF=0, esi is not changed
650
; destroys eax
652
; destroys eax
651
    push    esi eax edi
653
    push    esi eax edi
652
    mov     edi,ebp
654
    mov     edi,ebp
653
.loop:
655
.loop:
654
    cld
656
    cld
655
    lodsb
657
    lodsb
656
    push eax
658
    push eax
657
    call char_todown
659
    call char_todown
658
    call ansi2uni_char
660
    call ansi2uni_char
659
    xchg ah,al
661
    xchg ah,al
660
    scasw
662
    scasw
661
    pop  eax
663
    pop  eax
662
    je	  .coincides
664
    je	  .coincides
663
    call char_toupper
665
    call char_toupper
664
    call ansi2uni_char
666
    call ansi2uni_char
665
    xchg ah,al
667
    xchg ah,al
666
    sub  edi,2
668
    sub  edi,2
667
    scasw
669
    scasw
668
    jne   .name_not_coincide
670
    jne   .name_not_coincide
669
.coincides:
671
.coincides:
670
    cmp   [esi],byte '/'  ; ðàçäåëèòåëü ïóòè, êîíåö èìåíè òåêóùåãî ýëåìåíòà
672
    cmp   [esi],byte '/'  ; ðàçäåëèòåëü ïóòè, êîíåö èìåíè òåêóùåãî ýëåìåíòà
671
    je	 .done
673
    je	 .done
672
    cmp   [esi],byte 0	; ðàçäåëèòåëü ïóòè, êîíåö èìåíè òåêóùåãî ýëåìåíòà
674
    cmp   [esi],byte 0	; ðàçäåëèòåëü ïóòè, êîíåö èìåíè òåêóùåãî ýëåìåíòà
673
    je	 .done
675
    je	 .done
674
    jmp   .loop
676
    jmp   .loop
675
.name_not_coincide:
677
.name_not_coincide:
676
    pop    edi eax esi
678
    pop    edi eax esi
677
    stc
679
    stc
678
    ret
680
    ret
679
.done:
681
.done:
680
; ïðîâåðêà êîíöà ôàéëà
682
; ïðîâåðêà êîíöà ôàéëà
681
    cmp   [edi],word 3B00h ; ñåïàðàòîð êîíöà ôàéëà ';'
683
    cmp   [edi],word 3B00h ; ñåïàðàòîð êîíöà ôàéëà ';'
682
    je	 .done_1
684
    je	 .done_1
683
; ïðîâåðêà äëÿ ôàéëîâ íå çàêàí÷èâàþùèõñÿ ñåïàðàòîðîì
685
; ïðîâåðêà äëÿ ôàéëîâ íå çàêàí÷èâàþùèõñÿ ñåïàðàòîðîì
684
    movzx   eax,byte [ebp-33]
686
    movzx   eax,byte [ebp-33]
685
    add   eax,ebp
687
    add   eax,ebp
686
    sub   eax,34
688
    sub   eax,34
687
    cmp   edi,eax
689
    cmp   edi,eax
688
    je	 .done_1
690
    je	 .done_1
689
; ïðîâåðêà êîíöà ïàïêè
691
; ïðîâåðêà êîíöà ïàïêè
690
    movzx   eax,byte [ebp-1]
692
    movzx   eax,byte [ebp-1]
691
    add   eax,ebp
693
    add   eax,ebp
692
    cmp   edi,eax
694
    cmp   edi,eax
693
    jne   .name_not_coincide
695
    jne   .name_not_coincide
694
.done_1:
696
.done_1:
695
    pop   edi eax
697
    pop   edi eax
696
    add   esp,4
698
    add   esp,4
697
    inc   esi
699
    inc   esi
698
    clc
700
    clc
699
    ret
701
    ret
700
 
702
 
701
char_todown:
703
char_todown:
702
; convert character to uppercase, using cp866 encoding
704
; convert character to uppercase, using cp866 encoding
703
; in: al=symbol
705
; in: al=symbol
704
; out: al=converted symbol
706
; out: al=converted symbol
705
	cmp	al, 'A'
707
	cmp	al, 'A'
706
	jb	.ret
708
	jb	.ret
707
	cmp	al, 'Z'
709
	cmp	al, 'Z'
708
	jbe	.az
710
	jbe	.az
709
	cmp	al, '€'
711
	cmp	al, '€'
710
	jb	.ret
712
	jb	.ret
711
	cmp	al, ''
713
	cmp	al, ''
712
	jb	.rus1
714
	jb	.rus1
713
	cmp	al, 'Ÿ'
715
	cmp	al, 'Ÿ'
714
	ja	.ret
716
	ja	.ret
715
; 0x90-0x9F -> 0xE0-0xEF
717
; 0x90-0x9F -> 0xE0-0xEF
716
	add	al, 'à'-''
718
	add	al, 'à'-''
717
.ret:
719
.ret:
718
	ret
720
	ret
719
.rus1:
721
.rus1:
720
; 0x80-0x8F -> 0xA0-0xAF
722
; 0x80-0x8F -> 0xA0-0xAF
721
.az:
723
.az:
722
	add	al, 0x20
724
	add	al, 0x20
723
	ret
725
	ret
724
 
726
 
725
uni2ansi_char:
727
uni2ansi_char:
726
; convert UNICODE character in al to ANSI character in ax, using cp866 encoding
728
; convert UNICODE character in al to ANSI character in ax, using cp866 encoding
727
; in: ax=UNICODE character
729
; in: ax=UNICODE character
728
; out: al=converted ANSI character
730
; out: al=converted ANSI character
729
	cmp	ax, 0x80
731
	cmp	ax, 0x80
730
	jb	.ascii
732
	jb	.ascii
731
	cmp	ax, 0x401
733
	cmp	ax, 0x401
732
	jz	.yo1
734
	jz	.yo1
733
	cmp	ax, 0x451
735
	cmp	ax, 0x451
734
	jz	.yo2
736
	jz	.yo2
735
	cmp	ax, 0x410
737
	cmp	ax, 0x410
736
	jb	.unk
738
	jb	.unk
737
	cmp	ax, 0x440
739
	cmp	ax, 0x440
738
	jb	.rus1
740
	jb	.rus1
739
	cmp	ax, 0x450
741
	cmp	ax, 0x450
740
	jb	.rus2
742
	jb	.rus2
741
.unk:
743
.unk:
742
	mov	al, '_'
744
	mov	al, '_'
743
	jmp	.doit
745
	jmp	.doit
744
.yo1:
746
.yo1:
745
	mov	al, 'ð'
747
	mov	al, 'ð'
746
	jmp	.doit
748
	jmp	.doit
747
.yo2:
749
.yo2:
748
	mov	al, 'ñ'
750
	mov	al, 'ñ'
749
	jmp	.doit
751
	jmp	.doit
750
.rus1:
752
.rus1:
751
; 0x410-0x43F -> 0x80-0xAF
753
; 0x410-0x43F -> 0x80-0xAF
752
	add	al, 0x70
754
	add	al, 0x70
753
	jmp	.doit
755
	jmp	.doit
754
.rus2:
756
.rus2:
755
; 0x440-0x44F -> 0xE0-0xEF
757
; 0x440-0x44F -> 0xE0-0xEF
756
	add	al, 0xA0
758
	add	al, 0xA0
757
.ascii:
759
.ascii:
758
.doit:
760
.doit:
759
	ret
761
	ret