Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
425 victor 1
$Revision: 520 $
431 serge 2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3
;;                                                              ;;
4
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
5
;; Distributed under terms of the GNU General Public License    ;;
6
;;                                                              ;;
7
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8
 
488 spraid 9
image_of_eax EQU esp+44 ;36
10
image_of_ebx EQU esp+32 ;24
11
 
72 diamond 12
; System function 70 - files with long names (LFN)
71 diamond 13
; diamond, 2006
14
 
15
iglobal
16
; in this table names must be in lowercase
17
rootdirs:
75 diamond 18
        db      2,'rd'
19
        dd      fs_OnRamdisk
20
        dd      fs_NextRamdisk
21
        db      7,'ramdisk'
22
        dd      fs_OnRamdisk
23
        dd      fs_NextRamdisk
24
        db      2,'fd'
25
        dd      fs_OnFloppy
26
        dd      fs_NextFloppy
27
        db      10,'floppydisk'
28
        dd      fs_OnFloppy
29
        dd      fs_NextFloppy
30
        db      3,'hd0'
31
        dd      fs_OnHd0
32
        dd      fs_NextHd0
33
        db      3,'hd1'
34
        dd      fs_OnHd1
35
        dd      fs_NextHd1
36
        db      3,'hd2'
37
        dd      fs_OnHd2
38
        dd      fs_NextHd2
39
        db      3,'hd3'
40
        dd      fs_OnHd3
41
        dd      fs_NextHd3
87 mario79 42
;**********************************************
43
        db      3,'cd0'
44
        dd      fs_OnCd0
45
        dd      fs_NextCd
46
        db      3,'cd1'
47
        dd      fs_OnCd1
48
        dd      fs_NextCd
49
        db      3,'cd2'
50
        dd      fs_OnCd2
51
        dd      fs_NextCd
52
        db      3,'cd3'
53
        dd      fs_OnCd3
54
        dd      fs_NextCd
237 serge 55
;***********************************************
75 diamond 56
        db      0
57
 
87 mario79 58
 
75 diamond 59
virtual_root_query:
60
        dd      fs_HasRamdisk
78 diamond 61
        db      'rd',0
75 diamond 62
        dd      fs_HasFloppy
78 diamond 63
        db      'fd',0
75 diamond 64
        dd      fs_HasHd0
78 diamond 65
        db      'hd0',0
75 diamond 66
        dd      fs_HasHd1
78 diamond 67
        db      'hd1',0
75 diamond 68
        dd      fs_HasHd2
78 diamond 69
        db      'hd2',0
75 diamond 70
        dd      fs_HasHd3
78 diamond 71
        db      'hd3',0
87 mario79 72
;**********************************************
73
        dd      fs_HasCd0
74
        db      'cd0',0
75
        dd      fs_HasCd1
76
        db      'cd1',0
77
        dd      fs_HasCd2
78
        db      'cd2',0
79
        dd      fs_HasCd3
80
        db      'cd3',0
81
;**********************************************
75 diamond 82
        dd      0
71 diamond 83
endg
84
 
488 spraid 85
end_of_file_system_lfn:
86
		pop edx
520 serge 87
                stdcall kernel_free, edx
488 spraid 88
		ret
89
 
90
 
71 diamond 91
file_system_lfn:
92
; in: eax->fileinfo block
93
; operation codes:
72 diamond 94
; 0 : read file
75 diamond 95
; 1 : read folder
83 diamond 96
; 2 : create/rewrite file
133 diamond 97
; 3 : write/append to file
98
; 4 : set end of file
86 diamond 99
; 5 : get file/directory attributes structure
100
; 6 : set file/directory attributes structure
91 diamond 101
; 7 : start application
171 diamond 102
; 8 : delete file
321 diamond 103
; 9 : create directory
71 diamond 104
 
488 spraid 105
		; замена адреса возврата
520 serge 106
                push    eax
488 spraid 107
		stdcall kernel_alloc, 200
520 serge 108
                mov     edx,eax
109
                pop     eax
110
 
488 spraid 111
		push	edx
