mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-12-01 18:50:30 +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
|