-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathread_bytes.oph
133 lines (95 loc) · 2.51 KB
/
read_bytes.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
; 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
lda #0
sta $71 ; in data?
lda #0
sta $72 ; received byte?
jsr setup_interrupt_routine
lda #0
sta $fe06
lda #$f0 ; MODE 6, cassette motor on, cassette input
sta $fe07
lda #$5c ; high tone detect, RX Full, RTC, vsync
sta $fe00
loop:
lda $72
beq loop ; if no byte has been received then loop again
lda $70
jsr $ffee ; write the character sent
lda #0
sta $72 ; clear the flag to avoid writing the character again
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
tax
and #$40
beq check_rx_interrupt
; Handle the high tone detect interrupt.
lda #$40 ; clear the high tone interrupt
sta $fe05
ldy $71
beq enable_input
ldy #0
sty $71
beq interrupt_routine_exit ; unconditional exit due to ldy flags
enable_input:
ldy #1
sty $71
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 and store it
sta $70
ldy $71
beq interrupt_routine_exit ; if not reading data then exit
set_received_flag:
lda #1 ; indicate that we received a byte
sta $72
interrupt_routine_exit:
pla
tay
pla
tax
pla
plp
jmp (original_irq1v)
original_irq1v:
original_irq1v_low: .byte 0
original_irq1v_high: .byte 0