112
		push	end_of_file_system_lfn
520 serge 113
                mov     ebx,edx
488 spraid 114
 
520 serge 115
                mov     ecx, [eax]
116
                mov     [ebx],ecx
488 spraid 117
 
520 serge 118
                add     ebx,4
119
                mov     ecx, [eax+4]
120
                mov     [ebx],ecx
488 spraid 121
 
520 serge 122
                add     ebx,4
123
                mov     ecx, [eax+8]
124
                mov     [ebx],ecx
488 spraid 125
 
520 serge 126
                add     ebx,4
127
                mov     ecx, [eax+12]
128
                mov     [ebx],ecx
488 spraid 129
 
520 serge 130
                add     ebx,4
131
                mov     ecx, [eax+16]
132
                mov     [ebx],ecx
133
 
134
                add     ebx,4
488 spraid 135
		push	edx	  ; !!!!!!!!!!!!!!!!!!!
136
		; eax - yначало старого пакета
137
		; edx - начало нового пакета
520 serge 138
		; ebx - куда ложить строку
488 spraid 139
		add		eax,20
140
		mov		cl,	[eax]
141
		test	cl,cl
142
		jnz		@f
143
		mov		eax,[eax+1]
144
@@:
145
		stdcall full_file_name,eax,ebx
146
		pop		eax
147
 
148
 
520 serge 149
 
465 serge 150
   ;     add     eax, std_application_base_address
71 diamond 151
; parse file name
75 diamond 152
        xchg    ebx, eax
153
        lea     esi, [ebx+20]
91 diamond 154
        mov     ebp, esi        ; for 'start app' function full path must be known
75 diamond 155
        lodsb
84 diamond 156
        test    al, al
157
        jnz     @f
158
        mov     esi, [esi]
465 serge 159
  ;      add     esi, std_application_base_address
91 diamond 160
        mov     ebp, esi
84 diamond 161
        lodsb
162
@@:
237 serge 163
        cmp dword [ebx], 7
164
        jne @F
165
        mov edx, [ebx+4]
166
        mov ebx, [ebx+8]
167
        test ebx, ebx
168
        jz .l1
465 serge 169
    ;    add ebx, new_app_base
237 serge 170
.l1:
171
        call fs_execute  ; ebp, ebx, edx
488 spraid 172
        mov [image_of_eax], eax
237 serge 173
        ret
174
@@:
75 diamond 175
        cmp     al, '/'
176
        jz      @f
71 diamond 177
.notfound:
488 spraid 178
        mov     dword [image_of_eax], 5       ; file not found
75 diamond 179
        ret
71 diamond 180
@@:
75 diamond 181
        cmp     byte [esi], 0
182
        jz      .rootdir
183
        mov     edi, rootdirs-8
184
        xor     ecx, ecx
185
        push    esi
71 diamond 186
.scan1:
75 diamond 187
        pop     esi
188
        add     edi, ecx
189
        scasd
190
        scasd
191
        mov     cl, byte [edi]
192
        jecxz   .notfound
193
        inc     edi
194
        push    esi
71 diamond 195
@@:
75 diamond 196
        lodsb
197
        or      al, 20h
198
        scasb
199
        loopz   @b
200
        jnz     .scan1
201
        lodsb
202
        cmp     al, '/'
203
        jz      .found1
204
        test    al, al
205
        jnz     .scan1
206
        pop     eax
71 diamond 207
; directory /xxx
208
.maindir:
75 diamond 209
        cmp     dword [ebx], 1
210
        jnz     .access_denied
211
        xor     eax, eax
212
        mov     ebp, [ebx+12]
213
        mov     edx, [ebx+16]
465 serge 214
    ;    add     edx, std_application_base_address
78 diamond 215
        push    dword [ebx+4]   ; first block
216
        mov     ebx, [ebx+8]    ; flags
75 diamond 217
        mov     esi, [edi+4]
78 diamond 218
; ebx=flags, [esp]=first block, ebp=number of blocks, edx=return area, esi='Next' handler
75 diamond 219
        mov     edi, edx
