467 lines
14 KiB
Plaintext
Raw Normal View History

2019-06-29 23:17:50 +08:00
;
; File: ToolTraps.a
;
; Contains: ToolTraps is the Pascal/QuickDraw-ToolBox trap interface.
; It defines all the names declared external in the interface
; code, and implements them by trapping with the "auto-pop" bit
; set to remove the extra return address on the stack
; before dispatching. Most of this file was generated by the
; program "MakeTTraps".
;
; Copyright: © 1984-1992 by Apple Computer, Inc., all rights reserved.
;
; Change History (most recent first):
;
; <SM3> 10/28/92 SWC Changed INCLUDEs to a LOAD of StandardEqu.d.
; <7> 7/6/92 DCL Added Support for new synonyms.
; <6> 2/4/91 JL Put the SetClikLoop Entry Point back in.
; <5> 1/29/91 stb dba: change SetClikLoop glue to use Pascal conventions for
; returninug the boolean result
; <4> 11/5/90 dba moved obsolete stuff to the bottom of this file
; <3+> 11/5/90 dba move obsolete stuff to the bottom of this file
; <3> 10/2/90 JAL Removed old commented out routines. Fixed up SetClikLoop,
;
; 6 Jan 87 KLH SetClikLoop no longer needs to preserve D2.
; 16 Mar 87 KLH added GetGrayRgn.
; 18 May 87 KLH TEFromScrap glue used VAR ptr = 0, trashing low memory.
; 10 Jun 87 KLH TEToScrap gets TEScrpLength as 0000xxxx (CLR high word).
; 12 Jun 87 KLH GetItemStyle has glue to fix ROM bug.
; *** MPW 3.0d2 ***
; *** MPW 3.0a1 ***
; 6 Apr 88 KLH Removed GetAlrtStage, ResetAlrtStage, GetDblTime & GetCaretTime
; done with multiple inlines.
; *** MPW 3.0a2 ***
; 9/24/90 dba Fixed GetIndString for negative numbers (large numbers) and 0.
;--------------------------------------------------------------------
LOAD 'StandardEqu.d'
obsoleteGlue equ 0 ; stuff conditionalized by this can be moved to a separate file
;FUNCTION HandToHand(VAR theHndl: Handle): OSErr;
HandToHand PROC EXPORT
MOVE.L 4(SP),A0 ;ptr to handle
MOVE.L (A0),A0 ;the Handle
_HandToHand
MOVE.L 4(SP),A1 ;ptr to handle to be returned
MOVE.L A0,(A1) ;return the new handle
MOVE D0,8(SP) ;return error
MOVE.L (SP)+,(SP) ;pop off the return addr
RTS
;FUNCTION PtrToXHand(srcPtr: Ptr; dstHndl: Handle; size: LongInt): OSErr;
PtrToXHand PROC EXPORT
MOVE.L (SP)+,D1 ;save return address
MOVE.L (SP)+,D0 ;the size
MOVE.L (SP)+,A1 ;existing handle
MOVE.L (SP)+,A0 ;srcPtr
MOVE.L D1,-(SP) ;restore return address
_PtrToXHand
MOVE.W D0,4(SP) ;error code
RTS ;return
;FUNCTION PtrToHand(srcPtr: Ptr; VAR dstHndl: Handle; size: LongInt): OSErr;
PtrToHand PROC EXPORT
MOVE.L 12(SP),A0 ;src pointer
MOVE.L 4(SP),D0 ;size
_PtrToHand ;make a new handle and copy ptr in
MOVE.W D0,16(SP) ;error code
MOVE.L 8(SP),A1 ;address of handle
MOVE.L A0,(A1) ;return new handle
MOVE.L (SP)+,A0 ;return addr
ADD #12,SP ;pop off args
JMP (A0) ;return
;FUNCTION HandAndHand(hand1,hand2: Handle): OSErr;
HandAndHand PROC EXPORT
MOVE.L 8(SP),A0 ;source handle
MOVE.L 4(SP),A1 ;other source handle
_HandAndHand ;concats hndl in A0 to H in A1
MOVE D0,12(SP)
MOVE.L (SP)+,A0 ;return addr
ADDQ #8,SP ;pop off args
JMP (A0) ;return
;FUNCTION PtrAndHand(ptr1: Ptr; hand2: Handle; size: LongInt): OSErr;
PtrAndHand PROC EXPORT
MOVE.L 4(SP),D0 ;length of ptr
MOVE.L 8(SP),A1 ;handle
MOVE.L 12(SP),A0 ;ptr
_PtrAndHand ;concat ptr to handle
MOVE D0,16(SP) ;return error
MOVE.L (SP)+,A0 ;return addr
ADD #12,SP
JMP (A0)
;PROCEDURE DialogCut(dialog: DialogPtr);
;PROCEDURE DialogPaste(dialog: DialogPtr);
;PROCEDURE DialogCopy(dialog: DialogPtr);
;PROCEDURE DialogDelete(dialog: DialogPtr);
DialogPaste PROC EXPORT
EXPORT DialogCut
EXPORT DialogCopy
EXPORT DialogDelete
EXPORT DlgCut ; obsolete old procedure name
EXPORT DlgCopy ; obsolete old procedure name
EXPORT DlgDelete ; obsolete old procedure name
EXPORT DlgPaste ; obsolete old procedure name
DlgPaste
BSR.S StdCheck
_TEPaste
adios MOVE.L (SP)+,(SP) ;pop return/argument
RTS
DlgCut
DialogCut BSR.S StdCheck
_TECut
BRA.S adios
DlgCopy
DialogCopy BSR.S StdCheck
_TECopy
BRA.S adios
DlgDelete
DialogDelete BSR.S StdCheck
_TEDelete
BRA.S adios
StdCheck MOVE.L 8(SP),A0 ;get dialog ptr
TST EditField(A0) ;see if edit is open
BMI.S noDice
MOVE.L (SP)+,A1 ;pop return for stdcheck
MOVE.L TEHandle(A0),-(SP) ;pass text edit handle
JMP (A1)
noDice MOVEM.L (SP)+,D0/A0-A1 ;get real return addr
JMP (A0) ;return
; FUNCTION TEGetScrapLength: LongInt;
TEGetScrapLength PROC EXPORT
export TEGetScrapLen ; obsolete old procedure name
TEGetScrapLen
CLR.L 4(SP)
MOVE.W TEScrpLength,6(SP) ;low order word of longInt is len
RTS
; FUNCTION TESetScrapLength(length: LongInt);
TESetScrapLength PROC EXPORT
export TESetScrapLen ; obsolete old procedure name
TESetScrapLen
MOVE.W 6(SP),TEScrpLength ;low order word of longInt is len
MOVE.L (SP)+,(SP) ;pop arg
RTS
;---------------------------------------------------------------
;
; FUNCTION TEFromScrap: OSErr; EXTERNAL;
;
;---------------------------------------------------------------
; orig glue called GetScrap with VAR ptr = 0, which didn't blow up call,
; but trashed low memory for future use. Also noErr now returned if call OK.
; KLH 5/18/87
; credit to Tom Taylor for recognizing that scrap could be larger than
; the TERecord allows. Changed glue to prevent crashes due to this. 3/24/88
TEFromScrap PROC EXPORT
CLR.L -(SP) ; temp VAR offset: LONGINT
SUBQ #4,SP ; room for GetScrap function
CLR.L -(SP) ; Handle = NIL => get size only
MOVE.L #'TEXT',-(SP) ; what else...
PEA 12(SP) ; VAR offset
_GetScrap
MOVE.L (SP)+,D0 ; GetScrap function return
ADDQ #4,SP ; dummy offset gone in case we branch
BMI.S @error
CMP.L #32001,D0
BLO.S @continue ; scrap too large? <4>
MOVE.W #teScrapSizeErr,D0 ; Tom Taylor memorial error
BRA.S @error
@continue
CLR.L -(SP) ; temp VAR offset: LONGINT
SUBQ #4,SP ; room for GetScrap function
MOVE.L TEScrpHandle,-(SP) ; pass text edit as destHandle
MOVE.L #'TEXT',-(SP) ; what else...
PEA 12(SP) ; VAR offset
_GetScrap
MOVE.L (SP)+,D0 ; GetScrap function return
ADDQ #4,SP ; get rid of dummy offset
BPL.S @noError ; flags from func rtn still valid
@error
CLR.W TEScrpLength ; if error, no scrap length?
BRA.S @done
@noError
CLR 4(SP) ; noErr
MOVE.W D0,TEScrpLength ; stuff the length
moveq #noErr,d0 ; no error happened <4>
@done
MOVE.W D0,4(SP) ; error
RTS
;---------------------------------------------------------------
;
; FUNCTION TEToScrap: OSErr; EXTERNAL;
;
;---------------------------------------------------------------
; TEScrpLength is a long word (somebody was planning ahead). The
; Text Edit routines in the ROM do only a MOVE.W to & from it, so
; here we also treat it as only a word (Cant count on what that
; upper portion might be). This works OK for the present Text Edit
; world in which Inside Mac maintains you cannot have a lenght of a
; text edit record over 32K. This glue however, was accessed by the
; MPW shell which had no such limitation. The EXT.L D0 it had after
; grabbing the length could then extend to a large negative number
; which could trash the system depending upon what call followed it.
; 10 June 87 - KLH.
TEToScrap PROC EXPORT
MOVE.L TEScrpHandle,A0 ; get text edit
_HLock
SUBQ #4,SP
MOVE.W TEScrpLength,-(SP) ; low word of length <4>
CLR.W -(SP) ; high word of length <4>
MOVE.L #'TEXT',-(SP) ; what else...
MOVE.L (A0),-(SP) ; handle
_PutScrap
ADDQ #2,SP ; get rid of high word
MOVE.W (SP)+,4(SP) ; return error
MOVE.L TEScrpHandle,A0 ; get text edit
_HUnLock
RTS
;PROCEDURE SetClikLoop (userProc: ProcPtr; hTE: TEHandle)
;
; We stuff our ProcPtr directly into the TERec. Our ProcPtr makes room for
; the Pascal Boolean result, calls the userProc, and puts the result into
; D0 so TEClick knows whether to abort.
;
; We store the real ProcPtr at a fixed location: 20(A5).
; This means that there can only be 1 clickloop in use at any 1 time.
; KLH could have built some linked list structure for this, but deemed it
; not necessary.
SetClikLoop PROC EXPORT
MOVE.L (SP)+,D0 ;return address
MOVE.L (SP)+,A1 ;text edit record handle
MOVE.L (SP)+,20(A5) ;put clikLoop address into the
; global space reserved for clikLoop
MOVE.L (A1),A1 ;deref hTE
LEA AsmClikLoop,A0
MOVE.L A0,teClikProc(A1) ;point hTE's clikLoop to me
MOVE.L D0,A0
JMP (A0) ;go home
AsmClikLoop ;click loop entry for 64K ROMs.
CLR.B -(SP) ;leave room for Pascal BOOL rslt
MOVE.L 20(A5),A0
JSR (A0)
MOVE.B (SP)+,D0 ;TRUE to continue click loop
RTS
;PROCEDURE SetWordBreak (userProc: ProcPtr; hTE: TEHandle)
SetWordBreak PROC EXPORT
MOVE.L (SP)+,D0 ;return address
MOVE.L (SP)+,A1 ;text edit record handle
MOVE.L (SP)+,24(A5) ;global space reserved for wordbreak
MOVE.L (A1),A1 ;deref hTE
LEA AsmWordBreak,A0 ;D2 save routine
MOVE.L A0,teWordBreak(A1) ;point hTE's clikLoop to me
MOVE.L D0,A0
JMP (A0) ;go home
AsmWordBreak
CLR.B -(SP) ;leave room for result
MOVE.L A0,-(SP) ;ptr to text
MOVE.W D0,-(SP) ;the index
MOVE.L 24(A5),A0
JSR (A0) ;global space reserved for this
TST.B (SP)+ ;pop off Boolean result
RTS ;and set cc's
;PROCEDURE GetIndString(VAR theString: str255; strListID: INTEGER; index: INTEGER);
;
;gets the STR# resource with ID strListID and returns in theString the index-th
;string in the string list.
GetIndString PROC EXPORT
LINK A6,#0
;get the string list
SUBQ #4,SP ;room for result handle
MOVE.L #'STR#',-(SP) ;theType
MOVE.W 10(A6),-(SP) ;strListID
_GetResource
MOVE.L 12(A6),A1 ;ptr to where to return the str
CLR.B (A1) ;assume empty
MOVE.L (SP)+,D0 ;handle to string list
BEQ.S gsret ;if empty, just quit
MOVE.L D0,A0 ;get handle in A0
MOVE.L (A0),A0 ;deref it
MOVE.W (A0)+,D0 ;get the number of strings
MOVE.W 8(A6),D1 ;the index
BEQ.S gsret ;index of 0 <dba 9/24/90>
CMP.W D0,D1 ;is index larger than count?
BHI.S gsret ;yes, just quit <dba 9/24/90>
MOVEQ #0,D0 ;will keep track of length of strs
gsLoop SUBQ.W #1,D1 ;decrement the index
BEQ.S gsCopy ;found the one we are looking for
MOVE.B (A0)+,D0 ;get length of this one
ADD.L D0,A0 ;skip over this string
BRA.S gsLoop ;and go on to next
gsCopy MOVE.B (A0),D0 ;get the length of this string
ADDQ #1,D0 ;add one for the length byte
_BlockMove ;copy it into the string
gsret UNLK A6
MOVE.L (SP)+,A0 ;return addr
ADDQ.L #8,SP ;pop off parms
JMP (A0) ;return
;PROCEDURE GetIndPattern(VAR thePat: Pattern; patListID: INTEGER;index: INTEGER)
;
;gets PAT# resource with ID patListID and stuffs into thePat the index-th
;pattern in the list.
GetIndPattern PROC EXPORT
LINK A6,#0
;get the string list
SUBQ #4,SP ;room for result handle
MOVE.L #'PAT#',-(SP) ;theType
MOVE.W 10(A6),-(SP) ;patListID
_GetResource
MOVE.L 12(A6),A1 ;ptr to where to return the pat
MOVE.L (SP)+,D0 ;handle to string list
BEQ.S gpret ;if empty, just quit
MOVE.L D0,A0 ;get handle in A0
MOVE.L (A0),A0 ;deref it
MOVE.W (A0)+,D0 ;get the number of patterns
MOVE.W 8(A6),D1 ;the index
BEQ.S gpret ;no such thing as negative index <4>
CMP.W D0,D1 ;is index larger than count?
BHI.S gpret ;yes, just quit <4>
gpLoop SUBQ.W #1,D1 ;decrement the index
BEQ.S gpCopy ;found the one we are looking for
ADDQ #8,A0 ;skip over the pattern
BRA.S gpLoop ;and go on to next
gpCopy move.l (a0)+,(a1)+ ;first 4 bytes <4>
move.l (a0),(a1) ;second four bytes <4>
gpret UNLK A6
MOVE.L (SP)+,A0 ;return addr
ADDQ.L #8,SP ;pop off parms
JMP (A0) ;return
;PROCEDURE ScreenRes(VAR scrnHRes, scrnVRes: INTEGER);
ScreenRes PROC EXPORT ;untested
MOVE.L (SP)+,A0
MOVE.L (SP)+,A1 ;get scrnHRes address
MOVE.W ScrVRes,(A1)
MOVE.L (SP)+,A1 ;get scrnVRes address
MOVE.W ScrHRes,(A1)
JMP (A0)
;PROCEDURE SetFractEnable(fractEnable:BOOLEAN);
SetFractEnable PROC EXPORT
CMP.W #$3FFF,ROM85 ;is it numMac ROM?
BHI.S @99
_SetFractEnable autoPop ;the trap will return to caller
@99
MOVE.L (SP)+,A0
MOVE.B (SP)+,FractEnable
MOVE.L MinusOne,LastSpExtra ;note that widths are invalid
JMP (A0)
; GetItemStyle has a bug in the ROM: We get a ptr to a Style (byte). The
; ROM does a MOVE.W to this location, trashing other things and not returning
; the correct value. 12 June 87 - KLH
;
; PROCEDURE GetItemStyle(menu: MenuHandle; item: INTEGER; VAR styleVal: Style);
GetItemStyle PROC EXPORT
SUBQ.L #2,SP ; Make room for dummy Style VAR
MOVE.L 12(SP),-(SP) ; move up MenuHandle
MOVE.W 14(SP),-(SP) ; move up item
PEA 6(SP) ; new VAR address points to dummy.
_GetItmStyle
MOVE.W (SP)+,D0 ; Style as word in D0.
MOVE.L (SP)+,A0 ; return address
MOVE.L (SP)+,A1 ; REAL VAR address
MOVE.B D0,(A1) ; we did it!
ADDQ.L #6,SP ; clean up orig menu & item.
JMP (A0) ; RTS
;----------------------------------------------------------------------
if obsoleteGlue then
;----------------------------------------------------------------------
;PROCEDURE SetDAFont(fontNum: INTEGER);
SetDAFont PROC EXPORT
MOVE.L (SP)+,A0 ;return addr
MOVE.W (SP)+,DlgFont ;set new dlg font
JMP (A0)
;FUNCTION GetMaskTable: Ptr;
GetMaskTable FUNC EXPORT
_GetMaskTable
MOVE.L A0, 4(A7) ;move pointer from A0 onto stack
RTS
; FUNCTION GetGrayRgn: RgnHandle;
GetGrayRgn FUNC EXPORT
MOVE.L GrayRgn,4(SP)
RTS
;----------------------------------------------------------------------
endif
;----------------------------------------------------------------------
END