NEW AUTO 3,1 .LIST OFF .OP 65C02 .OR $2000 .TF bin/ls *-------------------------------------- .INB inc/macros.i .INB inc/a2osx.i .INB inc/kernel.i .INB inc/mli.i .INB inc/mli.e.i *-------------------------------------- X.ENTER.SUBDIR .EQ 1 X.COPY.TO.DEST .EQ 0 X.DELETE.SOURCE .EQ 0 *-------------------------------------- MAX.COL .EQ 4 *-------------------------------------- .DUMMY .OR ZPBIN ZS.START ZPPtr1 .BS 2 ZPPtr2 .BS 2 ZPFileName .BS 2 ZPFileStat .BS 2 ZPLineBuf .BS 2 ZPPWBuf .BS 2 ColCount .BS 1 bPass2 .BS 1 hLineBuf .BS 1 hPWBuf .BS 1 ArgCount .BS 1 bPause .BS 1 bAllmostAll .BS 1 bColumn .BS 1 bFullPath .BS 1 bLong .BS 1 bRecurse .BS 1 bIsTTY .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 #0 S.PS.F.EVENT .DA #0 .DA CS.END-CS.START Code Size (without Constants) .DA DS.END-DS.START Data SegmentSize .DA #64 Stack Size .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.ENTER .DA MSG.ENTER L.MSG.REG .DA MSG.REG L.MSG.REGEXT .DA MSG.REGEXT L.MSG.DIR .DA MSG.DIR L.MSG.DIREXT .DA MSG.DIREXT L.MSG.BDEV .DA MSG.BDEV L.MSG.BDEVEXT .DA MSG.BDEVEXT L.PRODOS.FT.TXT .DA PRODOS.FT.TXT L.FMT.Date .DA FMT.Date L.FMT.Time .DA FMT.Time L.FMT.string6 .DA FMT.string6 L.FMT.int16 .DA FMT.int16 J.CS.RUN.PRINT .DA CS.RUN.PRINT.REG .DA CS.RUN.PRINT.DIR .DA CS.RUN.PRINT.CDEV .DA CS.RUN.PRINT.BDEV .DA CS.RUN.PRINT.CDEV .DA CS.RUN.PRINT.CDEV .DA CS.RUN.PRINT.CDEV .DA CS.RUN.PRINT.CDEV .DA 0 *-------------------------------------- CS.INIT clc rts *-------------------------------------- CS.RUN jsr CS.RUN.ISATTY .1 inc ArgCount lda ArgCount >SYSCALL ArgV bcs .6 >STYA ZPPtr1 lda (ZPPtr1) cmp #'-' bne .4 ldy #1 lda (ZPPtr1),y ldx #OptionVars-OptionList-1 .2 cmp OptionList,x beq .3 dex bpl .2 >PUSHW L.MSG.USAGE >PUSHBI 0 >SYSCALL PrintF lda #E.SYN sec rts .3 ldy OptionVars,x lda #$80 sta $0,y bra .1 .4 >LDYA ZPPtr1 jsr InitSrcDirYA bcc .1 scan for any other args .9 rts .6 >LDA.G index do we have a Source dir ? bne .8 ldy #S.PS.hCWD lda (pPS),y >SYSCALL GetMemPtr jsr InitSrcDirYA bcs .9 .8 >PUSHEA.G TIME.SysTime >SYSCALL Time >LDYAI S.PW >SYSCALL GetMem bcs .9 >STYA ZPPWBuf stx hPWBuf >LDYAI 256 >SYSCALL GetMem bcs .9 >STYA ZPLineBuf stx hLineBuf *-------------------------------------- CS.RUN.LOOP stz bPass2 .1 ldy #S.PS.hStdIn lda (pPS),y >SYSCALL FEOF bcs .99 I/O error tay bne .2 no char >SYSCALL GetChar cmp #$03 Ctrl-C beq .99 Abort.... cmp #$13 Ctrl-S bne .2 lda bPause eor #$ff sta bPause bne .1 .2 bit bPause bmi .1 jsr GetEntry bcs .6 jsr FilterMatch bcs .8 no match, skip.... bit bAllmostAll bmi .4 lda (ZPFileName) cmp #'.' beq .5 .4 ldy #S.STAT.MODE+1 lda (ZPFileStat),y and #$70 lsr lsr lsr tax jsr CS.RUN.PRINT.JMP bcs .99 .5 jsr GetNextEntry bcc .1 bit bPass2 bmi .6 jsr ResetSrcDir bcs .99 dec bPass2 bra .1 .6 bit bLong bmi .7 jsr CS.RUN.NewLine bcs .99 .7 jsr LeaveSubDir bcs .8 jsr BasePath.. jsr CS.RUN.ENTER.MSG bcs .99 jsr GetNextEntry jmp CS.RUN.LOOP .8 lda #0 sec .99 rts *-------------------------------------- CS.RUN.PRINT.JMP jmp (J.CS.RUN.PRINT,x) *-------------------------------------- CS.RUN.PRINT.REG bit bPass2 bpl .8 bit bLong bmi .1 bit bColumn bmi .23 bit bFullPath bpl .22 jsr CS.RUN.PRINT.SRCPATH .23 >LDYA ZPFileName >SYSCALL PutS rts .22 >PUSHW L.MSG.REG >PUSHW ZPFileName >PUSHBI 2 >SYSCALL PrintF bcs .9 jmp CS.RUN.UpdateColCnt .8 clc .9 rts *-------------------------------------- .1 >PUSHW L.MSG.REGEXT jsr Mod2CSTR (2) jsr CS.RUN.PushUidGid (4) ldy #S.STAT.SIZE+3 ldx #4 .2 lda (ZPFileStat),y >PUSHA dey dex bne .2 (4) jsr CS.RUN.PUSHDATES (4) ldy #S.STAT.P.TYPE lda (ZPFileStat),y jsr FileType2PSTR >PUSHYA (2) ldy #S.STAT.P.AUXTYPE+1 lda (ZPFileStat),y >PUSHA dey lda (ZPFileStat),y >PUSHA (2) >PUSHW ZPFileName (2) >PUSHBI 20 >SYSCALL PrintF bcs .9 jmp CS.RUN.NewLine.1 *-------------------------------------- CS.RUN.PRINT.DIR bit bPass2 bmi .8 bit bLong bmi .4 bit bColumn bmi .23 bit bFullPath bpl .22 jsr CS.RUN.PRINT.SRCPATH .23 >LDYA ZPFileName >SYSCALL PutS bcs .9 bit bRecurse bpl .8 lda (ZPFileName) cmp #'.' beq .8 >LDYA ZPFileName jmp EnterSubDirYA .8 clc .9 rts .22 >PUSHW L.MSG.DIR >PUSHW ZPFileName >PUSHBI 2 >SYSCALL PrintF bcs .9 ldy #0 .1 iny lda (ZPFileName),y bne .1 .11 iny cpy #19 bcs .2 lda #C.SPACE phy >SYSCALL PutChar ply bcc .11 rts .2 jsr CS.RUN.UpdateColCnt bcc .5 rts *-------------------------------------- .4 >PUSHW L.MSG.DIREXT jsr Mod2CSTR jsr CS.RUN.PushUidGid jsr CS.RUN.PUSHDATES >PUSHW ZPFileName >PUSHBI 12 >SYSCALL PrintF bcs .90 jsr CS.RUN.NewLine.1 bcs .90 .5 bit bRecurse bpl .80 lda (ZPFileName) cmp #'.' beq .80 jsr CS.RUN.NewLine bcs .90 >LDYA ZPFileName jsr EnterSubDirYA bcs .90 jmp CS.RUN.ENTER.MSG .80 clc .90 rts *-------------------------------------- CS.RUN.PRINT.CDEV clc rts *-------------------------------------- CS.RUN.PRINT.BDEV bit bPass2 bmi .8 bit bLong bmi .20 bit bColumn bmi .23 bit bFullPath bpl .22 jsr CS.RUN.PRINT.SRCPATH .23 >LDYA ZPFileName >SYSCALL PutS bcs .9 bit bRecurse bpl .8 lda (ZPFileName) cmp #'.' beq .8 >LDYA ZPFileName jmp EnterSubDirYA .8 clc .9 rts .22 >PUSHW L.MSG.BDEV >PUSHW ZPFileName >PUSHBI 2 >SYSCALL PrintF bcs .9 ldy #0 .1 iny lda (ZPFileName),y bne .1 .11 iny cpy #19 bcs .2 lda #C.SPACE phy >SYSCALL PutChar ply bcc .11 rts .2 jsr CS.RUN.UpdateColCnt * bcc .5 rts *-------------------------------------- .20 >PUSHW L.MSG.BDEVEXT >PUSHW ZPFileName ldy #S.STAT.P.SLOT >PUSHB (ZPFileStat),y iny DRIVE >PUSHB (ZPFileStat),y ldy #S.STAT.BLOCKS+1 >PUSHB (ZPFileStat),y dey >PUSHB (ZPFileStat),y ldy #S.STAT.P.DEVBLOCKS+1 >PUSHB (ZPFileStat),y dey >PUSHB (ZPFileStat),y >PUSHBI 8 >SYSCALL PrintF bcs .90 jsr CS.RUN.NewLine.1 bcs .90 bit bRecurse bpl .80 >LDYA ZPFileName jsr EnterSubDirYA bcs .90 jmp CS.RUN.ENTER.MSG .80 clc .90 rts *-------------------------------------- CS.RUN.PRINT.SRCPATH ldy #hSrcBasePath lda (pData),y >SYSCALL GetMemPtr >PUSHYA >PUSHBI 0 >SYSCALL PrintF rts *-------------------------------------- CS.RUN.PushUidGid ldy #S.STAT.UID lda (ZPFileStat),y >PUSHA >PUSHW ZPPWBuf >SYSCALL GetPWUID bcs .2 >PUSHEA.G USER jsr CS.RUN.PushUidGidStr bra .3 .2 >PUSHEA.G USER >PUSHW L.FMT.int16 ldy #S.STAT.UID+1 lda (ZPFileStat),y >PUSHA dey lda (ZPFileStat),y >PUSHA >PUSHBI 2 >SYSCALL SPrintF .3 ldy #S.STAT.GID lda (ZPFileStat),y >PUSHA >PUSHW ZPPWBuf >SYSCALL GetGRGID bcs .5 >PUSHEA.G GROUP jsr CS.RUN.PushUidGidStr bra .8 .5 >PUSHEA.G GROUP >PUSHW L.FMT.int16 ldy #S.STAT.GID+1 lda (ZPFileStat),y >PUSHA dey lda (ZPFileStat),y >PUSHA >PUSHBI 2 >SYSCALL SPrintF .8 >PUSHEA.G USER >PUSHEA.G GROUP clc rts CS.RUN.PushUidGidStr >PUSHW L.FMT.string6 >PUSHW ZPPWBuf >PUSHBI 2 >SYSCALL SPrintF rts *-------------------------------------- CS.RUN.PUSHDATES ldy #TIME.Mod-1 Set NODATE as default jsr CS.RUN.NODATES.INIT ldy #TIME.Create-1 Set NODATE as default jsr CS.RUN.NODATES.INIT ldy #S.STAT.MTIME+S.TIME.MONTH lda (ZPFileStat),y beq .1 Month=0, invalid date/time >PUSHEA.G TIME.Mod lda ZPFileStat clc adc #S.STAT.MTIME tay lda ZPFileStat+1 adc #0 jsr CS.RUN.DATEFMT.SELECT >SYSCALL StrFTime .1 ldy #S.STAT.CTIME+S.TIME.MONTH lda (ZPFileStat),y beq .2 Month=0, nvalid date/time >PUSHEA.G TIME.Create lda ZPFileStat clc adc #S.STAT.CTIME tay lda ZPFileStat+1 adc #0 jsr CS.RUN.DATEFMT.SELECT >SYSCALL StrFTime .2 >PUSHEA.G TIME.Mod >PUSHEA.G TIME.Create rts *-------------------------------------- CS.RUN.NODATES.INIT ldx #$ff .1 inx iny lda MSG.NODATE,x sta (pData),y bne .1 rts *-------------------------------------- CS.RUN.DATEFMT.SELECT >STYA ZPPtr1 ldy #S.TIME.CENTURY lda (ZPPtr1),y ldy #TIME.SysTime+S.TIME.CENTURY cmp (pData),y bne .9 ldy #S.TIME.YEAR lda (ZPPtr1),y ldy #TIME.SysTime+S.TIME.YEAR cmp (pData),y bne .9 ldy #S.TIME.MONTH lda (ZPPtr1),y ldy #TIME.SysTime+S.TIME.MONTH cmp (pData),y bne .9 ldy #S.TIME.DAY lda (ZPPtr1),y ldy #TIME.SysTime+S.TIME.DAY cmp (pData),y bne .9 .8 >PUSHW L.FMT.Time >PUSHW ZPPtr1 rts .9 >PUSHW L.FMT.Date >PUSHW ZPPtr1 rts *-------------------------------------- CS.RUN.UpdateColCnt inc ColCount lda ColCount cmp #MAX.COL bne CS.RUN.NewLine.8 stz ColCount bra CS.RUN.NewLine.1 *-------------------------------------- CS.RUN.ENTER.MSG >PUSHW L.MSG.ENTER ldy #hSrcBasePath lda (pData),y >SYSCALL GetMemPtr >PUSHYA >PUSHBI 2 >SYSCALL PrintF bcc CS.RUN.NewLine.1 rts *-------------------------------------- CS.RUN.NewLine lda ColCount beq CS.RUN.NewLine.8 CS.RUN.NewLine.1 lda #C.CR >SYSCALL PutChar lda bIsTTY beq CS.RUN.NewLine.8 lda #C.LF >SYSCALL PutChar CS.RUN.NewLine.8 clc rts *-------------------------------------- CS.RUN.ISATTY ldy #S.PS.hStdOut lda (pPS),y tax lda hFDs-1,x >SYSCALL GetMemPtr >STYA ZPPtr1 lda (ZPPtr1) beq .9 inc bIsTTY .9 rts *-------------------------------------- CS.DOEVENT sec rts *-------------------------------------- CS.QUIT jsr LeaveSubDir bcc CS.QUIT ldy #hFilter lda (pData),y jsr .7 lda hPWBuf jsr .7 lda hLineBuf .7 beq .8 >SYSCALL FreeMem .8 clc rts *-------------------------------------- FileType2PSTR ldy #0 .1 cmp PRODOS.FT.HEX,y beq .8 iny cpy #PRODOS.FT.TXT-PRODOS.FT.HEX bne .1 pha lsr lsr lsr lsr ora #$30 cmp #'9'+1 bcc .2 adc #6 .2 sta PRODOS.FT.DFLT+1 pla and #$0F ora #$30 cmp #'9'+1 bcc .3 adc #6 .3 sta PRODOS.FT.DFLT+2 .8 tya asl asl CC adc L.PRODOS.FT.TXT tay lda L.PRODOS.FT.TXT+1 adc #0 rts *-------------------------------------- Mod2CSTR ldy #S.STAT.MODE+1 lda (ZPFileStat),y lsr php C = RU lsr lsr lsr tax lda TYPES,x >STA.G MOD plp ldy #S.STAT.MODE lda (ZPFileStat),y ldy #MOD+1 ldx #8 .1 pha lda #'-' bcc .2 lda ACCESS,x .2 sta (pData),y iny pla asl dex bpl .1 >PUSHEA.G MOD rts *-------------------------------------- .INB usr/src/shared/x.fileenum.s *-------------------------------------- CS.END *-------------------------------------- OptionList .AS "ACFLRacflr" OptionVars .DA #bAllmostAll,#bColumn,#bFullPath,#bLong,#bRecurse,#bAllmostAll,#bColumn,#bFullPath,#bLong,#bRecurse *-------------------------------------- MSG.USAGE .AS "Usage : LS [-A] [-C] [-F] [-L] [-R] [filespec]\r\n" .AS " -A : Show dot files\r\n" .AS " -C : List in multiple columns\r\n" .AS " -F : Show full paths\r\n" .AS " -L : Use long listing format\r\n" .AZ " -R : Recursively list subdirectories\r\n" *-------------------------------------- MSG.ENTER .AZ "Directory:%s" MSG.REGEXT .AZ "%s %6s %6s %10u %s %s %s %H %s" MSG.REG .AZ "%19s" MSG.DIREXT .AS "%s %6s %6s %s %s " MSG.DIR .AZ "\e[32m%s/\e[0m" MSG.BDEVEXT .AZ "\e[36m/%15s\e[0m s%dd%d Blocks Used:%5D Total:%5D" MSG.BDEV .AZ "\e[36m/%s\e[0m" *-------------------------------------- PRODOS.FT.HEX .HS 0406FAFCFDCBCCCFFF PRODOS.FT.TXT .AZ "txt" .AZ "bin" .AZ "asm" .AZ "bas" .AZ "var" .AZ "pix" .AZ "fon" .AZ "pak" .AZ "sys" PRODOS.FT.DFLT .AZ "$ " MSG.NODATE .AZ "" FMT.Date .AZ "%d-%b-%y" FMT.Time .AZ "%H:%M:%S " FMT.string6 .AZ "%6s" FMT.int16 .AZ "%6D" TYPES .AS "-dbclssp" ACCESS .AS "xwrxwrxwr" *-------------------------------------- .DUMMY .OR 0 DS.START MOD .BS 11 drwxrwxrwx\0 USER .BS 7 GROUP .BS 7 TIME.SysTime .BS S.TIME TIME.Create .BS 10 DD-mmm-YY\0 TIME.Mod .BS 10 .INB usr/src/shared/x.fileenum.g DS.END .ED *-------------------------------------- MAN SAVE usr/src/bin/ls.s ASM