220
        mov     ecx, 32/4
221
        rep     stosd
222
        mov     byte [edx], 1   ; version
223
.maindir_loop:
224
        call    esi
225
        jc      .maindir_done
226
        inc     dword [edx+8]
78 diamond 227
        dec     dword [esp]
75 diamond 228
        jns     .maindir_loop
229
        dec     ebp
230
        js      .maindir_loop
231
        inc     dword [edx+4]
232
        mov     dword [edi], 0x10       ; attributes: folder
233
        mov     dword [edi+4], 1        ; name type: UNICODE
234
        push    eax
235
        xor     eax, eax
236
        add     edi, 8
237
        mov     ecx, 40/4-2
238
        rep     stosd
239
        pop     eax
240
        push    eax edx
241
; convert number in eax to decimal UNICODE string
242
        push    edi
243
        push    -'0'
244
        mov     cl, 10
245
@@:
246
        xor     edx, edx
247
        div     ecx
248
        push    edx
249
        test    eax, eax
250
        jnz     @b
251
@@:
252
        pop     eax
253
        add     al, '0'
78 diamond 254
        stosb
255
        test    bl, 1           ; UNICODE name?
256
        jz      .ansi2
257
        mov     byte [edi], 0
258
        inc     edi
259
.ansi2:
260
        test    al, al
75 diamond 261
        jnz     @b
262
        mov     byte [edi-1], 0
263
        pop     edi
78 diamond 264
; UNICODE name length is 520 bytes, ANSI - 264
75 diamond 265
        add     edi, 520
78 diamond 266
        test    bl, 1
267
        jnz     @f
268
        sub     edi, 520-264
269
@@:
75 diamond 270
        pop     edx eax
271
        jmp     .maindir_loop
272
.maindir_done:
78 diamond 273
        pop     eax
274
        mov     ebx, [edx+4]
75 diamond 275
        xor     eax, eax
276
        dec     ebp
277
        js      @f
278
        mov     al, ERROR_END_OF_FILE
279
@@:
488 spraid 280
        mov     [image_of_eax], eax
281
        mov     [image_of_ebx], ebx
75 diamond 282
        ret
71 diamond 283
; directory /
284
.rootdir:
75 diamond 285
        cmp     dword [ebx], 1  ; read folder?
286
        jz      .readroot
287
.access_denied:
488 spraid 288
        mov     dword [image_of_eax], 10      ; access denied
75 diamond 289
        ret
71 diamond 290
 
75 diamond 291
.readroot:
292
; virtual root folder - special handler
293
        mov     esi, virtual_root_query
294
        mov     ebp, [ebx+12]
295
        mov     edx, [ebx+16]
465 serge 296
    ;    add     edx, std_application_base_address
78 diamond 297
        push    dword [ebx+4]   ; first block
298
        mov     ebx, [ebx+8]    ; flags
75 diamond 299
        xor     eax, eax
78 diamond 300
; eax=0, [esp]=first block, ebx=flags, ebp=number of blocks, edx=return area
75 diamond 301
        mov     edi, edx
302
        mov     ecx, 32/4
303
        rep     stosd
304
        mov     byte [edx], 1   ; version
305
.readroot_loop:
306
        cmp     dword [esi], eax
307
        jz      .readroot_done
308
        call    dword [esi]
309
        add     esi, 4
310
        test    eax, eax
311
        jnz     @f
312
.readroot_next:
313
        or      ecx, -1
314
        xchg    esi, edi
78 diamond 315
        repnz   scasb
75 diamond 316
        xchg    esi, edi
317
        jmp     .readroot_loop
318
@@:
319
        xor     eax, eax
320
        inc     dword [edx+8]
78 diamond 321
        dec     dword [esp]
75 diamond 322
        jns     .readroot_next
323
        dec     ebp
324
        js      .readroot_next
325
        inc     dword [edx+4]
326
        mov     dword [edi], 0x10       ; attributes: folder
327
        mov     dword [edi+4], 1        ; name type: UNICODE
328
        add     edi, 8
