-
Notifications
You must be signed in to change notification settings - Fork 0
/
itema.asm
460 lines (399 loc) · 11.6 KB
/
itema.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
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
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
/*
Bouncing ball demo
Copyright (c) 2020-2023 Itema AS
Written by:
- Øystein Steimler, [email protected]
- Torkild U. Resheim, [email protected]
- Morten Moen, [email protected]
- Arve Moen, [email protected]
- Bjørn Leithe Karlsen, [email protected]
*/
* = $c000 "Main Program"
// import our sprite library
#import "library/libSprite.asm"
#import "library/libInput.asm"
#import "library/libScreen.asm"
#import "library/font.asm"
BasicUpstart2(initialize)
/*
Various game modes for actually playing, autoplaying and debugging
*/
.label MODE_NORMAL = $00
.label MODE_AUTOPLAY = $01
.label MODE_JOYSTICK = $02
.var MODE = MODE_NORMAL
.var music = LoadSid("music/Nightshift.sid") //<- Here we load the sid file
.var demo_mode_movement_timer = $0
.var demoInputToggle = $0
// Initialize
initialize:
//LIBUTILITY_DISABLEBASICANDKERNAL() // Disable BASIC and Kernal ROMs
jsr $e544 // Clear screen
lda #$00 // Set the background color for the game area
sta $d021
lda #$00 // Set the background color for the border
sta $d020
lda #%11000011 // Enable sprites
sta $d015
lda #%00111110 // Specify multicolor for the ball sprites
sta $d01c
lda #$0f // Color light gray
sta $d025 // Set shared multicolor #1
lda #$0b // Color dark gray
sta $d026 // Set shared multicolor #2
lda #$00 // Disable xpand-y
sta $d017
lda #$00 // Disable xpand-x
sta $d01d
lda #$00 // Set sprite/background priority
sta $d01b
lda #$00
sta $d01e // Init sprite collision
sta $d01f // Init sprite collision
lda #$0a // Set sprite #1 individual color
sta $d027
lda #$0c // Set sprite #2 individual color (medium gray)
sta $d028
lda #paddleSpriteData/64
sta $07f8 // Sprite #0
lda #ballSpriteData/64
sta $07f9 // Sprite #1
sta $07fa // Sprite #2
sta $07fb // Sprite #3
sta $07fc // Sprite #4
/*
sta $07fd // Sprite #5
*/
// #############################################################################
// Itema Logo Sprites
lda #itemaLogoSwoosh/64
sta $07fe // Sprite #6
lda #itemaLogoBall/64
sta $07ff // Sprite #7
// Set MSB for sprite 6 and 7
lda $d010
ora #%11000000
sta $d010
// Position both sprites overlapping
lda #$02
sta $d00c
sta $d00e
lda #$d7
sta $d00d
sta $d00f
// Set colors for the sprites in the Itema logo
lda #$0f
sta $d02d
lda #$0a
sta $d02e
// #############################################################################
/*
Set character set pointer to our custom set, turn off
multicolor for characters
*/
lda $d018
ora #%00001110 // Set chars location to $3800 for displaying the custom font
sta $d018 // Bits 1-3 ($0400 + 512 .bytes * low nibble value) of $D018 sets char location
// $400 + $200*$0E = $3800
lda $d016 // turn off multicolor for characters
and #%11101111 // by clearing bit #4 of $D016
sta $d016
/*
Initialize IRQ
*/
jsr init_irq
/*
Load the initial screen
$4500 - intro screen
$4d00 - level 1
*/
lda #$4d
sta $ff
lda #$00
sta $fe
jsr load_screen
/*
Main loop
*/
loop:
jmp loop
demo_input:
lda SpriteMem+11
cmp #TopOfPaddle-12
bcs demo_input_toggle
rts
demo_input_toggle:
asl demoInputToggle
bcc demo_input_right
inc demoInputToggle
demo_input_left:
clc
lda SpriteMem+9 // Get the ball x-position LSB
sbc #$6
jsr store_xl // Store the paddle x-position
rts
demo_input_right:
lda SpriteMem+9 // Get the ball x-position LSB
adc #$4
jsr store_xl // Store the paddle x-position
rts
paddle_input:
lda $dc00 // Load value from CIA#1 Data Port A (pot lines are input)
and #%11111110 // Set bit 0 to input for pot x (paddle 1)
sta $dc00 // Store the result back to Data Port A
lda $dc01 // Load value from CIA#1 Data Port B (keyboard lines)
and #%11110111 // Clear bit 3 to low (selects pot x)
sta $dc01 // Store the result back to Data Port B
lda $d419 // Load value from Paddle X pot
eor #$ff // XOR with 255 to reverse the range
// Update paddle position unless it is outside the playing area
clc
cmp #$1a // Compare with the minimum value
bcs piNotLess // If carry is set (number >= minValue), branch to piNotLess
lda #$1a // If carry is clear (number < minValue), load the minimum value into the accumulator
piNotLess:
clc
// Now check if the number is greater than the maximum value
cmp #$ce // Compare with the maximum value
bcc piNotGreater// If carry is clear (number < maxValue), branch to piNotGreater
lda #$ce // If carry is set (number >= maxValue), load the maximum value into the accumulator
piNotGreater:
jsr store_xl // Store the paddle x-position
rts
joystick_input:
// Reset velocity on both axis
lda #$00
jsr store_xv
jsr store_yv
jsr store_ya
jsr store_xa
// Set acceleration according to joystick input
LIBINPUT_GET(GameportLeftMask)
bne inputRight
dec SpriteMem+9
inputRight:
LIBINPUT_GET(GameportRightMask)
bne inputUp
inc SpriteMem+9
inputUp:
LIBINPUT_GET(GameportUpMask)
bne inputDown
dec SpriteMem+11
inputDown:
LIBINPUT_GET(GameportDownMask)
bne inputEnd
inc SpriteMem+11
inputFire:
lda #$00
sta fire
LIBINPUT_GET(GameportFireMask)
bne inputEnd
lda #$80
sta fire
inputEnd:
rts
init_irq:
sei
lda #<irq_1
ldx #>irq_1
sta $0314
stx $0315 // Set interrupt addr
lda #$7f
sta $dc0d // Timer A off on cia1/kb
sta $dd0d // Timer A off on cia2
lda #$81
sta $d01a // Raster interrupts on
/*
lda #$1b // Screen ctrl: default
sta $d011
*/
lda #$01
sta $d012 // Interrupt at line 0
lda $dc0d // Clrflg (cia1)
lda $dd0d // Clrflg (cia2)
asl $d019 // Clr interrupt flag (just in case)
cli
rts
irq_1:
lda #$00
sta SpriteIndex
.if (MODE == MODE_NORMAL) jsr paddle_input
.if (MODE == MODE_AUTOPLAY) jsr demo_input
.if (MODE == MODE_JOYSTICK) {
lda #$01
sta SpriteIndex
jsr joystick_input
jsr draw_sprite
jsr check_brick_collision
asl $d019 // Clear interrupt flag
jmp $ea81 // set flag and end
}
animation_loop:
clc
lda SpriteIndex
cmp #$00
beq move_ball_normally
// Check if we should move the ball faster
move_ball_accellerated:
clc
// XXX: Does not work with multiple balls
//lda accelerated_movement_timer
//cmp #$1
//bcs accelerated_movement
move_ball_normally:
jsr move_vertically
jsr move_horizontally
jsr draw_sprite
jsr check_brick_collision
jsr check_paddle_collision
inc SpriteIndex
lda SpriteIndex
cmp #$02 // we only have two sprites
beq done
jmp animation_loop
done:
asl $d019 // Clear interrupt flag
jmp $ea81 // set flag and end
/*
Add a little upwards acceleration for a period of time. This typically happens
when the ball hits the paddle.
*/
accelerated_movement:
dec accelerated_movement_timer
lda accelerated_movement_timer
cmp #$0
beq end_accellerated_movement
// FRAME_COLOR(4)
lda #$80 // -1
jsr store_ya
jmp move_ball_normally
end_accellerated_movement:
FRAME_COLOR(0)
lda #$00
jsr store_ya
jmp move_ball_normally
// Intro screen
.var intro_background = LoadBinary("petscii/intro.bin")
*=$4500 "Intro"
.fill intro_background.getSize(), intro_background.get(i)
// Level 1
.var lvl1_background = LoadBinary("petscii/level_1.bin")
*=$4d00 "Level 1"
.fill lvl1_background.getSize(), lvl1_background.get(i)
// -- Sprite Data --------------------------------------------------------------
// Created using https://www.spritemate.com
* = $2140 "Ball Sprite Data"
ballSpriteData:
.byte %00000000, %00000000, %00000000
.byte %00000000, %00000000, %00000000
.byte %00000000, %00000000, %00000000
.byte %00000000, %00000000, %00000000
.byte %00000000, %00000000, %00000000
.byte %00000000, %00101000, %00000000
.byte %00000000, %10011010, %00000000
.byte %00000010, %01101010, %11000000
.byte %00000010, %10101010, %11000000
.byte %00000010, %10101010, %11000000
.byte %00000010, %10101010, %11000000
.byte %00000010, %10101011, %11000000
.byte %00000010, %10101011, %11000000
.byte %00000000, %10101111, %00000000
.byte %00000000, %00111100, %00000000
.byte %00000000, %00000000, %00000000
.byte %00000000, %00000000, %00000000
.byte %00000000, %00000000, %00000000
.byte %00000000, %00000000, %00000000
.byte %00000000, %00000000, %00000000
.byte %00000000, %00000000, %00000000
* = $2180 "Paddle Sprite Data"
paddleSpriteData:
.byte %00000000,%00000000,%00000000
.byte %00000000,%00000000,%00000000
.byte %00000000,%00000000,%00000000
.byte %00000000,%00000000,%00000000
.byte %00000000,%00000000,%00000000
.byte %00000000,%00000000,%00000000
.byte %00000000,%00000000,%00000000
.byte %00000000,%00000000,%00000000
.byte %00000000,%00000000,%00000000
.byte %00000000,%00000000,%00000000
.byte %00000000,%00000000,%00000000
.byte %00000000,%00000000,%00000000
.byte %00000000,%00000000,%00000000
.byte %00000000,%00000000,%00000000
.byte %00000000,%00000000,%00000000
.byte %00000000,%00000000,%00000000
.byte %00000000,%00000000,%00000000
.byte %00000000,%00000000,%00000000
.byte %11111111,%11111111,%11111111
.byte %11111111,%11111111,%11111111
.byte %11111111,%11111111,%11111111
* = $21c0 "itemaLogo"
itemaLogo:
.byte $00, $1C, $00
.byte $01, $BE, $C0
.byte $07, $BE, $70
.byte $0E, $1C, $38
.byte $1C, $00, $1C
.byte $38, $7C, $0C
.byte $38, $7C, $0E
.byte $70, $1C, $0E
.byte $70, $1C, $0E
.byte $70, $1C, $0E
.byte $F0, $1C, $0E
.byte $F0, $1C, $0E
.byte $70, $1C, $1C
.byte $70, $1C, $3C
.byte $78, $1C, $78
.byte $78, $1F, $E0
.byte $3C, $1F, $C0
.byte $1E, $1E, $00
.byte $0F, $00, $00
.byte $07, $C2, $00
.byte $00, $FC, $00
* = $2200 "itemaLogoSwoosh"
itemaLogoSwoosh:
.byte $00, $00, $00
.byte $01, $C1, $C0
.byte $07, $80, $70
.byte $0E, $00, $38
.byte $1C, $00, $1C
.byte $38, $7C, $0C
.byte $38, $7C, $0E
.byte $70, $1C, $0E
.byte $70, $1C, $0E
.byte $70, $1C, $0E
.byte $F0, $1C, $0E
.byte $F0, $1C, $0E
.byte $70, $1C, $1C
.byte $70, $1C, $3C
.byte $78, $1C, $78
.byte $78, $1F, $E0
.byte $3C, $1F, $C0
.byte $1E, $1E, $00
.byte $0F, $00, $00
.byte $07, $C2, $00
.byte $00, $FC, $00
* = $2240 "itemaLogoSwoosh"
itemaLogoBall:
.byte $00, $1C, $00
.byte $00, $3E, $00
.byte $00, $3E, $00
.byte $00, $1C, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00