Subversion Repositories Kolibri OS

Rev

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

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