diff --git a/gr-sim/tfv_flying_6502.c b/gr-sim/tfv_flying_6502.c index 7451f06b..1af71ac6 100644 --- a/gr-sim/tfv_flying_6502.c +++ b/gr-sim/tfv_flying_6502.c @@ -85,6 +85,16 @@ static unsigned char water_map[32]={ static int displayed=0; +struct cycle_counts { + int flying; + int getkey; + int page_flip; + int mode7; + int multiply; + int lookup_map; + int put_sprite; +} cycles; + static int lookup_map(int xx, int yy) { int color,offset; @@ -122,7 +132,7 @@ static int lookup_map(int xx, int yy) { } - + cycles.lookup_map+=53; return color; } @@ -183,15 +193,7 @@ static unsigned char horizontal_lookup[7][16] = { }; -struct cycle_counts { - int flying; - int getkey; - int page_flip; - int mode7; - int multiply; - int lookup_map; - int put_sprite; -} cycles; + static void fixed_add(unsigned char x_i,unsigned char x_f, @@ -573,7 +575,7 @@ void draw_background_mode7(void) { } // go through all points in this screen line - for (ram[SCREEN_X] = 0; ram[SCREEN_X] < LOWRES_W-1; ram[SCREEN_X]++) { + for (ram[SCREEN_X] = 0; ram[SCREEN_X] < LOWRES_W; ram[SCREEN_X]++) { // get a pixel from the tile and put it on the screen map_color=lookup_map(ram[SPACEX_I],ram[SPACEY_I]); @@ -618,50 +620,43 @@ int flying(void) { /************************************************/ gr(); - clear_bottom(PAGE0); /* jsr clear_screens */ - clear_bottom(PAGE1); /* jsr set_gr_page0 */ + clear_bottom(PAGE0); + clear_bottom(PAGE1); - ram[SHIPY]=20; /* lda #20 */ - /* sta SHIPY */ - /* lda #0 */ - ram[TURNING]=0; /* sta TURNING */ - ram[SPACEX_I]=0; /* sta SPACEX_I */ - ram[SPACEY_I]=0; /* sta SPACEY_I */ - ram[CX_I]=0; /* sta CX_I */ - ram[CX_F]=0; /* sta CX_F */ - ram[CY_I]=0; /* sta CY_I */ - ram[CY_F]=0; /* sta CY_F */ - ram[DRAW_SPLASH]=0; /* sta DRAW_SPLASH */ - ram[SPEED]=0; /* sta SPEED */ - ram[SPLASH_COUNT]=0; /* sta SPLASH_COUNT */ - ram[OVER_WATER]=0; /* sta OVER_WATER */ + ram[SHIPY]=20; + ram[TURNING]=0; + ram[SPACEX_I]=0; + ram[SPACEY_I]=0; + ram[CX_I]=0; + ram[CX_F]=0; + ram[CY_I]=0; + ram[CY_F]=0; + ram[DRAW_SPLASH]=0; + ram[SPEED]=0; + ram[SPLASH_COUNT]=0; + ram[OVER_WATER]=0; - /* lda #1 */ - ram[ANGLE]=1; /* sta ANGLE */ + ram[ANGLE]=1; /* 1 so you can see island */ - /* lda #4 */ - ram[SPACEZ_I]=4; /* sta SPACEZ_I */ - /* lda #$80 */ - ram[SPACEZ_F]=0x80; /* sta SPACEZ_F */ + ram[SPACEZ_I]=4; + ram[SPACEZ_F]=0x80; /* Z=4.5 */ while(1) { memset(&cycles,0,sizeof(cycles)); - - // lda SPLASH_COUNT 3 - cycles.flying+=3; - // beq flying_keyboard nt2/3 - cycles.flying+=3; + cycles.flying+=6; if (ram[SPLASH_COUNT]>0) { cycles.flying--; - ram[SPLASH_COUNT]--; // dec SPLASH_COUNT 5 + ram[SPLASH_COUNT]--; cycles.flying+=5; } - ch=grsim_input(); // jsr get_key 6+40 + ch=grsim_input(); cycles.getkey=46; - if ((ch=='q') || (ch==27)) break; + cycles.flying+=3; + if ((ch=='q') || (ch==27)) break; + cycles.flying+=5; if ((ch=='w') || (ch==APPLE_UP)) { if (ram[SHIPY]>16) { ram[SHIPY]-=2; @@ -669,6 +664,7 @@ int flying(void) { } ram[SPLASH_COUNT]=0; } + cycles.flying+=5; if ((ch=='s') || (ch==APPLE_DOWN)) { if (ram[SHIPY]<28) { ram[SHIPY]+=2; @@ -678,6 +674,7 @@ int flying(void) { ram[SPLASH_COUNT]=10; } } + cycles.flying+=5; if ((ch=='a') || (ch==APPLE_LEFT)) { if ((ram[TURNING]>0) && (!(ram[TURNING]&0x80))) { ram[TURNING]=0; @@ -689,6 +686,7 @@ int flying(void) { if (ram[ANGLE]<0) ram[ANGLE]+=ANGLE_STEPS; } } + cycles.flying+=5; if ((ch=='d') || (ch==APPLE_RIGHT)) { if (ram[TURNING]>128) { ram[TURNING]=0; @@ -700,24 +698,24 @@ int flying(void) { } } - + cycles.flying+=5; /* Used to be able to go backwards */ if (ch=='z') { if (ram[SPEED]<3) ram[SPEED]++; } - + cycles.flying+=5; if (ch=='x') { if (ram[SPEED]>0) ram[SPEED]--; } - + cycles.flying+=5; if (ch==' ') { ram[SPEED]=SPEED_STOPPED; } - + cycles.flying+=5; if (ch=='h') { print_help(); } - + cycles.flying+=5; /* Ending */ if (ch==13) { int landing_color,tx,ty; @@ -752,10 +750,12 @@ int flying(void) { print_both_pages("NEED TO LAND ON GRASS!"); } } + cycles.flying+=5; - - +// check_done: + cycles.flying+=14; if (ram[SPEED]!=SPEED_STOPPED) { + cycles.flying--; int ii; @@ -763,7 +763,7 @@ int flying(void) { ram[DX_F] = fixed_sin_scale[(ram[ANGLE]+4)&0xf].f; // cos ram[DY_I] = fixed_sin_scale[ram[ANGLE]&0xf].i; ram[DY_F] = fixed_sin_scale[ram[ANGLE]&0xf].f; - + cycles.flying+=54; for(ii=0;ii0) { if ((ram[SHIPY]>25) && (ram[TURNING]!=0)) { @@ -794,32 +796,40 @@ int flying(void) { if (ram[DRAW_SPLASH]) { grsim_put_sprite(splash_forward, CONST_SHIPX+1,ram[SHIPY]+9); + cycles.flying+=33; } grsim_put_sprite(shadow_forward,CONST_SHIPX+3,31+ram[SPACEZ_I]); grsim_put_sprite(ship_forward,CONST_SHIPX,ram[SHIPY]); + cycles.flying+=46; } else if (ram[TURNING]>128) { if (ram[DRAW_SPLASH]) { grsim_put_sprite(splash_left, CONST_SHIPX+1,36); + cycles.flying+=28; } grsim_put_sprite(shadow_left,CONST_SHIPX+3,31+ram[SPACEZ_I]); grsim_put_sprite(ship_left,CONST_SHIPX,ram[SHIPY]); ram[TURNING]++; + cycles.flying+=48; } else { if (ram[DRAW_SPLASH]) { grsim_put_sprite(splash_right, CONST_SHIPX+1,36); + cycles.flying+=28; } grsim_put_sprite(shadow_right,CONST_SHIPX+3,31+ram[SPACEZ_I]); grsim_put_sprite(ship_right,CONST_SHIPX,ram[SHIPY]); ram[TURNING]--; + cycles.flying+=51; } - page_flip(); cycles.page_flip+=26; + cycles.flying+=17; + page_flip(); cycles.page_flip+=26; + cycles.flying+=9; iterations++; if (iterations==100) { diff --git a/tfv/TODO b/tfv/TODO index 37e54562..e544242e 100644 --- a/tfv/TODO +++ b/tfv/TODO @@ -4,6 +4,8 @@ mode7 speed fixes: + move multiply vars to zero page + leave one of multiply results in accumulator at end? + + Skip key parsing if no key read + short term: longer term: diff --git a/tfv/tfv_flying.s b/tfv/tfv_flying.s index f36b17de..e2f700d5 100644 --- a/tfv/tfv_flying.s +++ b/tfv/tfv_flying.s @@ -83,16 +83,15 @@ flying_start: flying_loop: - lda SPLASH_COUNT - beq flying_keyboard - dec SPLASH_COUNT ; decrement splash count + lda SPLASH_COUNT ; 3 + beq flying_keyboard ; 2nt/3 + dec SPLASH_COUNT ; decrement splash count ; 5 flying_keyboard: + jsr get_key ; get keypress ; 6 - jsr get_key ; get keypress - - lda LASTKEY + lda LASTKEY ; 3 ; cmp #('Q') ; if quit, then return ; bne skipskip @@ -100,8 +99,8 @@ flying_keyboard: ;skipskip: - cmp #('W') - bne check_down + cmp #('W') ; 2 + bne check_down ; 3/2nt ;=========== ; UP PRESSED @@ -301,99 +300,98 @@ check_done: ;================ ; Wrap the Angle ;================ - - lda ANGLE - and #$f - sta ANGLE + ; FIXME: only do this in right/left routine? + lda ANGLE ; 3 + and #$f ; 2 + sta ANGLE ; 3 ;================ ; 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 + 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); - lda CX_F - adc DX_F - sta CX_F - lda CX_I - adc DX_I - sta CX_I + 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); - lda CY_F - adc DY_F - sta CY_F - lda CY_I - adc DY_I - sta CY_I - - dex - bne speed_loop + 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 - -; lda #1 -; sta OVER_WATER + jsr draw_background_mode7 ; 6 ; Calculate whether to draw the splash - lda #0 ; set splash drawing to 0 - sta DRAW_SPLASH + lda #0 ; set splash drawing to 0 ; 2 + sta DRAW_SPLASH ; 3 - lda SPEED ; if speed==0, no splash - beq no_splash + lda SPEED ; if speed==0, no splash ; 3 + beq no_splash ; 2nt/3 - lda TURNING - beq no_turning_splash + lda TURNING ; 3 + beq no_turning_splash ; 2nt/3 - lda SHIPY - cmp #27 - bcc no_turning_splash ; blt if shipy<25 skip + lda SHIPY ; 3 + cmp #27 ; 2 + bcc no_turning_splash ; blt if shipy<25 skip ; 2nt/3 - lda #1 - sta SPLASH_COUNT + lda #1 ; 2 + sta SPLASH_COUNT ; 3 no_turning_splash: - lda OVER_WATER ; no splash if over land - beq no_splash + lda OVER_WATER ; no splash if over land ; 3 + beq no_splash ; 2nt/3 - lda SPLASH_COUNT ; no splash if splash_count expired - beq no_splash + lda SPLASH_COUNT ; no splash if splash_count expired ; 3 + beq no_splash ; 2nt/3 - lda #1 - sta DRAW_SPLASH + lda #1 ; 2 + sta DRAW_SPLASH ; 3 no_splash: @@ -401,146 +399,158 @@ no_splash: ; Draw the ship ;============== - clv - lda TURNING - beq draw_ship_forward - bpl draw_ship_right - bmi draw_ship_left ;; FIXME: optimize order + clv ; 2 + lda TURNING ; 3 + beq draw_ship_forward ; 2nt/3 + bpl draw_ship_right ; 2nt/3 + bmi draw_ship_left ;; FIXME: optimize order ; 2nt/3 draw_ship_forward: - lda DRAW_SPLASH - beq no_forward_splash + lda DRAW_SPLASH ; 2 + beq no_forward_splash ; 2nt/3 ; Draw Splash - lda #>splash_forward - sta INH - lda #splash_forward ; 2 + sta INH ; 3 + lda #shadow_forward - sta INH - lda #ship_forward - sta INH - lda #shadow_forward ; 2 + sta INH ; 3 + lda #ship_forward ; 2 + sta INH ; 3 + lda #splash_right - sta INH - lda #splash_right ; 2 + sta INH ; 3 + lda #shadow_right - sta INH - lda #shadow_right ; 2 + sta INH ; 3 + lda #ship_right - sta INH - lda #ship_right ; 2 + sta INH ; 3 + lda #splash_left - sta INH - lda #splash_left ; 2 + sta INH ; 3 + lda #shadow_left - sta INH - lda #shadow_left ; 2 + sta INH ; 3 + lda #ship_left - sta INH - lda #ship_left ; 2 + sta INH ; 3 + lda #