main.asm 198 KB
Newer Older
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
;
; **** ZP FIELDS ****
;
f3C = $3C
f4C = $4C
f95 = $95
f96 = $96
f97 = $97
fFF = $FF
;
; **** ZP ABSOLUTE ADRESSES ****
;
a01 = $01
a05 = $05
a13 = $13
a3C = $3C
a5D = $5D
a5E = $5E
a5F = $5F
a60 = $60
aA5 = $A5
aAE = $AE
aC5 = $C5
aDA = $DA
aE6 = $E6
;
; **** ZP POINTERS ****
;
Ricardo Quesada's avatar
Ricardo Quesada committed
29 30 31 32
p22 = $22                       ;sprite to create: X lo
p24 = $24                       ;rows that trigger sprite class init
p26 = $26                       ;sprite to create: X hi
p28 = $28                       ;what sprite class to create at row
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
p2A = $2A
p5D = $5D
p5F = $5F
p83 = $83
pA9 = $A9
pD0 = $D0
pD2 = $D2
pF7 = $F7
pFB = $FB
pFC = $FC
pFD = $FD
;
; **** FIELDS ****
;
f0000 = $0000
f004B = $004B
f004C = $004C
f00A2 = $00A2
fD040 = $D040
fD99A = $D99A
fD9E9 = $D9E9
fDB48 = $DB48
fDB98 = $DB98
fDBDA = $DBDA
fE087 = $E087
fE19A = $E19A
fE1E9 = $E1E9
fE348 = $E348
fE398 = $E398
fE3F8 = $E3F8
fE6DC = $E6DC
fEFBA = $EFBA
;
; **** ABSOLUTE ADRESSES ****
;
a0014 = $0014
Ricardo Quesada's avatar
Ricardo Quesada committed
69
a0019 = $0019                   ;Stores current hero animation, but seems unused
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
a001A = $001A
a0022 = $0022
a0023 = $0023
a0024 = $0024
a0025 = $0025
a0026 = $0026
a0027 = $0027
a0028 = $0028
a0029 = $0029
a002A = $002A
a002B = $002B
a003D = $003D
a003F = $003F
a0041 = $0041
a004E = $004E
a0053 = $0053
a0054 = $0054
a0055 = $0055
a0056 = $0056
a0057 = $0057
a0058 = $0058
a0059 = $0059
a005A = $005A
a00A7 = $00A7
a00A8 = $00A8
a00C9 = $00C9
a00D7 = $00D7
a00F7 = $00F7
a00F8 = $00F8
a00FB = $00FB
a00FC = $00FC
a00FD = $00FD
a00FE = $00FE
a0400 = $0400
a0401 = $0401
Ricardo Quesada's avatar
Ricardo Quesada committed
105 106 107
V_SCROLL_BIT_IDX = $0402        ;pixels scrolled vertically: 0-7
V_SCROLL_ROW_IDX = $0403        ;index to the row in the level: 0 means end of scroll (top of map)
V_SCROLL_DELTA = $0404          ;How many pixels needs to get scrolled. $0: no scroll needed, $ff: -1 one pixel
108
a0405 = $0405
109 110
IRQ_ADDR_LO = $0406
IRQ_ADDR_HI = $0407
Ricardo Quesada's avatar
Ricardo Quesada committed
111 112
GAME_TICK = $040A               ;Incremented from main loop
RASTER_TICK = $040B             ;Incremeted from raster routine
Ricardo Quesada's avatar
Ricardo Quesada committed
113 114 115 116 117 118 119 120
SPRITES_X_HI00 = $040D          ;MSB for X pos
SPRITES_X_HI01 = $040E
SPRITES_X_HI04 = $0411
SPRITES_X_HI05 = $0412
SPRITES_X_LO00 = $041D          ;LSB for X pos
SPRITES_X_LO01 = $041E
SPRITES_X_LO04 = $0421
SPRITES_X_LO05 = $0422
Ricardo Quesada's avatar
Ricardo Quesada committed
121 122
SPRITES_Y00 = $042D
SPRITES_Y01 = $042E
Ricardo Quesada's avatar
Ricardo Quesada committed
123 124
SPRITES_Y04 = $0431
SPRITES_Y05 = $0432
Ricardo Quesada's avatar
Ricardo Quesada committed
125 126
SPRITES_BKG_PRI00 = $043D
SPRITES_BKG_PRI01 = $043E
Ricardo Quesada's avatar
Ricardo Quesada committed
127 128
SPRITES_BKG_PRI04 = $0441
SPRITES_BKG_PRI05 = $0442
Ricardo Quesada's avatar
Ricardo Quesada committed
129
SPRITES_COLOR00 = $044D         ;primary color of sprite
Ricardo Quesada's avatar
Ricardo Quesada committed
130
SPRITES_COLOR01 = $044E
Ricardo Quesada's avatar
Ricardo Quesada committed
131 132
SPRITES_COLOR04 = $0451
SPRITES_COLOR05 = $0452
Ricardo Quesada's avatar
Ricardo Quesada committed
133
SPRITES_PTR00 = $045D           ;frame to be used by sprite
Ricardo Quesada's avatar
Ricardo Quesada committed
134
SPRITES_PTR01 = $045E
Ricardo Quesada's avatar
Ricardo Quesada committed
135 136
SPRITES_PTR04 = $0461
SPRITES_PTR05 = $0462
Ricardo Quesada's avatar
Ricardo Quesada committed
137
SPRITES_DELTA_X00 = $046D       ;pixels to move horizontally for hero (neg or pos)
Ricardo Quesada's avatar
Ricardo Quesada committed
138
SPRITES_DELTA_X01 = $046E
Ricardo Quesada's avatar
Ricardo Quesada committed
139 140
SPRITES_DELTA_X04 = $0471
SPRITES_DELTA_X05 = $0472
Ricardo Quesada's avatar
Ricardo Quesada committed
141
SPRITES_DELTA_Y00 = $047D       ;pixels to move vertically for hero (neg or pos)
Ricardo Quesada's avatar
Ricardo Quesada committed
142
SPRITES_DELTA_Y01 = $047E
Ricardo Quesada's avatar
Ricardo Quesada committed
143 144
SPRITES_DELTA_Y04 = $0481
SPRITES_DELTA_Y05 = $0482
Ricardo Quesada's avatar
Ricardo Quesada committed
145 146
SPRITES_CLASS00 = $048D
SPRITES_CLASS01 = $048E
Ricardo Quesada's avatar
Ricardo Quesada committed
147
SPRITES_CLASS04 = $0491
Ricardo Quesada's avatar
Ricardo Quesada committed
148
SPRITES_CLASS05 = $0492
Ricardo Quesada's avatar
Ricardo Quesada committed
149 150
SPRITES_COUNTER00 = $049D       ;TICK and COUNTER are the same, but using different
                                ; names since they are not contiguous in memory