329
        mov     ecx, 40/4-2
330
        rep     stosd
331
        push    edi
332
@@:
78 diamond 333
        lodsb
334
        stosb
335
        test    bl, 1
336
        jz      .ansi
337
        mov     byte [edi], 0
338
        inc     edi
339
.ansi:
75 diamond 340
        test    eax, eax
341
        jnz     @b
342
        pop     edi
343
        add     edi, 520
78 diamond 344
        test    bl, 1
345
        jnz     .readroot_loop
346
        sub     edi, 520-264
75 diamond 347
        jmp     .readroot_loop
348
.readroot_done:
78 diamond 349
        pop     eax
350
        mov     ebx, [edx+4]
75 diamond 351
        xor     eax, eax
352
        dec     ebp
353
        js      @f
354
        mov     al, ERROR_END_OF_FILE
355
@@:
488 spraid 356
        mov     [image_of_eax], eax
357
        mov     [image_of_ebx], ebx
75 diamond 358
        ret
359
 
71 diamond 360
.found1:
75 diamond 361
        pop     eax
362
        cmp     byte [esi], 0
363
        jz      .maindir
71 diamond 364
; read partition number
75 diamond 365
        xor     ecx, ecx
366
        xor     eax, eax
71 diamond 367
@@:
75 diamond 368
        lodsb
369
        cmp     al, '/'
370
        jz      .done1
371
        test    al, al
372
        jz      .done1
373
        sub     al, '0'
374
        cmp     al, 9
375
        ja      .notfound
376
        imul    ecx, 10
377
        add     ecx, eax
378
        jmp     @b
71 diamond 379
.done1:
75 diamond 380
        test    ecx, ecx
381
        jz      .notfound
382
        test    al, al
383
        jnz     @f
384
        dec     esi
71 diamond 385
@@:
75 diamond 386
; now [edi] contains handler address, ecx - partition number,
387
; esi points to ASCIIZ string - rest of name
388
        jmp     dword [edi]
71 diamond 389
 
390
; handlers for devices
75 diamond 391
; in: ecx = 0 => query virtual directory /xxx
71 diamond 392
; in: ecx = partition number
393
;     esi -> relative (for device) name
394
;     ebx -> fileinfo
488 spraid 395
; out: [image_of_eax]=image of eax, [image_of_ebx]=image of ebx
71 diamond 396
 
397
fs_OnRamdisk:
75 diamond 398
        cmp     ecx, 1
399
        jnz     file_system_lfn.notfound
400
        mov     eax, [ebx]
83 diamond 401
        cmp     eax, fs_NumRamdiskServices
402
        jae     .not_impl
75 diamond 403
        mov     ecx, [ebx+12]
404
        mov     edx, [ebx+16]
465 serge 405
   ;     add     edx, std_application_base_address
75 diamond 406
        add     ebx, 4
407
        call    dword [fs_RamdiskServices + eax*4]
488 spraid 408
        mov     [image_of_eax], eax
409
        mov     [image_of_ebx], ebx
75 diamond 410
        ret
71 diamond 411
.not_impl:
488 spraid 412
        mov     dword [image_of_eax], 2       ; not implemented
75 diamond 413
        ret
71 diamond 414
 
86 diamond 415
fs_NotImplemented:
416
        mov     eax, 2
417
        ret
418
 
71 diamond 419
fs_RamdiskServices:
75 diamond 420
        dd      fs_RamdiskRead
421
        dd      fs_RamdiskReadFolder
83 diamond 422
        dd      fs_RamdiskRewrite
131 diamond 423
        dd      fs_RamdiskWrite
133 diamond 424
        dd      fs_RamdiskSetFileEnd
86 diamond 425
        dd      fs_RamdiskGetFileInfo
426
        dd      fs_RamdiskSetFileInfo
321 diamond 427
        dd      0 ;fs_RamdiskExecute
171 diamond 428
        dd      fs_RamdiskDelete
321 diamond 429
        dd      fs_RamdiskCreateFolder
83 diamond 430
fs_NumRamdiskServices = ($ - fs_RamdiskServices)/4
71 diamond 431
 
