Subversion Repositories Kolibri OS

Rev

Rev 585 | Rev 593 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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