sys7.1-doc-wip/OS/HFS/MFSRFN1.a
2019-07-27 22:37:48 +08:00

125 lines
4.4 KiB
Plaintext

;
; File: MFSRFN1.a
;
; Contains: This file contains routines for MFS cache I/O.
;
; 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…
; 10/1/85 LAK Most code moved to Cache and TFSRfn1.
; 9/6/85 LAK Tag data Time field is now set correctly. Call MFSRWSub instead
; of MyRWSub since D3 disk block is word length for MFS.
; 8/15/85 PWD Added code to save A6 before ,ASYNC calls
; 7/1/85 PWD Changed to use A6 stack to save context
; 3/1/85 GJC Limited MFS to portions of routines not handled by TFS
; 6/27/84 GSS Put in line the WrPart patch from MSFileFix
; 8/30/83 LAK Removed redundant set of FCB dirty bit in FileWrite (gets set by
; AdjEOF).
; 8/15/83 LAK Flushes file buffer now if block is dirty and falls within
; read-in-place . . . saved some bytes, too.
; 8/11/83 LAK Added support for a read-verify mode.
; 8/2/83 LAK Fixed read bug (read count 0 with position past EOF). Changed
; file positioning mode 2 (relative to end of file) by defining
; IOPosOffset to be either positive or negative . . .
; 6/2/83 LAK Changes for FCBBfAdr=0 meaning use volume buffer.
; 2/10/83 LAK Fixed bugs in Read with EOL character.
; 2/9/83 LAK Fixed MyWriteIP bug (now invalidates file's buffer if it happens
; to write that block . . .)
; 1/17/83 LAK Latest changes for final structures. Brought SetFPos and GetFPos
; here from FSRFN2. Made GetFPos and SetFPos call FileRead with
; zero bytes requested.
; 12/14/82 LAK Rewrote for new file system data structures.
;
;_______________________________________________________________________
;
; External Routines: None
;
; Internal Routines: MFSRd1stDB,MFSRdNxtDB,MFSDirRead,MFSMapRead,MFSVolRead.
;
;_______________________________________________________________________
;
;_______________________________________________________________________
;
; Routine: MFSRd1stDB,MFSRdNxtDB
; Arguments: A2.L (input) -- VCB ptr
; D0.W (output) -- error code
; A5.L (output) -- ptr to buffer
; Clobbers: D4,A6
; Preserves: D1,D2,D5,D6,D7,A0,A1,A2,A3,A4
; others: see MyReadDB
; Calls: MyReadDB,GetCurBlk
; Called By: FndFilNam,FndFilSpc
; Function: These two routines are used when scanning through a volume
; directory for a filename or for space. Rd1stDB must be
; called for the first block as it sets up certain lomem
; variables (MaxDB). RdNxtDB is called for
; remaining blocks (if any).
;
;_______________________________________________________________________
; Called By: MFSMount (consistency check)
; FndMFSFile (directory search)
; FndFilSpc (looking for space for Create, Rename)
MFSRd1stDB:
BLANKS ON
STRING ASIS
MOVE.W VCBBlLn(A2),D0 ; len in blocks of dir
MOVE.W VCBDirSt(A2),D3 ; starting block of dir on disk
ADD.W D3,D0 ; make D4=ptr to last dir blk+1
MOVE.W D0,MaxDB ; max DB block + 1
BRA.S MFSDirRead
; A2=VCB ptr
; MaxDB=last DB+1
; NxtDB=next DB to check
MFSRdNxtDB:
MOVE.W CurDB,D3 ; next block to read
ADDQ.W #1,D3 ; and increment this field
CMP.W MaxDB,D3 ; past the last block?
BCS.S MFSDirRead ; br if not
MOVEQ #DirFulErr,D0 ; the directory may be full
RTS
; Called By: MFSCLose (find block for update)
; MFSRd1stDB, MFSRdNxtDB (directoy searches)
MFSDirRead:
MOVE.W D3,CurDB ; save current directory block <01Oct85>
BSR ReadBlock
MOVE.L SysCtlCPtr,A1 ; catalog blk read: MFS catalog blks <01Oct85>
BRA.S MFSMapR2
; Function: Get a volume map/master directory block.
; Called By: MFSMount
MFSVolRead
BSR ReadBlock ; use common code, pass ptr to next inst
BRA.S MFSMapR1 ; share code with map read
; Function: Get a volume map/master directory block without reading it first.
; Called By: MFSFlush
MFSMapRead:
BSR ReadBlock ; use common code, pass ptr to next inst
MOVEQ #kGBNoRead,D1 ; don't bother to read it <01Oct85>
MFSMapR1:
MOVE.L SysVolCPtr,A1 ; Use volume cache for MFS vol reads <01Oct85>
MFSMapR2:
MOVEQ #0,D2 ; clear high word
MOVE.W D3,D2 ; block number <01Oct85>
MOVE.W VCBVRefNum(A2),D0 ; volume refnum <01Oct85>
RTS ; return to ReadBlock <01Oct85>