Subversion Repositories Kolibri OS

Rev

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

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