main.asm 202 KB
Newer Older
Ricardo Quesada's avatar
Ricardo Quesada committed
1 2 3 4
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-;
; Main routine
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-;

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
;
; **** 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
33
p22 = $22                       ;sprite to create: X lo
Ricardo Quesada's avatar
Ricardo Quesada committed
34
p24 = $24                       ;rows that trigger sprite type init
Ricardo Quesada's avatar
Ricardo Quesada committed
35
p26 = $26                       ;sprite to create: X hi
Ricardo Quesada's avatar
Ricardo Quesada committed
36
p28 = $28                       ;what sprite type to create at row
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
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
f00A2 = $00A2
fD040 = $D040
fDB48 = $DB48
fDB98 = $DB98
fDBDA = $DBDA
fE087 = $E087
fE348 = $E348
fE398 = $E398
fE3F8 = $E3F8
fE6DC = $E6DC
fEFBA = $EFBA
;
; **** ABSOLUTE ADRESSES ****
;
a0014 = $0014
Ricardo Quesada's avatar
Ricardo Quesada committed
67
a0019 = $0019                   ;Stores current hero animation, but seems unused
68 69 70 71 72 73 74 75 76 77 78 79 80 81
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
82 83
a004B = $004B                   ;4b-5a Related to sprite Y pos, used in raster multiplexer
a004C = $004C
84 85 86 87 88 89 90 91 92 93
a004E = $004E
a0053 = $0053
a0054 = $0054
a0055 = $0055
a0056 = $0056
a0057 = $0057
a0058 = $0058
a0059 = $0059
a005A = $005A
a00A7 = $00A7
94
VIC_SPRITE_IDX = $00A8          ;Index used for sprite pos (e.g: $D000,idx) in raster intr.
95 96 97 98 99 100 101 102 103 104
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 147 148
SPRITES_TYPE00 = $048D
SPRITES_TYPE01 = $048E
SPRITES_TYPE04 = $0491
SPRITES_TYPE05 = $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 153
a04A1 = $04A1                   ;Used to link sprites together (?)
a04AC = $04AC                   ;Used as index to delta_tbl, and index to anim frames (?)
Ricardo Quesada's avatar
Ricardo Quesada committed
154
SPRITES_TICK05 = $04B7
155
SPRITES_RASTER_Y00 = $04C2      ;Raster Intr. uses values from here instead of SPRITES_Y00
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
a0504 = $0504
Ricardo Quesada's avatar
Ricardo Quesada committed
188
HISCORE_IS_BULLET_ANIM = $0505  ;1: if the bullet in hiscore is being animated
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
189 190 191
HISCORE_NAME = $0506            ;8 chars reserved for the hiscore name ($0506-$050E)
HISCORE_NAME_IDX = $050F        ;Index to the hiscore name
HISCORE_SELECTED_CHAR = $0510   ;Selected char in hiscore
Ricardo Quesada's avatar
Ricardo Quesada committed
192 193
HISCORE_IS_CHAR_ANIM = $0511    ;1: if the selected char in hiscore is being animated
HISCORE_ANIM_CHAR_COUNTER = $0512       ;Counter to the selected char animation in hiscore
194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
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
Ricardo Quesada's avatar
random  
Ricardo Quesada committed
292
        JSR INIT_RANDOM
293 294 295

        ; Sprite Y pos used in raster multiplexer
        LDX #$10
296
_L01    TXA
297
        STA a004B,b,X
298
        DEX
299
        BPL _L01
300

301 302 303
        LDA #$00     ;#%00000000
        STA a0502
        STA a0501
304 305 306

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

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

Ricardo Quesada's avatar
Ricardo Quesada committed
317
        JSR s5006    ;Music stop?
318 319 320
        LDA #$00     ;#%00000000
        STA SCORE_LSB
        STA SCORE_MSB
321
        STA V_SCROLL_BIT_IDX
Ricardo Quesada's avatar
Ricardo Quesada committed
322
        STA LEVEL_NR
323 324 325 326 327 328
        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
329
START_LEVEL          ;$08B8
Ricardo Quesada's avatar
Ricardo Quesada committed
330
        LDA #$A5     ;#%10100101
331
        STA V_SCROLL_ROW_IDX
