Subversion Repositories Kolibri OS

Rev

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

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