        TTL     > FS35 : Filing system commands

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

dir_star
lib_star
access_star
create_star
rename_star
i_star
dismount_star
mount_star
title_star
cdir_star
back_star
bye_star
compact_star
        LDXY    cliptr          ; Pass whole command to Arthur
        =       ar_cli
        CLC                     ; Finished processing
        RTS

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; In    cliptr, Y -> object to remove

remove_star ROUT

        LDXIM   1
        BRA     #FT10

; .............................................................................
; In    cliptr, Y -> object to delete

delete_star ; NOROUT

        LDXIM   0

10      PHX

        JSR     AddYXCliPtrY

20      STXY    fil_name

        LDAIM   6               ; OSFile_Delete
        GENAD   fil_blk
        =       ar_file
        TAY
        BNE     #FT90           ; [deleted an object]

        TSX                     ; Delete/Remove ?
        LDAAX   stack
        BEQ     #FT95           ; [delete op gives error if nothing deleted]

90      PLX

        CLC                     ; Finished processing
        RTS


95      JMP     qNotFound


; .............................................................................

del_d_star ; NOROUT

        LDXIM   0

        PHX

        JSR     AddYXCliPtrY

        JSR     GetDFSName
        BRA     #BA20

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; In    cliptr, Y -> name for info

info_star ROUT

        JSR     AddYXCliPtrY
        STXY    fil_name

        LDAIM   5               ; OSFile_ReadInfo
        GENAD   fil_blk
        =       ar_file
        TAY
        BEQ     #FT95           ; [not found]

        LDXY    fil_name
        JSR     infoprint

        JSR     osnewl

        CLC                     ; Finished processing
        RTS


95      JMP     qNotFound

; .............................................................................

info_d_star ; NOROUT

        JSR     AddYXCliPtrY

        JSR     GetDFSName
        STXY    fil_name

        LDA     dfsname+2
        JSR     mkdfschar       ; Back to DFS format
        STA     tmpdir

        LDAIM   5               ; OSFile_ReadInfo
        GENAD   fil_blk
        =       ar_file
        TAY
        BEQ     #BT95           ; [not found]

        LDXY    fil_name        ; Skip '0.'
        INX
        BNE     #FT10
        INY
10      INX
        BNE     #FT15
        INY                     ; YX -> 'afoo'

15      JSR     infoprint

        JSR     osnewl

        CLC                     ; Finished processing
        RTS

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; In    cliptr, Y -> name for ex (see also FSCat code)

ex_d_star ROUT

        LDA     dfsdir
        STA     tmpdir
        LDA     dfsdrive
        STA     tmpdrive

        LDAIY   cliptr
        CMPIM   space
        BCC     #FT03           ; [no arg, use current drive and dir]

        CMPIM   ":"
        BNE     #FT02           ; [no drive spec]

        INY
        LDAIY   cliptr
        JSR     chkdrive
        STA     tmpdrive

        INY
        LDAIY   cliptr
        CMPIM   space
        BCC     #FT03           ; [just drive specified, use current dir]
        JSR     chkdot

        INY
        LDAIY   cliptr

02      JSR     chkdir
        STA     tmpdir

03      LDA     tmpdir          ; Build 'f*' to match
        JSR     mkarfchar
        STA     dfsname
        LDAIM   "*"
        STA     dfsname+1
        CLR     dfsname+2

        GENAD   tmpdrive        ; Examine this directory for DFS files
        STXY    gbpb_dirname    ; Never updated

; ***^  GENAD   tmpdrive        ; Check the 'drive' exists first
        STXY    fil_name
        LDAIM   5               ; OSFile_ReadInfo
        GENAD   fil_blk
        =       ar_file
        CMPIM   2
        BEQ     #FA04

        JMP     qBadEDrive      ; 'Bad emulated drive'

04      GENAD   dfsname
        BRA     #FA05

; .............................................................................