332 333
        LDA #$00     ;Song to play (main theme)
        JSR MUSIC_INIT
Ricardo Quesada's avatar
Ricardo Quesada committed
334 335

        ; Restart after life lost
Ricardo Quesada's avatar
Ricardo Quesada committed
336 337
RESTART
        JSR SETUP_LEVEL
338
        JSR SETUP_SCREEN
339
        JSR SETUP_IRQ
Ricardo Quesada's avatar
Ricardo Quesada committed
340 341

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

Ricardo Quesada's avatar
Ricardo Quesada committed
361
_L00    INC GAME_TICK
Ricardo Quesada's avatar
Ricardo Quesada committed
362
        JSR APPLY_DELTA_MOV
363 364
        JSR s3F24
        JSR TRY_THROW_GRENADE
Ricardo Quesada's avatar
Ricardo Quesada committed
365
        JSR ANIM_ENEMIES
366
        JSR RUN_ACTIONS
Ricardo Quesada's avatar
Ricardo Quesada committed
367
        JSR ANIM_HERO
Ricardo Quesada's avatar
Ricardo Quesada committed
368

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

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

        ;Play animation at end of Level 3
387
        LDA #$09     ;#%00001001
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
388
        JSR SFX_PLAY
Ricardo Quesada's avatar
Ricardo Quesada committed
389
        JSR SET_FORT_ON_FIRE
Ricardo Quesada's avatar
Ricardo Quesada committed
390

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

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

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

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

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

Ricardo Quesada's avatar
Ricardo Quesada committed
434
_L02    LDA #$DD     ;Hero was shot: frame #0
Ricardo Quesada's avatar
Ricardo Quesada committed
435
        STA SPRITES_PTR00
Ricardo Quesada's avatar
Ricardo Quesada committed
436
        JMP GAME_LOOP
437

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

Ricardo Quesada's avatar
Ricardo Quesada committed
445
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-;
446 447
GAME_OVER
        LDX #$06     ;#%00000110
448
_L00    TXA
449 450 451
        ASL A
        TAY
        LDA SCORE_MSB
Ricardo Quesada's avatar
Ricardo Quesada committed
452
        CMP HISCORE_LSB00,Y
453 454
        BCC _L04
        BNE _L01
455
        LDA SCORE_LSB
Ricardo Quesada's avatar
Ricardo Quesada committed
456
        CMP HISCORE_MSB00,Y
457 458
        BCC _L04
_L01    TXA
459 460
        ASL A
        TAY
Ricardo Quesada's avatar
Ricardo Quesada committed
461 462 463 464
        LDA HISCORE_LSB00,Y
        STA HISCORE_LSB01,Y
        LDA HISCORE_MSB00,Y
        STA HISCORE_MSB01,Y
465 466 467 468 469
        TXA
        ASL A
        ASL A
        ASL A
        TAY
Ricardo Quesada's avatar
Ricardo Quesada committed
470 471
_L02    LDA HISCORE_NAME00,Y
        STA HISCORE_NAME01,Y
472 473 474
        INY
        TYA
        AND #$07     ;#%00000111
475
        BNE _L02
476
        DEX
477
        BPL _L00
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
478

479
        LDA SCORE_MSB
Ricardo Quesada's avatar
Ricardo Quesada committed
480
        STA HISCORE_LSB00
481
        LDA SCORE_LSB
Ricardo Quesada's avatar
Ricardo Quesada committed
482
        STA HISCORE_MSB00
Ricardo Quesada's avatar
Ricardo Quesada committed
483
        JSR SCREEN_ENTER_HI_SCORE
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
484 485 486

        LDY #$00
_L03    LDA HISCORE_NAME,Y
Ricardo Quesada's avatar
Ricardo Quesada committed
487
        STA HISCORE_NAME00,Y
488
        INY
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
489
        CPY #$08
490 491
        BNE _L03
        JMP _L07
492

493
_L04    TXA
494 495 496
        ASL A
        TAY
        LDA SCORE_MSB
Ricardo Quesada's avatar
Ricardo Quesada committed
497
        STA HISCORE_LSB01,Y
498
        LDA SCORE_LSB
Ricardo Quesada's avatar
Ricardo Quesada committed
499
        STA HISCORE_MSB01,Y
