;.include "zp.inc" ;=========== ; CONSTANTS ;=========== CONST_SHIPX EQU 15 CONST_TILE_W EQU 64 CONST_TILE_H EQU 64 CONST_MAP_MASK_X EQU (CONST_TILE_W - 1) CONST_MAP_MASK_Y EQU (CONST_TILE_H - 1) CONST_LOWRES_W EQU 40 CONST_LOWRES_H EQU 40 CONST_BETA_I EQU $ff CONST_BETA_F EQU $80 CONST_SCALE_I EQU $14 CONST_SCALE_F EQU $00 CONST_LOWRES_HALF_I EQU $ec ; -(LOWRES_W/2) CONST_LOWRES_HALF_F EQU $00 ; pre-programmed directions checkerboard_flying_directions: .byte $18,$00 ; 24 frames, do nothing .byte $10,'D' ; 16 frames, turn right .byte $10,$00 ; 16 frames, do nothing .byte $f,'A' ; 15 frames, turn left .byte $10,$00 ; 16 frames, do nothing .byte $1,'Z' ; start moving forward .byte $20,$00 ; 32 frames, do nothing .byte $1,'Q' ; quit island_flying_directions: .byte $2,$00 ; 2 frames, do nothing .byte $1,'Z' ; start moving forward .byte $10,$00 ; 16 frames, do nothing .byte $3,'D' ; 3 frames, turn right .byte $1,'Z' ; move faster .byte $8,$00 ; 8 frames, do nothing .byte $2,'D' ; 2 frames, turn left .byte $8,$00 ; 8 frames, do nothing .byte $3,'A' ; 3 frames, turn left .byte $1,'Z' ; speedup .byte $8,$00 ; 8 frames, do nothing .byte $6,'S' ; 6 frames down .byte $6,$00 ; 6 frames do nothing .byte $3,'A' ; 3 frames left .byte $3,'D' ; 3 frames right .byte $2,$00 ; 2 frames nothing .byte $1,'D' ; 1 frame right .byte $2,$00 ; 2 frames nothing .byte $8,'D' ; 8 frame right .byte $1,'Z' ; 8 frames up .byte $6,'W' ; 2 speedup .byte $a,$00 ; 10 nothing .byte $3,'S' ; 3 down .byte $1,'Q' ; quit ;===================== ; Flying ;===================== mode7_flying: ;================================ ; Clear screen and setup graphics ;================================ jsr clear_screens ; clear top/bottom of page 0/1 jsr set_gr_page0 ;=============== ; Init Variables ;=============== lda #20 sta SHIPY lda #0 sta TURNING sta ANGLE sta SPACEX_I sta SPACEY_I sta CX_I sta CX_F sta CY_I sta CY_F sta DRAW_SPLASH sta SPEED sta SPLASH_COUNT sta DISP_PAGE sta KEY_COUNT sta KEY_OFFSET sta FRAME_COUNT lda #2 ; initialize sky both pages sta DRAW_SKY lda #4 ; starts out at 4.5 altitude sta SPACEZ_I lda #$80 sta SPACEZ_F jsr update_z_factor flying_loop: lda SPLASH_COUNT ; 3 beq flying_keyboard ; 2nt/3 dec SPLASH_COUNT ; decrement splash count ; 5 flying_keyboard: ; jsr get_key ; get keypress ; 6 lda KEY_COUNT bne done_key ldy KEY_OFFSET direction_smc_1: lda island_flying_directions,Y sta KEY_COUNT iny direction_smc_2: lda island_flying_directions,Y sta LASTKEY inc KEY_OFFSET inc KEY_OFFSET done_key: dec KEY_COUNT lda LASTKEY ; 3 cmp #('Q') ; 2 bne check_up ; 3/2nt ; done rts check_up: cmp #('W') ; 2 bne check_down ; 3/2nt ;=========== ; UP PRESSED ;=========== lda SHIPY cmp #17 bcc check_down ; bgt, if shipy>16 dec SHIPY dec SHIPY ; move ship up inc SPACEZ_I ; incement height jsr update_z_factor lda #0 sta SPLASH_COUNT check_down: cmp #('S') bne check_left ;============= ; DOWN PRESSED ;============= lda SHIPY cmp #28 bcs splashy ; ble, if shipy < 28 inc SHIPY inc SHIPY ; move ship down dec SPACEZ_I ; decrement height jsr update_z_factor bcc check_left splashy: lda #10 sta SPLASH_COUNT check_left: cmp #('A') bne check_right ;============= ; LEFT PRESSED ;============= lda TURNING bmi turn_left beq turn_left lda #$0 sta TURNING clv bvc check_right turn_left: lda #253 ; -3 sta TURNING dec ANGLE inc DRAW_SKY inc DRAW_SKY check_right: cmp #('D') bne check_speedup ;============== ; RIGHT PRESSED ;============== lda TURNING ;; FIXME: optimize me bpl turn_right lda #0 sta TURNING clv bvc check_speedup turn_right: lda #3 sta TURNING inc ANGLE inc DRAW_SKY inc DRAW_SKY check_speedup: cmp #('Z') bne check_speeddown ;========= ; SPEED UP ;========= lda #$8 cmp SPEED beq check_speeddown inc SPEED check_speeddown: cmp #('X') bne check_brake ;=========== ; SPEED DOWN ;=========== lda SPEED beq check_brake dec SPEED check_brake: cmp #(' '+128) bne check_land ;============ ; BRAKE ;============ lda #$0 sta SPEED check_land: cmp #13 bne check_help check_help: cmp #('H') bne check_done check_done: ;================ ; Wrap the Angle ;================ ; FIXME: only do this in right/left routine? lda ANGLE ; 3 and #$f ; 2 sta ANGLE ; 3 ;================ ; Handle Movement ;================ speed_move: ldx SPEED ; 3 beq draw_background ; 2nt/3 ;============= lda ANGLE ; dx.i=fixed_sin[(angle+4)&0xf].i; // cos() ; 3 clc ; 2 adc #4 ; 2 and #$f ; 2 asl ; 2 tay ; 2 lda fixed_sin_scale,Y ; 4 sta DX_I ; 3 iny ; dx.f=fixed_sin[(angle+4)&0xf].f; // cos() ; 2 lda fixed_sin_scale,Y ; 4 sta DX_F ; 3 lda ANGLE ; dy.i=fixed_sin[angle&0xf].i; // sin() ; 3 and #$f ; 2 asl ; 2 tay ; 2 lda fixed_sin_scale,Y ; 4 sta DY_I ; 3 iny ; dx.f=fixed_sin[angle&0xf].f; // sin() ; 2 lda fixed_sin_scale,Y ; 4 sta DY_F ; 3 ;============ ; 54 speed_loop: clc ; fixed_add(&cx,&dx,&cx); ; 2 lda CX_F ; 3 adc DX_F ; 3 sta CX_F ; 3 lda CX_I ; 3 adc DX_I ; 3 sta CX_I ; 3 clc ; fixed_add(&cy,&dy,&cy); ; 2 lda CY_F ; 3 adc DY_F ; 3 sta CY_F ; 3 lda CY_I ; 3 adc DY_I ; 3 sta CY_I ; 3 dex ; 2 bne speed_loop ; 2nt/3 ;============ ; 45 ;==================== ; Draw the background ;==================== draw_background: jsr draw_background_mode7 ; 6 lda DRAW_BLUE_SKY bne draw_spaceship ;======================================== ;======================================== ; DRAW SPHERE CODE ;======================================== ;======================================== draw_sphere: ; FIXME: optimize this mess ; draw shadow first lda FRAME_COUNT and #$0f tax lda gravity,X cmp #$5 bmi high_shadow low_shadow: lda #>sphere_shadow1 sta INH lda #sphere_shadow2 sta INH lda #sphere0 ; 2 sta INH ; 3 lda #splash_forward ; 2 sta INH ; 3 lda #shadow_forward ; 2 sta INH ; 3 lda #ship_forward ; 2 sta INH ; 3 lda #splash_right ; 2 sta INH ; 3 lda #shadow_right ; 2 sta INH ; 3 lda #ship_right ; 2 sta INH ; 3 lda #splash_left ; 2 sta INH ; 3 lda #shadow_left ; 2 sta INH ; 3 lda #ship_left ; 2 sta INH ; 3 lda #