Subversion Repositories Kolibri OS

Rev

Rev 3711 | Rev 4273 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3711 Rev 3742
Line 3... Line 3...
3
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 7... Line 7...
7
 
7
 
Line 8... Line 8...
8
$Revision: 3711 $
8
$Revision: 3742 $
9
 
9
 
10
ERROR_SUCCESS        = 0
10
ERROR_SUCCESS        = 0
11
ERROR_DISK_BASE      = 1
11
ERROR_DISK_BASE      = 1
Line 40... Line 40...
40
        dd      fs_OnFloppy
40
        dd      fs_OnFloppy
41
        dd      fs_NextFloppy
41
        dd      fs_NextFloppy
42
        db      10,'floppydisk'
42
        db      10,'floppydisk'
43
        dd      fs_OnFloppy
43
        dd      fs_OnFloppy
44
        dd      fs_NextFloppy
44
        dd      fs_NextFloppy
45
        db      3,'hd0'
-
 
46
        dd      fs_OnHd0
-
 
47
        dd      fs_NextHd0
-
 
48
        db      3,'hd1'
-
 
49
        dd      fs_OnHd1
-
 
50
        dd      fs_NextHd1
-
 
51
        db      3,'hd2'
-
 
52
        dd      fs_OnHd2
-
 
53
        dd      fs_NextHd2
-
 
54
        db      3,'hd3'
-
 
55
        dd      fs_OnHd3
-
 
56
        dd      fs_NextHd3
-
 
57
;**********************************************
45
;**********************************************
58
        db      3,'cd0'
46
        db      3,'cd0'
59
        dd      fs_OnCd0
47
        dd      fs_OnCd0
60
        dd      fs_NextCd
48
        dd      fs_NextCd
61
        db      3,'cd1'
49
        db      3,'cd1'
Line 74... Line 62...
74
virtual_root_query:
62
virtual_root_query:
75
        dd      fs_HasRamdisk
63
        dd      fs_HasRamdisk
76
        db      'rd',0
64
        db      'rd',0
77
        dd      fs_HasFloppy
65
        dd      fs_HasFloppy
78
        db      'fd',0
66
        db      'fd',0
79
        dd      fs_HasHd0
-
 
80
        db      'hd0',0
-
 
81
        dd      fs_HasHd1
-
 
82
        db      'hd1',0
-
 
83
        dd      fs_HasHd2
-
 
84
        db      'hd2',0
-
 
85
        dd      fs_HasHd3
-
 
86
        db      'hd3',0
-
 
87
;**********************************************
67
;**********************************************
88
        dd      fs_HasCd0
68
        dd      fs_HasCd0
89
        db      'cd0',0
69
        db      'cd0',0
90
        dd      fs_HasCd1
70
        dd      fs_HasCd1
91
        db      'cd1',0
71
        db      'cd1',0
Line 95... Line 75...
95
        db      'cd3',0
75
        db      'cd3',0
96
;**********************************************
76
;**********************************************
97
        dd      0
77
        dd      0
Line 98... Line 78...
98
 
78
 
99
fs_additional_handlers:
-
 
100
        dd      biosdisk_handler, biosdisk_enum_root
79
fs_additional_handlers:
101
        dd      dyndisk_handler, dyndisk_enum_root
80
        dd      dyndisk_handler, dyndisk_enum_root
102
; add new handlers here
81
; add new handlers here
Line 103... Line 82...
103
        dd      0
82
        dd      0
Line 521... Line 500...
521
        dd      0
500
        dd      0
522
        dd      fs_FloppyDelete
501
        dd      fs_FloppyDelete
523
        dd      fs_FloppyCreateFolder
502
        dd      fs_FloppyCreateFolder
524
fs_NumFloppyServices = ($ - fs_FloppyServices)/4
503
fs_NumFloppyServices = ($ - fs_FloppyServices)/4
Line 525... Line -...
525
 
-
 
526
fs_OnHd0:
-
 
527
        call    reserve_hd1
-
 
528
        mov     eax, [hd_address_table]
-
 
529
        mov     [hdbase], eax   ;0x1F0
-
 
530
        mov     [hdid], 0
-
 
531
        push    1
