-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathser_ji.i
144 lines (104 loc) · 3.14 KB
/
ser_ji.i
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
;
;
; SER_JI.I - Serial Output on Joystick port, Inverted
;
;
; Copyright (c) Alex Herbert 2002
;
;
;
; This code assumes that the following constant have been declared.
; If not... un-comment them!
;
CNTRL equ $d000
DAC equ $d001
DDAC equ $d003
T1LOLC equ $d004
ACNTRL equ $d00b
IFLAG equ $d00d
;
;
; Baud rate setting
;
SER_BITTIME equ $9c00 ; $009c = 156 cycles = 9615 baud
;
; Subroutines
;
code
direct CNTRL ; assume dp = $d0
;
; ser_txbyte
; ----------
;
; Function:
; transmit byte serially (8n1, inverted) via joystick ports.
;
; On entry:
; a = byte to transmit
; dp = $d0
;
; On exit:
; d,cc = corrupted
;
; Stack usage:
; 5 bytes (7 if you include the return address)
;
ser_txbyte
pshs a ; put data on stack
ldd #$9907
std CNTRL ; select PSG register 7
ldd #$5881
sta ACNTRL ; T1 mode = free-run, no output on RAMP (PB7)
stb CNTRL ; latch PSG register
ldd #SER_BITTIME
std T1LOLC ; set and start timer (T1)
ldd #$0089
sta DDAC ; 6522 I/O port data direction = input
stb CNTRL ; enable PSG reading
ldb #$08 ; loop counter (here for timing)
lda DAC ; read PSG register 7
pshs d ; save PSG R7 and loop counter on stack
ora #$40
sta DAC ; store data for PSG write
ldd #$ff81
stb CNTRL ; disable PSG reading
sta DDAC ; 6522 I/O direction = output
bsr ser_txbit ; transmit start bit [0]
sertx_loop
lsr 2,s ; shift next data bit into carry
bcs ser_tx1
ser_tx0
lda ,s
ora #$40
sta DAC ; store data for PSG write
bsr ser_txbit ; transmit data bit [0]
bra sertx_next
ser_tx1
lda ,s
sta DAC ; store data for PSG write
bsr ser_txbit ; transmit data bit [1]
sertx_next
dec 1,s ; decrement loop counter
bne sertx_loop ; loop if more bits to send
lda ,s
sta DAC ; store data for PSG write
bsr ser_txbit ; tansmit stop bit [1]
lda #$18
sta ACNTRL ; T1 = single-shot, no output on RAMP (PB7)
ldd #$0200
std T1LOLC ; force T1 timeout
lda #$98
sta ACNTRL ; T1 = single-shot, RAMP output (PB7) enabled
leas 3,s ; restore stack
rts
ser_txbit
lda #$40
sertxbit_loop
bita IFLAG ; test T1 interrupt flag
beq sertxbit_loop ; loop until T1 timeout
lda #$91
sta CNTRL ; enable PSG register write
stb CNTRL ; latch data
lda T1LOLC ; clear T1 interrupt flag
rts
direct -1