SHIPY EQU $E4 ; FIXME, sort out available ZP page space TURNING EQU $60 SCREEN_X EQU $61 SCREEN_Y EQU $62 ANGLE EQU $63 HORIZ_SCALE_I EQU $64 HORIZ_SCALE_F EQU $65 FACTOR_I EQU $66 FACTOR_F EQU $67 DX_I EQU $68 DX_F EQU $69 SPACEX_I EQU $6A SPACEX_F EQU $6B CX_I EQU $6C CX_F EQU $6D DY_I EQU $6E DY_F EQU $6F SPACEY_I EQU $70 SPACEY_F EQU $71 CY_I EQU $72 CY_F EQU $73 TEMP_I EQU $74 TEMP_F EQU $75 DISTANCE_I EQU $76 DISTANCE_F EQU $77 SPACEZ_I EQU $78 SPACEZ_F EQU $79 DRAW_SPLASH EQU $7A SPEED EQU $7B SPLASH_COUNT EQU $7C OVER_WATER EQU $7D ;=========== ; CONSTANTS ;=========== SHIPX EQU 15 TILE_W EQU 64 TILE_H EQU 64 MAP_MASK EQU (TILE_W - 1) LOWRES_W EQU 40 LOWRES_H EQU 40 flying_start: ;=================== ; Clear screen/pages ;=================== jsr clear_screens 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 OVER_WATER lda #1 sta ANGLE lda #4 sta SPACEZ_I lda #$80 sta SPACEZ_F flying_loop: lda SPLASH_COUNT beq flying_keyboard dec SPLASH_COUNT ; decrement splash count flying_keyboard: jsr get_key ; get keypress lda LASTKEY cmp #('Q') ; if quit, then return bne skipskip rts skipskip: cmp #('W') bne check_down ;=========== ; 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 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 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 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 check_speedup: cmp #('Z') bne check_speeddown ;========= ; SPEED UP ;========= lda #$3 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 ;===== ; LAND ;===== check_help: cmp #('H') bne check_done ;===== ; HELP ;===== check_done: ;================ ; Wrap the Angle ;================ lda ANGLE and #$f sta ANGLE ;================ ; Handle Movement ;================ speed_move: ldx SPEED beq draw_background lda ANGLE ; dx.i=fixed_sin[(angle+4)&0xf].i; // cos() clc adc #4 and #$f asl tay lda fixed_sin_scale,Y sta DX_I iny ; dx.f=fixed_sin[(angle+4)&0xf].f; // cos() lda fixed_sin_scale,Y sta DX_F lda ANGLE ; dy.i=fixed_sin[angle&0xf].i; // sin() and #$f asl tay lda fixed_sin_scale,Y sta DY_I iny ; dx.f=fixed_sin[angle&0xf].f; // sin() lda fixed_sin_scale,Y sta DY_F speed_loop: clc ; fixed_add(&cx,&dx,&cx); lda CX_F adc DX_F sta CX_F lda CX_I adc DX_I sta CX_I clc ; fixed_add(&cy,&dy,&cy); lda CY_F adc DY_F sta CY_F lda CY_I adc DY_I sta CY_I dex bne speed_loop ;==================== ; Draw the background ;==================== draw_background: jsr draw_background_mode7 ; lda #1 ; sta OVER_WATER ; Calculate whether to draw the splash lda #0 ; set splash drawing to 0 sta DRAW_SPLASH lda SPEED ; if speed==0, no splash beq no_splash lda TURNING beq no_turning_splash lda SHIPY cmp #27 bcc no_turning_splash ; blt if shipy<25 skip lda #1 sta SPLASH_COUNT no_turning_splash: lda OVER_WATER ; no splash if over land beq no_splash lda SPLASH_COUNT ; no splash if splash_count expired beq no_splash lda #1 sta DRAW_SPLASH no_splash: ;============== ; Draw the ship ;============== clv lda TURNING beq draw_ship_forward bpl draw_ship_right bmi draw_ship_left ;; FIXME: optimize order draw_ship_forward: lda DRAW_SPLASH beq no_forward_splash ; Draw Splash lda #>splash_forward sta INH lda #shadow_forward sta INH lda #ship_forward sta INH lda #splash_right sta INH lda #shadow_right sta INH lda #ship_right sta INH lda #splash_left sta INH lda #shadow_left sta INH lda #ship_left sta INH lda #