Ricardo Quesada's avatar
Ricardo Quesada committed
151
SPRITES_COUNTER03 = $04A0       ;referenced in throw grenade
Ricardo Quesada's avatar
Ricardo Quesada committed
152
a04A1 = $04A1                   ;Used to link sprites together
153
a04AC = $04AC
Ricardo Quesada's avatar
Ricardo Quesada committed
154
SPRITES_TICK05 = $04B7
155
a04C2 = $04C2
Ricardo Quesada's avatar
Ricardo Quesada committed
156
FIRE_COOLDOWN = $04DF           ;reset with $ff
Ricardo Quesada's avatar
Ricardo Quesada committed
157
HERO_ANIM_MOV_IDX = $04E0       ;Movement anim for hero: left,right,up,down,diagoanly,etc.
Ricardo Quesada's avatar
Ricardo Quesada committed
158
                                ; See: SOLDIER_ANIM_FRAMES_HI/LO
Ricardo Quesada's avatar
Ricardo Quesada committed
159
a04E1 = $04E1                   ;Bullet speed idx (???)
Ricardo Quesada's avatar
Ricardo Quesada committed
160 161 162
BKG_COLOR0 = $04E2
BKG_COLOR1 = $04E3
BKG_COLOR2 = $04E4
163
COUNTER1 = $04E6
164
a04E7 = $04E7
Ricardo Quesada's avatar
Ricardo Quesada committed
165
TRIGGER_ROW_IDX = $04E8         ;If equal to row index, create object
166
a04E9 = $04E9                   ;unused
167 168 169
a04EA = $04EA
a04EC = $04EC
a04ED = $04ED
Ricardo Quesada's avatar
Ricardo Quesada committed
170
a04EE = $04EE                   ;Hero is moving up (unused)
Ricardo Quesada's avatar
Ricardo Quesada committed
171
ENEMIES_IN_FORT = $04EF         ;How many enemies are inside the fort/warehouse
Ricardo Quesada's avatar
Ricardo Quesada committed
172 173 174
TMP_SPRITE_X_LO = $04F0         ;Temp sprite-X LSB for current sprite
TMP_SPRITE_Y = $04F1            ;ditto for Y
TMP_SPRITE_X_HI = $04F2         ;ditto for X MSB
Ricardo Quesada's avatar
Ricardo Quesada committed
175
LEVEL_NR = $04F3
Ricardo Quesada's avatar
Ricardo Quesada committed
176
a04F4 = $04F4                   ;Seems to be a delay or something related to enemies inside
Ricardo Quesada's avatar
Ricardo Quesada committed
177 178
IS_LEVEL_COMPLETE = $04F5       ;0: game in progress, 1:lvl complete. Exit animation finished (unused apparently)
IS_ANIM_EXIT_DOOR = $04F7       ;1: hero goes to exit door animation in progress
179 180 181 182 183 184 185
SCORE_LSB = $04F8
SCORE_MSB = $04F9
a04FD = $04FD
GRENADES = $04FF
LIVES = $0500
a0501 = $0501
a0502 = $0502
Ricardo Quesada's avatar
Ricardo Quesada committed
186
IS_HERO_DEAD = $0503            ;0: hero alive, 1:was shot, 2:fell down in trench
187 188
a0504 = $0504
a0505 = $0505
189
a0506 = $0506
190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
a050F = $050F
a0510 = $0510
a0511 = $0511
a0512 = $0512
aE34E = $E34E
aE34F = $E34F
aE350 = $E350
aE351 = $E351
aE359 = $E359
aE35A = $E35A
aE361 = $E361
aE362 = $E362
aE36A = $E36A
aE36B = $E36B
aE36C = $E36C
aE36D = $E36D
aE3F9 = $E3F9
aE3FA = $E3FA
aE3FB = $E3FB
aE3FC = $E3FC
aE3FD = $E3FD
aE3FE = $E3FE
aE3FF = $E3FF
aECEC = $ECEC
214
aFFC0 = $FFC0
215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236
;
; **** POINTERS ****
;
pD800 = $D800
pD829 = $D829
pD882 = $D882
pE000 = $E000
pE029 = $E029
pE082 = $E082
;
; **** EXTERNAL JUMPS ****
;
e03F0 = $03F0
eF00A = $F00A
;
; **** PREDEFINED LABELS ****
;

        * = $0800

        .BYTE $00,$0B,$08,$0A,$00,$9E,$32,$30
        .BYTE $36,$31,$00,$00,$00
