This repository has been archived by the owner on Feb 14, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgo.asm
230 lines (175 loc) · 4.69 KB
/
go.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
goScreenLineStart = screenRam + goOffsetY * screenWidth
goOffsetX = 16
goOffsetY = 10
goValueOffsetX = goOffsetX + 2
goScreenWidth = 8
goScreenHeight = 5
;-------------------------------------------------------------------------------
showGoScreen
jsr setupGo
jsr drawGo
jsr handleGoInput
jsr saveGoInput
jsr setupGo
jsr hideGoWindow
sec
rts
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
setupGo
lda #goOffsetY
sta row
lda #>goScreenLineStart
sta lineStart+1
lda #<goScreenLineStart
sta lineStart
lda #$00
sta offset
rts
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
drawGo
lda #goOffsetX
sta col
ldx #goScreenWidth
@loop
; save current byte
ldy col
lda (lineStart),y
ldy offset
sta savedScreen,y
; output go byte
lda goScreen,y
jsr outputChar
inc offset
; check if finished line
dex
bne @loop
jsr moveToNextLine
; check if finished drawing window
lda offset
cmp #goScreenWidth * goScreenHeight
bne drawGo
jsr drawGoValue
rts
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; draw current base value
drawGoValue
jsr setupGo
jsr moveToNextLine
jsr moveToNextLine
ldx #goValueOffsetX
stx col
lda base+1
jsr printByte
lda base
jsr printByte
rts
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
hideGoWindow
lda #goOffsetX
sta col
ldx #goScreenWidth
@loop
; output saved byte
ldy offset
lda savedScreen,y
jsr outputChar
inc offset
; check if finished line
dex
bne @loop
jsr moveToNextLine
; check if finished restoring screen
lda offset
cmp #goScreenWidth * goScreenHeight
bne hideGoWindow
rts
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
handleGoInput
ldy #goValueOffsetX
sty col
jsr invertGoCursor
; set up loop
ldx #$04
stx goPosition
@loop
; wait for input
@input jsr GETIN
beq @input
; if space then use current value
cmp #SPACE_KEY
bne @skip
ldy col
jsr invertGoCursor
; check if not A-F
cmp #7
bcs @skip
; convert character's screen code back to petscii
clc
adc #$40
@skip
sec
sbc #$30
; check if 0-9
cmp #10
bcc @done
sbc #$11
; restart loop if not A-F
cmp #6
bcs @loop
adc #10
@done
; A is 0-15
jsr byteToScreen
jsr outputChar
ldy col
jsr invertGoCursor
dec goPosition
ldx goPosition
bne @loop
rts
goPosition
BYTE $00
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
invertGoCursor
lda (lineStart),y
clc
adc #$80
sta (lineStart),y
rts
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; retrieve address from screen and save it to base address
saveGoInput
ldy #goValueOffsetX
saveHighByteTo base+1
saveLowByteTo base+1
saveHighByteTo base
saveLowByteTo base
rts
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
defm saveHighByteTo
lda (lineStart),y
jsr screenToByte
asl
asl
asl
asl
sta /1
iny
endm
defm saveLowByteTo
lda (lineStart),y
jsr screenToByte
clc
adc /1
sta /1
iny
endm
;-------------------------------------------------------------------------------