Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
425 victor 1
$Revision: 585 $
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
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
;----------------------------------------------------------------
90 mario79 503
 
87 mario79 504
cd_find_lfn:
585 mario79 505
       mov   [cd_appl_data],0
521 diamond 506
; in: esi+ebp -> name
87 mario79 507
; out: CF=1 - file not found
508
;      else CF=0 and [cd_current_pointer_of_input] direntry
585 mario79 509
	push eax esi
87 mario79 510
; 16 сектор начало набора дескрипторов томов
585 mario79 511
	mov  [CDSectorAddress],dword 15
512
       mov  [CDDataBuf_pointer],CDDataBuf
513
       call  prevent_medium_removal
87 mario79 514
.start:
585 mario79 515
	inc  dword [CDSectorAddress]
516
       call  ReadCDWRetr    ;_1
87 mario79 517
       cmp   [DevErrorCode],0
518
       jne   .access_denied
519
; проверка на вшивость
585 mario79 520
	cmp  [CDDataBuf+1],dword 'CD00'
521
	jne  .access_denied
522
	cmp  [CDDataBuf+5],byte '1'
523
	jne  .access_denied
87 mario79 524
; сектор является терминатором набор дескрипторов томов?
585 mario79 525
	cmp  [CDDataBuf],byte 0xff
526
	je  .access_denied
87 mario79 527
; сектор является дополнительным и улучшенным дескриптором тома?
585 mario79 528
	cmp  [CDDataBuf],byte 0x2
529
	jne  .start
87 mario79 530
; сектор является дополнительным дескриптором тома?
585 mario79 531
	cmp  [CDDataBuf+6],byte 0x1
532
	jne  .start
87 mario79 533
; параметры root директрории
585 mario79 534
	mov  eax,[CDDataBuf+0x9c+2] ; начало root директрории
535
	mov  [CDSectorAddress],eax
536
	mov  eax,[CDDataBuf+0x9c+10] ; размер root директрории
537
	cmp    byte [esi], 0
538
	jnz    @f
539
	mov   [cd_current_pointer_of_input],CDDataBuf+0x9c
540
	jmp   .done
87 mario79 541
@@:
542
; начинаем поиск
543
.mainloop:
585 mario79 544
	dec  dword [CDSectorAddress]
87 mario79 545
.read_to_buffer:
585 mario79 546
	inc  dword [CDSectorAddress]
547
	mov  [CDDataBuf_pointer],CDDataBuf
548
	call ReadCDWRetr	 ; читаем сектор директории
549
	cmp   [DevErrorCode],0
550
	jne   .access_denied
551
	push	ebp
552
	call	cd_find_name_in_buffer
553
	pop	ebp
554
	jnc	.found
555
	sub  eax,2048
87 mario79 556
; директория закончилась?
585 mario79 557
	cmp  eax,0
558
	ja   .read_to_buffer
87 mario79 559
; нет искомого элемента цепочки
560
.access_denied:
585 mario79 561
	pop  esi eax
562
	mov   [cd_appl_data],1
563
	stc
564
	ret
87 mario79 565
; искомый элемент цепочки найден
566
  .found:
567
; конец пути файла
585 mario79 568
	cmp    byte [esi-1], 0
569
	jz    .done
521 diamond 570
  .nested:
585 mario79 571
	mov    eax,[cd_current_pointer_of_input]
572
	push	dword [eax+2]
573
	pop	dword [CDSectorAddress]       ; начало директории
574
	mov    eax,[eax+2+8]  ; размер директории
575
	jmp    .mainloop
87 mario79 576
; указатель файла найден
577
   .done:
585 mario79 578
	test	ebp, ebp
579
	jz	@f
580
	mov	esi, ebp
581
	xor	ebp, ebp
582
	jmp	.nested
521 diamond 583
@@:
585 mario79 584
	pop  esi eax
585
	mov   [cd_appl_data],1
586
	clc
587
	ret
379 serge 588
 
87 mario79 589
cd_find_name_in_buffer:
585 mario79 590
	mov	[cd_current_pointer_of_input_2],CDDataBuf
87 mario79 591
.start:
585 mario79 592
	call	cd_get_name
593
	jc	.not_found
594
	call	cd_compare_name
595
	jc	.start
379 serge 596
.found:
585 mario79 597
	clc
598
	ret
87 mario79 599
.not_found:
585 mario79 600
	stc
601
	ret
87 mario79 602
 
603
cd_get_name:
585 mario79 604
	push eax
605
	mov   ebp,[cd_current_pointer_of_input_2]
606
	mov   [cd_current_pointer_of_input],ebp
607
	mov   eax,[ebp]
608
	cmp   eax,0   ; входы закончились?
609
	je    .next_sector
