From a88140dc300c6ece1aa0251c6932810925c67b08 Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Thu, 16 Apr 2026 18:43:44 -0700 Subject: [PATCH] Fix mem fill bug and speed up set pixel --- images/apple/PLEIADES-2.21.po | Bin 33553920 -> 33553920 bytes src/shr.tk/libs/shrlib.pla | 128 ++++++++++++++++++++++++++++------ 2 files changed, 107 insertions(+), 21 deletions(-) diff --git a/images/apple/PLEIADES-2.21.po b/images/apple/PLEIADES-2.21.po index 1bfba06105f92d818e4ce32a534d14999d3dd3c0..ecbc5aab3320363c6aeabdcbcfe83b31bd7930e4 100644 GIT binary patch delta 2650 zcmajgeRz#^9LMqBd6*7UI}c6skT%Vc8RlVPo=T)NGDcx)^z}HEB+VgqVqXp#VvZE% zgp3GTqS7``OEgSMr4%Jno@%AWdT;&HA6-}1b-#Z1=l*^_*Zt4^$DLJC8Igs}?ZWH} zHZ^n4ND7;k6lQ@HHrP=$tAU%~Kuy#_IBMf&+=2)=;es0;+=@ul!EJ~_UDQK;G{Eg> zh&vFC7&OA2h(%*~(FAv)DdNx!@o0_~Xo&>0LTj`^TO^_#?nZlbKoUBl6FQ>{y5b(( zi*C3N-O&U0qbDA~gXo2akc{5wgNM-
m(NW}mQ#3OhVgD@CFkcOdn438rn!!R6A zKrjL$F$$wG24j(dad;9>;c1M=Gnjy9F%i#U5}rpUCc}p*n2HxL4bzbYKVHNP%tSU6 zvoL#mQdnT$!0>K%>j-1)o*Je!7@ii0YcL>eeXYs}WB%*DJtZv=Yj+kDUb2_x<(q6r zK`6UsK~d139*9XlkY@@)y(Seeu$1gD3Au&aiVBLOCL3pNalV;sqH;qUO>}Nia!t#> zidA)M$^Z0|O*EGYu1gOz4u%g4v`Mj9Mw;Y7W^~iSE`^y*3rCvxENg576PGp7>OJK4 z-Eey&JwA)acw0GB6Fq&SjA605dSU-(;i_81o8@ASD@h&W4(1OF#7wuv8;iHXd3~DI?lIO#csO6sWwTvR&m}l^rTORo+v1U*!XpT`C`{6si=d6szo3*`u;o zWuMA^l@gVYR1T~bh02#IU#Xl_ z`C8>0l~XF;s(hz%TIGz&_bNZAoK^Wz<($fSm7i2DsQj$*i^@fnODdODuBcp9`BmjN zm2#EeRsK-9rt+uCUn&(U*Hvz)RL&7gj#yxY4R(Z~25y1_HBk%UsEwO(3nJiz3vPID zD93Q4jUe0Jozd?m#qR&=dA_L>_B%Z?47>{Q#0ncJ0p2H+Ok4#L44^uD|FJKy`BMW}Kh#8oPY$#@7HUgM~ zxtNESkc0VHfQ5J&i?A5ESb`vy;uS2zt9T8|u>vcRhgAsSb*#o3ti>BxhkUHZ2E2)l z*o3#R8C$RwZ(|z@@D8@)UF^V4yodMk0e0a-6ru>l*o{5di+$LS5`2UM_!tLq2%n%7 zhj9c)QHEpq6vy!yKF0}sfiLkDPU35PgH!kx-{CaQ;CuXlv-lC`a2`M50)ECXxQI)* fj4QZ`U-28t@jL#&HT;RcP=V{XVc8U_w50tFRA=Ay delta 2470 zcmZwIX;_s-7{>AUyyt*NA%%mem6<4#ATDSwfm*3l7L_O}DlX^)QdqfA8m0oqqel(X zmeZnvXyl40BJP5sqCu!oluL`a%rMk&ba=4Q*t zZS6ff)NM|vn*}DUu%YhE9ra*GeKddvJaHcyq7l5{4F`PC7`|wNrf7!y@c64wNDRavL}4(7U?`$748t)3F&K$a7>zNA#aN7k zAP(^uj|9Agmyw7Gcm=QGHB7`LOvV%>;dQ)$shEa0k&Nkh3o|eivyg&Rq+vGRMmiL8 zFt;$&&AESw$4RRhXBasSyK&Iv5#tPMKDAz%XKf?H_`kIlYN? z$a1BRar(JO7%dqt_gH6}uz(3(+sv`?hPfmyA<-)!(ktHRX-OLs)!#AP7Hu>Ct8M?( zgX(JQzqPAvtg~C9%@S`!OfeDyi+UGL3oME^f>TWY=0;FTk~QF*BYBx4pwN-L!eIo2 zct!d83}|K;6s7lyoPP@Mx+3U+F~JNrT8bHzrD z>-4kOTt{M^KC@!X9EV{Rq7>)g?qis~2=g&gSDQv^KDMI-WvIq6)Zij+;3iC~k?M^Q zL}LU-Ar^5+z$7GLDv~iXfGHJ=k%{$IV^N8p1Dj%tQtn!JmgWx2`*{G7QvPq>tWwT15$`+NaD%(`HtL#wOsj^FDw@Q&p zvC1Bmy(%Rt`&9O;98f7$IjC|-Q74 za!lp8$_bT|D&MR8pz@>2Pb#NWYE(|EoKZQea!%!EmGdeWR4%GqQn{>hMdcTjUsZln z`Ca9z$~BeiDmPUAQ2A5krphgqzf^9k+)=r!Qaev98DfD6D{OFsJLY8Ht#HSMVxc!$eHNWK2O4UdJ1lifMQg$(W9}Fat9&3n@rN8fN2d zq(dyV4}$ioI~L_Rj50Gm;WE!c`}*p408iCx%@A{1i}_M!y)upb9dii0?W zFHweae1!@e#t|GvC93c>zCks<#dkP{<2Zqn_#QvtNBo3SsKIHR!C9Qc&p3|@xQI)* lj4SvBzv4Iij;pwa>$rhG@F#BK7XHF*+`(N-Zg#CD=5H;fqtE~V diff --git a/src/shr.tk/libs/shrlib.pla b/src/shr.tk/libs/shrlib.pla index 69a91fc..48a0fac 100644 --- a/src/shr.tk/libs/shrlib.pla +++ b/src/shr.tk/libs/shrlib.pla @@ -7,19 +7,21 @@ const shadow = $C035 const pixbuf = $2000 const scbbuf = $9D00 const palbuf = $9E00 -const scb640 = $80 // 640 PIXEL, PAL 0, NO INT -const scb320 = $00 // 320 PIXEL, PAL 0, NO INT, NO FILL +const scb640 = $80 // 640 PIXELS, PAL# 0, NO INT +const scb320 = $00 // 320 PIXELS, PAL# 0, NO INT, NO FILL word pal4BPP = $0000, $0007, $0070, $0077, $0700, $0707, $0770, $0777 word = $0CCC, $000F, $00F0, $00FF, $0F00, $0F0F, $0FF0, $0FFF -word pal2BPP = $0000, $0777, $0CCC, $0FFF, $0000, $0777, $0CCC, $0FFF -word = $0000, $0777, $0CCC, $0FFF, $0000, $0777, $0CCC, $0FFF +word pal2BPP = $0000, $0555, $0AAA, $0FFF, $0000, $0555, $0AAA, $0FFF +word = $0000, $0555, $0AAA, $0FFF, $0000, $0555, $0AAA, $0FFF byte mask4BPP = $F0, $0F byte mask2BPP = $C0, $30, $0C, $03 byte clr4BPPExp = $00, $11, $22, $33, $44, $55, $66, $77, $88, $99, $AA, $BB, $CC, $DD, $EE, $FF byte clr2BPPExp = $00, $55, $AA, $FF -byte _clr -word shrScanline[200] +byte clrExp +byte shrScanLineL[200] +byte shrScanLineH[200] +word _addr[] // naughty asm shrInc(buff) !SOURCE "vmsrc/apple/plvmzp.inc" @@ -102,12 +104,14 @@ export asm shrSet(addr, data, len)#0 AND #$F7 STA SHADOW LDY ESTKL+2,X + LDA ESTKL+0,X + BEQ + + INC ESTKH+0,X LDA #$00 - STA DSTL ++ STA DSTL LDA ESTKH+2,X STA DSTH LDA ESTKL+1,X - INC ESTKH+0,X STA AUXWRT - STA (DST),Y INY @@ -126,6 +130,77 @@ export asm shrSet(addr, data, len)#0 INX RTS end +//def shrPixel4BPP(x, y)#0 +// shrSetBits(shrScanline[y] + (x >> 1), _clr, mask4BPP[x & 1]) +//end +asm shrPixel4BPP(x, y)#0 + DEX + LDY #$00 + LDA ESTKH+2,X + LSR + ROR ESTKL+2,X + BCC + + INY +end +asm _pix4A ++ LDA $3000,Y ; mask4BPP[] + STA ESTKL+0,X + LDY ESTKL+1,X + LDA ESTKL+2,X + CLC +end +asm _pix4B + ADC $1000,Y ; shrScanlineL[] + STA ESTKL+2,X + LDA #$00 +end +asm _pix4C + ADC $1800,Y ; shrScanLineH[] + STA ESTKH+2,X +end +asm _pix4D + LDA $2000 ; clrExp + STA ESTKL+1,X + JMP $0109 +end +//def shrPixel2BPP(x, y)#0 +// shrSetBits(shrScanline[y] + (x >> 2), _clr, mask2BPP[x & 3]) +//end +asm shrPixel2BPP(x, y)#0 + DEX + LDY #$00 + LDA ESTKH+2,X + LSR + ROR ESTKL+2,X + BCC + + INY ++ LSR + ROR ESTKL+2,X + BCC + + INY + INY +end +asm _pix2A ++ LDA $3000,Y ; mask2BPP[] + STA ESTKL+0,X + LDY ESTKL+1,X + LDA ESTKL+2,X + CLC +end +asm _pix2B + ADC $1000,Y ; shrScanlineL[] + STA ESTKL+2,X + LDA #$00 +end +asm _pix2C + ADC $1800,Y ; shrScanLineH[] + STA ESTKH+2,X +end +asm _pix2D + LDA $2000 ; clrExp + STA ESTKL+1,X + JMP $0109 +end export asm shrPixel(x, y)#0 JMP $2000 end @@ -133,16 +208,10 @@ export asm shrColor(clr)#0 JMP $2000 end def shrColor4BPP(clr)#0 - _clr = clr4BPPExp[clr & $0F] + clrExp = clr4BPPExp[clr & $0F] end def shrColor2BPP(clr)#0 - _clr = clr2BPPExp[clr & $03] -end -def shrPixel4BPP(x, y)#0 - shrSetBits(shrScanline[y] + (x >> 1), _clr, mask4BPP[x & 1]) -end -def shrPixel2BPP(x, y)#0 - shrSetBits(shrScanline[y] + (x >> 2), _clr, mask2BPP[x & 3]) + clrExp = clr2BPPExp[clr & $03] end export def shrSCB(row, scb)#0 shrPoke(scbbuf + row, scb) @@ -157,7 +226,7 @@ export def shrPalette(idx, rgbptr)#0 next end export def shrMode(mode)#0 - byte row, scb + byte scb if mode // @@ -175,10 +244,7 @@ export def shrMode(mode)#0 *(@shrColor + 1) = @shrColor4BPP shrPalette(0, @pal4BPP) fin - for row = 0 to 199 - shrScanline[row] = $2000 + row * 160 - shrPoke(scbbuf + row, scb) - next + shrSet(scbbuf, scb, 200) shrSet(pixbuf, 0, $7D00) else // @@ -193,6 +259,26 @@ end // memcpy($0100, @_auxPeek, @shrPeek - @_auxPeek) // +// Fill HiLo scan line address arrays +// +_addr = pixbuf +for clrExp = 0 to 199 + shrScanlineL[clrExp] = _addr + shrScanlineH[clrExp] = _addr >> 8 + _addr = _addr + 160 +next +// +// Fixups +// +_pix4A:1 = @mask4BPP +_pix4B:1 = @shrScanLineL +_pix4C:1 = @shrScanLineH +_pix4D:1 = @clrExp +_pix2A:1 = @mask2BPP +_pix2B:1 = @shrScanLineL +_pix2C:1 = @shrScanLineH +_pix2D:1 = @clrExp +// // Keep module in memory // return modkeep