ô >HADFS7 v5.69 #ô Access, Account, Copy, Rename #ô ============================= (1ô v5.61 Move Rename workspace from F18 to F40 2#ô Rename works on BigDirs <(ô v5.66 Rename uses offset directory F ô v5.69 Sets Bigdir accounts PKô (Error really should be '(Object) Exists' as it could be a directory) Z: dñ "Assembling S.HADFS7" nO%=P%-Block%+mcode% x [OPT0 ‚: Œ!\ =========================== –!\ *Access - set object access  !\ =========================== ª .Access ´JSR F2toXY:JSR SearchPathXY ¾ JSR CheckForDir:BMI AccessRt È6TYA:PHA:JSR CanISave :\ Check I own ÒJSR CheckHadfsDiskX ÜJSR CheckNotOpenFF æPLA:TAY:JSR SkipSpc ðLDA #0:STA attrc:STA attrs ú .AccessLp LDA (&F2),Y:INY CMP #—"!":BCC AccessEnd CMP #—"/":BNE AccessChar "!LDA #4:STA attrc:BNE AccessLp ,.AccessChar 6€ #&DF:LDX #7 @.AccessLook J!CMP PrAccChars,X:BEQ AccessIn TDEX:BPL AccessLook ^0JSR errors:EQUB 207:EQUS "Bad attribute":BRK h .AccessIn rTXA:„A attrc:‚ #7:TAX |$LDA BitTable,X:‚ attrs:STA attrs †BCS AccessLp .AccessEnd šJSR WhatMOS:BCC CopyMaster :\ Use *ì if on Master b0:]:ç »base$>=5.79:z%=P%-z%:P%=P%-z%:O%=O%-z% l.z% v=BIT WHATOS:BMI CopyMaster :\ Use *ì if on Master €/:]:ç »base$<5.79:z%=P%-z%:P%=P%-z%:O%=O%-z% ŠSPLA:PLA:LDA #4:RTS :\ Pop return address and return 'not done' ”Z\\.CopyLp :\ Step back to point to start of 'COPY' string ž5\\DEY:\LDA (&F2),Y:\€ #&DF:\CMP #—"C":\BNE CopyLp ¨G\\JSR F2toXY:\JMP slash :\ Try to do *COPY from disk ²: ¼.CopyMaster ÆLDX #0:.CopyLp1 ÐKLDA CopyText,X:STA &DC00,X :\ Copy *ì command to string buffer ÚINX:CMP #—" ":BNE CopyLp1 ä .CopyLp2 îKLDA (&F2),Y:STA &DC00,X:INY:INX :\ Copy parameters to string buffer øJJSR XYtoF2 :\ Convert XY pointer into (&F2),Y H .CopyLp3 RBLDA (&F2),Y:INY:CMP #—" " :\ Find destination filename \BNE CopyLp3 f;LDA #4:JMP OSFile :\ Write attributes p6:\ This is annoying as only one nybble needs doing z .CopyText „EQUS "MOVE " Ž0:]:ç _OmitCopy%:z%=P%-Copy:P%=P%-z%:O%=O%-z% ˜: ¢: ¬.\ ======================================== ¶.\ *Account - Set directory account numbers À.\ ======================================== Ê .Account ÔJSR SearchPathname Þ@CMP #2:BNE AccountOk :\ Not a directory, exit èLLDA #&FF:PHA:PHA :\ Stack &FFFF for 'no main account' ò?LDA (&F2),Y:CMP #—"(":BEQ AccAux :\ Only Aux Account given üAPLA:PLA :\ Drop 'no main account' BJSR GetHexNum :\ Get main account number LDA numstore+1:PHA LDA numstore+0:PHA $CLDA #&FF:STA numstore+1 :\ Prepare 'no aux account' .ELDA (&F2),Y:CMP #—"(":BNE AccSet :\ No aux account, set accounts 8 .AccAux BQINY:JSR GetHexNum :\ Get aux account number to numstore+0/1 L .AccSet VPPLA:STA numstore+2 :\ Get main account back to numstore+2/3 `PLA:STA numstore+3 j LDX #2 t: ~\ Set account numbers ˆ\ ------------------- ’0\ numstore+2/3 = main account, b15=1 if none œ/\ numstore+0/1 = aux account, b15=1 if none ¦\ °.SetAccounts º@CPX #2:BNE AccountOk :\ Not a directory, exit ÄQJSR GetSectAddr:JSR get_chk_dir :\ Fetch directory, checking on same disk Î\JSR GetDir ØJSR CanISave â: ì.AccountLp öCLDX #2:LDY #&12 :\ X=>num.main, Y=>hdr.main .AccountLp2  MLDA numstore+1,X:BMI AccountNext :\ No account number, try next number ASL A:ASL A:ASL A:ASL A E‚ HDR+0,Y:€ #&FC :\ Drop PRIV bits, keep BOOT bits (5‚ HDR+0,Y:STA HDR+0,Y :\ Store b8-b11 26LDA numstore+0,X:STA HDR+1,Y :\ Store b0-b7 <.AccountNext F5JSR AccountAux :\ Y=>hdr.aux PBDEX:DEX:BPL AccountLp2 :\ X=>num.aux, loop to set ZJSR SaveThisDir dJSR NextChunk:BNE AccountLp n.AccountOk xRTS ‚.AccountAux Œ8LDY #&16:LDA HDR+&0C:BPL P%+4:LDY #&0E :\ Y=>hdr.aux –RTS  : ª: ´ \ ========================== ¾ \ *Rename - Rename an object È \ ========================== Ò"\ Uses FSM buffer as workspace Ü+\ FSM+&00 - copy of directory header æ,\ FSM+&20 - copy of entry information ð!\ FSM+&40-1 - fptr of source ú!\ FSM+&42-4 - CURR of source \ FSM+&45-7 - CURR of dest \ FSM+&48-9 - fptr of dest 0\ FSM+&4A-C - sect of object if a directory "\ , .rename 6dir header, Y=>end of header ä.RenameLp5 îLLDA (fptr),Y:CMP FSM+&00,Y :\ Compare header of source and dest øWBEQ P%+5:JMP RenameMove :\ Different, renaming to a different directory ;CPY #&1C:BNE P%+4:LDY #&18 :\ Skip BigDir LINK  =CPY #&10:BNE P%+4:LDY #&0E :\ Skip SmallDir LINK ZDEY:BPL RenameLp5 :\ If headers match, same directory, just renaming  XTXA:BEQ RenameSameDir :\ Dest name doesn't exist, just change the name *: 4?\ Dest exists in same directory, is it actually same entry? >?\ --------------------------------------------------------- HLDX #2:BNE RenameLp5b R.RenameLp5a \]LDA FSM+&40,X:CMP FSM+&48,X:BNE errRenExists:\ Not same entry, so trying to rename on top fI.RenameLp5b :\ of an existing object p-LDA FSM+&45,X:CMP CURR,X:BNE errRenExists zDEX:BPL RenameLp5a „: Ž/\ Pointing to same entry, just overwrite it ˜/\ ----------------------------------------- ¢.RenameSameDir ¬NJSR GetSectAndDir :\ fptr=>source entry, load source dir ¶APLA :\ Get source object type À.RenameObj ÊLPHA:JSR PutInName:JSR SaveThisDir :\ Put newname in and save directory ÔKPLA:CMP #2:BNE RenObjOk :\ Not a directory, so all finished Þ: è?\ Renamed a directory, need to change its directory headers ò?\ --------------------------------------------------------- üMJSR GetFIRSTorCURR:LDX #2 :\ Get current directory head in case .RenameLp6 `LDA sect,X:STA FSM+&4A,X :\ Get directory's FIRST as parent of object being moved DLDA FSM+&20+&16,X:STA sect,X :\ Get object's start sector $DEX:BPL RenameLp6 .IJSR dirInit :\ Point fptr to directory header 8.RenameDir BOJSR GetDir:JSR PutInName :\ Get directory header and put name in L'LDA HDR+&0C:€ #&80:TAX:BEQ RenDirSm V\ We've gone up to '$' without being in the same directory ª$\ So, it's not a circular rename ´>\ -------------------------------------------------------- ¾ LDX #2 È.RenameLp9 ÒBLDA FSM+&45,X:STA sect,X :\ Get dest directory back Ü?DEX:BPL RenameLp9:JSR GetDir :\ Fetch dest directory æ: ðF\ We have dest dir in memory, ready for entry to be copied into it úD\ Need to move info as FindBlank and Remove may load FSM to &Fxx A\ Need to move object info at &F20-&F3F and data at &F40-&F47 D\ -------------------------------------------------------------- .RenameFile "JSR CanISave ,FLDA VFLG:€ #31:STA VFLG:LDX #31 :\ Using name store as workspace 6.RenFileLp1 @BLDA FSM+&20,X:STA DSKNAME,X :\ Copy info to name store JDEX:BPL RenFileLp1:LDX #7 T.RenFileSv ^?LDA FSM+&40,X:PHA:DEX:BPL RenFileSv :\ Save data at F40-F47 hDJSR FindBlankEntry:LDX #0 :\ Find/create a blank entry r.RenFileLd |JPLA:STA FSM+&40,X:INX:CPX #8:BNE RenFileLd :\ Restore data at F40-F47 †source entry 0.GetSectLp2 :@LDA FSM+&42,X:STA sect,X :\ sect=source directory DDEX:BPL GetSectLp1 NAJMP GetDir :\ Fetch source directory X: b] l$ñ ½11;Ä20,½9);O%-mcode%;" bytes" v>"S.HADFS8" ÿ