Subversion Repositories Kolibri OS

Rev

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

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