500
        CPX #$06     ;#%00000110
501 502
        BNE _L05
        JMP START
503

504
_L05    TXA
505
        PHA
Ricardo Quesada's avatar
Ricardo Quesada committed
506
        JSR SCREEN_ENTER_HI_SCORE
507 508 509 510 511 512
        PLA
        ASL A
        ASL A
        ASL A
        TAX
        LDY #$00     ;#%00000000
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
513
_L06    LDA HISCORE_NAME,Y
Ricardo Quesada's avatar
Ricardo Quesada committed
514
        STA HISCORE_NAME01,X
515 516 517
        INX
        INY
        CPY #$08     ;#%00001000
518 519 520
        BNE _L06

_L07    JSR CLEANUP_SPRITES
Ricardo Quesada's avatar
Ricardo Quesada committed
521
        JSR DISPLAY_HI_SCORES
522

523
        LDY #$64     ;#%01100100
Ricardo Quesada's avatar
delay  
Ricardo Quesada committed
524
        JSR DELAY
525 526 527

        ; Wait for 255 frames or joystick fire

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

538 539
NMI_HANDLER
        RTI
540

Ricardo Quesada's avatar
Ricardo Quesada committed
541 542 543
        ;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
544
RESET_ROUTINE       ;$0A4E
545
        .ADDR BOOT, BOOT
Ricardo Quesada's avatar
Ricardo Quesada committed
546
        .BYTE $C3,$C2,$CD,$38,$30
547

Ricardo Quesada's avatar
Ricardo Quesada committed
548
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-;
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
549
; Sets the sight "()" sprite for high scores as sprite $41 (@ $D040)
Ricardo Quesada's avatar
Ricardo Quesada committed
550
SET_SIGHT_SPRITE    ;$0A57
551 552
        ;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
553
        LDA $DC0E    ;CIA1: CIA Control Register A
554
        AND #$FE     ;#%11111110 Stop timer
Ricardo Quesada's avatar
Ricardo Quesada committed
555
        STA $DC0E    ;Stop timer
556
        LDA a01
557
        AND #$FB     ;#%11111011    Enabling RAM at $D000 I guess
558
        STA a01
559

Ricardo Quesada's avatar
Ricardo Quesada committed
560 561 562
        LDX #$3F     ;size of sprite
_L00    LDA SIGHT_SPR_DATA,X
        STA fD040,X  ;It will be sprite $41
563
        DEX
Ricardo Quesada's avatar
Ricardo Quesada committed
564
        BPL _L00
565

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

Ricardo Quesada's avatar
Ricardo Quesada committed
574
SIGHT_SPR_DATA      ;$0A7F
Ricardo Quesada's avatar
Ricardo Quesada committed
575
        .BYTE $00,$00,$00,$02,$AA,$00,$0A,$AA
576 577 578 579 580 581 582
        .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
583

Ricardo Quesada's avatar
Ricardo Quesada committed
584
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-;
Ricardo Quesada's avatar
Ricardo Quesada committed
585 586 587
; Animates the selected char in hiscore
HISCORE_ANIM_CHAR       ;$0ABE
        LDA HISCORE_IS_CHAR_ANIM
588
        BEQ _SKIP
Ricardo Quesada's avatar
Ricardo Quesada committed
589

590
        LDY #$00     ;#%00000000
Ricardo Quesada's avatar
Ricardo Quesada committed
591 592
        INC HISCORE_ANIM_CHAR_COUNTER
        LDA HISCORE_ANIM_CHAR_COUNTER
593
        CMP #$32     ;#%00110010
594
        BEQ _L02
595 596 597
        AND #$0F     ;#%00001111
        LSR A
        LSR A
Ricardo Quesada's avatar
Ricardo Quesada committed
598
        AND #$03
599
        BEQ _L00
Ricardo Quesada's avatar
Ricardo Quesada committed
600
        AND #$01
601
        BNE _L01
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
602
        LDA HISCORE_SELECTED_CHAR
603
        CLC
Ricardo Quesada's avatar
Ricardo Quesada committed
604
        ADC #$20     ;Select the flipped char
605 606 607
        STA (pF7),Y
        RTS

Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
608
_L00    LDA HISCORE_SELECTED_CHAR
609 610 611
        STA (pF7),Y
        RTS