-
 
532
        jmp     fs_OnHd
-
 
533
fs_OnHd1:
-
 
534
        call    reserve_hd1
-
 
535
        mov     eax, [hd_address_table]
-
 
536
        mov     [hdbase], eax   ;0x1F0
-
 
537
        mov     [hdid], 0x10
-
 
538
        push    2
-
 
539
        jmp     fs_OnHd
-
 
540
fs_OnHd2:
-
 
541
        call    reserve_hd1
-
 
542
        mov     eax, [hd_address_table+16]
-
 
543
        mov     [hdbase], eax   ;0x170
-
 
544
        mov     [hdid], 0
-
 
545
        push    3
-
 
546
        jmp     fs_OnHd
-
 
547
fs_OnHd3:
-
 
548
        call    reserve_hd1
-
 
549
        mov     eax, [hd_address_table+16]
-
 
550
        mov     [hdbase], eax   ;0x170
-
 
551
        mov     [hdid], 0x10
-
 
552
        push    4
-
 
553
fs_OnHd:
-
 
554
        call    reserve_hd_channel
-
 
555
        pop     eax
-
 
556
        mov     [hdpos], eax
-
 
557
        cmp     ecx, 0x100
-
 
558
        jae     fs_OnHdAndBd.nf
-
 
559
        cmp     cl, [DRIVE_DATA+1+eax]
-
 
560
fs_OnHdAndBd:
-
 
561
        jbe     @f
-
 
562
.nf:
-
 
563
        call    free_hd_channel
-
 
564
        and     [hd1_status], 0
-
 
565
        mov     dword [image_of_eax], 5       ; not found
-
 
566
        ret
-
 
567
@@:
-
 
568
        mov     [known_part], ecx ;     mov     [fat32part], ecx
-
 
569
        push    ebx esi
-
 
570
        call    choice_necessity_partition_1
-
 
571
        pop     esi ebx
-
 
572
        mov     ecx, [ebx+12]
-
 
573
        mov     edx, [ebx+16]
-
 
574
    ;    add     edx, std_application_base_address
-
 
575
        mov     eax, [ebx]
-
 
576
        cmp     eax, fs_NumHdServices
-
 
577
        jae     .not_impl
-
 
578
        add     ebx, 4
-
 
579
        call    dword [fs_HdServices + eax*4]
-
 
580
        call    free_hd_channel
-
 
581
        and     [hd1_status], 0
-
 
582
        mov     [image_of_eax], eax
-
 
583
        mov     [image_of_ebx], ebx
-
 
584
        ret
-
 
585
.not_impl:
-
 
586
        call    free_hd_channel
-
 
587
        and     [hd1_status], 0
-
 
588
        mov     dword [image_of_eax], 2       ; not implemented
-
 
589
        ret
-
 
590
 
-
 
591
fs_HdServices:
-
 
592
        dd      fs_HdRead
-
 
593
        dd      fs_HdReadFolder
-
 
594
        dd      fs_HdRewrite
-
 
595
        dd      fs_HdWrite
-
 
596
        dd      fs_HdSetFileEnd
-
 
597
        dd      fs_HdGetFileInfo
-
 
598
        dd      fs_HdSetFileInfo
-
 
599
        dd      0
-
 
600
        dd      fs_HdDelete
-
 
601
        dd      fs_HdCreateFolder
-
 
602
fs_NumHdServices = ($ - fs_HdServices)/4
-
 
603
 
504
 
604
;*******************************************************
505
;*******************************************************
605
fs_OnCd0:
506
fs_OnCd0:
606
        call    reserve_cd
507
        call    reserve_cd
607
        mov     [ChannelNumber], 1
508
        mov     [ChannelNumber], 1
Line 689... Line 590...
689
        ret
590
        ret
690
fs_HasFloppy:
591
fs_HasFloppy:
691
        cmp     byte [DRIVE_DATA], 0
592
        cmp     byte [DRIVE_DATA], 0
692
        setnz   al
593
        setnz   al
693
        ret
594
        ret
694
fs_HasHd0:
-
 
695
        test    byte [DRIVE_DATA+1], 01000000b
-
 
696
        setnz   al
-
 
697
        ret
