From 367e87093e203dedba1df7a6594391bb5dca9289 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Thu, 4 May 2023 19:19:12 +0200 Subject: [PATCH] Basic graphics routines in separate file and optimizations --- gr_basics.asm | 224 ++++++++++++++++++++++++++++++++++++++++++++++++++ grafproc.asm | 204 +-------------------------------------------- scorch.asm | 13 +-- scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56627 -> 56609 bytes 5 files changed, 228 insertions(+), 213 deletions(-) create mode 100644 gr_basics.asm diff --git a/gr_basics.asm b/gr_basics.asm new file mode 100644 index 0000000..b7dbe55 --- /dev/null +++ b/gr_basics.asm @@ -0,0 +1,224 @@ +.IF *>0 ;this is a trick that prevents compiling this file alone + +; Basic hardware-dependent graphics routines. + +; ----------------------------------------- +.proc unPlot +; plots a point and saves the plotted byte, reverts the previous plot. +; ----------------------------------------- + ldx #0 ; only one pixel +unPlotAfterX + stx WhichUnPlot + + ; first remake the oldie + lda oldplotL,x + sta oldplot + lda oldplotH,x + sta oldplot+1 + + lda oldply,x + tay + lda oldora,x + sta (oldplot),y + + + ; is it not out of the screen ???? + cpw ydraw #screenheight + jcc CheckX + mwa #0 ydraw +CheckX + cpw xdraw #screenwidth + jcs EndOfUnPlot +MakeUnPlot + ; let's count coordinates taken from xdraw and ydraw + ;xbyte = xbyte/8 + lda xdraw+1 + lsr + lda xdraw + ror ;just one bit over 256. Max screenwidth = 512!!! + lsr + lsr +;--- + tay + ldx WhichUnPlot + tya + sta oldply,x + + ldx ydraw + lda linetableL,x + sta xbyte + sta oldplot + lda linetableH,x + sta xbyte+1 + sta oldplot+1 + + lda xdraw + and #$7 + tax + + lda color + bne ClearUnPlot + + ;plotting here + lda (xbyte),y + sta OldOraTemp + ora bittable,x + sta (xbyte),y + bne ContinueUnPlot ; allways <>0 +ClearUnPlot + lda (xbyte),y + sta OldOraTemp + and bittable2,x + sta (xbyte),y +ContinueUnPlot + ldx WhichUnPlot + lda OldOraTemp + sta oldora,x + lda oldplot + sta oldplotL,x + lda oldplot+1 + sta oldplotH,x + ; and now we must solve the problem of several plots + ; in one byte + ldx #4 + ldy WhichUnPlot +LetsCheckOverlapping + cpx WhichUnPlot + beq SkipThisPlot + lda oldplotL,x + cmp oldplotL,y + bne NotTheSamePlot + lda oldplotH,x + cmp oldplotH,y + bne NotTheSamePlot + lda oldply,x + cmp oldply,y + bne NotTheSamePlot + ; the pixel is in the same byte so let's take correct contents + lda oldora,x + sta oldora,y +NotTheSamePlot +SkipThisPlot + dex + bpl LetsCheckOverlapping +EndOfUnPlot + rts +.endp + +; ----------------------------------------- +.proc plot ;plot (xdraw, ydraw, color) +; color == 1 --> put pixel +; color == 0 --> erase pixel +; this is one of the most important routines in the whole +; game. If you are going to speed up the game, start with +; plot - it is used by every single effect starting from explosions +; through line drawing and small text output!!! +; +; Optimized by 0xF (Fox) THXXXX!!! + +; ----------------------------------------- + ; is it not over the screen ??? + cpw ydraw #(screenheight+1); changed for one additional line. cpw ydraw #(screenheight-1) + bcs unPlot.EndOfUnPlot ;nearest RTS +CheckX02 + cpw xdraw #screenwidth + bcs EndOfPlot +MakePlot + ; let's calculate coordinates from xdraw and ydraw + + ;xbyte = xbyte/8 + lda xdraw+1 + lsr + lda xdraw + ror ;just one bit over 256. Max screenwidth = 512!!! + lsr + lsr + sta xbyte + ;--- + ldx ydraw + ldy linetableL,x + lda linetableH,x + sta xbyte+1 + + lda xdraw + and #$7 + tax + lda color + bne ClearPlot + + lda (xbyte),y + ora bittable,x + sta (xbyte),y +EndOfPlot + rts +ClearPlot + lda (xbyte),y + and bittable2,x + sta (xbyte),y + rts +.endp + +; ----------------------------------------- +.proc point_plot +; ----------------------------------------- + ; checks state of the pixel (coordinates in xdraw and ydraw) + ; result is in A (zero or appropriate bit is set) + + ; let's calculate coordinates from xdraw and ydraw + + ;xbyte = xbyte/8 + lda xdraw+1 + lsr + lda xdraw + ror ;just one bit over 256. Max screenwidht = 512!!! + lsr + lsr + sta xbyte + ;--- + ldx ydraw + ldy linetableL,x + lda linetableH,x + sta xbyte+1 + + lda xdraw + and #$7 + tax + + lda (xbyte),y + eor #$ff + and bittable,x + rts +.endp + +;-------------------------------------------------- +.proc ClearScreen +;-------------------------------------------------- + mwa #display temp + ldy #0 +@ lda #$ff + sta (temp),y + inw temp + cpw temp #display+screenheight*screenBytes+1 + bne @- + rts +.endp + +;-------------------------------------------------- +.proc GenerateLineTable + + mwa #display temp + mwa #linetableL temp2 + mwa #linetableH modify + ldy #0 +@ lda temp + sta (temp2),y + lda temp+1 + sta (modify),y + adw temp #40 + iny + cpy #screenheight+1 + bne @- + rts +.endp + +.ENDIF \ No newline at end of file diff --git a/grafproc.asm b/grafproc.asm index a3fe794..c69f73f 100644 --- a/grafproc.asm +++ b/grafproc.asm @@ -473,19 +473,6 @@ endcircleloop RTS .endp -;-------------------------------------------------- -.proc ClearScreen -;-------------------------------------------------- - mwa #display temp - ldy #0 -@ lda #$ff - sta (temp),y - inw temp - cpw temp #display+screenheight*screenBytes+1 - bne @- - rts -.endp - ;-------------------------------*------------------ .proc placetanks ;-------------------------------------------------- @@ -1643,195 +1630,10 @@ NotHigher rts .endp -; ----------------------------------------- -.proc unPlot -; plots a point and saves the plotted byte, reverts the previous plot. -; ----------------------------------------- - ldx #0 ; only one pixel -unPlotAfterX - stx WhichUnPlot +;--------------------------------------------------- + icl 'gr_basics.asm' +;--------------------------------------------------- - ; first remake the oldie - lda oldplotL,x - sta oldplot - lda oldplotH,x - sta oldplot+1 - - lda oldply,x - tay - lda oldora,x - sta (oldplot),y - - - ; is it not out of the screen ???? - cpw ydraw #screenheight - jcc CheckX - mwa #0 ydraw -CheckX - cpw xdraw #screenwidth - jcs EndOfUnPlot -MakeUnPlot - ; let's count coordinates taken from xdraw and ydraw - mwa xdraw xbyte - - lda xbyte - and #$7 - sta ybit - - lsrw xbyte - rorw xbyte - rorw xbyte -;--- - ldy xbyte - - ldx WhichUnPlot - tya - sta oldply,x - - - ldx ydraw - lda linetableL,x - sta xbyte - sta oldplot - lda linetableH,x - sta xbyte+1 - sta oldplot+1 - ldx ybit - - - lda color - bne ClearUnPlot - - ;plotting here - lda (xbyte),y - sta OldOraTemp - ora bittable,x - sta (xbyte),y - jmp ContinueUnPlot -ClearUnPlot - lda (xbyte),y - sta OldOraTemp - and bittable2,x - sta (xbyte),y -ContinueUnPlot - ldx WhichUnPlot - lda OldOraTemp - sta oldora,x - lda oldplot - sta oldplotL,x - lda oldplot+1 - sta oldplotH,x - ; and now we must solve the problem of several plots - ; in one byte - ldx #4 - ldy WhichUnPlot -LetsCheckOverlapping - cpx WhichUnPlot - beq SkipThisPlot - lda oldplotL,x - cmp oldplotL,y - bne NotTheSamePlot - lda oldplotH,x - cmp oldplotH,y - bne NotTheSamePlot - lda oldply,x - cmp oldply,y - bne NotTheSamePlot - ; the pixel is in the same byte so let's take correct contents - lda oldora,x - sta oldora,y -NotTheSamePlot -SkipThisPlot - dex - bpl LetsCheckOverlapping -EndOfUnPlot - rts -.endp - -; ----------------------------------------- -.proc plot ;plot (xdraw, ydraw, color) -; color == 1 --> put pixel -; color == 0 --> erase pixel -; this is one of the most important routines in the whole -; game. If you are going to speed up the game, start with -; plot - it is used by every single effect starting from explosions -; through line drawing and small text output!!! -; -; Optimized by 0xF (Fox) THXXXX!!! - -; ----------------------------------------- - ; is it not over the screen ??? - cpw ydraw #(screenheight+1); changed for one additional line. cpw ydraw #(screenheight-1) - bcs unPlot.EndOfUnPlot ;nearest RTS -CheckX02 - cpw xdraw #screenwidth - bcs EndOfPlot -MakePlot - ; let's calculate coordinates from xdraw and ydraw - - ;xbyte = xbyte/8 - lda xdraw+1 - lsr - lda xdraw - ror ;just one bit over 256. Max screenwidth = 512!!! - lsr - lsr - sta xbyte - ;--- - ldx ydraw - ldy linetableL,x - lda linetableH,x - sta xbyte+1 - - lda xdraw - and #$7 - tax - lda color - bne ClearPlot - - lda (xbyte),y - ora bittable,x - sta (xbyte),y -EndOfPlot - rts -ClearPlot - lda (xbyte),y - and bittable2,x - sta (xbyte),y - rts -.endp - -; ----------------------------------------- -.proc point_plot -; ----------------------------------------- - ; checks state of the pixel (coordinates in xdraw and ydraw) - ; result is in A (zero or appropriate bit is set) - - ; let's calculate coordinates from xdraw and ydraw - - ;xbyte = xbyte/8 - lda xdraw+1 - lsr - lda xdraw - ror ;just one bit over 256. Max screenwidht = 512!!! - lsr - lsr - sta xbyte - ;--- - ldx ydraw - ldy linetableL,x - lda linetableH,x - sta xbyte+1 - - lda xdraw - and #$7 - tax - - lda (xbyte),y - eor #$ff - and bittable,x - rts -.endp ;-------------------------------------------------- .proc TypeChar ; puts char on the graphics screen diff --git a/scorch.asm b/scorch.asm index 0df711b..39e8d3f 100644 --- a/scorch.asm +++ b/scorch.asm @@ -322,18 +322,7 @@ no5200splash jsr SelectNextGradient.NotWind ; generate linetables - mwa #display temp - mwa #linetableL temp2 - mwa #linetableH modify - ldy #0 -@ lda temp - sta (temp2),y - lda temp+1 - sta (modify),y - adw temp #40 - iny - cpy #screenheight+1 - bne @- + jsr GenerateLineTable .IF TARGET = 800 diff --git a/scorch.bin b/scorch.bin index d1efd873d2ce401bb9f16444288afdd05e512100..a614b7850a7894b13bd8e44f3a309ad4d6574c1a 100644 GIT binary patch delta 7923 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 Ub=IUABB6U@y>p(qU+T>LAF{n}NdN!< delta 7758 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 DMW_m) diff --git a/scorch.xex b/scorch.xex index 33483f5b55816d38522789269deb538c398edaae..87efd6871eb8faced66ebd604abc915ff135ba32 100644 GIT binary patch delta 7813 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 delta 7778 zcmZuW30M?Y($h1XBham4WKiItcmO7%CW1zd#$%DRL6IYB)ZtLUQE^b?2?Iz2B7@*l zE*%|?p3ul}su6xCm_Ly?XiO&?-OVPNjT$1mt2-Kv$GY;@>p`P`f_~la)vKykuex4c zQ`Mnp>rgZ=PNJT)MJHWVjBbq*WX2g4W8LzZ$Huq{ne3eS*f^~H?dXa%0D2(ExcAV; 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