-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.asm
227 lines (188 loc) · 5.52 KB
/
main.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
;-------------------------------------------------------------------------------
*=$c000
start
jsr setup
jsr drawFrame
@mainLoop
jsr resetPosition
jsr drawScreen
jsr handleKeypress
bcs @mainLoop
rts
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; address for the byte at the top left of the screen
base BYTE $00, $00
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
setup
lda #<startPosition
sta base
sta memoryPointer
lda #>startPosition
sta base+1
sta memoryPointer+1
; clear keyboard buffer
lda #$00
sta NDX
rts
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; draw the screen frame from compressed data (must be <256 bytes long)
drawFrame
jsr moveToTopLeftOfScreen
ldy #$00
@loop
; loop until loaded byte is 0
lda compressed,y
beq @done
; move to next byte and store position
iny
sty counter
; load number of times to output byte into x
ldx compressed,y
@xloop
jsr outputChar
dex
bne @xloop
; retrieve y and move to next byte
ldy counter
iny
jmp @loop
@done
rts
counter BYTE $00
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
moveToTopLeftOfScreen
lda #<screenRam
sta lineStart
lda #>screenRam
sta lineStart+1
lda #$00
sta row
sta col
rts
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; move to first line of data
resetPosition
jsr moveToTopLeftOfScreen
jsr moveToNextLine
jsr moveToNextLine
lda base
sta memoryPointer
lda base+1
sta memoryPointer+1
rts
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; output all the screen values
drawScreen
jsr drawLine
jsr moveToNextLine
ldx row
cpx #rowsOnScreen+2
bne drawScreen
rts
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; output the current line
drawLine
lda #$01
sta col
;-----------------------------------------------------------------------
; output start address
lda memoryPointer+1
jsr printByte
lda memoryPointer
jsr printByte
inc col
;-----------------------------------------------------------------------
; output values
ldx #$00
@lineLoop
inc col
txa
tay
; output hex value of byte from address
lda (memoryPointer),y
jsr printByte
inx
cpx #bytesInLine
bne @lineLoop
jsr incrementCursor
;-----------------------------------------------------------------------
; output bytes
ldx #$00
@byteLoop
txa
tay
lda (memoryPointer),y
jsr outputChar
inx
cpx #bytesInLine
bne @byteLoop
@done rts
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; print hex value of A to screen at current position
printByte
pha
lsr
lsr
lsr
lsr
jsr byteToScreen
jsr outputChar
pla
jsr byteToScreen
jsr outputChar
rts
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; output byte from A to current screen position
outputChar
ldy col
sta (lineStart),y
jsr incrementCursor
rts
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; move cursor right one place
incrementCursor
inc col
ldy col
cpy screenWidth
bne @done
jsr moveToNextLine
@done rts
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
moveToNextLine
; check for end of screen
ldy row
iny
cpy screenHeight
beq @done
; store incremented row
sty row
; set column position to 0
ldy #$00
sty col
; update start of line
lda lineStart
clc
adc screenWidth
sta lineStart
bcc @skip
inc lineStart+1
@skip ; move pointer to next row
lda memoryPointer
clc
adc #bytesInLine
sta memoryPointer
bcc @done
inc memoryPointer+1
@done rts
;-------------------------------------------------------------------------------