-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathincCIRCLECommand.asm
223 lines (187 loc) · 4.79 KB
/
incCIRCLECommand.asm
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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
;*******************************************************************************
;* CIRCLE Command *
;* This BASIC function to draw a circle on the screen *
;* *****************************************************************************
;* Syntax : CIRCLE or c Shifted I *
;* Inputs : X (0->319) and Y (0 ->199) *
;* : XRad (0->310) and YRad (0->199) *
;* : Start Angle (In Degrees) and the Finish Angle (In Degrees) *
;*******************************************************************************
; circle : circle x, y, xrad, yrad, start, finish
COM_CIRCLE
jsr GetNo2 ; Get X
sta COMM_RXLO
sty COMM_RXHI
jsr bas_CHKCOM$ ; Checks For a Comma
jsr bas_GETBYTC$; Get Y
stx COMM_RY
jsr bas_CHKCOM$ ; Checks For a Comma
jsr GetNo2 ; Get XRad
sta COMM_XRLO
sty COMM_XRHI
jsr bas_CHKCOM$ ; Checks For a Comma
jsr bas_GETBYTC$; Get YRad
stx COMM_YR
jsr bas_CHKCOM$ ; Checks For a Comma
jsr GetNo2 ; Get Start Angle (In Degrees 0->360)
jsr RadianConverter ;(RADCON)
jsr WORKOUT_X_COSINE
sta COMM_AXLO
stx COMM_AXHI
jsr WORKOUT_Y_SINE
sty COMM_AY
jsr bas_CHKCOM$ ; Checks For a Comma
jsr GetNo2 ; Get Start Angle (In Degrees 0->360)
jsr RadianConverter
ldx #<COMM_FINISH
ldy #>COMM_FINISH
jsr bas_MOVEFP1M$
ldy #>INCREAMENT
lda #<INCREAMENT
jsr bas_MOVEMFP1$
ldx #<COMM_INCR
ldy #>COMM_INCR
jsr bas_MOVEFP1M$
jsr CIRCLE_CALC_NEXT_DEGREE_POINT ;(Circle5)
jmp CIRCLE_START_DRAWING ; (Circle1)
INCREAMENT
word $4c7d
word $cccc
byte $cd
RADIAN
word $6586
word $e02e
byte $d4
RadianConverter
lda $15
ldy $14
jsr bas_GIVAYF$
jsr bas_MOVEFP1FP2$
ldy #>RADIAN
lda #<RADIAN
jsr bas_MOVEMFP1$
lda $66
eor $6E
sta $6F
lda $61
jmp bas_FPDIV$ ; FP1 = FP2 (Angle in Degrees) / RADIAN Conversion
CIRCLE_START_DRAWING
jsr WORKOUT_X_COSINE
sta COMM_XLO
stx COMM_XHI
jsr WORKOUT_Y_SINE
sty COMM_Y
lda COMM_XHI
cmp #1
bcc CheckYAxis
beq @CheckingXLo
bcs CIRCLE_OUT_OF_BOUNDS
@CheckingXLo
lda COMM_XLO
cmp #64
bcs CIRCLE_OUT_OF_BOUNDS
CheckYAxis
lda COMM_Y
cmp #201
bcs CIRCLE_OUT_OF_BOUNDS
bcc CIRCLE_DRAW_LINE
CIRCLE_OUT_OF_BOUNDS
jmp CIRCLE_SWAP_NEWPOINT_TO_OLD
CIRCLE_DRAW_LINE
lda COMM_XHI
sta COMM_X2HI
sta COMM_CXHI
lda COMM_XLO
sta COMM_X2LO
sta COMM_CXLO
lda COMM_Y
sta COMM_Y2
sta COMM_CY
;jsr PLACE ; Works out the memory location to change
;jsr DOT ; Sets the bit location odf the memory location
lda COMM_AXLO
sta COMM_X1LO
lda COMM_AXHI
sta COMM_X1HI
lda COMM_AY
sta COMM_Y1
jsr DRAW_LINE_START
CIRCLE_SWAP_NEWPOINT_TO_OLD
lda COMM_CXLO
sta COMM_AXLO
lda COMM_CXHI
sta COMM_AXHI
lda COMM_CY
sta COMM_AY
jsr CIRCLE_CALC_NEXT_DEGREE_POINT ; Circle5
lda #<COMM_FINISH
ldy #>COMM_FINISH
jsr bas_FCOMP$ ; Compare FP1 to Memory
cmp #1
beq CIRCLE_FINISH_DRAWING
jmp CIRCLE_START_DRAWING
CIRCLE_FINISH_DRAWING
rts
CIRCLE_MULTIPLY_FP1_BY_INTEGER
sty COMM_XXLO
sta COMM_XXHI
jsr bas_MOVEFP1FP2$ ; Move FP1 -> FP2
lda COMM_XXHI
ldy COMM_XXLO
jsr bas_GIVAYF$ ; Convert Int (A+Y) to FP1
lda $66
eor $6E
sta $6f
lda $61
jsr bas_FMULTT$ ; FP1 = FP1 * FP2
jmp bas_FACINX$ ; Converts FP1 -> Integer $14 $15
CIRCLE_CALC_NEXT_DEGREE_POINT
lda #<COMM_START
ldy #>COMM_START
jsr bas_CONUPK$ ; Move Memory -> FP2
lda #<COMM_INCR
ldy #>COMM_INCR
jsr bas_MOVEMFP1$ ; Move Memory to FP1
lda $66
eor $6E
sta $6f
lda $61
jsr bas_FADDT$ ; FP1 = FP1 + FP2
ldx #<COMM_START
ldy #>COMM_START
jmp bas_MOVEFP1M$ ; move FP1 -> Memory
WORKOUT_X_COSINE
; Return : Acc = Lo Byte X Coord
; : X = Hi Byte X Coord
ldx #<COMM_START
ldy #>COMM_START
jsr bas_MOVEFP1M$
jsr os_COS$
ldy COMM_XRLO
lda COMM_XRHI
jsr CIRCLE_MULTIPLY_FP1_BY_INTEGER ; Calculate the X Value for Plotting
clc
lda $65
adc COMM_RXLO
;sta COMM_AXLO
pha
lda $64
adc COMM_RXHI
;sta COMM_AXHI
tax
pla
rts
WORKOUT_Y_SINE
; Return : Y = Y Coord
lda #<COMM_START
ldy #>COMM_START
jsr bas_MOVEMFP1$
jsr os_SIN$
lda #0
ldy COMM_YR
jsr CIRCLE_MULTIPLY_FP1_BY_INTEGER
lda $65
clc
adc COMM_RY
tay
rts