432
fs_OnFloppy:
75 diamond 433
        cmp     ecx, 2
434
        ja      file_system_lfn.notfound
435
        mov     eax, [ebx]
83 diamond 436
        cmp     eax, fs_NumFloppyServices
437
        jae     fs_OnRamdisk.not_impl
75 diamond 438
        call    reserve_flp
439
        mov     [flp_number], cl
440
        mov     ecx, [ebx+12]
441
        mov     edx, [ebx+16]
465 serge 442
   ;     add     edx, std_application_base_address
75 diamond 443
        add     ebx, 4
444
        call    dword [fs_FloppyServices + eax*4]
445
        and     [flp_status], 0
488 spraid 446
        mov     [image_of_eax], eax
447
        mov     [image_of_ebx], ebx
75 diamond 448
        ret
71 diamond 449
 
450
fs_FloppyServices:
75 diamond 451
        dd      fs_FloppyRead
452
        dd      fs_FloppyReadFolder
83 diamond 453
        dd      fs_FloppyRewrite
131 diamond 454
        dd      fs_FloppyWrite
133 diamond 455
        dd      fs_FloppySetFileEnd
86 diamond 456
        dd      fs_FloppyGetFileInfo
457
        dd      fs_FloppySetFileInfo
321 diamond 458
        dd      0 ;fs_FloppyExecute
171 diamond 459
        dd      fs_FloppyDelete
321 diamond 460
        dd      fs_FloppyCreateFolder
83 diamond 461
fs_NumFloppyServices = ($ - fs_FloppyServices)/4
71 diamond 462
 
463
fs_OnHd0:
75 diamond 464
        call    reserve_hd1
465
        mov     [hdbase], 0x1F0
466
        mov     [hdid], 0
467
        push    1
468
        jmp     fs_OnHd
71 diamond 469
fs_OnHd1:
75 diamond 470
        call    reserve_hd1
471
        mov     [hdbase], 0x1F0
472
        mov     [hdid], 0x10
473
        push    2
474
        jmp     fs_OnHd
71 diamond 475
fs_OnHd2:
75 diamond 476
        call    reserve_hd1
477
        mov     [hdbase], 0x170
478
        mov     [hdid], 0
479
        push    3
480
        jmp     fs_OnHd
71 diamond 481
fs_OnHd3:
75 diamond 482
        call    reserve_hd1
483
        mov     [hdbase], 0x170
484
        mov     [hdid], 0x10
485
        push    4
71 diamond 486
fs_OnHd:
95 mario79 487
        call    reserve_hd_channel
75 diamond 488
        pop     eax
489
        mov     [hdpos], eax
490
        cmp     ecx, 0x100
491
        jae     .nf
422 serge 492
        cmp     cl, [DRIVE_DATA+1+eax]
75 diamond 493
        jbe     @f
494
.nf:
95 mario79 495
        call    free_hd_channel
75 diamond 496
        and     [hd1_status], 0
488 spraid 497
        mov     dword [image_of_eax], 5       ; not found
75 diamond 498
        ret
71 diamond 499
@@:
75 diamond 500
        mov     [fat32part], ecx
501
        push    ebx esi
502
        call    choice_necessity_partition_1
503
        pop     esi ebx
504
        mov     ecx, [ebx+12]
505
        mov     edx, [ebx+16]
465 serge 506
    ;    add     edx, std_application_base_address
75 diamond 507
        mov     eax, [ebx]
83 diamond 508
        cmp     eax, fs_NumHdServices
509
        jae     .not_impl
75 diamond 510
        add     ebx, 4
511
        call    dword [fs_HdServices + eax*4]
95 mario79 512
        call    free_hd_channel
75 diamond 513
        and     [hd1_status], 0
488 spraid 514
        mov     [image_of_eax], eax
515
        mov     [image_of_ebx], ebx
75 diamond 516
        ret
517
.not_impl:
95 mario79 518
        call    free_hd_channel
75 diamond 519
        and     [hd1_status], 0
