From 4bbfa0899de122d92d514fa8705beedcf870a1d0 Mon Sep 17 00:00:00 2001 From: burniouf Date: Tue, 10 Aug 2021 12:20:41 +0200 Subject: [PATCH] LS:complete rewrite, VSDRIVE: speedup things a bit, KERNEL: API cleanup --- .Floppies/A2OSX.BUILD.po | Bin 33553920 -> 33553920 bytes BIN/ETCONFIG.S.txt | 80 +-- BIN/FORMAT.S.txt | 16 +- BIN/IPCONFIG.S.txt | 37 +- BIN/LS.S.txt | 913 ++++++++++++++++++---------------- BIN/LSDEV.S.txt | 12 +- INC/A2osX.I.txt | 2 +- ProDOS.FX/ProDOS.S.XDOS.A.txt | 62 +-- SYS/KERNEL.S.DEV.txt | 103 ++-- SYS/KERNEL.S.JMP.txt | 2 +- SYS/KERNEL.S.STAT.txt | 17 +- SYS/KM.VSDRIVE.S.txt | 96 ++-- 12 files changed, 721 insertions(+), 619 deletions(-) diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index 3765369304f5ba945993bb0099fa31d1998a1101..db70e6d7abd21e85a42505a19776eccecdeae446 100644 GIT binary patch delta 48157 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 TfYZRwz%RfV^*(Y|ee?eT9q_nh delta 49232 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 E0}$|OD*ylh diff --git a/BIN/ETCONFIG.S.txt b/BIN/ETCONFIG.S.txt index d06298ab..0d0708dd 100644 --- a/BIN/ETCONFIG.S.txt +++ b/BIN/ETCONFIG.S.txt @@ -75,7 +75,6 @@ L.HOSTNAME .DA HOSTNAME L.CFG.DefaultHost .DA CFG.DefaultHost L.ETKCFG .DA ETKCFG L.ETKCFG.OBJECT .DA ETKCFG+S.ETKCFG.OBJECT -L.IOCTL .DA IOCTL *-------------------------------------- L.MSG.PROBE .DA MSG.PROBE L.MSG.PROBE.KO .DA MSG.PROBE.KO @@ -129,20 +128,16 @@ CS.RUN.SETUP lda ETKCFG+S.NETCFG.STATUS CS.RUN.SETUP.RTS rts *-------------------------------------- -CS.RUN.DUMP >PUSHB ETKCFG+S.NETCFG.DevID - >PUSHEA.G DIB - >SYSCALL GetDevStatus - bcs CS.RUN.SETUP.RTS +CS.RUN.DUMP >LEA.G DCB.NIC - >LEA.G DCB.NIC - >STYA IOCTL+S.IOCTL.BUFPTR - lda #S.IOCTL.S.GETDCB - sta IOCTL+S.IOCTL.S + ldx #S.IOCTL.S.GETDCB + jsr CS.RUN.IOCTL + bcs CS.RUN.SETUP.RTS - >PUSHB ETKCFG+S.NETCFG.DevID - >PUSHBI IOCTL.STATUS - >PUSHW L.IOCTL - >SYSCALL IOCTL + >LEA.G DIB + + ldx #S.IOCTL.S.GETDIB + jsr CS.RUN.IOCTL bcs CS.RUN.SETUP.RTS CS.RUN.DUMPNIC >PUSHW L.MSG1.DEV @@ -150,14 +145,15 @@ CS.RUN.DUMPNIC >PUSHW L.MSG1.DEV lda ETKCFG+S.NETCFG.DevID >PUSHA - ldx ETKCFG+S.NETCFG.DevID - lda Dev.Table-1,x + >SYSCALL GetMemPtr + + pha + tya clc adc #S.FD.DEV tay - lda Dev.Table,x + pla adc /S.FD.DEV - >PUSHYA >PUSHEA.G DIB+S.DIB.IDS @@ -299,14 +295,13 @@ CS.RUN.PROBE >LDYA L.MSG.PROBE sta ProbeCnt .3 >LDYA L.AARP.PRB - >STYA IOCTL+S.IOCTL.BUFPTR + >STYA.G DEV.IOCTL+S.IOCTL.BUFPTR >LDYAI AARP.PRB.LEN - >STYA IOCTL+S.IOCTL.BYTECNT + >STYA.G DEV.IOCTL+S.IOCTL.BYTECNT >PUSHB ETKCFG+S.NETCFG.DevID - >PUSHBI IOCTL.WRITE - >PUSHW L.IOCTL - >SYSCALL IOCTL + lda #IOCTL.WRITE + jsr CS.RUN.IOCTL.A >SLEEP dec ProbeCnt @@ -330,14 +325,13 @@ CS.RUN.PROBE >LDYA L.MSG.PROBE *-------------------------------------- CS.RUN.GETNETINFO >LDYA L.DDP.GetNetInfo - >STYA IOCTL+S.IOCTL.BUFPTR + >STYA.G DEV.IOCTL+S.IOCTL.BUFPTR >LDYAI DDP.GetNetInfo.LEN - >STYA IOCTL+S.IOCTL.BYTECNT + >STYA.G DEV.IOCTL+S.IOCTL.BYTECNT >PUSHW ETKCFG+S.NETCFG.DevID - >PUSHBI IOCTL.WRITE - >PUSHW L.IOCTL - >SYSCALL IOCTL + lda #IOCTL.WRITE + jsr CS.RUN.IOCTL.A lda #TIMEOUT.MAX sta TimeOut @@ -348,9 +342,8 @@ CS.RUN.GETNETINFO beq .9 >PUSHW ETKCFG+S.NETCFG.DevID - >PUSHBI IOCTL.READ - >PUSHW L.IOCTL - >SYSCALL IOCTL + lda #IOCTL.READ + jsr CS.RUN.IOCTL.A bcs .1 sta hFrame @@ -367,12 +360,25 @@ CS.RUN.GETNETINFO rts .9 sec -CS.RUN.GETNETINFO.RTS + rts +*-------------------------------------- +CS.RUN.IOCTL >STYA.G DEV.IOCTL+S.IOCTL.BUFPTR + + txa + >STA.G DEV.IOCTL+S.IOCTL.S + + >PUSHB ETKCFG+S.NETCFG.DevID + lda #IOCTL.STATUS + +CS.RUN.IOCTL.A >PUSHA + + >PUSHEA.G DEV.IOCTL + >SYSCALL IOCTL rts *-------------------------------------- CFG.EtcFiles >LDYAI 256 >SYSCALL GetMem - bcs CS.RUN.GETNETINFO.RTS + bcs .9 >STYA BufPtr stx CFG.hBuf1 @@ -381,7 +387,7 @@ CFG.EtcFiles >LDYAI 256 jsr CFG.Read.HOSTNAME lda ETKCFG+S.ETKCFG.OBJECT - bne .4 + bne .2 >LDYA L.ETKCFG.OBJECT iny @@ -397,9 +403,10 @@ CFG.EtcFiles >LDYAI 256 lda #10 sta ETKCFG+S.ETKCFG.OBJECT -.4 lda CFG.hBuf1 +.2 lda CFG.hBuf1 >SYSCALL FreeMem - rts + +.9 rts *-------------------------------------- CFG.Read.PrintF pha >PUSHW L.MSG.CFG @@ -592,13 +599,12 @@ DDP.GetNetInfo.DDP DDP.GetNetInfo.DEND .EQ * .BS DDP.GetNetInfo+60-* DDP.GetNetInfo.LEN .EQ 60 -*-------------------------------------- -IOCTL .BS S.IOCTL *-------------------------------------- .DUMMY .OR 0 DS.START DIB .BS S.DIB +DEV.IOCTL .BS S.IOCTL DCB.NIC .BS S.DCB.NIC DS.END .ED *-------------------------------------- diff --git a/BIN/FORMAT.S.txt b/BIN/FORMAT.S.txt index 56618780..98beaf59 100644 --- a/BIN/FORMAT.S.txt +++ b/BIN/FORMAT.S.txt @@ -171,7 +171,7 @@ CS.RUN ldy #S.PS.ARGC .8 lda hDevID beq .99 *-------------------------------------- -CS.RUN.Format jsr CS.RUN.GetDevStatus +CS.RUN.Format jsr CS.RUN.GetDevDIB bcs .99 >PUSHW L.MSG.INIT @@ -223,14 +223,20 @@ CS.RUN.Format jsr CS.RUN.GetDevStatus sec rts *-------------------------------------- -CS.RUN.GetDevStatus +CS.RUN.GetDevDIB lda bCustomBlkSize bmi .8 - >PUSHB hDevID - >PUSHEA.G DIB + >LEA.G DIB + >STYA.G IOCTL+S.IOCTL.BUFPTR - >SYSCALL GetDevStatus + lda #S.IOCTL.S.GETDIB + >STA.G IOCTL+S.IOCTL.S + + >PUSHB hDevID + >PUSHBI IOCTL.STATUS + >PUSHEA.G IOCTL + >SYSCALL IOCTL bcs .9 >LDA.G DIB+S.DIB.SIZE diff --git a/BIN/IPCONFIG.S.txt b/BIN/IPCONFIG.S.txt index 8a0a5ffc..38b8df7f 100644 --- a/BIN/IPCONFIG.S.txt +++ b/BIN/IPCONFIG.S.txt @@ -208,21 +208,21 @@ CS.RUN.SETUP .8 lda #0 sec + +CS.RUN.SETUP.RTS rts *-------------------------------------- -CS.RUN.DUMP >PUSHB IPCFG+S.NETCFG.DevID - >PUSHEA.G DIB - >SYSCALL GetDevStatus +CS.RUN.DUMP >LEA.G DCB.NIC + + ldx #S.IOCTL.S.GETDCB + jsr CS.RUN.IOCTL + bcs CS.RUN.SETUP.RTS - >LEA.G DCB.NIC - >STYA.G IOCTL+S.IOCTL.BUFPTR - lda #S.IOCTL.S.GETDCB - >STA.G IOCTL+S.IOCTL.S - - >PUSHB IPCFG+S.NETCFG.DevID - >PUSHBI IOCTL.STATUS - >PUSHEA.G IOCTL - >SYSCALL IOCTL + >LEA.G DIB + + ldx #S.IOCTL.S.GETDIB + jsr CS.RUN.IOCTL + bcs CS.RUN.SETUP.RTS CS.RUN.DUMPNIC >PUSHW L.MSG1.DEV @@ -396,6 +396,17 @@ CS.RUN.DUMPIP >PUSHW L.MSG2 sec we do not want to stay in memory rts *-------------------------------------- +CS.RUN.IOCTL >STYA.G DEV.IOCTL+S.IOCTL.BUFPTR + + txa + >STA.G DEV.IOCTL+S.IOCTL.S + + >PUSHB IPCFG+S.NETCFG.DevID + >PUSHBI IOCTL.STATUS + >PUSHEA.G DEV.IOCTL + >SYSCALL IOCTL + rts +*-------------------------------------- CS.DOEVENT lda (pEvent) bpl .9 is it a TIMER event? @@ -540,7 +551,7 @@ DHCP.REQ.LEN .EQ *-DHCP.REQ .OR 0 DS.START DIB .BS S.DIB -IOCTL .BS S.IOCTL +DEV.IOCTL .BS S.IOCTL DCB.NIC .BS S.DCB.NIC DS.END .ED *-------------------------------------- diff --git a/BIN/LS.S.txt b/BIN/LS.S.txt index 277f254d..841b4da7 100644 --- a/BIN/LS.S.txt +++ b/BIN/LS.S.txt @@ -15,7 +15,12 @@ X.ENTER.SUBDIR .EQ 1 X.COPY.TO.DEST .EQ 0 X.DELETE.SOURCE .EQ 0 *-------------------------------------- -MAX.COL .EQ 4 +MAX.COLW .EQ 20 +MAX.COLC .EQ 4 +COLOR.ENTER .EQ 32 +COLOR.REG .EQ 93 +COLOR.DIR .EQ 92 +COLOR.BDEV .EQ 96 *-------------------------------------- .DUMMY .OR ZPBIN @@ -25,21 +30,23 @@ ZPPtr2 .BS 2 ZPFileName .BS 2 ZPFileStat .BS 2 -ZPLineBuf .BS 2 ZPPWBuf .BS 2 +ArgCount .BS 1 ColCount .BS 1 -bPass2 .BS 1 hLineBuf .BS 1 hPWBuf .BS 1 -ArgCount .BS 1 +bPass2 .BS 1 bPause .BS 1 bAllmostAll .BS 1 bColumn .BS 1 bFullPath .BS 1 bLong .BS 1 bRecurse .BS 1 -bIsTTY .BS 1 +bToFile .BS 1 + +ZPLineBuf .BS 2 +ZPLineBufPtr .BS 2 ZS.END .ED *-------------------------------------- @@ -65,31 +72,38 @@ CS.START cld .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.MSG.SETCOLOR .DA MSG.SETCOLOR L.PRODOS.FT.TXT .DA PRODOS.FT.TXT +L.MSG.NODATE .DA MSG.NODATE 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 CS.RUN.PRINT.LNK + .DA CS.RUN.PRINT.DSOCK + .DA CS.RUN.PRINT.SSOCK + .DA CS.RUN.PRINT.PIPE .DA 0 *-------------------------------------- CS.INIT clc rts *-------------------------------------- -CS.RUN jsr CS.RUN.ISATTY +CS.RUN ldy #S.PS.hStdOut + lda (pPS),y + tax + lda hFDs-1,x + >SYSCALL GetMemPtr + >STYA ZPPtr1 + lda (ZPPtr1) + bne .1 + + dec bToFile .1 inc ArgCount lda ArgCount @@ -155,11 +169,14 @@ CS.RUN jsr CS.RUN.ISATTY bcs .9 >STYA ZPLineBuf + >STYA ZPLineBufPtr stx hLineBuf *-------------------------------------- CS.RUN.LOOP stz bPass2 -.1 ldy #S.PS.hStdIn +.1 >SLEEP + + ldy #S.PS.hStdIn lda (pPS),y >SYSCALL FEOF bcs .99 I/O error @@ -212,6 +229,9 @@ CS.RUN.LOOP stz bPass2 bit bPass2 bmi .6 + jsr CS.RUN.CheckRoot + beq .6 + jsr ResetSrcDir bcs .99 @@ -221,7 +241,7 @@ CS.RUN.LOOP stz bPass2 .6 bit bLong bmi .7 - jsr CS.RUN.NewLine + jsr CS.RUN.LineBufFlush bcs .99 .7 jsr LeaveSubDir @@ -239,6 +259,14 @@ CS.RUN.LOOP stz bPass2 sec .99 rts *-------------------------------------- +CS.RUN.CheckRoot + >LDA.G hSrcBasePath + >SYSCALL GetMemPtr + >STYA ZPPtr1 + ldy #1 + lda (ZPPtr1),y + rts +*-------------------------------------- CS.RUN.PRINT.JMP jmp (J.CS.RUN.PRINT,x) *-------------------------------------- @@ -247,36 +275,35 @@ CS.RUN.PRINT.REG bpl .8 bit bLong - bmi .1 + bmi CS.RUN.PRINT.REGEXT + + ldy #COLOR.REG + jsr CS.RUN.SetColorY bit bColumn - bmi .23 + bmi CS.RUN.PRINT.REG1 bit bFullPath - bpl .22 + bpl .2 - jsr CS.RUN.PRINT.SRCPATH + jsr CS.RUN.SrcPathOut -.23 >LDYA ZPFileName - >SYSCALL PutS - rts + bra CS.RUN.PRINT.REG1 -.22 >PUSHW L.MSG.REG - >PUSHW ZPFileName - >PUSHBI 2 - >SYSCALL PrintF - bcs .9 - - jmp CS.RUN.UpdateColCnt +.2 ldx #MAX.COLW + clc + jsr CS.RUN.FN2LineBuf + jmp CS.RUN.IncColCnt .8 clc .9 rts *-------------------------------------- -.1 >PUSHW L.MSG.REGEXT +CS.RUN.PRINT.REGEXT + jsr CS.RUN.PrintMod + jsr CS.RUN.PrintUidGid - jsr Mod2CSTR (2) - - jsr CS.RUN.PushUidGid (4) + >PUSHW ZPLineBufPtr + >PUSHW L.MSG.REGEXT ldy #S.STAT.SIZE+3 ldx #4 @@ -285,193 +312,117 @@ CS.RUN.PRINT.REG >PUSHA dey dex - bne .2 (4) + bne .2 - jsr CS.RUN.PUSHDATES (4) + >PUSHBI 4 + jsr CS.RUN.ToLineBuf - ldy #S.STAT.P.TYPE - lda (ZPFileStat),y - jsr FileType2PSTR - >PUSHYA (2) + jsr CS.RUN.PrintTypeAux + jsr CS.RUN.PrintDates - ldy #S.STAT.P.AUXTYPE+1 - lda (ZPFileStat),y - >PUSHA - dey - lda (ZPFileStat),y - >PUSHA (2) + ldy #COLOR.REG + jsr CS.RUN.SetColorY - >PUSHW ZPFileName (2) - - >PUSHBI 20 - >SYSCALL PrintF - bcs .9 - - jmp CS.RUN.NewLine.1 +CS.RUN.PRINT.REG1 + ldx #0 + clc + jsr CS.RUN.FN2LineBuf + jmp CS.RUN.LineBufOut *-------------------------------------- CS.RUN.PRINT.DIR bit bPass2 bmi .8 bit bLong - bmi .4 + bmi CS.RUN.PRINT.DIREXT + + ldy #COLOR.DIR + jsr CS.RUN.SetColorY bit bColumn - bmi .23 + bmi CS.RUN.PRINT.DIR1 bit bFullPath - bpl .22 + bpl .2 - jsr CS.RUN.PRINT.SRCPATH + jsr CS.RUN.SrcPathOut + bra CS.RUN.PRINT.DIR1 -.23 >LDYA ZPFileName - >SYSCALL PutS +.2 ldx #MAX.COLW-1 + sec + jsr CS.RUN.FN2LineBuf + jsr CS.RUN.IncColCnt bcs .9 - bit bRecurse - bpl .8 - - lda (ZPFileName) - cmp #'.' - beq .8 - - >LDYA ZPFileName - jmp EnterSubDirYA + jmp CS.RUN.PRINT.DIREND .8 clc .9 rts +*-------------------------------------- +CS.RUN.PRINT.DIREXT + jsr CS.RUN.PrintMod + jsr CS.RUN.PrintUidGid -.22 >PUSHW L.MSG.DIR - >PUSHW ZPFileName - >PUSHBI 2 - >SYSCALL PrintF + >LDYA L.MSG.DIREXT + jsr CS.RUN.LineBufYAOut + + jsr CS.RUN.PrintDates + + ldy #COLOR.DIR + jsr CS.RUN.SetColorY + +CS.RUN.PRINT.DIR1 + ldx #0 + sec + jsr CS.RUN.FN2LineBuf + jsr CS.RUN.LineBufOut bcs .9 - ldy #0 + jmp CS.RUN.PRINT.DIREND -.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 +.9 rts *-------------------------------------- CS.RUN.PRINT.CDEV clc rts *-------------------------------------- CS.RUN.PRINT.BDEV + clc bit bPass2 - bmi .8 + bmi .9 bit bLong - bmi .20 + bmi CS.RUN.PRINT.BDEVEXT + + ldy #COLOR.BDEV + jsr CS.RUN.SetColorY bit bColumn - bmi .23 + bmi CS.RUN.PRINT.BDEV1 bit bFullPath - bpl .22 + bpl .2 - jsr CS.RUN.PRINT.SRCPATH + jsr CS.RUN.SrcPathOut + bra CS.RUN.PRINT.BDEV2 -.23 >LDYA ZPFileName - >SYSCALL PutS - bcs .9 +.2 lda #'/' + jsr CS.RUN.LineBufCOut - bit bRecurse - bpl .8 + ldx #MAX.COLW-1 + sec + jsr CS.RUN.FN2LineBuf + jsr CS.RUN.IncColCnt + bcc CS.RUN.PRINT.BDEVEND - 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 +CS.RUN.PRINT.BDEVEXT + jsr CS.RUN.PrintMod + jsr CS.RUN.PrintUidGid - ldy #S.STAT.P.SLOT - >PUSHB (ZPFileStat),y - iny DRIVE - >PUSHB (ZPFileStat),y + >PUSHW ZPLineBufPtr + >PUSHW L.MSG.BDEVEXT ldy #S.STAT.BLOCKS+1 >PUSHB (ZPFileStat),y @@ -483,36 +434,127 @@ CS.RUN.PRINT.BDEV dey >PUSHB (ZPFileStat),y - >PUSHBI 8 + ldy #S.STAT.P.SLOT + >PUSHB (ZPFileStat),y + iny DRIVE + >PUSHB (ZPFileStat),y - >SYSCALL PrintF - bcs .90 + >PUSHBI 6 + jsr CS.RUN.ToLineBuf - jsr CS.RUN.NewLine.1 - bcs .90 + jsr CS.RUN.PrintDates + ldy #COLOR.BDEV + jsr CS.RUN.SetColorY + +CS.RUN.PRINT.BDEV1 + lda #'/' + jsr CS.RUN.LineBufCOut + +CS.RUN.PRINT.BDEV2 + ldx #0 + sec + jsr CS.RUN.FN2LineBuf + jsr CS.RUN.LineBufOut + bcc CS.RUN.PRINT.BDEVEND + + rts +*-------------------------------------- +CS.RUN.PRINT.LNK +CS.RUN.PRINT.DSOCK +CS.RUN.PRINT.SSOCK +CS.RUN.PRINT.PIPE + clc + rts +*-------------------------------------- +CS.RUN.PRINT.DIREND +CS.RUN.PRINT.BDEVEND bit bRecurse - bpl .80 + bpl .8 - >LDYA ZPFileName + lda (ZPFileName) + cmp #'.' + bne .7 + + ldy #1 + lda (ZPFileName),y + beq .8 + + cmp #'.' + bne .7 + + iny + lda (ZPFileName),y + beq .8 + + bit bLong + bmi .7 + + jsr CS.RUN.LineBufFlush + bcs .9 + +.7 >LDYA ZPFileName jsr EnterSubDirYA - bcs .90 + bcs .9 jmp CS.RUN.ENTER.MSG -.80 clc -.90 rts +.8 clc +.9 rts *-------------------------------------- -CS.RUN.PRINT.SRCPATH +CS.RUN.ENTER.MSG + ldy #COLOR.ENTER + jsr CS.RUN.SetColorY + + >LDYA L.MSG.ENTER + jsr CS.RUN.LineBufYAOut + ldy #hSrcBasePath lda (pData),y >SYSCALL GetMemPtr - >PUSHYA - >PUSHBI 0 - >SYSCALL PrintF + jsr CS.RUN.LineBufYAOut + + ldy #0 + jsr CS.RUN.SetColorY + + jmp CS.RUN.LineBufOut +*-------------------------------------- +CS.RUN.PrintMod ldy #S.STAT.MODE+1 + lda (ZPFileStat),y + lsr + php C = RU + + lsr + lsr + lsr + tax + lda TYPES,x + jsr CS.RUN.LineBufCOut + + ldy #S.STAT.MODE + lda (ZPFileStat),y + + ldx #8 + + plp C = RU + +.1 pha + lda #'-' + bcc .2 + + lda ACCESS,x + +.2 jsr CS.RUN.LineBufCOut + + pla + asl + + dex + bpl .1 + rts *-------------------------------------- -CS.RUN.PushUidGid +CS.RUN.PrintUidGid ldy #S.STAT.UID lda (ZPFileStat),y >PUSHA @@ -520,195 +562,290 @@ CS.RUN.PushUidGid >SYSCALL GetPWUID bcs .2 - >PUSHEA.G USER - jsr CS.RUN.PushUidGidStr + jsr .8 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 - +.2 ldy #S.STAT.UID+1 + jsr .7 +*-------------------------------------- .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 + bcc .8 ldy #S.STAT.GID+1 + +.7 >PUSHW ZPLineBufPtr + >PUSHW L.FMT.int16 + 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 + jmp CS.RUN.ToLineBuf + +.8 >LDYA ZPPWBuf + ldx #5 + jmp CS.RUN.LineBufYAOutX *-------------------------------------- -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 - +CS.RUN.PrintDates 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 + jsr .8 + bra .2 - ldy #S.TIME.CENTURY - lda (ZPPtr1),y - ldy #TIME.SysTime+S.TIME.CENTURY - cmp (pData),y - bne .9 +.1 lda #S.STAT.MTIME + jsr .5 - ldy #S.TIME.YEAR - lda (ZPPtr1),y - ldy #TIME.SysTime+S.TIME.YEAR - cmp (pData),y - bne .9 +.2 ldy #S.STAT.CTIME+S.TIME.MONTH + lda (ZPFileStat),y + beq .8 - ldy #S.TIME.MONTH - lda (ZPPtr1),y - ldy #TIME.SysTime+S.TIME.MONTH - cmp (pData),y - bne .9 + lda #S.STAT.CTIME + +.5 clc + adc ZPFileStat + sta ZPPtr1 + + lda #0 + adc ZPFileStat+1 + sta ZPPtr1+1 + + >PUSHW ZPLineBufPtr + + ldx #0 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 +.6 lda (ZPPtr1),y + cmp (pData),y TIME.SysTime + bne .7 + + dey S.TIME.MONTH,S.TIME.YEAR,S.TIME.CENTURY + bpl .6 + + inx + inx Select L.FMT.Time + +.7 >PUSHW L.FMT.Date,x -.9 >PUSHW L.FMT.Date >PUSHW ZPPtr1 + >SYSCALL StrFTime + + lda #10 + jmp CS.RUN.LineBufPtrAddA + +.8 >LDYA L.MSG.NODATE + jmp CS.RUN.LineBufYAOut +*-------------------------------------- +CS.RUN.PrintTypeAux + ldy #S.STAT.P.TYPE + lda (ZPFileStat),y + + ldy #PRODOS.FT.TXT-PRODOS.FT.HEX-1 + +.1 cmp PRODOS.FT.HEX,y + beq .2 + + dey + bpl .1 + + pha + lda #'$' + jsr CS.RUN.LineBufCOut + pla + jsr CS.RUN.LineBufHOut + bra .3 + +.2 tya + asl + asl CC + adc L.PRODOS.FT.TXT + tay + + lda L.PRODOS.FT.TXT+1 + adc #0 + jsr CS.RUN.LineBufYAOut + +.3 lda #C.SPACE + jsr CS.RUN.LineBufCOut + + ldy #S.STAT.P.AUXTYPE+1 + lda (ZPFileStat),y + tax + dey + ora (ZPFileStat),y + beq .4 + + txa + jsr CS.RUN.LineBufHOut + + lda (ZPFileStat),y + jsr CS.RUN.LineBufHOut + + ldx #0 + bra .5 + +.4 ldx #4 + +.5 lda #C.SPACE + +.6 jsr CS.RUN.LineBufCOut + dex + bpl .6 + rts *-------------------------------------- -CS.RUN.UpdateColCnt +CS.RUN.FN2LineBuf + phx X = MaxLen + + php + + >LDYA ZPFileName + jsr CS.RUN.LineBufYAOutX Y = output count + + plp + bcc .1 + + lda #'/' + jsr CS.RUN.LineBufCOut + +.1 pla MaxLen was 0, no extra SPACE needed + beq .3 + + txa + beq .3 all chars printed, no more SPACE + + lda #C.SPACE + +.2 jsr CS.RUN.LineBufCOut + dex + bne .2 + +.3 ldy #0 Reset Color +*-------------------------------------- +CS.RUN.SetColorY + bit bToFile + bmi CS.RUN.IncColCnt.8 + + >PUSHW ZPLineBufPtr + >PUSHW L.MSG.SETCOLOR + tya + >PUSHA + >PUSHBI 1 +*-------------------------------------- +CS.RUN.ToLineBuf + >SYSCALL SPrintF +*-------------------------------------- +CS.RUN.LineBufPtrAddY + tya +CS.RUN.LineBufPtrAddA + clc + adc ZPLineBufPtr + sta ZPLineBufPtr + bcc .8 + + inc ZPLineBufPtr+1 + +.8 rts +*-------------------------------------- +CS.RUN.IncColCnt inc ColCount lda ColCount - cmp #MAX.COL - bne CS.RUN.NewLine.8 + cmp #MAX.COLC + beq CS.RUN.LineBufFlush1 - stz ColCount - - bra CS.RUN.NewLine.1 +CS.RUN.IncColCnt.8 + clc + rts *-------------------------------------- -CS.RUN.ENTER.MSG - >PUSHW L.MSG.ENTER +CS.RUN.LineBufFlush + lda ColCount + beq CS.RUN.IncColCnt.8 + +CS.RUN.LineBufFlush1 + stz ColCount +*-------------------------------------- +CS.RUN.LineBufOut + lda #C.CR + jsr CS.RUN.LineBufCOUT + bit bToFile + bmi .1 + + lda #C.LF + jsr CS.RUN.LineBufCOUT + +.1 lda #0 + sta (ZPLineBufPtr) + + ldy #S.PS.hStdOut + lda (pPS),y + >PUSHA + + >LDYA ZPLineBuf + >STYA ZPLineBufPtr + + >PUSHYA + + >SYSCALL fputs + rts +*-------------------------------------- +CS.RUN.SrcPathOut ldy #hSrcBasePath lda (pData),y >SYSCALL GetMemPtr - >PUSHYA - >PUSHBI 2 +*-------------------------------------- +CS.RUN.LineBufYAOut + ldx #0 +*-------------------------------------- +CS.RUN.LineBufYAOutX + >STYA ZPPtr1 X = MaxLen - >SYSCALL PrintF - bcc CS.RUN.NewLine.1 + ldy #$ff + +.1 iny + lda (ZPPtr1),y + beq .8 + + jsr CS.RUN.LineBufCOut + dex + bne .1 + +.8 clc rts *-------------------------------------- -CS.RUN.NewLine lda ColCount - beq CS.RUN.NewLine.8 -CS.RUN.NewLine.1 - lda #C.CR - >SYSCALL PutChar +CS.RUN.LineBufHOut + pha + lsr + lsr + lsr + lsr + jsr .1 - lda bIsTTY - beq CS.RUN.NewLine.8 + pla + and #$0F - lda #C.LF - >SYSCALL PutChar +.1 ora #$30 + cmp #'9'+1 + bcc CS.RUN.LineBufCOut -CS.RUN.NewLine.8 - clc - rts + adc #6 *-------------------------------------- -CS.RUN.ISATTY ldy #S.PS.hStdOut - lda (pPS),y - tax - lda hFDs-1,x - >SYSCALL GetMemPtr - >STYA ZPPtr1 - lda (ZPPtr1) - beq .9 +CS.RUN.LineBufCOut + sta (ZPLineBufPtr) + inc ZPLineBufPtr + bne .8 - inc bIsTTY + inc ZPLineBufPtr+1 -.9 rts +.8 rts *-------------------------------------- CS.DOEVENT sec rts @@ -731,86 +868,6 @@ CS.QUIT jsr LeaveSubDir .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 *-------------------------------------- @@ -826,14 +883,13 @@ MSG.USAGE .AS "Usage : LS [-A] [-C] [-F] [-L] [-R] [filespec]\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" +MSG.ENTER .AZ "Directory:" *-------------------------------------- +MSG.REGEXT .AZ " %10u " +MSG.DIREXT .AZ " " +MSG.BDEVEXT .AZ " %5D/%5D s%dd%d " +*-------------------------------------- +MSG.SETCOLOR .AZ "\e[1;%dm" PRODOS.FT.HEX .HS 0406FAFCFDCBCCCFFF PRODOS.FT.TXT .AZ "txt" .AZ "bin" @@ -844,27 +900,18 @@ PRODOS.FT.TXT .AZ "txt" .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" +MSG.NODATE .AZ " " +FMT.Date .AZ "%d-%b-%y " +FMT.Time .AZ " %H:%M:%S " FMT.int16 .AZ "%6D" -TYPES .AS "-dbclssp" +TYPES .AS "-dcblssp" 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 *-------------------------------------- diff --git a/BIN/LSDEV.S.txt b/BIN/LSDEV.S.txt index 30c8079c..2552bfe0 100644 --- a/BIN/LSDEV.S.txt +++ b/BIN/LSDEV.S.txt @@ -132,10 +132,17 @@ DumpFD.BDEV >PUSHW L.MSG.DEV dex bpl .1 + lda #S.IOCTL.S.GETDIB + >STA.G DEV.IOCTL+S.IOCTL.S + + >LEA.G DEV.DIB + >STYA.G DEV.IOCTL+S.IOCTL.BUFPTR + ldx Index >PUSHB hFDs,x - >PUSHEA.G DEV.DIB - >SYSCALL GetDevStatus + >PUSHBI IOCTL.STATUS + >PUSHEA.G DEV.IOCTL + >SYSCALL IOCTL bcc DumpFD.DevDIB pha @@ -270,6 +277,7 @@ BLANK.DIB .DA #0 #S.DIB.S.BLOCK+S.DIB.S.WRITE+S.DIB.S.READ .DUMMY .OR 0 DS.START +DEV.IOCTL .BS S.IOCTL DEV.DIB .BS S.DIB DEV.SFLAGS .BS 9 DS.END .ED diff --git a/INC/A2osX.I.txt b/INC/A2osX.I.txt index ead4c91d..573310e8 100644 --- a/INC/A2osX.I.txt +++ b/INC/A2osX.I.txt @@ -257,7 +257,7 @@ SYS.StrCmp .EQ $8C SYS.StrCaseCmp .EQ $8E * DEV SYS.GetDevByName .EQ $90 -SYS.GetDevStatus .EQ $92 +SYS.MKFD .EQ $92 SYS.MKDev .EQ $94 SYS.IOCTL .EQ $96 * BIN diff --git a/ProDOS.FX/ProDOS.S.XDOS.A.txt b/ProDOS.FX/ProDOS.S.XDOS.A.txt index 98cdd45e..f547f7d4 100644 --- a/ProDOS.FX/ProDOS.S.XDOS.A.txt +++ b/ProDOS.FX/ProDOS.S.XDOS.A.txt @@ -581,23 +581,23 @@ XDOS.Online jsr mvdbufr figure out how big buffer has to be. lda (A3L),y if 0 then cbytes=$100 else $010 for one and #$F0 device. mask out unused nibble. sta devnum last device used. - beq H343C branch if all devices. + beq .1 branch if all devices. lda #$10 cbytes = $010 sta cbytes - bne H343F always taken + bne .2 always taken -H343C inc cbytes+1 cbytes = $100 +.1 inc cbytes+1 cbytes = $100 -H343F jsr valdbuf go validate buffer range against - bcs onlinerr allocated memory. +.2 jsr valdbuf go validate buffer range against + bcs .9 allocated memory. lda #$00 zero out user buffer space ldy cbytes -H3449 dey +.3 dey sta (usrbuf),y - bne H3449 + bne .3 sta namptr used as pointer to user buffer. lda devnum get device # again. @@ -605,7 +605,7 @@ H3449 dey jsr mvdevnums get list of currently recognized dev's. -H3459 phx save index to last item on list +.4 phx save index to last item on list lda loklst,x sta devnum save desired device to look at. jsr online1 log this volume and return it's name. @@ -615,60 +615,60 @@ H3459 phx save index to last item on list sta namptr plx get index to device list. dex next device. - bpl H3459 branch if there is another device. + bpl .4 branch if there is another device. lda #$00 no errors for multiple on-line clc -onlinerr rts +.9 rts *-------------------------------------- online1 jsr XDOS.FindVCBForDevNum see if it has already been logged in. - bcs olinerr1 branch if vcb is full. + bcs online1.ERR branch if vcb is full. lda #$02 ldx #$00 read in root (volume) directory jsr XDOS.ReadGBufAX read ROOT VOL into general purpose buffer. - bcc volfound branch if read was ok. + bcc .1 branch if read was ok. ldx vcbptr ldy VCBs+VCB.OFCNT,x don't take the vcb offline if - bne olinerr1 there are active files present. + bne online1.ERR there are active files present. stz VCBs,x now take the volume offline stz VCBs+VCB.DEV,x - bra olinerr1 branch if unable to read. + bra online1.ERR branch if unable to read. -volfound .DO LOWERCASE=1 +.1 .DO LOWERCASE=1 jsr XDOS.CheckAndUnpackGBuf - bcs olinerr1 + bcs online1.ERR .FIN ldx vcbptr lda VCBs,x has it been logged in before? - beq H349E if not. + beq .2 if not. lda VCBs+VCB.OFCNT,x it has, are there active files? - bne H34AA branch if volume is currently busy. + bne .3 branch if volume is currently busy. -H349E jsr XDOS.VCBMountAtX - bcs olinerr1 branch if there is a problem. +.2 jsr XDOS.VCBMountAtX + bcs online1.ERR branch if there is a problem. lda #MLI.E.DUPVOL anticipate a duplicate active volume bit duplflag exits. - bmi olinerr1 branch if so. + bmi online1.ERR branch if so. -H34AA ldx vcbptr +.3 ldx vcbptr jsr XDOS.VCBCmpGBUF does vol read compare with logged vol? lda #MLI.E.DSKSWIT anticipate wrong volume mounted. - bcc H34D0 branch if ok. - -olinerr1 pha save error code. + bcc online1.OK branch if ok. +*-------------------------------------- +online1.ERR pha save error code. jsr svdevn report what device has problem. pla error code. iny tell what error was encountered. sta (usrbuf),y cmp #MLI.E.DUPVOL duplicate volume error? - bne H34CE no. + bne .1 no. iny report which other device has same name ldx vcbentry @@ -678,19 +678,19 @@ olinerr1 pha save error code. lda #MLI.E.DUPVOL duplicate volume error code. -H34CE sec flag error +.1 sec flag error rts - -H34D0 lda VCBs,x get volume name count +*-------------------------------------- +online1.OK lda VCBs,x get volume name count sta namcnt ldy namptr index to user's buffer. -H34D9 lda VCBs,x move name to user's buffer +.1 lda VCBs,x move name to user's buffer sta (usrbuf),y inx iny dec namcnt - bpl H34D9 + bpl .1 svdevn ldy namptr index to 1st byte of this entry. lda devnum upper nibble = device# and diff --git a/SYS/KERNEL.S.DEV.txt b/SYS/KERNEL.S.DEV.txt index fd540268..d8b83afd 100644 --- a/SYS/KERNEL.S.DEV.txt +++ b/SYS/KERNEL.S.DEV.txt @@ -66,68 +66,20 @@ K.GetDevByName >STYA ZPPtr1 requested dev name K.GetDev.9 rts */-------------------------------------- -* # GetDevStatus +* # MkFD * ## C -* `int getdevstatus(short int DevID, S.DIB *dstat);` +* `short int mkfd(short int type, );` * ## ASM * `>PUSHB DevID` * `>PUSHW S.DIB` * `>SYSCALL GetDevStatus` * ## RETURN VALUE *\-------------------------------------- -K.GetDevStatus >PULLW K.S.IOCTL+S.IOCTL.BUFPTR - >PULLA +K.MkFD - jsr DEV.GetPFD - bcs K.GetDev.9 - lda #S.IOCTL.S.GETDIB - .HS 2C BIT ABS -*-------------------------------------- -DEV.EOF lda #S.IOCTL.S.EOF -*-------------------------------------- -DEV.GetStatus sta K.S.IOCTL+S.IOCTL.S - - ldy #S.FD.DEV.DEVID - lda (pFD),y - sta K.S.IOCTL+S.IOCTL.UNITNUM - - >LDYAI K.S.IOCTL - ldx #IOCTL.STATUS -*-------------------------------------- - jmp (pDrv) -*-------------------------------------- -DEV.OPEN ldx #IOCTL.OPEN - lda IO.hFD - jsr DEV.pDrvJmp - bcs .9 - - lda IO.hFD - -.9 rts -*-------------------------------------- -DEV.CLOSE ldx #IOCTL.CLOSE - lda IO.hFD - -DEV.pDrvJmp jmp (pDrv) -*-------------------------------------- -DEV.READ ldx #IOCTL.READ - .HS 2C BIT ABS -*-------------------------------------- -DEV.WRITE ldx #IOCTL.WRITE - - >PULLW K.S.IOCTL+S.IOCTL.BYTECNT - >PULLW K.S.IOCTL+S.IOCTL.BUFPTR - - inc pStack pop hFD - - >LDYAI K.S.IOCTL - jsr DEV.pDrvJmp - bcs .9 - - >LDYA K.S.IOCTL+S.IOCTL.BYTECNT - -.9 rts + clc + rts */-------------------------------------- * # MKDev * Create a hDEV @@ -239,6 +191,51 @@ K.IOCTL ldy #3 hFD jmp (pDrv) *-------------------------------------- +DEV.OPEN ldx #IOCTL.OPEN + lda IO.hFD + jsr DEV.pDrvJmp + bcs .9 + + lda IO.hFD + +.9 rts +*-------------------------------------- +DEV.CLOSE ldx #IOCTL.CLOSE + lda IO.hFD + + jmp (pDrv) +*-------------------------------------- +DEV.READ ldx #IOCTL.READ + .HS 2C BIT ABS +*-------------------------------------- +DEV.WRITE ldx #IOCTL.WRITE + + >PULLW K.S.IOCTL+S.IOCTL.BYTECNT + >PULLW K.S.IOCTL+S.IOCTL.BUFPTR + + inc pStack pop hFD + + >LDYAI K.S.IOCTL + jsr DEV.pDrvJmp + bcs .9 + + >LDYA K.S.IOCTL+S.IOCTL.BYTECNT + +.9 rts +*-------------------------------------- +DEV.EOF lda #S.IOCTL.S.EOF +*-------------------------------------- +DEV.GetStatus sta K.S.IOCTL+S.IOCTL.S + + ldy #S.FD.DEV.DEVID + lda (pFD),y + sta K.S.IOCTL+S.IOCTL.UNITNUM + + ldx #IOCTL.STATUS + >LDYAI K.S.IOCTL +*-------------------------------------- +DEV.pDrvJmp jmp (pDrv) +*-------------------------------------- DEV.GetPFD sta IO.hFD jsr K.GetMemPtr diff --git a/SYS/KERNEL.S.JMP.txt b/SYS/KERNEL.S.JMP.txt index f3c110b3..0b3a66d1 100644 --- a/SYS/KERNEL.S.JMP.txt +++ b/SYS/KERNEL.S.JMP.txt @@ -89,7 +89,7 @@ K.SYSCALL .DA K.ChTyp $00 : STAT .DA K.StrCaseCmp .DA K.GetDevByName $90 : DEV - .DA K.GetDevStatus + .DA K.MKFD .DA K.MKDev .DA K.IOCTL .DA K.LoadLib BIN diff --git a/SYS/KERNEL.S.STAT.txt b/SYS/KERNEL.S.STAT.txt index 9368df3d..168f676a 100644 --- a/SYS/KERNEL.S.STAT.txt +++ b/SYS/KERNEL.S.STAT.txt @@ -12,16 +12,14 @@ NEW * ## RETURN VALUE *\-------------------------------------- K.ChTyp jsr PFT.CheckPath1 - bcs K.ChTyp.9 + bcs K.ChMod.RET3 >MLICALL MLIGETFILEINFO - bcs K.ChTyp.9 + bcs K.ChMod.RET3 lda (pStack) sta K.MLI.PARAMS+S.FI.T -K.ChTyp.8 >MLICALL MLISETFILEINFO - -K.ChTyp.9 >RET 3 + bra K.SetAttr.I */-------------------------------------- * # SetAttr * Change Attributes of a ProDOS File @@ -34,14 +32,16 @@ K.ChTyp.9 >RET 3 * ## RETURN VALUE *\-------------------------------------- K.SetAttr jsr PFT.CheckPath1 - bcs K.ChTyp.9 + bcs K.ChMod.RET3 >MLICALL MLIGETFILEINFO - bcs K.ChTyp.9 + bcs K.ChMod.RET3 lda (pStack) sta K.MLI.PARAMS+S.FI.A - bra K.ChTyp.8 + +K.SetAttr.I >MLICALL MLISETFILEINFO + bra K.ChMod.RET3 *-------------------------------------- * # ChMod * change permissions of a file @@ -73,6 +73,7 @@ K.ChMod jsr PFT.CheckPath2 .9 rts K.ChMod.RET4 inc pStack + K.ChMod.RET3 inc pStack inc pStack inc pStack diff --git a/SYS/KM.VSDRIVE.S.txt b/SYS/KM.VSDRIVE.S.txt index b7722f78..b36ff827 100644 --- a/SYS/KM.VSDRIVE.S.txt +++ b/SYS/KM.VSDRIVE.S.txt @@ -302,11 +302,13 @@ VSDRIVE.Install ldx #PATCH.LEN asl ora #SSC.DATA + sta DRV.SSCWrite.D+1 sta DRV.SSCSend.D+1 sta DRV.SSCGet.D+1 inc #SSC.STATUS + sta DRV.SSCWrite.S+1 sta DRV.SSCSend.S+1 sta DRV.SSCGet.S+1 sta DRV.SSCClose.S+1 @@ -363,12 +365,22 @@ PATCH.LEN .EQ *-PATCH * PC,A1,A2 are used by Disk II Driver, * so we use it safely as Tmp Ptr *-------------------------------------- -DRV.PCL .EQ $3A -DRV.PCH .EQ $3B -DRV.A1L .EQ $3C -DRV.A1H .EQ $3D -DRV.A2L .EQ $3E -DRV.A2H .EQ $3F +*DRV.PCL .EQ $3A +*DRV.PCH .EQ $3B +*DRV.A1L .EQ $3C +*DRV.A1H .EQ $3D +*DRV.A2L .EQ $3E +*DRV.A2H .EQ $3F +*-------------------------------------- + .DUMMY + .OR $3A +DRV.CmdBuf.Sum .BS 1 Reverse order for dey +DRV.CmdBuf.BlkH .BS 1 +DRV.CmdBuf.BlkL .BS 1 +DRV.CmdBuf.Cmd .BS 1 +DRV.CmdBuf.Env .BS 1 + .ED +*-------------------------------------- DRV.COMMAND .EQ $42 DRV.UNITNUM .EQ $43 DRV.BUFF .EQ $44 @@ -400,27 +412,37 @@ DRV.START.OK tax ora #2 W=2,R=3 - ldy DRV.UNITNUM + bit DRV.UNITNUM bpl .2 adc #2 CC from bcs .2 sta DRV.CmdBuf.Cmd store cmd - eor #ADT.CMD.VSD - eor DRV.BLKNUM - eor DRV.BLKNUM+1 - sta DRV.CmdBuf.Sum Compute & store CheckSum + lda #ADT.CMD.VSD + sta DRV.CmdBuf.Env + lda DRV.BLKNUM sta DRV.CmdBuf.BlkL lda DRV.BLKNUM+1 sta DRV.CmdBuf.BlkH + + stz DRV.CmdBuf.Sum *-------------------------------------- * send CMD+CS *-------------------------------------- php sei + + phx + + ldy #DRV.200.LEN-1 + +.1 lda DRV.200,y + sta $200,y + dey + bpl .1 * lda #SSC.CMD.NOP+SSC.CMD.RIRQDIS+SSC.CMD.TE+SSC.CMD.DTR DRV.INIT.C inc SSC.CMD SELF MODIFIED @@ -429,29 +451,27 @@ DRV.INIT.C inc SSC.CMD SELF MODIFIED .3 lda DRV.CmdBuf.Sum,y jsr DRV.SSCSend + eor DRV.CmdBuf.Sum + sta DRV.CmdBuf.Sum dey - bpl .3 + bne .3 - ldy #DRV.200.LEN-1 - -.5 lda DRV.200,y - sta $200,y - dey - bpl .5 + jsr DRV.SSCSend A = Sum *-------------------------------------- + plx dex 1-1=0 if read bne DRV.DO.CMD.W go write *-------------------------------------- * Read block *-------------------------------------- -DRV.DO.CMD.R ldy #3 Read Back and check 4 bytes +DRV.DO.CMD.R ldy #4 Read Back and check 4 bytes .1 jsr DRV.SSCGet - eor DRV.CmdBuf.BlkH,y + eor DRV.CmdBuf.Sum,y bne DRV.DO.CMD.ERR dey - bpl .1 + bne .1 ldy #4 Read 4 bytes DATE/TIME + 1 Byte Checksum @@ -505,17 +525,27 @@ DRV.DO.CMD.W lda #$B1 lda (),y sec .HS 90 BCC -.1 clc +DRV.SSCWrite.1 clc -.2 jsr $200 - jsr DRV.SSCSend +DRV.SSCWrite.2 jsr $200 + + tax + +DRV.SSCWrite.S lda SSC.STATUS SELF MODIFIED + and #SSC.STATUS.TDRE Outgoing char? + beq DRV.SSCWrite.S + +DRV.SSCWrite.D stx SSC.DATA SELF MODIFIED + + txa + eor DRV.CmdBuf.Sum sta DRV.CmdBuf.Sum iny - bne .2 + bne DRV.SSCWrite.2 inc DRV.BUFF+1 - bcs .1 + bcs DRV.SSCWrite.1 dec DRV.BUFF+1 dec DRV.BUFF+1 @@ -541,19 +571,21 @@ DRV.SSCClose DRV.SSCClose.C dec SSC.CMD SELF MODIFIED DRV.SSCClose.S bit SSC.STATUS SELF MODIFIED bmi DRV.SSCClose.S + plp clc rts *-------------------------------------- -DRV.SSCSend pha +DRV.SSCSend tax DRV.SSCSend.S lda SSC.STATUS SELF MODIFIED and #SSC.STATUS.TDRE Outgoing char? beq DRV.SSCSend.S - pla +DRV.SSCSend.D stx SSC.DATA SELF MODIFIED + + txa Restore A for checksumming -DRV.SSCSend.D sta SSC.DATA SELF MODIFIED rts *-------------------------------------- DRV.SSCGet @@ -569,12 +601,6 @@ DRV.200 bit RRAMWRAMBNK1 bit RRAMWRAMBNK2 rts DRV.200.LEN .EQ *-DRV.200 -*-------------------------------------- -DRV.CmdBuf.Sum .BS 1 Reverse order for dey -DRV.CmdBuf.BlkH .BS 1 -DRV.CmdBuf.BlkL .BS 1 -DRV.CmdBuf.Cmd .BS 1 -DRV.CmdBuf.Env .DA #ADT.CMD.VSD *-------------------------------------- .EP *--------------------------------------