diff --git a/gr-sim/tfv_flying_6502.c b/gr-sim/tfv_flying_6502.c index 1af5b2c8..c1442007 100644 --- a/gr-sim/tfv_flying_6502.c +++ b/gr-sim/tfv_flying_6502.c @@ -661,15 +661,16 @@ static void draw_background_mode7(void) { ram[FACTOR_I],ram[FACTOR_F]); } - cycles.mode7+=11; - ram[SCREEN_Y]=8; + cycles.mode7+=16; + + do { y=0; hlin_setup(ram[DRAW_PAGE],y,0,ram[SCREEN_Y]); - cycles.mode7+=39; + cycles.mode7+=33; // then calculate the horizontal scale, or the distance between // space points on this horizontal line @@ -688,15 +689,17 @@ static void draw_background_mode7(void) { ram[HORIZ_SCALE_I],ram[HORIZ_SCALE_F]); } + //mul2 // calculate the distance of the line we are drawing fixed_mul(ram[HORIZ_SCALE_I],ram[HORIZ_SCALE_F], CONST_SCALE_I,CONST_SCALE_F, &ram[DISTANCE_I],&ram[DISTANCE_F],0); - cycles.mode7+=34; + cycles.mode7+=27; if (!displayed) { printf("DISTANCE %x:%x\n",ram[DISTANCE_I],ram[DISTANCE_F]); } + // calculate the dx and dy of points in space when we step // through all points on this line ram[DX_I]=fixed_sin[(ram[ANGLE]+8)&0xf].i; // -sin() @@ -725,6 +728,7 @@ static void draw_background_mode7(void) { printf("DY %x:%x\n",ram[DY_I],ram[DY_F]); } + // calculate the starting position fixed_add(ram[DISTANCE_I],ram[DISTANCE_F], ram[FACTOR_I],ram[FACTOR_F], diff --git a/tfv/OPTIMIZATION b/tfv/OPTIMIZATION index db8f3149..9b8baa75 100644 --- a/tfv/OPTIMIZATION +++ b/tfv/OPTIMIZATION @@ -122,3 +122,17 @@ Remove some unnecessary zero page copies in the mode7 code Total = 215,420 Frame Rate = 4.64 fps +A few more minor cleanups in the Y loop + Cycles: flying= 187 + Cycles: getkey= 46 + Cycles: page_flip= 26 + Cycles: multiply= 49,613 + Cycles: mode7= 140,858 + Cycles: lookup_map= 21,718 + Cycles: put_sprite= 2,561 + =============================== + Total = 215,009 + Frame Rate = 4.65 fps + + +32*40=12800 diff --git a/tfv/TODO b/tfv/TODO index ee727048..fd3c4980 100644 --- a/tfv/TODO +++ b/tfv/TODO @@ -4,6 +4,7 @@ mode7 speed fixes: result + Skip key parsing if no key read + + Self modifying code on the adds in inner loop short term: diff --git a/tfv/tfv_flying.s b/tfv/tfv_flying.s index d9eb8214..2730d12a 100644 --- a/tfv/tfv_flying.s +++ b/tfv/tfv_flying.s @@ -497,7 +497,7 @@ draw_ship_left: sta YPOS ; 3 jsr put_sprite ; 6 ;=========== - ; 28 + ; 28 no_left_splash: ; Draw Shadow @@ -624,23 +624,20 @@ no_draw_sky: ;; GOOD 4 80 * ffffffff 80 = fffffffd c0 ;; BAD 4 80 * ffffffff 80 = 42 40 + lda #$f0 ; 2 + sta COLOR_MASK ; 3 + lda #8 ; 2 sta SCREEN_Y ; 3 ;============= - ; 11 + ; 16 + screeny_loop: - tay ; y=A ; 2 - and #$1 ; 2 - bne screeny_odd ; 2nt/3 -screeny_even: - lda #$0f ; 2 - bne screeny_continue ; 3 -screeny_odd: - tya ; 2 and #$fe ; 2 - tay ; 2 - lda #$f0 ; 2 -screeny_continue: + tay ; y=A ; 2 + + lda COLOR_MASK ; 3 + eor #$ff ; 2 sta COLOR_MASK ; 3 lda gr_offsets,Y ; lookup low-res memory address ; 4 @@ -653,17 +650,16 @@ screeny_continue: sta GBASH ; 3 ;============= - ; 39/35 + ; 33 + + ; horizontal_scale.i *ALWAYS* = 0 - lda #0 ; horizontal_scale.i = 0 ; 2 - sta HORIZ_SCALE_I ; 3 ; unsigned char horizontal_lookup[7][32]; ;horizontal_scale.f= ; horizontal_lookup[space_z.i&0xf][(screen_y-8)/2]; ; horizontal_lookup[(space_z<<5)+(screen_y-8)] lda SPACEZ_I ; 3 -; and #$f ; ; FIXME: would it be faster to ROR 4 times? asl ; 2 asl ; 2 @@ -679,17 +675,18 @@ screeny_continue: adc TEMP_I ; 3 tay ; 2 lda horizontal_lookup,Y ; 4 - sta HORIZ_SCALE_F ; 3 + ; sta HORIZ_SCALE_F ; + sta NUM1L ; 3 ;============ ; 37 ;; brk ASM, horiz_scale = 00:73 ; mul2 ; calculate the distance of the line we are drawing ; fixed_mul(&horizontal_scale,&scale,&distance); - lda HORIZ_SCALE_I ; 3 + lda #0 ;HORIZ_SCALE_I ; 2 sta NUM1H ; 3 - lda HORIZ_SCALE_F ; 3 - sta NUM1L ; 3 + ;lda HORIZ_SCALE_F ; + ;sta NUM1L ; lda #CONST_SCALE_I ; SCALE_I ; 2 sta NUM2H ; 3 lda #CONST_SCALE_F ; SCALE_F ; 2 @@ -699,7 +696,7 @@ screeny_continue: sta DISTANCE_I ; 2 stx DISTANCE_F ; 2 ;========== - ; 34 + ; 27 ;; brk ASM, distance = 08:fc ; calculate the dx and dy of points in space when we step