From c82e9d8a30c6b8ba39a02869e8328596b0feb84d Mon Sep 17 00:00:00 2001 From: blondie7575 Date: Sat, 6 Jan 2018 15:30:06 -0800 Subject: [PATCH] First working version of virtual stack unrender So fast!! --- GenerateSpanDataTable.py | 25 ++++++++++++++++ equates.s | 1 + gamemanager.s | 3 +- gscats.2mg | Bin 819264 -> 819264 bytes terrain.s | 60 ++++++++++++++++++++------------------- 5 files changed, 59 insertions(+), 30 deletions(-) create mode 100755 GenerateSpanDataTable.py diff --git a/GenerateSpanDataTable.py b/GenerateSpanDataTable.py new file mode 100755 index 0000000..1018c12 --- /dev/null +++ b/GenerateSpanDataTable.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python3 + +import sys + + +def main(argv): + + print ("terrainSpanDataPtr:",end="") + rowCount = 19 + MAXTERRAINHEIGHT = 100 # Must match assembly code! + + for jump in range(0,MAXTERRAINHEIGHT): + rowCount += 1 + if (rowCount==20): + print ("\n\t.word ", end="") + rowCount=0 + + print ("SPANROWSIZE*%d" % (jump), end="") + if (rowCount<19): + print (",", end="") + + +if __name__ == "__main__": + main(sys.argv[1:]) + diff --git a/equates.s b/equates.s index 092c765..a6e9dc1 100644 --- a/equates.s +++ b/equates.s @@ -27,6 +27,7 @@ SCRATCHL = $19 ; 16-bit version of scratch SCRATCHL2 = $67 ; Second 16-bit scratch PARAM24 = $67 ; 24-bit param (This is almost certainly messing up AppleSoft, but meh) CACHEPTR = $6A ; General purpose cache pointer (This is almost certainly messing up AppleSoft, but meh) +CACHEDATA = $6C ; General purpose cache data (This is almost certainly messing up AppleSoft, but meh) STACKPTR = $70 ; Cache for stack pointer in fast graphics SHADOWREGISTER = $72 ; Cache for shadow register in fast graphics STACKREGISTER = $73 ; Cache for stack register in fast graphics diff --git a/gamemanager.s b/gamemanager.s index f9e4bcf..64b3dc9 100644 --- a/gamemanager.s +++ b/gamemanager.s @@ -31,6 +31,7 @@ beginGameplay: jsr compileTerrainSpans ; jsr compileTerrain ; jsr clipTerrain + jsr renderTerrainSpans ; Create players lda #56 @@ -57,8 +58,8 @@ gameplayLoop: ; lda terrainDirty ; beq gameplayLoopKbd BORDER_COLOR #$3 + jsr unrenderTerrainSpans jsr renderTerrainSpans -; jsr unrenderTerrainSpans stz terrainDirty BORDER_COLOR #$1 diff --git a/gscats.2mg b/gscats.2mg index 51a9bab6c8bd967bfc5666818d9212b629405bd8..e9d254fd889b287f4750b05b56b1d393379c6af3 100644 GIT binary patch delta 2023 zcmY*aZ){Ul6u-{9yQC1}5q>(}IkN%c$qRuKsCr?mhQ+ zf9IZa@44^XjJ!T0uRpuOT(x>tz=_Zg$VQdEwdT4Ft5+>|Q3O$iLHBNc;?c(*d3eY6 z9oq!~A!NCTcywfwG5ZhgtuAw_%ZzWy_-N|T+c<_R>U~-~HFpeWEAfDOsSh9Mb_LU& zth=2`d=(*;(k4U(n7wn%u;zVI7Pcd$y42d;v>8n8`9Yxa^Y-mb{jt6{B! zjaoE>$e&)V!(LXq{%ZSYlAQNWA|zO}msnz7X^_bIm1WEh*#FpEeTl-=t5-h2oy^s+ zdYHvax{+;}HhWLBLwg=YZAqIE-*Ea!b<_ick+HWojI<|^;otq*tJS&vBIlZzh;}AD z+XMuhPI)RYyDo0@7ClQLpRX?s>Hsg$1(o6hN&!Bxc z78C9pbRV!}XPg3`J)-{Jk5@WdMS3z|7qt7nVaW1M=W+_j^}QG|E`FJq0wh~_rVgm2%5rEbui((0+^~EpjzX&ZnwIv72#}ZVMxuLcA~afQ}b2 zdk1_LOMd3NUlrANT{w*rcx=Fzcl|tR%HKW__i2Lip-?B^P# z#?Hn><9CgV1G@u*fyuzyjj1QU#6c5tpQyff0lRJAIElqcW*w@20WYsO(M$%_+y(qV zcW)JdL#-lwE7yfH8#0p(1s3-}KQ6$%C-*z_eInON+C)7f<~QphQ81BjoAe!G!9?yh z={srf67^lQCt?qmnIt!x$%!BV7o*MOc2M6?M)Gn~x2)^O zC3*%eQIFmu3AOrjVsVgq_rh}oQ@4mk@Q+a zqa!GhdQA}S@Z~j88{kn3Ip>S_NF{J!-G9Jd31W-)OGEoaqr!!CtHhZ?zXkPP$=wdo z_DYbDERs8(rcGJg2aiiiDP@XP64qr8FuTVqn+okgvEl5SRGk}^6Mrt49ZV~NnKru>;?t+ z4ucQvJWs4%O0A?$xJ}g04B2Az)0$O+bKvU1D|x+{W@NXK{(WMEz9f&(gR>7qg5Z?t zyFf#$DH)X?hf1mZ5WpmyQlZ(Hr#IFEn^*Zo%u;`^Bv`X&kig2nXU`NlM*dzi)0YQI zYRSsEN$-~mmZ5$rlhr0kMMEKv)oa L>gZJE#eu&8Av5c3 delta 1976 zcmY*aeN0nV6u-BHLQ8?7LtatFdkA(NQ=W{K+WV+FH-m~Fe<35dHCqU@lR5v`5{ZtN zxK3hx`(pASW09DUQQQl2{?RoX8!*Mz0ILmQiUz^OICN-r)444hJNLC6+e^;9=l<^b z_`Q42J8w`d9TZDH&reP-EX*?^^dm~8O50P(xn&6iQALBE*tGMx=bzoUW802xJdY64 zokbkluwLDzj;eCFIoaQwjDHpJcK^P2a4SxFxXS18|9J$5(r|-(t_|0>ObLO#dd6)+ z(p4dFM=wnafv8@Z5!mZOqpP;V5Py0D9=#Oiz*dTIKCqrp$4QRODQI?8PSyH6daurh z5F0A+c?=1)`H#kbH(9A*1|eSOdri+?i5aod$^>Qr?0?p?g=!pjwoo4Z2=8t21@pWf z-z&(Q%C1azgdeGaM?52*FFa90A7nm((5!eT9-}8!CEgp@oaHscqHkb#S)aQbsl=EA zm04pY#FQQkR`!^;@W^X!6mQ$-ONh6j$4uiK{m{c4t#3G|GiCM#gVe?jMuEyKaXOa3 zCu;0BbZ?t)n5};=Fz%5IuP$)&8Lzp+(A(O|KiR?5>p~+LJQvz5Ki-a4W^ja_1h549 zx6C1M!Ck29<2V_gzOA_NRlX3RamLLb& zq##GL&j&fsdhPS0oHWWQ7dZR;I46yBfsu@{an59HZ5lN{KMO>m|a$|yG$=J?0JW^9tl9v=eZG{bH@gwrCu&bFEHpQ|rfONqFPy@R#uzIAji{}<{VkwIRGBX}6Pg%L_wzZOd=Q zE{;IqU+4SF24}2MJ$?`7VIJy(Eio!qVyb4JCQ300Z&GpyuVqg-6f=ox*^on7PUk6y zl1Jy;j`vK1Gwgtq-Ce;#{5PHKP=%6Dw+=ZJ3w7;qDA};C;!)MR>sY}dDoRVWK;M3= z*R0eEe73Thgm$5*wa09q+l6RxFA-M&7|rQ1Gj2fOl8ilO*xO1=D2KR|B9a@@plG^O zL_RAb?EA*9eB$aVBH}$L7b%;#*aJpjC9Ng~se~}@kCC*N_!g)$TV*VxR7;H1lp`(( z(8nH0i^nm?fzt_KIRwswEOPyK_|VHSs=wq?7Q;LxdD9Wo?dZXsYZ}$)cchtNXUeEEqq99u~U3hSqmKl zvhmyD<5wn#bV2RIqv|-$jTVt;Dw|>qArxK{9Mqu9@H|-O=Ekg<+)p=*U_(nTbu%L9 z8+07!*h?JsNTXSY}R@@&-)?-4q~i90t*VXhD)dl0kGJDIlpJdJu#E;9T0- G_J06M!0kK$ diff --git a/terrain.s b/terrain.s index 0aef0a4..1b02058 100644 --- a/terrain.s +++ b/terrain.s @@ -69,7 +69,12 @@ renderTerrainDone: ; ; renderTerrainSpans: - pha + SAVE_AXY + FASTGRAPHICS + + lda #$800 ; Prepare unrender cache + tcs + lda #terrainSpanWriteCache sta CACHEPTR @@ -77,23 +82,6 @@ renderTerrainSpans: renderTerrainSpansLoop: sta PARAML1 - jsr renderTerrainRowSpans - dec - bne renderTerrainSpansLoop - - pla - rts - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; renderTerrainRowSpans: -; -; PARAML1 = Row index (bottom relative) -; -; Trashes SCRATCHL,SCRATCHL2,PARAML0 -; -renderTerrainRowSpans: - SAVE_AXY ; Find row data lda PARAML1 @@ -120,18 +108,17 @@ renderTerrainRowSpans: lda #0 clc - renderTerrainRowSpansFindLeftLoop: adc terrainSpanData+2,y cmp leftScreenEdge bpl renderTerrainRowSpansFoundLeft iny iny - pha + sta CACHEDATA lda SCRATCHL eor #%110000 ; Toggle span color cache sta SCRATCHL - pla + lda CACHEDATA bra renderTerrainRowSpansFindLeftLoop renderTerrainRowSpansFoundLeft: @@ -147,10 +134,11 @@ renderTerrainRowSpansLoop: sta VRAMBANK,x ; Cache the index we wrote to so we can erase later - txa - sta (CACHEPTR) - inc CACHEPTR - inc CACHEPTR + phx +; txa +; sta (CACHEPTR) +; inc CACHEPTR +; inc CACHEPTR ; Advance to end of span clc @@ -171,10 +159,17 @@ renderTerrainRowSpansLoop: bra renderTerrainRowSpansLoop renderTerrainRowSpansDone: + lda PARAML1 + dec + bne renderTerrainSpansLoop + + pea 0 ; Null-terminate the unrender cache + SLOWGRAPHICS RESTORE_AXY rts + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; unrenderTerrainSpans: ; @@ -182,18 +177,25 @@ renderTerrainRowSpansDone: unrenderTerrainSpans: SAVE_AXY + phb + pea $e1e1 ; Work entirely in bank E1 for all local read/writes + plb + plb + + ldy #$800-1 unrenderTerrainSpansLoop: - dec CACHEPTR - dec CACHEPTR - lda (CACHEPTR) + lda 0,y beq unrenderTerrainSpansDone tax lda #0 - sta VRAMBANK,x + sta a:0,x + dey + dey bra unrenderTerrainSpansLoop unrenderTerrainSpansDone: + plb RESTORE_AXY rts