diff --git a/gr-sim/tfv_flying_6502.c b/gr-sim/tfv_flying_6502.c index d28cbfcf..dbf0a913 100644 --- a/gr-sim/tfv_flying_6502.c +++ b/gr-sim/tfv_flying_6502.c @@ -42,7 +42,7 @@ #define DRAW_SPLASH 0x7a #define SPEED 0x7b #define SPLASH_COUNT 0x7c -#define OVER_WATER 0x7d +#define OVER_LAND 0x7d #define NUM1L 0x7E #define NUM1H 0x7F #define NUM2L 0x80 @@ -799,13 +799,14 @@ shift_output: #endif -void draw_background_mode7(void) { + + +static void draw_background_mode7(void) { int map_color; - ram[OVER_WATER]=0; - cycles.mode7+=11; + cycles.mode7+=6; if (ram[DRAW_SKY]) { ram[DRAW_SKY]--; @@ -828,6 +829,7 @@ void draw_background_mode7(void) { cycles.mode7+=30; + /* FIXME: only do this if SPACEZ changes? */ // mul1 fixed_mul(ram[SPACEZ_I],ram[SPACEZ_F], @@ -841,10 +843,6 @@ void draw_background_mode7(void) { ram[FACTOR_I],ram[FACTOR_F]); } -// printf("spacez=%lf beta=%lf factor=%lf\n", -// fixed_to_double(ram[SPACEZ_I],ram[SPACEZ_F],), -// fixed_to_double(&BETA), -// fixed_to_double(ram[FACTOR_I],ram[FACTOR_F])); cycles.mode7+=12; for (ram[SCREEN_Y] = 8; ram[SCREEN_Y] < LOWRES_H; ram[SCREEN_Y]+=2) { @@ -977,12 +975,12 @@ void draw_background_mode7(void) { ram[COLOR]=map_color; ram[COLOR]|=map_color<<4; - if ((ram[SCREEN_X]==20) && (ram[SCREEN_Y]==38)) { - if (map_color==COLOR_DARKBLUE) ram[OVER_WATER]=1; - } +// if ((ram[SCREEN_X]==20) && (ram[SCREEN_Y]==38)) { +// if (map_color==COLOR_DARKBLUE) ram[OVER_WATER]=1; +// } hlin_double_continue(1); - cycles.mode7+=42; + cycles.mode7+=19; // advance to the next position in space fixed_add(ram[SPACEX_I],ram[SPACEX_F], @@ -1043,7 +1041,6 @@ int flying(void) { ram[DRAW_SPLASH]=0; ram[SPEED]=0; ram[SPLASH_COUNT]=0; - ram[OVER_WATER]=0; ram[ANGLE]=1; /* 1 so you can see island */ @@ -1140,7 +1137,6 @@ int flying(void) { /* Land the ship */ for(loop=ram[SPACEZ_I];loop>0;loop--) { - draw_background_mode7(); cycles.put_sprite+=grsim_put_sprite(shadow_forward,CONST_SHIPX+3,31+ram[SPACEZ_I]); cycles.put_sprite+=grsim_put_sprite(ship_forward,CONST_SHIPX,ram[SHIPY]); @@ -1189,7 +1185,16 @@ int flying(void) { } draw_background_mode7(); - cycles.flying+=6; + + { int landing_color,tx,ty; + tx=ram[CX_I]; ty=ram[CY_I]; + + landing_color=lookup_map(tx,ty); + if (landing_color==2) ram[OVER_LAND]=0; + else ram[OVER_LAND]=1; + } + cycles.flying+=31; + ram[DRAW_SPLASH]=0; cycles.flying+=11; if (ram[SPEED]>0) { @@ -1198,7 +1203,7 @@ int flying(void) { ram[SPLASH_COUNT]=1; } - if ((ram[OVER_WATER]) && (ram[SPLASH_COUNT])) { + if ((!ram[OVER_LAND]) && (ram[SPLASH_COUNT])) { ram[DRAW_SPLASH]=1; } } diff --git a/tfv/OPTIMIZATION b/tfv/OPTIMIZATION index 35aeb721..ba32c857 100644 --- a/tfv/OPTIMIZATION +++ b/tfv/OPTIMIZATION @@ -84,3 +84,16 @@ Don't draw sky every frame Total = 121,478 Frame Rate = 8.23 fps +Move checking if over water out of critical section + + Cycles: flying= 187 + Cycles: getkey= 46 + Cycles: page_flip= 26 + Cycles: multiply= 24,935 + Cycles: mode7= 54,374 + Cycles: lookup_map= 24,712 + Cycles: put_sprite= 2,561 + ================================= + Total = 106,841 + Frame Rate = 9.36 fps + diff --git a/tfv/TODO b/tfv/TODO index fcc7b78e..23176148 100644 --- a/tfv/TODO +++ b/tfv/TODO @@ -1,18 +1,10 @@ mode7 speed fixes: - + Don't draw sky every frame, only if needed - + faster multiply routine - + If result is AABBCCDD we only need BBCC for fixed point - result - + Pass NUM1H in A? no because used multiple places - + inline hlin_setup? (save 12 cycles) + - If result is AABBCCDD we only need BBCC for fixed point + result + - Pass NUM1H in A? no because used multiple places - + re-arrange variables to better take advantage of self-modifying code - + only doing the spacez calculation if it has changed - + update the constants to be constants - + move the screen width constant to own set of varaibles - (instead of temp) - + leave one of multiply results in accumulator at end? + + inline hlin_setup? (save 12 cycles) + Skip key parsing if no key read diff --git a/tfv/tfv.dsk b/tfv/tfv.dsk index 5622ae6d..c09d89fa 100644 Binary files a/tfv/tfv.dsk and b/tfv/tfv.dsk differ diff --git a/tfv/tfv_flying.s b/tfv/tfv_flying.s index 30b192b2..b99cb9ba 100644 --- a/tfv/tfv_flying.s +++ b/tfv/tfv_flying.s @@ -42,7 +42,6 @@ flying_start: sta DRAW_SPLASH sta SPEED sta SPLASH_COUNT - sta OVER_WATER lda #1 sta ANGLE @@ -339,6 +338,21 @@ speed_loop: draw_background: jsr draw_background_mode7 ; 6 +check_over_water: + ; See if we are over water + lda CX_I ; 3 + sta SPACEX_I ; 3 + lda CY_I ; 3 + sta SPACEY_I ; 3 + + jsr lookup_map ; 6 + + sec ; 2 + sbc #COLOR_BOTH_DARKBLUE ; 2 + sta OVER_LAND ; 3 + ;=========== + ; 31 + ; Calculate whether to draw the splash lda #0 ; set splash drawing to 0 ; 2 @@ -358,8 +372,8 @@ draw_background: sta SPLASH_COUNT ; 3 no_turning_splash: - lda OVER_WATER ; no splash if over land ; 3 - beq no_splash ; 2nt/3 + lda OVER_LAND ; no splash if over land ; 3 + bne no_splash ; 2nt/3 lda SPLASH_COUNT ; no splash if splash_count expired ; 3 beq no_splash ; 2nt/3 @@ -533,9 +547,6 @@ draw_ship: draw_background_mode7: - lda #0 ; 2 - sta OVER_WATER ; 3 - lda DRAW_SKY ; 3 beq no_draw_sky ; 2nt/3 @@ -580,6 +591,9 @@ sky_loop: ; draw line across screen no_draw_sky: ; FIXME: only do this if Z changes? + ; only saves 200 cycles to do that with a lot of + ; added complexity elsewhere + ; fixed_mul(&space_z,&BETA,&factor); ;mul1 lda SPACEZ_I ; 3 @@ -909,22 +923,22 @@ screenx_loop: inc GBASL ; point to next pixel ; 5 ; Check if over water - cmp #$22 ; see if dark blue ; 2 - bne not_watery ; 2nt/3 +; cmp #$22 ; see if dark blue ; 2 +; bne not_watery ; 2nt/3 - lda SCREEN_Y ; only check pixel in middle of screen ; 3 - cmp #38 ; 2 - bne not_watery ; 2nt/3 +; lda SCREEN_Y ; only check pixel in middle of screen ; 3 +; cmp #38 ; 2 +; bne not_watery ; 2nt/3 - lda SCREEN_X ; only check pixel in middle of screen ; 3 - cmp #20 ; 2 - bne not_watery ; 2nt/3 +; lda SCREEN_X ; only check pixel in middle of screen ; 3 +; cmp #20 ; 2 +; bne not_watery ; 2nt/3 - lda #$1 ; set over water ; 2 - sta OVER_WATER ; 3 +; lda #$1 ; set over water ; 2 +; sta OVER_WATER ; 3 ;============ - ; 42 -not_watery: + ; 19 +;not_watery: ; advance to the next position in space clc ; fixed_add(&space_x,&dx,&space_x); ; 2 diff --git a/tfv/tfv_zp.inc b/tfv/tfv_zp.inc index 71f9ea62..e264a793 100644 --- a/tfv/tfv_zp.inc +++ b/tfv/tfv_zp.inc @@ -54,36 +54,36 @@ OUTH EQU $FF ;; Flying Routine Only -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 +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_LAND EQU $7D NUM1L EQU $7E NUM1H EQU $7F NUM2L EQU $80