Subversion Repositories Kolibri OS

Rev

Rev 2465 | Rev 3908 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2465 Rev 3555
Line 3... Line 3...
3
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 7... Line 7...
7
 
7
 
Line 8... Line 8...
8
$Revision: 2465 $
8
$Revision: 3555 $
9
 
9
 
10
 
10
 
Line 135... Line 135...
135
@@:
135
@@:
136
        mov     ebx, [ebx]
136
        mov     ebx, [ebx]
137
.l1:
137
.l1:
138
        push    ecx edx
138
        push    ecx edx
139
        push    0
139
        push    0
140
        mov     eax, [edi+10] ; ðåàëüíûé ðàçìåð ôàéëîâîé ñåêöèè
140
        mov     eax, [edi+10] ; реальный размер файловой секции
141
        sub     eax, ebx
141
        sub     eax, ebx
142
        jb      .eof
142
        jb      .eof
143
        cmp     eax, ecx
143
        cmp     eax, ecx
144
        jae     @f
144
        jae     @f
145
        mov     ecx, eax
145
        mov     ecx, eax
Line 157... Line 157...
157
        jnz     .incomplete_sector
157
        jnz     .incomplete_sector
158
        cmp     ecx, 2048
158
        cmp     ecx, 2048
159
        jb      .incomplete_sector
159
        jb      .incomplete_sector
160
; we may read and memmove complete sector
160
; we may read and memmove complete sector
161
        mov     [CDDataBuf_pointer], edx
161
        mov     [CDDataBuf_pointer], edx
162
        call    ReadCDWRetr; ÷èòàåì ñåêòîð ôàéëà
162
        call    ReadCDWRetr; читаем сектор файла
163
        cmp     [DevErrorCode], 0
163
        cmp     [DevErrorCode], 0
164
        jne     .noaccess_3
164
        jne     .noaccess_3
165
        add     edx, 2048
165
        add     edx, 2048
166
        sub     ecx, 2048
166
        sub     ecx, 2048
167
.next:
167
.next:
168
        inc     dword [CDSectorAddress]
168
        inc     dword [CDSectorAddress]
169
        jmp     .new_sector
169
        jmp     .new_sector
170
.incomplete_sector:
170
.incomplete_sector:
171
; we must read and memmove incomplete sector
171
; we must read and memmove incomplete sector
172
        mov     [CDDataBuf_pointer], CDDataBuf
172
        mov     [CDDataBuf_pointer], CDDataBuf
173
        call    ReadCDWRetr; ÷èòàåì ñåêòîð ôàéëà
173
        call    ReadCDWRetr; читаем сектор файла
174
        cmp     [DevErrorCode], 0
174
        cmp     [DevErrorCode], 0
175
        jne     .noaccess_3
175
        jne     .noaccess_3
176
        push    ecx
176
        push    ecx
177
        add     ecx, ebx
177
        add     ecx, ebx
178
        cmp     ecx, 2048
178
        cmp     ecx, 2048
Line 238... Line 238...
238
        mov     eax, ERROR_ACCESS_DENIED
238
        mov     eax, ERROR_ACCESS_DENIED
239
        ret
239
        ret
240
.found_dir:
240
.found_dir:
241
        mov     eax, [edi+2]    ; eax=cluster
241
        mov     eax, [edi+2]    ; eax=cluster
242
        mov     [CDSectorAddress], eax
242
        mov     [CDSectorAddress], eax
243
        mov     eax, [edi+10]   ; ðàçìåð äèðåêòðîðèè
243
        mov     eax, [edi+10]   ; размер директрории
244
.doit:
244
.doit:
245
; init header
245
; init header
246
        push    eax ecx
246
        push    eax ecx
247
        mov     edi, edx
247
        mov     edi, edx
248
        mov     ecx, 32/4
248
        mov     ecx, 32/4
Line 250... Line 250...
250
        rep stosd
250
        rep stosd
251
        pop     ecx eax
251
        pop     ecx eax
252
        mov     byte [edx], 1   ; version
252
        mov     byte [edx], 1   ; version
253
        mov     [cd_mem_location], edx
253
        mov     [cd_mem_location], edx
