sys7.1-doc-wip/QuickDraw/Classic/GrafAsm.m.a
2019-07-27 22:37:48 +08:00

588 lines
17 KiB
Plaintext

;
; File: GrafAsm.m.a
;
; Contains: xxx put contents here (or delete the whole line) xxx
;
; Written by: xxx put name of writer here (or delete the whole line) xxx
;
; Copyright: © 1988-1990 by Apple Computer, Inc., all rights reserved.
;
; Change History (most recent first):
;
; <3> 10/10/90 JL Change SysError to MSysError to avoid conflict with Traps.a
; <2> 5/30/90 JT Adding to BBS for the first time. OpenPort, InitPort, and
; SetPort now reset the horizontal pen fraction.
; <1.2> 7/6/89 GGD Un-Proc'd InitPort so that alignment wouldn't screw up OpenPort
; falling into it.
; <1.1> 11/11/88 CCH Fixed Header.
; <1.0> 11/9/88 CCH Adding to EASE.
; <1.2> 10/12/88 CCH Changed “m.GrafType.a” to “GrafType.m.a”.
; <1.1> 5/18/88 MSH Changed inclides to use m.GRAPHTYPES to work under EASE.
; <1.0> 2/11/88 BBM Adding file for the first time into EASE…
;
; To Do:
;
;EASE$$$ READ ONLY COPY of file “GRAFASM.m.a”
; 1.2 GGD 07/06/1989 Un-Proc'd InitPort so that alignment wouldn't screw up OpenPort falling into it.
; 1.1 CCH 11/11/1988 Fixed Header.
; 1.0 CCH 11/ 9/1988 Adding to EASE.
; OLD REVISIONS BELOW
; 1.2 CCH 10/12/1988 Changed “m.GrafType.a” to “GrafType.m.a”.
; 1.1 MSH 5/18/88 Changed inclides to use m.GRAPHTYPES to work under EASE.
; 1.0 BBM 2/11/88 Adding file for the first time into EASE…
; END EASE MODIFICATION HISTORY
BLANKS ON
STRING ASIS
INCLUDE 'GRAFTYPES.m.a'
IF (&TYPE('hasPenFraction') = 'UNDEFINED') THEN
IF forROM THEN
hasPenFraction EQU 0
ELSEIF (sysVers >= $700) THEN
hasPenFraction EQU 1
ELSE
hasPenFraction EQU 0
ENDIF
ENDIF
;------------------------------------------------------------
;
; --> GRAFASM.TEXT
;
; Miscellaneous unclassified routines.
;
NewHandle FUNC EXPORT
EXPORT SetHSize
;------------------------------------------------
;
; FUNCTION NewHandle(byteCount: INTEGER): Ptr;
;
MOVEQ #0,D0 ;clear out high part
MOVE.L (SP)+,A1 ;get return address
MOVE.W (SP)+,D0 ;get the byte count
_NewHandle ;ask OS to do request
BNE.S MemFull ;if memory full, deep shit!
MOVE.L A0,(SP) ;return result handle on stack
JMP (A1) ;return to caller
; handle the memory full error by deep-shitting
MemFull MOVEQ #25,D0 ;Deep Shit memory full error code
_MSysError
DC.W $A9FF ;invoke debugger just in case it comes back
;
; PROCEDURE SetHSize(h: Handle; newSize: INTEGER);
;
SetHSize MOVEQ #0,D0 ;clear high word
MOVE.L (SP)+,A1 ;pop return address
MOVE.W (SP)+,D0 ;pop the new size
MOVE.L (SP)+,A0 ;pop the handle
_SetHandleSize ;let OS do it
BNE.S MemFull ;if out of memory, deepShit
JMP (A1) ;return to caller
InitGraf PROC EXPORT
;--------------------------------------------------
;
; PROCEDURE InitGraf(globalPtr: Ptr);
;
;
PARAMSIZE EQU 4
GLOBALPTR EQU PARAMSIZE+8-4 ;LONG
LINK A6,#0 ;NO LOCALS
MOVE.L A4,-(SP) ;SAVE REG
MOVE.L GLOBALPTR(A6),A4 ;GET POINTER TO QUICKDRAW GLOBALS
MOVE.L A4,GRAFGLOBALS(A5) ;SAVE IN MAGIC LOCATION
;
; new addition 22 Apr 85
;
CLR.B $8F3 ; set lo-mem flag, QDExist
LEA lastGrafGlob(A4),A0 ;SET UP START POINTER
LEA thePort+4(A4),A1 ;SET UP LIMIT POINTER
CLRLP CLR.W (A0)+ ;CLEAR A WORD
CMPA.L A1,A0 ;CHECK LIMIT POINTER
BNE CLRLP ;CLEAR ALL GLOBALS
;QDSpareD..QDSpare4 = all zeros
;playIndex := 0
;fontPtr = Nil
;FixTxWid := 0.0
;patAlign := (0,0)
;polyMax := 0
;thePoly := Nil
;QDSpare0 := 0
;playPic := Nil
;rgnMax := 0
;rgnIndex := 0
;rgnBuf := Nil
LEA wideData(A4),A4
MOVE.L A4,D0 ;REMEMBER ADDR OF WIDEDATA
MOVE #10,(A4)+ ;wideData.rgnSize := 10
MOVE.L #$80018001,(A4)+ ;wideData.rgnBBox :=
MOVE.L #$7FFF7FFF,(A4)+ ;(-32767,-32767,32767,32767)
MOVE.L A4,D1 ;REMEMBER ADDR OF WIDEMASTER
MOVE.L D0,(A4)+ ;wideMaster := @wideData
MOVE.L D1,(A4)+ ;wideOpen := @wideMaster
MOVEQ #1,D0
MOVE.L D0,(A4)+ ;randSeed := 1
MOVE.L A4,-(SP) ;point to screenBits
_GetScrnBits ;fill in screenBits
ADD #14,A4 ;bump past screenBits
MOVEQ #26,D0 ;INIT LOOP COUNT
LEA CURDATA,A0 ;POINT TO CURSOR DATA
CRSRLP MOVE.L (A0)+,(A4)+ ;COPY A LONG INTO GLOBALS
DBRA D0,CRSRLP ;LOOP FOR 27 LONGS
;thePort := NIL
MOVE.L (SP)+,A4 ;RESTORE REG
UNLINK PARAMSIZE,'INITGRAF'
CURDATA DC.W $0000,$4000,$6000,$7000 ;ARROW.DATA
DC.W $7800,$7C00,$7E00,$7F00
DC.W $7F80,$7C00,$6C00,$4600
DC.W $0600,$0300,$0300,$0000
DC.W $C000,$E000,$F000,$F800 ;ARROW.MASK
DC.W $FC00,$FE00,$FF00,$FF80
DC.W $FFC0,$FFE0,$FE00,$EF00
DC.W $CF00,$8780,$0780,$0380
DC.W $0001,$0001 ;ARROW.HOTSPOT := (1,1)
DC.L $77DD77DD,$77DD77DD ;dkGray
DC.L $88228822,$88228822 ;ltGray
DC.L $AA55AA55,$AA55AA55 ;gray
DC.L $FFFFFFFF,$FFFFFFFF ;black
DC.L $00000000,$00000000 ;white
OpenPort PROC EXPORT
IMPORT NewRgn
;-------------------------------------------------------------
;
; PROCEDURE OpenPort(port: GrafPtr);
; { allocate clipRgn and visRgn, then call InitPort.
;
CLR.L -(SP) ;MAKE ROOM FOR FUNCTION RESULT
JSR NEWRGN ;ALLOCATE A NEW REGION
CLR.L -(SP) ;MAKE ROOM FOR FUNCTION RESULT
JSR NEWRGN ;ALLOCATE A SECOND NEW REGION
MOVE.L 12(SP),A0 ;POINT TO PORT
MOVE.L (SP)+,CLIPRGN(A0) ;INSTALL NEW REGION INTO CLIPRGN
MOVE.L (SP)+,VISRGN(A0) ;AND OTHER INTO VISRGN
;FALL THRU TO InitPort
EXPORT InitPort ; <1.2>
IMPORT RectRgn,CopyRgn ; <1.2>
InitPort ; <1.2>
;-------------------------------------------------------------
;
; PROCEDURE InitPort(port: GrafPtr);
;
; { initialize all fields of an existing GrafPort }
;
MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO QUICKDRAW GLOBALS
MOVE.L 4(SP),A1 ;GET PORT PARAM
MOVE.L A1,THEPORT(A0) ;SetPort(port)
IF hasPenFraction THEN
move.w #$8000,pnLocFixed(a0) ; reset pen fraction.
ENDIF
CLR.W (A1)+ ;DEVICE := 0
LEA SCREENBITS(A0),A0 ;POINT TO SCREENBITS
MOVE.L (A0)+,(A1)+ ;portBits := screenBits
MOVE.W (A0)+,(A1)+ ;COPY ROWBYTES
MOVE.L (A0),(A1)+ ;COPY TOPLEFT
MOVE.L 4(A0),(A1)+ ;COPY BOTRIGHT
MOVE.L (A0),(A1)+ ;portRect := screenBits.bounds
MOVE.L 4(A0),(A1)+ ;all 8 bytes
MOVE.L (A1)+,-(SP) ;visRgn := screenBits.bounds
MOVE.L A0,-(SP)
JSR RECTRGN
MOVE.L 4(SP),A1 ;GET PORT PARAM
MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO QUICKDRAW GLOBALS
MOVE.L WIDEOPEN(A0),-(SP) ;PUSH WIDE OPEN RGN
MOVE.L CLIPRGN(A1),-(SP) ;PUSH CLIPRGN
JSR COPYRGN ;SET TO WIDE OPEN
MOVE.L 4(SP),A1 ;GET PORT PARAM
LEA BKPAT(A1),A1
CLR.L (A1)+ ;bkPat := white
CLR.L (A1)+
MOVEQ #-1,D0
MOVE.L D0,(A1)+ ;fillPat := Black
MOVE.L D0,(A1)+
CLR.L (A1)+ ;pnLoc := (0,0)
MOVE.L #$00010001,(A1)+ ;pnSize := (1,1)
MOVE #8,(A1)+ ;pnMode := patCopy
MOVE.L D0,(A1)+ ;pnPat := black
MOVE.L D0,(A1)+
CLR.W (A1)+ ;pnVis := 0
CLR.L (A1)+ ;txFont, txFace := 0
MOVE #1,(A1)+ ;txMode := srcOr
CLR (A1)+ ;txSize := 0
CLR.L (A1)+ ;spExtra := 0.0
MOVE.L #blackColor,(A1)+ ;fgColor := blackColor
MOVE.L #whiteColor,(A1)+ ;bkColor := whiteColor
CLR.L (A1)+ ;colrBit,patStretch := 0
CLR.L (A1)+ ;picSave := Nil
CLR.L (A1)+ ;rgnSave := Nil
CLR.L (A1)+ ;polySave := Nil
CLR.L (A1)+ ;grafProcs := Nil
MOVE.L (SP)+,(SP) ;STRIP PARAM
RTS ;AND RETURN
ClosePort PROC EXPORT
;-------------------------------------------------------------
;
; PROCEDURE ClosePort(port: GrafPtr);
;
; { just disposes of clipRgn and visRgn }
;
MOVE.L 4(SP),A0 ;GET PORT
MOVE.L CLIPRGN(A0),A0 ;GET CLIPRGN HANDLE
_DisposHandle ;DISCARD IT
MOVE.L 4(SP),A0 ;GET PORT
MOVE.L VISRGN(A0),A0 ;GET VISRGN HANDLE
_DisposHandle ;DISCARD IT
MOVE.L (SP)+,(SP) ;STRIP PARAM
RTS ;AND RETURN
SetStdProcs PROC EXPORT
;-------------------------------------------------------------
;
; PROCEDURE SetStdProcs(VAR procs: QDProcs);
;
MOVE.L (SP)+,A0 ;pop return addr
MOVE.L (SP)+,A1 ;pop addr of proc record
MOVE.L JStdText,(A1)+ ;copy piece of trap table
MOVE.L JStdLine,(A1)+ ;copy piece of trap table
MOVE.L JStdRect,(A1)+ ;copy piece of trap table
MOVE.L JStdRRect,(A1)+ ;copy piece of trap table
MOVE.L JStdOval,(A1)+ ;copy piece of trap table
MOVE.L JStdArc,(A1)+ ;copy piece of trap table
MOVE.L JStdPoly,(A1)+ ;copy piece of trap table
MOVE.L JStdRgn,(A1)+ ;copy piece of trap table
MOVE.L JStdBits,(A1)+ ;copy piece of trap table
MOVE.L JStdComment,(A1)+ ;copy piece of trap table
MOVE.L JStdTxMeas,(A1)+ ;copy piece of trap table
MOVE.L JStdGetPic,(A1)+ ;copy piece of trap table
MOVE.L JStdPutPic,(A1)+ ;copy piece of trap table
JMP (A0) ;and return
LocalToGlobal PROC EXPORT
EXPORT GlobalToLocal,AddPt,SubPt,SetPort,GetPort
;-------------------------------------------------------------
;
; PROCEDURE LocalToGlobal(VAR pt: Point);
;
; restores all registers.
;
MOVEM.L D0-D2/A0/A1,-(SP) ;SAVE REGS
MOVE.L #1,D2 ;INDICATE SUB
BRA.S SHARE
;-------------------------------------------------------------
;
; PROCEDURE GlobalToLocal(VAR pt: Point);
;
; restores all registers.
;
GlobalToLocal
MOVEM.L D0-D2/A0/A1,-(SP) ;SAVE REGS
MOVE.L #0,D2 ;INDICATE ADD
SHARE MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO QUICKDRAW GLOBALS
MOVE.L THEPORT(A0),A0 ;POINT TO CURRENT GRAFPORT
MOVE.L 24(SP),A1 ;POINT TO VAR PT
MOVE PORTBITS+BOUNDS+TOP(A0),D0 ;GET DV
MOVE PORTBITS+BOUNDS+LEFT(A0),D1 ;GET DH
BSR.S ADDSUB ;CONVERT TO LOCAL
MOVEM.L (SP)+,D0-D2/A0/A1 ;RESTORE REGS
BRA.S SHARE3 ;STRIP 4 BYTES AND RETURN
;
;
;
ADDSUB TST D2
BEQ.S JUSTADD
NEG D0
NEG D1
JUSTADD ADD D0,(A1)+
ADD D1,(A1)+
RTS
;-------------------------------------------------------------
;
; PROCEDURE AddPt(src: Point; VAR dst: Point);
; { add two points together, restores all regs }
;
AddPt MOVEM.L D0-D2/A1,-(SP) ;SAVE REGS
MOVE.L #0,D2 ;INDICATE ADD
BRA.S SHARE2
;-------------------------------------------------------------
;
; PROCEDURE SubPt(src: Point; VAR dst: Point);
; { subtract src Point from dst point, restores all regs }
;
SubPt MOVEM.L D0-D2/A1,-(SP) ;SAVE REGS
MOVE.L #1,D2 ;INDICATE SUB
SHARE2 MOVE.L 20(SP),A1 ;POINT TO DST
MOVE 24+V(SP),D0 ;GET SRC.V
MOVE 24+H(SP),D1 ;GET SRC.H
BSR.S ADDSUB
MOVEM.L (SP)+,D0-D2/A1 ;RESTORE REGS
MOVE.L (SP)+,(SP)
SHARE3 MOVE.L (SP)+,(SP)
RTS ;AND RETURN
;----------------------------------------------------------
;
; PROCEDURE SetPort(gp: GrafPtr);
; { switch the current port to a different GrafPort }
;
SetPort MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO QUICKDRAW GLOBALS
MOVE.L 4(SP),THEPORT(A0) ;INSTALL INTO THEPORT
IF hasPenFraction THEN
move.w #$8000,pnLocFixed(a0) ; reset pen fraction.
ENDIF
BRA.S SHARE3 ;STRIP 4 BYTES AND RETURN
;----------------------------------------------------------
;
; PROCEDURE GetPort(VAR gp: GrafPtr);
; { inquire the current GrafPort }
;
GetPort MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO QUICKDRAW GLOBALS
MOVE.L 4(SP),A1 ;POINT TO VAR GP
MOVE.L THEPORT(A0),(A1) ;COPY FROM THEPORT
BRA.S SHARE3 ;STRIP 4 BYTES AND RETURN
GrafDevice PROC EXPORT
IMPORT PortWord
;----------------------------------------------------------
;
; PROCEDURE GrafDevice(device: INTEGER);
;
MOVEQ #DEVICE,D0 ;PUT PORT OFFSET IN D0
JMP PORTWORD ;INSTALL PARAM INTO THEPORT
SetPortBits PROC EXPORT
EXPORT BackPat
;----------------------------------------------------------
;
; PROCEDURE SetPortBits(bm: BitMap);
; { re-direct output to a different BitMap }
;
MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO QUICKDRAW GLOBALS
MOVE.L THEPORT(A0),A0 ;GET CURRENT GRAFPORT
LEA PORTBITS(A0),A0 ;POINT TO PORTBITS
MOVE.L 4(SP),A1 ;POINT TO BITMAP
MOVE.L (A1)+,(A0)+ ;COPY BASEADDR
MOVE.W (A1)+,(A0)+ ;COPY ROWBYTES
SHARE MOVE.L (A1)+,(A0)+ ;COPY BOUNDS.TOPLEFT
MOVE.L (A1)+,(A0)+ ;COPY BOUNDS.BOTRIGHT
MOVE.L (SP)+,(SP) ;STRIP 4 BYTES
RTS ;AND RETURN
;----------------------------------------------------------
;
; PROCEDURE BackPat(pat: Pattern);
; { set the background pattern }
;
BackPat MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO QUICKDRAW GLOBALS
MOVE.L THEPORT(A0),A0 ;GET CURRENT GRAFPORT
LEA BKPAT(A0),A0 ;POINT TO BKPAT
MOVE.L 4(SP),A1 ;GET ADDR OF PATTERN
BRA.S SHARE
PortSize PROC EXPORT
;----------------------------------------------------------
;
; PROCEDURE PortSize(width,height: INTEGER);
;
MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO QUICKDRAW GLOBALS
MOVE.L THEPORT(A0),A0 ;GET CURRENT GRAFPORT
MOVE PORTRECT+LEFT(A0),D0 ;GET PORTRECT.LEFT
ADD 6(SP),D0 ;ADD WIDTH
MOVE D0,PORTRECT+RIGHT(A0) ;UPDATE PORTRECT.RIGHT
MOVE PORTRECT+TOP(A0),D0 ;GET PORTRECT.TOP
ADD 4(SP),D0 ;ADD HEIGHT
MOVE D0,PORTRECT+BOTTOM(A0) ;UPDATE PORTRECT.BOTTOM
MOVE.L (SP)+,(SP) ;STRIP 4 BYTES
RTS ;AND RETURN
MovePortTo PROC EXPORT
EXPORT SetOrigin,ClipRect
IMPORT OffsetRgn,RectRgn
;----------------------------------------------------------
;
; PROCEDURE MovePortTo(leftGlobal,topGlobal: INTEGER);
; { move portRect to a different part of the bitmap }
;
MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO QUICKDRAW GLOBALS
MOVE.L THEPORT(A0),A0 ;GET CURRENT GRAFPORT
MOVE PORTRECT+LEFT(A0),D0 ;GET PORTRECT.LEFT
SUB PORTBITS+BOUNDS+LEFT(A0),D0 ;CONVERT TO GLOBAL
SUB 6(SP),D0 ;SUB LEFTGLOBAL FOR DH
MOVE PORTRECT+TOP(A0),D1 ;GET PORTRECT.TOP
SUB PORTBITS+BOUNDS+TOP(A0),D1 ;CONVERT TO GLOBAL
SUB 4(SP),D1 ;SUB TOPGLOBAL FOR DV
MOVE.L (SP)+,(SP) ;STRIP 4 BYTES
OFSPORT LEA PORTBITS+BOUNDS(A0),A0 ;OFFSET PORTBITS.BOUNDS DH,DV
OFSRECT ADD D1,(A0)+ ;OFFSET TOP
ADD D0,(A0)+ ;OFFSET LEFT
ADD D1,(A0)+ ;OFFSET BOTTOM
ADD D0,(A0)+ ;OFFSET RIGHT
RTS ;AND RETURN
;----------------------------------------------------------
;
; PROCEDURE SetOrigin(h,v: INTEGER);
; { re-define the local coords by adjusting portBits.bounds, }
; { portRect, and visRgn }
;
SetOrigin
MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO QUICKDRAW GLOBALS
MOVE.L THEPORT(A0),A0 ;GET CURRENT GRAFPORT
MOVE.L 4(SP),D0 ;GET V AND H BOTH
CMP.L PORTRECT+TOPLEFT(A0),D0 ;SAME AS ALREADY IN THEPORT ?
BEQ.S DONE ;YES, QUIT
MOVE 6(SP),D0 ;GET H
SUB PORTRECT+LEFT(A0),D0 ;DH:=H-PORTRECT.LEFT
MOVE 4(SP),D1 ;GET V
SUB PORTRECT+TOP(A0),D1 ;DV:=V-PORTRECT.TOP
MOVE.L VISRGN(A0),-(SP) ;PUSH PARMS FOR LATER
MOVE D0,-(SP)
MOVE D1,-(SP)
BSR.S OFSPORT ;OFFSET PORTBITS.BOUNDS
LEA PORTRECT-PORTBITS-BOUNDS-8(A0),A0 ;POINT A0 AT PORTRECT
BSR.S OFSRECT ;OFFSET PORTRECT
JSR OFFSETRGN
DONE MOVE.L (SP)+,(SP) ;STRIP 4 BYTES
RTS ;AND RETURN
;----------------------------------------------------------
;
; PROCEDURE ClipRect(r: Rect);
; { Make the current grafport's clipRgn match a given rectangle }
;
ClipRect
MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO QUICKDRAW GLOBALS
MOVE.L THEPORT(A0),A0 ;GET CURRENT GRAFPORT
MOVE.L CLIPRGN(A0),-(SP) ;PUSH CLIPRGN
MOVE.L 8(SP),-(SP) ;PUCH ADDR OF RECT
JSR RECTRGN
BRA.S DONE
SetClip PROC EXPORT
EXPORT GetClip
IMPORT CopyRgn
;----------------------------------------------------------
;
; PROCEDURE SetClip(rgn: RgnHandle);
;
; copy rgn into theport^.clipRgn
;
MOVE.L (SP)+,A0 ;POP RETURN ADDR
MOVE.L GRAFGLOBALS(A5),A1 ;POINT TO QUICKDRAW GLOBALS
MOVE.L THEPORT(A1),A1 ;GET CURRENT GRAFPORT
MOVE.L CLIPRGN(A1),-(SP) ;PUSH THEPORT^.CLIPRGN
BRA.S SHARE
;----------------------------------------------------------
;
; PROCEDURE GetClip(rgn: RgnHandle);
;
; copy from theport^.clipRgn into rgn.
;
GetClip
MOVE.L (SP)+,A0 ;POP RETURN ADDR
MOVE.L (SP)+,D0 ;POP RGN HANDLE
MOVE.L GRAFGLOBALS(A5),A1 ;POINT TO QUICKDRAW GLOBALS
MOVE.L THEPORT(A1),A1 ;GET CURRENT GRAFPORT
MOVE.L CLIPRGN(A1),-(SP) ;PUSH THEPORT^.CLIPRGN
MOVE.L D0,-(SP) ;PUSH RGN
SHARE MOVE.L A0,-(SP) ;RESTORE RETURN ADDR
JMP COPYRGN ;AND GO TO COPYRGN
SetPt PROC EXPORT
;-------------------------------------------------------------
;
; PROCEDURE SetPt(VAR pt: Point; h,v: INTEGER);
;
MOVE.L (SP)+,A0 ;POP RETURN ADDR
MOVE.L (SP)+,D0 ;POP H,V
MOVE.L (SP)+,A1 ;POP VAR ADDR OF PT
MOVE.L D0,(A1) ;STORE H,V INTO PT
JMP (A0) ;RETURN
EqualPt FUNC EXPORT
;----------------------------------------------------------
;
; FUNCTION EqualPt(pt1,pt2: Point): BOOLEAN;
;
; CLOBBERS D0,A0.
;
MOVE.L (SP)+,A0 ;POP RETURN ADDR
MOVE.L (SP)+,D0 ;pop point1
CMP.L (SP)+,D0 ;is point2 = point1 ?
SEQ (SP) ;IF YES, SET TO TRUE
NEG.B (SP) ;CONVERT -1 TO 1
JMP (A0) ;RETURN
END