237

238 239 240 241 242 243 244 245 246 247
        LDA #$00     ;#%00000000
        TAY
        STA aA5
        STA aAE
        LDA #$09     ;#%00001001
        JSR s0828
        JSR s083D
        JSR eF00A   ; set charset: copy from e000-efff to d000-dfff
        JSR s083D
        JSR s0828
248
        JMP BOOT
249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270

s0828   LDA #$01     ;#%00000001
        TAX
        TAY
        NOP
        NOP
        NOP
        LDA #$00     ;#%00000000
        NOP
        NOP
        NOP
        LDA #$00     ;#%00000000
        LDX #$FF     ;#%11111111
        LDY #$FF     ;#%11111111
        JMP e03F0

s083D   SEI
b083E   LDA a01
        EOR #$02     ;#%00000010
        STA a01
        RTS

Ricardo Quesada's avatar
Ricardo Quesada committed
271
        ; TODO: unused, remove
272 273 274
        .BYTE $E0,$09,$D0,$F5,$20,$AD,$35,$20
        .BYTE $57,$0A,$20

275 276 277
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-;
BOOT    ;$0850
        SEI
278
        LDA #<NMI_HANDLER
279
        STA $0318    ;NMI
280
        LDA #>NMI_HANDLER
281 282 283
        STA $0319    ;NMI
        CLI
        LDX #$00     ;#%00000000
Ricardo Quesada's avatar
Ricardo Quesada committed
284
_L00    LDA RESET_ROUTINE,X
Ricardo Quesada's avatar
Ricardo Quesada committed
285
        STA $8000,X  ;Sets the reset routine (CBM80)
286 287
        INX
        CPX #$09     ;#%00001001
288
        BNE _L00
Ricardo Quesada's avatar
Ricardo Quesada committed
289 290

        JSR SETUP_VIC_BANK
Ricardo Quesada's avatar
Ricardo Quesada committed
291
        JSR SET_SIGHT_SPRITE
292 293
        JSR s401D
        LDX #$10     ;#%00010000
294
_L01    TXA
295 296
        STA f004B,b,X
        DEX
297
        BPL _L01
298 299 300
        LDA #$00     ;#%00000000
        STA a0502
        STA a0501
301 302 303

START   ;$0883
        LDA #$A5     ;Set initial starting row
304
        STA V_SCROLL_ROW_IDX
Ricardo Quesada's avatar
Ricardo Quesada committed
305
        JSR SETUP_LEVEL
306
        JSR SETUP_SCREEN
307 308 309 310 311
        JSR SETUP_IRQ

        ; Display main title screen
        LDA #$00     ;Song to play (main theme)
        JSR MUSIC_INIT
Ricardo Quesada's avatar
Ricardo Quesada committed
312
        JSR SCREEN_MAIN_TITLE
313

Ricardo Quesada's avatar
Ricardo Quesada committed
314
        JSR s5006    ;Music stop?
315 316 317
        LDA #$00     ;#%00000000
        STA SCORE_LSB
        STA SCORE_MSB
318
        STA V_SCROLL_BIT_IDX
Ricardo Quesada's avatar
Ricardo Quesada committed
319
        STA LEVEL_NR
320 321 322 323 324 325
        STA $D01D    ;Sprites Expand 2x Horizontal (X)
        STA $D017    ;Sprites Expand 2x Vertical (Y)
        LDA #$05     ;#%00000101
        STA GRENADES
        STA LIVES

Ricardo Quesada's avatar
Ricardo Quesada committed
326
START_LEVEL          ;$08B8
Ricardo Quesada's avatar
Ricardo Quesada committed
327
        LDA #$A5     ;#%10100101
328
        STA V_SCROLL_ROW_IDX
329 330
        LDA #$00     ;Song to play (main theme)
        JSR MUSIC_INIT
Ricardo Quesada's avatar
Ricardo Quesada committed
331 332

        ; Restart after life lost
Ricardo Quesada's avatar
Ricardo Quesada committed
333 334
RESTART
        JSR SETUP_LEVEL
335
        JSR SETUP_SCREEN
336
        JSR SETUP_IRQ
Ricardo Quesada's avatar
Ricardo Quesada committed
337 338

        ; Main loop
Ricardo Quesada's avatar
Ricardo Quesada committed
339
GAME_LOOP            ;$08CB
Ricardo Quesada's avatar
Ricardo Quesada committed
340
        JSR WAIT_RASTER_AT_BOTTOM