254
        add     [cd_mem_location], 32
254
        add     [cd_mem_location], 32
255
; íà÷èíàåì ïåðåáðîñêó ÁÄÂÊ â ÓÑÂÊ
255
; начинаем переброску БДВК в УСВК
256
;.mainloop:
256
;.mainloop:
257
        mov     [cd_counter_block], dword 0
257
        mov     [cd_counter_block], dword 0
258
        dec     dword [CDSectorAddress]
258
        dec     dword [CDSectorAddress]
259
        push    ecx
259
        push    ecx
260
.read_to_buffer:
260
.read_to_buffer:
261
        inc     dword [CDSectorAddress]
261
        inc     dword [CDSectorAddress]
262
        mov     [CDDataBuf_pointer], CDDataBuf
262
        mov     [CDDataBuf_pointer], CDDataBuf
263
        call    ReadCDWRetr         ; ÷èòàåì ñåêòîð äèðåêòîðèè
263
        call    ReadCDWRetr         ; читаем сектор директории
264
        cmp     [DevErrorCode], 0
264
        cmp     [DevErrorCode], 0
265
        jne     .noaccess_1
265
        jne     .noaccess_1
266
        call    .get_names_from_buffer
266
        call    .get_names_from_buffer
267
        sub     eax, 2048
267
        sub     eax, 2048
268
; äèðåêòîðèÿ çàêîí÷èëàñü?
268
; директория закончилась?
269
        ja      .read_to_buffer
269
        ja      .read_to_buffer
270
        mov     edi, [cd_counter_block]
270
        mov     edi, [cd_counter_block]
271
        mov     [edx+8], edi
271
        mov     [edx+8], edi
272
        mov     edi, [ebx]
272
        mov     edi, [ebx]
273
        sub     [edx+4], edi
273
        sub     [edx+4], edi
Line 308... Line 308...
308
        lodsw
308
        lodsw
309
        xchg    ah, al
309
        xchg    ah, al
310
        call    uni2ansi_char
310
        call    uni2ansi_char
311
        cld
311
        cld
312
        stosb
312
        stosb
313
; ïðîâåðêà êîíöà ôàéëà
313
; проверка конца файла
314
        mov     ax, [esi]
314
        mov     ax, [esi]
315
        cmp     ax, word 3B00h; ñåïàðàòîð êîíöà ôàéëà ';'
315
        cmp     ax, word 3B00h; сепаратор конца файла ';'
316
        je      .cd_get_parameters_of_file_1
316
        je      .cd_get_parameters_of_file_1
317
; ïðîâåðêà äëÿ ôàéëîâ íå çàêàí÷èâàþùèõñÿ ñåïàðàòîðîì
317
; проверка для файлов не заканчивающихся сепаратором
318
        movzx   eax, byte [ebp-33]
318
        movzx   eax, byte [ebp-33]
319
        add     eax, ebp
319
        add     eax, ebp
320
        sub     eax, 34
320
        sub     eax, 34
321
        cmp     esi, eax
321
        cmp     esi, eax
322
        je      .cd_get_parameters_of_file_1
322
        je      .cd_get_parameters_of_file_1
323
; ïðîâåðêà êîíöà ïàïêè
323
; проверка конца папки
324
        movzx   eax, byte [ebp-1]
324
        movzx   eax, byte [ebp-1]
325
        add     eax, ebp
325
        add     eax, ebp
326
        cmp     esi, eax
326
        cmp     esi, eax
327
        jb      .ansi
327
        jb      .ansi
328
.cd_get_parameters_of_file_1:
328
.cd_get_parameters_of_file_1:
Line 345... Line 345...
345
.unicode:
345
.unicode:
346
        cmp     [cd_counter_block], 2
346
        cmp     [cd_counter_block], 2
347
        jbe     .unicode_parent_directory
347
        jbe     .unicode_parent_directory
348
        cld
348
        cld
349
        movsw
349
        movsw
350
; ïðîâåðêà êîíöà ôàéëà
350
; проверка конца файла
351
        mov     ax, [esi]
351
        mov     ax, [esi]
352
        cmp     ax, word 3B00h; ñåïàðàòîð êîíöà ôàéëà ';'