ex_star ; NOROUT

        JSR     AddYXCliPtrY
        STXY    gbpb_dirname    ; Never updated

        JSR     vstring
        =       "Dir. "
        NOP
        LDXY    gbpb_dirname
        JSR     xystring
        JSR     osnewl
        JSR     osnewl

        GENAD   allwild


05      STXY    gbpb_wildpat    ; Never updated

; gbpb_handle unused

        CLR     gbpb_seqptr     ; Start at entry 0
        CLR     gbpb_seqptr+1
        CLR     gbpb_seqptr+2
        CLR     gbpb_seqptr+3

        CLR     gbpb_nbytes+1   ; Never modified away from 0
        CLR     gbpb_nbytes+2
        CLR     gbpb_nbytes+3

        LDAIM   &FF             ; Pedantically set Host addresses
        STA     gbpb_dirname+2
        STA     gbpb_dirname+3
        STA     gbpb_wildpat+2
        STA     gbpb_wildpat+3

        CLR     nfound

10 ; Loop till bored

        LDA     escflag
        BMI     #FT95

        GENAD   gbpb_catblk
        STXY    gbpb_addr
        LDAIM   &FF             ; Pedantically set Host addresses
        STA     gbpb_addr+2
        STA     gbpb_addr+3

        LDAIM   1
        STA     gbpb_nbytes

        LDAIM   10              ; OSGBPB_ReadDirEntriesInfo
        GENAD   gbpb_blk
        =       ar_gbpb

        LDA     gbpb_nbytes
        BEQ     #FT30           ; [no name matched]

        LDA     currfs
        CMPIM   fs_dfs
        BNE     #FT20

        LDA     gbpb_objtype    ; Don't print out DFS directories
        DECA
        BNE     #FT30           ; [is a dir]

20      LDA     gbpb_objtype
        GENAD   gbpb_retname
        JSR     infoprint
        JSR     osnewl          ; Single column for *EX

        INC     nfound

30      LDA     gbpb_seqptr+3
        BPL     #BT10           ; [not yet ended dir read]


90      LDA     nfound
        BNE     #FT99

        LDA     currfs
        CMPIM   fs_dfs
        BEQ     #FT96           ; ['dir' not found on dfs]

99      CLC                     ; Finished processing
        RTS


95      JMP     FSAckEscape

96      JMP     qNotFound

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; In    A = objtype; fil_load, fil_exec, fil_length, fil_attr
;       YX -> filename

infoprint ROUT

        DECA
        STA     catftype

        LDA     currfs
        CMPIM   fs_nfs
        BEQ     #FT20

        CMPIM   fs_dfs
        BEQ     #FT50

        CMPIM   fs_arfs
        BEQ     #FT05

        JMP     #FT80

; ARFS
; eg. TenLong000 LWR/WR 12345678 12345678 12345678

05      LDAIM   10+1            ; 'TenLong000 '
        JSR     XYfilename

        LDAIM   6               ; 'LWR/WR'
        JSR     infoattr

        LDA     catftype        ; Dir ?
        BNE     #FA10           ; [yes]

        GENAD   fil_load        ; ' 12345678'
        JSR     Print8

        GENAD   fil_exec        ; ' 12345678'
        JSR     Print8

10      GENAD   fil_length      ; ' 12345678'
        JMP     Print8


; NFS emulation
; eg. TenLong000 12345678 12345678   123456   LWR/WR

20      LDAIM   10              ; 'TenLong000'
        JSR     XYfilename

        GENAD   fil_load        ; ' 12345678'
        JSR     Print8

        GENAD   fil_exec        ; ' 12345678'
        JSR     Print8

        JSR     Do2Spaces

        GENAD   fil_length      ; '   123456'
        JSR     Print6

        JSR     Do2Spaces

        LDAIM   6               ; '   LWR/WR'
        JMP     infoattr


; DFS emulation
; eg. $.SevenCh L 123456 123456 123456 002

