-
Notifications
You must be signed in to change notification settings - Fork 0
/
mach_wdc.s
238 lines (224 loc) · 3.36 KB
/
mach_wdc.s
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
mach_init0:
sei
ldx #80
ldy #24
jsr pagesize
rts
mach_init1:
lda #1
jsr set_led
jsr con_init
rts
mach_reset:
jmp start
mach_hex_char:
tsx
lda $101,x
and #$0f
cmp #10
bcc _is_digit
clc
adc #55
bra _done
_is_digit:
clc
adc #$30
_done:
sta $101,x
jmp do_next
mach_dbg:
;; A has low order of new IP
jsr set_led
rts
set_led:
pha ; Save selected LED(s)
lda #00 ; DDRA access
sta PIA_A_CTRL
lda #$ff ; All bits as "output"
sta PIA_A_DATA
lda #04 ; ORA access
sta PIA_A_CTRL
pla ; Fetch select LED(s)
sta PIA_A_DATA
rts
con_init:
;; Set USB_CTRL_WR and USB_CTRL_RDb pins as OUTPUT; others as input
lda #USB_CTRL_WR|USB_CTRL_RDb
sta USB_CTRL_DDR
rts
con_tx:
pha
lda #0
sta USB_DATA_DDR
pla
sta USB_DATA_OR
lda #USB_CTRL_TXEb
;; Wait for transmitter availability
- bit USB_CTRL_IR
bne -
lda #$ff
sta USB_DATA_DDR
lda #USB_CTRL_WRSTR
sta USB_CTRL_OR
nop
nop
lda #USB_CTRL_DEF
sta USB_CTRL_OR
rts
con_rx:
lda #0
sta USB_DATA_DDR
lda #USB_CTRL_RXFb
- bit USB_CTRL_IR
bne -
lda #USB_CTRL_RDSTR
sta USB_CTRL_OR
nop
nop
nop
nop
lda USB_DATA_IR
pha
lda #USB_CTRL_DEF
sta USB_CTRL_OR
pla
rts
raw_bs:
lda #8
rts
ll_mult:
tsx
lda $103,x
stz $103,x
sta mac
lda $104,x
stz $104,x
sta mac+1
ldy #16
again
;; Shift multiplier 1 bit right and check for carry
lda $102,x
lsr
sta $102,x
lda $101,x
ror
sta $101,x
bcc skip_add
;; Carry set. Add multiplicant to accumulator
clc
lda mac
adc $103,x
sta $103,x
lda mac+1
adc $104,x
sta $104,x
skip_add
lda mac
asl
sta mac
lda mac+1
rol
sta mac+1
dey
bne again
pla
pla
jmp do_next
ll_slash_mod:
tsx
lda $101,x
sta divisor
lda $102,x
sta divisor+1
lda $103,x
sta dividend
lda $104,x
sta dividend+1
;; Taken almost verbatim from the WDC 65816 6502 Programming Manual
lda #0
tax
pha
ldy #1
lda divisor
bmi div2
div1:
iny
asl divisor
rol divisor+1
bmi div2
cpy #17
bne div1
div2:
sec
lda dividend
sbc divisor
pha
lda dividend+1
sbc divisor+1
bcc div3
sta dividend+1
pla
sta dividend
pha
div3:
pla
pla
rol
pha
txa
rol
tax
lsr divisor+1
ror divisor
dey
bne div2
done:
pla
tay
txa
tsx
sta $102,x
tya
sta $101,x
lda dividend
sta $103,x
lda dividend+1
sta $104,x
jmp do_next
pagesize:
sty size_y
stx size_x
rts
;; cup=\E[%i%p1%d;%p2%dH
;; cursor position by sending
;; ESC[row;colH
;; where row = y, col = x
gotoxy:
phx
phy
lda #27 ;ESC
jsr con_tx
lda #"["
jsr con_tx
pla
jsr prt_dec_num
lda #";"
jsr con_tx
pla
jsr prt_dec_num
lda #"H"
jsr con_tx
rts
clear_seq: .byte 27,"[","H",27,"[","J",0
scroll_up:
cmp #255
bne _done
ldx #0
_another:
lda clear_seq,x
beq _done
jsr con_tx
inx
bra _another
_done:
rts