352
        cmp     ax, word 3B00h; сепаратор конца файла ';'
353
        je      .cd_get_parameters_of_file_2
353
        je      .cd_get_parameters_of_file_2
354
; ïðîâåðêà äëÿ ôàéëîâ íå çàêàí÷èâàþùèõñÿ ñåïàðàòîðîì
354
; проверка для файлов не заканчивающихся сепаратором
355
        movzx   eax, byte [ebp-33]
355
        movzx   eax, byte [ebp-33]
356
        add     eax, ebp
356
        add     eax, ebp
357
        sub     eax, 34
357
        sub     eax, 34
358
        cmp     esi, eax
358
        cmp     esi, eax
359
        je      .cd_get_parameters_of_file_2
359
        je      .cd_get_parameters_of_file_2
360
; ïðîâåðêà êîíöà ïàïêè
360
; проверка конца папки
361
        movzx   eax, byte [ebp-1]
361
        movzx   eax, byte [ebp-1]
362
        add     eax, ebp
362
        add     eax, ebp
363
        cmp     esi, eax
363
        cmp     esi, eax
364
        jb      .unicode
364
        jb      .unicode
365
.cd_get_parameters_of_file_2:
365
.cd_get_parameters_of_file_2:
Line 384... Line 384...
384
        ret
384
        ret
Line 385... Line 385...
385
 
385
 
386
cd_get_parameters_of_file:
386
cd_get_parameters_of_file:
387
        mov     edi, [cd_mem_location]
387
        mov     edi, [cd_mem_location]
388
cd_get_parameters_of_file_1:
388
cd_get_parameters_of_file_1:
389
; ïîëó÷àåì àòðèáóòû ôàéëà
389
; получаем атрибуты файла
390
        xor     eax, eax
390
        xor     eax, eax
391
; ôàéë íå àðõèâèðîâàëñÿ
391
; файл не архивировался
392
        inc     eax
392
        inc     eax
393
        shl     eax, 1
393
        shl     eax, 1
394
; ýòî êàòàëîã?
394
; это каталог?
395
        test    [ebp-8], byte 2
395
        test    [ebp-8], byte 2
396
        jz      .file
396
        jz      .file
397
        inc     eax
397
        inc     eax
398
.file:
398
.file:
399
; ìåòêà òîìà íå êàê â FAT, â ýòîì âèäå îòñóòñâóåò
399
; метка тома не как в FAT, в этом виде отсутсвует
400
; ôàéë íå ÿâëÿåòñÿ ñèñòåìíûì
400
; файл не является системным
401
        shl     eax, 3
401
        shl     eax, 3
402
; ôàéë ÿâëÿåòñÿ ñêðûòûì? (àòðèáóò ñóùåñòâîâàíèå)
402
; файл является скрытым? (атрибут существование)
403
        test    [ebp-8], byte 1
403
        test    [ebp-8], byte 1
404
        jz      .hidden
404
        jz      .hidden
405
        inc     eax
405
        inc     eax
406
.hidden:
406
.hidden:
407
        shl     eax, 1
407
        shl     eax, 1
408
; ôàéë âñåãäà òîëüêî äëÿ ÷òåíèÿ, òàê êàê ýòî CD
408
; файл всегда только для чтения, так как это CD
409
        inc     eax
409
        inc     eax
410
        mov     [edi], eax
410
        mov     [edi], eax
411
; ïîëó÷àåì âðåìÿ äëÿ ôàéëà
411
; получаем время для файла
412
;÷àñ
412
;час
413
        movzx   eax, byte [ebp-12]
413
        movzx   eax, byte [ebp-12]
414
        shl     eax, 8
414
        shl     eax, 8
415
;ìèíóòà
415
;минута
416
        mov     al, [ebp-11]
416
        mov     al, [ebp-11]
417
        shl     eax, 8
417
        shl     eax, 8
418
;ñåêóíäà
418
;секунда
419
        mov     al, [ebp-10]
419
        mov     al, [ebp-10]
420
;âðåìÿ ñîçäàíèÿ ôàéëà
420
;время создания файла
421
        mov     [edi+8], eax
421
        mov     [edi+8], eax