Ricardo Quesada's avatar
Ricardo Quesada committed
341 342
        LDA V_SCROLL_DELTA
        BEQ _L00
343
        CLC
344
        ADC V_SCROLL_BIT_IDX
345
        AND #$07     ;#%00000111
346
        STA V_SCROLL_BIT_IDX
347
        CMP #$07     ;#%00000111
Ricardo Quesada's avatar
Ricardo Quesada committed
348
        BNE _L00
349
        DEC V_SCROLL_ROW_IDX
350 351
        LDA #$00     ;#%00000000
        STA a04E9
Ricardo Quesada's avatar
Ricardo Quesada committed
352
        JSR APPLY_DELTA_MOV
353
        INC a04E9
Ricardo Quesada's avatar
Ricardo Quesada committed
354
        JSR LEVEL_DRAW_VIEWPORT
355
        INC a04E9
Ricardo Quesada's avatar
Ricardo Quesada committed
356
        JMP GAME_LOOP
357

Ricardo Quesada's avatar
Ricardo Quesada committed
358
_L00    INC GAME_TICK
Ricardo Quesada's avatar
Ricardo Quesada committed
359
        JSR APPLY_DELTA_MOV
360 361
        JSR s3F24
        JSR TRY_THROW_GRENADE
Ricardo Quesada's avatar
Ricardo Quesada committed
362
        JSR ANIM_ENEMIES
Ricardo Quesada's avatar
actions  
Ricardo Quesada committed
363
        JSR PROCESS_ACTIONS
Ricardo Quesada's avatar
Ricardo Quesada committed
364
        JSR ANIM_HERO
Ricardo Quesada's avatar
Ricardo Quesada committed
365

Ricardo Quesada's avatar
Ricardo Quesada committed
366
        LDA IS_HERO_DEAD
Ricardo Quesada's avatar
Ricardo Quesada committed
367
        BNE HERO_DIED
368
        JSR HANDLE_JOY2
Ricardo Quesada's avatar
Ricardo Quesada committed
369
        LDA IS_ANIM_EXIT_DOOR
Ricardo Quesada's avatar
Ricardo Quesada committed
370
        BNE _L01
371
        JSR CHECK_COLLISION
Ricardo Quesada's avatar
Ricardo Quesada committed
372
_L01    LDA SPRITES_Y00
Ricardo Quesada's avatar
Ricardo Quesada committed
373
        CMP #$5A
Ricardo Quesada's avatar
Ricardo Quesada committed
374
        BNE GAME_LOOP
Ricardo Quesada's avatar
Ricardo Quesada committed
375 376

        LDA #$14     ;Points won after beating lvl
377
        JSR SCORE_ADD
Ricardo Quesada's avatar
Ricardo Quesada committed
378
        LDA LEVEL_NR
379 380
        AND #$03     ;#%00000011
        CMP #$03     ;#%00000011
Ricardo Quesada's avatar
Ricardo Quesada committed
381
        BNE _L02
Ricardo Quesada's avatar
Ricardo Quesada committed
382 383

        ;Play animation at end of Level 3
384
        LDA #$09     ;#%00001001
Ricardo Quesada's avatar
Ricardo Quesada committed
385
        JSR s500F    ;SFX?
Ricardo Quesada's avatar
Ricardo Quesada committed
386
        JSR SET_FORT_ON_FIRE
Ricardo Quesada's avatar
Ricardo Quesada committed
387

Ricardo Quesada's avatar
Ricardo Quesada committed
388
_L02    LDA #$02     ;Song to play (Level complete)
389 390
        JSR MUSIC_INIT
        JSR s1240
Ricardo Quesada's avatar
Ricardo Quesada committed
391 392
        INC LEVEL_NR
        LDA LEVEL_NR
393 394
        AND #$03     ;#%00000011
        CMP #$02     ;#%00000010
Ricardo Quesada's avatar
Ricardo Quesada committed
395
        BNE _L03
Ricardo Quesada's avatar
Ricardo Quesada committed
396
        INC LEVEL_NR
Ricardo Quesada's avatar
Ricardo Quesada committed
397
_L03    JMP START_LEVEL
398

Ricardo Quesada's avatar
Ricardo Quesada committed
399 400
        ; Animate hero "is dead"
HERO_DIED               ;b0953
Ricardo Quesada's avatar
Ricardo Quesada committed
401 402
        LDA IS_HERO_DEAD
        CMP #$02     ;Died of fall in trench/water?
Ricardo Quesada's avatar
Ricardo Quesada committed
403
        BNE _L01
Ricardo Quesada's avatar
Ricardo Quesada committed
404 405

        ; Hero fell down in trench
406 407
        INC COUNTER1
        LDA COUNTER1
408
        CMP #$14     ;#%00010100
Ricardo Quesada's avatar
Ricardo Quesada committed
409
        BCC _L00
410
        CMP #$50     ;#%01010000
Ricardo Quesada's avatar
Ricardo Quesada committed
411
        BCS _L03
Ricardo Quesada's avatar
Ricardo Quesada committed
412 413
        LDA #$CC     ;Hero fall down in trench frame #1
        STA SPRITES_PTR00
Ricardo Quesada's avatar
Ricardo Quesada committed
414
        JMP GAME_LOOP
415

