-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathincDRAWCommand.asm
320 lines (264 loc) · 6.09 KB
/
incDRAWCommand.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
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
;*******************************************************************************
;* DRAW Command *
;* This BASIC function put a line on a Hi-Res Screen *
;* *****************************************************************************
;* Syntax : DRAW or d Shifted R *
;* Inputs : X1 (0->319) and Y1 (0 ->199) *
;* : X2 (0->319) and Y2 (0 ->199) *
;*******************************************************************************
; draw : draw x1,y1 to x2,y2
COM_DRAW
jsr GetNo2 ; Get X1
sta COMM_X1LO
sty COMM_X1HI
jsr bas_CHKCOM$ ; Checks For a Comma
jsr bas_GETBYTC$; Get Y1
stx COMM_Y1
lda #164
jsr bas_SYNCHR$ ; Check For the BASIC Command 'TO'
jsr GetNo2 ; Get X2
sta COMM_X2LO
sty COMM_X2HI
jsr bas_CHKCOM$ ; Checks For a Comma
jsr bas_GETBYTC$; Get Y2
stx COMM_Y2
DRAW_LINE_START
Draw_Eval_X
lda COMM_X1HI
cmp COMM_X2HI ; Compare Hi Byte of X1 and X2
beq @InXHi ; X1Hi = X2Hi
bcs @X1GTX2 ; X1Hi > X2Hi
bcc @X1LTX2 ; X1Hi < X2Hi
@InXHi
lda COMM_X1LO
cmp COMM_X2LO ; Compare Lo Byte of X1 and X2
bcc @X1LTX2 ; X1Lo < X2Lo
@X1GTX2 ; X1 > X2
sec
lda COMM_X1LO
sbc COMM_X2LO
sta COMM_XDLO ; Difference of X Lo byte
lda COMM_X1HI
sbc COMM_X2HI
sta COMM_XDHI ; Difference of X Hi byte
; lda #$38 ; SEC Instruction
; ldx #$e5 ; SBC ZeroPage Instruction
; jsr PREPAREXCALC; Alters X Draw Routine to "SUBTRACT"
lda DrawingExecutionDriver
and #%00000101
ora #%00001010
sta DrawingExecutionDriver
jmp DRAW_EVAL_Y
@X1LTX2 ; X1 < X2
sec
lda COMM_X2LO
sbc COMM_X1LO
sta COMM_XDLO ; Difference of X Lo byte
lda COMM_X2HI
sbc COMM_X1HI
sta COMM_XDHI ; Difference of X Hi byte
; lda #$18 ; CLC Instruction
; ldx #$65 ; ADC ZeroPage Instruction
; jsr PREPAREXCALC; Alters X Draw Routine to "ADD"
lda DrawingExecutionDriver
and #%00000101
sta DrawingExecutionDriver
DRAW_EVAL_Y
lda COMM_Y1
cmp COMM_Y2 ; Compare Y1 and Y2
bcc @Y1LTY2 ; Y1 < Y2
sec ; Y1 >= Y2
lda COMM_Y1
sbc COMM_Y2
sta COMM_YD ; Difference of Y
; lda #$38 ; SEC Instruction
; ldx #$e5 ; SBC ZeroPage Instruction
; jsr PREPAREYCALC; Alters Y Draw Routine to "SUBTRACT"
lda DrawingExecutionDriver
and #%00001010
ora #%00000101
sta DrawingExecutionDriver
jmp DRAW_DeltaCalc
@Y1LTY2 ; Y1 < Y2
sec
lda COMM_Y2
sbc COMM_Y1
sta COMM_YD ; Difference of Y
; lda #$18 ; CLC Instruction
; ldx #$65 ; ADC ZeroPage Instruction
; jsr PREPAREYCALC; Alters Y Draw Routine to "ADD"
lda DrawingExecutionDriver
and #%00001010
sta DrawingExecutionDriver
DRAW_DeltaCalc
lda COMM_XDHI
cmp #1
beq DRAW_ALONG_XAXIS; Is XDelta = 1 as Y will never be :(
lda COMM_XDLO ; XDelta <> 1
cmp COMM_YD
bcs DRAW_ALONG_XAXIS; X Delta >= Y Delta
jmp DRAW_ALONG_YAXIS; X Delta < Y Delta
DRAW_ALONG_XAXIS
lda COMM_XDLo
sta Divisor
lda COMM_XDHI
sta Divisor + 1
lda COMM_YD
sta Number
lda #0
sta Number + 1
jsr Divide16Bit
lda #$00
sta COMM_XXLO ; XLine Lo byte
sta COMM_XXHI ; XLine Hi Byte
sta COMM_YLFRAC
sta COMM_XLFRAC
lda COMM_Y1
sta COMM_YL
lda COMM_X1LO
sta COMM_XLLO
lda COMM_X1HI
sta COMM_XLHI
DRAW_XAXIS_LOOP
lda DrawingExecutionDriver
and #%00000001
bne WORKOUT_YONX_SUB
; WORKOUT_YONX_ADD
clc
lda COMM_YLFRAC
adc ResultFrac
sta COMM_YLFRAC
lda COMM_YL
adc Result
sta COMM_YL
jmp WORKOUT_XONX
WORKOUT_YONX_SUB
sec
lda COMM_YLFRAC
sbc ResultFrac
sta COMM_YLFRAC
lda COMM_YL
sbc Result
sta COMM_YL
WORKOUT_XONX
lda DrawingExecutionDriver
and #%00000010
bne WORKOUT_XONX_SUB
;WORKOUT_XONX_ADD
lda COMM_XLLO
clc
adc #1
sta COMM_XLLO
bcc @SkipIncAdd
inc COMM_XLHI
@SkipIncAdd
jmp DRAW_WORKOUT_Y_FROM_AXISX
WORKOUT_XONX_SUB
lda COMM_XLLO
sec
sbc #1
sta COMM_XLLO
bcs @SkipIncAdd
dec COMM_XLHI
@SkipIncAdd
DRAW_WORKOUT_Y_FROM_AXISX
lda COMM_YL
sta COMM_Y
lda COMM_XLLO
sta COMM_XLO
lda COMM_XLHI
sta COMM_XHI
jsr Place
jsr Dot
inc COMM_XXLO
bne @ByPassInc
inc COMM_XXHI
@ByPassInc
lda COMM_XXHI
cmp COMM_XDHI
bne DRAW_XAXIS_LOOP
lda COMM_XXLO
cmp COMM_XDLO
bcs @Exit
jmp DRAW_XAXIS_LOOP
@Exit
rts
DRAW_ALONG_YAXIS
lda COMM_YD
sta Divisor
lda #0
sta Divisor + 1
sta COMM_YLFRAC
sta COMM_XLFRAC
lda COMM_XDLo
sta Number
lda COMM_XDHI
sta Number + 1
jsr Divide16Bit
lda #$00
sta COMM_YY
lda COMM_Y1
sta COMM_YL
lda COMM_X1LO
sta COMM_XLLO
lda COMM_X1HI
sta COMM_XLHI
DRAW_YAXIS_LOOP
lda DrawingExecutionDriver
and #%00000100
bne WORKOUT_YONY_SUB
; WORKOUT_YONY_ADD
clc
lda COMM_YL
adc #1
sta COMM_YL
jmp WORKOUT_XONY
WORKOUT_YONY_SUB
sec
lda COMM_YL
sbc #1
sta COMM_YL
WORKOUT_XONY
lda DrawingExecutionDriver
and #%00001000
bne WORKOUT_XONY_SUB
;WORKOUT_XONY_ADD
clc
lda COMM_XLFRAC
adc ResultFrac
sta COMM_XLFRAC
lda COMM_XLLO
adc Result
sta COMM_XLLO
lda COMM_XLHI
adc ResultHi
sta COMM_XLHI
jmp DRAW_WORKOUT_X_FROM_AXISY
WORKOUT_XONY_SUB
sec
lda COMM_XLFRAC
sbc ResultFrac
sta COMM_XLFRAC
lda COMM_XLLO
sbc Result
sta COMM_XLLO
lda COMM_XLHI
sbc ResultHi
sta COMM_XLHI
DRAW_WORKOUT_X_FROM_AXISY
lda COMM_YL
sta COMM_Y
lda COMM_XLLO
sta COMM_XLO
lda COMM_XLHI
sta COMM_XHI
jsr Place
jsr Dot
inc COMM_YY
@ByPassInc
lda COMM_YY
cmp COMM_YD
beq @Exit
jmp DRAW_YAXIS_LOOP
@Exit
rts