422
;âðåìÿ ïîñëåäíåãî äîñòóïà
422
;время последнего доступа
423
        mov     [edi+16], eax
423
        mov     [edi+16], eax
424
;âðåìÿ ïîñëåäíåé çàïèñè
424
;время последней записи
425
        mov     [edi+24], eax
425
        mov     [edi+24], eax
426
; ïîëó÷àåì äàòó äëÿ ôàéëà
426
; получаем дату для файла
427
;ãîä
427
;год
428
        movzx   eax, byte [ebp-15]
428
        movzx   eax, byte [ebp-15]
429
        add     eax, 1900
429
        add     eax, 1900
430
        shl     eax, 8
430
        shl     eax, 8
431
;ìåñÿö
431
;месяц
432
        mov     al, [ebp-14]
432
        mov     al, [ebp-14]
433
        shl     eax, 8
433
        shl     eax, 8
434
;äåíü
434
;день
435
        mov     al, [ebp-13]
435
        mov     al, [ebp-13]
436
;äàòà ñîçäàíèÿ ôàéëà
436
;дата создания файла
437
        mov     [edi+12], eax
437
        mov     [edi+12], eax
438
;âðåìÿ ïîñëåäíåãî äîñòóïà
438
;время последнего доступа
439
        mov     [edi+20], eax
439
        mov     [edi+20], eax
440
;âðåìÿ ïîñëåäíåé çàïèñè
440
;время последней записи
441
        mov     [edi+28], eax
441
        mov     [edi+28], eax
442
; ïîëó÷àåì òèï äàííûõ èìåíè
442
; получаем тип данных имени
443
        xor     eax, eax
443
        xor     eax, eax
444
        test    dword [ebx+4], 1; 0=ANSI, 1=UNICODE
444
        test    dword [ebx+4], 1; 0=ANSI, 1=UNICODE
445
        jnz     .unicode_1
445
        jnz     .unicode_1
446
        mov     [edi+4], eax
446
        mov     [edi+4], eax
447
        jmp     @f
447
        jmp     @f
448
.unicode_1:
448
.unicode_1:
449
        inc     eax
449
        inc     eax
450
        mov     [edi+4], eax
450
        mov     [edi+4], eax
451
@@:
451
@@:
452
; ïîëó÷àåì ðàçìåð ôàéëà â áàéòàõ
452
; получаем размер файла в байтах
453
        xor     eax, eax
453
        xor     eax, eax
454
        mov     [edi+32+4], eax
454
        mov     [edi+32+4], eax
455
        mov     eax, [ebp-23]
455
        mov     eax, [ebp-23]
456
        mov     [edi+32], eax
456
        mov     [edi+32], eax
Line 501... Line 501...
501
        mov     [cd_appl_data], 0
501
        mov     [cd_appl_data], 0
502
; in: esi+ebp -> name
502
; in: esi+ebp -> name
503
; out: CF=1 - file not found
503
; out: CF=1 - file not found
504
; else CF=0 and [cd_current_pointer_of_input] direntry
504
; else CF=0 and [cd_current_pointer_of_input] direntry
505
        push    eax esi
505
        push    eax esi
506
; 16 ñåêòîð íà÷àëî íàáîðà äåñêðèïòîðîâ òîìîâ
506
; 16 сектор начало набора дескрипторов томов
Line 507... Line 507...
507
 
507
 
508
        call    WaitUnitReady
508
        call    WaitUnitReady
509
        cmp     [DevErrorCode], 0
509
        cmp     [DevErrorCode], 0
Line 510... Line 510...
510
        jne     .access_denied
510
        jne     .access_denied
511
 
511
 
512
        call    prevent_medium_removal
512
        call    prevent_medium_removal
513
; òåñòîâîå ÷òåíèå
513
; тестовое чтение
514
        mov     [CDSectorAddress], dword 16
514
        mov     [CDSectorAddress], dword 16
515
        mov     [CDDataBuf_pointer], CDDataBuf
515
        mov     [CDDataBuf_pointer], CDDataBuf
516
        call    ReadCDWRetr;_1
516
        call    ReadCDWRetr;_1
Line 517... Line 517...
517
        cmp     [DevErrorCode], 0
