-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathread_touch.oph
182 lines (138 loc) · 3.04 KB
/
read_touch.oph
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
; Copyright (C) 2017 David Boddie <[email protected]>
;
; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program. If not, see <http://www.gnu.org/licenses/>.
.org $1900
.alias in_data $70
.alias index $71
.alias buffer $72
lda #50
sta $73
delay:
lda #19
jsr $fff4
dec $73
bne delay
lda #0
sta in_data
lda #0
sta index ; number of bytes received
jsr setup_interrupt_routine
lda #22
jsr $ffee
lda #4 ; MODE 4
jsr $ffee
lda #23 ; disable flashing cursor
jsr $ffee
lda #1
jsr $ffee
ldx #7
cursor_loop:
lda #0
jsr $ffee
dex
bpl cursor_loop
lda #0
sta $fe06
lda #$e0 ; MODE 4, cassette motor on, cassette input
sta $fe07
lda #$5c ; high tone detect, RX Full, RTC, vsync
sta $fe00
loop:
lda #121
ldx #0
jsr $fff4
cpx #112
bne read_values
lda #12
jsr $ffee
read_values:
lda index
cmp #6
bne loop ; loop until all six values have been received
lda #0
sta index ; reset the counter
lda $72
cmp #25 ; is this a plot command?
beq plot
lda #0
sta in_data ; abort data reading
beq loop
plot:
jsr $ffee
lda $73
jsr $ffee
lda $74
jsr $ffee
lda $75
jsr $ffee
lda $76
jsr $ffee
lda $77
jsr $ffee
jmp loop
rts
setup_interrupt_routine:
sei ; disable interrupts
lda $204
sta original_irq1v_low
lda $205
sta original_irq1v_high
lda #<interrupt_routine
sta $204
lda #>interrupt_routine
sta $205
cli ; enable interrupts
rts
interrupt_routine:
php
pha
txa
pha
tya
pha
lda $fe00
tax
and #$40
beq check_rx_interrupt
; Handle the high tone detect interrupt.
lda #$40 ; clear the high tone interrupt
sta $fe05
lda #0
sta index ; reset the byte counter
ldy #1
sty in_data
bne interrupt_routine_exit ; unconditional exit due to ldy flags
check_rx_interrupt:
txa
and #$10
beq interrupt_routine_exit
; Handle the RX Full interrupt.
lda $fe04 ; retrieve a byte from the shift register
ldy in_data
beq interrupt_routine_exit ; if not reading data then exit
set_received_flag:
ldx index
sta $72,x ; store the byte in the input buffer
inc index
interrupt_routine_exit:
pla
tay
pla
tax
pla
plp
jmp (original_irq1v)
original_irq1v:
original_irq1v_low: .byte 0
original_irq1v_high: .byte 0