From bec33a2e889bbbafa83278a650e435d908bfb63c Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Tue, 17 Sep 2024 18:10:21 -0700 Subject: [PATCH] Slight PixMap speedups and better FadeOut --- src/libsrc/apple/dcgrlib.pla | 45 +++++++++++++++++----------------- src/samplesrc/dcgrtest.pla | 47 ++++++++++++++++++++++++++---------- 2 files changed, 57 insertions(+), 35 deletions(-) diff --git a/src/libsrc/apple/dcgrlib.pla b/src/libsrc/apple/dcgrlib.pla index 1a92777..6656f0d 100644 --- a/src/libsrc/apple/dcgrlib.pla +++ b/src/libsrc/apple/dcgrlib.pla @@ -624,7 +624,7 @@ asm dcgrPixMapScr(x, y, pixw, pixh, pixptr)#0 LDA ESTKL-1,X ; X COORD CLC ADC ESTKL-3,X ; WIDTH - STA ESTKL-3,X ; -> RIGHT EDGE + STA ESTKH-3,X ; -> RIGHT EDGE YPIXS LDY ESTKL-2,X ; Y COORD INC ESTKL-2,X ; Y COORD++ CPY #192 ; OFF SCREEN? @@ -646,10 +646,10 @@ asm _dcgrPixmapScrA STA DSTH LDA ESTKL-1,X ; X COORD STA TMPL + LDY #$00 PIXSCRL CMP #140 ; OFF SCREEN? BCS PIXSCRH - LDY #$00 ; LO NIBBLE SRC PIXEL - LDA (SRC),Y + LDA (SRC),Y ; LO NIBBLE SRC PIXEL AND #$0F CMP #$05 ; TRANSPARENT? BEQ PIXSCRH @@ -661,14 +661,13 @@ asm _dcgrPixmapScrB end asm _dcgrPixmapScrC JSR $1000 ; PLOT PIXEL + LDY #$00 PIXSCRH INC TMPL LDA TMPL - CMP ESTKL-3,X ; AT RIGHT EDGE? - BEQ YPIXS ; NEXT ROW + CMP ESTKH-3,X ; AT RIGHT EDGE? CMP #140 ; OFF SCREEN? BCS + - LDY #$00 ; HI NIBBLE SRC PIXEL - LDA (SRC),Y + LDA (SRC),Y ; HI NIBBLE SRC PIXEL LSR LSR LSR @@ -683,12 +682,13 @@ asm _dcgrPixmapScrD end asm _dcgrPixmapScrE JSR $1000 ; PLOT PIXEL + LDY #$00 + INC SRCL BNE + INC SRCH + INC TMPL LDA TMPL - CMP ESTKL-3,X ; AT RIGHT EDGE? + CMP ESTKH-3,X ; AT RIGHT EDGE? BNE PIXSCRL NXTPIXS DEC ESTKL-4,X ; HEIGHT BNE YPIXS ; NEXT ROW @@ -714,7 +714,7 @@ asm dcgrPlotMem(x, y, memptr, memspan)#0 LDA ESTKL-4,X ; SPAN ADC DSTL STA DSTL - LDA ESTKH-4,X + LDA #$00 ; ESTKH-4,X ADC DSTH STA DSTH DEY @@ -1037,7 +1037,7 @@ asm dcgrPixMapMem(x, y, pixw, pixh, pixptr, memw, memh, memptr, memspan)#0 LDA ESTKL-1,X ; X COORD CLC ADC ESTKL-3,X ; WIDTH - STA ESTKL-3,X ; -> RIGHT EDGE + STA ESTKH-3,X ; -> RIGHT EDGE YPIXM LDA ESTKL-2,X ; Y COORD INC ESTKL-2,X ; Y COORD++ CMP ESTKL-7,X ; OUT OF DST BOUNDS? @@ -1055,10 +1055,10 @@ end asm _dcgrPixmapMemA + LDA ESTKL-1,X ; X COORD STA TMPL + LDY #$00 PIXMEML CMP ESTKL-6,X ; OUT OF DST BOUNDS? BCS PIXMEMH - LDY #$00 ; LO NIBBLE SRC PIXEL - LDA (SRC),Y + LDA (SRC),Y ; LO NIBBLE SRC PIXEL AND #$0F CMP #$05 ; TRANSPARENT? BEQ PIXMEMH @@ -1071,14 +1071,14 @@ asm _dcgrPixmapMemB end asm _dcgrPixmapMemC JSR $1000 ; PLOT PIXEL + LDY #$00 PIXMEMH INC TMPL LDA TMPL - CMP ESTKL-3,X ; AT RIGHT EDGE? + CMP ESTKH-3,X ; AT RIGHT EDGE? BEQ NXTPIXM ; NEXT ROW CMP ESTKL-6,X ; OUT OF DST BOUNDS? BCS + - LDY #$00 ; HI NIBBLE SRC PIXEL - LDA (SRC),Y + LDA (SRC),Y ; HI NIBBLE SRC PIXEL LSR LSR LSR @@ -1094,12 +1094,13 @@ asm _dcgrPixmapMemD end asm _dcgrPixmapMemE JSR $1000 ; PLOT PIXEL + LDY #$00 + INC SRCL ; PIXPTR BNE + INC SRCH + INC TMPL LDA TMPL - CMP ESTKL-3,X ; AT RIGHT EDGE? + CMP ESTKH-3,X ; AT RIGHT EDGE? BNE PIXMEML NXTPIXM CLC LDA ESTKL-9,X ; SPAN @@ -1620,7 +1621,7 @@ asm dcgrClearBl7Mem(x7, y, w7, h, memptr, memspan)#0 LDA ESTKL-6,X ; SPAN ADC DSTL STA DSTL - LDA ESTKH-6,X + LDA #$00 ; ESTKH-6,X ADC DSTH STA DSTH DEY @@ -1629,14 +1630,14 @@ asm dcgrClearBl7Mem(x7, y, w7, h, memptr, memspan)#0 BNE + DEC DSTH + DEC DSTL - LDA ESTKH-6,X ; SRC POINTS TO MEM HALF OF SCANLINE - LSR - PHA + ;LDA ESTKH-6,X ; SRC POINTS TO MEM HALF OF SCANLINE + ;LSR + ;PHA LDA ESTKL-6,X ; SPAN - ROR ; SPAN / 2 + LSR ; ROR SPAN / 2 ADC DSTL STA SRCL - PLA + LDA #$00 ; PLA ADC DSTH STA SRCH BNE + ; BRA diff --git a/src/samplesrc/dcgrtest.pla b/src/samplesrc/dcgrtest.pla index 010cc4a..09f102f 100644 --- a/src/samplesrc/dcgrtest.pla +++ b/src/samplesrc/dcgrtest.pla @@ -162,11 +162,19 @@ word sprite7span, sprite7w // // Dither matrices // +byte[] dither25 = $00, $00, $AA, $AA, $00, $00, $AA, $AA +byte[] = $00, $00, $AA, $AA, $00, $00, $AA, $AA +byte[] = $00, $00, $AA, $AA, $00, $00, $AA, $AA +byte[] = $00, $00, $AA, $AA, $00, $00, $AA, $AA byte[] dither50 = $55, $55, $AA, $AA, $55, $55, $AA, $AA byte[] = $55, $55, $AA, $AA, $55, $55, $AA, $AA byte[] = $55, $55, $AA, $AA, $55, $55, $AA, $AA byte[] = $55, $55, $AA, $AA, $55, $55, $AA, $AA - +byte[] dither75 = $55, $55, $FF, $FF, $55, $55, $FF, $FF +byte[] = $55, $55, $FF, $FF, $55, $55, $FF, $FF +byte[] = $55, $55, $FF, $FF, $55, $55, $FF, $FF +byte[] = $55, $55, $FF, $FF, $55, $55, $FF, $FF +word[] dither = @dither25, @dither50, @dither75 // // Sliding sprite Y coordinate // @@ -237,7 +245,7 @@ end // // //////////////////////////////////////////////////////////////// def dcgrTest#0 - word i, j, k, i7, im7, k7, km7, s7w, inci, incj, inck + word i, j, k, oi, oj, i7, im7, k7, km7, s7w, inci, incj, inck word backblk, backspan word restrblk, restrspan, restr7w, restrw byte mode @@ -331,26 +339,39 @@ def dcgrTest#0 dcgrSurfScr(OP_SRC) dcgrPixMap(i, j, SPRW, SPRH, @sprite) break + is 9 + dcgrSurfScr(OP_XOR) + dcgrPixMap(oi, oj, SPRW, SPRH, @sprite) + dcgrPixMap(i, j, SPRW, SPRH, @sprite) + break wend if k > 136 or k < -16; inck = -inck; fin k = k + inck + oi = i; oj = j if i > 102 or i < 22; inci = -inci; fin i = i + inci if j > 145 or j < 32; incj = -incj; fin j = j + incj loop - dcgrSurfMem(OP_SRC, SPRH, backblk, backspan) - dcgrColor(CLR_WHITE) - dcgrClearBl7(0, 0, SCR_WIDTH7, SPRH) - dcgrColor(CLR_BLACK) - for i = 0 to 139 step 16 - dcgrBitMap(i, 0, 16, 16, @dither50) + // + // Re-use the back buffer for a stipple pattern to mask the screen + // + for k = 0 to 2 + dcgrSurfMem(OP_SRC, SPRH, backblk, backspan) + dcgrColor(CLR_WHITE) + dcgrClearBl7(0, 0, SCR_WIDTH7, SPRH) + dcgrColor(CLR_BLACK) + for i = 0 to 139 step 16 + dcgrBitMap(i, 0, 16, 16, dither[k]) + next + dcgrSurfScr(OP_AND) + for j = 0 to 95 step 16 + dcgrMemBl7(0, j, SCR_WIDTH7, 16, backblk, backspan) + dcgrMemBl7(0, 175 - j, SCR_WIDTH7, 16, backblk, backspan) + next next - dcgrSurfScr(OP_AND) - for j = 0 to 191 step 16 - dcgrMemBl7(0, j, SCR_WIDTH7, 16, backblk, backspan) - next - getc + dcgrSurfScr(OP_SRC) + dcgrClearBl7(0, 0, SCR_WIDTH7, SCR_HEIGHT) end dcgrMode(0) dcgrCompSprite