mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-22 04:31:30 +00:00
369 lines
14 KiB
Plaintext
369 lines
14 KiB
Plaintext
|
;
|
||
|
; File: MFSDIR3.a
|
||
|
;
|
||
|
; Contains: This file contains routines using file names to specify file.
|
||
|
;
|
||
|
; Copyright: © 1982-1991 by Apple Computer, Inc., all rights reserved.
|
||
|
;
|
||
|
; Change History (most recent first):
|
||
|
;
|
||
|
; <2> 9/12/91 JSM Add a header.
|
||
|
; <1.1> 11/10/88 CCH Fixed Header.
|
||
|
; <1.0> 11/9/88 CCH Adding to EASE.
|
||
|
; <1.0> 2/11/88 BBM Adding file for the first time into EASE…
|
||
|
; 9/24/86 BB Updated to use new MPW equates.
|
||
|
; 11/1/85 PWD Fixed bug in GetCatInfo for MFS volume (MOVE.L vs. MOVE.W)
|
||
|
; 10/20/85 LAK Flush control cache on exit of SetMFlType, SetMFlInfo,
|
||
|
; ChgMFlLock.
|
||
|
; 10/16/85 PWD Fixed SetFilTyp bug (used FilTyp instead of FlTyp).
|
||
|
; 10/1/85 LAK Adjusted for MFS use of TFS cache.
|
||
|
; 9/25/85 PWD Fixed bug in 'GetCatInfo' lookalike code in GetFileInfo (cleared
|
||
|
; 32 bytes)
|
||
|
; 9/6/85 LAK Courtesy clear of IORefNum before calling CkFileBusy for
|
||
|
; GetFileInfo.
|
||
|
; 5/1/85 PWD Changed GetMFlInfo to clear ioDirFlg bit in ioFlAttrib field.
|
||
|
; 3/13/85 PWD Split off from SetFilTyp.
|
||
|
; 2/28/85 PWD Split off from FSDir3, leaving only MFS-specific code.
|
||
|
; 9/1/83 LAK Changed BPL to BCC in file name transfer to support file names >
|
||
|
; 127 chars in GetFileInfo.
|
||
|
; 8/31/83 LAK Changed GetFileInfo to return current file info for opened files
|
||
|
; (from FCB information).
|
||
|
; 6/6/83 LAK Added changes to support ext fs, offline volumes.
|
||
|
; 5/25/83 LAK Adapted FndFilNam to new CmpString interface.
|
||
|
; 1/16/83 LAK Final pass changes . . . added SetFilLock,RstFilLock,SetFilType.
|
||
|
; 12/14/82 LAK Undelete removal changes
|
||
|
; 12/13/82 LAK Reworked all files for new file system data structures.
|
||
|
; 1/12/82 LAK Made string compare proc an OS call; code is in IOCore.
|
||
|
;
|
||
|
|
||
|
;_______________________________________________________________________
|
||
|
;
|
||
|
; External Routines: GetMFSFlInfo,SetMFlInfo
|
||
|
;
|
||
|
; Internal Routines: FindMFSFile
|
||
|
;
|
||
|
;_______________________________________________________________________
|
||
|
|
||
|
;_______________________________________________________________________
|
||
|
;
|
||
|
; Routine: SetMFlType
|
||
|
; Arguments: A0.L (input) -- I/O Parameter block for call
|
||
|
; A1.L (input) -- pointer to vol. buffer(from FndFilNam)
|
||
|
; A2.L (input) -- VCB ptr
|
||
|
; D0.W (output) -- error code
|
||
|
; A5.L (output) -- ptr to dir. entry (from FndFilNam)
|
||
|
; Clobbers:
|
||
|
; Preserves:
|
||
|
; Called By: SetFilType
|
||
|
; Function: SetMflInfo sets the file type for MFS files in the directory
|
||
|
; block pointed to by A1, at the entry pointed to by A5.
|
||
|
;
|
||
|
; Modification history:
|
||
|
; 13-Mar-85 PWD Split off from SetFilTyp.
|
||
|
;_______________________________________________________________________
|
||
|
|
||
|
|
||
|
BLANKS ON
|
||
|
STRING ASIS
|
||
|
|
||
|
SetMFlType MOVE.B IONewType(A0),FlTyp(A5) ; Ring in the new <PWD 16Oct85>
|
||
|
BRA.S SRMFXit1 ; And leave, clearing D0
|
||
|
; (Marks vol. buffer block dirty)
|
||
|
|
||
|
;_______________________________________________________________________
|
||
|
;
|
||
|
; Routine: ChgMFlLock
|
||
|
;
|
||
|
; (c) 1983 Apple Computer, Inc.
|
||
|
;
|
||
|
; Arguments: A0.L (input) -- pointer to I/O parameter block, uses
|
||
|
; IOFileName,IOFileType,IODrvNum
|
||
|
; D0.W (output) -- 0 if file was found and set correctly.
|
||
|
; Calls:
|
||
|
; Called by: SetFilLock/ResFilLock
|
||
|
; Function: Set or reset the file lock bit for MFS files.
|
||
|
;
|
||
|
; Modification History:
|
||
|
; 16 Jan 83 LAK New today.
|
||
|
; 06 Jun 83 LAK Broke out CkFilMod as a subroutine.
|
||
|
; 13 Mar 85 PWD Split off from main entry (Set/Rst FilLock)
|
||
|
;
|
||
|
; Note: if the file is locked after it has already been opened with write
|
||
|
; permission, the lock will not affect that opened file. If the lock bit
|
||
|
; is not changed by this command, the directory buffer is not marked dirty
|
||
|
; (allows quick lock/unlocking of a group of file, regardless of their current
|
||
|
; status).
|
||
|
;_______________________________________________________________________
|
||
|
|
||
|
ChgMFlLock TST.B FLckUnlck
|
||
|
BEQ.S @1 ; br if we want to unlock it
|
||
|
BSET #FlWrtFlag,FlFlags(A5) ; lock it
|
||
|
BNE.S SRMFXit2 ; br if already locked
|
||
|
BRA.S SRMFXit1 ; otherwise, it's been modified
|
||
|
|
||
|
@1 BCLR #FlWrtFlag,FlFlags(A5) ; unlock it
|
||
|
BEQ.S SRMFXit2 ; br if already unlocked
|
||
|
|
||
|
SRMFXit1 MOVE.L A1,A0 ; (also setfilinfo exit) <01Oct85>
|
||
|
JSR MarkBlock ; mark buffer modified <01Oct85>
|
||
|
BSR MFSCtlFlush ; flush control cache if it's too full <20Oct85>
|
||
|
SRMFXit2 MOVEQ #0,D0
|
||
|
SRMFXit3 BRA CmdDone
|
||
|
|
||
|
;_______________________________________________________________________
|
||
|
;
|
||
|
; Routine: SetMFlInfo
|
||
|
;
|
||
|
; (c) 1983 Apple Computer, Inc.
|
||
|
;
|
||
|
; Arguments: A0.L (input) -- pointer to File Info I/O parameter block, uses
|
||
|
; IOFileName,IOFlAttrib,IOFlUsrWds
|
||
|
; D0.W (output) -- 0 if entry was found, error code otherwise
|
||
|
; File's entry is modified to reflect changes
|
||
|
; Calls: FndFilNam
|
||
|
; Function: Sets the user-definable fields in a file's directory entry.
|
||
|
; The caller specifies the filename and type, and the eight
|
||
|
; user-defined words. The file lock bit does not inhibit this
|
||
|
; command.
|
||
|
;
|
||
|
; Modification History:
|
||
|
; 13 Dec 82 LAK Modified for new file system data structures.
|
||
|
; 17 Jan 83 LAK Latest changes: no longer used to change lock, type fields;
|
||
|
; there are now 16 user-defined bytes.
|
||
|
; 06 Jun 83 LAK Adapted to new offline, ext fs problems. Uses CkFilMod
|
||
|
; and SRFLXit1 to save code.
|
||
|
; 09 Jul 84 GSS Patched to write out creation and modification date info
|
||
|
; 13 Mar 85 PWD Separated MFS-specific code out from FSDir3
|
||
|
;_______________________________________________________________________
|
||
|
|
||
|
SetMFlInfo
|
||
|
MOVEM.L IOFlUsrWds(A0),D1-D4 ; get 16 user words
|
||
|
MOVEM.L D1-D4,FlUsrWds(A5) ; transfer 16 user-defined bytes
|
||
|
|
||
|
MOVEM.L IOFlCrDat(A0),D1-D2 ; get IOFlCrDat, IOFlMdDat
|
||
|
MOVEM.L D1-D2,FlCrDat(A5) ; and store in FlCrDat, FlMdDat
|
||
|
|
||
|
BRA.S SRMFXit1 ; exit ok, marking buffer modified
|
||
|
|
||
|
;_______________________________________________________________________
|
||
|
;
|
||
|
; Routine: FndMFSFile,FndMFSFN2
|
||
|
;
|
||
|
; (c) 1983 Apple Computer, Inc.
|
||
|
;
|
||
|
; Arguments: A0.L (input) -- pointer to I/O parameter block, uses:
|
||
|
; IOFileName,IOFileType,IODrvNum
|
||
|
; D0.W (output) -- 0 if file was found, error code otherwise.
|
||
|
; D2.W (output) -- name length excluding any volume prefix
|
||
|
; A1.L (output) -- points to volume buffer (if name found)
|
||
|
; A2.L (output) -- pointer to appropriate VCB
|
||
|
; A4.L (output) -- pointer to input file name. If a volume was
|
||
|
; specified will point to the colon, thereby
|
||
|
; always pointing one byte ahead of the true
|
||
|
; file name.
|
||
|
; A5.L (output) -- pointer to file directory entry in buffer.
|
||
|
; Preserves: D1,D5,A0
|
||
|
; Clobbers: all other registers (D3,D4,D6,D7,A3,A6)
|
||
|
; Note that the routine will return to one level above
|
||
|
; caller during the asynchronous reads.
|
||
|
; FndFN2 entry point for Rename (alternate volume may be used)
|
||
|
; Calls: MyReadDB(via Rd1stDB and RdNxtDB)
|
||
|
; Called By: Create,Delete,FileOpen,Rename,GetFileInfo,SetFileInfo
|
||
|
; Function: Locate a filename within the directory on a diskette
|
||
|
; Search algorithm: if dir blk there, search it first;
|
||
|
; if not found, start from beginning, skipping searched blk.
|
||
|
;
|
||
|
; Modification History:
|
||
|
; 08 Dec 82 LAK Added FndFilNam entry point.
|
||
|
; 13 Dec 82 LAK Rewrote. Removed index search mode.
|
||
|
; 14 Dec 82 LAK Removed check for delete file.
|
||
|
; 17 Jan 83 LAK Changes for last data structure mods: now checks for both
|
||
|
; filename and filetype match.
|
||
|
; 05 Jun 83 LAK Added checks for offline volume, external file system vols
|
||
|
; 28 Sep 84 GSS Inserted patch for setting ReqstVol in ExtOffLinCk
|
||
|
; (from CDHook in MSFileFix)
|
||
|
; 28-Feb-85 PWD Split off from FndFilName to just handle only MFS volumes.
|
||
|
; 20-Sep-85 PWD Added explicit check for zero-length files before launching
|
||
|
; into search (used to be checked by FndFilNam already)
|
||
|
;_______________________________________________________________________
|
||
|
|
||
|
FndMFSFile MOVE.L (SP)+,A3 ; get the caller's addr
|
||
|
TST.B D2 ; Check file name length - <20Sep85>
|
||
|
BNE.S @1 ; If >0, it's OK <20Sep85>
|
||
|
MOVEQ #BdNamErr,D0 ; Otherwise, complain <20Sep85>
|
||
|
BRA.S MFFNExit ; <20Sep85>
|
||
|
|
||
|
@1 MOVE.W VCBNmFls(A2),D7 ; number of files on this volume
|
||
|
BEQ.S MFNFound ; if none, can't find this one.
|
||
|
|
||
|
BSR MFSRd1stDB ; go for the first one <01Oct85>
|
||
|
mfFNLoop BEQ.S scn4MNam ; br if ok
|
||
|
CMP.W #DirFulErr,D0 ; reached end of directory?
|
||
|
BNE.S mfFNExit ; then file not found
|
||
|
mfNFound MOVEQ #FNFErr,D0 ; file not found!
|
||
|
BRA.S mfFNExit
|
||
|
|
||
|
; have a block at (A5) - look for the file in this dir block
|
||
|
|
||
|
scn4MNam MOVEQ #0,D0 ; clear for index
|
||
|
MOVE.L A4,A1 ; requested string
|
||
|
|
||
|
@1 MOVE.W D0,D4 ; save D0
|
||
|
TST.B FlFlags(A5,D4) ; flags=0 means end of entries this blk
|
||
|
BEQ.S @3 ; br if no more entries this block
|
||
|
MOVE.B FlTyp(A5,D4),D6 ; check for type match
|
||
|
CMP.B IOFileType(A0),D6 ;
|
||
|
BNE.S @2 ; br if no match
|
||
|
|
||
|
MOVE.L A0,-(SP) ; preserve A0
|
||
|
LEA FlNam(A5,D4),A0 ; directory string
|
||
|
MOVEQ #0,D0
|
||
|
MOVE.B (A0)+,D0 ; first string length
|
||
|
SWAP D0
|
||
|
MOVE.W D2,D0 ; second string length
|
||
|
_CmpString ; do they match?
|
||
|
MOVE.L (SP)+,A0
|
||
|
BEQ.S @4 ; br if so
|
||
|
|
||
|
@2 SUBQ.W #1,D7 ; decr # files we checked
|
||
|
BEQ.S MFNFound ; exit if we checked them all . . .
|
||
|
MOVE.W D4,D0 ; restore D0
|
||
|
BSR GtNxEntry ; (A5,D0) point to next entry, D6 trashed
|
||
|
BCS.S @1 ; br if not finished with this block
|
||
|
|
||
|
@3 BSR MFSRdNxtDB ; read next directory block <01Oct85>
|
||
|
BRA.S MFFNLoop
|
||
|
|
||
|
; we have our man . . .
|
||
|
|
||
|
@4 MOVE.L A5,A1 ; A1 = buffer pointer
|
||
|
LEA 0(A5,D4),A5 ; A5 = entry ptr, D0 = 0 here
|
||
|
mfFNExit JMP (A3)
|
||
|
|
||
|
;_______________________________________________________________________
|
||
|
;
|
||
|
; Routine: GetMFlInfo
|
||
|
;
|
||
|
; (c) 1983 Apple Computer, Inc.
|
||
|
;
|
||
|
; Arguments: A0.L (input) -- pointer to File Info I/O parameter block, uses
|
||
|
; all fields?
|
||
|
; D0.W (output) -- 0 if info was found, error code otherwise
|
||
|
; Calls: FndFilNam(if searching by name)
|
||
|
; Function: Get information about a specific file from the file directory.
|
||
|
; User can specify search by either filename or by index,
|
||
|
; where the index specifies the file's offset from the beginning
|
||
|
; of the directory.
|
||
|
;
|
||
|
; An index of zero means search by filename and type.
|
||
|
;
|
||
|
; Modification History:
|
||
|
; 10 Dec 82 LAK Modified for new file system data structures.
|
||
|
; 13 Dec 82 LAK Removed delete file support.
|
||
|
; 17 Jan 83 LAK Another passover.
|
||
|
; 06 Jun 83 LAK Added changes to detect offline volumes, ext fs calls.
|
||
|
; 01 Sep 83 LAK Changed BPL to BCC in file name transfer to support file
|
||
|
; names > 127 chars.
|
||
|
; 10 Mar 85 PWD Changed to search catalog for TFS volumes
|
||
|
; 25-Sep-85 PWD Fixed bug in 'GetCatInfo' lookalike code (cleared 32 bytes)
|
||
|
; <27Oct85> PWD Changed to re-join TFS code for FCB scan
|
||
|
; <01Nov85> PWD Fixed bug in GetCatInfo for MFS volume (MOVE.L vs. MOVE.W)
|
||
|
;_______________________________________________________________________
|
||
|
|
||
|
GtMFlIBI CMP.W VCBNmFls(A2),D1 ; requesting an index larger than exists?
|
||
|
BHI.S GMFINFErr ; return file not found error?
|
||
|
|
||
|
; we are searching by index here: it's a bit tricky since we want to try
|
||
|
; to continue where we left off, if possible . . .
|
||
|
|
||
|
MOVE.W VCBBlLn(A2),D5 ; len in blocks of dir
|
||
|
MOVE.W VCBDirSt(A2),D3 ; assume start from the beginning
|
||
|
ADD.W D3,D5 ; max blk num + 1
|
||
|
|
||
|
MOVE.W VCBDirIndex(A2),D7 ; useful file index, blk number pair
|
||
|
BEQ.S @0 ; br if set back to zero
|
||
|
|
||
|
CMP.W D7,D1 ; is our index >= this?
|
||
|
BCS.S @0 ; br if not . . .
|
||
|
MOVE.W VCBDirBlk(A2),D3 ; block number for this index
|
||
|
BRA.S @1
|
||
|
|
||
|
@0 MOVEQ #1,D7 ; index of first file this block
|
||
|
|
||
|
; at this point, D7=index of first file in current block
|
||
|
; D3=current block
|
||
|
; D5=max blk number + 1
|
||
|
; D1=requested index
|
||
|
|
||
|
@1 CMP.W D5,D3 ; have we reached max yet?
|
||
|
BCC.S GMFINFErr ; br if so
|
||
|
MOVE.W D3,VCBDirBlk(A2) ; form index,block pair to help next
|
||
|
MOVE.W D7,VCBDirIndex(A2) ; GetFileInfo indexed search
|
||
|
BSR MFSDirRead ; get the block <01Oct85>
|
||
|
BNE.S GMFINFErr
|
||
|
MOVEQ #0,D0 ; index into block
|
||
|
|
||
|
@2 MOVEQ #0,D6
|
||
|
TST.B FlFlags(A5,D0) ; valid entry?
|
||
|
BEQ.S @3 ; br if no more entries
|
||
|
CMP.W D7,D1 ; is it the requested one?
|
||
|
BEQ.S GotMIndFile
|
||
|
ADDQ.W #1,D7 ; increment file index
|
||
|
BSR GtNxEntry
|
||
|
BCS.S @2 ; br if haven't reached end of block
|
||
|
|
||
|
@3 ADDQ.W #1,D3 ; try next block
|
||
|
BRA.S @1
|
||
|
|
||
|
GMFINFErr MOVEQ #FNFErr,D0 ; file not found . . . hmmmm
|
||
|
GMFIExit BRA CmdDone
|
||
|
|
||
|
GotMIndFile LEA 0(A5,D0),A5 ; get pointer to entry . . .
|
||
|
|
||
|
; searched by index, so return the name . . .
|
||
|
|
||
|
LEA FlNam(A5),A3 ; file entry name ptr
|
||
|
MOVE.L IOFileName(A0),D0 ; parameter block filename ptr
|
||
|
BEQ.S XferMFInfo ; skip it if it's zero
|
||
|
MOVE.L D0,A4
|
||
|
|
||
|
MOVE.B (A3),D0 ; name length
|
||
|
@1 MOVE.B (A3)+,(A4)+ ; name length, then name, byte by byte
|
||
|
SUBQ.B #1,D0
|
||
|
BCC.S @1
|
||
|
|
||
|
; The TFS trap entry point enters here for MFS volumes not searched by directory
|
||
|
; index, immediately following a call to FndFilNam:
|
||
|
|
||
|
GetMFlInfo
|
||
|
|
||
|
XferMFInfo
|
||
|
LEA IOFlAttrib(A0),A4 ; info destination
|
||
|
MOVEQ #(IOFQElSize-IOFlAttrib)/2-1,D0 ; number of words to copy - 1
|
||
|
LEA FlFlags(A5),A3 ; start of regular info to transfer
|
||
|
@1 MOVE.W (A3)+,(A4)+ ; move byte by byte
|
||
|
DBRA D0,@1
|
||
|
|
||
|
; Clear the directory flag for file information:
|
||
|
|
||
|
BCLR #ioDirFlg,ioFlAttrib(A0) ; 0 = file info returned
|
||
|
|
||
|
; Pure hack (=cut for code space):
|
||
|
; Make some of the additional TFS fields non-garbage, even for MFS:
|
||
|
|
||
|
BTST #HFSReq,HFSFlags ; Is this really a _GetCatInfo request?
|
||
|
BEQ.S @3 ; Nah, don't be silly...
|
||
|
MOVE.L #FSRtDirID,ioFlParID(A0) ; 'Parent directory' is root... <01Nov85>
|
||
|
CLR.L ioFlBkDat(A0) ; Never been backed up...
|
||
|
|
||
|
MOVE.L A0,-(SP) ; Create a scratch register
|
||
|
LEA ioFlxFndrInfo(A0),A0 ; Point to finder info <24Sep86>
|
||
|
MOVEQ #3,D0 ; Set up to clear 3+1 longwords <25Sep85>
|
||
|
@2 CLR.L (A0)+ ; Zero finder info bytes
|
||
|
DBRA D0,@2 ;
|
||
|
MOVE.L (SP)+,A0 ; Restore 'scratch' register
|
||
|
|
||
|
@3 BRA CkFilStatus ; Re-join TFS code for FCB scan <27Oct85>
|
||
|
|
||
|
|