From 24269638fbe25ecbcbd3d40846fe6ef3e4f16c7f Mon Sep 17 00:00:00 2001 From: blondie7575 Date: Mon, 5 Mar 2018 12:32:05 -0800 Subject: [PATCH] Fixed stack-based clip/unclip --- equates.s | 4 +-- gamemanager.s | 7 ++-- gscats.2mg | Bin 819264 -> 819264 bytes macros.s | 16 +++++++-- terrain.s | 97 ++++++++++++++++++++++++++++---------------------- terrain_e1.s | 2 +- 6 files changed, 73 insertions(+), 53 deletions(-) diff --git a/equates.s b/equates.s index 17d2234..6558ecf 100644 --- a/equates.s +++ b/equates.s @@ -39,12 +39,12 @@ lastCompiledTerrainY = $75 ; The highest Y value that the compiled renderer must ; Terrain constants TERRAINWIDTH = 640 ; In pixels MAXTERRAINHEIGHT = 100 ; In pixels -COMPILEDTERRAINROW = TERRAINWIDTH/4+3 ; In words, +3 to make room for clipping jump at end of row +COMPILEDTERRAINROW = TERRAINWIDTH/4+4 ; In words, +4 to make room for clipping jump at end of row VISIBLETERRAINWIDTH = TERRAINWIDTH/4 ; In words- width minus jump return padding VISIBLETERRAINWINDOW = 80 ; In words MAXSPANSPERROW = 15 SPANROWBYTES = MAXSPANSPERROW*2 + 2 ; In bytes - +CLIPPEDTERRAINSTACK = $3fff ; Location of stack where clipped terrain data lives ; Terrain data, stored as height values 2 pixels wide (bytes) terrainDataFar = $02f500 diff --git a/gamemanager.s b/gamemanager.s index 8d9427c..ba7a0b1 100644 --- a/gamemanager.s +++ b/gamemanager.s @@ -99,12 +99,9 @@ gameplayLoopRender: ; ; Render the terrain if needed -; lda terrainDirty -; beq gameplayLoopProjectiles + lda terrainDirty + beq gameplayLoopProjectiles BORDER_COLOR #$3 - jsr unclipTerrain - jsl unrenderTerrainSpans - jsr clipTerrain jsl renderTerrainSpans jsr renderTerrain diff --git a/gscats.2mg b/gscats.2mg index 1bbf047e460a44aea90ec1240074c969e49860d1..f3d501983f82001d242973f7b741ab6a8eced3d1 100644 GIT binary patch delta 2257 zcmZuydu&rx7(e%x-nCu3c0;Axj9dpMY>?%GII9i;UzyPDj#&s6#M*85QOCr@M>7A| zHQIoI8%XxYWisLY*Su?2%u5b?e{G3hs5}zE~n+S2ytBt8V0V@D3X7W}e;8cZBNB2la?O%IFBO^^JPO zk%t|(r5PhTw{Z+1j?vrg?DM7*J9j}|=K$Tmyjz=$JZx)|cCMe=>AlsEvWSqk7#%1s z?nT9I4C-TiR}X409inRK3omH+5cOc^lwi*INOYT?U0LqaovR=$b^xJ7t-DVD+2393 z9vU)ml?(7*-_?E;8~^duJ>R7-J)-*gzHQ|>8ihJqS+_W!0sHyNEE*U;K^qxPpxNN@ z@$oT4ja*sWal0Ot8|+0$uXRV6w{7g&qM^YSly-RagQ%5>GRj27Dcj`^V^hElX!VR1 zokW?lwmpxgYsbe;SeJfEKabQ=4aX=iHQJTkb(eNAMlC2FEwZCJzyjW0h&UWjFMvIk=@2$aa~Xa`sFK|Flyx zcKjzv|B8SoAf2B>{++G3N+Nr(CR&O+t0g!ziTT*LGR8 zh>mExSKfzItH|muJxk(=&y)~?$bp6I_QG6-8>WW+D6g1=ls8F!?S3cS5jIKQEF%O? zbA;bd51TkQ=V^`rNCN=oF#%{GkEt;MXl@!B00%{qiV~j&Oo?%~i(W`UHSF#e@lmNe zCgQ^qseRp55{wPBM8d}nL`F~|@i7T5aQU-Q8|b49Td=;nI;Wi2^baK`0lDtwQcqSe zN=p#;iyn(#l`$uIWuVJRxLQggCDKWnym+@(Nve5VYQM-;CtspHl@OA*=X>wgC6cVUtI)9UHkvGU0|R=MDWFJiKa j1FKEc_EjY`hy`R0h!unZDFCs7*g+g1g@;y^INSdQgl%)J delta 2057 zcmZuye@qis9DjF}qgM(oMdb<-PA~)fd1|&5<2H5EFlBhe*pZI8y7J>4KkBkb3=q;9 z>@<_hnEY`vF+&{EbGzs?OV?~<#NkFaSO_6RnNxIggKTWoiEfJ-`@Xiwmh77Ed!PHf z&-eSjz3;p4^?BFzdDorKj7xlcS*{78?~$H>wv};dFU>KC02(cScIR_jw`?xjv30E= zAcUBH#3F2ptUhw2QSQ79L?9bNHngqgkt_l(o{H;ZC{Np7+92iuExnLj3+> zwaPFD8~(zN7Woau69@^6>Sp;jq9T4n_8eyb?mz05U6D9^%PwW`40V({Ry4f^L)>K4 zm7Ls(l4}^$&Df?+EBkt=jWq32v>xh7Pd1M3Xj9c^K=1EDhh}!c_0})DHo(TB3ZR$PbpZuY&^_y58{}LCQkV6Cr!G)?H(zuzIh4nt)ron3&&qY8 z>ZNVdbs`|YZMt5R>qYH=Xq#>nB0!Fthr2g=ppR4Ew1o2!kAn*bdY zp}zBOng;?ji*mCFx}k%jd5Kmp4mF9wLeLB~i-M8S8pR=xsC>4Q%2Kx8qte%{#pZ0= zZMV;AQwLBdjqWf)O6X%`PBNVBeSI%iZj}&!)~oB9oo&F*aR(fZz_EK&Ds7CO656XP zJh?mY(S6E7@3Gh!W_aex&vJ_Wme7Sdsa}hH*fcqz8@}JN$gT?VV!JmVxV-SN2_{Yw z+85aeU_G1(x7*>0QAA^!Umm`B1pJkwCDeL4-5%&Gp}sUOTj{d73S6bG{jOHmdDp1x zp)0qnq^zZ^zYLXcDnC>{Sk6@h-Y=(~(q%lTjGl9ax+SPOIfuRk*&%)hDs%G|5T zYMT<#Ww+VlT>@MMlvXR$d!)BkGlTILcEr#6GSrUMVvau6f&+>;8ViD3~#D{Z4287Hc@s;=l zy5ZGmlE0^s1TG0Azn?Zlacs{^0s#;P0BjQlz(AZR69vFzMi>CYkx;Af^MF_3i#L9W zqm)S_oe5p8eFSUQr1nv)jZ37bwc91QkDwAsn}{HC2dz)LF2Nz);_&H#_c8oxd%Gh> zT3-GaSt>z-?M|s<1&+M@4s8URb%ntytyJP9NV!ykdW4X-%0q@Z<7(}a9IcoBjYuu~8h% z!C^fgZww(cyn3LIMxNnmP^YCu)f@nDFe2y;WNZ|9pGdR`B>uP6WQ!R-xrWTs>IgJl zXu_}|zpa{7WGN=)Sb?4M9|s`d`I1ggl1hpC%(eS5%rA-cc36c6^htF@K+dWa{YPIH+!c2!#D!dvEKt2s_3!PrPNAg21 z{@%N+?avX=2n$Z$Wyz_Q^RN>VpHDP6f;mZ#;9D??ZBu6C(+6YD!BNT2?@r{ilHgdk myA)6%#ep$k@nCu|7R&&a(6h;6bpHdzTLHfS diff --git a/macros.s b/macros.s index 4bfb12a..f085df1 100644 --- a/macros.s +++ b/macros.s @@ -30,7 +30,7 @@ .macro DBR bankNum BITS8 - lda bankNum + lda #bankNum pha plb BITS16 @@ -109,7 +109,7 @@ .macro FASTGRAPHICS ;34 cycles, 12 bytes sei ;2 phd ;4 - sep #%00100000 ; 3 16-bit A only, to preserve X/Y + sep #%00100000 ; 3 8-bit A only, to preserve X/Y .a8 lda STACKCTL ;5 @@ -125,7 +125,7 @@ .macro SLOWGRAPHICS ;28 cycles, 12 bytes - sep #%00100000 ; 3 16-bit A only, to preserve X/Y + sep #%00100000 ; 3 8-bit A only, to preserve X/Y .a8 lda STACKREGISTER ;4 @@ -177,6 +177,16 @@ nobrk: pla .endmacro +.macro BREAK_NOSTACK + lda breakpoint + beq nobrk + lda #1 + sta $e1c029 + brk +nobrk: +.endmacro + + .macro HARDBRK pha lda #1 diff --git a/terrain.s b/terrain.s index cc4d173..58e3df4 100644 --- a/terrain.s +++ b/terrain.s @@ -20,7 +20,7 @@ renderTerrain: tcs ; 2 sec - lda #compiledTerrainEnd-VISIBLETERRAINWINDOW-3 + lda #compiledTerrainEnd-VISIBLETERRAINWINDOW-4 sbc mapScrollPos sta PARAML0 @@ -32,6 +32,7 @@ renderTerrainLoop: jmp (PARAML0) renderRowComplete: + lda PARAML0 sec sbc #COMPILEDTERRAINROW @@ -127,44 +128,43 @@ craterTerrainDone: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; clipTerrain ; +; Saves the compiled terrain data that we overwrite into +; a buffer at $E04000. We do this by shadowing the stack +; to that area and pushing. ; clipTerrain: SAVE_AXY + ; Shadow stack into $E04000 to save clipped data fast + tsc + sta STACKPTR + lda #CLIPPEDTERRAINSTACK + tcs + sec - lda #COMPILEDTERRAINROW*MAXTERRAINHEIGHT-3 + lda #COMPILEDTERRAINROW*MAXTERRAINHEIGHT-4 sbc mapScrollPos tay + ldx #0 clipTerrainLoop: - clc ; Compute buffer to use for saved data - txa - asl - asl - adc #clippedTerrainData;-4 - sta PARAML0 - lda compiledTerrain,y - sta (PARAML0) ; Preserve data we're overwriting - inc PARAML0 - inc PARAML0 - - and #$ff00 - ora #$004c ; jmp in low byte - + pha + lda #$4cea ; NOP followed by JMP sta compiledTerrain,y - iny + iny + iny lda compiledTerrain,y - sta (PARAML0) ; Preserve data we're overwriting + pha lda #renderRowComplete sta compiledTerrain,y tya sec - sbc #COMPILEDTERRAINROW+1 + sbc #COMPILEDTERRAINROW+2 tay inx @@ -172,6 +172,12 @@ clipTerrainLoop: bcc clipTerrainLoop beq clipTerrainLoop + ; Put stack back where it belongs + tsc + sta clippedTerrainStackPtr + lda STACKPTR + tcs + RESTORE_AXY rts @@ -179,42 +185,52 @@ clipTerrainLoop: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; unclipTerrain ; +; Restores the compiled terrain data that we wrote +; to a buffer at $E04000. We do this by mapping the stack +; to $4000, then using stack-relative addressing to pull the data. +; We can't pop the data because it's all stored in reverse. ; +; On first move-left unclip every second row is unclipped incorrectly unclipTerrain: SAVE_AXY + phd + lda #(CLIPPEDTERRAINSTACK & $ff00) + pha + pld ; Point direct page at our clip data + sec - lda #COMPILEDTERRAINROW*MAXTERRAINHEIGHT-3 + lda #COMPILEDTERRAINROW*MAXTERRAINHEIGHT-4 sbc mapScrollPos tay - ldx #0 + + lda clippedTerrainStackPtr + and #$00ff + tax + inx unclipTerrainLoop: - clc ; Compute buffer that saved data is in - txa - asl - asl - adc #clippedTerrainData;-4 - sta PARAML0 - - lda (PARAML0) + lda 2,x sta compiledTerrain,y - inc PARAML0 - inc PARAML0 + iny iny - lda (PARAML0) + lda 0,x sta compiledTerrain,y tya sec - sbc #COMPILEDTERRAINROW+1 + sbc #COMPILEDTERRAINROW+2 tay inx - cpx lastCompiledTerrainY - bcc unclipTerrainLoop - beq unclipTerrainLoop + inx + inx + inx + cpx #$100 ; When x hits the top of the stack, we're done + bne unclipTerrainLoop + + pld RESTORE_AXY rts @@ -471,13 +487,10 @@ generateTerrainLoop: compiledTerrain: .repeat COMPILEDTERRAINROW * MAXTERRAINHEIGHT - .byte 0 + .byte $00 .endrepeat compiledTerrainEnd: -clippedTerrainData: - .repeat MAXTERRAINHEIGHT - .byte 0,0,0,0 ; xx,jmp,addr - .endrepeat - +clippedTerrainStackPtr: + .word 0 diff --git a/terrain_e1.s b/terrain_e1.s index 84b269f..4a51b69 100644 --- a/terrain_e1.s +++ b/terrain_e1.s @@ -10,7 +10,7 @@ .include "equates.s" .include "macros.s" -UNRENDERCACHESTACK = $7ff +UNRENDERCACHESTACK = $7ff ; Stack downwards from bottom of VRAM. Mirrored from $01 into $E1! OP16