tfv: update with over_water optimization

This commit is contained in:
Vince Weaver 2017-11-26 01:02:02 -05:00
parent 3430394d99
commit 024d38ce36
6 changed files with 100 additions and 76 deletions

View File

@ -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;
}
}

View File

@ -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

View File

@ -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

Binary file not shown.

View File

@ -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

View File

@ -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