517
        cmp     [DevErrorCode], 0
518
        jne     .access_denied
518
        jne     .access_denied
519
 
519
 
520
; âû÷èñëåíèå ïîñëåäíåé ñåññèè
520
; вычисление последней сессии
521
        call    WaitUnitReady
521
        call    WaitUnitReady
522
        cmp     [DevErrorCode], 0
522
        cmp     [DevErrorCode], 0
Line 537... Line 537...
537
        call    ReadCDWRetr;_1
537
        call    ReadCDWRetr;_1
538
        cmp     [DevErrorCode], 0
538
        cmp     [DevErrorCode], 0
539
        jne     .access_denied
539
        jne     .access_denied
Line 540... Line 540...
540
 
540
 
541
.start_check:
541
.start_check:
542
; ïðîâåðêà íà âøèâîñòü
542
; проверка на вшивость
543
        cmp     [CDDataBuf+1], dword 'CD00'
543
        cmp     [CDDataBuf+1], dword 'CD00'
544
        jne     .access_denied
544
        jne     .access_denied
545
        cmp     [CDDataBuf+5], byte '1'
545
        cmp     [CDDataBuf+5], byte '1'
546
        jne     .access_denied
546
        jne     .access_denied
547
; ñåêòîð ÿâëÿåòñÿ òåðìèíàòîðîì íàáîð äåñêðèïòîðîâ òîìîâ?
547
; сектор является терминатором набор дескрипторов томов?
548
        cmp     [CDDataBuf], byte 0xff
548
        cmp     [CDDataBuf], byte 0xff
549
        je      .access_denied
549
        je      .access_denied
550
; ñåêòîð ÿâëÿåòñÿ äîïîëíèòåëüíûì è óëó÷øåííûì äåñêðèïòîðîì òîìà?
550
; сектор является дополнительным и улучшенным дескриптором тома?
551
        cmp     [CDDataBuf], byte 0x2
551
        cmp     [CDDataBuf], byte 0x2
552
        jne     .start
552
        jne     .start
553
; ñåêòîð ÿâëÿåòñÿ äîïîëíèòåëüíûì äåñêðèïòîðîì òîìà?
553
; сектор является дополнительным дескриптором тома?
554
        cmp     [CDDataBuf+6], byte 0x1
554
        cmp     [CDDataBuf+6], byte 0x1
Line 555... Line 555...
555
        jne     .start
555
        jne     .start
556
 
556
 
557
; ïàðàìåòðû root äèðåêòðîðèè
557
; параметры root директрории
558
        mov     eax, [CDDataBuf+0x9c+2]; íà÷àëî root äèðåêòðîðèè
558
        mov     eax, [CDDataBuf+0x9c+2]; начало root директрории
559
        mov     [CDSectorAddress], eax
559
        mov     [CDSectorAddress], eax
560
        mov     eax, [CDDataBuf+0x9c+10]; ðàçìåð root äèðåêòðîðèè
560
        mov     eax, [CDDataBuf+0x9c+10]; размер root директрории
561
        cmp     byte [esi], 0
561
        cmp     byte [esi], 0
562
        jnz     @f
562
        jnz     @f
563
        mov     [cd_current_pointer_of_input], CDDataBuf+0x9c
563
        mov     [cd_current_pointer_of_input], CDDataBuf+0x9c
564
        jmp     .done
564
        jmp     .done
565
@@:
565
@@:
566
; íà÷èíàåì ïîèñê
566
; начинаем поиск
567
.mainloop:
567
.mainloop:
568
        dec     dword [CDSectorAddress]
568
        dec     dword [CDSectorAddress]
569
.read_to_buffer:
569
.read_to_buffer:
570
        inc     dword [CDSectorAddress]
570
        inc     dword [CDSectorAddress]
571
        mov     [CDDataBuf_pointer], CDDataBuf
571
        mov     [CDDataBuf_pointer], CDDataBuf
572
        call    ReadCDWRetr      ; ÷èòàåì ñåêòîð äèðåêòîðèè
572
        call    ReadCDWRetr      ; читаем сектор директории
573
        cmp     [DevErrorCode], 0
573
        cmp     [DevErrorCode], 0
