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

156 lines
5.1 KiB
Plaintext

;
; File: BTIntf.a
;
; Copyright: © 1990-1992 by Apple Computer, Inc. All rights reserved.
;
; Change History (most recent first):
;
; <SM2> 11/3/92 SWC Changed INCLUDEs to a LOAD of StandardEqu.d.
; <2> 4/11/90 S To make ioBTKCProc zeroed out as per Kenny Tung.
;
BLANKS ON
STRING ASIS
PRINT OFF
LOAD 'StandardEqu.d'
INCLUDE 'BTreeEqu.a'
PRINT ON
PRINT NOGEN
;________________________________________________________________________________
;
; Routine: OpenUGBT
;
; Function: Open a file for B*-Tree access.
;
; This function will also update the B*-Tree's key descriptor if the
; B*-Tree doesn't have one yet.
;
; Pascal interface:
; Function OpenUGBT(VRefNum: Integer;
; DirID: LongInt;
; fileName: Str255;
; OpenMode: Integer;
; VAR BTRefNum: Integer): OSErr;
;________________________________________________________________________________
;
OpenUGBT PROC EXPORT
LINK A6,#-BTParamSize ; Allocate an HFS parameter block
;
; At this point the stack looks as follows:
;
; -BTParamSize(A6) --> Start of I/O parameter block.
; (A6) --> Old A6
; 4(A6) --> Return address
; 8(A6) --> Address of BTRefNum (to be returned)
; 12(A6) --> Open Mode
; 14(A6) --> Filename string
; 18(A6) --> DirID
; 22(A6) --> Volume RefNum
; 24(A6) --> Return value storage (2 bytes)
;
BTRefNum EQU 8 ; Address of BTRefNum (to be returned)
BTOpenMode EQU 12 ; File open mode
BTNamePtr EQU 14 ; Filename string
BTDirID EQU 18 ; DirID
BTVRefNum EQU 22 ; Volume RefNum
Result EQU 24 ; Return value storage (2 bytes)
ArgSize EQU Result-8 ; Size of argument block on stack (28 bytes)
MOVE.L BTRefNum(A6),A1 ; Point to BTRefNum
CLR.W (A1) ; Zero it out (in case of errors)
@0 LEA -BTParamSize(A6),A0 ; Point to parameter block
MOVE.W #(BTParamSize/2)-1,D0 ; DBRA word loop index
@1 CLR.W (A0)+ ; ...cleared.
DBRA D0,@1
LEA -BTParamSize(A6),A0 ; Point to parameter block
MOVE.W BTVRefNum(A6),ioVRefNum(A0) ; Set up VRefNum
MOVE.L BTDirID(A6),ioDirID(A0) ; ... DirID,
MOVE.L BTNamePtr(A6),ioFileName(A0) ; ... and Filename pointer
; [ioFileType and ioOwnBuf are clear ]
MOVE.B BTOpenMode+1(A6),ioPermssn(A0) ; Request R/W permission
MOVE.L #0, ioBTKCProc(A0) ; Clear this field as per Kenny Tung Sangam 4/11/90
_BTOpen
BEQ.S @50 ; Continue if no error
CMP.W #btNoKDErr,D0 ; No key descriptor?
BNE.S @50 ; If other error, give up
LEA UGKD,A1 ; Point to key descriptor
MOVE.L A1,ioBTKDPtr(A0) ; Set up pointer to KD
CLR.L ioBTKDReqCount(A0) ; Clear top 3 bytes of KD length
MOVE.B (A1),ioBTKDReqCount+3(A0) ; Copy length of KD record
_BTUpdateKD ; Try to update the key descriptor
BEQ.S @0 ; If successful, retry _BTOpen call
@50 MOVE.W D0,Result(A6) ; Set up to pass error on to user
BNE.S @95 ; Punt if anything goes wrong
MOVEA.L BTRefNum(A6),A1 ; Point to BTRefNum storage
MOVE.W ioRefNum(A0),(A1) ; Return refNum for opened file.
@95 UNLK A6 ; Release local storage
MOVE.L (SP)+,A0 ; Save return address
ADDA.W #ArgSize,SP ; Remove arguments
JMP (A0) ; And return
DC.B ($80+'O') ; Indicate start of procedure name
DC.B 'PENUGBT' ; (for use by debugger)
DC.W 0
UGKD: DC.B 7 ; Key descriptor length = 7
DC.B $00, $01 ; Skip 1 byte
DC.B $06, $01 ; 1 unsigned longword
DC.B $03, $01, $00 ; 1 Pascal string, not case sens, not diac. sens.
ENDP
;________________________________________________________________________________
;
; Routine: BldFSKey
;
; Function: Build a File-System B*-Tree key
;
; Pascal interface:
; Procedure BldFSKey(keyDirID: LongInt; keyCName: Str31; keyBufPtr: BTKeyPtr);
;________________________________________________________________________________
;
BldFSKey PROC EXPORT
LINK A6,#0 ; LINK for debugging trail
;
; At this point the stack looks as follows:
;
; (A6) --> Old A6
; 4(A6) --> Return address
; 8(A6) --> Key buffer pointer
; 12(A6) --> CName pointer
; 16(A6) --> DirID
;
MOVEA.L 8(A6),A1 ; Point to key to be built
MOVEA.L 12(A6),A0 ; Point to CName string
MOVEQ #0,D0 ; Clear top 3 bytes
MOVE.B (A0),D0 ; Pick up CName length
; Add in: key filler (1)
; DirID (4)
; String length byte (1)
; ----------------------
ADDQ.L #6,D0 ; 6 bytes
MOVE.B D0,(A1)+ ; ...which gives the total key length
CLR.B (A1)+ ; leave a filler
MOVE.L 16(A6),(A1)+; Move in DirID
SUBQ.L #5,D0 ; Get back length of actual CName string
_BlockMove ; Move in the CName string
UNLK A6 ; Pop off call frame
MOVE.L (SP)+,A0 ; Save return address
ADD.W #12,SP ; Pop incoming arguments, leaving result
JMP (A0) ; And return to the caller
DC.B ($80+'B') ; Indicate start of procedure name
DC.B 'LDFSKEY' ; (for use by debugger)
DC.W 0
ENDP
END