main.asm 205 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
        ;riq
Ricardo Quesada's avatar
Ricardo Quesada committed
330 331
        ;lda #3
        ;sta LEVEL_NR
Ricardo Quesada's avatar
Ricardo Quesada committed
332

Ricardo Quesada's avatar
Ricardo Quesada committed
333
START_LEVEL          ;$08B8
Ricardo Quesada's avatar
Ricardo Quesada committed
334
        LDA #$A5     ;#%10100101
335
        STA V_SCROLL_ROW_IDX
336 337
        LDA #$00     ;Song to play (main theme)
        JSR MUSIC_INIT
Ricardo Quesada's avatar
Ricardo Quesada committed
338 339

        ; Restart after life lost
Ricardo Quesada's avatar
Ricardo Quesada committed
340 341
RESTART
        JSR SETUP_LEVEL
342
        JSR SETUP_SCREEN
343
        JSR SETUP_IRQ
Ricardo Quesada's avatar
Ricardo Quesada committed
344 345

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

Ricardo Quesada's avatar
Ricardo Quesada committed
365
_L00    INC GAME_TICK
Ricardo Quesada's avatar
Ricardo Quesada committed
366
        JSR APPLY_DELTA_MOV
367 368
        JSR s3F24
        JSR TRY_THROW_GRENADE
Ricardo Quesada's avatar
Ricardo Quesada committed
369
        JSR ANIM_ENEMIES
370
        JSR RUN_ACTIONS
Ricardo Quesada's avatar
Ricardo Quesada committed
371
        JSR ANIM_HERO
Ricardo Quesada's avatar
Ricardo Quesada committed
372

Ricardo Quesada's avatar
Ricardo Quesada committed
373
        LDA IS_HERO_DEAD
Ricardo Quesada's avatar
Ricardo Quesada committed
374
        BNE HERO_DIED
375
        JSR HANDLE_JOY2
Ricardo Quesada's avatar
Ricardo Quesada committed
376
        LDA IS_ANIM_EXIT_DOOR
Ricardo Quesada's avatar
Ricardo Quesada committed
377
        BNE _L01
378
        JSR CHECK_COLLISION
Ricardo Quesada's avatar
Ricardo Quesada committed
379
_L01    LDA SPRITES_Y00
Ricardo Quesada's avatar
Ricardo Quesada committed
380
        CMP #$5A
Ricardo Quesada's avatar
Ricardo Quesada committed
381
        BNE GAME_LOOP
Ricardo Quesada's avatar
Ricardo Quesada committed
382 383

        LDA #$14     ;Points won after beating lvl
384
        JSR SCORE_ADD
Ricardo Quesada's avatar
Ricardo Quesada committed
385
        LDA LEVEL_NR
386 387
        AND #$03     ;#%00000011
        CMP #$03     ;#%00000011
Ricardo Quesada's avatar
Ricardo Quesada committed
388
        BNE _L02
Ricardo Quesada's avatar
Ricardo Quesada committed
389 390

        ;Play animation at end of Level 3
391
        LDA #$09     ;#%00001001
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
392
        JSR SFX_PLAY
Ricardo Quesada's avatar
Ricardo Quesada committed
393
        JSR SET_FORT_ON_FIRE
Ricardo Quesada's avatar
Ricardo Quesada committed
394

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

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

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

Ricardo Quesada's avatar
Ricardo Quesada committed
423
_L00    LDA #$CB     ;Hero fall down in trench frame #0
Ricardo Quesada's avatar
Ricardo Quesada committed
424
        STA SPRITES_PTR00
Ricardo Quesada's avatar
Ricardo Quesada committed
425
        JMP GAME_LOOP
426

Ricardo Quesada's avatar
Ricardo Quesada committed
427
        ; Hero was shot
Ricardo Quesada's avatar
Ricardo Quesada committed
428
_L01    INC COUNTER1
429
        LDA COUNTER1
430
        CMP #$14     ;#%00010100
Ricardo Quesada's avatar
Ricardo Quesada committed
431
        BCC _L02
432
        CMP #$50     ;#%01010000
Ricardo Quesada's avatar
Ricardo Quesada committed
433
        BCS _L03
Ricardo Quesada's avatar
Ricardo Quesada committed
434
        LDA #$B8     ;Hero was shot: frame #1
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
_L02    LDA #$DD     ;Hero was shot: frame #0
Ricardo Quesada's avatar
Ricardo Quesada committed
439
        STA SPRITES_PTR00
Ricardo Quesada's avatar
Ricardo Quesada committed
440
        JMP GAME_LOOP
441

Ricardo Quesada's avatar
Ricardo Quesada committed
442 443
        ; End of "died" animation. Decrease life.