Ricardo Quesada's avatar
Ricardo Quesada committed
416
_L00    LDA #$CB     ;Hero fall down in trench frame #0
Ricardo Quesada's avatar
Ricardo Quesada committed
417
        STA SPRITES_PTR00
Ricardo Quesada's avatar
Ricardo Quesada committed
418
        JMP GAME_LOOP
419

Ricardo Quesada's avatar
Ricardo Quesada committed
420
        ; Hero was shot
Ricardo Quesada's avatar
Ricardo Quesada committed
421
_L01    INC COUNTER1
422
        LDA COUNTER1
423
        CMP #$14     ;#%00010100
Ricardo Quesada's avatar
Ricardo Quesada committed
424
        BCC _L02
425
        CMP #$50     ;#%01010000
Ricardo Quesada's avatar
Ricardo Quesada committed
426
        BCS _L03
Ricardo Quesada's avatar
Ricardo Quesada committed
427
        LDA #$B8     ;Hero was shot: frame #1
Ricardo Quesada's avatar
Ricardo Quesada committed
428
        STA SPRITES_PTR00
Ricardo Quesada's avatar
Ricardo Quesada committed
429
        JMP GAME_LOOP
430

Ricardo Quesada's avatar
Ricardo Quesada committed
431
_L02    LDA #$DD     ;Hero was shot: frame #0
Ricardo Quesada's avatar
Ricardo Quesada committed
432
        STA SPRITES_PTR00
Ricardo Quesada's avatar
Ricardo Quesada committed
433
        JMP GAME_LOOP
434

Ricardo Quesada's avatar
Ricardo Quesada committed
435 436
        ; End of "died" animation. Decrease life.
_L03    DEC LIVES
437 438 439
        JSR SCREEN_REFRESH_LIVES
        LDA LIVES
        BEQ GAME_OVER
Ricardo Quesada's avatar
Ricardo Quesada committed
440
        JMP RESTART
441

Ricardo Quesada's avatar
Ricardo Quesada committed
442
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-;
443 444
GAME_OVER
        LDX #$06     ;#%00000110
445
_L00    TXA
446 447 448 449
        ASL A
        TAY
        LDA SCORE_MSB
        CMP HISCORE_MSB,Y
450 451
        BCC _L04
        BNE _L01
452 453
        LDA SCORE_LSB
        CMP HISCORE_LSB,Y
454 455
        BCC _L04
_L01    TXA
456 457 458 459 460 461 462 463 464 465 466
        ASL A
        TAY
        LDA HISCORE_MSB,Y
        STA f0F38,Y
        LDA HISCORE_LSB,Y
        STA f0F39,Y
        TXA
        ASL A
        ASL A
        ASL A
        TAY
467
_L02    LDA f0EEE,Y
468 469 470 471
        STA f0EF6,Y
        INY
        TYA
        AND #$07     ;#%00000111
472
        BNE _L02
473
        DEX
474
        BPL _L00
475 476 477 478
        LDA SCORE_MSB
        STA HISCORE_MSB
        LDA SCORE_LSB
        STA HISCORE_LSB
Ricardo Quesada's avatar
Ricardo Quesada committed
479
        JSR SCREEN_ENTER_HI_SCORE
480
        LDY #$00     ;#%00000000
481
_L03    LDA a0506,Y
482 483 484
        STA f0EEE,Y
        INY
        CPY #$08     ;#%00001000
485 486
        BNE _L03
        JMP _L07
487

488
_L04    TXA
489 490 491 492 493 494 495
        ASL A
        TAY
        LDA SCORE_MSB
        STA f0F38,Y
        LDA SCORE_LSB
        STA f0F39,Y
        CPX #$06     ;#%00000110
496 497
        BNE _L05
        JMP START
498

499
_L05    TXA
500
        PHA
Ricardo Quesada's avatar
Ricardo Quesada committed
501
        JSR SCREEN_ENTER_HI_SCORE
502 503 504 505 506 507
        PLA
        ASL A
        ASL A
        ASL A
        TAX
        LDY #$00     ;#%00000000
508
_L06    LDA a0506,Y
509 510 511 512
        STA f0EF6,X
        INX
        INY
        CPY #$08     ;#%00001000
513 514 515
        BNE _L06

_L07    JSR CLEANUP_SPRITES
Ricardo Quesada's avatar
Ricardo Quesada committed
516
        JSR DISPLAY_HI_SCORES
517

518
        LDY #$64     ;#%01100100
Ricardo Quesada's avatar
delay  
Ricardo Quesada committed
519
        JSR DELAY
520 521 522

        ; Wait for 255 frames or joystick fire

523
        LDA #$FF     ;#%11111111
524
        STA COUNTER1
525
_L08    LDA $DC00    ;CIA1: Data Port Register A  (fire in Game Over scene)
526
        CMP #$6F     ;#%01101111
527
        BEQ _L09
Ricardo Quesada's avatar
Ricardo Quesada committed
528
        JSR WAIT_RASTER_AT_BOTTOM
529
        DEC COUNTER1
530 531
        BNE _L08
_L09    JMP START
532

533 534
NMI_HANDLER
        RTI
535

Ricardo Quesada's avatar
Ricardo Quesada committed
536 537 538
        ;TODO: This generates small garbage in the top row of the map.
        ;Can be safely removed once we don't care about the generating exaclty
        ;the same binary.
