Subversion Repositories Kolibri OS

Rev

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

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