tfv: move spacez updates out of line

This commit is contained in:
Vince Weaver 2017-11-30 00:13:23 -05:00
parent dc0827941e
commit d3a054b98b
4 changed files with 161 additions and 132 deletions

View File

@ -619,6 +619,21 @@ y_positive:
cycles.multiply+=12; cycles.multiply+=12;
} }
static void update_z_factor(void) {
/* only do this if SPACEZ changes? */
// mul1
fixed_mul(ram[SPACEZ_I],ram[SPACEZ_F],
CONST_BETA_I,CONST_BETA_F,
&ram[FACTOR_I],&ram[FACTOR_F],0);
cycles.flying+=60;
if (!displayed) {
printf("SPACEZ/BETA/FACTOR %x %x * %x %x = %x %x\n",
ram[SPACEZ_I],ram[SPACEZ_F],
CONST_BETA_I, CONST_BETA_F,
ram[FACTOR_I],ram[FACTOR_F]);
}
}
static void draw_background_mode7(void) { static void draw_background_mode7(void) {
@ -648,18 +663,7 @@ static void draw_background_mode7(void) {
/* FIXME: only do this if SPACEZ changes? */
// mul1
fixed_mul(ram[SPACEZ_I],ram[SPACEZ_F],
CONST_BETA_I,CONST_BETA_F,
&ram[FACTOR_I],&ram[FACTOR_F],0);
cycles.mode7+=36;
if (!displayed) {
printf("SPACEZ/BETA/FACTOR %x %x * %x %x = %x %x\n",
ram[SPACEZ_I],ram[SPACEZ_F],
CONST_BETA_I, CONST_BETA_F,
ram[FACTOR_I],ram[FACTOR_F]);
}
ram[SCREEN_Y]=8; ram[SCREEN_Y]=8;
cycles.mode7+=10; cycles.mode7+=10;
@ -689,7 +693,7 @@ static void draw_background_mode7(void) {
horizontal_lookup[((ram[SPACEZ_I]&0xf)<<5)+ horizontal_lookup[((ram[SPACEZ_I]&0xf)<<5)+
(ram[SCREEN_Y]-8)]; (ram[SCREEN_Y]-8)];
cycles.mode7+=37; cycles.mode7+=16;
if (!displayed) { if (!displayed) {
printf("HORIZ_SCALE %x %x\n", printf("HORIZ_SCALE %x %x\n",
@ -915,6 +919,8 @@ int flying(void) {
ram[SPACEZ_I]=4; ram[SPACEZ_I]=4;
ram[SPACEZ_F]=0x80; /* Z=4.5 */ ram[SPACEZ_F]=0x80; /* Z=4.5 */
update_z_factor();
while(1) { while(1) {
memset(&cycles,0,sizeof(cycles)); memset(&cycles,0,sizeof(cycles));
cycles.flying+=6; cycles.flying+=6;
@ -935,6 +941,7 @@ int flying(void) {
if (ram[SHIPY]>16) { if (ram[SHIPY]>16) {
ram[SHIPY]-=2; ram[SHIPY]-=2;
ram[SPACEZ_I]++; ram[SPACEZ_I]++;
update_z_factor();
} }
ram[SPLASH_COUNT]=0; ram[SPLASH_COUNT]=0;
} }
@ -943,6 +950,7 @@ int flying(void) {
if (ram[SHIPY]<28) { if (ram[SHIPY]<28) {
ram[SHIPY]+=2; ram[SHIPY]+=2;
ram[SPACEZ_I]--; ram[SPACEZ_I]--;
update_z_factor();
} }
else { else {
ram[SPLASH_COUNT]=10; ram[SPLASH_COUNT]=10;
@ -1004,6 +1012,7 @@ int flying(void) {
/* Land the ship */ /* Land the ship */
for(loop=ram[SPACEZ_I];loop>0;loop--) { for(loop=ram[SPACEZ_I];loop>0;loop--) {
update_z_factor();
draw_background_mode7(); draw_background_mode7();
cycles.put_sprite+=grsim_put_sprite(shadow_forward,CONST_SHIPX+3,31+ram[SPACEZ_I]); 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]); cycles.put_sprite+=grsim_put_sprite(ship_forward,CONST_SHIPX,ram[SHIPY]);

View File

@ -198,6 +198,17 @@ Have loop counter count down from 40 instead of count up (avoid compare)
Total = 181,993 Total = 181,993
Frame Rate = 5.49 fps Frame Rate = 5.49 fps
Move spacez updates out of line and also do some self modifying code
Cycles: flying= 187
Cycles: getkey= 46
Cycles: page_flip= 26
Cycles: multiply= 40,680
Cycles: mode7= 114,830
Cycles: lookup_map= 22,747
Cycles: put_sprite= 2,561
================================
Total = 181,077
Frame Rate = 5.52 fps
Each cycle removed from inner X loop saves Each cycle removed from inner X loop saves

View File

@ -55,6 +55,8 @@ flying_start:
lda #$80 lda #$80
sta SPACEZ_F sta SPACEZ_F
jsr update_z_factor
flying_loop: flying_loop:
lda SPLASH_COUNT ; 3 lda SPLASH_COUNT ; 3
@ -86,6 +88,7 @@ flying_keyboard:
dec SHIPY dec SHIPY
dec SHIPY ; move ship up dec SHIPY ; move ship up
inc SPACEZ_I ; incement height inc SPACEZ_I ; incement height
jsr update_z_factor
lda #0 lda #0
sta SPLASH_COUNT sta SPLASH_COUNT
@ -103,6 +106,7 @@ check_down:
inc SHIPY inc SHIPY
inc SHIPY ; move ship down inc SHIPY ; move ship down
dec SPACEZ_I ; decrement height dec SPACEZ_I ; decrement height
jsr update_z_factor
bcc check_left bcc check_left
splashy: splashy:
@ -239,6 +243,9 @@ landing_loop:
jsr page_flip jsr page_flip
dec SPACEZ_I dec SPACEZ_I
jsr update_z_factor
lda SPACEZ_I
bpl landing_loop bpl landing_loop
@ -544,6 +551,45 @@ draw_ship:
jmp flying_loop ; 3 jmp flying_loop ; 3
update_z_factor:
; we only do the following if Z changes
; fixed_mul(&space_z,&BETA,&factor);
;mul1
lda SPACEZ_I ; 3
sta NUM1H ; 3
; interlude, update SPACEZ_SHIFTED
asl ; 2
asl ; 2
asl ; 2
asl ; 2
asl ; 2
sec ; 2
sbc #8 ; 2
sta spacez_shifted+1 ; 4
lda SPACEZ_F ; 3
sta NUM1L ; 3
lda #CONST_BETA_I ; BETA_I ; 2
sta NUM2H ; 3
lda #CONST_BETA_F ; BETA_F ; 2
sta NUM2L ; 3
sec ; don't reuse old values ; 2
jsr multiply ; 6
sta FACTOR_I ; 3
stx FACTOR_F ; 3
rts ; 6
;===========
; 60
;=========================== ;===========================
; Draw the Mode7 Background ; Draw the Mode7 Background
;=========================== ;===========================
@ -594,31 +640,6 @@ sky_loop: ; draw line across screen
no_draw_sky: no_draw_sky:
; FIXME: only do the following 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
sta NUM1H ; 3
lda SPACEZ_F ; 3
sta NUM1L ; 3
lda #CONST_BETA_I ; BETA_I ; 2
sta NUM2H ; 3
lda #CONST_BETA_F ; BETA_F ; 2
sta NUM2L ; 3
sec ; 2
jsr multiply ; 6
sta FACTOR_I ; 3
stx FACTOR_F ; 3
;===========
; 36
; setup initial odd/even color mask ; setup initial odd/even color mask
lda #$f0 ; 2 lda #$f0 ; 2
sta COLOR_MASK ; 3 sta COLOR_MASK ; 3
@ -670,113 +691,99 @@ calc_horizontal_scale:
; horizontal_lookup[space_z.i&0xf][(screen_y-8)/2]; ; horizontal_lookup[space_z.i&0xf][(screen_y-8)/2];
; horizontal_lookup[(space_z<<5)+(screen_y-8)] ; horizontal_lookup[(space_z<<5)+(screen_y-8)]
lda SPACEZ_I ; 3
; FIXME: would it be faster to ROR 4 times?
; FIXME: or calculate this outside the loop?
; FIXME: can also subtract the 8 outside the loop?
asl ; 2
asl ; 2
asl ; 2
asl ; 2
asl ; 2
sta TEMP_I ; 3
sec ; 2
lda SCREEN_Y ; 3
sbc #8 ; 2
clc ; 2 clc ; 2
adc TEMP_I ; 3 lda SCREEN_Y ; 3
spacez_shifted:
adc #0 ; self-modify, loads (spacez<<5)-8 ; 2
tay ; 2 tay ; 2
lda horizontal_lookup,Y ; 4 lda horizontal_lookup,Y ; 4
; sta HORIZ_SCALE_F ; sta NUM1L ; HORIZ_SCALE_F is input to next mul ; 3
sta NUM1L ; 3
;============ ;============
; 37 ; 16
;; brk ASM, horiz_scale = 00:73
; mul2 ; mul2
; calculate the distance of the line we are drawing ; calculate the distance of the line we are drawing
; fixed_mul(&horizontal_scale,&scale,&distance); ; fixed_mul(&horizontal_scale,&scale,&distance);
lda #0 ;HORIZ_SCALE_I ; 2 lda #0 ; HORIZ_SCALE_I is always zero ; 2
sta NUM1H ; 3 sta NUM1H ; 3
;lda HORIZ_SCALE_F ; ; NUM1L was set to HORIZ_SCALE_F previously ;
;sta NUM1L ;
lda #CONST_SCALE_I ; SCALE_I ; 2 lda #CONST_SCALE_I ; SCALE_I ; 2
sta NUM2H ; 3 sta NUM2H ; 3
lda #CONST_SCALE_F ; SCALE_F ; 2 lda #CONST_SCALE_F ; SCALE_F ; 2
sta NUM2L ; 3 sta NUM2L ; 3
sec ; 2 sec ; don't reuse previous settings ; 2
jsr multiply ; 6 jsr multiply ; 6
sta DISTANCE_I ; 2 sta DISTANCE_I ; 2
stx DISTANCE_F ; 2 stx DISTANCE_F ; 2
;========== ;==========
; 27 ; 27
;; brk ASM, distance = 08:fc
; calculate the dx and dy of points in space when we step ; calculate the dx and dy to add to points in space
; through all points on this line ; we add to the starting values on each row to get the next
; space values
lda ANGLE ; dx.i=fixed_sin[(angle+8)&0xf].i; // -sin() ; 3 ; dx.i=fixed_sin[(angle+8)&0xf].i // -sin()
lda ANGLE ; 3
clc ; 2 clc ; 2
adc #8 ; 2 adc #8 ; 2
and #$f ; 2 and #$f ; 2
asl ; 2 asl ; 2
tay ; 2 tay ; 2
lda fixed_sin,Y ; 4 lda fixed_sin,Y ; load integer half ; 4
; sta DX_I ; sta NUM2H ; use as source in upcomnig mul ; 3
sta NUM2H ; 3
iny ; dx.f=fixed_sin[(angle+8)&0xf].f; // -sin() ; 2
lda fixed_sin,Y ; 4 ; dx.f=fixed_sin[(angle+8)&0xf].f; // -sin()
; sta DX_F ; iny ; point to float half ; 2
sta NUM2L ; 3 lda fixed_sin,Y ; load it from lookup table ; 4
sta NUM2L ; use as source in upcoming mul ; 3
;========== ;==========
; 29 ; 29
;mul3 ;mul3
; fixed_mul(&dx,&horizontal_scale,&dx); ; fixed_mul(&dx,&horizontal_scale,&dx);
; lda DX_I ; ; DX_I:DX_F already set in NUM2H:NUM2L
; sta NUM2H ;
; lda DX_F ;
; sta NUM2L ;
clc ; reuse HORIZ_SCALE in NUM1 ; 2 clc ; reuse HORIZ_SCALE in NUM1 ; 2
jsr multiply ; 6 jsr multiply ; 6
sta DX_I ; 3 sta DX_I ; 3
stx DX_F ; 3 stx DX_F ; 3
;========== ;==========
; 14 ; 14
;; ANGLE
;; brk ASM, dx = 00:00
lda ANGLE ; dy.i=fixed_sin[(angle+4)&0xf].i; // cos() ; 3 ; dy.i=fixed_sin[(angle+4)&0xf].i; // cos()
lda ANGLE ; 3
clc ; 2 clc ; 2
adc #4 ; 2 adc #4 ; 2
and #$f ; 2 and #$f ; 2
asl ; 2 asl ; 2
tay ; 2 tay ; 2
lda fixed_sin,Y ; 4 lda fixed_sin,Y ; load integer half ; 4
; sta DY_I ; sta NUM2H ; use as source in upcoming mul ; 3
sta NUM2H ; 3
iny ; dy.f=fixed_sin[(angle+4)&0xf].f; // cos() ; 2 ; dy.f=fixed_sin[(angle+4)&0xf].f; // cos()
lda fixed_sin,Y ; 4
; sta DY_F ; iny ; point to float half ; 2
sta NUM2L ; 3 lda fixed_sin,Y ; load from lookup table ; 4
sta NUM2L ; use as source in upcoming mul ; 3
;========== ;==========
; 29 ; 29
;mul4 ;mul4
; fixed_mul(&dy,&horizontal_scale,&dy); ; fixed_mul(&dy,&horizontal_scale,&dy);
; lda DY_I ; ; DY_I:DY_F already in NUM2H:NUM2L
; sta NUM2H ;
; lda DY_F ;
; sta NUM2L ;
clc ; reuse horiz_scale in num1 ; 2 clc ; reuse horiz_scale in num1 ; 2
jsr multiply ; 6 jsr multiply ; 6
sta DY_I ; 3 sta DY_I ; 3
stx DY_F ; 3 stx DY_F ; 3
;========== ;==========
; 14 ; 14
;; brk ASM, dy = 00:73
;=================================
; calculate the starting position ; calculate the starting position
;=================================
; fixed_add(&distance,&factor,&space_x); ; fixed_add(&distance,&factor,&space_x);
clc ; fixed_add(&distance,&factor,&space_y); ; 2 clc ; fixed_add(&distance,&factor,&space_y); ; 2
@ -784,27 +791,31 @@ calc_horizontal_scale:
adc FACTOR_F ; 3 adc FACTOR_F ; 3
sta SPACEY_F ; 3 sta SPACEY_F ; 3
sta SPACEX_F ; 3 sta SPACEX_F ; 3
lda DISTANCE_I ; 3 lda DISTANCE_I ; 3
adc FACTOR_I ; 3 adc FACTOR_I ; 3
sta SPACEY_I ; 3 sta SPACEY_I ; 3
sta SPACEX_I ; 3 sta SPACEX_I ; 3
;========== ;==========
; 26 ; 26
;; brk space_x = 06:bc
lda ANGLE ; temp.i=fixed_sin[(angle+4)&0xf].i; // cos ; 3
; temp.i=fixed_sin[(angle+4)&0xf].i; // cos()
lda ANGLE ; 3
clc ; 2 clc ; 2
adc #4 ; 2 adc #4 ; 2
and #$f ; 2 and #$f ; 2
asl ; 2 asl ; 2
tay ; 2 tay ; 2
lda fixed_sin,Y ; 4 lda fixed_sin,Y ; 4
; sta TEMP_I ; sta NUM2H ; store as source for next mul ; 3
sta NUM2H ; 3
iny ; temp.f=fixed_sin[(angle+4)&0xf].f; // cos ; 2
; temp.f=fixed_sin[(angle+4)&0xf].f; // cos()
iny ; 2
lda fixed_sin,Y ; 4 lda fixed_sin,Y ; 4
; sta TEMP_F ; sta NUM2L ; store as source for next mul ; 3
sta NUM2L ; 3
;========== ;==========
; 29 ; 29
@ -814,18 +825,16 @@ calc_horizontal_scale:
sta NUM1H ; 3 sta NUM1H ; 3
lda SPACEX_F ; 3 lda SPACEX_F ; 3
sta NUM1L ; 3 sta NUM1L ; 3
; lda TEMP_I ; ; NUM2H:NUM2L already set above
; sta NUM2H ; sec ; don't reuse previous NUM1 ; 2
; lda TEMP_F ;
; sta NUM2L ;
sec ; 2
jsr multiply ; 6 jsr multiply ; 6
sta SPACEX_I ; 3 sta SPACEX_I ; 3
stx SPACEX_F ; 3 stx SPACEX_F ; 3
;========== ;==========
; 26 ; 26
clc ; fixed_add(&space_x,&cx,&space_x); ; 2 ; fixed_add(&space_x,&cx,&space_x);
clc ; 2
lda SPACEX_F ; 3 lda SPACEX_F ; 3
adc CX_F ; 3 adc CX_F ; 3
sta SPACEX_F ; 3 sta SPACEX_F ; 3

View File

@ -54,35 +54,35 @@ OUTH EQU $FF
;; Flying Routine Only ;; Flying Routine Only
TURNING EQU $60 TURNING EQU $60
SCREEN_X EQU $61 ;SCREEN_X EQU $61 ; not used?
SCREEN_Y EQU $62 SCREEN_Y EQU $62
ANGLE EQU $63 ANGLE EQU $63
HORIZ_SCALE_I EQU $64 HORIZ_SCALE_I EQU $64
HORIZ_SCALE_F EQU $65 HORIZ_SCALE_F EQU $65
FACTOR_I EQU $66 FACTOR_I EQU $66
FACTOR_F EQU $67 FACTOR_F EQU $67
DX_I EQU $68 DX_I EQU $68
DX_F EQU $69 DX_F EQU $69
SPACEX_I EQU $6A SPACEX_I EQU $6A
SPACEX_F EQU $6B SPACEX_F EQU $6B
CX_I EQU $6C CX_I EQU $6C
CX_F EQU $6D CX_F EQU $6D
DY_I EQU $6E DY_I EQU $6E
DY_F EQU $6F DY_F EQU $6F
SPACEY_I EQU $70 SPACEY_I EQU $70
SPACEY_F EQU $71 SPACEY_F EQU $71
CY_I EQU $72 CY_I EQU $72
CY_F EQU $73 CY_F EQU $73
TEMP_I EQU $74 TEMP_I EQU $74
TEMP_F EQU $75 TEMP_F EQU $75
DISTANCE_I EQU $76 DISTANCE_I EQU $76
DISTANCE_F EQU $77 DISTANCE_F EQU $77
SPACEZ_I EQU $78 SPACEZ_I EQU $78
SPACEZ_F EQU $79 SPACEZ_F EQU $79
DRAW_SPLASH EQU $7A DRAW_SPLASH EQU $7A
SPEED EQU $7B SPEED EQU $7B
SPLASH_COUNT EQU $7C SPLASH_COUNT EQU $7C
OVER_LAND EQU $7D OVER_LAND EQU $7D
NUM1L EQU $7E NUM1L EQU $7E
NUM1H EQU $7F NUM1H EQU $7F