_L03    DEC LIVES
444 445 446
        JSR SCREEN_REFRESH_LIVES
        LDA LIVES
        BEQ GAME_OVER
Ricardo Quesada's avatar
Ricardo Quesada committed
447
        JMP RESTART
448

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

483
        LDA SCORE_MSB
Ricardo Quesada's avatar
Ricardo Quesada committed
484
        STA HISCORE_LSB00
485
        LDA SCORE_LSB
Ricardo Quesada's avatar
Ricardo Quesada committed
486
        STA HISCORE_MSB00
Ricardo Quesada's avatar
Ricardo Quesada committed
487
        JSR SCREEN_ENTER_HI_SCORE
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
488 489 490

        LDY #$00
_L03    LDA HISCORE_NAME,Y
Ricardo Quesada's avatar
Ricardo Quesada committed
491
        STA HISCORE_NAME00,Y
492
        INY
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
493
        CPY #$08
494 495
        BNE _L03
        JMP _L07
496

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

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

_L07    JSR CLEANUP_SPRITES
Ricardo Quesada's avatar
Ricardo Quesada committed
525
        JSR DISPLAY_HI_SCORES
526

527
        LDY #$64     ;#%01100100
Ricardo Quesada's avatar
delay  
Ricardo Quesada committed
528
        JSR DELAY
529 530 531

        ; Wait for 255 frames or joystick fire

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

542 543
NMI_HANDLER
        RTI
544

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

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

Ricardo Quesada's avatar
Ricardo Quesada committed
564 565 566
        LDX #$3F     ;size of sprite
_L00    LDA SIGHT_SPR_DATA,X
        STA fD040,X  ;It will be sprite $41
567
        DEX
Ricardo Quesada's avatar
Ricardo Quesada committed
568
        BPL _L00
569

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

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

Ricardo Quesada's avatar
Ricardo Quesada committed
588
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-;
Ricardo Quesada's avatar
Ricardo Quesada committed
589 590 591
; Animates the selected char in hiscore
HISCORE_ANIM_CHAR       ;$0ABE
        LDA HISCORE_IS_CHAR_ANIM
592
        BEQ _SKIP
Ricardo Quesada's avatar
Ricardo Quesada committed
593

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

Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
612
_L00    LDA HISCORE_SELECTED_CHAR
613 614 615
        STA (pF7),Y
        RTS

Ricardo Quesada's avatar
Ricardo Quesada committed
616
_L01    LDA #$79     ;Select the regular char
617 618 619
        STA (pF7),Y
        RTS

620
_L02    LDA #$00     ;#%00000000
Ricardo Quesada's avatar
Ricardo Quesada committed
621
        STA HISCORE_IS_CHAR_ANIM
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
622
        LDA HISCORE_SELECTED_CHAR
623
        STA (pF7),Y
624
_SKIP   RTS
625

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

696 697
        LDY #$00     ;#%00000000
        LDA (pFC),Y
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
698
        STA HISCORE_SELECTED_CHAR
Ricardo Quesada's avatar
Ricardo Quesada committed
699

700
        LDA a01
Ricardo Quesada's avatar
Ricardo Quesada committed
701
        ORA #$02
702
        STA a01
Ricardo Quesada's avatar
Ricardo Quesada committed
703

704 705 706
        CLI
        RTS

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

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

Ricardo Quesada's avatar
Ricardo Quesada committed
744 745
        LDX #$07
        LDA #$00
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
746
_L00    STA HISCORE_NAME,X
747
        DEX
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
748 749
        BPL _L00

Ricardo Quesada's avatar
Ricardo Quesada committed
750 751
        LDA #$00
        STA HISCORE_IS_BULLET_ANIM
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
752
        STA HISCORE_NAME_IDX
Ricardo Quesada's avatar
Ricardo Quesada committed
753
        STA HISCORE_IS_CHAR_ANIM
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
754 755 756

        ; $F7/$F8 -> Screen RAM
        LDA #<pE000
757
        STA a00F7,b
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
758
        LDA #>pE000
759
        STA a00F8,b
Ricardo Quesada's avatar
hiscore  
Ricardo Quesada committed
760 761 762

        LDA #$20
        STA HISCORE_SELECTED_CHAR
Ricardo Quesada's avatar
Ricardo Quesada committed
763
        JSR APPLY_DELTA_MOV
764 765 766 767
        JSR s3F24
        RTS

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

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

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

_L02    LDA $DC00
        AND #$08     ;#%00001000        right?
        BNE _L03
Ricardo Quesada's avatar
Ricardo Quesada committed
799
        LDA SPRITES_X_LO05
Ricardo Quesada's avatar
Ricardo Quesada committed
800 801 802
        CMP #$F0     ;reached margin right?
        BCS _L03
        LDA #$02     ;2 pixels to right