diff --git a/tb1_snes/checksum.inc b/tb1_snes/checksum.inc index 84b7d3c..e306578 100644 --- a/tb1_snes/checksum.inc +++ b/tb1_snes/checksum.inc @@ -1,2 +1,2 @@ - .word $da00 ; Complement of checksum - .word $25ff ; Unsigned 16-bit sum of ROM + .word $cbd3 ; Complement of checksum + .word $342c ; Unsigned 16-bit sum of ROM diff --git a/tb1_snes/level_1.s b/tb1_snes/level_1.s index a3c77e3..c1d1e41 100644 --- a/tb1_snes/level_1.s +++ b/tb1_snes/level_1.s @@ -19,6 +19,9 @@ joypad2 = $01 shipx = $02 star_scroll = $03 star_scroll_h = $04 ; 0004 too, 16-bit +RANDOM_SEED = $05 +YSAV = $06 +YSAV_H = $07 HISCORE_1 = $cb HISCORE_2 = $cc @@ -329,19 +332,13 @@ level1_setup_video: sta HISCORE_L ; modestly make me the high scorer - lda #$D6 + lda #'V' sta HISCORE_1 - lda #$CD + lda #'M' sta HISCORE_2 - lda #$D7 + lda #'W' sta HISCORE_3 -; lda #>(score_string+31) -; sta STRINGH -; lda #<(score_string+31) -; sta STRINGL - jsr print_high_score - ;========================================================== ; START NEW GAME @@ -352,48 +349,39 @@ do_new_game: ;; set up struct pointers - lda #>missile_0 ; clear the missile struct - sta MISSILE_PH ; should make this clear all BSS - lda #enemy_0 - sta ENEMY_PH - lda #bonus_shields ; sta STRINGH @@ -667,10 +634,10 @@ perfect_shields: ; See if we killed all the enemies perfect_kills: - bit BONUS_FLAGS - bvc perfect_aim +; bit BONUS_FLAGS +; bvc perfect_aim - jsr score_plus_50 +; jsr score_plus_50 ; lda #>bonus_kills ; sta STRINGH @@ -682,20 +649,20 @@ perfect_kills: ; See if no missiles missed perfect_aim: - lda #$01 - bit BONUS_FLAGS - beq done_bonus +; lda #$01 +; bit BONUS_FLAGS +; beq done_bonus - jsr score_plus_50 +; jsr score_plus_50 -; lda #>bonus_aim +; lda #>bonus_aim ; sta STRINGH ; lda #34 - lda CURRENT_INIT_X - bpl store_init_x +; lda CURRENT_INIT_X +; bpl store_init_x ; jsr random_number - and #$1f - clc - adc #$2 - asl +; and #$1f +; clc +; adc #$2 +; asl store_init_x: - iny ; X - sta (ENEMY_PL),Y +; iny ; X +; sta (ENEMY_PL),Y ; enemy_y is always 0 by default - iny ; Y - lda #$0 - sta (ENEMY_PL),Y - - lda #$0 - iny - sta (ENEMY_PL),Y ; xadd - iny - sta (ENEMY_PL),Y ; yadd - lda #$2 - iny - sta (ENEMY_PL),Y ; xmin - iny - lda #$24 - sta (ENEMY_PL),Y ; ymin +; iny ; Y +; lda #$0 +; sta (ENEMY_PL),Y - dey ; xmin - dey ; yadd - dey ; xadd +; lda #$0 +; iny +; sta (ENEMY_PL),Y ; xadd +; iny +; sta (ENEMY_PL),Y ; yadd +; lda #$2 +; iny +; sta (ENEMY_PL),Y ; xmin +; iny +; lda #$24 +; sta (ENEMY_PL),Y ; ymin + +; dey ; xmin +; dey ; yadd +; dey ; xadd ;=========================================== ; Enemy specific inits - - lda ENEMY_TYPE - beq enemy_type_0 - cmp #$1 - beq enemy_type_1 - jmp enemy_type_2 - + +; lda ENEMY_TYPE +; beq enemy_type_0 +; cmp #$1 +; beq enemy_type_1 +; jmp enemy_type_2 + enemy_type_0: enemy_type_1: @@ -844,154 +811,154 @@ enemy_type_1: ; diagonal, no wait ; movement proportional to level - lda LEVEL ; xadd = level - sta (ENEMY_PL),Y +; lda LEVEL ; xadd = level +; sta (ENEMY_PL),Y - iny +; iny - lsr A - ora #$1 - sta (ENEMY_PL),Y ; yadd = level/2 - jmp move_enemies +; lsr A +; ora #$1 +; sta (ENEMY_PL),Y ; yadd = level/2 +; jmp move_enemies enemy_type_2: ;===================== ; Enemy Type 2 ; just a place-holder ; waits for enemies to die then moves on to 3 - - cmp #$2 - bne enemy_type_3 - jmp move_enemies + +; cmp #$2 +; bne enemy_type_3 +; jmp move_enemies enemy_type_3: - cmp #$3 - bne enemy_type_4 +; cmp #$3 +; bne enemy_type_4 ;====================== ; Enemy type 3 - - lda #$1 - sta (ENEMY_PL),Y ; xadd=1 - - iny - - lda LEVEL - sta (ENEMY_PL),Y ; yadd=level - - jmp move_enemies + +; lda #$1 +; sta (ENEMY_PL),Y ; xadd=1 + +; iny + +; lda LEVEL +; sta (ENEMY_PL),Y ; yadd=level + +; jmp move_enemies enemy_type_4: - cmp #$4 - bne enemy_type_5 +; cmp #$4 +; bne enemy_type_5 ;========================= ; Enemy Type 4 ; Horizontal, then fall - lda #$2 - sta (ENEMY_PL),Y ; xadd = 2 +; lda #$2 +; sta (ENEMY_PL),Y ; xadd = 2 - iny +; iny ; jsr random_number - ora #$80 ; set negative - sta (ENEMY_PL),y ; yadd = -(random%128) +; ora #$80 ; set negative +; sta (ENEMY_PL),y ; yadd = -(random%128) ; this means bop back and forth a random ; time, then drop - - jmp move_enemies + +; jmp move_enemies enemy_type_5: - cmp #$5 - bne enemy_type_6 - +; cmp #$5 +; bne enemy_type_6 + ;======================== ; Enemy Type 5 ; "wiggle" - lda #$1 - sta (ENEMY_PL),y ; xadd=1 +; lda #$1 +; sta (ENEMY_PL),y ; xadd=1 - iny - lda LEVEL - sta (ENEMY_PL),y ; yadd=2 +; iny +; lda LEVEL +; sta (ENEMY_PL),y ; yadd=2 - iny +; iny ; jsr random_number - and #$0f - clc - adc #$2 - sta (ENEMY_PL),y ; xmin=(rand%16)+2 +; and #$0f +; clc +; adc #$2 +; sta (ENEMY_PL),y ; xmin=(rand%16)+2 - dey ; yadd - dey ; xadd - dey ; y - dey ;x - asl A - sta (ENEMY_PL),y - iny ;y - iny ; xadd - iny ; yadd - iny ; xmin +; dey ; yadd +; dey ; xadd +; dey ; y +; dey ; x +; asl A +; sta (ENEMY_PL),y +; iny ; y +; iny ; xadd +; iny ; yadd +; iny ; xmin ; jsr random_number - and #$0f - clc - adc (ENEMY_PL),Y - adc #$02 - iny - sta (ENEMY_PL),Y ; xmax = xmin+(rand%16)+2 +; and #$0f +; clc +; adc (ENEMY_PL),Y +; adc #$02 +; iny +; sta (ENEMY_PL),Y ; xmax = xmin+(rand%16)+2 - jmp move_enemies +; jmp move_enemies enemy_type_6: - cmp #$6 - beq enemy_type_7 - cmp #$7 - beq enemy_type_7 - jmp enemy_type_8 +; cmp #$6 +; beq enemy_type_7 +; cmp #$7 +; beq enemy_type_7 +; jmp enemy_type_8 enemy_type_7: ;===================== ; Enemy Types 6+7 ; "Rain" ; jsr random_number - and #6 - bne no_use_own_x +; and #6 +; bne no_use_own_x - dey ; y - dey ; x +; dey ; y +; dey ; x - lda shipx - cmp #$2 - bpl shipx_ok - lda #$2 ; stupid bug where gets stuck is < xmin +; lda shipx +; cmp #$2 +; bpl shipx_ok +; lda #$2 ; stupid bug where gets stuck is < xmin shipx_ok: - asl A - sta (ENEMY_PL),Y ; one-in-four chance we use shipx as X +; asl A +; sta (ENEMY_PL),Y ; one-in-four chance we use shipx as X - iny ; y - iny ; xadd +; iny ; y +; iny ; xadd no_use_own_x: - lda #$0 - sta (ENEMY_PL),Y ; xadd=0 - iny - lda #$1 - sta (ENEMY_PL),Y ; yadd = 1 +; lda #$0 +; sta (ENEMY_PL),Y ; xadd=0 +; iny +; lda #$1 +; sta (ENEMY_PL),Y ; yadd = 1 - jmp move_enemies +; jmp move_enemies enemy_type_8: enemy_type_9: @@ -1000,50 +967,48 @@ enemy_type_9: ; Things flung by boss - dey ; y - dey ; x - - lda BOSS_X - clc - adc #$5 - asl A - sta (ENEMY_PL),Y ; enemy_x=boss_x+5 - - iny - lda #$3 - asl A - asl A - sta (ENEMY_PL),Y ; enemy_y=3 +; dey ; y +; dey ; x + +; lda BOSS_X +; clc +; adc #$5 +; asl A +; sta (ENEMY_PL),Y ; enemy_x=boss_x+5 + +; iny +; lda #$3 +; asl A +; asl A +; sta (ENEMY_PL),Y ; enemy_y=3 - iny - lda #$0 - sta (ENEMY_PL),Y ; xadd=0 - - iny - lda #$2 - sta (ENEMY_PL),Y ; yadd=2 - - +; iny +; lda #$0 +; sta (ENEMY_PL),Y ; xadd=0 + +; iny +; lda #$2 +; sta (ENEMY_PL),Y ; yadd=2 + - move_enemies: ;============================================== ; Move Enemies! (first thing, if no new added) ;============================================== - ldy #$0 ; point to enemies[0] +; ldy #$0 ; point to enemies[0] handle_enemies: - tya - pha ; store y on stack - - lda (ENEMY_PL),Y ; get enemy[y].out - bne load_enemy_zero_page ; if enemy.out then we are good +; tya +; pha ; store y on stack - jmp skip_to_next_enemy ; enemy is not out, so skip to next +; lda (ENEMY_PL),Y ; get enemy[y].out +; bne load_enemy_zero_page ; if enemy.out then we are good + +; jmp skip_to_next_enemy ; enemy is not out, so skip to next @@ -1051,118 +1016,118 @@ handle_enemies: ; load this enemy stuff into zero page for ; easier access ;========================================== - -load_enemy_zero_page: - ldx #ENEMY_EXPLODING + +load_enemy_zero_page: +; ldx #ENEMY_EXPLODING load_to_zero_page: - iny ; point to exploding - lda (ENEMY_PL),Y - sta 0,X ; store to zero page - inx - cpx #(ENEMY_XMAX+1) ; see if reached end - bne load_to_zero_page ; if not keep copying +; iny ; point to exploding +; lda (ENEMY_PL),Y +; sta 0,X ; store to zero page +; inx +; cpx #(ENEMY_XMAX+1) ; see if reached end +; bne load_to_zero_page ; if not keep copying ;================================ ; skip all movement and collision ; if exploding ;================================ - - lda ENEMY_EXPLODING - beq move_enemy_x - jmp draw_enemy + +; lda ENEMY_EXPLODING +; beq move_enemy_x +; jmp draw_enemy ;================================ ; Start the enemy movement engine ;================================ - + ;======== ; Move X ;======== - + move_enemy_x: - clc - lda ENEMY_X ; X - adc ENEMY_XADD ; x+=xadd - sta ENEMY_X +; clc +; lda ENEMY_X ; X +; adc ENEMY_XADD ; x+=xadd +; sta ENEMY_X - lsr A +; lsr A - cmp ENEMY_XMIN ; are we less than xmin? - bmi switch_dir_enemy_x ; if so, switch direction +; cmp ENEMY_XMIN ; are we less than xmin? +; bmi switch_dir_enemy_x ; if so, switch direction - cmp ENEMY_XMAX ; are we greater than xmax? - bpl switch_dir_enemy_x ; if so, switch direction - - jmp move_enemy_y +; cmp ENEMY_XMAX ; are we greater than xmax? +; bpl switch_dir_enemy_x ; if so, switch direction + +; jmp move_enemy_y switch_dir_enemy_x: ; switch X direction - lda #$0 ; load zero - sec - sbc ENEMY_XADD ; 0 - ENEMY_XADD - sta ENEMY_XADD ; store it back out, negated - jmp move_enemy_x ; re-add it in +; lda #$0 ; load zero +; sec +; sbc ENEMY_XADD ; 0 - ENEMY_XADD +; sta ENEMY_XADD ; store it back out, negated +; jmp move_enemy_x ; re-add it in ;======== ; Move Y ;======== - + move_enemy_y: - lda #$0 ; load in zero - cmp ENEMY_YADD ; compare to YADD - - bmi no_y_special_case ; if minus, we have special case +; lda #$0 ; load in zero +; cmp ENEMY_YADD ; compare to YADD - inc ENEMY_YADD - bne done_enemy_y - - lda #$0 - sta ENEMY_XADD - lda #$2 - sta ENEMY_YADD +; bmi no_y_special_case ; if minus, we have special case + +; inc ENEMY_YADD +; bne done_enemy_y + +; lda #$0 +; sta ENEMY_XADD +; lda #$2 +; sta ENEMY_YADD ; increment y ; is it > 0? ; if not keep going ; if so, yadd=level*2 - - jmp done_enemy_y - -no_y_special_case: - clc - lda ENEMY_Y ; get Y - adc ENEMY_YADD ; y+=yadd - sta ENEMY_Y ; store back out - - lsr A - lsr A - - cmp #$12 ; is y<=12? - bmi done_enemy_y ; if so no need to do anything - beq done_enemy_y - + +; jmp done_enemy_y + +no_y_special_case: +; clc +; lda ENEMY_Y ; get Y +; adc ENEMY_YADD ; y+=yadd +; sta ENEMY_Y ; store back out + +; lsr A +; lsr A + +; cmp #$12 ; is y<=12? +; bmi done_enemy_y ; if so no need to do anything +; beq done_enemy_y + ; off screen - - pla ; pop saved Y off stack - tay - pha ; push y back on stack - - lda #$0 - sta (ENEMY_PL),Y ; set enemy[i].out=0 - - dec TOTAL_ENEMIES_OUT - - lda BONUS_FLAGS - and #<(~PERFECT_KILLS) - sta BONUS_FLAGS - - jmp skip_to_next_enemy ; skip to next enemy - + +; pla ; pop saved Y off stack +; tay +; pha ; push y back on stack + +; lda #$0 +; sta (ENEMY_PL),Y ; set enemy[i].out=0 + +; dec TOTAL_ENEMIES_OUT + +; lda BONUS_FLAGS +; and #<(~PERFECT_KILLS) +; sta BONUS_FLAGS + +; jmp skip_to_next_enemy ; skip to next enemy + done_enemy_y: @@ -1181,80 +1146,80 @@ done_enemy_y: check_enemy_missile_collision: - ldy #$0 +; ldy #$0 ; sty YSAV check_missile_loop: - lda (MISSILE_PL),Y - beq missile_not_out +; lda (MISSILE_PL),Y +; beq missile_not_out - iny ; point to missile.x - lda (MISSILE_PL),Y ; load missile.x +; iny ; point to missile.x +; lda (MISSILE_PL),Y ; load missile.x - sta COL_X1 - sta COL_X2 +; sta COL_X1 +; sta COL_X2 - lda ENEMY_X - lsr A - sta COL_X3 - clc - adc #3 - sta COL_X4 +; lda ENEMY_X +; lsr A +; sta COL_X3 +; clc +; adc #3 +; sta COL_X4 - jsr check_inside +; jsr check_inside - bcc missile_done +; bcc missile_done x_in_range: - iny - lda (MISSILE_PL),Y ; load missile.y +; iny +; lda (MISSILE_PL),Y ; load missile.y - sta COL_X3 - clc - adc #2 - sta COL_X4 +; sta COL_X3 +; clc +; adc #2 +; sta COL_X4 - lda ENEMY_Y - lsr A - lsr A - sta COL_X1 - clc - adc #1 - sta COL_X2 +; lda ENEMY_Y +; lsr A +; lsr A +; sta COL_X1 +; clc +; adc #1 +; sta COL_X2 - jsr check_inside +; jsr check_inside - bcc missile_done +; bcc missile_done horrible_explosion: ; clear missile ; ldy YSAV - lda #$0 - sta (MISSILE_PL),Y +; lda #$0 +; sta (MISSILE_PL),Y ; clear enemy - lda #$1 - sta ENEMY_EXPLODING - lda #$40 - sta ENEMY_KIND +; lda #$1 +; sta ENEMY_EXPLODING +; lda #$40 +; sta ENEMY_KIND - jsr inc_score +; jsr inc_score - jmp draw_enemy +; jmp draw_enemy missile_done: missile_not_out: ; ldy YSAV - iny - iny - iny +; iny +; iny +; iny ; sty YSAV - cpy #(NUM_MISSILES*3) - bne check_missile_loop +; cpy #(NUM_MISSILES*3) +; bne check_missile_loop ;================================= ; Done missile <> enemy collision @@ -1264,53 +1229,53 @@ missile_not_out: ; check for ship <-> enemy collision ;==================================== - lda shipx - sta COL_X3 - clc - adc #8 - sta COL_X4 ; big check is shipx - shipx+8 +; lda shipx +; sta COL_X3 +; clc +; adc #8 +; sta COL_X4 ; big check is shipx - shipx+8 - lda ENEMY_X - lsr A - sta COL_X1 - clc - adc #2 - sta COL_X2 ; small check enemy_x - enemy_x+2 - - jsr check_inside ; check if overlap +; lda ENEMY_X +; lsr A +; sta COL_X1 +; clc +; adc #2 +; sta COL_X2 ; small check enemy_x - enemy_x+2 - bcc draw_enemy ; if not, move ahead +; jsr check_inside ; check if overlap - lda #16 - sta COL_X3 - lda #18 - sta COL_X4 ; big check is 16 - 18 - - lda ENEMY_Y - lsr A - lsr A - sta COL_X1 - clc - adc #$1 - sta COL_X2 ; little check is enemy_y - enemy_y+1 - - jsr check_inside ; check if overlap +; bcc draw_enemy ; if not, move ahead + +; lda #16 +; sta COL_X3 +; lda #18 +; sta COL_X4 ; big check is 16 - 18 + +; lda ENEMY_Y +; lsr A +; lsr A +; sta COL_X1 +; clc +; adc #$1 +; sta COL_X2 ; little check is enemy_y - enemy_y+1 + +; jsr check_inside ; check if overlap + +; bcc draw_enemy ; if not, move ahead - bcc draw_enemy ; if not, move ahead - ; make the enemy explode - - lda #$1 - sta ENEMY_EXPLODING - lda #$40 - sta ENEMY_KIND - - dec SHIELDS - jsr update_shields ; move shields down - - lda #<(~PERFECT_SHIELDS) ; (~PERFECT_SHIELDS) - and BONUS_FLAGS ; remove perfect shield bonus - sta BONUS_FLAGS + +; lda #$1 +; sta ENEMY_EXPLODING +; lda #$40 +; sta ENEMY_KIND + +; dec SHIELDS +; jsr update_shields ; move shields down + +; lda #<(~PERFECT_SHIELDS) ; (~PERFECT_SHIELDS) +; and BONUS_FLAGS ; remove perfect shield bonus +; sta BONUS_FLAGS ;===================================== @@ -1324,33 +1289,33 @@ draw_enemy: ; if so, do explosion stuff check_enemy_explode: - lda ENEMY_EXPLODING ; load enemy[i].exploding - beq not_exploding ; if 0 then not exploding +; lda ENEMY_EXPLODING ; load enemy[i].exploding +; beq not_exploding ; if 0 then not exploding handle_exploding: ; jsr click ; make some noise - clc - lda ENEMY_KIND ; move to next step in explosion - adc #$4 - sta ENEMY_KIND +; clc +; lda ENEMY_KIND ; move to next step in explosion +; adc #$4 +; sta ENEMY_KIND - cmp #$58 ; have we cycles through explosion? - bne draw_enemy_sprite ; if not, we are still exploding +; cmp #$58 ; have we cycles through explosion? +; bne draw_enemy_sprite ; if not, we are still exploding + +; dec TOTAL_ENEMIES_OUT ; total_enemies_out-- + +; pla +; tay ; load y +; pha + +; lda #$0 ; enemy[i].out=0 +; sta (ENEMY_PL),Y + +; jmp skip_to_next_enemy - dec TOTAL_ENEMIES_OUT ; total_enemies_out-- - pla - tay ; load y - pha - - lda #$0 ; enemy[i].out=0 - sta (ENEMY_PL),Y - - jmp skip_to_next_enemy - - ; point to enemies_x ; goto enemies_xy @@ -1368,25 +1333,25 @@ draw_enemy_sprite: ; lda #boss_sprite @@ -1465,8 +1431,8 @@ skip_draw_boss: ;================================ ; Draw Smoke - lda BOSS_SMOKE - beq skip_draw_smoke +; lda BOSS_SMOKE +; beq skip_draw_smoke ; point to proper sprite @@ -1475,35 +1441,35 @@ skip_draw_boss: ; lda #ship_sprite -; sta STRINGH -; lda #level_string ; sta STRINGH ; lda #