/
dda_s.s
180 lines (156 loc) · 4.25 KB
/
dda_s.s
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
#include "config.h"
;; 6502 Assembly routine for Digital Differential Analyzer Algorithm
;;
;; Author : Jean-Baptiste PERIN
;; Date : 2021
#ifndef USE_C_DDA
.zero
;; void (*ddaStepFunction)();
_ddaStepFunction .dsb 2
;; unsigned char ddaNbVal;
_ddaNbVal .dsb 1
;; unsigned char ddaNbStep;
_ddaNbStep .dsb 1
;; unsigned char ddaStartValue;
_ddaStartValue .dsb 1
;; unsigned char ddaCurrentValue;
_ddaCurrentValue .dsb 1
;; unsigned char ddaEndValue;
_ddaEndValue .dsb 1
;; signed char ddaCurrentError;
_ddaCurrentError .dsb 1
.text
; void ddaStep0(){
; ddaCurrentValue += 1;
; }
_ddaStep0
.(
inc _ddaCurrentValue
.)
rts
; void ddaStep1(){
; while ((ddaCurrentError<<1) >= ddaNbStep) {
; ddaCurrentError -= ddaNbStep;
; ddaCurrentValue += 1;
; }
; ddaCurrentError += ddaNbVal;
; }
_ddaStep1
.(
; while ((ddaCurrentError<<1) >= ddaNbStep) {
loop
lda _ddaCurrentError
bmi end_loop
asl
cmp _ddaNbStep
bcc end_loop
lda _ddaCurrentError
sec ;; FIXME : this sec is useless
sbc _ddaNbStep
sta _ddaCurrentError
inc _ddaCurrentValue
jmp loop
end_loop
lda _ddaCurrentError
clc
adc _ddaNbVal
sta _ddaCurrentError
.)
rts
; void ddaStep2(){
; ddaCurrentError -= ddaNbVal;
; if ((ddaCurrentError<<1) < ddaNbStep) {
; ddaCurrentError += ddaNbStep;
; ddaCurrentValue += 1;
; }
; }
_ddaStep2
.(
; ddaCurrentError -= ddaNbVal;
lda _ddaCurrentError
sec
sbc _ddaNbVal
sta _ddaCurrentError
; if ((ddaCurrentError<<1) < ddaNbStep) {
bmi updateError
asl
cmp _ddaNbStep
bcc updateError
rts
updateError
; ddaCurrentError += ddaNbStep;
lda _ddaCurrentError
clc
adc _ddaNbStep
sta _ddaCurrentError
; ddaCurrentValue += 1;
inc _ddaCurrentValue
; }
.)
rts
; void ddaInit(){
; ddaCurrentValue = ddaStartValue;
; ddaEndValue = ddaStartValue + ddaNbVal;
;
; if (ddaNbVal > ddaNbStep) {
; ddaCurrentError = ddaNbVal;
; ddaStepFunction = &ddaStep1;
; } else if (ddaNbVal < ddaNbStep) {
; ddaCurrentError = ddaNbStep;
; ddaStepFunction = &ddaStep2;
; } else {
; ddaCurrentError = ddaEndValue;
; ddaStepFunction = &ddaStep0;
; }
; }
_ddaInit
.(
; ddaCurrentValue = ddaStartValue;
lda _ddaStartValue
sta _ddaCurrentValue
; ddaEndValue = ddaStartValue + ddaNbVal;
lda _ddaNbVal
clc
adc _ddaStartValue
sta _ddaEndValue
;
; if (ddaNbVal > ddaNbStep) {
lda _ddaNbStep
cmp _ddaNbVal
beq NbStepEqualsNbVal
bcs NbStepGreaterThanNbVal
; ddaCurrentError = ddaNbVal;
lda _ddaNbVal
sta _ddaCurrentError
; ddaStepFunction = &ddaStep1;
lda #<(_ddaStep1)
sta _ddaStepFunction
lda #>(_ddaStep1)
sta _ddaStepFunction+1
jmp ddaInitDone
; } else if (ddaNbVal < ddaNbStep) {
NbStepGreaterThanNbVal
; ddaCurrentError = ddaNbStep;
lda _ddaNbStep
sta _ddaCurrentError
; ddaStepFunction = &ddaStep2;
lda #<(_ddaStep2)
sta _ddaStepFunction
lda #>(_ddaStep2)
sta _ddaStepFunction+1
jmp ddaInitDone
; } else {
NbStepEqualsNbVal
; ddaCurrentError = ddaEndValue;
lda _ddaEndValue
sta _ddaCurrentError
; ddaStepFunction = &ddaStep0;
lda #<(_ddaStep0)
sta _ddaStepFunction
lda #>(_ddaStep0)
sta _ddaStepFunction+1
; }
ddaInitDone
.)
rts
#endif // USE_C_DDA