-
Notifications
You must be signed in to change notification settings - Fork 2
/
blackboard.asm
256 lines (256 loc) · 11 KB
/
blackboard.asm
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
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
; *
; * BLACKBOARD
; *
*=$8000
COLOR = $10
BASE = $2000
SCROLY = $d011
VMCSB = $d018
COLMAP = $400
; *
HMAX = 320
VMAX = 200
HMID = 160
VMID = 100
; *
SCRLEN = 8000
MAPLEN = 1000
TEMPA = $FB
TEMPB = TEMPA+2
; *
TABPTR = TEMPA
TABSIZ = $9000
; *
HPSN = TABSIZ+2
VPSN = HPSN+2
CHAR = VPSN+1
ROW = CHAR+1
LINE = ROW+1
xBYTE = LINE+1
BITT = xBYTE+2
MPRL = BITT+1
MPRH = MPRL+1
MPDL = MPRH+1
MPDH = MPDL+1
PRODL = MPDH+1
PRODH = PRODL+1
; *
FILVAL = PRODH+1
JSV = FILVAL+1
; *
jmp START
; *
BLKFIL lda FILVAL
ldx TABSIZ+1
BEQ PARTPG
ldy #0
FULLPG sta (TABPTR),y
iny
bne FULLPG
inc TABPTR+1
dex
bne FULLPG
PARTPG ldx TABSIZ
beq FINI
LDY #0
PARTLP STA (TABPTR),y
iny
dex
bne PARTLP
FINI rts
; *
; * 16-Bit Multiplication Routine
; *
MULT16 lda #0
sta PRODL
sta PRODH
ldx #17
clc
MULT ROR PRODH
ROR PRODL
ROR MPRH
ROR MPRL
bcc CTDOWN
clc
lda MPDL
adc PRODL
sta PRODL
lda MPDH
adc PRODH
sta PRODH
CTDOWN dex
bne MULT
rts
; *
; * PLOT Routine
; *
PLOT lda VPSN
lsr A
lsr A
lsr A
sta ROW
; *
; * Char = HPSN/8 (16-bit divide)
; *
lda HPSN
sta TEMPA
lda HPSN+1
sta TEMPA+1
ldx #3
DLOOP lsr TEMPA+1
ror TEMPA
dex
bne DLOOP
lda TEMPA
sta CHAR
; *
; *
lda VPSN
and #7
sta LINE
; *
; * BITT=7-(HPSN and 7)
; *
lda HPSN
and #7
sta BITT
sec
lda #7
sbc BITT
sta BITT
; * BYTE=Base+row*hmax+8*char+LINE
lda ROW
sta MPRL
lda #0
sta MPRH
lda #<HMAX
sta MPDL
lda #>HMAX
sta MPDH
jsr MULT16
lda MPRL
sta TEMPA
lda MPRL+1
sta TEMPA+1
;* ADD product to base
clc
lda #<BASE
adc TEMPA
sta TEMPA
lda #>BASE
adc TEMPA+1
sta TEMPA+1
; * MULTIPLY 8 * char
lda #8
sta MPRL
lda #0
sta MPRH
lda CHAR
sta MPDL
lda #0
sta MPDH
jsr MULT16
lda MPRL
sta TEMPB
lda MPRH
sta TEMPB+1
; ADD LINE
clc
lda TEMPB
adc LINE
sta TEMPB
lda TEMPB+1
adc #0
sta TEMPB+1
; BYTE+TEMPA+TEMPB
clc
lda TEMPA
adc TEMPB
sta TEMPB
lda TEMPA+1
adc TEMPB+1
sta TEMPB+1
; POKE BYTE, peek (byte) or 2 bit
ldx BITT
inx
lda #0
sec
SQUARE rol
dex
bne SQUARE
ldy #0
ora (TEMPB),y
sta (TEMPB),y
rts
; Main routine starts here
START lda #$18
sta VMCSB
LDA SCROLY
ora #32
sta SCROLY
; Select graphics bank 1
lda $dd02
ora #$03
sta $dd02
; *
lda $dd00
ora #$03
sta $dd00
; clear bit map
lda #0
sta FILVAL
lda #<BASE
sta TABPTR
lda #>BASE
sta TABPTR+1
lda #<SCRLEN
sta TABSIZ
lda #>SCRLEN
sta TABSIZ+1
jsr BLKFIL
; Set BKG and Line Colors
lda #COLOR
sta FILVAL
lda #<COLMAP
sta TABPTR
lda #>COLMAP
sta TABPTR+1
lda #<MAPLEN
sta TABSIZ
lda #>MAPLEN
sta TABSIZ+1
jsr BLKFIL
; Draw horizontal line
lda #VMID
sta VPSN
lda #0
sta HPSN
sta HPSN+1
AGIN JSR PLOT
inc HPSN
bne NEXT
inc HPSN+1
NEXT LDA HPSN+1
cmp #>HMAX
bcc AGIN
LDA HPSN
CMP #<HMAX
BCC AGIN
; Draw vertical line
lda #0
sta VPSN
POINT LDA #<HMID
sta HPSN
LDA #>HMID
sta HPSN+1
jsr PLOT
inc HPSN
bne SKIP
INC HPSN+1
SKIP JSR PLOT
ldx VPSN
inx
stx VPSN
cpx #VMAX
bcc POINT
INF jmp INF