Ricardo Quesada's avatar
Ricardo Quesada committed
612
_L01    LDA #$79     ;Select the regular char
613 614 615
        STA (pF7),Y
        RTS

616
_L02    LDA #$00     ;#%00000000
Ricardo Quesada's avatar
Ricardo Quesada committed
617
        STA HISCORE_IS_CHAR_ANIM
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
618
        LDA HISCORE_SELECTED_CHAR
619
        STA (pF7),Y
620
_SKIP   RTS
621

622
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-;
Ricardo Quesada's avatar
Ricardo Quesada committed
623 624 625
; Get the selected char with the sight in the hiscore scene
HISCORE_GET_SELECTED_CHAR       ;$0AFA
        LDA SPRITES_X_LO05
626 627 628 629 630 631 632 633
        AND #$F0     ;#%11110000
        SEC
        SBC #$10     ;#%00010000
        PHP
        LSR A
        LSR A
        LSR A
        PLP
Ricardo Quesada's avatar
Ricardo Quesada committed
634
        BCC _L00
Ricardo Quesada's avatar
Ricardo Quesada committed
635
        LDY SPRITES_X_HI05
Ricardo Quesada's avatar
Ricardo Quesada committed
636
        BEQ _L00
637 638
        CLC
        ADC #$20     ;#%00100000
Ricardo Quesada's avatar
Ricardo Quesada committed
639
_L00    STA a00FB,b
640 641 642 643
        LDA #$00     ;#%00000000
        STA a00FC,b
        STA a00FD,b
        STA a00FE,b
Ricardo Quesada's avatar
Ricardo Quesada committed
644
        LDA SPRITES_Y05
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
        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
Ricardo Quesada's avatar
Ricardo Quesada committed
689
        AND #$FD     ;Enable I/O to read from Screen RAM
690
        STA a01
Ricardo Quesada's avatar
Ricardo Quesada committed
691

692 693
        LDY #$00     ;#%00000000
        LDA (pFC),Y
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
694
        STA HISCORE_SELECTED_CHAR
Ricardo Quesada's avatar
Ricardo Quesada committed
695

696
        LDA a01
Ricardo Quesada's avatar
Ricardo Quesada committed
697
        ORA #$02
698
        STA a01
Ricardo Quesada's avatar
Ricardo Quesada committed
699

700 701 702
        CLI
        RTS

Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
703 704 705 706 707
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-;
; Sets up the hero and sight sprite, and cleans up name and other vars
HISCORE_SETUP_SPRITES   ;$0B94
        ; Sight sprite
        LDA #$64     ;#%01100100
708
        AND #$F0     ;#%11110000
Ricardo Quesada's avatar
Ricardo Quesada committed
709
        STA SPRITES_X_LO05
710 711
        LDA #$64     ;#%01100100
        AND #$F0     ;#%11110000
Ricardo Quesada's avatar
Ricardo Quesada committed
712
        STA SPRITES_Y05
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
713
        LDA #$00
Ricardo Quesada's avatar
Ricardo Quesada committed
714
        STA SPRITES_X_HI05
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
715
        LDA #$41     ;sight sprite
Ricardo Quesada's avatar
Ricardo Quesada committed
716
        STA SPRITES_PTR05
Ricardo Quesada's avatar
Ricardo Quesada committed
717
        LDA #$02     ;red
Ricardo Quesada's avatar
Ricardo Quesada committed
718
        STA SPRITES_COLOR05
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
719
        LDA #$FF
Ricardo Quesada's avatar
Ricardo Quesada committed
720
        STA SPRITES_BKG_PRI05
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
721
        LDA #$01
Ricardo Quesada's avatar
Ricardo Quesada committed
722
        STA SPRITES_TYPE05
Ricardo Quesada's avatar
Ricardo Quesada committed
723
        LDA SPRITES_X_LO05
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
724 725

        ; Hero sprite
Ricardo Quesada's avatar
Ricardo Quesada committed
726
        STA SPRITES_X_LO00
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
727
        LDA #$B4
Ricardo Quesada's avatar
Ricardo Quesada committed
728
        STA SPRITES_Y00
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
729
        LDA #$00