574
        jne     .access_denied
574
        jne     .access_denied
575
        push    ebp
575
        push    ebp
576
        call    cd_find_name_in_buffer
576
        call    cd_find_name_in_buffer
577
        pop     ebp
577
        pop     ebp
578
        jnc     .found
578
        jnc     .found
579
        sub     eax, 2048
579
        sub     eax, 2048
580
; äèðåêòîðèÿ çàêîí÷èëàñü?
580
; директория закончилась?
581
        cmp     eax, 0
581
        cmp     eax, 0
582
        ja      .read_to_buffer
582
        ja      .read_to_buffer
583
; íåò èñêîìîãî ýëåìåíòà öåïî÷êè
583
; нет искомого элемента цепочки
584
.access_denied:
584
.access_denied:
585
        pop     esi eax
585
        pop     esi eax
586
        mov     [cd_appl_data], 1
586
        mov     [cd_appl_data], 1
587
        stc
587
        stc
588
        ret
588
        ret
589
; èñêîìûé ýëåìåíò öåïî÷êè íàéäåí
589
; искомый элемент цепочки найден
590
  .found:
590
  .found:
591
; êîíåö ïóòè ôàéëà
591
; конец пути файла
592
        cmp     byte [esi-1], 0
592
        cmp     byte [esi-1], 0
593
        jz      .done
593
        jz      .done
594
  .nested:
594
  .nested:
595
        mov     eax, [cd_current_pointer_of_input]
595
        mov     eax, [cd_current_pointer_of_input]
596
        push    dword [eax+2]
596
        push    dword [eax+2]
597
        pop     dword [CDSectorAddress]       ; íà÷àëî äèðåêòîðèè
597
        pop     dword [CDSectorAddress]       ; начало директории
598
        mov     eax, [eax+2+8]; ðàçìåð äèðåêòîðèè
598
        mov     eax, [eax+2+8]; размер директории
599
        jmp     .mainloop
599
        jmp     .mainloop
600
; óêàçàòåëü ôàéëà íàéäåí
600
; указатель файла найден
601
   .done:
601
   .done:
602
        test    ebp, ebp
602
        test    ebp, ebp
603
        jz      @f
603
        jz      @f
Line 627... Line 627...
627
cd_get_name:
627
cd_get_name:
628
        push    eax
628
        push    eax
629
        mov     ebp, [cd_current_pointer_of_input_2]
629
        mov     ebp, [cd_current_pointer_of_input_2]
630
        mov     [cd_current_pointer_of_input], ebp
630
        mov     [cd_current_pointer_of_input], ebp
631
        mov     eax, [ebp]
631
        mov     eax, [ebp]
632
        test    eax, eax ; âõîäû çàêîí÷èëèñü?
632
        test    eax, eax ; входы закончились?
633
        jz      .next_sector
633
        jz      .next_sector
634
        cmp     ebp, CDDataBuf+2048  ; áóôåð çàêîí÷èëñÿ?
634
        cmp     ebp, CDDataBuf+2048  ; буфер закончился?
635
        jae     .next_sector
635
        jae     .next_sector
636
        movzx   eax, byte [ebp]
636
        movzx   eax, byte [ebp]
637
        add     [cd_current_pointer_of_input_2], eax; ñëåäóþùèé âõîä êàòàëîãà
637
        add     [cd_current_pointer_of_input_2], eax; следующий вход каталога
638
        add     ebp, 33; óêàçàòåëü óñòàíîâëåí íà íà÷àëî èìåíè
638
        add     ebp, 33; указатель установлен на начало имени
639
        pop     eax
639
        pop     eax
640
        clc
640
        clc
641
        ret
641
        ret
642
.next_sector:
642
.next_sector:
643
        pop     eax
643
        pop     eax
Line 667... Line 667...
667
        xchg    ah, al
667
        xchg    ah, al
668
        sub     edi, 2
668
        sub     edi, 2
669
        scasw
669
        scasw
670
        jne     .name_not_coincide
670
        jne     .name_not_coincide
671
.coincides:
671
.coincides:
672
        cmp     [esi], byte '/'; ðàçäåëèòåëü ïóòè, êîíåö èìåíè òåêóùåãî ýëåìåíòà
