From d4fc8d1b42222b8c2d8a2a53fc94dfbfcc57d960 Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Sat, 28 Aug 2021 14:24:20 -0400 Subject: [PATCH] Better handling of *DIR ^ and *DIR ^/SOME/PATH --- applecorn.po | Bin 819200 -> 819200 bytes mainmem.s | 131 ++++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 108 insertions(+), 23 deletions(-) diff --git a/applecorn.po b/applecorn.po index c9b2b75cf50849d799c85d291b61cb1adeee8bd6..d854eccefe2b0f74202a0973e6f76397642069f4 100644 GIT binary patch delta 4234 zcma)8eNaa;ShU$x_wR#BH~7pt{wSKY2V1=>Hh{bxzs z*|0NPFJtTIo9@u|jdj&nUIjK<|g<8tef6m3q{k)tUK*>XW$dekKoDVtBIOR>5b)a9hQw5v-D z%`aJ^@fB)j>2tCcXnHj8@MxA+v#jvx=e8^>+FDq+am$WnFKALuYmw$y>I1VGdTx?d zll%0xZJRefv$bf8M)^qf$V@WeSOFuj7>|3d~5XbQcC+o_2VXY3IeMCE*`%_j! z7Pp{UcjE6Sk8s+-V>#NaV`9q9h8k{-mhVim@!Nf5nE3hMS-v|~jCNi$4 zLK}akUbn!&%$+Vzouk#>3HDBDP>M-P+I@03n6RgU$7vVhbb*;Widj+;4u)l^IgZc= zxp*0_j?mz!n$DP8pVYz0mHt2s4@7ZD8i^@98{o2n5wcyPMzo5qk7FMJmjH_vL!~SKT%K zE_)}y0oAG4S%p46@u`)O9~uq}4)iMB5eft)932fMQtfs(8a_h1Ilkvp-A02W92%Bn zNc7=8s%Oc{QZPKsR0-PeQ`!YGhv#7l*m=-IDgzcK{J@|r1$sv@NFx@G)PRTBkQ~B8 zA(gLQ3yqiGSs0)vCN!+X=?_PVIxyri5u+MV!xMS1pl!0OUaUmrkc za|N?I{26a z5TcYk?6P-Lo2O22__~=7rV6Ef9!w4p1e-=oRu6#GbW=g`8=t4}>U6=EGORpx@orQ4 zjFBNY4VMJ)PJ#0H!08*1qv}M!;l5;-CI?fZ@-VCcQX zUVBzf>X7c5aaI^U<0$Or(IhT7R&o;5~zJR(@;Gc?v8<3v2p4V;T zi%z0tjmtKm5pCm&jp#$}WC7BqoHC#J1pXKKv0)R+Nn5;Ke|Xw)O;ZPsq~qY-e&dia z4OiX8*YA{wX@t%vW(#cNSNXL?=!t2t^K*iC>CIZxYV+f!HL$KV7xJbe z-4~ILOW#f06Cx>Qj(?{Z%_=gN(wW3e=qzSrpFv9gW;xgbpJF(e$POMMW(S=_%oFKk zQk_kzrx5c5I+ciro9Q$nzS~T5i1=PJole9f&Gb=%3;913qaB7)I)~k!OU$(tv!{71 zz@^y_0u;E7zGv}*1xg^QQ)5AHYPeJgXV%bc_5~ri{~1zm)?nYls?!T^X?&?>jj-Lw zKfe>rnK6zW8c)D~26LXt0JNqP>qKz^;s3M~<&7(iQ!SPfzG)}Yvkg5nYgCRucR>z2%)2_#8i671SN?;=kO3vX{ek`b$DLvzuRTBi0qLc5EV6y;wx@ zgN1~iTO__ff?Eh}SR`&I!L5Why@Xb?XlvM=_SJ+h+l8j{*Y=?FIn3K;B9;?cNW?b? z-9p4S3Ej#Jy_?1uu1p%bHJ~d9y@?o8)zFqQVqNpL_)ZIaXhw@zNRDd6E#xRCLhN7f zLW{L!g#YU$&2661+p`ja=~uVp?rlE8ZcdHKwWS`rwx(2}RYgqH3Y2 z{F0Z^V#7TGR`-c%op?PLPQ)9zaAek)Hke;EJu@9oa;Vop0oHj&6uOpc{Bu5-2A@*G z-N+5DWZ{f`W@CYI9(8nsg9BAAyPd;sz-@fOx){pb?NjT$%LOJR&7T5gnI;DtM8L)&EwVF zg7E2OW#c_0Y{qr>c5+ zlDV8uKrj3rv@k7xn|JI%^9^Ddaqo$wx>rT!8fU^y{FWY{*MnvwY3%4{zD)eJ9*6YP zON^TQC)o7KSt)Y5 z+;mz>&fL;OGMYHu2c@LV7%kCQ0RL1$>w!gU&G@{Oy#G3BHAcLpq@<>n9M=rOL1t4K zd4HCb^tT$nI|S}w7b0ggS;+@wq~9o4mGb4UpkJU`!j+Q7^RJ*krl2y@duGC~*^6ds zVHUl#7wOshm%V5^Td(g$>)ASYANtKa7!RnW*tq^}n$mKplvI@|?{1ARkL^^K6MpJ` zw2*JzhbE3MC+9f&205ptZxX&|AIj6J$7NiEH|<9YAnsv^YuS(1f&a$ve)KKJ96H~3l@*zl72{4;jMx4f)sYF# delta 2269 zcma)6eNa@_6@MRGK#fAA5yo2gl7PCLR|48jnO5huZ0LNbzSpa z?doQH%%gtIE7p@l&%bKOlcc;wZE6XV%RQ?eBZ;c#d4s$tbKfSCf@ObLuG>tMu=nfg zKg7cSv*`&E8?kf+R4u5LTCdQ_NE*01rr*&cXysjcj^7KrSx&S37 zf&Lhb=Nu~y&9MqG-Pp(-nWQsvFSNcH&-MY|`U~QoZ=5`3x=y>#G@SioW0U8jkIywD z<#^LC$ro}=1GpsBN6nNrb{eSE*5v}v-Cq$^j_d{R+{rLQ<`p~0qHTtsRe%BPurTU) z4YH2A4z%NwiHb6z(81_r2f&D82f_I=I9~x{E^~lc)yB%fe4~xM3g(eEb_mSsHuig< z8h?HVd8*9MDuws!VAxm{7#e#+5L{sQ2r|67?@^kN5F%oGEiQaFi!L1L42iugevnfB zpOk1seTkJHCJsrya6_uuuJgxtlEn*Ogu}lDjQ?v9{5K+j%lp9{WxfRb;7*b<$3I2ma+wl59i4dxE`AUT+GaIp*A zX=V?w9L@X$SgvN~XpVJkmuBW_j`i$m9-Bj!M9z#bZ_Oo?WZ>v$@q!$Zgj4Y!!{)qh z|L@($$k=|2`+xM`y-}q9XqvfO3lwPVhTSaD0)-m$+sy*avC@%l7UE5EJh1vEe#J{- zQzg+<1)Iv3<&vdkyEU{b(HyJI8+O!~emklR$+6DJajcJ{_jg)uI05c>os3_%>#wAt zX`l`So!=g)2c*+)8hVBvFKn$#d>})Q`Q}tb3_PoboIwZeG=JGM)5D}y26%rinUD3^ z3s$xFeXHQ5R>4J;Lp5hlYtB5)nXfsY(VWj}=4J4%v8$16w>BF;%iPMW$ho^UJUUA> zXQ}4gqlxMyi8QPkZ3dhOR-oZXutE)If)#1bV$DpONjqyisIu+t*zo*6-@CDNi@42r zQ#HJ%BIFN6$ZEiO;dvx6V%nQ`=8=bzXZ}abLGbSIMbV!N-;agwInZZg+i?%LM~?1~ zfT!k@xS!&_{dbUsaQV3q^qvSo&yf&(QX7IxjR;%7Wz!~OdRlFo_uG;VO^%vo8k=U~$4klg=Gn9my(P5qu2NDfQhRm}vCp?0 zTmiNG53X^w{O#JC+*LvnJeT*7wEL=~l`2nmvn)sR?Uls-YSJNsD;!q@u1H+7aLx84 K9h&o}fBYLXe9Nr> diff --git a/mainmem.s b/mainmem.s index e2b803b..a95e9d0 100644 --- a/mainmem.s +++ b/mainmem.s @@ -47,10 +47,10 @@ SETPRFX LDA #GPFXCMD LDX $0300 BNE RTSINST LDA $BF30 - STA ONLPL+1 ; Device number + STA ONLNPL+1 ; Device number JSR MLI DB ONLNCMD - DW ONLPL + DW ONLNPL LDA $0301 AND #$0F TAX @@ -810,28 +810,47 @@ CATALOGRET >>> ENTMAIN BRA CATREENTRY -* Set the prefix -SETPFX >>> ENTMAIN -* LDA MOSFILE ; Length -* CMP #$01 -* BNE :S1 ; Not one char - LDA MOSFILE+1 ; First char of dirname +* Preprocess path in MOSFILE, handling '^' character +* '^' means parent dir (eg: '^/SOMEDIR')) +* Carry set on error, clear otherwise +PREPATH LDA MOSFILE+1 ; First char of dirname CMP #$5E ; '^' char - BNE :S1 ; Not '^' + BEQ :CARET ; If '^' + CMP #$3A ; ':' char + BEQ :COLON + BRA :EXIT ; Nothing to do +:CARET JSR GETPREF ; Current prfx -> MOSFILE2 JSR PARENT ; Parent dir -> MOSFILE2 - LDA #MOSFILE2 - STA SPFXPL+2 - BRA :S2 -:S1 LDA #MOSFILE2 + JSR COPYMF2 ; Copy back to MOSFILE +:EXIT CLC + RTS +:COLON +* TODO: Handle :SD for slot/drive here + BRA :ERR +:ERR SEC + RTS + +* Set prefix. Used by *DIR to change directory +SETPFX >>> ENTMAIN + JSR PREPATH ; Preprocess path + BCS :ERR + LDA #MOSFILE STA SPFXPL+2 -:S2 JSR MLI + JSR MLI ; SET_PREFIX DB SPFXCMD DW SPFXPL - >>> XF2AUX,STARDIRRET +:EXIT >>> XF2AUX,STARDIRRET +:ERR LDA #$40 ; Invalid pathname syn + BRA :EXIT * Create disk file CRTFILE JSR MLI @@ -869,10 +888,9 @@ GETPREF JSR MLI DW GPFXPL RTS -* Put parent directory in MOSFILE2 -* If already at top level, parent is current dir -PARENT JSR GETPREF - LDX MOSFILE2 ; Length of string +* Convert path in MOSFILE2 by removing leaf dir to leave +* parent directory. If already at top, return unchanged. +PARENT LDX MOSFILE2 ; Length of string BEQ :EXIT ; Prefix len zero DEX ; Ignore trailing '/' :L1 LDA MOSFILE2,X @@ -886,7 +904,74 @@ PARENT JSR GETPREF STX MOSFILE2 ; Truncate string :EXIT RTS +* Convert slot/drive to prefix +* Expect slot number (1..7) in A, drive (0..1) in X +* Puts prefix (or empty string) in MOSFILE +DRV2PFX ASL + ASL + ASL + ASL + STX :TEMP + ORA :TEMP + STA ONLNPL+1 ; Device number + JSR MLI ; Call ON_LINE + DB ONLNCMD + DW ONLNPL ; Buffer set to $301 + LDA $301 ; Slot/Drive/Length + AND #$08 ; Mask to get length + STA MOSFILE ; Store length + TAX +:L1 CPX #$00 ; Copy -> MOSFILE + BEQ :EXIT + LDA $301,X + STA MOSFILE,X + DEX + BRA :L1 +:EXIT RTS +:TEMP DB $00 + +* Delete first char of MOSFILE +DEL1CHAR LDX MOSFILE ; Length + BEQ :EXIT ; Nothing to delete + LDY #$02 ; Second char +:L1 CPY MOSFILE + BEQ :S2 ; If Y=MOSFILE okay + BCS :S1 ; If Y>MOSFILE done +:S2 LDA MOSFILE,Y + STA MOSFILE-1,Y + INY + BRA :L1 +:S1 DEC MOSFILE +:EXIT RTS + +* Append MOSFILE to MOSFILE2 +APPMF2 LDY MOSFILE2 ; Length of MOSFILE2 + LDX #$00 ; Index into MOSFILE +:L1 CPX MOSFILE ; Length of MOSFILE + BEQ :DONE + LDA MOSFILE+1,X + STA MOSFILE2+1,Y + INX + INY + BRA :L1 +:DONE STY MOSFILE2 ; Update length MOSFILE2 + RTS + +* Copy MOSFILE2 to MOSFILE +COPYMF2 LDX #$00 +:L1 CPX MOSFILE2 + BEQ :DONE + LDA MOSFILE2+1,X + STA MOSFILE+1,X + INX + BRA :L1 +:DONE STX MOSFILE + RTS + +****************************************************** * ProDOS Parameter lists for MLI calls +****************************************************** + OPENPL HEX 03 ; Number of parameters DW $0000 ; Pointer to filename DW IOBUF0 ; Pointer to IO buffer @@ -937,7 +1022,7 @@ CLSPL HEX 01 ; Number of parameters FLSHPL HEX 01 ; Number of parameters DB $00 ; Reference number -ONLPL HEX 02 ; Number of parameters +ONLNPL HEX 02 ; Number of parameters DB $00 ; Unit num DW $301 ; Buffer @@ -984,7 +1069,7 @@ QUITPL HEX 04 ; Number of parameters * Pascal string MOSFILE DS 65 ; 64 bytes max prefix/file len -* Buffer for second filename (for rename) +* Buffer for second filename * Pascal string MOSFILE2 DS 65 ; 64 bytes max prefix/file len