Ricardo Quesada's avatar
Ricardo Quesada committed
539
RESET_ROUTINE       ;$0A4E
540
        .ADDR BOOT, BOOT
Ricardo Quesada's avatar
Ricardo Quesada committed
541
        .BYTE $C3,$C2,$CD,$38,$30
542

Ricardo Quesada's avatar
Ricardo Quesada committed
543
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-;
Ricardo Quesada's avatar
Ricardo Quesada committed
544
; Sets the sight "()" sprite for high scores as sprite $41
Ricardo Quesada's avatar
Ricardo Quesada committed
545
SET_SIGHT_SPRITE    ;$0A57
546 547
        ;TODO: probably it is safe to remove the stop/start timer since
        ;timer is not being used by code, and is already stop
Ricardo Quesada's avatar
Ricardo Quesada committed
548
        LDA $DC0E    ;CIA1: CIA Control Register A
549
        AND #$FE     ;#%11111110 Stop timer
Ricardo Quesada's avatar
Ricardo Quesada committed
550
        STA $DC0E    ;Stop timer
551
        LDA a01
552
        AND #$FB     ;#%11111011    Enabling RAM at $D000 I guess
553
        STA a01
554

Ricardo Quesada's avatar
Ricardo Quesada committed
555 556 557
        LDX #$3F     ;size of sprite
_L00    LDA SIGHT_SPR_DATA,X
        STA fD040,X  ;It will be sprite $41
558
        DEX
Ricardo Quesada's avatar
Ricardo Quesada committed
559
        BPL _L00
560

561
        LDA a01
562
        ORA #$04     ;#%00000100    Enabling I/O at $D000 I guess
563 564
        STA a01
        LDA $DC0E    ;CIA1: CIA Control Register A
565
        ORA #$01     ;#%00000001 Start timer (why ?)
Ricardo Quesada's avatar
Ricardo Quesada committed
566
        STA $DC0E    ;Start Timer
567 568
        RTS

Ricardo Quesada's avatar
Ricardo Quesada committed
569
SIGHT_SPR_DATA      ;$0A7F
Ricardo Quesada's avatar
Ricardo Quesada committed
570
        .BYTE $00,$00,$00,$02,$AA,$00,$0A,$AA
571 572 573 574 575 576 577
        .BYTE $80,$28,$20,$A0,$20,$20,$20,$20
        .BYTE $00,$20,$A0,$00,$28,$80,$00,$08
        .BYTE $80,$20,$08,$80,$20,$08,$A0,$A8
        .BYTE $28,$A0,$A8,$28,$80,$20,$08,$80
        .BYTE $20,$08,$80,$00,$08,$A0,$00,$28
        .BYTE $20,$00,$20,$20,$20,$20,$28,$20
        .BYTE $A0,$0A,$AA,$80,$02,$AA,$00
578

Ricardo Quesada's avatar
Ricardo Quesada committed
579
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-;
580
s0ABE   LDA a0511
581
        BEQ _SKIP
582 583 584 585
        LDY #$00     ;#%00000000
        INC a0512
        LDA a0512
        CMP #$32     ;#%00110010
586
        BEQ _L02
587 588 589 590
        AND #$0F     ;#%00001111
        LSR A
        LSR A
        AND #$03     ;#%00000011
591
        BEQ _L00
592
        AND #$01     ;#%00000001
593
        BNE _L01
594 595 596 597 598 599
        LDA a0510
        CLC
        ADC #$20     ;#%00100000
        STA (pF7),Y
        RTS

600
_L00    LDA a0510
601 602 603
        STA (pF7),Y
        RTS

604
_L01    LDA #$79     ;#%01111001
605 606 607
        STA (pF7),Y
        RTS

608
_L02    LDA #$00     ;#%00000000
609 610 611
        STA a0511
        LDA a0510
        STA (pF7),Y
612
_SKIP   RTS
613

614
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-;
Ricardo Quesada's avatar
Ricardo Quesada committed
615
s0AFA   LDA SPRITES_X_LO05
616 617 618 619 620 621 622 623 624
        AND #$F0     ;#%11110000
        SEC
        SBC #$10     ;#%00010000
        PHP
        LSR A
        LSR A
        LSR A
        PLP
        BCC b0B11
Ricardo Quesada's avatar
Ricardo Quesada committed
625
        LDY SPRITES_X_HI05
626 627 628 629 630 631 632 633
        BEQ b0B11
        CLC
        ADC #$20     ;#%00100000
b0B11   STA a00FB,b
        LDA #$00     ;#%00000000
        STA a00FC,b
        STA a00FD,b
        STA a00FE,b
Ricardo Quesada's avatar
Ricardo Quesada committed
634
        LDA SPRITES_Y05
