Subversion Repositories Kolibri OS

Rev

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

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