-
 
698
fs_HasHd1:
-
 
699
        test    byte [DRIVE_DATA+1], 00010000b
-
 
700
        setnz   al
-
 
701
        ret
-
 
702
fs_HasHd2:
-
 
703
        test    byte [DRIVE_DATA+1], 00000100b
-
 
704
        setnz   al
-
 
705
        ret
-
 
706
fs_HasHd3:
-
 
707
        test    byte [DRIVE_DATA+1], 00000001b
-
 
708
        setnz   al
-
 
709
        ret
-
 
Line 710... Line 595...
710
 
595
 
711
;*******************************************************
596
;*******************************************************
712
fs_HasCd0:
597
fs_HasCd0:
713
        test    byte [DRIVE_DATA+1], 10000000b
598
        test    byte [DRIVE_DATA+1], 10000000b
Line 760... Line 645...
760
        ret
645
        ret
761
.no2:
646
.no2:
762
        stc
647
        stc
763
        ret
648
        ret
Line 764... Line -...
764
 
-
 
765
; on hdx, we have partitions from 1 to [0x40002+x]
-
 
766
fs_NextHd0:
-
 
767
        push    0
-
 
768
        jmp     fs_NextHd
-
 
769
fs_NextHd1:
-
 
770
        push    1
-
 
771
        jmp     fs_NextHd
-
 
772
fs_NextHd2:
-
 
773
        push    2
-
 
774
        jmp     fs_NextHd
-
 
775
fs_NextHd3:
-
 
776
        push    3
-
 
777
fs_NextHd:
-
 
778
        pop     ecx
-
 
779
        movzx   ecx, byte [DRIVE_DATA+2+ecx]
-
 
780
        cmp     eax, ecx
-
 
781
        jae     fs_NextFloppy.no2
-
 
782
        inc     eax
-
 
783
        clc
-
 
784
        ret
-
 
785
 
649
 
786
;*******************************************************
650
;*******************************************************
787
fs_NextCd:
651
fs_NextCd:
788
; we always have /cdX/1
652
; we always have /cdX/1
789
        test    eax, eax
653
        test    eax, eax
Line 793... Line 657...
793
        clc
657
        clc
794
@@:
658
@@:
795
        ret
659
        ret
796
;*******************************************************
660
;*******************************************************
Line 797... Line -...
797
 
-
 
798
; Additional FS handlers.
-
 
799
; This handler gets the control each time when fn 70 is called
-
 
800
; with unknown item of root subdirectory.
-
 
801
; in: esi -> name
-
 
802
;     ebp = 0 or rest of name relative to esi
-
 
803
; out: if the handler processes path, he must not return in file_system_lfn,
-
 
804
;      but instead pop return address and return directly to the caller
-
 
805
;      otherwise simply return
-
 
806
 
-
 
807
; here we test for /bd/... - BIOS disks
-
 
808
biosdisk_handler:
-
 
809
        cmp     [NumBiosDisks], 0
-
 
810
        jz      .ret
-
 
811
        mov     al, [esi]
-
 
812
        or      al, 20h
-
 
813
        cmp     al, 'b'
-
 
814
        jnz     .ret
-
 
815
        mov     al, [esi+1]
-
 
816
        or      al, 20h
-
 
817
        cmp     al, 'd'
-
 
818
        jnz     .ret
-
 
819
        push    esi
-
 
820
        inc     esi
-
 
821
        inc     esi
-
 
822
        cmp     byte [esi], '0'
-
 
823
        jb      .ret2
-
 
824
        cmp     byte [esi], '9'
-
 
825
        ja      .ret2
-
 
826
        xor     edx, edx
-
 
827
@@:
-
 
828
        lodsb
-
 
829
        test    al, al
-
 
830
        jz      .ok
-
 
831
        cmp     al, '/'
-
 
832
        jz      .ok
-
 
833
        sub     al, '0'
-
 
834
        cmp     al, 9
-
 
835
        ja      .ret2
-
 
836
        lea     edx, [edx*5]
-
 
837
        lea     edx, [edx*2+eax]
-
 
838
        jmp     @b
-
 
839
.ret2:
-
 
840
        pop     esi
-
 