672
        cmp     [esi], byte '/'; разделитель пути, конец имени текущего элемента
673
        je      .done
673
        je      .done
674
        cmp     [esi], byte 0; ðàçäåëèòåëü ïóòè, êîíåö èìåíè òåêóùåãî ýëåìåíòà
674
        cmp     [esi], byte 0; разделитель пути, конец имени текущего элемента
675
        je      .done
675
        je      .done
676
        jmp     .loop
676
        jmp     .loop
677
.name_not_coincide:
677
.name_not_coincide:
678
        pop     edi eax esi
678
        pop     edi eax esi
679
        stc
679
        stc
680
        ret
680
        ret
681
.done:
681
.done:
682
; ïðîâåðêà êîíöà ôàéëà
682
; проверка конца файла
683
        cmp     [edi], word 3B00h; ñåïàðàòîð êîíöà ôàéëà ';'
683
        cmp     [edi], word 3B00h; сепаратор конца файла ';'
684
        je      .done_1
684
        je      .done_1
685
; ïðîâåðêà äëÿ ôàéëîâ íå çàêàí÷èâàþùèõñÿ ñåïàðàòîðîì
685
; проверка для файлов не заканчивающихся сепаратором
686
        movzx   eax, byte [ebp-33]
686
        movzx   eax, byte [ebp-33]
687
        add     eax, ebp
687
        add     eax, ebp
688
        sub     eax, 34
688
        sub     eax, 34
689
        cmp     edi, eax
689
        cmp     edi, eax
690
        je      .done_1
690
        je      .done_1
691
; ïðîâåðêà êîíöà ïàïêè
691
; проверка конца папки
692
        movzx   eax, byte [ebp-1]
692
        movzx   eax, byte [ebp-1]
693
        add     eax, ebp
693
        add     eax, ebp
694
        cmp     edi, eax
694
        cmp     edi, eax
695
        jne     .name_not_coincide
695
        jne     .name_not_coincide
696
.done_1:
696
.done_1:
Line 706... Line 706...
706
; out: al=converted symbol
706
; out: al=converted symbol
707
        cmp     al, 'A'
707
        cmp     al, 'A'
708
        jb      .ret
708
        jb      .ret
709
        cmp     al, 'Z'
709
        cmp     al, 'Z'
710
        jbe     .az
710
        jbe     .az
711
        cmp     al, '€'
711
        cmp     al, 0x80 ; 'А'
712
        jb      .ret
712
        jb      .ret
713
        cmp     al, ''
713
        cmp     al, 0x90 ; 'Р'
714
        jb      .rus1
714
        jb      .rus1
715
        cmp     al, 'Ÿ'
715
        cmp     al, 0x9F ; 'Я'
716
        ja      .ret
716
        ja      .ret
717
; 0x90-0x9F -> 0xE0-0xEF
717
; 0x90-0x9F -> 0xE0-0xEF
718
        add     al, 'à'-''
718
        add     al, 0xE0-0x90
719
.ret:
719
.ret:
720
        ret
720
        ret
721
.rus1:
721
.rus1:
722
; 0x80-0x8F -> 0xA0-0xAF
722
; 0x80-0x8F -> 0xA0-0xAF
723
.az:
723
.az:
Line 742... Line 742...
742
        jb      .rus2
742
        jb      .rus2
743
.unk:
743
.unk:
744
        mov     al, '_'
744
        mov     al, '_'
745
        jmp     .doit
745
        jmp     .doit
746
.yo1:
746
.yo1:
747
        mov     al, 'ð'
747
        mov     al, 0xF0 ; 'Ё' in cp866
748
        jmp     .doit
748
        jmp     .doit
749
.yo2:
749
.yo2:
750
        mov     al, 'ñ'
750
        mov     al, 0xF1 ; 'ё' in cp866
751
        jmp     .doit
751
        jmp     .doit
752
.rus1:
752
.rus1:
753
; 0x410-0x43F -> 0x80-0xAF
753
; 0x410-0x43F -> 0x80-0xAF
754
        add     al, 0x70
754
        add     al, 0x70
755
        jmp     .doit
755
        jmp     .doit