488 spraid 520
        mov     dword [image_of_eax], 2       ; not implemented
75 diamond 521
        ret
71 diamond 522
 
523
fs_HdServices:
75 diamond 524
        dd      fs_HdRead
525
        dd      fs_HdReadFolder
83 diamond 526
        dd      fs_HdRewrite
131 diamond 527
        dd      fs_HdWrite
133 diamond 528
        dd      fs_HdSetFileEnd
86 diamond 529
        dd      fs_HdGetFileInfo
530
        dd      fs_HdSetFileInfo
256 diamond 531
        dd      0 ;fs_HdExecute
171 diamond 532
        dd      fs_HdDelete
321 diamond 533
        dd      fs_HdCreateFolder
83 diamond 534
fs_NumHdServices = ($ - fs_HdServices)/4
75 diamond 535
 
87 mario79 536
;*******************************************************
537
fs_OnCd0:
538
        call    reserve_cd
539
        mov  [ChannelNumber],1
540
        mov  [DiskNumber],0
541
        push    6
542
        jmp     fs_OnCd
543
fs_OnCd1:
544
        call    reserve_cd
545
        mov  [ChannelNumber],1
546
        mov  [DiskNumber],1
547
        push    4
548
        jmp     fs_OnCd
549
fs_OnCd2:
550
        call    reserve_cd
551
        mov  [ChannelNumber],2
552
        mov  [DiskNumber],0
553
        push    2
554
        jmp     fs_OnCd
555
fs_OnCd3:
556
        call    reserve_cd
557
        mov  [ChannelNumber],2
558
        mov  [DiskNumber],1
559
        push    0
560
fs_OnCd:
95 mario79 561
        call    reserve_cd_channel
87 mario79 562
        pop     eax
563
        mov     [hdpos], eax
564
        cmp     ecx, 0x100
565
        jae     .nf
133 diamond 566
        push    ecx ebx
87 mario79 567
        mov     cl,al
389 serge 568
        mov     bl,[DRIVE_DATA+1]
87 mario79 569
        shr     bl,cl
570
        test    bl,2
133 diamond 571
        pop     ebx ecx
87 mario79 572
 
573
        jnz     @f
574
.nf:
95 mario79 575
        call    free_cd_channel
87 mario79 576
        and    [cd_status], 0
488 spraid 577
        mov     dword [image_of_eax], 5       ; not found
87 mario79 578
        ret
579
@@:
580
        mov     ecx, [ebx+12]
581
        mov     edx, [ebx+16]
465 serge 582
    ;    add     edx, std_application_base_address
87 mario79 583
        mov     eax, [ebx]
90 mario79 584
        cmp     eax,fs_NumCdServices
585
        jae      .not_impl
87 mario79 586
        add     ebx, 4
587
        call    dword [fs_CdServices + eax*4]
95 mario79 588
        call    free_cd_channel
87 mario79 589
        and     [cd_status], 0
488 spraid 590
        mov     [image_of_eax], eax
591
        mov     [image_of_ebx], ebx
87 mario79 592
        ret
593
.not_impl:
95 mario79 594
        call    free_cd_channel
89 diamond 595
        and     [cd_status], 0
488 spraid 596
        mov     dword [image_of_eax], 2       ; not implemented
87 mario79 597
        ret
598
 
599
fs_CdServices:
600
        dd      fs_CdRead
601
        dd      fs_CdReadFolder
90 mario79 602
        dd      fs_NotImplemented
603
        dd      fs_NotImplemented
604
        dd      fs_NotImplemented
605
        dd      fs_CdGetFileInfo
606
        dd      fs_NotImplemented
94 mario79 607
        dd      fs_CdExecute
90 mario79 608
fs_NumCdServices = ($ - fs_CdServices)/4
609
 
87 mario79 610
;*******************************************************
611
 
75 diamond 612
fs_HasRamdisk:
613
        mov     al, 1   ; we always have ramdisk
614
        ret
615
 
616
fs_HasFloppy:
381 serge 617
        cmp     byte [DRIVE_DATA], 0