635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691
        AND #$F0     ;#%11110000
        SEC
        SBC #$2E     ;#%00101110
        LSR A
        LSR A
        LSR A
        PHA
        LSR A
        ROR a00FC,b
        LSR A
        ROR a00FC,b
        LSR A
        ROR a00FC,b
        STA a00FD,b
        PLA
        ASL A
        ROL a00FE,b
        ASL A
        ROL a00FE,b
        ASL A
        ROL a00FE,b
        CLC
        ADC a00FC,b
        STA a00FC,b
        LDA a00FD,b
        ADC a00FE,b
        STA a00FD,b
        LDA a00FC,b
        CLC
        ADC a00FB,b
        STA a00FC,b
        LDA a00FD,b
        ADC #$00     ;#%00000000
        STA a00FD,b
        LDA a00FD,b
        CLC
        ADC #$E0     ;#%11100000
        STA a00FD,b
        LDA a00FC,b
        STA a00F7,b
        LDA a00FD,b
        STA a00F8,b
        SEI
        LDA a01
        AND #$FD     ;#%11111101
        STA a01
        LDY #$00     ;#%00000000
        LDA (pFC),Y
        STA a0510
        LDA a01
        ORA #$02     ;#%00000010
        STA a01
        CLI
        RTS

s0B94   LDA #$64     ;#%01100100
        AND #$F0     ;#%11110000
Ricardo Quesada's avatar
Ricardo Quesada committed
692
        STA SPRITES_X_LO05
693 694
        LDA #$64     ;#%01100100
        AND #$F0     ;#%11110000
Ricardo Quesada's avatar
Ricardo Quesada committed
695
        STA SPRITES_Y05
696
        LDA #$00     ;#%00000000
Ricardo Quesada's avatar
Ricardo Quesada committed
697
        STA SPRITES_X_HI05
698
        LDA #$41     ;#%01000001
Ricardo Quesada's avatar
Ricardo Quesada committed
699
        STA SPRITES_PTR05
Ricardo Quesada's avatar
Ricardo Quesada committed
700
        LDA #$02     ;red
Ricardo Quesada's avatar
Ricardo Quesada committed
701
        STA SPRITES_COLOR05
702
        LDA #$FF     ;#%11111111
Ricardo Quesada's avatar
Ricardo Quesada committed
703
        STA SPRITES_BKG_PRI05
704
        LDA #$01     ;#%00000001
Ricardo Quesada's avatar
Ricardo Quesada committed
705
        STA SPRITES_CLASS05
Ricardo Quesada's avatar
Ricardo Quesada committed
706 707
        LDA SPRITES_X_LO05
        STA SPRITES_X_LO00
708
        LDA #$B4     ;#%10110100
Ricardo Quesada's avatar
Ricardo Quesada committed
709
        STA SPRITES_Y00
710
        LDA #$00     ;#%00000000
Ricardo Quesada's avatar
Ricardo Quesada committed
711
        STA SPRITES_X_HI00
712
        LDA #$98     ;#%10011000
Ricardo Quesada's avatar
Ricardo Quesada committed
713
        STA SPRITES_PTR00
Ricardo Quesada's avatar
Ricardo Quesada committed
714 715
        LDA #$06     ;blue
        STA SPRITES_COLOR00
716
        LDA #$00     ;#%00000000
Ricardo Quesada's avatar
Ricardo Quesada committed
717
        STA SPRITES_BKG_PRI00
718
        LDA #$01     ;#%00000001
Ricardo Quesada's avatar
Ricardo Quesada committed
719
        STA SPRITES_CLASS00
720 721
        LDX #$07     ;#%00000111
        LDA #$00     ;#%00000000
722
b0BE3   STA a0506,X
723 724 725 726 727 728
        DEX
        BPL b0BE3
        LDA #$00     ;#%00000000
        STA a0505
        STA a050F
        STA a0511
Ricardo Quesada's avatar
Ricardo Quesada committed
729
        LDA #<pE000  ;Screen RAM lo
730
        STA a00F7,b
Ricardo Quesada's avatar
Ricardo Quesada committed
731
        LDA #>pE000  ;Screen RAM hi
732 733 734
        STA a00F8,b
        LDA #$20     ;#%00100000
        STA a0510
Ricardo Quesada's avatar
Ricardo Quesada committed
735
        JSR APPLY_DELTA_MOV
736 737 738 739 740
        JSR s3F24
        RTS

;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-;
HISCORE_READ_JOY
Ricardo Quesada's avatar
Ricardo Quesada committed
741
        LDA $DC00    ;CIA1: Data Port Register A  (enter high score)
742 743
        AND #$01     ;#%00000001
        BNE b0C1D
Ricardo Quesada's avatar
Ricardo Quesada committed
744
        LDA SPRITES_Y05
745 746 747
        CMP #$64     ;#%01100100
        BCC b0C1D
        LDA #$FE     ;#%11111110
Ricardo Quesada's avatar
Ricardo Quesada committed
748
        STA SPRITES_DELTA_Y05
Ricardo Quesada's avatar
Ricardo Quesada committed
749
b0C1D   LDA $DC00    ;CIA1: Data Port Register A (enter high score)
750 751
        AND #$02     ;#%00000010
        BNE b0C30
Ricardo Quesada's avatar
Ricardo Quesada committed
752
        LDA SPRITES_Y05
753 754 755
        CMP #$78     ;#%01111000
        BCS b0C30
        LDA #$02     ;#%00000010
Ricardo Quesada's avatar
Ricardo Quesada committed
756
        STA SPRITES_DELTA_Y05
Ricardo Quesada's avatar
Ricardo Quesada committed
757
b0C30   LDA $DC00    ;CIA1: Data Port Register A (enter high score)
758 759
        AND #$04     ;#%00000100
        BNE b0C43