Ricardo Quesada's avatar
Ricardo Quesada committed
730
        STA SPRITES_X_HI00
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
731
        LDA #$98     ;Hero going up
Ricardo Quesada's avatar
Ricardo Quesada committed
732
        STA SPRITES_PTR00
Ricardo Quesada's avatar
Ricardo Quesada committed
733 734
        LDA #$06     ;blue
        STA SPRITES_COLOR00
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
735
        LDA #$00
Ricardo Quesada's avatar
Ricardo Quesada committed
736
        STA SPRITES_BKG_PRI00
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
737
        LDA #$01
Ricardo Quesada's avatar
Ricardo Quesada committed
738
        STA SPRITES_TYPE00
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
739

Ricardo Quesada's avatar
Ricardo Quesada committed
740 741
        LDX #$07
        LDA #$00
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
742
_L00    STA HISCORE_NAME,X
743
        DEX
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
744 745
        BPL _L00

Ricardo Quesada's avatar
Ricardo Quesada committed
746 747
        LDA #$00
        STA HISCORE_IS_BULLET_ANIM
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
748
        STA HISCORE_NAME_IDX
Ricardo Quesada's avatar
Ricardo Quesada committed
749
        STA HISCORE_IS_CHAR_ANIM
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
750 751 752

        ; $F7/$F8 -> Screen RAM
        LDA #<pE000
753
        STA a00F7,b
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
754
        LDA #>pE000
755
        STA a00F8,b
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
756 757 758

        LDA #$20
        STA HISCORE_SELECTED_CHAR
Ricardo Quesada's avatar
Ricardo Quesada committed
759
        JSR APPLY_DELTA_MOV
760 761 762 763
        JSR s3F24
        RTS

;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-;
Ricardo Quesada's avatar
Ricardo Quesada committed
764 765 766 767
HISCORE_READ_JOY_MOV
        LDA $DC00
        AND #$01     ;#%00000001        up?
        BNE _L00
Ricardo Quesada's avatar
Ricardo Quesada committed
768
        LDA SPRITES_Y05
Ricardo Quesada's avatar
Ricardo Quesada committed
769 770 771
        CMP #$64     ;reached top?
        BCC _L00
        LDA #$FE     ;2 pixels up
Ricardo Quesada's avatar
Ricardo Quesada committed
772
        STA SPRITES_DELTA_Y05
Ricardo Quesada's avatar
Ricardo Quesada committed
773 774 775 776

_L00    LDA $DC00
        AND #$02     ;#%00000010        down?
        BNE _L01
Ricardo Quesada's avatar
Ricardo Quesada committed
777
        LDA SPRITES_Y05
Ricardo Quesada's avatar
Ricardo Quesada committed
778 779 780
        CMP #$78     ;reached bottom?
        BCS _L01
        LDA #$02     ;2 pixels down
Ricardo Quesada's avatar
Ricardo Quesada committed
781
        STA SPRITES_DELTA_Y05
Ricardo Quesada's avatar
Ricardo Quesada committed
782 783 784 785

_L01    LDA $DC00    ;CIA1: Data Port Register A (enter high score)
        AND #$04     ;#%00000100        left?
        BNE _L02
Ricardo Quesada's avatar
Ricardo Quesada committed
786
        LDA SPRITES_X_LO05
Ricardo Quesada's avatar
Ricardo Quesada committed
787 788 789
        CMP #$64     ;reached margin left?
        BCC _L02
        LDA #$FE     ;2 pixels to left
Ricardo Quesada's avatar
Ricardo Quesada committed
790
        STA SPRITES_DELTA_X05
Ricardo Quesada's avatar
Ricardo Quesada committed
791 792 793 794

_L02    LDA $DC00
        AND #$08     ;#%00001000        right?
        BNE _L03
Ricardo Quesada's avatar
Ricardo Quesada committed
795
        LDA SPRITES_X_LO05
Ricardo Quesada's avatar
Ricardo Quesada committed
796 797 798
        CMP #$F0     ;reached margin right?
        BCS _L03
        LDA #$02     ;2 pixels to right
Ricardo Quesada's avatar
Ricardo Quesada committed
799
        STA SPRITES_DELTA_X05
Ricardo Quesada's avatar