-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathterminal.oph
200 lines (143 loc) · 3.72 KB
/
terminal.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
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
; 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 key $70
.alias sent $71
.alias in_data $72
.alias receiving $73
.alias buffer $80
.alias high_tone_bit $40
.alias tx_empty_bit $20
.alias rx_full_bit $10
main:
lda #21
ldx #0
jsr $fff4 ; flush the keyboard buffer
lda #229
ldx #1
jsr $fff4
lda #0
sta in_data
sta sent
sta receiving
jsr setup_interrupt_routine
lda #$30 ; MODE 6, cassette input
sta $fe07
loop:
jsr $ffe0
bcs loop
send_key:
ldx sent
bne loop
cmp #$1b
bne store_key
lda buffer
store_key:
sta key
lda #2
sta sent
lda #0
sta receiving
lda #$34 ; MODE 6, cassette output
sta $fe07
lda $25b ; load the ULA interrupt mask
and #$8f ; clear all cassette interrupts
sta $fe00
jmp loop
;lda #$32 ; MODE 6, sound generation
;sta $fe07
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
tay
lda receiving
bne check_high_tone
tya
and #tx_empty_bit
beq interrupt_routine_exit
; Handle the TX Empty interrupt.
lda sent
bne send_data
; Data sent. Switch back to input and wait for a response.
lda #$b0 ; caps lock on, MODE 6, cassette input
sta $fe07
ldx #0
stx $fe06 ; reset the counter
stx in_data ; not in data yet
ldx #1
stx receiving ; but expecting data
lda $25b ; read the ULA interrupt mask
and #$df ; clear the TX Empty bit
ora #$50 ; set the high tone and RX Full bits
sta $fe00
bne interrupt_routine_exit ; unconditional branch (lda flags)
send_data:
dec sent
cmp #2 ; value was 2
beq interrupt_routine_exit ; do not send any value, just keep emitting
; a high tone
ldx key
stx $fe04
jmp interrupt_routine_exit
check_high_tone:
tya
and #high_tone_bit
beq check_rx_full
; Handle the high tone detect interrupt.
lda #$40 ; clear the high tone interrupt
sta $fe05
ldx #1
stx in_data
bne interrupt_routine_exit ; unconditional branch (ldx flags)
check_rx_full:
tya
and #rx_full_bit
beq interrupt_routine_exit
; Handle the RX Full interrupt.
lda $fe04 ; retrieve a byte from the shift register
ldx in_data
beq interrupt_routine_exit ; if not reading data then exit
sta buffer
lda #0
sta receiving
interrupt_routine_exit:
pla
tay
pla
tax
pla
plp
jmp (original_irq1v)
original_irq1v:
original_irq1v_low: .byte 0
original_irq1v_high: .byte 0