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 ;=========== ; 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 lda #1 sta ANGLE lda #4 sta SPACEZ_I lda #$80 sta SPACEZ_F flying_loop: lda DRAW_SPLASH beq flying_keyboard dec DRAW_SPLASH ; decrement splash count flying_keyboard: jsr get_key ; get keypress lda LASTKEY cmp #('Q') ; if quit, then return bne skipskip rts skipskip: cmp #('I') 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 check_down: cmp #('M') bne check_left ;============= ; DOWN PRESSED ;============= lda SHIPY cmp #28 bcs check_left ; ble, if shipy < 28 inc SHIPY inc SHIPY ; move ship down dec SPACEZ_I ; decrement height check_left: cmp #('J') 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 #('K') 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 ;============== ; Draw the ship ;============== clv lda TURNING beq draw_ship_forward bpl draw_ship_right bmi draw_ship_left ;; FIXME: optimize order draw_ship_forward: ; Draw Shadow lda #>shadow_forward sta INH lda #ship_forward sta INH lda #shadow_right sta INH lda #ship_right sta INH lda #shadow_left sta INH lda #ship_left sta INH lda #