841
.ret:
-
 
842
        ret
-
 
843
.ok:
-
 
844
        cmp     al, '/'
-
 
845
        jz      @f
-
 
846
        dec     esi
-
 
847
@@:
-
 
848
        add     dl, 80h
-
 
849
        xor     ecx, ecx
-
 
850
@@:
-
 
851
        cmp     dl, [BiosDisksData+ecx*4]
-
 
852
        jz      .ok2
-
 
853
        inc     ecx
-
 
854
        cmp     ecx, [NumBiosDisks]
-
 
855
        jb      @b
-
 
856
        jmp     .ret2
-
 
857
.ok2:
-
 
858
        add     esp, 8
-
 
859
        test    al, al
-
 
860
        jnz     @f
-
 
861
        mov     esi, fs_BdNext
-
 
862
        jmp     file_system_lfn.maindir_noesi
-
 
863
@@:
-
 
864
        push    ecx
-
 
865
        push    ecx
-
 
866
        push    biosdisk_cleanup
-
 
867
        push    fs_OnBd
-
 
868
        mov     edi, esp
-
 
869
        jmp     file_system_lfn.found2
-
 
870
 
-
 
871
fs_BdNext:
-
 
872
        cmp     eax, [BiosDiskPartitions+ecx*4]
-
 
873
        inc     eax
-
 
874
        cmc
-
 
875
biosdisk_cleanup:
-
 
876
        ret
-
 
877
 
-
 
878
fs_OnBd:
-
 
879
        pop     edx edx edx edx
-
 
880
; edx = disk number, ecx = partition number
-
 
881
; esi+ebp = name
-
 
882
        call    reserve_hd1
-
 
883
        add     edx, 0x80
-
 
884
        mov     [hdpos], edx
-
 
885
        cmp     ecx, [BiosDiskPartitions+(edx-0x80)*4]
-
 
886
        jmp     fs_OnHdAndBd
-
 
887
 
-
 
888
; This handler is called when virtual root is enumerated
-
 
889
; and must return all items which can be handled by this.
-
 
890
; It is called several times, first time with eax=0
-
 
891
; in: eax = 0 for first call, previously returned value for subsequent calls
-
 
892
; out: eax = 0 => no more items
-
 
893
;      eax != 0 => buffer pointed to by edi contains name of item
-
 
894
 
-
 
895
; here we enumerate existing BIOS disks /bd
-
 
896
biosdisk_enum_root:
-
 
897
        cmp     eax, [NumBiosDisks]
-
 
898
        jae     .end
-
 
899
        push    eax
-
 
900
        movzx   eax, byte [BiosDisksData+eax*4]
-
 
901
        sub     al, 80h
-
 
902
        push    eax
-
 
903
        mov     al, 'b'
-
 
904
        stosb
-
 
905
        mov     al, 'd'
-
 
906
        stosb
-
 
907
        pop     eax
-
 
908
        cmp     al, 10
-
 
909
        jae     .big
-
 
910
        add     al, '0'
-
 
911
        stosb
-
 
912
        mov     byte [edi], 0
-
 
913
        pop     eax
-
 
914
        inc     eax
-
 
915
        ret
-
 
916
.end:
-
 
917
        xor     eax, eax
-
 
918
        ret
-
 
919
.big:
-
 
920
        push    ecx edx
-
 
921
        push    -'0'
-
 
922
        mov     ecx, 10
-
 
923
@@:
-
 
924
        xor     edx, edx
-
 
925
        div     ecx
-
 
926
        push    edx
-
 
927
        test    eax, eax
-
 
928
        jnz     @b
-
 
929
        xchg    eax, edx
-
 
930
@@:
-
 
931
        pop     eax
-
 
932
        add     al, '0'
-
 
933
        stosb
-
 
934
        jnz     @b
-
 
935
        pop     edx ecx
-
 
936
        pop     eax
-
 
937
        inc     eax
-
 
938
        ret
661
 
939
;-----------------------------------------------------------------------------
662
;-----------------------------------------------------------------------------
940
process_replace_file_name:
663
process_replace_file_name:
941
; in
664
; in
942
; esi - path with filename(f.70)
665
; esi - path with filename(f.70)