boot3/Libs/InterfaceSrcs/OSTraps.a

3733 lines
105 KiB
Plaintext
Raw Permalink Normal View History

;
; File: OSTraps.a
;
; Contains: Interfaces to register based traps
;
; Copyright: <09> 1984 - 1990, 1992 by Apple Computer, Inc., all rights reserved.
;
; Change History (most recent first):
;
; <SM7> 11/10/92 CSS Update from Reality:
; <16> 10/16/92 DTY Add BlockMoveData.
; <SM6> 11/6/92 SWC Changed PackMacs.a->Packages.a.
; <SM5> 10/28/92 SWC Changed INCLUDEs to a LOAD of StandardEqu.d.
; <SM4> 10/22/92 CSS Changed a short branch to word branch.
; <SM3> 9/21/92 RB Changed a short branch to word branch.
; <15> 7/6/92 DCL Added Support for new synonyms.
; <14> 6/12/91 LN Removed #includes for private interfaces from public interfaces.
; Changed #include 'HardwareEqu.a' to #include
; 'HardwarePrivateEqu.a'
; <13> 12/14/90 dba <JDR> move VInstall and VRemove to the obsolete section
; <12> 12/3/90 JDR <dba> Shorten glue for InsTime, RmvTime, PrimeTime and move them
; to the obsolete section; get rid of InsXTime glue since no one
; ever used it.
; <11> 11/28/90 JDR <KIP> There is no glue for calling _InsXTime and I need to use
; it, so I've added it.
; <10> 11/4/90 dba shortened some of the routines that use LINK to get a parameter
; block by doing a MOVE.L SP,A0 instead of a LEA
; -paramBlockSize(A6),A0; fixed GetHandleSize and GetPtrSize so
; they return 0 if an error occurs (instead of the error code);
; added ReallocateHandle, MaxMemSys, CompactMemSys
; GetOSTrapAddress, SetOSTrapAddress, GetToolTrapAddress,
; SetToolTrapAddress, GetToolboxTrapAddress,
; SetToolboxTrapAddress, MaxBlockSys, NewEmptyHandleSys; fixed a
; bug in StartSound (see below for details); made Create return an
; error code when GetFileInfo fails, instead of doing a
; SetFileInfo with random data; changed Open so it will try the
; OpenDF call first; got rid of the OpenDF glue, since it is now
; exactly equivalent to Open; shortened SetChooserAlert by taking
; advantage of the fact that BSET and BCLR return the old state of
; the bit being set/cleared; change GetDCtlEntry to return NIL if
; you pass a bad refNum - this matches how the Device Manager does
; this; moved obsolete glue routines to a separate part of the
; file
; <9+> 11/1/90 dba fix GetHandleSize and GetPtrSize failure case
; <9> 10/30/90 dnf (dragging dba along) Add OpenDF call. Remove DTGetPath,
; DTOpenInfom and DTCloseDown glue, since it is now inline.
; <8> 10/16/90 JL Putting Greg's Change Back
; <7> 10/4/90 JAL Implemented results of code review. No more 64K Rom Support.
; <6> 9/18/90 gbm Fix a build warning generated by a short branch to the next
; instruction... the way I fixed it was by making the exit points
; be in their own proc
; <5> 8/29/90 dnf Rename CreateFileID, DeleteFileID and ResolveFileID to the newly
; approved CreateFileIDRef, DeleteFileIDRef and ResolveFileIDRef.
; Change GetAltAccess/SetAltAccess to
; GetForeignPrivs/SetForeignPrivs
; <4> 5/4/90 dnf Add PBMakeFSSpec glue macro
; <3> 3/16/90 dnf Change desktop call names to match the latest in traps.a
; <2> 2/4/90 DNF Add glue for new HFS and Desktop calls
; 12/7/89 JAL Old (64K) Rom code which is now "unSupported". Removed from:
; SetSoundVol, ClsPorts, RamSDClose, RamSDOpen, romMoveHHi, MaxApplZone
; 12/4/89 JAL Removed HWNonPortable and PrNonPortable equates because they are
; now defined in the Makefile.
; 12/9/88 KLH StartSound must dispose handles after completion.
; 10/19/88 KLH Busy day. Fixed sndWait index in StartSound.
; 10/19/88 KLH Added NewHandleSys, NewHandleClear & NewHandleSysClear too.
; 10/19/88 KLH Added NewPtrSys, NewPtrClear & NewPtrSysClear per Ed Tecot, et al.
; 4/7/88 KLH Removed SystemZone, GetApplLimit, ApplicZone, GZSaveHnd & TopMem;
; provided inline.
; 1/7/88 KLH GetVInfo fixed to return correct size info.
; 12/1/87 KLH Mike Tibbott points out unnecessary save of ptr in Create.
; 9/21/87 KLH In GetDCtlEntry changed LSR.W #2,D0 to LSL.W to get index properly.
; 6/11/87 KLH Removed PBSetPEOF per Bill Bruffey.
; 4/13/87 KLH StartSound & StopSound now move.l -1 into SoundHdl to stop sounds &
; test only for a word of -1 to stop sounds started with old buggy code.
;
STRING ASIS
onMac EQU 1
LOAD 'StandardEqu.d'
INCLUDE 'HardwarePrivateEqu.a'
INCLUDE 'Packages.a'
INCLUDE 'Printing.a'
INCLUDE 'SANEMacs.a'
INCLUDE 'Slots.a'
obsoleteGlue equ 0 ; stuff conditionalized by this can be moved to a separate file
SoundHdl EQU $AE8 ; handle for the Sound Glue
; for EqualString
result EQU 16
str1 EQU 12
str2 EQU 8
caseSens EQU 6
diacSens EQU 4
parmSize EQU result-diacSens
;----------------------------------------------------------------------
;
; Procedure InitZone(growProc: ProcPtr;
; moreMasters: Integer;
; limitPtr,startPtr : Ptr);
; Creates and initializes a fresh zone from unstructured storage
;
; Arguments:
; growProc: points to grow procedure for this zone
; moreMasters: number of master pointers to create at a time
; limitPtr: points one past last byte of raw storage
; startPtr: points to first byte of raw storage
;
; Registers:
; D0 - result code from InitApplZone
;
InitZone PROC EXPORT
MOVE.L (SP)+,A1 ;return address
Move.L SP,A0 ;stack parameters form req blk
_InitZone
Add #14,SP ;strip parameters
JMP (A1) ;return via A1
;----------------------------------------------------------------------
;
; FUNCTION CompactMem(cbNeeded: Size): Size;
;
; Compact the heap until a free block with cbNeeded bytes is found or
; until the end of the zone is reached. Returns cbFound, the size of
; the largest block found.
;
; Arguments:
; cbNeeded: size of block needed
;
; Result:
; size of largest block found, in bytes
;
; Registers:
; D0 - number of bytes needed/number of bytes in biggest block
;
CompactMem FUNC EXPORT
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,D0 ;get cbNeeded
_CompactMem ;tell OS to do it
Move.L D0,(SP) ;save result
JMP (A1) ;return via A1
CompactMemSys FUNC EXPORT
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,D0 ;get cbNeeded
_CompactMem sys ;tell OS to do it
Move.L D0,(SP) ;save result
JMP (A1) ;return via A1
;----------------------------------------------------------------------
;
; FUNCTION MaxMem(VAR grow: Size): Size;
;
; Return the size of the maximum block which may be allocated without
; growing the zone. Also return the maximum number of bytes by which the
; zone may be grown.
;
; Arguments:
; None
;
; Result:
; size of largest available block in bytes
; grow: maximum growth allowed in current zone
;
; Registers:
; A0 - grow/pointer to VAR grow
; A1 - return address
; D0 - number of bytes in largest free block
;
MaxMem FUNC EXPORT
Move.L (SP)+,A1 ;get return address
_MaxMem ;let OS do it
Move.L A0,D1 ;max growth allowed
Move.L (SP)+,A0 ;get the pointer to VAR grow
Move.L D1,(A0)
Move.L D0,(SP) ;save result
JMP (A1) ;return via A1
MaxMemSys FUNC EXPORT
Move.L (SP)+,A1 ;get return address
_MaxMem sys ;let OS do it
Move.L A0,D1 ;max growth allowed
Move.L (SP)+,A0 ;get the pointer to VAR grow
Move.L D1,(A0)
Move.L D0,(SP) ;save result
JMP (A1) ;return via A1
;----------------------------------------------------------------------
;
; FUNCTION NewPtr(byteCount: Size): Ptr;
; FUNCTION NewPtrSys(byteCount: Size): Ptr;
; FUNCTION NewPtrClear(byteCount: Size): Ptr;
; FUNCTION NewPtrSysClear(byteCount: Size): Ptr;
;
; Returns a pointer to a newly allocated non-relocatable block of
; memory byteCount bytes long.
;
; Arguments:
; byteCount: number of bytes needed
;
; Result:
; pointer to new block, or NIL, if not enough room
;
; Registers:
; A0 - points to new block, or NIL
; A1 - return address
; D0 - number of bytes needed/error code
;
NewPtr FUNC EXPORT
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,D0 ;get the byte count
_NewPtr ;ask OS to do request
Move.L A0,(SP) ;return result ptr on stack
JMP (A1) ;return via A1
NewPtrSys FUNC EXPORT
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,D0 ;get the byte count
_NewPtr ,sys ;ask OS to do request
Move.L A0,(SP) ;return result ptr on stack
JMP (A1) ;return via A1
NewPtrClear FUNC EXPORT
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,D0 ;get the byte count
_NewPtr ,clear ;ask OS to do request
Move.L A0,(SP) ;return result ptr on stack
JMP (A1) ;return via A1
NewPtrSysClear FUNC EXPORT
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,D0 ;get the byte count
_NewPtr ,sys,clear ;ask OS to do request
Move.L A0,(SP) ;return result ptr on stack
JMP (A1) ;return via A1
;----------------------------------------------------------------------
;
; FUNCTION GetPtrSize(p: Ptr): Size;
;
; Returns number of bytes in the non-relocatable block pointed to by p.
;
; Arguments:
; p: points to non-relocatable block
;
; Result:
; number of bytes in block
;
; Registers:
; A0 - points to block
; A1 - holds return address
; D0 - number of bytes in block
;
GetPtrSize FUNC EXPORT
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,A0 ;get the pointer
_GetPtrSize ;let OS do it
Move.L D0,(SP) ;return result on stack
bpl.s @done ;check for error <10>
clr.l (sp) ;return zero if we failed <10>
@done
JMP (A1) ;return via A1
;----------------------------------------------------------------------
;
; Procedure SetPtrSize(p: Ptr; newSize: Size);
;
; Sets the size of the non-relocatable block pointed to by p to newSize
; bytes.
;
; Arguments:
; p: points to non-relocatable block
; newSize: number of bytes needed in block
;
; Result:
; None
;
; Registers:
; A0 - points to block
; A1 - holds return address
; D0 - number of bytes needed/error code
;
SetPtrSize PROC EXPORT
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,D0 ;get the new size
Move.L (SP)+,A0 ;get the pointer
_SetPtrSize ;let OS do it
JMP (A1) ;return via A1
;----------------------------------------------------------------------
;
; FUNCTION PtrZone(p: Ptr): THz;
;
; Recovers the reference to the heap zone object, given a pointer to
; a block.
;
; Arguments:
; p: points to non-relocatable block
;
; Result:
; pointer to the zone object for the zone
; containing the referenced block.
;
; Registers:
; A0 - points to block/points to block's zone object
; A1 - holds return address
; D0 - error code
;
PtrZone FUNC EXPORT
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,A0 ;get the pointer
_PtrZone ;let OS do it
Move.L A0,(SP) ;save zone object pointer
JMP (A1) ;return via A1
;----------------------------------------------------------------------
;
; FUNCTION NewHandle(byteCount: Size): Handle;
; FUNCTION NewHandleSys(byteCount: Size): Handle;
; FUNCTION NewHandleClear(byteCount: Size): Handle;
; FUNCTION NewHandleSysClear(byteCount: Size): Handle;
;
; Returns a handle to a newly allocated relocatable block
; byteCount bytes long.
;
; Arguments:
; byteCount: number of bytes needed
;
; Result:
; handle to new block, or NIL, if not enough room
;
; Registers:
; A0 - handle for new block, or NIL
; A1 - return address
; D0 - number of bytes needed/error code
;
NewHandle FUNC EXPORT
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,D0 ;get the byte count
_NewHandle ;ask OS to do request
Move.L A0,(SP) ;return result handle on stack
JMP (A1) ;return via A1
NewHandleSys FUNC EXPORT
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,D0 ;get the byte count
_NewHandle ,sys ;ask OS to do request
Move.L A0,(SP) ;return result handle on stack
JMP (A1) ;return via A1
NewHandleClear FUNC EXPORT
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,D0 ;get the byte count
_NewHandle ,clear ;ask OS to do request
Move.L A0,(SP) ;return result handle on stack
JMP (A1) ;return via A1
NewHandleSysClear FUNC EXPORT
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,D0 ;get the byte count
_NewHandle ,sys,clear ;ask OS to do request
Move.L A0,(SP) ;return result handle on stack
JMP (A1) ;return via A1
;----------------------------------------------------------------------
;
; FUNCTION GetHandleSize(h: Handle): Size;
;
; Returns number of bytes in the relocatable block referenced by h.
;
; Arguments:
; h: handle for relocatable block
;
; Result:
; number of bytes in block
;
; Registers:
; A0 - points to block
; A1 - holds return address
; D0 - number of bytes in block
;
GetHandleSize FUNC EXPORT
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,A0 ;get the handle
_GetHandleSize ;let OS do it
Move.L D0,(SP) ;return result on stack
bpl.s @done ;check for error <10>
clr.l (sp) ;return zero if we failed <10>
@done
JMP (A1) ;return via A1
;----------------------------------------------------------------------
;
; Procedure SetHandleSize(h: Handle; newSize: Size);
;
; Sets the size of the relocatable block referred to by h to newSize
; bytes.
;
; Arguments:
; h: refers to relocatable block
; newSize: number of bytes needed in block
;
; Result:
; None
;
; Registers:
; A0 - points to block
; A1 - holds return address
; D0 - number of bytes needed/error code
;
SetHandleSize PROC EXPORT
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,D0 ;get the new size
Move.L (SP)+,A0 ;get the handle
_SetHandleSize ;let OS do it
JMP (A1) ;return via A1
;----------------------------------------------------------------------
;
; FUNCTION HandleZone(h: Handle): THz;
;
; Recovers the reference to the heap zone object, given a handle for
; a block.
;
; Arguments:
; h: refers to relocatable block
;
; Result:
; pointer to the zone object for the zone
; containing the referenced block.
;
; Registers:
; A0 - handle for block/points to block's zone object
; A1 - holds return address
; D0 - error code
;
HandleZone FUNC EXPORT
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,A0 ;get the handle
_HandleZone ;let OS do it
Move.L A0,(SP) ;save zone object pointer
JMP (A1) ;return via A1
;----------------------------------------------------------------------
;
; FUNCTION RecoverHandle(p: Ptr): Handle;
;
; Recovers the handle for a relocatable block, given a pointer to the
; relocatable block. theZone must be set to reflect the zone containing
; this relocatable block.
;
; Arguments:
; rp: points to relocatable block
;
; Result:
; handle for the referenced block.
;
; Registers:
; A0 - pointer to relocatable block/handle for block
; A1 - holds return address
; D0 - error code
;
RecoverHandle FUNC EXPORT
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,A0 ;get the reloc block pointer
_RecoverHandle ;let OS do it
Move.L A0,(SP) ;save handle for block
JMP (A1) ;return via A1
;----------------------------------------------------------------------
;
; Procedure ReallocHandle(h: Handle; byteCount: Size);
;
; Allocates a relocatable block, using an existing handle.
; If the handle is not already empty, the handle is emptied first,
; then allocated.
;
; Arguments:
; h: refers to relocatable block
; byteCount: number of bytes needed in the new block
;
; Result:
; None
;
; Registers:
; A0 - handle for block/points to block's zone object
; A1 - holds return address
; D0 - new block size/error code
;
ReallocHandle PROC EXPORT
EXPORT ReallocateHandle
ReallocateHandle
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,D0 ;get the new size
Move.L (SP)+,A0 ;get the handle
_ReallocHandle ;let OS do it
JMP (A1) ;return via A1
;----------------------------------------------------------------------
;
; Procedure BlockMove(srcPtr, destPtr: Ptr; byteCount: Size);
;
; Arguments:
; srcPtr: source pointer
; destPtr: destination pointer
; byteCount: bytecount for move
;
; Registers:
; A0 - source pointer
; A1 - destination pointer
; D0 - bytecount for move
; D1 - holds return address
;
BlockMove PROC EXPORT
Move.L (SP)+,D1 ;return address
Move.L (SP)+,D0 ;byte count
Move.L (SP)+,A1 ;destination ptr
Move.L (SP)+,A0 ;source ptr
_BlockMove ;let OS to do it.
Move.L D1,A1 ;return address
JMP (A1) ;return via A1
;----------------------------------------------------------------------
;
; Procedure BlockMoveData(srcPtr, destPtr: Ptr; byteCount: Size);
;
; Arguments:
; srcPtr: source pointer
; destPtr: destination pointer
; byteCount: bytecount for move
;
; Registers:
; A0 - source pointer
; A1 - destination pointer
; D0 - bytecount for move
; D1 - holds return address
;
BlockMoveData PROC EXPORT
Move.L (SP)+,D1 ;return address
Move.L (SP)+,D0 ;byte count
Move.L (SP)+,A1 ;destination ptr
Move.L (SP)+,A0 ;source ptr
_BlockMoveData ;let OS to do it.
Move.L D1,A1 ;return address
JMP (A1) ;return via A1
;
; FUNCTION OpenDriver(driverName: OsStr255; VAR refNum: INTEGER): OsErr;
;
; OpenDriver opens the driver of a given name, returning refNum and error
;
OpenDriver FUNC EXPORT
MOVEQ #(ioQElSize/2)-1,D0
@1 CLR.W -(SP)
DBRA D0,@1
MOVE.L ioQElSize+8(sp),ioFileName(SP) ;set up name
MOVE.L SP,A0 ;point to it
_Open ;open the driver
MOVE.L ioQElSize+4(SP),a0 ;get place to put result
MOVE.W ioRefNum(SP),(a0) ;store result
MOVE.L ioQElSize(SP),A0 ;get return address
LEA ioQElSize+12(SP),SP ;get rid of param. block and parameters
MOVE.W D0,(SP) ;store error code
JMP (A0) ;return
;
; PROCEDURE CloseDriver(refNum: INTEGER):OsErr;
;
; CloseDriver closes the driver with the specified refNum
;
CloseDriver PROC EXPORT
MOVE.W 4(SP),D0 ;get the refNum
SUB #30,SP ;get space for param block
MOVE.W D0,ioRefNum(SP) ;set up refNum
MOVE.L SP,A0
_Close ;close it!
ADD #30,SP ;pop off param block
MOVE D0,6(SP) ;return result
MOVE.L (SP)+,A0
ADDQ #2,SP
JMP (A0)
;
;FUNCTION SerReset(refNum: INTEGER; serConfig: INTEGER): OSErr;
;
SerReset FUNC EXPORT
LINK A6,#-ioQElSize ; make room on stack for cmd block
MOVE.L SP,A0 ; address of cmd block
MOVE.W 10(A6),ioRefNum(A0) ; refnum
MOVE.W #8,csCode(A0) ; code for Reset
MOVE.W 8(A6),csParam(A0) ;the configuration
_Control
MOVE D0,12(A6) ; return the result code
UNLK A6
MOVE.L (SP)+,(SP)
RTS
;
;FUNCTION SerSetBuf(refNum: INTEGER; serBPtr: Ptr; serBLen: INTEGER): OSErr;
;
SerSetBuf FUNC EXPORT
LINK A6,#-ioQElSize ; make room on stack for cmd block
MOVE.L SP,A0 ; address of cmd block
MOVE.W 14(A6),ioRefNum(A0) ; refnum
MOVE.W #9,csCode(A0) ; code for Set buffer
MOVE.L 10(A6),csParam(A0) ;the ptr to the buffer
MOVE.W 8(A6),csParam+4(A0) ;the buffer length
_Control
MOVE D0,16(A6) ; return the result code
UNLK A6
MOVE.L (SP)+,A1 ; return address
ADDQ #8,SP ; fix up stack
JMP (A1)
;
;FUNCTION SerHShake(refNum: INTEGER; flags: SerShk): OSErr;
;
SerHShake FUNC EXPORT
LINK A6,#-ioQElSize ; make room on stack for cmd block
MOVE.L SP,A0 ; address of cmd block
MOVE.W 12(A6),ioRefNum(A0) ; refnum
MOVE.W #10,csCode(A0) ; code for setting handshake options
MOVE.L 8(A6),A1 ;ptr to flags record
MOVE.L (A1)+,csParam(A0) ;copy the first 4 bytes
MOVE.L (A1),csParam+4(A0) ;copy the second 4 bytes
_Control
MOVE D0,14(A6) ; return the result code
UNLK A6
MOVE.L (SP)+,A1 ; return address
ADDQ #6,SP ; fix up stack
JMP (A1)
;
;FUNCTION SerSetBrk(refNum: INTEGER): OSErr;
;
SerSetBrk FUNC EXPORT
EXPORT SetClr
MOVE.W #12,D0
SetClr
LINK A6,#-ioQElSize ; make room on stack for cmd block
MOVE.L SP,A0 ; address of cmd block
MOVE.W 8(A6),ioRefNum(A0) ; refnum
MOVE.W D0,csCode(A0) ; code for setting break
_Control
MOVE D0,10(A6) ; return the result code
UNLK A6
MOVE.L (SP)+,A1 ; return address
ADDQ #2,SP ; fix up stack
JMP (A1)
;
;FUNCTION SerClrBrk(refNum: INTEGER): OSErr;
;
SerClrBrk FUNC EXPORT
IMPORT SetClr
MOVE.W #11,D0 ;csCode for clearing break
JMP SetClr ;got to common set/clr break code
;
;FUNCTION SerGetBuf(refNum: INTEGER; VAR count: LongInt): OSErr;
;
SerGetBuf FUNC EXPORT
LINK A6,#-ioQElSize ; make room on stack for cmd block
MOVE.L SP,A0 ; address of cmd block
MOVE.W 12(A6),ioRefNum(A0) ; refnum
MOVE.W #2,csCode(A0) ; csCode for get buf
_Status
MOVE D0,14(A6) ; return the result code
MOVE.L 8(A6),A1 ; ptr to where to put count
MOVE.L csParam(A0),(A1) ;return the count
UNLK A6
MOVE.L (SP)+,A1 ; return address
ADDQ #6,SP ; fix up stack
JMP (A1)
;
;FUNCTION SerStatus(refNum: INTEGER; VAR serSta: SerStaRec): OSErr;
;
SerStatus FUNC EXPORT
LINK A6,#-ioQElSize ; make room on stack for cmd block
MOVE.L SP,A0 ; address of cmd block
MOVE.W 12(A6),ioRefNum(A0) ; refnum
MOVE.W #8,csCode(A0) ; csCode for get buf
_Status
MOVE D0,14(A6) ; return the result code
MOVE.L 8(A6),A1 ; ptr to where to put the status bytes
MOVE.L csParam(A0),(A1)+ ;return the first 4 bytes
MOVE.W csParam+4(A0),(A1) ;return the next 2 bytes
UNLK A6
MOVE.L (SP)+,A1 ; return address
ADDQ #6,SP ; fix up stack
JMP (A1)
;FUNCTION DiskEject(drvnum: INTEGER): OSErr;
;
DiskEject FUNC EXPORT
LINK A6,#-ioQElSize ; make room on stack for cmd block
MOVE.L SP,A0 ; address of cmd block
MOVE.W #dskRfN,ioRefNum(A0) ; refnum of the Sony Disk
MOVE.W #ejectCode,csCode(A0) ; code for Eject
MOVE.W 8(A6),ioDrvNum(A0) ;the drvNum of drv to be eject
_Control
MOVE D0,10(A6) ; return the result code
UNLK A6
MOVE.L (SP)+,A1 ; return address
ADDQ #2,SP ; fix up stack
JMP (A1)
;FUNCTION SetTagBuffer(buffPtr: Ptr): OSErr;
;
SetTagBuffer FUNC EXPORT
LINK A6,#-ioQElSize ; make room on stack for cmd block
MOVE.L SP,A0 ; address of cmd block
MOVE.W #dskRfN,ioRefNum(A0) ; refnum of the Sony Disk
MOVE.W #tgBuffCode,csCode(A0) ; code for SetTagBuffer
MOVE.L 8(A6),csParam(A0) ;csParam is the buffptr
_Control
MOVE D0,12(A6) ; return the result code
UNLK A6
MOVE.L (SP)+,(SP)
RTS
;FUNCTION DriveStatus(drvNum: INTEGER; VAR status: DrvSts): OSErr;
;
DriveStatus FUNC EXPORT
LINK A6,#-ioQElSize ; make room on stack for cmd block
MOVE.L SP,A0 ; address of cmd block
MOVE.W #dskRfN,ioRefNum(A0) ; refnum of the Sony Disk
MOVE.W #drvStsCode,csCode(A0) ; code for SetTagBuffer
MOVE.W 12(A6),ioDrvNum(A0) ;the drvNum of drv to be ejected
_Status
MOVE D0,14(A6) ; return the result code
MOVE.L 8(A6),A1 ; ptr to where to put the status bytes
LEA csParam(A0),A0 ;ptr from where to get status bytes
MOVEQ #22,D0 ;number of bytes to move
_BlockMove
UNLK A6
MOVE.L (SP)+,A1 ; return address
ADDQ #6,SP ; fix up stack
JMP (A1)
;FUNCTION GetTrapAddress(trapNum: INTEGER): LongInt;
GetTrapAddress FUNC EXPORT
MOVE.L (SP)+,A1 ;return address
MOVE.W (SP)+,D0 ;trap word
_GetTrapAddress
MOVE.L A0,(SP) ;return corresponding address
JMP (A1)
;PROCEDURE SetTrapAddress(trapAddr: LongInt; trapNum: INTEGER);
SetTrapAddress FUNC EXPORT
MOVE.L (SP)+,A1 ;return address
MOVE.W (SP)+,D0 ;trap number
MOVE.L (SP)+,A0 ;address
_SetTrapAddress
JMP (A1)
;FUNCTION NGetTrapAddress(trapNum: INTEGER; tTyp: TrapType): LongInt;
NGetTrapAddress FUNC EXPORT
MOVE.L (SP)+,A1 ;return address
MOVE.B (SP)+,D1 ;trap selector: 0-OSTrap 1-ToolTrap
MOVE.W (SP)+,D0 ;trap number
TST.B D1 ;0-OSTrap 1-ToolTrap
BEQ.S @1
_GetTrapAddress newTool
BRA.S @3
@1
_GetTrapAddress newOS
@3
MOVE.L A0,(SP) ;return corresponding address
JMP (A1)
;PROCEDURE NSetTrapAddress(trapAddr: LongInt; trapNum: INTEGER; tTyp: TrapType);
NSetTrapAddress FUNC EXPORT
MOVE.L (SP)+,A1 ;return address
MOVE.B (SP)+,D1 ;trap selector: 0-OSTrap 1-ToolTrap
MOVE.W (SP)+,D0 ;trap number
MOVE.L (SP)+,A0 ;trap address
TST.B D1 ;0-OSTrap 1-ToolTrap
BEQ.S @1
_SetTrapAddress newTool
BRA.S @3
@1
_SetTrapAddress newOS
@3
JMP (A1)
;FUNCTION GetOSTrapAddress(trapNum: INTEGER): LongInt;
GetOSTrapAddress FUNC EXPORT
MOVE.L (SP)+,A1 ;return address
MOVE.W (SP)+,D0 ;trap word
_GetTrapAddress newOS
MOVE.L A0,(SP) ;return corresponding address
JMP (A1)
;PROCEDURE SetOSTrapAddress(trapAddr: LongInt; trapNum: INTEGER);
SetOSTrapAddress FUNC EXPORT
MOVE.L (SP)+,A1 ;return address
MOVE.W (SP)+,D0 ;trap number
MOVE.L (SP)+,A0 ;address
_SetTrapAddress newOS
JMP (A1)
;FUNCTION GetToolTrapAddress(trapNum: INTEGER): LongInt;
;FUNCTION GetToolboxTrapAddress(trapNum: INTEGER): LongInt;
GetToolTrapAddress FUNC EXPORT
EXPORT GetToolboxTrapAddress
GetToolboxTrapAddress
MOVE.L (SP)+,A1 ;return address
MOVE.W (SP)+,D0 ;trap word
_GetTrapAddress newTool
MOVE.L A0,(SP) ;return corresponding address
JMP (A1)
;PROCEDURE SetToolTrapAddress(trapAddr: LongInt; trapNum: INTEGER);
;PROCEDURE SetToolboxTrapAddress(trapAddr: LongInt; trapNum: INTEGER);
SetToolTrapAddress FUNC EXPORT
EXPORT SetToolboxTrapAddress
SetToolboxTrapAddress
MOVE.L (SP)+,A1 ;return address
MOVE.W (SP)+,D0 ;trap number
MOVE.L (SP)+,A0 ;address
_SetTrapAddress newTool
JMP (A1)
;FUNCTION WriteParam: OsErr;
WriteParam FUNC EXPORT
LEA SysParam,A0 ;pointer to buffer to write to c chip
MOVEQ #-1,D0
_WriteParam
MOVE.W D0,4(SP) ;return error
RTS
;FUNCTION ReadDateTime(VAR time: LongInt):OsErr;
ReadDateTime PROC EXPORT
MOVE.L (SP)+,A1 ;get the return address
MOVE.L (SP)+,A0 ;get the parameter
_ReadDateTime
MOVE.W D0,(SP) ;return error
JMP (A1)
;PROCEDURE GetDateTime(VAR secs: LongInt);
GetDateTime PROC EXPORT
MOVE.L (SP)+,A1 ;get the return address
MOVE.L (SP)+,A0 ;get the parameter
MOVE.L Time,(A0)
JMP (A1)
; FUNCTION SetDateTime(time: LongInt):OsErr;
SetDateTime PROC EXPORT
MOVE.L (SP)+,A0 ;get the return address
MOVE.L (SP)+,D0 ;get the parameter
_SetDateTime
MOVE.W D0,(SP) ;return error
JMP (A0)
;PROCEDURE SetTime(d: DateArray);
SetTime PROC EXPORT
MOVE.L (SP)+,A1 ;get the return address
MOVE.L (SP)+,A0 ;get the parameter
_Date2Secs ;D0 = seconds since 1904
_SetDateTime ;clock = seconds since 1904
JMP (A1)
;PROCEDURE GetTime(VAR d: DateTimeRec);
GetTime PROC EXPORT
MOVE.L (SP)+,A1 ;get the return address
MOVE.L (SP)+,A0 ;get the parameter
MOVE.L Time,D0 ;get time from low memory
_Secs2Date
JMP (A1)
;PROCEDURE DateToSeconds(d: DateArray; VAR s: LongInt);
DateToSeconds PROC EXPORT
export Date2Secs ; obsolete old procedure name
Date2Secs
MOVEA.L 8(SP),A0 ;A0=date
_Date2Secs ;D0=seconds elapsed
MOVEM.L (SP)+,D1/A0-A1 ;D1=ret, A0=intptr, A1=date
MOVE.L D0,(A0) ;deliver result
MOVEA.L D1,A0 ;ret addr
JMP (A0)
;PROCEDURE SecondsToDate(s: LongInt; VAR d: DateArray);
SecondsToDate PROC EXPORT
export Secs2Date ; obsolete old procedure name
Secs2Date
MOVEM.L (SP)+,D0/A0-A1 ;D0=ret, A0=date, A1=s
MOVE.L D0,-(SP) ;restore return addr
MOVE.L A1,D0 ;place D0=s
_Secs2Date ;convert D0 to A0
RTS
;PROCEDURE Delay(numTicks: LongInt; VAR finalTicks: LongInt);
Delay PROC EXPORT
MOVE.L (SP)+,D0 ;get the return address
MOVE.L (SP)+,A1 ;ptr to where to return result
MOVE.L (SP)+,A0 ;numTicks
MOVE.L D0,-(SP) ;restore return address
_Delay
MOVE.L D0,(A1) ;return value of ticks after delay
RTS
;FUNCTION EqualString(str1,str2: OsStr255; caseSens,diacSens: BOOLEAN):BOOLEAN;
EqualString FUNC EXPORT
MOVE.L str1(SP),A0 ;ptr to str1
MOVE.L str2(SP),A1 ;ptr to str2
MOVEQ #0,D0
MOVE.B (A0)+,D0 ;str1 length
SWAP D0
MOVE.B (A1)+,D0 ;str2 length
;depending on value of booleans, make proper call
TST.B diacSens(SP) ;value of diacSens
BEQ.S @2 ;strip diacriticals
TST.B caseSens(SP) ;value of caseSens
BEQ.S @1 ;ignore case
_CmpString ,case ;both diacritical and case sensitive
BRA.S strDone
@1 _CmpString ;diacritical sensitive,map to upper case
BRA.S strDone
;strip diacriticals
@2 TST.B caseSens(SP) ;case sensitive?
BEQ.S @3
_CmpString ,marks,case ;ignore diacrits, case sensitive
BRA.S strDone
@3 _CmpString marks ;ignore diacrits and map to upper case
strDone EORI.B #1,D0 ;take opposite of what cmpString returns
MOVE.B D0,result(SP) ;return result
MOVE.L (SP)+,A0 ; rtn addr
LEA parmSize(SP),SP ; pop args
JMP (A0)
;PROCEDURE UprString(VAR theString: OsStr255; diacSens: BOOLEAN);
UprString PROC EXPORT
MOVE.L (SP)+,A1 ;get the return address
MOVE.B (SP)+,D1 ;diacritical sensitivity bool
MOVE.L (SP)+,A0 ;ptr to string to canonize
MOVEQ #0,D0
MOVE.B (A0)+,D0 ;string length
MOVE.L A1,-(SP) ;restore return address
;decide which flavor of uprString to call and call it
TST.B D1
BEQ.S @1 ;ignore diacriticals
_UprString ;keep diacriticals
BRA.S @2
@1 _UprString ,marks
@2 RTS
;PROCEDURE Enqueue(qElement: QElemPtr; qHeader: QHdrPtr);
Enqueue PROC EXPORT
MOVE.L (SP)+,D0
MOVE.L (SP)+,A1
MOVE.L (SP)+,A0
MOVE.L D0,-(SP)
_EnQueue
RTS
;FUNCTION Dequeue(qElement: QElemPtr; qHeader: QHdrPtr): OsErr;
Dequeue PROC EXPORT
MOVE.L (SP)+,D0
MOVE.L (SP)+,A1
MOVE.L (SP)+,A0
MOVE.L D0,-(SP)
_DeQueue
MOVE.W D0,4(SP) ;return error
RTS
;PROCEDURE Environs(VAR rom,machine: INTEGER);
Environs PROC EXPORT
MOVE.L (SP)+,A0 ;get rts
MOVE.L ROMBase,A1 ;ROM start
ADDQ #8,A1 ;offset to version
MOVE (A1),D0 ;get the version
MOVE.L (SP)+,A1 ;get machine VAR address
CLR (A1) ;assume it's a Lisa
CMP.B #$FF,D0 ;is it?
BEQ.S @0
ROR #8,D0 ;get machine into low byte
ADDQ.B #1,D0 ;turn into a Mac
MOVE.B D0,1(A1) ;set the machine parameter
@0 LSR #8,D0 ;get Lisa ROM version down
MOVE.L (SP)+,A1 ;get ROM VAR address
MOVE D0,(A1) ;return the ROM version
JMP (A0)
;FUNCTION GetDCtlEntry(refNum: INTEGER): DCtlHandle;
; Did status 1 call to get the DCEHandle... However, hard disk
; didn't know how to handle this and would crash. Now, at the
; suggestion of Jim Friedlander, I will go directly to the UnitTable
; to get the handle 12 Jun 87 - KLH
GetDCtlEntry FUNC EXPORT
MOVE.L (SP)+,A0 ; return address
MOVE.W (SP)+,D0 ; refNum
clr.l (sp) ; default result to nil <10>
NOT.W D0 ; unit entry := -1 * (refNum + 1) <10>
cmp.w UnitNtryCnt,d0 ; is there an entry of this number? <10>
bhs.s @noEntry ; no, so return NIL <10>
LSL.W #2,D0 ; index := entry * 4
MOVE.L UTableBase,A1 ; unit I/O table [pointer]
MOVE.L 0(A1,D0.W),(SP) ; return DCtlHandle
@noEntry
JMP (A0) ; RTS
;FUNCTION SetChooserAlert(f: BOOLEAN): BOOLEAN;
SetChooserAlert FUNC EXPORT
MOVE.L (SP)+,A0 ; return address
MOVE.B (SP)+,D0 ; get boolean parameter
BEQ.S @3
BSET #psAlert,HiliteMode ; now set flag true
BRA.S @5
@3 BCLR #psAlert,HiliteMode ; else set flag false
@5 SEQ d0 ; d0 = FF if it was 0, 0 if it was 1 <10>
ADDQ.B #1,d0 ; d0.b = 0 if it was 0, 1 if it was 1 <10>
move.b d0,(sp) ; set that flag <10>
JMP (A0)
;
; from ioTRAPS.TEXT -- Mac OS io Interface routines for Pascal
;
; Argument- A0: param: Points to Parameter block.
;
; Results- D0: ec: error code.
; <0: OS Call failed.
; 0: All is well.
; Registers- D0: ec: error code
; A0: param: Paramater list address.
; A1: ra: Return Address.
;
MACRO
OSCall
Move.L (SP)+,A1 ;get return address
.**** check this out thoroughly before changing
Move.B (SP)+,D0 ;Get ASync flag. (why was this a word?)
Move.L (SP)+,A0 ;get param pointer.
BNE.S @1
.*
&SysLst[1] ;tell OS to do it Synchronously
BrA.S @2
.*
@1 &SysLst[1] ,async ;Tell OS to do it Asynchronously
@2 Move.W D0,(SP) ;save result
Jmp (A1) ;return to caller
ENDM
; interface routines expecting a parameter block ptr as argument
; hence the prefix PB
;
; FUNCTION PBOpen(paramBlock: ParmBlkPtr; aSync: BOOLEAN): OsErr;
; FUNCTION PBClose(paramBlock: ParmBlkPtr; aSync: BOOLEAN): OsErr;
; FUNCTION PBRead(paramBlock: ParmBlkPtr; aSync: BOOLEAN): OsErr;
; FUNCTION PBWrite(paramBlock: ParmBlkPtr; aSync: BOOLEAN): OsErr;
; FUNCTION PBControl(paramBlock: ParmBlkPtr; aSync: BOOLEAN): OsErr;
; FUNCTION PBStatus(paramBlock: ParmBlkPtr; aSync: BOOLEAN): OsErr;
; FUNCTION PBKillio(paramBlock: ParmBlkPtr; aSync: BOOLEAN): OsErr;
;
PBOpen PROC EXPORT
OSCall _Open
PBClose PROC EXPORT
OSCall _Close
PBRead PROC EXPORT
OSCall _Read
PBWrite PROC EXPORT
OSCall _Write
PBControl PROC EXPORT
OSCall _Control
PBStatus PROC EXPORT
OSCall _Status
PBKillio PROC EXPORT
OSCall _Killio
; FUNCTION PBGetVInfo(paramBlock: ParmBlkPtr; aSync: BOOLEAN): OsErr;
; FUNCTION PBGetVol(paramBlock: ParmBlkPtr; aSync: BOOLEAN): OsErr;
; FUNCTION PBSetVol(paramBlock: ParmBlkPtr; aSync: BOOLEAN): OsErr;
; FUNCTION PBFlushVol(paramBlock: ParmBlkPtr; aSync: BOOLEAN): OsErr;
; FUNCTION PBCreate(paramBlock: ParmBlkPtr; aSync: BOOLEAN): OsErr;
; FUNCTION PBDelete(paramBlock: ParmBlkPtr; aSync: BOOLEAN): OsErr;
; FUNCTION PBOpenRF(paramBlock: ParmBlkPtr; aSync: BOOLEAN): OsErr;
; FUNCTION PBRename(paramBlock: ParmBlkPtr; aSync: BOOLEAN): OsErr;
; FUNCTION PBGetFInfo(paramBlock: ParmBlkPtr; aSync: BOOLEAN): OsErr;
; FUNCTION PBSetFInfo(paramBlock: ParmBlkPtr; aSync: BOOLEAN): OsErr;
; FUNCTION PBSetFLock(paramBlock: ParmBlkPtr; aSync: BOOLEAN): OsErr;
; FUNCTION PBRstFLock(paramBlock: ParmBlkPtr; aSync: BOOLEAN): OsErr;
; FUNCTION PBSetFVers(paramBlock: ParmBlkPtr; aSync: BOOLEAN): OsErr;
; FUNCTION PBAllocate(paramBlock: ParmBlkPtr; aSync: BOOLEAN): OsErr;
; FUNCTION PBGetEOF(paramBlock: ParmBlkPtr; aSync: BOOLEAN): OsErr;
; FUNCTION PBSetEOF(paramBlock: ParmBlkPtr; aSync: BOOLEAN): OsErr;
; FUNCTION PBGetFPos(paramBlock: ParmBlkPtr; aSync: BOOLEAN): OsErr;
; FUNCTION PBSetFPos(paramBlock: ParmBlkPtr; aSync: BOOLEAN): OsErr;
; FUNCTION PBFlushFile(paramBlock: ParmBlkPtr; aSync: BOOLEAN): OsErr;
PBGetVInfo PROC EXPORT
OSCall _GetVolInfo
PBGetVol PROC EXPORT
OSCall _GetVol
PBSetVol PROC EXPORT
OSCall _SetVol
PBFlushVol PROC EXPORT
OSCall _FlushVol
PBCreate PROC EXPORT
OSCall _Create
PBDelete PROC EXPORT
OSCall _Delete
PBOpenRF PROC EXPORT
OSCall _OpenRF
PBRename PROC EXPORT
OSCall _Rename
PBGetFInfo PROC EXPORT
OSCall _GetFileInfo
PBSetFInfo PROC EXPORT
OSCall _SetFileInfo
PBSetFLock PROC EXPORT
OSCall _SetFilLock
PBRstFLock PROC EXPORT
OSCall _RstFilLock
PBSetFVers PROC EXPORT
OSCall _SetFilType
PBAllocate PROC EXPORT
OSCall _Allocate
PBGetEOF PROC EXPORT
OSCall _GetEOF
PBSetEOF PROC EXPORT
OSCall _SetEOF
PBGetFPos PROC EXPORT
OSCall _GetFPos
PBSetFPos PROC EXPORT
OSCall _SetFPos
PBFlushFile PROC EXPORT
OSCall _FlushFile
; MountVolume, UnMountVolume, Eject, Offline calls can only be made synchronously
; FUNCTION PBMountVol(paramBlock: ParmBlkPtr): OsErr;
; FUNCTION PBUnMountVol(paramBlock: ParmBlkPtr): OsErr;
; FUNCTION PBEject(paramBlock: ParmBlkPtr): OsErr;
; FUNCTION PBOffLine(paramBlock: ParmBlkPtr): OsErr;
PBMountVol PROC EXPORT
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,A0 ;get param pointer.
_MountVol ;tell OS to do it Synchronously
Move.W D0,(SP) ;save result
Jmp (A1) ;return to caller
PBUnMountVol PROC EXPORT
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,A0 ;get param pointer.
_UnMountVol ;tell OS to do it Synchronously
Move.W D0,(SP) ;save result
Jmp (A1) ;return to caller
PBEject PROC EXPORT
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,A0 ;get param pointer.
_Eject ;tell OS to do it Synchronously
Move.W D0,(SP) ;save result
Jmp (A1) ;return to caller
PBOffLine PROC EXPORT
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,A0 ;get param pointer.
_Offline ;tell OS to do it Synchronously
Move.W D0,(SP) ;save result
Jmp (A1) ;return to caller
; PROCEDURE AddDrive(drvrRefNum: INTEGER; drvNum: INTEGER; QEl: drvQElPtr);
AddDrive PROC EXPORT
MOVE.L (SP)+,A1 ;get return address
MOVE.L (SP)+,A0 ;ptr to memory for queue element
MOVE.L (SP)+,D0 ;drive number
_AddDrive
JMP (A1)
;FUNCTION FSOpen(fileName: Str255; versNum: SignedByte; vRefNum: INTEGER; VAR refNum: INTEGER): OSErr;
;Always try to use OpenDF (which does not open drivers) first. If it doesn<73>t work, then do a
;normal Open (this is for old systems that do not implement OpenDF).
FSOpen FUNC EXPORT
EXPORT OpenDF
OpenDF
LINK A6,#-ioQElSize ; make room on stack for cmd block
MOVE.L SP,A0 ; address of cmd block
MOVE.L 14(A6),ioFileName(A0) ; set ptr to filename
MOVE.W 12(A6),ioDrvNum(A0) ; drive number
CLR.B ioFileType(A0) ; file type
CLR.B ioPermssn(A0) ; open for read/write
CLR.L ioOwnBuf(A0) ; use system buffer
_OpenDF
cmp.w #paramErr,d0 ; paramErr indicates that this OpenDF is not implemented
bne.s @continue
_Open ; use the old-style open
@continue
MOVE.L 8(A6),A1 ; return the refnum
MOVE ioRefNum(A0),(A1)
MOVE D0,18(A6) ; return the result code
UNLK A6
MOVE.L (SP)+,A0 ; return address
LEA 10(SP),SP ; fix up stack
JMP (A0)
;FUNCTION FSClose(refNum: INTEGER): OsErr;
FSClose FUNC EXPORT
LINK A6,#-ioQElSize ; make room on stack for cmd block
MOVE.L SP,A0 ; address of cmd block
MOVE 8(A6),ioRefNum(A0) ; get the refnum param
_Close
MOVE D0,10(A6) ; return the result code
UNLK A6
MOVE.L (SP)+,A0 ; return address
ADDQ.L #2,SP ; fix up stack
JMP (A0)
;FUNCTION FSRead(refNum: INTEGER; VAR count: LongInt; buffPtr: Ptr): OsErr;
;FUNCTION FSWrite(refNum: INTEGER; VAR count: LongInt; buffPtr: Ptr): OsErr;
FSRead FUNC EXPORT
EXPORT FSWrite
SF D1 ; set up read
BRA.S DoBlk
FSWrite
ST D1 ; set up write
DoBlk
LINK A6,#-ioQElSize ; make room on stack for cmd block
MOVE.L SP,A0 ; address of cmd block
MOVE.L 8(A6),ioBuffer(A0) ; buffer address
MOVE.W 16(A6),ioRefNum(A0) ; refnum
MOVE.L 12(A6),A1 ; address of the count
MOVE.L (A1),ioByteCount(A0) ; read count
CLR.W ioPosMode(A0) ; no special mode
CLR.L ioPosOffset(A0) ; clear offset
TST.B D1 ; look for read or write
BNE.S @1
_READ
BRA.S @2
@1 _WRITE
@2
MOVE D0,18(A6) ; return the result code
MOVE.L 12(A6),A1 ; address of the count
MOVE.L ioNumDone(A0),(A1) ; return count read
UNLK A6
MOVE.L (SP)+,A1 ; return address
LEA 10(SP),SP ; fix up stack
JMP (A1)
;FUNCTION Control(refNum: INTEGER; csCode: INTEGER; csParamPtr: Ptr): OsErr;
Control FUNC EXPORT
LINK A6,#-ioQElSize ; make room on stack for cmd block
MOVE.L SP,A0 ; address of cmd block
MOVE.W 14(A6),ioRefNum(A0) ; refnum
MOVE.W 12(A6),csCode(A0) ; the control operation to be performed
TST.L 8(A6) ; see if there is a parameter block
BEQ.S @1 ; if not, don't bother copying one
LEA csParam(A0),A1 ; dest address of op specific params
MOVE.L 8(A6),A0 ; src address of op specific params
MOVEQ #22,D0 ; max number of bytes to be moved
_BlockMove ; copy the op specific params
LEA -ioQElSize(A6),A0 ; put cmd block addr back into A0
@1 _CONTROL
MOVE D0,16(A6) ; return the result code
UNLK A6
MOVE.L (SP)+,A1 ; return address
ADDQ.L #8,SP ; fix up stack
JMP (A1)
;FUNCTION Status(refNum: INTEGER; csCode: INTEGER; csParamPtr: Ptr): OsErr;
Status FUNC EXPORT ;analogous to MacControl but returns
;opParams rather than expecting it as arg
LINK A6,#-ioQElSize ; make room on stack for cmd block
MOVE.L SP,A0 ; address of cmd block
MOVE.W 14(A6),ioRefNum(A0) ; refnum
MOVE.W 12(A6),csCode(A0) ; the control operation to be performed
_STATUS
MOVE D0,16(A6) ; return the result code
LEA csParam-ioQElSize(A6),A0 ;ptr to the status information
MOVE.L 8(A6),A1 ; ptr to where to put this information
MOVEQ #22,D0 ; max number of bytes to be moved
_BlockMove ; copy the op specific params
UNLK A6
MOVE.L (SP)+,A1 ; return address
ADDQ.L #8,SP ; fix up stack
JMP (A1)
;FUNCTION KillIO(refNum: INTEGER): OsErr;
KillIO FUNC EXPORT
LINK A6,#-32 ;get space for control p-block
MOVE.L SP,A0 ;point A0 at the block
MOVE.W 8(A6),ioRefNum(A0) ; refnum
_KillIO ; make the control call
MOVE D0,10(A6) ; return the result code
UNLK A6
MOVE.L (SP)+,A1 ; return address
ADDQ #2,SP ; fix up stack
JMP (A1)
;FUNCTON GetVInfo(drvNum: INTEGER; volName: StringPtr; VAR vRefNum: INTEGER; VAR freeBytes: LongInt): OsErr;
GetVInfo FUNC EXPORT
LINK A6,#-ioHVQElSize ; BUG FIX, NEED MORE ROOM FOR HParamBlock
MOVE.L SP,A0 ; BUG FIX, NEED MORE ROOM FOR HParamBlock
MOVE.L 16(A6),ioVNPtr(A0) ; volume name pointer
MOVE.W 20(A6),ioVDrvNum(A0) ; drive number
CLR.W ioVolIndex(A0) ; no volume queue index
_HGetVInfo ; make the control call
MOVE D0,22(A6) ; return the result code
MOVE.L 12(A6),A1 ; pointer to vRefNum
MOVE.W ioVRefNum(A0),(A1) ; return volume ref num
;now calculate the number of free bytes on the volume by multiplying
;allocation block size * free allocation blocks
;would ideally like to multiply long * integer but since MULU only
;multiplies two ints, to allow for a larger than 16 bit allocation
;block size we shift it right by 9 (since we know it to be a multiple
;of 512 and then shift the result back.
MOVE.L ioVAlBlkSiz(A0),D0 ;num bytes in an allocation block
MOVEQ.L #9,D1 ;shift over by 8
ASR.L D1,D0 ;and one more
MULU ioVFrBlk(A0),D0 ;multiply by number of free blocks
ASL.L D1,D0 ;shift back to the left
MOVE.L 8(A6),A1 ;pointer to free bytes
MOVE.L D0,(A1) ;return the value
UNLK A6
MOVE.L (SP)+,A1 ; return address
LEA 14(SP),SP ; fix up stack
JMP (A1)
;FUNCTION GetFInfo(fileName: Str255; versNum: SignedByte; vRefNum: INTEGER; VAR fndrInfo: FInfo):OsErr;
GetFInfo FUNC EXPORT
LINK A6,#-ioFQElSize ; make room on stack for cmd block
MOVE.L SP,A0 ; address of cmd block
MOVE.L 14(A6),ioFileName(A0) ; set ptr to filename
MOVE.W 12(A6),ioVRefNum(A0) ; set volume ref num
CLR.B ioFileType(A0) ; (version field)
CLR.W ioFDirIndex(A0) ;clear directory index
_GetFileInfo ;get the info
MOVE D0,18(A6) ; return the result code
;transfer the user defined finder info words (16 bytes) into result
LEA ioFlUsrWds(A0),A0 ;where to copy from
MOVE.L 8(A6),A1 ;where to copy to
MOVEQ #16,D0 ; 16 bytes of information
_BlockMove
UNLK A6
MOVE.L (SP)+,A1 ; return address
LEA 10(SP),SP ; fix up stack
JMP (A1)
;FUNCTION GetVol(volName: StringPtr; VAR vRefNum: INTEGER):OsErr;
GetVol FUNC EXPORT
LINK A6,#-ioVQElSize ; get space for control p-block
MOVE.L SP,A0 ; point A0 at the block
MOVE.L 12(A6),ioVNPtr(A0) ; pointer to volume name pointer
_GetVol ; make the control call
MOVE D0,16(A6) ; return the result code
MOVE.L 8(A6),A1 ; pointer to drive number
MOVE.W ioVRefNum(A0),(A1) ; return drive number
UNLK A6
MOVE.L (SP)+,A1 ; return address
ADDQ.L #8,SP ; fix up stack
JMP (A1)
;FUNCTION SetVol(volName: StringPtr; vRefNum: INTEGER): OsErr;
SetVol FUNC EXPORT
LINK A6,#-ioVQElSize ;get space for control p-block
MOVE.L SP,A0 ; point A0 at the block
MOVE.L 10(A6),ioVNPtr(A0) ; ptr to desired volume name
MOVE.W 8(A6),ioVRefNum(A0) ; desired default drive number
_SetVol ; make the control call
MOVE D0,14(A6) ; return the result code
UNLK A6
MOVE.L (SP)+,A1 ; return address
ADDQ.L #6,SP ; fix up stack
JMP (A1)
;FUNCTION UnmountVol(VolName: StringPtr; vRefNum: INTEGER):OsErr;
UnMountVol FUNC EXPORT
LINK A6,#-ioVQElSize ;get space for control p-block
MOVE.L SP,A0 ; point A0 at the block
MOVE.W 8(A6),ioVRefNum(A0) ; drive to be unmounted
MOVE.L 10(A6),ioVNPtr(A0) ; volume name pointer
_UnmountVol
MOVE D0,14(A6) ; return the result code
UNLK A6
MOVE.L (SP)+,A1 ; return address
ADDQ.L #6,SP ; fix up stack
JMP (A1)
;FUNCTION Eject(VolName: StringPtr; vRefNum: INTEGER): OSErr;
Eject FUNC EXPORT
LINK A6,#-ioVQElSize ; get space for control p-block
MOVE.L SP,A0 ; point A0 at the block
MOVE.W 8(A6),ioVRefNum(A0) ; drive to be unmounted
MOVE.L 10(A6),ioVNPtr(A0) ; volume name pointer
_Eject
MOVE D0,14(A6) ; return the result code
UNLK A6
MOVE.L (SP)+,A1 ; return address
ADDQ.L #6,SP ; fix up stack
JMP (A1)
;FUNCTION FlushVol(VolName: StringPtr; vRefNum: INTEGER): OSErr;
FlushVol FUNC EXPORT
LINK A6,#-ioVQElSize ; get space for control p-block
MOVE.L SP,A0 ; point A0 at the block
MOVE.W 8(A6),ioVRefNum(A0) ; drive to be unmounted
MOVE.L 10(A6),ioVNPtr(A0) ; volume name pointer
_FlushVol
MOVE D0,14(A6) ; return the result code
UNLK A6
MOVE.L (SP)+,A1 ; return address
ADDQ.L #6,SP ; fix up stack
JMP (A1)
;FUNCTION Create(fileName: Str255; vRefNum: INTEGER; creator: OSType; fileType: OSType): OSErr;
Create FUNC EXPORT
LINK A6,#-ioFQElSize ; make room on stack for cmd block
MOVE.L SP,A0 ; address of cmd block
MOVE.L 18(A6),ioFileName(A0) ; set ptr to filename
MOVE.W 16(A6),ioVRefNum(A0) ; set volume ref num
CLR.B ioFileType(A0) ; clear type, permissions (version field)
_Create
BNE.S crDone ;yes, don't bother setting type
CLR.W ioFDirIndex(A0) ;clear directory index
_GetFileInfo ;get the previous info
BNE.S crDone ;if we failed, return error <10>
;transfer the user defined finder info words (16 bytes)
LEA ioFlUsrWds(A0),A1 ;where to copy user words
MOVE.L 8(A6),(A1)+ ;enter in the new file type
MOVE.L 12(A6),(A1) ;enter in the new file creator
_SetFileInfo
crDone
MOVE D0,22(A6) ; return the result code
UNLK A6
MOVE.L (SP)+,A1 ; return address
LEA 14(SP),SP ; fix up stack
JMP (A1)
;FUNCTION FSDelete(fileName: OsStr255; vRefNum: INTEGER):OsErr;
FSDelete FUNC EXPORT
LINK A6,#-ioQElSize ; make room on stack for cmd block
MOVE.L SP,A0 ; address of cmd block
MOVE.L 10(A6),ioFileName(A0) ; set ptr to filename
MOVE.W 8(A6),ioVRefNum(A0) ; set volume ref num
CLR.B ioFileType(A0) ; clear type, permissions (version field)
_Delete
MOVE D0,14(A6) ; return the result code
UNLK A6
MOVE.L (SP)+,A1 ; return address
ADDQ.L #6,SP ; fix up stack
JMP (A1)
;FUNCTION OpenRF(fileName: Str255; vRefNum: INTEGER; VAR refNum: INTEGER): OSErr;
OpenRF FUNC EXPORT
LINK A6,#-ioQElSize ; make room on stack for cmd block
MOVE.L SP,A0 ; address of cmd block
MOVE.L 14(A6),ioFileName(A0) ; set ptr to filename
MOVE.W 12(A6),ioVRefNum(A0) ; set volume ref num
CLR.B ioFileType(A0) ; clear type, permissions (version field)
CLR.B ioPermssn(A0) ; open for read/write
CLR.L ioOwnBuf(A0) ; use system buffer
_OpenRF
MOVE D0,18(A6) ; return the result code
MOVE.L 8(A6),A1 ; ptr to refNum
MOVE.W ioRefNum(A0),(A1) ; return the refNum
UNLK A6
MOVE.L (SP)+,A1 ; return address
LEA 10(SP),SP ; fix up stack
JMP (A1)
;FUNCTION Rename(oldName: Str255; vRefNum: INTEGER; newName: Str255):OsErr;
Rename FUNC EXPORT
LINK A6,#-ioQElSize ; make room on stack for cmd block
MOVE.L SP,A0 ; address of cmd block
MOVE.L 14(A6),ioFileName(A0) ; set ptr to filename
MOVE.W 12(A6),ioVRefNum(A0) ; set volume ref num
CLR.B ioFileType(A0) ; clear type, permissions (version field)
MOVE.L 8(A6),ioNewName(A0) ; new name to give to file
_Rename
MOVE D0,18(A6) ; return the result code
UNLK A6
MOVE.L (SP)+,A1 ; return address
LEA 10(SP),SP ; fix up stack
JMP (A1)
;FUNCTION SetFInfo(fileName: Str255; vRefNum: INTEGER; fndrInfo: FInfo): OSErr;
SetFInfo FUNC EXPORT
LINK A6,#-ioFQElSize ; make room on stack for cmd block
MOVE.L SP,A0 ; address of cmd block
MOVE.L 14(A6),ioFileName(A0) ; set ptr to filename
MOVE.W 12(A6),ioVRefNum(A0) ; set volume ref num
CLR.B ioFileType(A0) ; (version field)
CLR.W ioFDirIndex(A0) ;clear directory index
_GetFileInfo ;get the previous info
;transfer the user defined finder info words (16 bytes)
LEA ioFlUsrWds(A0),A1 ;where to copy user words
MOVE.L 8(A6),A0 ;where the user words are now
MOVEQ #16,D0 ; 16 bytes of information
_BlockMove
MOVE.L SP,A0 ;restore A0
_SetFileInfo
MOVE D0,18(A6) ; return the result code
UNLK A6
MOVE.L (SP)+,A1 ; return address
LEA 10(SP),SP ; fix up stack
JMP (A1)
;FUNCTION SetFLock(fileName: Str255; vRefNum: INTEGER): OSErr;
SetFLock FUNC EXPORT
LINK A6,#-ioQElSize ; make room on stack for cmd block
MOVE.L SP,A0 ; address of cmd block
MOVE.L 10(A6),ioFileName(A0) ; set ptr to filename
MOVE.W 8(A6),ioVRefNum(A0) ; set volume ref num
CLR.B ioFileType(A0) ; clear type, permissions (version field)
_SetFilLock
MOVE.W D0,14(A6) ; return the result code
UNLK A6
MOVE.L (SP)+,A1 ; return address
ADDQ.L #6,SP ; fix up stack
JMP (A1)
;FUNCTION RstFLock(fileName: Str255; vRefNum: INTEGER): OSErr;
RstFLock FUNC EXPORT
LINK A6,#-ioQElSize ; make room on stack for cmd block
MOVE.L SP,A0 ; address of cmd block
MOVE.L 10(A6),ioFileName(A0) ; set ptr to filename
MOVE.W 8(A6),ioVRefNum(A0) ; set volume ref num
CLR.B ioFileType(A0) ; clear type, permissions (version field)
_RstFilLock
MOVE.W D0,14(A6) ; return the result code
UNLK A6
MOVE.L (SP)+,A1 ; return address
ADDQ.L #6,SP ; fix up stack
JMP (A1)
;FUNCTION Allocate(refNum: INTEGER; VAR count: LongInt): OSErr;
Allocate FUNC EXPORT
LINK A6,#-ioQElSize ; make room on stack for cmd block
MOVE.L SP,A0 ; address of cmd block
MOVE.L 8(A6),A1 ;ptr to requested byte count
MOVE.L (A1),ioReqCount(A0)
MOVE.W 12(A6),ioRefNum(A0) ; set refnum
_Allocate
MOVE D0,14(A6) ; return the result code
MOVE.L ioActCount(A0),(A1) ; return actual byte count
UNLK A6
MOVE.L (SP)+,A1 ; return address
ADDQ.L #6,SP ; fix up stack
JMP (A1)
;FUNCTION GetEOF(refNum: INTEGER; VAR LogEOF: LongInt): OSErr;
GetEOF FUNC EXPORT
LINK A6,#-ioQElSize ; make room on stack for cmd block
MOVE.L SP,A0 ; address of cmd block
MOVE.W 12(A6),ioRefNum(A0) ; set refnum
_GetEOF
MOVE D0,14(A6) ; return the result code
MOVE.L 8(A6),A1 ;ptr to logical length variable
MOVE.L ioLEOF(A0),(A1) ;return logical end of file
UNLK A6
MOVE.L (SP)+,A1 ; return address
ADDQ.L #6,SP ; fix up stack
JMP (A1)
;FUNCTION SetEOF(refNum: INTEGER; logEOF: LongInt): OSErr;
SetEOF FUNC EXPORT
LINK A6,#-ioQElSize ; make room on stack for cmd block
MOVE.L SP,A0 ; address of cmd block
MOVE.W 12(A6),ioRefNum(A0) ; set refnum
MOVE.L 8(A6),ioLEOF(A0) ; the desired end of file
_SetEOF
MOVE D0,14(A6) ; return the result code
UNLK A6
MOVE.L (SP)+,A1 ; return address
ADDQ.L #6,SP ; fix up stack
JMP (A1)
;
;FUNCTION GetFPos(refNum: INTEGER; VAR filePos: LongInt):OsErr;
;
GetFPos FUNC EXPORT
LINK A6,#-ioQElSize ; make room on stack for cmd block
MOVE.L SP,A0 ; address of cmd block
MOVE.W 12(A6),ioRefNum(A0) ; set refnum
_GetFPos
MOVE D0,14(A6) ; return the result code
MOVE.L 8(A6),A1 ;ptr to logical length variable
MOVE.L ioPosOffset(A0),(A1) ;return logical end of file
UNLK A6
MOVE.L (SP)+,A1 ; return address
ADDQ.L #6,SP ; fix up stack
JMP (A1)
;FUNCTION SetFPos(refNum: INTEGER; posMode: INTEGER; posOff: LongInt): OSErr;
SetFPos FUNC EXPORT
LINK A6,#-ioQElSize ; make room on stack for cmd block
MOVE.L SP,A0 ; address of cmd block
MOVE.W 14(A6),ioRefNum(A0) ; set refnum
MOVE.W 12(A6),ioPosMode(A0) ; positioning information
MOVE.L 8(A6),ioPosOffset(A0) ; new file position
_SetFPos
MOVE D0,16(A6) ; return the result code
UNLK A6
MOVE.L (SP)+,A1 ; return address
ADDQ.L #8,SP ; fix up stack
JMP (A1)
;FUNCTION GetVRefNum(fileRefNum: INTEGER; VAR vRefNum: INTEGER):OSErr;
;
; There was originally checking for valid refnums. However, when we went to
; HFS from MFS, the block size changed and the checking was commented out. This
; allowed some error to creep in, so we put INTELLIGENT checking back in. We
; check the size a block should be first! 9 Aug 88 - KLH
GetVRefNum FUNC EXPORT
MOVE.L (SP)+,A1 ;return addr
MOVEQ #0,D1 ;clear high word
MOVE.W 4(SP),D1 ;get the fileRefNum
MOVE.L FCBSPtr,A0 ;ptr to file-control-block buffer
MOVE.W FSFCBLen,D0 ;get size of file control blocks
BMI.S mfs ;-1 => MFS, so use fixed size
DIVU D0,D1 ;see if valid refnum
BRA.S hfs ; go test results
mfs DIVU #fcbEntLen,D1 ;old way: use fixed block size
hfs SWAP D1 ;continue with divide analysis: remainder
SUBQ.W #2,D1 ; should have been 2 for # of blocks.
BNE.S endError
MOVE.W 4(SP),D0 ;get fileRefNum again.
CMP.W (A0),D0 ;is refNum too large?
BCC.S endError ;br if so
MOVE.L fcbVPtr(A0,D0),A0 ;get ptr to volume control block
MOVE.W vcbVRefNum(A0),D0 ;return vRefNum
MOVEQ #0,D1 ;no err
BRA.S endG
endError MOVEQ #0,D0 ;default refum
MOVE #rfNumErr,D1 ;ref num error
endG MOVE.L (SP),A0 ;get vRefNum address
MOVE D0,(A0) ;put it there
ADDQ #6,SP ;remove passed parameters
MOVE D1,(SP) ;post the error
JMP (A1) ;go home
;_______________________________________________________________________
;
; Function: This section contains the Hierarchical File System trap macros.
;_______________________________________________________________________
;FUNCTION PBOpenWD(paramBlock: WDPBPtr; aSync: BOOLEAN): OsErr;
PBOpenWD PROC EXPORT
OSCall _OpenWD
;FUNCTION PBCloseWD(paramBlock: WDPBPtr; aSync: BOOLEAN): OsErr;
PBCloseWD PROC EXPORT
OSCall _CloseWD
;FUNCTION PBHSetVol(paramBlock: WDPBPtr; aSync: BOOLEAN): OsErr;
PBHSetVol PROC EXPORT
OSCall _HSetVol
;FUNCTION PBHGetVol(paramBlock: WDPBPtr; aSync: BOOLEAN): OsErr;
PBHGetVol PROC EXPORT
OSCall _HGetVol
;FUNCTION PBCatMove(paramBlock: CMovePBPtr; aSync: BOOLEAN): OsErr;
PBCatMove PROC EXPORT
OSCall _CatMove
;FUNCTION PBDirCreate(paramBlock: hParmBlkPtr; aSync: BOOLEAN): OsErr;
PBDirCreate PROC EXPORT
OSCall _DirCreate
;FUNCTION PBGetWDInfo(paramBlock: WDPBPtr; aSync: BOOLEAN): OsErr;
PBGetWDInfo PROC EXPORT
OSCall _GetWDInfo
;FUNCTION PBGetFCBInfo(paramBlock: FCBPBPtr; aSync: BOOLEAN): OsErr;
PBGetFCBInfo PROC EXPORT
OSCall _GetFCBInfo
;FUNCTION PBGetCatInfo(paramBlock: CInfoPBPtr; aSync: BOOLEAN): OsErr;
PBGetCatInfo PROC EXPORT
OSCall _GetCatInfo
;FUNCTION PBSetCatInfo(paramBlock: CInfoPBPtr; aSync: BOOLEAN): OsErr;
PBSetCatInfo PROC EXPORT
OSCall _SetCatInfo
;FUNCTION PBAllocContig(paramBlock: ParmBlkPtr; aSync: BOOLEAN): OsErr;
PBAllocContig PROC EXPORT
OSCall _AllocContig
;FUNCTION PBLockRange(paramBlock: ParmBlkPtr; aSync: BOOLEAN): OsErr;
PBLockRange PROC EXPORT
OSCall _LockRng
;FUNCTION PBUnLockRange(paramBlock: ParmBlkPtr; aSync: BOOLEAN): OsErr;
PBUnLockRange PROC EXPORT
OSCall _UnLockRng
;FUNCTION PBSetVInfo(paramBlock: hParmBlkPtr; aSync: BOOLEAN): OsErr;
PBSetVInfo PROC EXPORT
OSCall _SetVolInfo
;FUNCTION PBHGetVInfo(paramBlock: hParmBlkPtr; aSync: BOOLEAN): OsErr;
PBHGetVInfo PROC EXPORT
OSCall _HGetVInfo
;FUNCTION PBHOpen(paramBlock: hParmBlkPtr; aSync: BOOLEAN): OsErr;
PBHOpen PROC EXPORT
OSCall _HOpen
;FUNCTION PBHOpenRF(paramBlock: hParmBlkPtr; aSync: BOOLEAN): OsErr;
PBHOpenRF PROC EXPORT
OSCall _HOpenRF
;FUNCTION PBHCreate(paramBlock: hParmBlkPtr; aSync: BOOLEAN): OsErr;
PBHCreate PROC EXPORT
OSCall _HCreate
;FUNCTION PBHDelete(paramBlock: hParmBlkPtr; aSync: BOOLEAN): OsErr;
PBHDelete PROC EXPORT
OSCall _HDelete
;FUNCTION PBHRename(paramBlock: hParmBlkPtr; aSync: BOOLEAN): OsErr;
PBHRename PROC EXPORT
OSCall _HRename
;FUNCTION PBHRstFLock(paramBlock: hParmBlkPtr; aSync: BOOLEAN): OsErr;
PBHRstFLock PROC EXPORT
OSCall _HRstFLock
;FUNCTION PBHSetFLock(paramBlock: hParmBlkPtr; aSync: BOOLEAN): OsErr;
PBHSetFLock PROC EXPORT
OSCall _HSetFLock
;FUNCTION PBHGetFInfo(paramBlock: hParmBlkPtr; aSync: BOOLEAN): OsErr;
PBHGetFInfo PROC EXPORT
OSCall _HGetFileInfo
;FUNCTION PBHSetFInfo(paramBlock: hParmBlkPtr; aSync: BOOLEAN): OsErr;
PBHSetFInfo PROC EXPORT
OSCall _HSetFileInfo
;FUNCTION PBHGetVolParms(paramBlock: hParmBlkPtr; async: BOOLEAN): OSErr;
PBHGetVolParms PROC EXPORT
OSCall _GetVolParms
;FUNCTION PBHGetLogInInfo(paramBlock: hParmBlkPtr; async: BOOLEAN): OSErr;
PBHGetLogInInfo PROC EXPORT
OSCall _GetLogInInfo
;FUNCTION PBHGetDirAccess(paramBlock: hParmBlkPtr; async: BOOLEAN): OSErr;
PBHGetDirAccess PROC EXPORT
OSCall _GetDirAccess
;FUNCTION PBHSetDirAccess(paramBlock: hParmBlkPtr; async: BOOLEAN): OSErr;
PBHSetDirAccess PROC EXPORT
OSCall _SetDirAccess
;FUNCTION PBHMapID(paramBlock: hParmBlkPtr; async: BOOLEAN): OSErr;
PBHMapID PROC EXPORT
OSCall _MapID
;FUNCTION PBHMapName(paramBlock: hParmBlkPtr; async: BOOLEAN): OSErr;
PBHMapName PROC EXPORT
OSCall _MapName
;FUNCTION PBHCopyFile(paramBlock: hParmBlkPtr; async: BOOLEAN): OSErr;
PBHCopyFile PROC EXPORT
OSCall _CopyFile
;FUNCTION PBHMoveRename(paramBlock: hParmBlkPtr; async: BOOLEAN): OSErr;
PBHMoveRename PROC EXPORT
OSCall _MoveRename
;FUNCTION PBHOpenDeny(paramBlock: hParmBlkPtr; async: BOOLEAN): OSErr;
PBHOpenDeny PROC EXPORT
OSCall _OpenDeny
;FUNCTION PBHOpenRFDeny(paramBlock: hParmBlkPtr; async: BOOLEAN): OSErr;
PBHOpenRFDeny PROC EXPORT
OSCall _OpenRFDeny
PBCreateFileIDRef proc export
OSCall _CreateFileIDRef
PBDeleteFileIDRef proc export
OSCall _DeleteFileIDRef
PBResolveFileIDRef proc export
OSCall _ResolveFileIDRef
PBExchangeFiles proc export
OSCall _ExchangeFiles
PBCatSearch proc export
OSCall _CatSearch
PBGetForeignPrivs proc export
OSCall _GetForeignPrivs
PBSetForeignPrivs proc export
OSCall _SetForeignPrivs
PBOpenDF proc export
OSCall _OpenDF
PBHOpenDF proc export
OSCall _HOpenDF
PBMakeFSSpec proc export
OSCall _MakeFSSpec
; The Desktop Manager param block routines
; PBDTGetPath sync only call has inline glue <9>
; PBDTCloseDown sync only call has inline glue <9>
PBDTAddIcon proc export
OSCall _DTAddIcon
PBDTGetIcon proc export
OSCall _DTGetIcon
PBDTGetIconInfo proc export
OSCall _DTGetIconInfo
PBDTAddAPPL proc export
OSCall _DTAddAPPL
PBDTRemoveAPPL proc export
OSCall _DTRemoveAPPL
PBDTGetAPPL proc export
OSCall _DTGetAPPL
PBDTSetComment proc export
OSCall _DTSetComment
PBDTRemoveComment proc export
OSCall _DTRemoveComment
PBDTGetComment proc export
OSCall _DTGetComment
PBDTFlush proc export
OSCall _DTFlush
PBDTReset proc export
OSCall _DTReset
PBDTGetInfo proc export
OSCall _DTGetInfo
; PBDTOpenInform sync only calls has inline glue <9>
PBDTDelete proc export
OSCall _DTDelete
;The following are the implementation of the event mgr routines that are
;register based as oposed to stack based
;They are included here because they are OSTraps, however the interfaces for
;them are in toolIntf
;
; FUNCTION PostEvent(eventNum: INTEGER; eventMsg: LongInt): OsErr;
PostEvent PROC EXPORT
MOVE.L (SP)+,A1 ;A1 is return address
MOVE.L (SP)+,D0 ;32-bit quantity defined by the event
MOVE.W (SP)+,A0 ;word of event number
_POSTEVENT
MOVE.W D0,(SP) ;return 0=event posted; 1=not posted
JMP (A1)
; FUNCTION PPostEvent(eventCode: INTEGER; eventMsg: LONGINT; VAR qEl: EvQEl): OSErr;
PPostEvent PROC EXPORT
MOVE.L (SP)+,D1 ; return address, for now
MOVE.L (SP)+,A1 ; qEl
MOVE.L (SP)+,D0 ; eventMsg
MOVE.W (SP)+,A0 ; eventCode
MOVE.L D1,-(SP) ; restore return address
_PPostEvent
MOVE.L A0,(A1) ; stuff returned qEl ptr
MOVE.W D0,4(SP) ; stuff return code
RTS
;FUNCTION OSEventAvail(mask: INTEGER; VAR theEvent: EventRecord): BOOLEAN;
OSEventAvail FUNC EXPORT
MOVE.L (SP)+,A1 ;return address
MOVE.L (SP)+,A0 ;user event record
MOVE.W (SP)+,D0 ;event mask (set of events desired)
_OSEventAvail
ADDQ.W #1,D0
MOVE.B D0,(SP)
JMP (A1)
;FUNCTION GetOSEvent(mask: INTEGER; VAR theEvent: EventRecord): BOOLEAN;
GetOSEvent FUNC EXPORT
MOVE.L (SP)+,A1 ;return address
MOVE.L (SP)+,A0 ;user event record
MOVE.W (SP)+,D0 ;event mask (set of events desired)
_GetOSEvent
ADDQ.W #1,D0
MOVE.B D0,(SP)
JMP (A1)
; Sound Manager interface implementation
;
; PROCEDURE SetSoundVol(level: INTEGER);
SetSoundVol PROC EXPORT
MOVE.L (SP)+,A0 ;get return address
MOVE.W (SP)+,D0 ;get the volume
MOVE.L A0,-(SP) ;replace return address
LINK A6,#-32 ;get some space for the control p-block
MOVE.L SP,A0 ;point A0 at the block
MOVE.W #-4,ioRefNum(A0) ;set up the sound driver refNum
MOVE.W #2,csCode(A0) ;set up the control "opCode"
MOVE.W D0,csParam(A0) ;set up event ptr as parameter
_Control immed ;make the control call
UNLK A6 ;de-allocate parameter block
RTS
; PROCEDURE GetSoundVol(VAR level: INTEGER);
; actually, SdVolume is a byte.
GetSoundVol PROC EXPORT
MOVE.L (SP)+,A0 ;get return address
MOVE.L (SP)+,A1 ;ptr to result
CLR.B (A1)+ ;clear high byte
MOVE.B SdVolume,(A1) ;return volume level in low byte
JMP (A0)
;PROCEDURE StartSound(synthRec: Ptr; numBytes: LongInt; CompletionRtn: ProcPtr);
StartStuff PROC EXPORT
EXPORT StartSound, StopSound
;realSize set to 0 means that the parameter block is busy; the competion routine can
;not be executed while the sound handle is inconsistent
myPBlock EQU 0 ;50 bytes total, init ioResult to be NIL
realSize EQU myPBlock+50 ;what SetHandleSize means in a completion routine
IAZ EQU realSize+2 ;salted away IAZNotify routine
intrupt EQU IAZ+4 ;an interrupt routine tried to execute?
noIntrupt EQU intrupt+1 ;interrupt routines not allowed to execute
blkSize EQU noIntrupt+1
;set up the parameter block if it is free, otherwise queue up the request
;note that synchronous calls do not get queued up. We just loop around
;until all pending calls are done and then make the call. This is because
;you cannot start up a synchronous call in a VBL task
;
; 13mar87 - There was a bug in StartSound that moved only half of MinusOne
; into SoundHdl, so the following StartSound would fail the CMPA.L MinusOne
; test. That was fixed by doing a MOVE.L MinusOne,SoundHdl down by ThrowAway.
; However, code using the original incorrect glue will still break future
; applications, so we now test only for the upper half of SoundHdl having
; -1 in it. Extra work, but bulletproof.
;
; 9 Dec 88 John Dance finds StartSound is leaving a handle locked
; in the middle of the MPW shell application heap. Not all paths through
; Start & StopSound dispose of the handle. Most places that had jumped to
; ssDone (sound done) now include a path to throwAway. - KLH
StartSound
MOVE.L SoundHdl,A0 ;something like $0040 if uninitialized
; Keithen had a CMP.W MinusOne,A0 here, thinking that it checked only the high word of A0.
; Unfortunately all operations on address registers are done on the whole long word, so it
; never worked. Instead, we now use the high bit to tell if it is initialized or not. <10>
move.l a0,d0 ; <10>
BPL.S inited ;a0 != $FFFFFFFF => initialize
MOVEQ #blkSize,D0 ;enough for a single call for starters
_NewHandle ,clear
bne quit ;but can't dispose handle if didn't allocate!
_HLock
MOVE.L A0,SoundHdl ;salt away in low memory for next time
;Install code in IAZNotify so that SoundHdl can be reset to ROMBase when the
;application heap is scrubbed
MOVE.L (A0),A1
MOVE.L IAZNotify,IAZ(A1) ;keep old one so it can be called as well
LEA ClrSoundHdl,A1 ;routine to clean up after we leave
MOVE.L A1,IAZNotify
inited MOVE.L (A0),A1 ;the record mp, always good (not purgable)
TST.W ioResult(A1) ;ioResult is 0 if blk is free
BLE blkFree ;or if an error had occurred
; parameter block is not free, queue this request up if it is asynchronous. If it is
; synchronous, loop until everything else is done and then start it up
; If a completion routine trys to execute while the paramblk handle is being
; increased in size, the data would be inconsistent. To avoid this, a pair of
; flags, intrupt and noIntrupt, arbitrate between the synchronous call
; StartSound and the asynchronous MyCompletion to determine when it is safe for
; MyCompletion to execute. If MyCompletion interrupts StartSound while
; the param block handle is being moved, then MyCompletion is called by
; StartSound after the data is made consistent. A copy of the handle is created
; rather than growing the existing handle since it would be bad for the original
; handle to be locked while it is grown since this would likely fail, and it
; can not be unlocked since ioCore will still try to look at dCtlQHead at
; interrupt time. Also, since a new handle is created each time a new call
; is made, the handle can't be moved high or low since the one already high
; or low can't be freed up until after the new one is locked down.
;
; 9 Dec 88 Test for full -1 in completion routine due to bug reported by
; Jay Zipnick & Brian Baker of ICOM Simulations. Passing a Ptr with the high
; bit set doesn't seem to be a good idea, but isn't necessarily wrong yet. - KLH
MOVE.L 4(SP),D1 ;the completion rtn
; BMI.S sndWait ;oops, what if high bit set, but good address?
CMP.L MinusOne,D0 ; only full -1 => async
Beq.w sndWait ;branch if -1 to handle async <SM3> rb
ST noIntrupt(A1) ;make completion routine do nothing
MOVE realSize(A1),D1
MOVE.L A0,D2 ;save the handle to the old one
MOVEM.L D1/D2,-(SP)
_HandToHand
MOVEM.L (SP)+,D1/D2
TST D0
BNE ssDone
;??? In doing HandToHand & SetHandleSize to add new sound parameter
; block, if there is an error (BNE ssDone): we will do a throwaway,
; but could conceivably have the noIntrupt flags set and a completion
; routine that came in and not executed. So we should have done the
; clearing of flags and testing to see if we needed a completion
; routine executed. ??? Save for re-write of StartSound. 12/12/88
MOVEQ #0,D0
ADD #12,D1 ;make room for the next entry
MOVE D1,D0 ;save the size
_SetHandleSize ;make it bigger (or smaller, or the same)
BNE ssDone ;quit if couldn't do it
_HLock
MOVE.L A0,SoundHdl
MOVE.L (A0),A1 ;ptr to the queue
MOVE.L SoundDCE,A0 ;the sound driver's DCE
MOVE.L A1,dCtlQHead(A0)
MOVE.L A1,dCtlQTail(A0)
MOVE.L D2,A0 ;get back old handle
MOVE.L (A0),A0
MOVE.B intrupt(A0),D0
OR.B D0,intrupt(A1) ;just in case
MOVE.L D2,A0
_DisposHandle
MOVE D1,realSize(A1) ;keep track of real size for completion
BCLR #0,intrupt(A1) ;was it interrupted?
BEQ.S notIntrupt ;everything is just OK
; since routine was interrupted, clear ioResult since copy may have it still
; set busy
CLR ioResult(A1)
JSR myCompletion ;go take care of completion request
notIntrupt
SF noIntrupt(A1) ;allow completion routine to interrupt
ADD D1,A1 ;add in offset to end of prev data
MOVEQ #12,D0 ;number of bytes to copy
SUB D0,A1
LEA 4(SP),A0 ;ptr to the args
_BlockMove
BRA.S quit ;done queueing up, exit
; Index off of ioResult(A1) instead of A0, bug called in to
; Darin Adler. <KLH> 19 Oct 88.
sndWait MOVE.W ioResult(A1),D0 ;see if sound is done yet
BGT.S sndWait ;nope, loop on.
blkFree MOVE.L A1,A0
MOVE #blkSize,realSize(A0)
MOVE.L 8(SP),ioByteCount(A0) ;numbytes
MOVE.L 12(SP),ioBuffer(A0) ;the synthesizer rec
MOVE.W #-4,ioRefNum(A0) ;sound driver refNum
MOVE.L 4(SP),D1 ;the completion rtn
; BPL.S doAsync
CMP.L MinusOne,D1 ; only full -1 => async
Bne.S doAsync ;fall through if -1 to handle synchronous
_Write ;synchronous write
; BRA.S tstDone ;12/9/88 hmm.. why not go right to bsr throwAway?
BRA.S realDone ;must free up handle, even if error.
doAsync MOVE.L D1,ioOwnBuf(A0) ;save their compl rtn in ownBuff
LEA myCompletion,A1 ;my completion routine
MOVE.L A1,ioCompletion(A0)
_Write ,async ;asynchronous write
tstDone TST D0 ;set condition code if error
ssDone BEQ.S quit
realDone BSR.S throwAway ;if an error occurs along the way, just give up
quit MOVE.L (SP)+,A1
ADD #12,SP
JMP (A1)
throwAway
MOVE.L SoundHdl,A0 ;something like $0040 if uninitialized
; CMPA.L MinusOne,A0 ;
CMPA.W MinusOne,A0 ;only compare word to allow for old bug.
BEQ.S goHome ;if already nuked, go on
MOVE.L (A0),A1
MOVE.L IAZ(A1),IAZNotify ;fix up IAZNotify before we go
_DisposHandle
MOVE.L MinusOne,SoundHdl ;and mark low memory as unused
goHome RTS
;
; PROCEDURE StopSound;
;
StopSound
LINK A6,#-32 ;get some space for the control p-block
LEA -32(A6),A0 ;point A0 at the block
MOVE.W #-4,ioRefNum(A0) ;set up the sound driver refNum
_Killio ,immed ;make the control call
;so next StartSound with same Pitch square wave will appear to have different pitch
CLR.W CurPitch ;to fix SoundDriver bug
;now dispose of any pending write calls. Note: The completion routines are not
;called, although Killio normally would; they are just dequeued.
BSR.S throwAway ;get the handle and dispose it
UNLK A6 ;de-allocate parameter block
noMore RTS
ClrSoundHdl
BSR.S StopSound
MOVE.L IAZNotify,D0
BLE.S noMore
MOVE.L D0,A0
JMP (A0) ;otherwise, guess that it is OK to call app's
;the completion routine that gets called when an asynchronous call is through
;note: only asynchronous calls are queued up
myCompletion
MOVEM.L D0-D2/A0-A1,-(SP) ;preserve the regs
goOn MOVE.L SoundHdl,A0
MOVE.L (A0),A0
TST.B noIntrupt(A0) ;can we continue?
BEQ.S @0
ST intrupt(A0) ;we interrupted when we shouldn't have
BRA myCdone ;so do nothing (we'll get recalled later) <SM4> CSS
@0 MOVE realSize(A0),D0 ;get size
MOVE.L ioOwnBuf(A0),D1 ;address of their completion rtn
BEQ.S noCompl ;NIL completion routine
MOVE.L D1,A1 ;the completion routine
MOVEM.L D0/A0,-(SP)
JSR (A1) ;go to it
MOVEM.L (SP)+,D0/A0
noCompl CMP #blkSize,D0 ;is there a pending sound call?
; BEQ.S myCdone ;no queue, just return
; 12/9/88 per John Dance: if no queue, we are really done, so get
; rid of the handle so it won't be locked in the application heap.
BNE.S more
JSR throwAway
BRA.S myCdone
;there is a pending call, copy the parameters into the parm blk
more MOVE.L A0,A1 ;make a copy of it
LEA blkSize(A0),A0
MOVE.L (A0)+,ioOwnBuf(A1) ;their completion routine
MOVE.L (A0)+,ioByteCount(A1) ;numBytes
MOVE.L (A0)+,ioBuffer(A1) ;the synthesizer rec
MOVE.W #-4,ioRefNum(A1) ;sound driver refNum
;now remove the parameters from the queue
MOVEQ #blkSize+12,D1 ;size of handle with 1 pending entry
SUB D1,D0 ;did it have more than 1 entry?
BEQ.S dspQ ;no, just dispose of the handle
MOVE D0,D1 ;save the new size
EXT.L D0 ;clear top half for block move
MOVE.L A0,A1 ;A0 points to next queue entry
SUB #12,A1 ;A1 points to first queue entry
_BlockMove ;shift the bytes up in the queue
ADD #blkSize,D1 ;get back the new size
BRA.S setSize
dspQ MOVEQ #blkSize,D1
setSize MOVE.L SoundHdl,A0 ;get the handle again
MOVE.L (A0),A0
MOVE D1,realSize(A0)
;set up my completion routine and make the write call
complSS LEA myCompletion,A1 ;this completion routine
MOVE.L A1,ioCompletion(A0) ;stuff it
_Write ,async ;start asynchronous write and return
myCdone MOVEM.L (SP)+,D0-D2/A0-A1 ;restore regs
RTS
;global parameter block set up for the user. This allows for general
;async sound driver calls without the user worrying about memory allocation.
;if more than one sound driver call is pending at one time, a handle is created
;which contains a queue of the outstanding calls. These are posted as soon
;as the current calls is completed.
;
;FUNCTION SoundDone: BOOLEAN;
; One outstanding problem with this method; sound can not return an error.
; If ioResult is negative (error condition) then SoundDone returns TRUE.
SoundDone FUNC EXPORT
MOVE.L (SP)+,A1 ;return address
ST (SP) ;$FF, assume that sound is done
MOVE.L SoundHdl,A0 ;$E4 normally points to deep shit
; CMPA.L MinusOne,A0
CMPA.W MinusOne,A0 ;only compare word to allow for old bug.
BEQ.S exitTrue ;no handle if StopSound or sound never called
MOVE.L (A0),A0 ; parameter block
TST.W ioResult(A0) ; see if io is done
SLE (SP) ; if 0 or negative (error), set true
exitTrue
NEG.B (SP) ;turn $00 or $FF into $00 or $01
JMP (A1)
;PROCEDURE CountAppFiles(VAR message: INTEGER; VAR count: INTEGER);
;
CountAppFiles PROC EXPORT
MOVE.L 4(SP),A1
CLR (A1) ;set default count to 0
MOVE.L AppParmHandle,A0 ;the app parm handle
_GetHandleSize ;are we real
TST.L D0
BLE.S CountEnd
MOVE.L (A0),A0 ;deref appParm Handle
MOVE.L 8(SP),A1 ;ptr to message
MOVE.W (A0)+,(A1) ;return the message
MOVE.L 4(SP),A1
MOVE.W (A0),(A1) ;return the count
CountEnd
MOVE.L (SP)+,A0 ;return addr
ADDQ #8,SP
JMP (A0)
;
;PROCEDURE GetAppFiles(index: INTEGER; VAR theFile: AppFile);
;
; fType is set to all 0's if no next file was found or there is no file list
;AppFile = RECORD
; vRefNum: INTEGER;
; ftype: OsType;
; versNum: INTEGER; {versNum in high byte}
; fName: str255;
; END; {appFile}
;appParm has format: message (0/1) for load or print (2 bytes)
; # of entries (2 bytes)
; for each entry: volume refNum (2 bytes)
; type (4 bytes)
; version (2 bytes)
; name- padded to even
GetAppFiles FUNC EXPORT
MOVEM.L A2-A3,-(SP)
MOVE.L 4+8(SP),A1 ;ptr to fileListElem
CLR.L 2(A1) ;assume failure
MOVE.L AppParmHandle,A0 ;get the application parameter handle
_GetHandleSize ;are we real?
TST.L D0
BLE.S getEnd
MOVE.L (A0),A2 ;deref appParm Handle
ADDQ #2,A2 ;skip the msg
MOVE 8+8(SP),D1 ;which entry to go to
CMP (A2)+,D1 ;see if index within limit
BGT.S getEnd
SUBQ #1,D1 ;make index zero based
getLoop BLT.S getEnd ;are we done?
MOVE.L A2,A0 ;where to copy from
MOVEQ #2,D0
ADD.B 8(A0),D0 ;length of string
AND #$FFFE,D0 ;evenize it
ADDQ #8,D0 ;also move refnum,type,versNum
ADD D0,A2 ;move to next
_BlockMove
SUBQ #1,D1
BRA.S getLoop
getEnd MOVEM.L (SP)+,A2-A3 ;save regs
MOVE.L (SP)+,A0
ADDQ #6,SP ;pop args
JMP (A0)
;
;PROCEDURE ClrAppFiles(index: INTEGER);
;
ClrAppFiles PROC EXPORT
MOVE.L AppParmHandle,A0 ;get the application parameter handle
_GetHandleSize ;are we real?
TST.L D0
BLE.S clrEnd
MOVE.L (A0),A0 ;deref appParm Handle
ADDQ #2,A0 ;skip the msg
MOVE 4(SP),D1 ;which entry to go to
CMP (A0)+,D1 ;see if index within limit
BGT.S clrEnd
SUBQ #1,D1 ;make index zero based
clrLoop BLT.S clrEnd ;are we done?
BEQ.S ClrType
MOVEQ #2,D0
ADD.B 8(A0),D0 ;length of string
AND #$FFFE,D0 ;evenize it
ADD #8,D0 ;also move refnum,type,versNum
ADD D0,A0 ;move to next
SUBQ #1,D1
BRA.S clrLoop
ClrType CLR.L 2(A0)
clrEnd
MOVE.L (SP)+,A0
ADDQ #2,SP ;pop args
JMP (A0)
; PROCEDURE SysError(errorCode: INTEGER);
;
;implementation for system error handler (ie. deep sh*t manager)
;
; 2/26/88 KLH SysError calls in C Headers, Pascal Interfaces, and traps.a
; all are inline functions or traps. Nothing comes here, so remove from
; library!
;SysError PROC EXPORT
;
; MOVE.L (SP)+,A0 ;get return address
; MOVE.W (SP)+,D0 ;get error code
; _SysError ;invoke deeep sh*t
; DC.W $A9FF ;don't come back!
;----------------------------------------------------------------------
;
; FUNCTION MaxBlock: LONGINT;
;
; Returns maximum size for a block w/o compacting
;
;
; Arguments:
; none
;
; Entry:
; none
;
; Exit:
; D0.L - size of block that could be allocated
;
MaxBlock FUNC EXPORT
_MaxBlock
MOVE.L D0,4(A7)
RTS
MaxBlockSys FUNC EXPORT ; <10>
_MaxBlock sys
MOVE.L D0,4(A7)
RTS
;----------------------------------------------------------------------
;
; PROCEDURE PurgeSpace (VAR purgeFree, afterPurge: LONGINT);
;
; Returns the sum of free and purgeable bytes in the heap zone, as well
; as the maximum possible contiguous chunk which would be available
; after purging.
;
;
; Arguments:
; purgeFree sum of purgeable and free bytes in zone
; afterPurge maximum possible contiguous space after purge
;
; Entry:
; none
;
; Exit:
; A0 - maximum possible contiguous space after purge
; D0.L - sum of purgeable and free bytes in zone
;
;
PurgeSpace PROC EXPORT
_PurgeSpace
MOVE.L 4(A7),A1 ; get address of afterpurge
MOVE.L A0,(A1) ;
MOVE.L 8(A7),A1 ; get address of purgeFree
MOVE.L D0,(A1)
MOVE.L (A7)+,A1 ; get return address
ADD #8,A7 ; discard 8 bytes
JMP (A1)
;----------------------------------------------------------------------
;
; FUNCTION StackSpace: LONGINT;
;
; Returns remaining stack space available (i.e. space between A7 and HeapEnd.
;
;
; Arguments:
; none
;
; Entry:
; none
;
; Exit:
; D0.L - available stack space
;
StackSpace FUNC EXPORT
_StackSpace
MOVE.L D0,4(A7)
RTS
;----------------------------------------------------------------------
;
; FUNCTION NewEmptyHandle: Handle;
;
; This is an optimized special case of NewHandle. This routine is used
; mainly by the Resource Manager
;
;
; Arguments:
; none
;
; Entry:
; none
;
; Exit:
; A0 - handle to the new block
; D0.L - error code
;
NewEmptyHandle FUNC EXPORT
_NewEmptyHandle
MOVE.L A0,4(A7)
RTS
NewEmptyHandleSys FUNC EXPORT ; <10>
_NewEmptyHandle sys
MOVE.L A0,4(A7)
RTS
;----------------------------------------------------------------------
;
; FUNCTION HGetState(h: Handle): SignedByte;
;
; Given a handle, returns its master pointer's flags byte
;
;
; Arguments:
; h Handle to get state of
;
; Entry:
; A0 - handle
;
; Exit:
; D0.B - flags byte of handle's master pointer
;
HGetState FUNC EXPORT
MOVE.L (A7)+,A1 ; return address
MOVE.L (A7)+,A0 ; h
_HGetState
MOVE.B D0,(A7) ; is this the right byte????
JMP (A1)
;----------------------------------------------------------------------
;
; PROCEDURE HSetState(h:Handle;state: SignedByte);
;
; Given a handle and a flags byte, sets the handle's master pointer's
; flags byte
;
; Arguments:
; h: refers to relocatable block
; byteCount: number of bytes needed in the new block
;
; Entry:
; A0 - handle to set
; D0.B - flags byte
;
; Exit:
; D0.W - error code
;
HSetState PROC EXPORT
MOVE.L (A7)+,A1 ; return address
MOVE.B (A7)+,D0 ; state
MOVE.L (A7)+,A0 ; h
_HSetState
JMP (A1) ; return via A1 (2/4/86 Memerr OK)
;----------------------------------------------------------------------
DTInstall PROC EXPORT
MOVE.L 4(SP),A0 ; Get pointer to defer request block
_DTInstall
MOVE.L (SP)+,A0 ; Get return address off the stack
ADDQ.L #4,SP ; Adjust for parameter
MOVE.W D0,(SP) ; Set the OSErr return value
JMP (A0) ; Return
;----------------------------------------------------------------------
;
; FUNCTION RelString(str1,str2: Str255; caseSens, diacSens: Boolean): integer;
;
; Just like _CmpString, except it indicates sorting order of strings,
; _CmpString only tells whether or not they're equal.
;
;
; Arguments:
; str1 the first string
; str2 the second string
; caseSens case sensitive?
; diacSens sensitive to diacriticals?
;
; Entry:
; A0 - points to first character of first string
; A1 - points to first character of second string
; D0 (Hi Word) length of first string
; D0 (Lo Word) length of second string
;
; Exit:
; D0.L - -1 if first string sorts before second string
; 0 if strings are equal
; 1 if first string sorts after second string
;
RelString FUNC EXPORT
LINK A6, #0 ; allocate stack frame
MOVE.L 16(A6),A0 ;ptr to str1
MOVE.L 12(A6),A1 ;ptr to str2
MOVEQ #0,D0
MOVE.B (A0)+,D0 ;str1 length
SWAP D0
MOVE.B (A1)+,D0 ;str2 length
;depending on value of booleans, make proper call
TST.B 8(A6) ;value of diacSens
BEQ.S @2 ;strip diacriticals
TST.B 10(A6) ;value of caseSens
BEQ.S @1 ;ignore case
_RelString ,case ;both diacritical and case sensitive
BRA.S strDone
@1 _RelString ;diacritical sensitive,map to upper case
BRA.S strDone
;strip diacriticals
@2 TST.B 10(A6) ;case sensitive?
BEQ.S @3
_RelString ,marks,case ;ignore diacrits, case sensitive
BRA.S strDone
@3 _RelString ,marks ;ignore diacrits and map to upper case
strDone MOVE.W D0,20(A6) ;return result integer
UNLK A6 ; restore stack
MOVE.L (SP)+,A0 ; rtn addr
LEA 12(SP),SP ; fix up stack
JMP (A0)
;----------------------------------------------------------------------
;
;FUNCTION GetMMUMode: SignedByte;
GetMMUMode FUNC EXPORT
MOVE.B MMU32bit,4(SP) ; FUNCTION return
RTS
;PROCEDURE SwapMMUMode(VAR mode: SignedByte);
SwapMMUMode PROC EXPORT
MOVE.L 4(SP),A0 ; VAR
MOVE.B (A0),D0 ; D0 := new mode
_SwapMMUMode
MOVE.L 4(SP),A0 ; in case A0 was trashed.
MOVE.B D0,(A0) ; return old mode.
MOVE.L (SP)+,A0 ; return address
ADDQ #4,SP ; clear var address
JMP (A0)
;----------------------------------------------------------------------
;
;FUNCTION SwapInstructionCache(cacheEnable: BOOLEAN) : BOOLEAN;
SwapInstructionCache PROC EXPORT
MOVEA.L (A7)+,A1 ; save return address
CLR.L D0 ; clear D0 before we shove Boolean into it
MOVE.B (A7)+,D0 ; D0 <- new mode
MOVE.L D0,A0 ; trap wants mode in A0
CLR.W D0 ; set low word to 0 (routine selector)
_HWPriv
MOVE.W A0,D0 ; move old state of cache to D0
TST.W D0 ; if non-zero, cache was enabled
BEQ.S WasFalse ; if zero, leave result false
MOVEQ #$01,D0 ; set result to true
WasFalse:
MOVE.B D0,(A7) ; save result on stack
JMP (A1)
ENDPROC
FlushInstructionCache PROC EXPORT
MOVEA.L (A7)+,A1 ; save return address
MOVEQ #$01,D0 ; set low word to 1 (routine selector)
_HWPriv
JMP (A1)
ENDPROC
;----------------------------------------------------------------------
;
;FUNCTION SwapDataCache(cacheEnable: BOOLEAN) : BOOLEAN;
SwapDataCache PROC EXPORT
MOVEA.L (A7)+,A1 ; save return address
CLR.L D0 ; clear D0 before we shove Boolean into it
MOVE.B (A7)+,D0 ; D0 <- new mode
MOVE.L D0,A0 ; trap wants mode in A0
MOVE.W #$0002,D0 ; set low word to 2 (routine selector)
_HWPriv
MOVE.W A0,D0 ; move old state of cache to D0
TST.W D0 ; if non-zero, cache was enabled
BEQ.S WasFalse ; if zero, leave result false
MOVEQ #$01,D0 ; set result to true
WasFalse:
MOVE.B D0,(A7) ; save result on stack
JMP (A1)
ENDPROC
;PROCEDURE FlushDataCache;
FlushDataCache PROC EXPORT
MOVEA.L (A7)+,A1 ; save return address
MOVEQ #$03,D0 ; set low word to 3 (routine selector)
_HWPriv
JMP (A1)
ENDPROC
;----------------------------------------------------------------------
if obsoleteGlue then
;----------------------------------------------------------------------
;
; Procedure SetApplBase;
;
; Initialize the Application Zone while growing the System zone.
;
; Arguments:
; A0 - ptr to new application zone base.
;
; Registers:
; D0 - result code from SetApplBase (always 0)
;
SetApplBase PROC EXPORT
Move.L (SP)+,A1 ;return address
Move.L (SP)+,A0 ;startPtr
_SetApplBase ;ask OS to do request
JMP (A1) ;return via A1
;----------------------------------------------------------------------
;
; Procedure InitApplZone;
;
; Initialize the Application Zone
;
; Arguments:
; None
;
; Registers:
; D0 - result code from InitApplZone
;
InitApplZone PROC EXPORT
_InitApplZone ;ask OS to do request
rts
;----------------------------------------------------------------------
;
; FUNCTION GetZone: THz;
;
; Returns value of theZone
;
; Arguments:
; None
;
; Result:
; size of largest available block in bytes
; grow: maximum growth allowed in current zone
;
; Registers:
; A1 - holds return address
;
GetZone FUNC EXPORT
_GetZone ;ask OS to do request
Move.L A0,4(SP) ;save result
rts
;----------------------------------------------------------------------
;
; Procedure SetZone(hz: THz);
;
; Sets theZone to hz
;
; Arguments:
; hz: holds new value for theZone
;
; Registers:
; A2 - holds return address
;
SetZone PROC EXPORT
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,A0 ;zone pointer
_SetZone ;ask OS to do request
JMP (A1) ;return via A1
;----------------------------------------------------------------------
;
; Procedure PurgeMem(cbNeeded: Size);
;
; Purge purgeable blocks in the heap until a free block of cbNeeded bytes
; is found, or until the end of the zone is reached.
;
; Arguments:
; cbNeeded: size of block needed
;
; Result:
;
; Registers:
; A1 - return address
; D0 - number of bytes needed/error code
;
PurgeMem PROC EXPORT
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,D0 ;get cbNeeded
_PurgeMem ;tell OS to do it
JMP (A1) ;return via A1
;----------------------------------------------------------------------
;
; FUNCTION FreeMem: LongInt;
;
; Returns number of free bytes in the current zone
;
; Arguments:
; None
;
; Result:
; number of free bytes in the current zone
;
; Registers:
; D0 - holds result value
;
FreeMem FUNC EXPORT
_FreeMem ;ask OS to do request
Move.L D0,4(SP) ;save result
rts
;----------------------------------------------------------------------
;
; Procedure ResrvMem(cbNeeded: Size);
;
; Purge purgeable blocks in the heap until a free block of cbNeeded bytes
; is found, or until the end of the zone is reached.
;
; Arguments:
; cbNeeded: size of block needed
;
; Result:
;
; Registers:
; A1 - return address
; D0 - number of bytes needed/error code
;
ResrvMem PROC EXPORT
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,D0 ;get cbNeeded
_ResrvMem ;tell OS to do it
JMP (A1) ;return via A1
;----------------------------------------------------------------------
;
; Procedure SetGrowZone(growZone: ProcPtr);
;
; Sets the current heap zone's GrowZone procedure to growZone
;
; Arguments:
; growZone: new value for this zone's GrowZone proc
;
; Registers:
; A1 - holds return address
;
SetGrowZone PROC EXPORT
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,A0 ;Procedure pointer
_SetGrowZone ;ask OS to do request
JMP (A1) ;return via A1
;----------------------------------------------------------------------
;
; Procedure SetApplLimit(zoneLimit: Ptr);
;
; Sets the application zone's limit to zoneLimit
;
; Arguments:
; zoneLimit: new value for application zone limit
;
; A2 - holds return address
;
SetApplLimit PROC EXPORT
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,A0 ;zone pointer
_SetApplLimit ;ask OS to do request
JMP (A1) ;return via A1
;PROCEDURE MaxApplZone;
;
;grows the application zone to as large as allowable (by applLimit)
MaxApplZone PROC EXPORT
DC.W $A063 ;put ROM glue here
RTS
;-------------------------------------------------------------------------------------------
; PROCEDURE MoveHHi( h : Handle );
;
; Moves h up to the top of its region (space between two locked/nonrelocatable objects or
; between a locked/nonreloc and the heap end), but with neither purge nor heap growth, only
; compaction. The idea is to use a stack buffer to move slices of the rising block in steps,
; compacting along the way to free space at the top. Requires about 1K of stack space.
; If the block is already high, MoveHHi does nothing.
;
; Arguments: A0 = handle to be moved high
; Results: D0 = error code = 0 no error
; NilHandleErr
; LkdHandleErr
; StackErr
; Register conventions:
;
; A6 - theZone pointer
; A5 - stack locals, buffer
; A4 - handle of block we are moving
; A3 - BkLim(theZone)
;
; D6 - current BC of block moved so far (not including header)
; D7 - current BC of block left to move (not including header)
;-------------------------------------------------------------------------------------------
MoveHHi PROC EXPORT
MOVE.L (SP)+,A1 ; return address
MOVE.L (SP)+,A0 ; handle
_MoveHHi ; off to ROM version
JMP (A1) ; return to caller of glue
;----------------------------------------------------------------------
;
; Procedure DisposPtr(p: Ptr);
;
; Releases the block pointed to by p.
;
; Arguments:
; p: pointer to block to be freed
;
; Result:
; None
;
; Registers:
; A0 - points to block to be freed
; A1 - return address
; D0 - error code
;
DisposPtr PROC EXPORT
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,A0 ;get parameter
_DisposPtr ;let OS do work
JMP (A1) ;return via A1
;----------------------------------------------------------------------
;
; Procedure DisposHandle(h: Handle);
;
; Releases the block referenced by h.
;
; Arguments:
; h: handle for the block to be freed
;
; Result:
; None
;
; Registers:
; A0 - handle for block to be freed
; A1 - return address
; D0 - error code
;
DisposHandle PROC EXPORT
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,A0 ;get handle
_DisposHandle ;let OS do work
JMP (A1) ;return via A1
;----------------------------------------------------------------------
;
; Procedure EmptyHandle(h: Handle);
;
; Explicitly purges the relocatable block referred to by h.
;
; Arguments:
; h: refers to relocatable block
;
; Result:
; None
;
; Registers:
; A0 - handle for block
; A1 - holds return address
; D0 - error code
;
EmptyHandle PROC EXPORT
Move.L (SP)+,A1 ;get return address
Move.L (SP)+,A0 ;get the handle
_EmptyHandle ;let OS do it
JMP (A1) ;return via A1
;----------------------------------------------------------------------
;
; Procedure HLock(h: Handle);
; Procedure HUnLock(h: Handle);
; Procedure HPurge(h: Handle);
; Procedure HNoPurge(h: Handle);
; Procedure HSetRBit(h: Handle);
; Procedure HClrRBit(h: Handle);
;
; These procedure are used to change the lock and purge and resource
; attributes of the relocatable block referred to by h.
;
; Arguments:
; h: handle for relocatable block
;
; Registers:
; A0 - handle for relocatable block
; A1 - holds return address
;
HLock PROC EXPORT
Move.L (SP)+,A1 ;return address
Move.L (SP)+,A0 ;handle for block
_HLock ;let OS to do it.
JMP (A1) ;return via A1
HUnLock PROC EXPORT
Move.L (SP)+,A1 ;return address
Move.L (SP)+,A0 ;handle for block
_HUnLock ;let OS to do it.
JMP (A1) ;return via A1
HPurge PROC EXPORT
Move.L (SP)+,A1 ;return address
Move.L (SP)+,A0 ;handle for block
_HPurge ;let OS to do it.
JMP (A1) ;return via A1
HNoPurge PROC EXPORT
Move.L (SP)+,A1 ;return address
Move.L (SP)+,A0 ;handle for block
_HNoPurge ;let OS to do it.
JMP (A1) ;return via A1
HSetRBit PROC EXPORT
Move.L (SP)+,A1 ;return address
Move.L (SP)+,A0 ;handle for block
_HSetRBit ;let OS to do it.
JMP (A1) ; return via A1 (2/4/86 Memerr OK)
HClrRBit PROC EXPORT
Move.L (SP)+,A1 ;return address
Move.L (SP)+,A0 ;handle for block
_HClrRBit ;let OS to do it.
JMP (A1) ; return via A1 (2/4/86 Memerr OK)
;
;PROCEDURE MoreMasters;
;
MoreMasters PROC EXPORT
_MoreMasters
rts
;----------------------------------------------------------------------
;
; FUNCTION MemError: OsErr;
;
; Returns the error observed by the most recent memory manager call.
; It has been obsoleted by INLINE equivalent.
;
; Arguments:
; None
;
; Registers:
;
MemError FUNC EXPORT
Move.W MemErr,4(SP) ;last error
RTS
;___________________________________________________________________
;
; FUNCTION RamSDOpen(whichPort: SPortSel): OSErr;
;
; RAMSDOpen loads and installs Mac or MacXL RAM serial driver
; (resource type SERD, ID=1 for Mac, ID=2 for MacXL) if the system
; driver is version 0. The driver is then opened for both input
; and output. The resource should have the locked attribute set so
; that it is brought in low in the heap. If the driver is only used
; on a 512K system, it may have the System Heap bit set (there would
; probably not be room for it on a 128K machine).
;
; (1) This routine is intended for those who need the additional capability
; of the version 1 driver. History:
;
; Main problem was to get four drivers in which
; are packaged as one and still preserve the DCE pointers which the old
; one had. Probably would have been better to package as RAM DRVR 28 which,
; when opened, would have also installed 29, 30, and 31 into DCEs. Later, code
; was added to default to current drivers if they were a late enough version.
; Finally, configuration/use check was added to avoid Device Manager bug which
; ate Open error codes from driver, and to check for disk drivers using the DCEs
; which didn't support new protocol yet.
;
; (2) If we just had new ROMs, RAMSDOpen would not be needed because the driver
; would already exist - except: logical drivers which support version 1
; set may be around and want to be found. Open('.AIn') and Open('.AOut')
; would not necessarily work since open may work but version 1 level may
; still not be around.
;
; (3) So, RAMSDOpen is sort of an amalgamation of different FUNCTIONs which are handled
; separately in the future (hopefully):
;
; - loading RAM-based drivers (load appropriate one for MacXL).
; - closing old drivers and opening the new.
; - observing configuration/use protocols.
; - checking for a certain level of driver service.
;
; (4) Current loading logic is:
;
; IF either DCE is missing: fail with unitEmptyErr.
; (RAMSDOpen callers want full-duplex async service. This also
; keeps us from closing a hard-disk driver which is using one of the
; DCEs and disposing the other. We will also exit here in the case of
; AppleTalk and old ROMs because the DCEs will be removed by the MPP driver).
; IF the output DCE version byte>0, we will just try opening the current driver.
; (If both DCEs are around AND version bytes are > 0, we can assume that the
; driver is BOTH async - only async drivers in the future should use these
; refnums - AND that it's a superset version of the driver. The case of
; a network async driver should fall in here; if it's not a superset driver,
; it should just be version 0 and RAMSDOpen will fail in the config check (port
; will be in use). If it does support version 1 capability or more, RAMSDOpen
; goes directly to the open code and should open successfully. Old ROM device
; manager problems may still interfere in error cases, but we can't be perfect.
; IF both DCEs are present AND the version is 0, we check the configuration and use
; port bytes and figure out if it's ok to open. If so, we load the SERD
; resource (if not already loaded) and install it. Finally, we open the
; driver.
;
; We should put in a check for ROM85 and trap out if so; this would allow us to
; fix any problems in that ROM.
;
;
; possible errors:
; -1 - DCEs version is 0 but RAM-based (something wierd . . .)
; -97 PortInUse - some other driver is currently using this port
; -98 PortNotCf - parameter ram is set for some other type use
; -22 unitEmptyErr - DCE has been removed
; -192 ResNotFound - appropriate SERD resource not found
; -108 MemFullErr - not enough memory to load driver
;
;
;___________________________________________________________________
RamSDOpen FUNC EXPORT
EXPORT RamSDClose
serAInRfn EQU -6 ; -6 and -7 for port A
serAOutRfn EQU -7
serBInRfn EQU -8 ; -8 and -9 for port B
serBOutRfn EQU -9
idMacSERD EQU 1 ; resource ID 1 for Mac
idMacXLSERD EQU 2 ; resource ID 2 for Mac XL
resultOS EQU 10 ; RamSDOpen A6 offsets after link
portSelOS EQU 8 ; $0000=port A , $0100=port B
romVersOS EQU 8 ; version word offset from ROMBase
LINK A6, #-ioQElSize ; make room for io pblk and save
MOVEM.L D2-D3/A2-A3,-(SP) ; save regs
CLR.W ResultOS(A6) ; assume no error
; Open both drivers and we are done!
openBoth MOVEQ #1, D2 ; want to do this twice
LEA -ioQElSize(A6), A0 ; ptr to param blk
LEA drvANames, A1 ; assume port A
TST.B PortSelOS(A6) ; which port?
BEQ.S @1 ; br if port A
LEA drvBNames, A1 ; ptr to names: bIn and bOut
@1 MOVE.L A1, ioFileName(A0) ; stuff ptr to name
CLR.W ioDrvNum(A0)
CLR.B ioPermssn(A0) ; open for read/write
_Open
BNE.S ramSDFail ; better work!
CLR.W D1
MOVE.B (A1)+, D1 ; the length of this string
ADD.W D1, A1 ; skip to next name
DBRA D2, @1
RamSDExit MOVEM.L (SP)+,D2-D3/A2-A3 ; restore those regs
UNLK A6
MOVE.L (SP)+, A0 ; get rts
ADDQ #2, SP ; strip WhichPort parameter
JMP (A0)
ramSDFail MOVE.W D0, ResultOS(A6)
BRA.S RamSDExit
;___________________________________________________________________
;
; PROCEDURE RamSDClose(whichPort: SPortSel);
;
; RamSDClose closes the drivers (both in and out) for the port
; indicated by whichPort. It disposes of the RAM serial driver if
; it is no longer needed (ie the other port is not open).
;
;___________________________________________________________________
RamSDClose
LINK A6, #-ioQElSize ; make room for io pblk and save
MOVEM.L D2-D3/A2-A3,-(SP) ; save regs
; first close the in and out drivers for this port
MOVE.B PortSelOS(A6), D1 ; the value of whichPort
BSR ClsPorts
BRA.S RamSDExit ; and exit
;______________________________________;
;
; Routine: GetSerDCE
; Arguments: D2 (input) -- driver refnum
; D0 (output) -- 0 if DCE ok, unitEmptyErr if not
; A0 (output) -- DCE ptr if D0=0
; -ioQElSize(A6) -- io parameter block
; all other regs preserved
; Called By: RAMSDOpen
; Purpose: Get pointer to appropriate output DCE (based on WhichPort)
GetSerDCE LEA -ioQElSize(A6), A0 ; address of cmd block
MOVE.W D2, ioRefNum(A0) ; refnum
MOVE.W #1, csCode(A0) ; get DCE status code
_Status
BNE.S @2 ; br if the DCE is not around
MOVE.L csParam(A0), A0 ; get DCE handle
MOVE.L (A0), A0 ; get DCE ptr
BRA.S @3
@2 MOVEQ #unitEmptyErr, D0 ; no DCE (probable case of old ROM driver)
@3 RTS ; return
;______________________________________;
;
; Routine: ChkConfig
; Arguments: D1 (input) -- 0=port A , 1=port B
; D0 (output) -- 0 if avail (unchanged if avail for ChkConf1 entry)
; -97 PortInUse - some other driver is currently using this port
; -98 PortNotCf - parameter ram is set for some other type use
; all other regs preserved
; Called By: SDAvail, RAMSDOpen
; Purpose: Check to see if PortUse and SPConfig are ok for an async driver.
ChkConfig MOVEQ #0, D0 ; return 0 if ok
ChkConf1 MOVE.L D2, -(SP) ; preserve all regs (D0 changed on failure)
MOVE.B SPConfig, D2 ; see what parameter ram says
TST.B D1
BNE.S @1 ; br if port b
LSR.B #4, D2 ; use appropriate 4 bits
@1 AND.B #$0F, D2
BEQ.S @2 ; br if 0 (UseFree)
SUBQ.B #useAsync, D2 ; config'ed for async?
BEQ.S @2 ; br if so
MOVEQ #PortNotCf, D0 ; "port not configured error"
BRA.S @4
@2 MOVE.B PortBUse, D2 ; see if port is in use
TST.B D1
BNE.S @3 ; br if port b
MOVE.B PortAUse, D2
@3 BCLR #7, D2 ; in use?
BNE.S @4 ; br if not
EOR.B #useAsync, D2 ; in use by async driver?
BEQ.S @4 ; ok if so . . .
MOVEQ #PortInUse, D0 ; note the error
@4 MOVE.L (SP)+, D2 ; restore regs
TST D0 ; set CCR
RTS ; and return (D0 unchanged if ok)
;______________________________________;
;
; Routine: ClsPorts
; Arguments: D1 (input) -- 0=port A , 1=port B
; A2 (input) -- ptr to SDOpen/Close 'globals' record
; A6 (input) -- -ioQElSize(A6) is I/O parameter blk
; A0/D0 clobbered.
; Called By: RamSDOpen, RAMSDClose
; Purpose: ClsPorts closes both the in and out driver of a serial port.
intMask EQU $0600 ; excludes all ints on Mac, MacXL
ClsPorts MOVEQ #SerAInRfn, D0 ; assume port A
TST.B D1 ; portA or portB?
BEQ.S @1
MOVEQ #serBInRfn, D0 ; port B
@1 LEA -ioQElSize(A6), A0 ; the ptr to the param blk
MOVE.W D0, ioRefNum(A0) ; set up the parameter block
_Close ; close the in driver
SUBQ.W #1, ioRefNum(A0) ; refNum of out driver
_Close ; close it also
RTS ; and return
drvANames DC.B 4
DC.B '.AIn'
DC.B 5
DC.B '.AOut'
drvBNames DC.B 4
DC.B '.BIn'
DC.B 5
DC.B '.BOut'
;
;FUNCTION GetSysPPtr: SysPPtr;
;
GetSysPPtr FUNC EXPORT
MOVE.L #SysParam,4(SP) ;get the address
RTS
;PROCEDURE Restart;
Restart PROC EXPORT
MOVE.L ROMBase,A0 ;get ROM start
ADD #$A,A0 ;Offset of reboot location
JMP (A0) ;Bye
;FUNCTION GetFSQHdr: QHdrPtr;
GetFSQHdr PROC EXPORT
MOVE.L #FSQHdr,4(SP)
RTS
;FUNCTION GetDrvQHdr: QHdrPtr;
GetDrvQHdr PROC EXPORT
MOVE.L #DrvQHdr,4(SP)
RTS
;FUNCTION GetVCBQHdr: QHdrPtr;
GetVCBQHdr PROC EXPORT
MOVE.L #VCBQHdr,4(SP)
RTS
;FUNCTION GetVBLQHdr: QHdrPtr;
GetVBLQHdr PROC EXPORT
MOVE.L #VBLQueue,4(SP)
RTS
;FUNCTION GetEvQHdr: QHdrPtr;
;
GetEvQHdr PROC EXPORT
MOVE.L #EventQueue,4(SP)
RTS
;----------------------------------------------------------------------
;
; FUNCTION ApplicZone: THz;
;
; Returns value of ApplZone. It has been obsoleted by INLINE equivalent.
;
; Arguments:
; None
;
; Result:
; current value of ApplZone pointer
;
; Registers:
; A1 - holds return address
ApplicZone FUNC EXPORT
Move.L ApplZone,4(SP)
RTS
;----------------------------------------------------------------------
;
; FUNCTION SystemZone: THz;
;
; Returns value of SysZone. It has been obsoleted by INLINE equivalent.
;
; Arguments:
; None
;
; Result:
; current value of SysZone pointer
;
; Registers:
; A1 - holds return address
SystemZone FUNC EXPORT
Move.L SysZone,4(SP)
RTS
;----------------------------------------------------------------------
;
; FUNCTION TopMem: Ptr;
;
; Returns the address of the byte after the last byte of real memory.
; It has been obsoleted by INLINE equivalent.
;
; Arguments:
; None
;
; Result:
; Ptr: Address of byte just following last byte of
; real memory
;
; Registers:
; D0 - result code
TopMem FUNC EXPORT
Move.L MemTop,4(SP) ;set FUNCTION result
RTS
;----------------------------------------------------------------------
;
; FUNCTION GetApplLimit: Ptr;
;
; Fetches the current application heap limit. It has been obsoleted by
; INLINE equivalent.
GetApplLimit FUNC EXPORT
Move.L ApplLimit,4(SP) ;zone pointer
RTS
;----------------------------------------------------------------------
;
; PROCEDURE InsTime(tmTaskPtr: QElemPtr);
InsTime PROC EXPORT
; Someone thought this glue was bad because it relies on A1 being
; preserved across the trap call. That is wrong! The trap dispatcher
; preserves A1 across OS traps!
MOVE.L (A7)+,A1 ;get return address
MOVE.L (A7)+,A0 ;get pointer
_InsTime
JMP (A1) ;return
;----------------------------------------------------------------------
;
; PROCEDURE RmvTime(tmTaskPtr: QElemPtr);
RmvTime PROC EXPORT
; Someone thought this glue was bad because it relies on A1 being
; preserved across the trap call. That is wrong! The trap dispatcher
; preserves A1 across OS traps.
MOVE.L (A7)+,A1 ;get return address
MOVE.L (A7)+,A0 ;get pointer
_RmvTime
JMP (A1) ;return
;----------------------------------------------------------------------
;
; PROCEDURE PrimeTime(tmTaskPtr: QElemPtr; count: LONGINT);
PrimeTime PROC EXPORT
; Someone thought this glue was bad because it relies on A1 being
; preserved across the trap call. That is wrong! The trap dispatcher
; preserves A1 across OS traps.
MOVE.L (A7)+,A1 ;get return address
MOVE.L (A7)+,D0 ;get count
MOVE.L (A7)+,A0 ;get pointer
_PrimeTime
JMP (A1) ;return
;----------------------------------------------------------------------
;
;FUNCTION VInstall(VBLBlockPtr: VBLCBPtr): OsErr;
;
VInstall FUNC EXPORT
MOVE.L (SP)+,A1 ;get the return address
MOVE.L (SP)+,A0 ;addr of vertical retrace control blk
_VInstall
MOVE.W D0,(SP) ;return error
JMP (A1)
;
;FUNCTION VRemove(VBLBlockPtr: VBLCBPtr): OsErr;
;
VRemove FUNC EXPORT
MOVE.L (SP)+,A1 ;get the return address
MOVE.L (SP)+,A0 ;addr of vertical retrace control blk
_VRemove
MOVE.W D0,(SP) ;return error
JMP (A1)
ENDIF
;----------------------------------------------------------------------
END