75 diamond 618
        setnz   al
619
        ret
620
 
621
fs_HasHd0:
381 serge 622
        mov     al, [DRIVE_DATA+1]
75 diamond 623
        and     al, 11000000b
624
        cmp     al, 01000000b
625
        setz    al
626
        ret
627
fs_HasHd1:
381 serge 628
        mov     al, [DRIVE_DATA+1]
75 diamond 629
        and     al, 00110000b
630
        cmp     al, 00010000b
631
        setz    al
632
        ret
633
fs_HasHd2:
381 serge 634
        mov     al, [DRIVE_DATA+1]
75 diamond 635
        and     al, 00001100b
636
        cmp     al, 00000100b
637
        setz    al
638
        ret
639
fs_HasHd3:
381 serge 640
        mov     al, [DRIVE_DATA+1]
75 diamond 641
        and     al, 00000011b
642
        cmp     al, 00000001b
643
        setz    al
644
        ret
645
 
87 mario79 646
;*******************************************************
647
fs_HasCd0:
381 serge 648
        mov     al, [DRIVE_DATA+1]
87 mario79 649
        and     al, 11000000b
650
        cmp     al, 10000000b
651
        setz    al
652
        ret
653
fs_HasCd1:
381 serge 654
        mov     al, [DRIVE_DATA+1]
87 mario79 655
        and     al, 00110000b
656
        cmp     al, 00100000b
657
        setz    al
658
        ret
659
fs_HasCd2:
381 serge 660
        mov     al, [DRIVE_DATA+1]
87 mario79 661
        and     al, 00001100b
662
        cmp     al, 00001000b
663
        setz    al
664
        ret
665
fs_HasCd3:
381 serge 666
        mov     al, [DRIVE_DATA+1]
87 mario79 667
        and     al, 00000011b
668
        cmp     al, 00000010b
669
        setz    al
670
        ret
237 serge 671
;*******************************************************
87 mario79 672
 
75 diamond 673
; fs_NextXXX functions:
674
; in: eax = partition number, from which start to scan
675
; out: CF=1 => no more partitions
676
;      CF=0 => eax=next partition number
677
 
678
fs_NextRamdisk:
679
; we always have /rd/1
680
        test    eax, eax
681
        stc
682
        jnz     @f
683
        mov     al, 1
684
        clc
685
@@:
686
        ret
687
 
688
fs_NextFloppy:
381 serge 689
; we have /fd/1 iff (([DRIVE_DATA] and 0xF0) != 0) and /fd/2 iff (([DRIVE_DATA] and 0x0F) != 0)
690
        test    byte [DRIVE_DATA], 0xF0
75 diamond 691
        jz      .no1
692
        test    eax, eax
693
        jnz     .no1
694
        inc     eax
695
        ret     ; CF cleared
696
.no1:
381 serge 697
        test    byte [DRIVE_DATA], 0x0F
75 diamond 698
        jz      .no2
699
        cmp     al, 2
700
        jae     .no2
701
        mov     al, 2
702
        clc
703
        ret
704
.no2:
705
        stc
706
        ret
707
 
708
; on hdx, we have partitions from 1 to [0x40002+x]
709
fs_NextHd0:
710
        push    0
711
        jmp     fs_NextHd
712
fs_NextHd1:
713
        push    1
714
        jmp     fs_NextHd
715
fs_NextHd2:
716
        push    2
717
        jmp     fs_NextHd
718
fs_NextHd3:
719
        push    3
720
fs_NextHd:
721
        pop     ecx
381 serge 722
        movzx   ecx, byte [DRIVE_DATA+2+ecx]
75 diamond 723
        cmp     eax, ecx
724
        jae     fs_NextFloppy.no2
725
        inc     eax
726
        clc
727
        ret
237 serge 728
 
87 mario79 729
;*******************************************************
730
fs_NextCd:
731
; we always have /cdX/1
732
        test    eax, eax
733
        stc
734
        jnz     @f
735
        mov     al, 1
736
        clc
737
@@:
738
        ret
739
;*******************************************************
740