Ricardo Quesada's avatar
Ricardo Quesada committed
760
        LDA SPRITES_X_LO05
761 762 763
        CMP #$64     ;#%01100100
        BCC b0C43
        LDA #$FE     ;#%11111110
Ricardo Quesada's avatar
Ricardo Quesada committed
764
        STA SPRITES_DELTA_X05
Ricardo Quesada's avatar
Ricardo Quesada committed
765
b0C43   LDA $DC00    ;CIA1: Data Port Register A (enter high score)
766 767
        AND #$08     ;#%00001000
        BNE b0C56
Ricardo Quesada's avatar
Ricardo Quesada committed
768
        LDA SPRITES_X_LO05
769 770 771
        CMP #$F0     ;#%11110000
        BCS b0C56
        LDA #$02     ;#%00000010
Ricardo Quesada's avatar
Ricardo Quesada committed
772
        STA SPRITES_DELTA_X05
Ricardo Quesada's avatar
Ricardo Quesada committed
773 774
b0C56   LDA SPRITES_X_LO05
        STA SPRITES_X_LO00
775 776 777 778 779
        AND #$1F     ;#%00011111
        LSR A
        LSR A
        LSR A
        TAY
Ricardo Quesada's avatar
Ricardo Quesada committed
780
        LDA HERO_FRAMES_UP,Y
Ricardo Quesada's avatar
Ricardo Quesada committed
781
        STA SPRITES_PTR00
Ricardo Quesada's avatar
Ricardo Quesada committed
782 783
        LDA SPRITES_X_HI05
        STA SPRITES_X_HI00
784 785
        RTS

Ricardo Quesada's avatar
Ricardo Quesada committed
786
s0C6F   LDA SPRITES_X_LO05
787 788 789
        AND #$0F     ;#%00001111
        BNE b0C7B
        LDA #$00     ;#%00000000
Ricardo Quesada's avatar
Ricardo Quesada committed
790 791
        STA SPRITES_DELTA_X05
b0C7B   LDA SPRITES_Y05
792 793 794
        AND #$0F     ;#%00001111
        BNE b0C87
        LDA #$00     ;#%00000000
Ricardo Quesada's avatar
Ricardo Quesada committed
795
        STA SPRITES_DELTA_Y05
796 797
b0C87   RTS

Ricardo Quesada's avatar
Ricardo Quesada committed
798
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-;
Ricardo Quesada's avatar
Ricardo Quesada committed
799
SCREEN_ENTER_HI_SCORE   ;$0C88
Ricardo Quesada's avatar
Ricardo Quesada committed
800
        LDA #$01     ;Song to play (high scores)
801
        JSR MUSIC_INIT
Ricardo Quesada's avatar
Ricardo Quesada committed
802
        JSR CLEAR_SCREEN
Ricardo Quesada's avatar
Ricardo Quesada committed
803
        JSR CLEANUP_SPRITES
804
        LDA #$00     ;#%00000000
Ricardo Quesada's avatar
Ricardo Quesada committed
805
        STA V_SCROLL_DELTA
806
        STA V_SCROLL_BIT_IDX
Ricardo Quesada's avatar
Ricardo Quesada committed
807
        STA BKG_COLOR0
808
        LDA #$02     ;#%00000010
Ricardo Quesada's avatar
Ricardo Quesada committed
809
        STA LEVEL_NR
Ricardo Quesada's avatar
Ricardo Quesada committed
810
        LDA #<pE082  ;Screen RAM Lo
811
        STA a00FB,b
Ricardo Quesada's avatar
Ricardo Quesada committed
812
        LDA #>pE082  ;Screen RAM Hi
813
        STA a00FC,b
Ricardo Quesada's avatar
Ricardo Quesada committed
814
        LDA #<pD882  ;Color RAM Lo
815
        STA a00FD,b
Ricardo Quesada's avatar
Ricardo Quesada committed
816
        LDA #>pD882  ;Color RAM Hi
817 818 819 820
        STA a00FE,b
        LDX #$00     ;#%00000000
j0CB9   LDY #$00     ;#%00000000
j0CBB   LDA f0D09,X
Ricardo Quesada's avatar
Ricardo Quesada committed
821
        CMP #$FF     ;End of line?
822
        BEQ b0CD1
Ricardo Quesada's avatar
Ricardo Quesada committed
823
        CMP #$FE     ;Finish printing?
824 825 826 827 828 829 830 831 832 833 834
        BEQ b0CE9
        STA (pFB),Y
        LDA #$01     ;#%00000001
        STA (pFD),Y
        INX
        INY
        JMP j0CBB

b0CD1   INX
        LDA a00FB,b
        CLC
Ricardo Quesada's avatar
Ricardo Quesada committed
835
        ADC #$28     ;Put "cursor" in next line
836 837 838 839 840 841 842 843
        STA a00FB,b
        STA a00FD,b
        BCC b0CE6
        INC a00FC,b
        INC a00FE,b
b0CE6   JMP j0CB9

b0CE9   JSR s0B94
Ricardo Quesada's avatar
Ricardo Quesada committed
844
b0CEC   JSR WAIT_RASTER_AT_BOTTOM
845 846 847
        JSR HISCORE_READ_JOY
        JSR s0D59
        JSR s0ABE