mac-rom/OS/PPC/BTIntf.a
Elliot Nunn 4325cdcc78 Bring in CubeE sources
Resource forks are included only for .rsrc files. These are DeRezzed into their data fork. 'ckid' resources, from the Projector VCS, are not included.

The Tools directory, containing mostly junk, is also excluded.
2017-12-26 09:52:23 +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