mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-29 20:49:19 +00:00
3733 lines
105 KiB
Plaintext
3733 lines
105 KiB
Plaintext
;
|
||
; File: OSTraps.a
|
||
;
|
||
; Contains: Interfaces to register based traps
|
||
;
|
||
; Copyright: © 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’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
|