610
	cmp   ebp,CDDataBuf+2048     ; буфер закончился?
611
	jae   .next_sector
612
	movzx eax, byte [ebp]
613
	add   [cd_current_pointer_of_input_2],eax ; следующий вход каталога
614
	add   ebp,33 ; указатель установлен на начало имени
615
	pop   eax
616
	clc
617
	ret
87 mario79 618
.next_sector:
585 mario79 619
	pop  eax
620
	stc
621
	ret
87 mario79 622
 
623
cd_compare_name:
624
; compares ASCIIZ-names, case-insensitive (cp866 encoding)
625
; in: esi->name, ebp->name
626
; out: if names match: ZF=1 and esi->next component of name
627
;      else: ZF=0, esi is not changed
628
; destroys eax
379 serge 629
    push    esi eax edi
87 mario79 630
    mov     edi,ebp
631
.loop:
632
    cld
633
    lodsb
536 diamond 634
    push eax
99 mario79 635
    call char_todown
87 mario79 636
    call ansi2uni_char
637
    xchg ah,al
638
    scasw
536 diamond 639
    pop  eax
585 mario79 640
    je	  .coincides
99 mario79 641
    call char_toupper
87 mario79 642
    call ansi2uni_char
643
    xchg ah,al
644
    sub  edi,2
645
    scasw
646
    jne   .name_not_coincide
647
.coincides:
648
    cmp   [esi],byte '/'  ; разделитель пути, конец имени текущего элемента
585 mario79 649
    je	 .done
650
    cmp   [esi],byte 0	; разделитель пути, конец имени текущего элемента
651
    je	 .done
87 mario79 652
    jmp   .loop
653
.name_not_coincide:
654
    pop    edi eax esi
655
    stc
656
    ret
657
.done:
658
; проверка конца файла
659
    cmp   [edi],word 3B00h ; сепаратор конца файла ';'
585 mario79 660
    je	 .done_1
87 mario79 661
; проверка для файлов не заканчивающихся сепаратором
662
    movzx   eax,byte [ebp-33]
663
    add   eax,ebp
664
    sub   eax,34
665
    cmp   edi,eax
585 mario79 666
    je	 .done_1
87 mario79 667
; проверка конца папки
668
    movzx   eax,byte [ebp-1]
669
    add   eax,ebp
670
    cmp   edi,eax
671
    jne   .name_not_coincide
672
.done_1:
673
    pop   edi eax
674
    add   esp,4
675
    inc   esi
676
    clc
677
    ret
379 serge 678
 
87 mario79 679
char_todown:
680
; convert character to uppercase, using cp866 encoding
681
; in: al=symbol
682
; out: al=converted symbol
585 mario79 683
	cmp	al, 'A'
684
	jb	.ret
685
	cmp	al, 'Z'
686
	jbe	.az
687
	cmp	al, 'Ђ'
688
	jb	.ret
689
	cmp	al, 'ђ'
690
	jb	.rus1
691
	cmp	al, 'џ'
692
	ja	.ret
87 mario79 693
; 0x90-0x9F -> 0xE0-0xEF
585 mario79 694
	add	al, 'а'-'ђ'
87 mario79 695
.ret:
585 mario79 696
	ret
87 mario79 697
.rus1:
698
; 0x80-0x8F -> 0xA0-0xAF
699
.az:
585 mario79 700
	add	al, 0x20
701
	ret
379 serge 702
 
87 mario79 703
uni2ansi_char:
704
; convert UNICODE character in al to ANSI character in ax, using cp866 encoding
705
; in: ax=UNICODE character
706
; out: al=converted ANSI character
585 mario79 707
	cmp	ax, 0x80
708
	jb	.ascii
709
	cmp	ax, 0x401
710
	jz	.yo1
711
	cmp	ax, 0x451
712
	jz	.yo2
713
	cmp	ax, 0x410
714
	jb	.unk
715
	cmp	ax, 0x440
716
	jb	.rus1
717
	cmp	ax, 0x450
718
	jb	.rus2
87 mario79 719
.unk:
585 mario79 720
	mov	al, '_'
721
	jmp	.doit
87 mario79 722
.yo1:
585 mario79 723
	mov	al, 'р'
724
	jmp	.doit
87 mario79 725
.yo2:
585 mario79 726
	mov	al, 'с'
727
	jmp	.doit
87 mario79 728
.rus1:
729
; 0x410-0x43F -> 0x80-0xAF
585 mario79 730
	add	al, 0x70
731
	jmp	.doit
87 mario79 732
.rus2:
733
; 0x440-0x44F -> 0xE0-0xEF
585 mario79 734
	add	al, 0xA0
87 mario79 735
.ascii:
736
.doit:
585 mario79 737
	ret