50      LDA     tmpdir          ; dirprefix
        JSR     oswrch
        LDAIM   "."
        JSR     oswrch

        LDAIM   7               ; 'SevenCh'
        INX
        BNE     #FT55
        INY
55      JSR     XYfilename

        JSR     DoSpace

        LDXIM   "L"             ; ' L'
        LDA     fil_attr        ; Locked ?
        ANDIM   1 :SHL: 3
        BNE     #FA60
        LDXIM   " "
60      TXA
        JSR     oswrch

        GENAD   fil_load        ; ' 123456'
        JSR     Print6

        GENAD   fil_exec        ; ' 123456'
        JSR     Print6

        GENAD   fil_length      ; ' 123456'
        JSR     Print6

        JSR     vstring         ; Fake sector number
        =       " 002"
        NOP
        RTS


; ADFS emulation
; eg. TenLong000 LWR(42)  12345678  12345678  12345678  000007
; and DirName000 DLR(42)  000007

80      LDAIM   10+1            ; 'TenLong000 '
        JSR     XYfilename

        LDAIM   3               ; 'LWR'
        JSR     infoattr

        JSR     vstring         ; Fake sequence number
        =       "(42)"          ; Note the lack of space here eg. DLR(42)
        NOP

        LDA     catftype        ; Dir ?
        BNE     #FA90           ; [yes]

        GENAD   fil_load        ; '  12345678'
        JSR     P8sp2

        GENAD   fil_exec        ; '  12345678'
        JSR     P8sp2

        GENAD   fil_length      ; '  12345678'
        JSR     P8sp2

90      JSR     vstring         ; Fake sector number
        =       "  000007"
        NOP
        RTS

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

P8sp2   JSR     DoSpace
        JMP     Print8

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

infoattr ROUT

        STA     attrfield

        LDA     catftype        ; Dir ?
        BNE     #FT80           ; [yes]

; Print file info

        LDA     fil_attr        ; Locked ?
        ANDIM   1 :SHL: 3
        BEQ     #FT30
        LDAIM   "L"
        JSR     atwrch

30      LDA     fil_attr        ; Write ?
        ANDIM   1 :SHL: 1
        BEQ     #FT40
        LDAIM   "W"
        JSR     atwrch

40      LDA     fil_attr        ; Read ?
        ANDIM   1 :SHL: 0
        BEQ     #FT50
        LDAIM   "R"
        JSR     atwrch

50      LDA     currfs          ; Not NFS or ARFS ?
        CMPIM   fs_adfs
        BEQ     #FT90           ; tidy and return

        LDAIM   "/"
        JSR     atwrch

        LDA     fil_attr        ; Public write ?
        ANDIM   1 :SHL: 5
        BEQ     #FT60
        LDAIM   "W"
        JSR     atwrch

60      LDA     fil_attr        ; Public read ?
        ANDIM   1 :SHL: 4
        BEQ     #FT70
        LDAIM   "R"
        JSR     atwrch

70      BRA     #FT90           ; tidy and return


; Print directory info

80      LDAIM   "D"
        JSR     atwrch

        LDA     fil_attr        ; Locked ?
        ANDIM   1 :SHL: 3
        BEQ     #FT83
        LDAIM   "L"
        JSR     atwrch

83      LDA     currfs          ; Only print trailing slash if net
        CMPIM   fs_nfs
        BNE     #FT85

        LDAIM   "/"
        JSR     atwrch
        BRA     #FT90           ; tidy and return

85      CMPIM   fs_adfs
        BNE     #FT90           ; tidy and return

        LDAIM   "R"             ; ADFS directories are always readable
        JSR     atwrch

; Pad attributes at right with spaces

90      LDY     attrfield
        BEQ     #FT99

91      JSR     DoSpace
        DEY
        BNE     #BT91

99      RTS

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

atwrch  DEC     attrfield
        JMP     oswrch

; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

        LNK     FS40
