[net.sources.mac] Lisa Pascal source to FILE, file.asm

trb@drutx.UUCP (BuckleyTR) (02/03/85)

These two assembly procedures are called from the FILE pascal
source code.  This just gives an example of how to call assembly
from Lisa Pascal.

Tom Buckley
AT&T Information Systems
(303) 538-3442
ihnp4!drutx!trb
------------------------ CUT HERE -------------------------------
;    Example/FileAsm
;    an example of how to call assembly from Pascal, and Pascal from assembly
;
;  MODIFICATION HISTORY
;
;     06-Feb-84	 CRC  New Today
;     26-Jun-84	 CRC  Changed to use AutoScroll to use Pascal proc TrackScroll
;		      NewPtrClear stolen from Rony Sebok's "NewPtr" in OSTraps
;
;-----------------------------------------------------------------------------------
;
;     Procedure AutoScroll;
;
; The location of this procedure is passed to TextEdit in the clikLoop field.
; It is called by TextEdit when the user drags a selection range outside of the
; viewrect.  This calls the pascal procedures TrackScroll to cause the screen to
; scroll, if possible, and the selection range to be extended.
;
;-----------------------------------------------------------------------------------
;
                .NOLIST
                .INCLUDE TlAsm/GrafTypes.Text
                .INCLUDE TlAsm/QuickMacs.Text
                .INCLUDE TlAsm/SysEqu.Text
                .INCLUDE TlAsm/SysMacs.Text
                .INCLUDE TlAsm/ToolEqu.Text
                .INCLUDE TlAsm/ToolMacs.Text
                .LIST

                .PROC	 AutoScroll,0

;offsets for Pascal globals

MyWindow        .EQU	 -4			  ;offset for current application window
VScroll	        .EQU	 -20			  ;the window's vertical scroll bar
whichPart       .EQU	 -22			  ;the last button pushed
                .REF	 TrackScroll

;Get the mouse location to see if scrolling is required
                PEA     temppoint
                _GetMouse			  ;get local mouse point to D0
                MOVE.W  temppoint,D0

;Check if we're in the text rect.  TextEdit passes the currently edited record in A3.
                LEA     Condition,A0		  ;a place to store the condition code
                CMP.W   TEViewRect+Top(A3),D0	  ;compare with the viewrect top
                BLT.S   OutOfRect		  ;branch if mouse moves above top
                CMP.W   TEViewRect+Bottom(A3),D0  ;is mouse below the bottom?
                BLE.S   NoMove			  ;no, don't scroll.

;TextEdit sets the clip region to the viewrect.	 To allow the scrollbar to be redrawn,
;the clip is set to the entire window.
OutOfRect       MOVE    SR,(A0)			  ;save whether outside top, bottom
                MOVE.L  MyWindow(A5),A0		  ;global MyWindowPtr
                PEA     PortRect(A0)		  ;global MyWindowPtr^.portrect
                _ClipRect			  ;set the application's clip
                MOVE.L  VScroll(A5),-(SP)	  ;push handle for scroll, below
;now scroll up or down
                MOVE    Condition,CCR		  ;get back top or bottom condition
                BLT.S   OffTop

;We're off the bottom.  Act as if the user is pressing scrollbar's down arrow
                MOVE.W  #inDownButton,-(SP)	  ;scroll down.
                BRA.S   OT2			  ;go scroll it

;We're off the top.  Do a scroll Up.
OffTop	        MOVE.W  #inUpButton,-(SP)	  ;Scroll up.
OT2	        MOVE.W  (SP), whichPart(A5)	  ;satisfy TrackScroll condition
                JSR     TrackScroll		  ;Pascal routine.
                PEA     TEViewRect(A3)
                _ClipRect			  ;restore TextEdit's clip region

;a non-zero code returned in DO tells TextEdit to stay in the TEClick routine.
NoMove	        MOVEQ   #-1,D0			  ;return non-zero to stay in TEClick
                RTS

Condition
temppoint       .LONG   0

;-----------------------------------------------------------------------------------
;
; Function NewPtrClear(byteCount: Size): Ptr;
;
; Returns a pointer to a newly allocated non-relocatable block of memory byteCount
; bytes long.  NewPtr will set the area of memory reserved by it to zero if the
; 'clear' bit in the NewPtr trap is set.  NewHandle has a 'clear' bit as well.
;
;-----------------------------------------------------------------------------------

                .FUNC   NewPtrClear
                .REF    SaveRetA1

                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     SaveRetA1       ;save result code and return via A1

                .END