This repository has been archived by the owner on Nov 29, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Arcs.a
164 lines (138 loc) · 6.31 KB
/
Arcs.a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
.INCLUDE GRAFTYPES.TEXT
;-----------------------------------------------------------
;
;
; * ***** *** ***
; * * * * * * * *
; * * * * * *
; * * ***** * ***
; ***** * * * *
; * * * * * * * *
; * * * * *** ***
;
; Procedures for drawing Arcs:
;
.PROC StdArc,4
.REF CheckPic,PutPicVerb,PutPicWord,PutPicRect
.REF PushVerb,DrawArc
;---------------------------------------------------------------
;
; PROCEDURE StdArc(verb: GrafVerb; r: Rect; startAngle,arcAngle: INTEGER);
;
; A6 OFFSETS OF PARAMS AFTER LINK:
;
PARAMSIZE .EQU 10
VERB .EQU PARAMSIZE+8-2 ;GRAFVERB
RECT .EQU VERB-4 ;LONG, ADDR OF RECT
STARTANG .EQU RECT-2 ;WORD
ARCANG .EQU STARTANG-2 ;WORD
OVWD .EQU -2 ;WORD
OVHT .EQU OVWD-2 ;WORD
VARSIZE .EQU OVHT ;TOTAL BYTES OF LOCALS
LINK A6,#VARSIZE ;ALLOCATE STACK FRAME
MOVEM.L D4/D7/A3-A4,-(SP) ;SAVE REGS
MOVE.B VERB(A6),D7 ;GET VERB
JSR CHECKPIC ;SET UP A4,A3 AND CHECK PICSAVE
BLE.S NOTPIC ;BRANCH IF NOT PICSAVE
MOVE.B D7,-(SP)
JSR PutPicVerb ;PUT ADDIONAL PARAMS TO THEPIC
MOVEQ #$60,D0 ;PUT ARCNOUN IN HI NIBBLE
ADD D7,D0 ;PUT VERB IN LO NIBBLE
MOVE.B D0,-(SP) ;PUSH OPCODE
MOVE.L RECT(A6),-(SP) ;PUSH ADDR OF RECT
JSR PutPicRect ;PUT OPCODE AND RECTANGLE
MOVE STARTANG(A6),-(SP)
JSR PutPicWord ;PUT STARTANGLE
MOVE ARCANG(A6),-(SP)
JSR PutPicWord ;PUT ARCANGLE
NOTPIC MOVE.L RECT(A6),A0 ;POINT TO RECT
MOVE RIGHT(A0),D0
SUB LEFT(A0),D0
MOVE D0,OVWD(A6) ;OVWD := R.RIGHT - R.LEFT
MOVE BOTTOM(A0),D0
SUB TOP(A0),D0
MOVE D0,OVHT(A6) ;OVHT := R.BOTTOM - R.TOP
MOVE.L A0,-(SP) ;PUSH ADDR OF RECT
CLR.B -(SP) ;PUSH HOLLOW = FALSE
TST.B D7 ;IS VERB FRAME ?
BNE.S DOIT ;NO, CONTINUE
;
; Currently, FrameArc does not put inversion points to theRgn.
; If this changes, add test and call to PutArc here.
;
MOVE.B #1,(SP) ;REPLACE, PUSH HOLLOW = TRUE
DOIT MOVE.L OVHT(A6),-(SP) ;PUSH OVWD,OVHT
JSR PushVerb ;PUSH MODE AND PATTERN
MOVE STARTANG(A6),-(SP) ;PUSH STARTANGLE
MOVE ARCANG(A6),-(SP) ;PUSH ARCANGLE
; DrawArc(r,hollow,ovWd,ovHt,mode,pat,startAng,arcAng);
JSR DrawArc
MOVEM.L (SP)+,D4/D7/A3-A4 ;RESTORE REGS
UNLINK PARAMSIZE,'STDARC '
.PROC FrameArc,3
.DEF CallArc,PaintArc,EraseArc,InvertArc,FillArc
.REF STDARC
;-----------------------------------------------------
;
; PROCEDURE FrameArc(* r: Rect; startAngle,arcAngle: INTEGER *);
;
MOVEQ #FRAME,D0 ;VERB = FRAME
BRA.S CallArc ;SHARE COMMON CODE
;-----------------------------------------------------
;
; PROCEDURE PaintArc(* r: Rect; startAngle,arcAngle: INTEGER *);
;
PaintArc
MOVEQ #PAINT,D0 ;VERB = PAINT
BRA.S CallArc ;SHARE COMMON CODE
;--------------------------------------------------------
;
; PROCEDURE EraseArc(* r: Rect; startAngle,arcAngle: INTEGER *);
;
EraseArc
MOVEQ #ERASE,D0 ;VERB = ERASE
BRA.S CallArc ;SHARE COMMON CODE
;--------------------------------------------------------
;
; PROCEDURE InvertArc(* r: Rect; startAngle,arcAngle: INTEGER *);
;
InvertArc
MOVEQ #INVERT,D0 ;VERB = INVERT
BRA.S CallArc ;SHARE COMMON CODE
;--------------------------------------------------------
;
; PROCEDURE FillArc(* r: Rect; startAngle,arcAngle: INTEGER; pat: Pattern *);
;
FillArc MOVE.L (SP)+,A0 ;POP RETURN ADDR
MOVE.L (SP)+,A1 ;POP ADDR OF PATTERN
MOVE.L A0,-(SP) ;PUT RETURN ADDR BACK
MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO LISAGRAF GLOBALS
MOVE.L THEPORT(A0),A0 ;GET CURRENT GRAFPORT
LEA FILLPAT(A0),A0 ;POINT TO FILLPAT
MOVE.L (A1)+,(A0)+ ;COPY PAT INTO FILLPAT
MOVE.L (A1)+,(A0)+ ;ALL EIGHT BYTES
MOVEQ #FILL,D0 ;VERB = FILL
BRA.S CallArc ;SHARE COMMON CODE
;---------------------------------------------------------------
;
; PROCEDURE CallArc(r: Rect; startAngle,arcAngle: INTEGER);
;
; code shared by FrameArc, PaintArc, EraseArc, InvertArc, and FillArc.
; enter with verb in D0.
;
CallArc MOVE.L (SP)+,A0 ;POP RETURN ADDR
MOVE.L (SP)+,D1 ;POP BOTH ANGLES
MOVE.L (SP)+,A1 ;POP ADDR OF RECT
MOVE.B D0,-(SP) ;PUSH VERB
MOVE.L A1,-(SP) ;PUSH ADDR OF RECT
MOVE.L D1,-(SP) ;PUSH BOTH ANGLES
MOVE.L A0,-(SP) ;PUSH RETURN ADDR
MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO LISAGRAF GLOBALS
MOVE.L THEPORT(A0),A0 ;GET CURRENT GRAFPORT
MOVE.L GRAFPROCS(A0),D0 ;IS GRAFPROCS NIL ?
LEA STDARC,A0
BEQ.S USESTD ;YES, USE STD PROC
MOVE.L D0,A0
MOVE.L ARCPROC(A0),A0 ;NO, GET PROC PTR
USESTD JMP (A0) ;GO TO IT
.END