-
Notifications
You must be signed in to change notification settings - Fork 0
/
osc-demo-2.asm
267 lines (223 loc) · 3.66 KB
/
osc-demo-2.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
.cr 6809
.tf osc-demo-2.bin,BIN
.lf osc-demo-2.lst
;
.in monoboard9.inc ; system stuff
;
.sm RAM
.or $0000
; vars and temps here
xPos .bs 1
hasCursor .bs 1
hasAxis .bs 1
waveForm .bs $FF
;
.sm CODE
.or $E000
.bs $1000, $FF
;
;
irqHandler
; confirm irq reading stat
lda ACIA+STATR
; get char from RX
lda ACIA+RDR
sta ACIA+RDR ; do echo
;
; change settings according to given letter
cmpa #'z'
beq moveXleft
cmpa #'x'
beq moveXright
cmpa #'c'
beq toggleCursor
cmpa #'a'
beq toggleAxis
rti
moveXright:
inc xPos
inc xPos
inc xPos
inc xPos
rti
moveXleft:
dec xPos
dec xPos
dec xPos
dec xPos
rti
toggleCursor:
lda hasCursor
beq .setCurOn
lda #0
sta hasCursor
rti
.setCurOn
lda #1
sta hasCursor
rti
toggleAxis:
lda hasAxis
beq .setAxisOn
lda #0
sta hasAxis
rti
.setAxisOn
lda #1
sta hasAxis
rti
processWave:
ldb #0
lda #0
sta TIMEBASE
.restore:
; do wave
lda ,x+
sta SAMPLEOUT
; do timebase
inc TIMEBASE
incb
bne .restore
rts
;-----------------
processScale:
; return if disabled
lda hasAxis
beq .processScaleEnd
lda #0
sta VIA1+ORB
lda #0
sta VIA1+ORA
ldx #0
.axis: ; one tick
lda #$85
sta VIA1+ORA
.tick:
dec VIA1+ORA
lda VIA1+IRA
cmpa #$75
bne .tick
; continue with X axis
lda VIA1+IRB
adda #$10
sta VIA1+ORB
bne .axis
.processScaleEnd:
rts
processCursor:
; return if disabled
lda hasCursor
beq .processCursorEnd
; set cursor pos
lda xPos
sta VIA1+ORB
; tick
lda #$FF
sta VIA1+ORA
.vertline:
dec VIA1+ORA
lda VIA1+IRA
bne .vertline
; get sample @ cursor
ldb xPos
ldx #waveForm
abx
lda ,x ; has wave[xpos] :)
sta VIA1+ORA ; draw horizontal
; tick
lda #$FF
sta VIA1+ORB
.horizline:
dec VIA1+ORB
lda VIA1+IRB
bne .horizline
.processCursorEnd:
rts
smallDel:
pshu b
ldb #10
.smallDel
decb
bne .smallDel
pulu b
rts
;**********************************************
main:
lds #SYSTEM_STACK
ldu #USER_STACK
; text send
; ACIA init
; 9600,8,N,1
; soft reset
sta ACIA+PRESET
lda #$09
sta ACIA+CMDREG
lda #$1E
sta ACIA+CTLREG
;
; via-2 init
lda #$0
; PA,PB setup - all in
sta VIA2+DDRA
sta VIA2+DDRB
;
; via-1 init
lda #$ff
; PA,PB setup - all out
sta VIA1+DDRA
sta VIA1+DDRB
; init cursors, grid
lda #$80 ; 1/2 of screen
sta xPos
lda #0
; no cursor
sta hasCursor
; no axis
sta hasAxis
cli
TIMEBASE .eq VIA1+ORB
SAMPLEIN .eq VIA2+IRB
SAMPLEOUT .eq VIA1+ORA
trigLevel .eq $80
trigHeight .eq $10
lda #1
sta hasAxis
sta hasCursor
.triggerWait:
; dummy move beam to save
neg SAMPLEOUT ; the osc lamp
lda SAMPLEIN ; get sample
cmpa #trigLevel
bmi .triggerWait ; wait if < trig
; first sample > trig
jsr smallDel ; let wave rise a bit
lda SAMPLEIN ; get next sample
cmpa #trigLevel+trigHeight
bpl .waveInSync ; if > trig+heigh - wav is rising
jmp .triggerWait
.waveInSync
; triggered - save samples
ldx #waveForm
.scan:
lda SAMPLEIN
sta ,x+
cmpx #waveForm+$FF
bne .scan
; play stuff on the screen
; like DSO :))))))
ldx #waveForm
jsr processWave
jsr processScale
jsr processCursor
jmp .triggerWait
; system jump table, must be in this particular order
>DEF_SYS_JUMP RESERVED, UNDEFINED
>DEF_SYS_JUMP SWI3____, UNDEFINED
>DEF_SYS_JUMP SWI2____, UNDEFINED
>DEF_SYS_JUMP FIRQ____, UNDEFINED
>DEF_SYS_JUMP IRQ_____, irqHandler
>DEF_SYS_JUMP SWI_____, UNDEFINED
>DEF_SYS_JUMP NMI_____, UNDEFINED
>DEF_SYS_JUMP RESET___, main
;
; :-)