/
geosmac.inc
executable file
·376 lines (330 loc) · 4.58 KB
/
geosmac.inc
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
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
; GEOS macros
; reassembled for 6502TASM/MMS by Maciej 'YTM/Alliance' Witkowiak
.include "config.inc"
.macro LoadB dest, value
lda #value
sta dest
.endmacro
.macro LoadW dest, value
LoadB dest+1, >(value)
.if (.not .const(value)) .or (>(value))<>(<(value))
lda #<(value)
.endif
sta dest+0
.endmacro
.macro LoadW_ dest, value
LoadB dest+0, <(value)
.if (.not .const(value)) .or (>(value))<>(<(value))
lda #>(value)
.endif
sta dest+1
.endmacro
.macro LoadW__ dest, value
LoadB dest+1, >(value)
LoadB dest+0, <(value)
.endmacro
.macro MoveB source, dest
lda source
sta dest
.endmacro
.macro MoveW source, dest
MoveB source+1, dest+1
MoveB source+0, dest+0
.endmacro
.macro MoveW_ source, dest
MoveB source+0, dest+0
MoveB source+1, dest+1
.endmacro
.macro add source
clc
adc source
.endmacro
.macro AddB source, dest
lda source
add dest
sta dest
.endmacro
.macro AddB_ source, dest
clc
lda source
adc dest
sta dest
.endmacro
.macro AddW source, dest
AddB source+0, dest+0
lda source+1
adc dest+1
sta dest+1
.endmacro
.macro AddVB value, dest
lda dest
clc
adc #value
sta dest
.endmacro
.macro AddVW value, dest
.local @j
clc
lda #<(value)
adc dest
sta dest
.if (>(value))=0
bcc @j
inc dest+1
@j:
.else
lda #>(value)
adc dest + 1
sta dest + 1
.endif
.endmacro
.macro AddVW_ value, dest
.local j
lda dest
clc
adc #<(value)
sta dest
.if (>(value))=0
bcc j
inc dest+1
j:
.else
lda #>(value)
adc dest + 1
sta dest + 1
.endif
.endmacro
.macro sub source
sec
sbc source
.endmacro
.macro SubB source, dest
lda dest
sub source
sta dest
.endmacro
.macro SubW source, dest
SubB source+0, dest+0
lda dest+1
sbc source+1
sta dest+1
.endmacro
.macro SubVW value, dest
sec
lda dest+0
sbc #<(value)
sta dest+0
lda dest+1
sbc #>(value)
sta dest+1
.endmacro
.macro CmpB source, dest
lda source
cmp dest
.endmacro
.macro CmpBI source, immed
lda source
cmp #immed
.endmacro
.macro CmpW source, dest
.local @j
CmpB source+1, dest+1
bne @j
CmpB source+0, dest+0
@j:
.endmacro
.macro CmpWI source, immed
.local @j
CmpBI source+1, >(immed)
bne @j
CmpBI source+0, <(immed)
@j:
.endmacro
.macro PushB source
lda source
pha
.endmacro
.macro PushW source
PushB source+1
PushB source+0
.endmacro
.macro PopB dest
pla
sta dest
.endmacro
.macro PopW dest
PopB dest+0
PopB dest+1
.endmacro
.macro bra addr
clv
bvc addr
.endmacro
.macro smb bitN, dest
pha
lda #1 << bitN
ora dest
sta dest
pla
.endmacro
.macro smbf bitN, dest
lda #1 << bitN
ora dest
sta dest
.endmacro
.macro smbf_ bitN, dest
lda dest
ora #1 << bitN
sta dest
.endmacro
.macro rmb bitN, dest
pha
lda #(1 << bitN) ^ $ff
and dest
sta dest
pla
.endmacro
.macro rmbf bitN, dest
lda #(1 << bitN) ^ $ff
and dest
sta dest
.endmacro
.macro bbs bitN, source, addr
.local @j
php
pha
lda source
and #1 << bitN
beq @j
pla
plp
bra addr
@j:
pla
plp
.endmacro
.macro bbsf bitN, source, addr
.if (bitN = 7)
bit source
bmi addr
.else
.if (bitN = 6)
bit source
bvs addr
.else
lda source
and #1 << bitN
bne addr
.endif
.endif
.endmacro
.macro bbr bitN, source, addr
.local @j
php
pha
lda source
and #1 << bitN
bne @j
pla
plp
bra addr
@j:
pla
plp
.endmacro
.macro bbrf bitN, source, addr
.if (bitN = 7)
bit source
bpl addr
.else
.if (bitN = 6)
bit source
bvc addr
.else
lda source
and #1 << bitN
beq addr
.endif
.endif
.endmacro
; not part of original macro set
; by Maciej Witkowiak
.macro addv value
clc
adc #value
.endmacro
.macro subv value
sec
sbc #value
.endmacro
.macro bnex addr
txa
bne addr
.endmacro
.macro beqx addr
txa
beq addr
.endmacro
.macro IncW addr
.local @j
inc addr
bne @j
inc addr+1
@j:
.endmacro
.macro ASSERT_NOT_BELOW_IO
.assert * < $D000 || * >= $E000, error, "This code can't run below the C64 I/O area."
.endmacro
.ifdef bsw128
.macro START_IO
.endmacro
.macro END_IO
.endmacro
.macro START_IO_X
.endmacro
.macro END_IO_X
.endmacro
.macro START_IO_Y
.endmacro
.macro END_IO_Y
.endmacro
.macro START_IO_128
PushB config
LoadB config, CIOIN
.endmacro
.macro END_IO_128
PopB config
.endmacro
.else
.macro START_IO
PushB CPU_DATA
ASSERT_NOT_BELOW_IO
LoadB CPU_DATA, IO_IN
.endmacro
.macro END_IO
PopB CPU_DATA
ASSERT_NOT_BELOW_IO
.endmacro
.macro START_IO_X
ldx CPU_DATA
ASSERT_NOT_BELOW_IO
LoadB CPU_DATA, IO_IN
.endmacro
.macro END_IO_X
stx CPU_DATA
ASSERT_NOT_BELOW_IO
.endmacro
.macro START_IO_Y
ldy CPU_DATA
ASSERT_NOT_BELOW_IO
LoadB CPU_DATA, IO_IN
.endmacro
.macro END_IO_Y
sty CPU_DATA
ASSERT_NOT_BELOW_IO
.endmacro
.macro START_IO_128
.endmacro
.macro END_IO_128
.endmacro
.endif