NEW AUTO 3,1 .LIST OFF .OP 65C02 .OR $2000 .TF bin/stat *-------------------------------------- .INB inc/macros.i .INB inc/a2osx.i .INB inc/mli.i .INB inc/mli.e.i *-------------------------------------- .DUMMY .OR ZPBIN ZS.START ArgIndex .BS 1 ArgFile .BS 1 ZPPtr1 .BS 2 bAll .BS 1 bAccess .BS 1 bMod .BS 1 bUID .BS 1 bGID .BS 1 bSize .BS 1 bBlocks .BS 1 bCTime .BS 1 bMTime .BS 1 bATime .BS 1 ZS.END .ED *-------------------------------------- * File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) .DA #$61 6502,Level 1 (65c02) .DA #1 BIN Layout Version 1 .DA #S.PS.F.EVENT S.PS.F .DA #0 .DA CS.END-CS.START CS .DA DS.END-DS.START DS .DA #64 SS .DA #ZS.END-ZS.START Zero Page Size .DA 0 *-------------------------------------- * Relocation Table *-------------------------------------- .1 .DA CS.INIT .DA CS.RUN .DA CS.DOEVENT .DA CS.QUIT L.MSG.USAGE .DA MSG.USAGE L.MSG.Filename .DA MSG.Filename L.MSG.Access .DA MSG.Access L.MSG.Mod .DA MSG.Mod L.MSG.UIDGIDSIZE .DA MSG.UIDGIDSIZE L.FMT.DateTime .DA FMT.DateTime L.MSG.CMATimes .DA MSG.CMATimes L.MSG.D .DA MSG.D L.MSG.U .DA MSG.U .DA 0 *-------------------------------------- CS.INIT clc rts *-------------------------------------- CS.RUN dec bAll .1 inc ArgIndex lda ArgIndex >SYSCALL ArgV bcs .3 >STYA ZPPtr1 lda (ZPPtr1) cmp #'-' bne .2 jsr CS.RUN.CheckOpt bcc .1 .99 >LDYA L.MSG.USAGE >SYSCALL PutS lda #E.SYN sec rts .2 lda ArgFile bne .99 lda ArgIndex sta ArgFile bra .1 .3 lda ArgFile beq .99 >SYSCALL ArgV >PUSHYA >PUSHW pData >SYSCALL Stat bcs .9 jsr CS.RUN.CONVERT bit bAll bmi .7 jsr CS.RUN.PRINT bcs .9 bra .8 .7 jsr CS.RUN.DUMP bcs .9 .8 lda #0 sec .9 CS.RUN.RTS rts *-------------------------------------- CS.RUN.PRINT bit bAccess bpl .1 >LEA.G AttrBuf >SYSCALL PutS bcs CS.RUN.RTS .1 bit bMod bpl .2 >LEA.G MOD >SYSCALL PutS bcs CS.RUN.RTS .2 bit bUID bpl .3 >PUSHW L.MSG.D >PUSHW.G StatBuf+S.STAT.UID >PUSHBI 2 >SYSCALL PrintF .9 bcs CS.RUN.RTS .3 bit bGID bpl .4 >PUSHW L.MSG.D >PUSHW.G StatBuf+S.STAT.GID >PUSHBI 2 >SYSCALL PrintF bcs .9 .4 bit bSize bpl .5 >PUSHW L.MSG.U >PUSHL.G StatBuf+S.STAT.SIZE >PUSHBI 4 >SYSCALL PrintF bcs CS.RUN.PRINT.RTS .5 bit bBlocks bpl CS.RUN.PRINT2 >PUSHW L.MSG.U >PUSHL.G StatBuf+S.STAT.BLOCKS >PUSHBI 4 >SYSCALL PrintF bcs CS.RUN.PRINT.RTS CS.RUN.PRINT2 bit bCTime bpl .7 >LEA.G TIME.Create >SYSCALL PutS bcs .9 .7 bit bMTime bpl .8 >LEA.G TIME.Mod >SYSCALL PutS bcs .9 .8 bit bATime bpl .9 >LEA.G TIME.Access >SYSCALL PutS .9 CS.RUN.PRINT.RTS rts *-------------------------------------- CS.RUN.DUMP lda ArgFile >SYSCALL ArgV >PUSHYA >PUSHWZ Allocate >SYSCALL RealPath bcs CS.RUN.PRINT.RTS >STYA ZPPtr1 phx >PUSHW L.MSG.Filename >PUSHW ZPPtr1 >PUSHBI 2 >SYSCALL PrintF pla >SYSCALL FreeMem >PUSHW L.MSG.Access >PUSHEA.G AttrBuf >PUSHBI 2 >SYSCALL PrintF >PUSHW L.MSG.Mod >PUSHEA.G MOD >PUSHBI 2 >SYSCALL PrintF >PUSHW L.MSG.UIDGIDSIZE >PUSHW.G StatBuf+S.STAT.UID >PUSHW.G StatBuf+S.STAT.GID >PUSHL.G StatBuf+S.STAT.SIZE >PUSHL.G StatBuf+S.STAT.BLOCKS >PUSHW.G StatBuf+S.STAT.BLKSIZE >PUSHBI 14 >SYSCALL PrintF >PUSHW L.MSG.CMATimes >PUSHEA.G TIME.Create >PUSHEA.G TIME.Mod >PUSHEA.G TIME.Access >PUSHBI 6 >SYSCALL PrintF rts *-------------------------------------- CS.RUN.CONVERT jsr Access2CSTR jsr Mod2CSTR jmp Times2CSTR *-------------------------------------- Access2CSTR ldy #S.STAT.P.ACCESS lda (pData),y ldy #AttrBuf+15 ldx #15 .1 lsr pha bcc .2 lda ATTRS,x sta (pData),y dex dey lda ATTRS,x sta (pData),y bra .3 .2 lda #'-' sta (pData),y dex dey sta (pData),y .3 pla dey dex bpl .1 rts *-------------------------------------- Mod2CSTR ldy #S.STAT.MODE+1 lda (pData),y lsr php lsr lsr lsr tax lda TYPES,x >STA.G MOD plp ldx #8 ldy #S.STAT.MODE lda (pData),y ldy #MOD+1 .1 pha lda #'-' bcc .2 lda ACCESS,x .2 sta (pData),y iny pla asl dex bpl .1 rts *-------------------------------------- Times2CSTR ldy #TIME.Access-1 Set NODATE as default jsr CS.RUN.PrintAMCTime.NODATE ldy #TIME.Mod-1 Set NODATE as default jsr CS.RUN.PrintAMCTime.NODATE ldy #TIME.Create-1 Set NODATE as default jsr CS.RUN.PrintAMCTime.NODATE >LDA.G StatBuf+S.STAT.ATIME+S.TIME.MONTH beq .1 Month=0.....invalid date/time >PUSHEA.G TIME.Access >PUSHW L.FMT.DateTime >PUSHEA.G StatBuf+S.STAT.ATIME >SYSCALL StrFTime .1 >LDA.G StatBuf+S.STAT.MTIME+S.TIME.MONTH beq .2 Month=0.....invalid date/time >PUSHEA.G TIME.Mod >PUSHW L.FMT.DateTime >PUSHEA.G StatBuf+S.STAT.MTIME >SYSCALL StrFTime .2 >LDA.G StatBuf+S.STAT.CTIME+S.TIME.MONTH beq .8 Month=0.....invalid date/time >PUSHEA.G TIME.Create >PUSHW L.FMT.DateTime >PUSHEA.G StatBuf+S.STAT.CTIME >SYSCALL StrFTime .8 rts *-------------------------------------- CS.RUN.PrintAMCTime.NODATE ldx #$ff .1 inx iny lda MSG.NODATE,x sta (pData),y bne .1 rts *-------------------------------------- CS.QUIT .8 clc rts *-------------------------------------- CS.DOEVENT sec rts *-------------------------------------- CS.RUN.CheckOpt ldy #1 lda (ZPPtr1),y ldx #OptionVars-OptionList-1 .2 cmp OptionList,x beq .3 dex bpl .2 sec rts .3 ldy OptionVars,x lda #$ff sta 0,y stz bAll clc rts *-------------------------------------- CS.END *-------------------------------------- OptionList .AS "AaDdUuGgSsBbCcMmLl" OptionVars .DA #bAccess,#bAccess .DA #bMod,#bMod .DA #bUID,#bUID .DA #bGID,#bGID .DA #bSize,#bSize .DA #bBlocks,#bBlocks .DA #bCTime,#bCTime .DA #bMTime,#bMTime .DA #bATime,#bATime ATTRS .AS "DeReBn----InWrRd" TYPES .AS "-dbclssp" ACCESS .AS "xwrxwrxwr" MSG.NODATE .AZ "" FMT.DateTime .AZ "%d-%b-%y %H:%M:%S" *-------------------------------------- MSG.USAGE .CS "Usage : STAT File\r\n" .CS " -A : Access Flags\r\n" .CS " -D : Mod Flags\r\n" .CS " -U : UID\r\n" .CS " -G : GID\r\n" .CS " -S : Size in bytes\r\n" .CS " -B : Size in blocks\r\n" .CS " -C : Creation date/time\r\n" .CS " -M : Modification date/time\r\n" .CZ " -L : Last access date/time\r\n" *-------------------------------------- MSG.Filename .CZ "Filename : %s\r\n" MSG.Access .CZ "Access : %s\r\n" MSG.Mod .CZ "Mod : %s\r\n" MSG.UIDGIDSIZE .CS "UID : %10D\r\n" .CS "GID : %10D\r\n" .CS "Size : %10u\r\n" .CZ "Blocks : %10u (%D)\r\n" MSG.CMATimes .CS "Created : %s\r\n" .CS "Modified : %s\r\n" .CZ "Accessed : %s\r\n" MSG.D .CZ "%D\r\n" MSG.U .CZ "%u\r\n" *-------------------------------------- .DUMMY .OR 0 DS.START StatBuf .BS S.STAT AttrBuf .BS 17 MOD .BS 11 drwxrwxrwx + \0 TIME.Access .BS 20 TIME.Mod .BS 20 TIME.Create .BS 20 DS.END .ED *-------------------------------------- MAN SAVE usr/src/bin/stat.s ASM