From 41f33b0dfecc72469850f9f397b93883d65d9a8a Mon Sep 17 00:00:00 2001 From: Scott Duensing Date: Mon, 6 Jul 2026 18:00:16 -0500 Subject: [PATCH] More performance work --- generated/amiga/sprites/sprites.spr | Bin 7820 -> 7820 bytes generated/amiga/tiles/tilebank0.tbk | Bin 0 -> 32044 bytes generated/atarist/sprites/sprites.spr | Bin 7820 -> 7820 bytes generated/atarist/tiles/tilebank0.tbk | Bin 0 -> 32044 bytes generated/iigs/font.tbk | Bin 0 -> 32044 bytes generated/iigs/levels/level01.dat | Bin 0 -> 2034 bytes generated/iigs/levels/level02.dat | Bin 0 -> 2042 bytes generated/iigs/levels/level03.dat | Bin 0 -> 2050 bytes generated/iigs/levels/level04.dat | Bin 0 -> 2070 bytes generated/iigs/levels/level05.dat | Bin 0 -> 2066 bytes generated/iigs/levels/level06.dat | Bin 0 -> 2042 bytes generated/iigs/levels/level07.dat | Bin 0 -> 2050 bytes generated/iigs/levels/level08.dat | Bin 0 -> 2050 bytes generated/iigs/levels/level09.dat | Bin 0 -> 2058 bytes generated/iigs/levels/level10.dat | Bin 0 -> 2054 bytes generated/iigs/levels/level11.dat | Bin 0 -> 2050 bytes generated/iigs/levels/level12.dat | Bin 0 -> 2054 bytes generated/iigs/levels/level13.dat | Bin 0 -> 2070 bytes generated/iigs/levels/level14.dat | Bin 0 -> 2062 bytes generated/iigs/levels/level15.dat | Bin 0 -> 2034 bytes generated/iigs/levels/level16.dat | Bin 0 -> 2042 bytes generated/iigs/levels/level17.dat | Bin 0 -> 2062 bytes generated/iigs/levels/level18.dat | Bin 0 -> 2034 bytes generated/iigs/levels/level19.dat | Bin 0 -> 2050 bytes generated/iigs/levels/level20.dat | Bin 0 -> 2062 bytes generated/iigs/levels/level21.dat | Bin 0 -> 2050 bytes generated/iigs/levels/level22.dat | Bin 0 -> 2058 bytes generated/iigs/levels/level23.dat | Bin 0 -> 2042 bytes generated/iigs/levels/level24.dat | Bin 0 -> 2062 bytes generated/iigs/levels/title.dat | Bin 0 -> 2028 bytes generated/iigs/sprites/sprites.spr | Bin 0 -> 7820 bytes generated/iigs/tiles/tbank0.tbk | Bin 0 -> 8236 bytes generated/iigs/tiles/tbank1.tbk | Bin 0 -> 32044 bytes generated/iigs/tiles/tbank2.tbk | Bin 0 -> 32044 bytes scripts/bench-staxi-title.sh | 160 ++++++++++++++++++++++++++ scripts/diag-staxi-screen.sh | 143 +++++++++++++++++++++++ stRender.c | 40 +++---- 37 files changed, 319 insertions(+), 24 deletions(-) create mode 100644 generated/amiga/tiles/tilebank0.tbk create mode 100644 generated/atarist/tiles/tilebank0.tbk create mode 100644 generated/iigs/font.tbk create mode 100644 generated/iigs/levels/level01.dat create mode 100644 generated/iigs/levels/level02.dat create mode 100644 generated/iigs/levels/level03.dat create mode 100644 generated/iigs/levels/level04.dat create mode 100644 generated/iigs/levels/level05.dat create mode 100644 generated/iigs/levels/level06.dat create mode 100644 generated/iigs/levels/level07.dat create mode 100644 generated/iigs/levels/level08.dat create mode 100644 generated/iigs/levels/level09.dat create mode 100644 generated/iigs/levels/level10.dat create mode 100644 generated/iigs/levels/level11.dat create mode 100644 generated/iigs/levels/level12.dat create mode 100644 generated/iigs/levels/level13.dat create mode 100644 generated/iigs/levels/level14.dat create mode 100644 generated/iigs/levels/level15.dat create mode 100644 generated/iigs/levels/level16.dat create mode 100644 generated/iigs/levels/level17.dat create mode 100644 generated/iigs/levels/level18.dat create mode 100644 generated/iigs/levels/level19.dat create mode 100644 generated/iigs/levels/level20.dat create mode 100644 generated/iigs/levels/level21.dat create mode 100644 generated/iigs/levels/level22.dat create mode 100644 generated/iigs/levels/level23.dat create mode 100644 generated/iigs/levels/level24.dat create mode 100644 generated/iigs/levels/title.dat create mode 100644 generated/iigs/sprites/sprites.spr create mode 100644 generated/iigs/tiles/tbank0.tbk create mode 100644 generated/iigs/tiles/tbank1.tbk create mode 100644 generated/iigs/tiles/tbank2.tbk create mode 100755 scripts/bench-staxi-title.sh create mode 100755 scripts/diag-staxi-screen.sh diff --git a/generated/amiga/sprites/sprites.spr b/generated/amiga/sprites/sprites.spr index 8dd31fe97ef95d389febfc93429dffc70bcbb820..90ef8dba455990699569e8dd8315103032fa8256 100644 GIT binary patch literal 7820 zcmeHJJx;?g6n;=>D}nF%V(ib~^_UHFL|0LHpvr9P`jn0KO5jnk=tMSWOHGMw0J9?Z{=5_jDjH#tI zwoCk|>sq$+c|hz#9qxK=twdQ?EjRswc9f-5kEH~jm@}%Aqd~*#*!`0n1o_C@hMjO+ z6f#C6M9Ua&0c$mfSH@cuw|MsmuI>s4MDe#faXuIO|I#Oe9cI~uWSPhzAQv_@)yM6h zHSBb~UWo(F)EfG%?Do_BQxrMuIL~L2=OV{|%!chBI|>hjb7pW4CCs0*gq!QKSya`= za*!thf6t^!auD!$;)56Qc9`d7yd7@bXO5TgcKQ3;aE13+YED1IO=+NU8i;QZ!KV{S zO6-ADkk4l{+{rje)E6iD21(e~Z$B^}l2MPkh5!esW-4*k=D9xo%6~ z2^E5MwnfH%sqypyHs7Ys;jDhJ#J3|`>22Ib%m%OaE{w)|4tD%rV?0Y>VE#6Z9ph~u zf7^4upn;PDc@Ng_d&P0=T$j}P@0EW~kbAAa)vGyCE&Y0^)ujrk0;+&2pbDr0s(>n> U3aA3AfGVI0r~;~hDzHm|caUC$WdHyG literal 7820 zcmeHK$xXyC6g3(N(6CGa+|mJ}0nUg65WuD; z(b^ajbm7BjrL@7r-~mwF&u>6%VW-xr>wtu$f?lV!t z2G1o~2}F)#j>a>NMjsIN9E8{Y3dTh|h9wn-{KRpmEdR%kovR){m})s{Q>Lo4{XTX> zj~jmEPmV(=ke@%A`NLlo?@Gz!*g61A?|Oa&DddD7E3X3qdRacdBw~}$ tQ5b9R{Hh;#ro|vOew5FzW8A4T*=aB`@B?k9rB?s| diff --git a/generated/amiga/tiles/tilebank0.tbk b/generated/amiga/tiles/tilebank0.tbk new file mode 100644 index 0000000000000000000000000000000000000000..27bdef18388be2b67b2d814339e90d2eff410d9f GIT binary patch literal 32044 zcmeIzv2DUY6b9f!pnwG8Wt^O&FgDj*Qu(i6j|yh z?Kizq>W{M6|9Qvuh>gGO@5j8$=WX3nx;i%m2oNAZ;2#Q{kIUWf8J`|M$aeL7jCo|# zMPFpBM@D@qOMTHV2@oJafB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U rAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&Uc)!3MWWlcR literal 0 HcmV?d00001 diff --git a/generated/atarist/sprites/sprites.spr b/generated/atarist/sprites/sprites.spr index 8dd31fe97ef95d389febfc93429dffc70bcbb820..90ef8dba455990699569e8dd8315103032fa8256 100644 GIT binary patch literal 7820 zcmeHJJx;?g6n;=>D}nF%V(ib~^_UHFL|0LHpvr9P`jn0KO5jnk=tMSWOHGMw0J9?Z{=5_jDjH#tI zwoCk|>sq$+c|hz#9qxK=twdQ?EjRswc9f-5kEH~jm@}%Aqd~*#*!`0n1o_C@hMjO+ z6f#C6M9Ua&0c$mfSH@cuw|MsmuI>s4MDe#faXuIO|I#Oe9cI~uWSPhzAQv_@)yM6h zHSBb~UWo(F)EfG%?Do_BQxrMuIL~L2=OV{|%!chBI|>hjb7pW4CCs0*gq!QKSya`= za*!thf6t^!auD!$;)56Qc9`d7yd7@bXO5TgcKQ3;aE13+YED1IO=+NU8i;QZ!KV{S zO6-ADkk4l{+{rje)E6iD21(e~Z$B^}l2MPkh5!esW-4*k=D9xo%6~ z2^E5MwnfH%sqypyHs7Ys;jDhJ#J3|`>22Ib%m%OaE{w)|4tD%rV?0Y>VE#6Z9ph~u zf7^4upn;PDc@Ng_d&P0=T$j}P@0EW~kbAAa)vGyCE&Y0^)ujrk0;+&2pbDr0s(>n> U3aA3AfGVI0r~;~hDzHm|caUC$WdHyG literal 7820 zcmeHK$xXyC6g3(N(6CGa+|mJ}0nUg65WuD; z(b^ajbm7BjrL@7r-~mwF&u>6%VW-xr>wtu$f?lV!t z2G1o~2}F)#j>a>NMjsIN9E8{Y3dTh|h9wn-{KRpmEdR%kovR){m})s{Q>Lo4{XTX> zj~jmEPmV(=ke@%A`NLlo?@Gz!*g61A?|Oa&DddD7E3X3qdRacdBw~}$ tQ5b9R{Hh;#ro|vOew5FzW8A4T*=aB`@B?k9rB?s| diff --git a/generated/atarist/tiles/tilebank0.tbk b/generated/atarist/tiles/tilebank0.tbk new file mode 100644 index 0000000000000000000000000000000000000000..a943d40588d9d52914364075f9e5f2722b889d58 GIT binary patch literal 32044 zcmeIzJ5Iwu6a~=7MLRcg{%CU53 zG@7|1`84zR^l*26_IVN0w}`lTiTkUM+x7DO`uXy0v2MPWuT9frWV1bUWZY~b_8E_@ zRzI0)wIBOT2gXCY)RcKVQTs=dyZ*ts+T#V|Eq~6nGj(9&EyWfwWuJ12jAHQ6_-#&-Ez>ejbM5wiU8P$!)w3>^EbBCDF?x@^zskiL3+3m&`FEp} z!K&sMWtH=~Icn^+@{8m*{aP-kt|yDhj9%;WCh*+D)=a>;dOdlX+Rk`MbS|I!-)Ae$ zki%vXzq#HXRs5!qlNa}0Y@1))q3%Ek>yzxHC@9Twa(uEMfxG-6(pUL;K8|ng zTjL|?R}uPFUaUpDfp5*{@T~gUX-G9KK4}!|7Pa$bQI$mNXEj=Xs}=va4+Xb+EVorW z1IxUx!7TPRZNI;eG>7Kh`0mbM=g9k1P}EcY#jy2NP;I;a%UfBRN69^}`;Qtb-U2sY zL5X+yOHiAwKl<Es!_kvMNhsxQJ21sweRY;=y#)N5-XzvMe+PB`fZY|ldx^7IKQyn^C*F-i0h%Va{GSoCAw2wh zTw`(EAN-YD@5)d@)bA^CUU!H3MlZ$?fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| bfB*y_009U<00Izz00bZa0SG|ge|VD|?RN9F+4j!{>~XPP8w-wWmrHy9u-b)zy@L&cA@rpk_PFL}h6wKzKC}i1L!f*aqV6wx!t1{@K6HS26YoFu;vi=8?)w8yY?g)>0#E1%u#JlPifctNHpzZEN@2B`bIj*X{tBUNby4Ixxond@_h17bqz)? z)?Da#3>)QKE|-@8kz_yMp1;p$istPEj3{c|Z6DW_<}9x9X>!2gp9q-u-V{K^b5W0Y zxFLz)N|%<>bRFwu0O&Y3u%&SDFo$7N%E`iI_K`hTEAK)6ks-t!ktUz Iy>kiu1KytCNB{r; literal 0 HcmV?d00001 diff --git a/generated/iigs/levels/level02.dat b/generated/iigs/levels/level02.dat new file mode 100644 index 0000000000000000000000000000000000000000..dea590378b780e5ff61a0e7c7938644c1f6d5b50 GIT binary patch literal 2042 zcmcJPO-{ow5QW_kCj=Ly3bD@}xB*gGbq8Wc#b3<-t`ex5suy6*u{aX*X6%d;2m=Oh8Srj{?+`8g$|M;lPzpie2y1pm%vflg4 zdJ8pMa&y(%pCUTM)eT{! zyI?uU5eRMctJ#rCi{Y>zKxi{p6ZNqb2gm5w#1_KNlEI^Nt#5Brv!H{Pd zaU;ukzo}!N3+{3*asuAJ;2iMWj`|Fsa{&b>q1tgqz`#|gtLB|3EgjA;Jq_3j zpMV1#k-!Bse8c-l{9w`f5cd}xIkC@Ixqu4|S$oRQKp?VyUnYa{Ag$!duu31qWX1OX^( zpo7snjLhB}(uLq>R2@{QsCAn47nG-yNH=*zK}#@{+5q(K%w}ptca7z8c|jGAFNBNF z#X?uzH-T$5AE|EnGkxjsrA&OWRkb+|bMQ{WPixNdAfY8Rf{Me4}TXe$O7H*xL`NF0c zE8=}Wb-+9HbB%fJJSFFGU+e6)!kyy2`bYxX zvqt8OqV#_H$v*ofY=k=%wNA5oM5mLHPSRd1D^m;E>&Z+AF<@kP=R6DAfU4n-FOgCR G&;9^W!=MmTu`z}wMj5IK3KQ`m-q=l{;@i0I>~7fI_y5#7>f zB6lvz+ipU%URvvj7Y0W5HS*BkIZ^svd}j1#@^u^g8-73~8@GHxH9{GP%{mV9}EqE`35CH~m5Q((>@UO5aIg0J=;(tj7J5%#_jpHdojLwR=mie+I6I@IvuU^6JtTNM ze!yIRU$2dKxCj`;o*^ptPyui@O%sJw3RxJCGJJ~c6c332PfhWZ%7pMVm4)Y`yjhIk zjEZ<+U}Rq-Z*G8l;g@mL!6>IF71xJ1He(bF9(x`HabNiZjmvqRt%uLQu-0hs<+X!PD1W*OkQobBM|tJ>+aAWpJ}XvS*0?1?c$t AzyJUM literal 0 HcmV?d00001 diff --git a/generated/iigs/levels/level05.dat b/generated/iigs/levels/level05.dat new file mode 100644 index 0000000000000000000000000000000000000000..8467bf0bb7a8d5024ef51fcdfb7feb0145747eed GIT binary patch literal 2066 zcmeHHOHRWu6m%2ZU{w?q+8vABfir|vcOX_k`ADG>OCo`Cir#@6mBM*=Z=UVgb*Z|7 zO=r>P%p1=eyJ;`4rsu`9x~`^WrIa#fC!>k#(<&?aeKVZoujAAFV>rqe<728vR0mWI z)q<+d7x#~Acz7nH>}|Od?*2fx`ujjP8&ufPn*L-Q!iF(xI^T3^u1wq2^C@?amsWY#eo=fiQuPmJ8GH9tv-xmG7uI4O{sI literal 0 HcmV?d00001 diff --git a/generated/iigs/levels/level06.dat b/generated/iigs/levels/level06.dat new file mode 100644 index 0000000000000000000000000000000000000000..d232194d732ad5a0efd95c0a300ce81ea33d7e75 GIT binary patch literal 2042 zcmeHH%TB{E5KNOgsg+9w;#jE?pTIY?r`|xEcq5ibz^xIe5-R1(*@v^S6Sw71abgbc zdUrfKex&CYi?d=eyPPei^8|5}pByI{25FJ!*>IelPR7}2GR#JI4;|b;Bl_9v>925e zK;CA(S?|$%0>&G_0sGQM_w?1X_~+qKeCcs$5IvVTudY7+`qPc&?MT*7PS>;QRQt7ymq+_&S|Qzkoc9!myW*ug`xQYDV|ExVqr z+%K(`Er?3##GELVSh1k=^xr{f2KrAp6@Y{5CYo z+AV|jPo{u&!R8$q4ZBp6oH#Ku97$nNRVi-l%YCL73{EIFKP{^%-HK)KMd?-BrC2MI@NNu= z!i&44q!NIP_&CzjsKi0p;X?={z$^|&In)8ipoo(q(v=a8?!Ly65?CfpUXtNt7n=_( z|6)`Y^8rE{>B!y!^BN7e374MoOJkWNOide#!0($i*K!wM{$$~UlbCnteJZx t!za%bA|e$pCMlyVM?d^j%}*viG);3FE%^C7RZ$kBtfxuQylFuMg{Zx)|arAK)u+ zQ0xnHhn~yVM&4wL^z9j}X`~BTbSbTy?xlr{T>2he&fl}P;tZVo}#|0$!=@Dt(gdAE~l znoN7b2K|zy${Cj6_5pkT-OiO%pd*T7o|zTTygK3+Z)}=;)?& z82_fLmVr9$02|kHUx^Bnz>@d)Y1N*T45HX!ZCsDBeU<7c9h^PzDi3J~`)2#U! zTgJk*(x27aB(*Z~z;YIuUw0qUj`WAk98&t|5IYPGqSI}lkFolN7$M_%LO?*BTmYJd zjt5mP1nAU&Lg-|PjKJxT$Dyv8M8{QL2b!PPIx`Oeeg@SQ!%6+bi;iVq^_$=)*Tbc9 z4)d_{s*dMX9qdF`P9k%$!C)+9F6gz)r470pGj$bj{ILE|GLN)aq!D*r-N&?ArOJX< Nu$t^heDkZ`*x#t$7B2t* literal 0 HcmV?d00001 diff --git a/generated/iigs/levels/level09.dat b/generated/iigs/levels/level09.dat new file mode 100644 index 0000000000000000000000000000000000000000..fc9246e304891ed5249d67941bb6d946a311beb5 GIT binary patch literal 2058 zcmd6n-A>y;5QWXUyG|SlMAJ&#k$31bq*A5a6>$xu-2(lWB7ssNl0G@-%*=W>5UZ(# zsvgI?>zU8d%eyAjUAdVKK8|2jUbkB&z; zLwyvX`-?*7pP;kCaIq#6S2*JRq+e@AV*Jq0sOO^ujDNx=6V1B=htlGX@koB|?F7C4 zBtiZEeZ(()Ph=f`XcN!g$FBRl+U0rt<#UT)`}_U=Px`$>mTx$JZ@iRDo%+4*TzLcT zt`z4dw2E_)P4oG6yiyCs=bCF>T;#m!oHs0O3;y0hGULda*m`ypbK7&U5VsWjGBX` zRr1P=Y?5#bCwz(|9H8wSDj?{}`cgWZHA^)F1X&+_6Vi|}4Yua32FcGEk)*h%^|A7y zln0Ev*29s4G^p(^P!W63RX38ubL*~|xJa&9;NI+4nGMc1M)S%z$U(W14McH|`?VBS znow2(ZnAJGl6iB95|yzPEbrb=qEYi37wmlwA(gc+ama~{Txjvrk1M2a3=z}Pn~~59 dli%C(jdO00)cDaTd*N2m>QhUcy>~8q9{@Q{`a}Q# literal 0 HcmV?d00001 diff --git a/generated/iigs/levels/level10.dat b/generated/iigs/levels/level10.dat new file mode 100644 index 0000000000000000000000000000000000000000..c4717cca193cd97663d0ba8bfb346802c0659664 GIT binary patch literal 2054 zcmeH{%}&EG49C-MSt)}9NKBf6aDPEy1k z03RCX@1J8k?Y20dpH%bN#cbZ3DWz&vOs7hNS5~9ZNbL^?y9au4G#P&HO>}#FI8eo; zY_4w;ySW3))yrlpyZYyP@2Ts#m$q$Fwlg``8DlmHXmZYC8JTA`h(&>JpGd@5a69*+9MO7N*-gCYNTrMS|;yQgHjRwOe zqP}P*QNyq3YEaGo{V#vH~RfDgjz zgkwE*w&c_noa>;5`%79$OX4uPzjrx{8`{2)Fupho%h~JZ%jxB8*b;&hrwA9a9VbrV zlLICi~_&t6sd<>BlF%LA*Zf$13l|N7s|d zWMRqX5JG$pW?dZWH&=O{+dFXi)S_>Q$HXB3NO0BoPuwTT<+L=!q{rA+|DU*Z&7^hn z(Q_=ZUvH#7WPXTanm`A$%gft@cLO)#}tjrLZ>$ zm#@nuRpnF`E1|2wB4^uTou+9Nfvb2WD_Y}^3jV~vLNvM*W8f&JMWbF!xr!0y7)uZ< zg&iyrml2m{&{83WBx4Rs#4&~*6{Uqvi3{~|up_5-;Ajryc%b4WcNJft%K#_mrWmd% z4IU)i*K8PRc)g9zX2KjjNTn(*ew==uG|fQKpNs)?i~(2X0Q4BIg7XDdMMc=p3Cb9g zv5~xMK$}2JT^r9ODVO^LeLr(s-Fzrri1Bf*!UGw@D|%{sT}-ILb<*Sg4SGyV&P(z( o)MLZk82re7H=|=`y4BJNe4rg~iSBlbF0|ROiXUGv{H}}c58EpH)c^nh literal 0 HcmV?d00001 diff --git a/generated/iigs/levels/level12.dat b/generated/iigs/levels/level12.dat new file mode 100644 index 0000000000000000000000000000000000000000..6a5ba48d7fdcee5d1e495fd03ded99b50e7a2167 GIT binary patch literal 2054 zcmd^9Jx{|h5OrOyA*5>=I%Vw6Zzv1dKul05gQ>*VQVFO82!26-B0q&Y+h;pAPFXVX zq$GFu-n~1yR!`5GqoSFg&zrgtqN)z$bSj2I2w99qqjCZ#hZFd&0fzM$hGGme0WiD1 ziLksyq}9v%PgwM$d*3yDp_F>X=PM_CL-GNie)h{vb@iUk#rfv~I+v$i=koXu&!x9} zKo{+fPn?o_PUtsUTx>l))kh}TUSX5PYNh5JtIcL}tgzzog5mmkz1G$68Yrqb7XJq# z6o{xqX_-TdX*ISxBAp{mi%UzLb86;_!sM+rBAv0ZLu}$crE#U4ox8uOPJ6{op`RAG zmsi>nuTbg@oX+o~N8-y?C~0Y^vUU%}7ePw{4K z$4;C`TfvhO&&+!s&vRD$?D_t2z2Cjq?fa)nsrBXR$+cP|D(dyxY`gOJ!)^KJVq3m^ z(3QXXuDa?C9$j52U6sn<>8g@4yaKW!QGXWxpN{Agrv9-slrk!`=8y z&UnJlcoH86YZD>+_`s@cuf4Z6E6(Wp85z#aw)XZuuX)|~l$q~G^lk8Qu=I{BK(EQ0 zVIS`&KHyX!(vj=wd|oI^I?AGMdN&ilXat4Bd_T-aZ~b6SM{kgZFBAGfHZ%$irR0S~ zHw<<)br?tfGi9 zA~7@gh{G2^%u*lGJ~t{hqlQW@T;@x4=p^liqo=xfRIx!Eb$&h+l&bOaetf^UO*V~v zv~Anr@rw+W_>c{}-$~-zAI=BI`(t68N~TG2?^i^rZsV@s%N4#`kjRQU6b@WKek^Kwc C%@=0? literal 0 HcmV?d00001 diff --git a/generated/iigs/levels/level14.dat b/generated/iigs/levels/level14.dat new file mode 100644 index 0000000000000000000000000000000000000000..4a4374a5b8c148c7f05fb7c1902ba6fcaf55f6d1 GIT binary patch literal 2062 zcmcIk%}(1u5O%!Y*lr?JB@t)8LtmhmaEiE4_0)tv$wUHLkRlaw0QD)jBK0Nuc+Bta zj-3irmG5Bh%zX3BHybNQUlyOr#r*4h(Hv%g$zZad4dIZN!(mkv?(<;eM)}lDKhE6q zbnN~#A6zpl-0x=Q+{sx7rx$>JcG(y_nW$+rUcCqJSKD5;?IVt)IS}8bG35VgE{Lgb zUFV4*dJ^GF37r-*HzBE2ZToLL*!>1}UoGKq)wu*7W?bx=3!Oip^HrXDPv1r_Ep*PS zrQBU7uc20V=xIr*^fo->+ywSJuq6|L9$dpUU!bX^Kk!3e54yg~wUaT3?;-xXKeI-& z`gZ;%9Jc}MbvqBicDp@jAro;2$IZ{phO+6f7Bivhdnf_Dr1!N!5@uMar0PBX)d(O* zMXu3N<3x|i(vK|!iHYYJRKmQ(J)ZQyi#6gi_(FMMKT?i!rBn6@JedYOxR*Yl3`wIG zNgb!i8&i&-c40JDQne&KQsxIL7E~(WByBi2-XB!=h(Qk`CGz4ATX?a=BkOT5e5c_n z(m6^kNDn30pX6CDbjf&$X)Y7dpGs*)$hgN_Q3(8C;LAMED@Ex?BOj_zW?(jcuQ1U2 HJdf2EgMt1r literal 0 HcmV?d00001 diff --git a/generated/iigs/levels/level15.dat b/generated/iigs/levels/level15.dat new file mode 100644 index 0000000000000000000000000000000000000000..f0912390c12055cd84f9e54c7237f4abdf5e3598 GIT binary patch literal 2034 zcmeHH%TB{E5Of-BQ&r-Edg4;`7x;#7io^lL3Bse`KDb5#MSMIvyLLhnHwqFJm(F1w zkEiSLdfl7b{L<#xU6wDd6=A97=PIR-i8Urk=jp}MO9#(uLZ5wDj6(5WI`=gS?&vRi zkHxWm@w)t?Uv|#DJGYJI31o4<+P$uTw=EBQ!lSFP*|@BpR8@85h-vUipXEncG8?wR z=)lygx(7?>ky_(#LQNxRkzU8*p%8SGPh?GEp378CNyiF5|LGv;ARyg@z$*Bc0~p{8 zNP!bV*muYq*0iQvt&@p^P8_4-tq$XF$e@CK?{AFm5cPutM!S^W4lWaQCPfGXy1(`( z#t=JqN?yRoI`@GH_UJ?n9k-h?{gjf5e@_p~7=B%Th`cnR(5-+@5^d@5rvX;aW?I(J Q&xr?Ed8B?jv|O|L4e#y$E&u=k literal 0 HcmV?d00001 diff --git a/generated/iigs/levels/level16.dat b/generated/iigs/levels/level16.dat new file mode 100644 index 0000000000000000000000000000000000000000..e6471a50d2b3723e2d5ebd91922044cb2528bef6 GIT binary patch literal 2042 zcmds%OHRWu5QgnEZW?tRvCSPg0t%}xkU;EO0hLT8U{?v$ZC7xEq8^T;F!MX(*iKM+ zbj2)E&-|a~WyIyx?6jCQ*UhZHP)bepsH*ZYow8y)9!;wJ?4-&+>M9@I+$DBu=fOe{uUmL%VtRyY~a&FxO8%$PJ_ix8Loe!bj%P^gJTh<#<^5H=ImP`CPg#VVK@e zw3rJfp!nE)z~Lcm{2bnmx#iLe^^$K`eBFfZMHhCv-CD9Ym+{rQfOq|Yq1GPc;C>&) zeUihEepf5o_zRoO=G;=Gvllw9pVwsSo9HXYvp*QHlniudMg zIt{g=Yv8yD+M)||1<6oYKFH@9#e%iQ<3QGEQ{&A0Z(qu2SgD~amAYjV*TfykOx_xG ZV2UiuCSrw|PCK=2kRXaCe>GXwsh<#^6u$rf literal 0 HcmV?d00001 diff --git a/generated/iigs/levels/level17.dat b/generated/iigs/levels/level17.dat new file mode 100644 index 0000000000000000000000000000000000000000..4aa266c2696025cf131931f6561b0fa4fe95cce8 GIT binary patch literal 2062 zcmeH{zfQw25XMtCZW?8vs3M{heg~eROkEI&4Fn9P691)2z=DvN+SpIU3-CzX**;&| zl&C|;enal_@4lQJOYPbDlgd!*Pu+l#h^Pp*h_!a zpsS9`R2`P-PhNJX*S9OWxdS!nrP@eWyWHA)+RD9HP?+92uRX`z=nOguJROF zOD?38;vB!=n0;aZBR#W^zJ@(CthCio5E%RHyMTaW)7pD{V8+Rx$bd&06b-B^W2(w% zI-YTZD5wo_zklr+cfc9{rr?ZmmR@|i_vZ^ghHAL9IS0Xg_|-#zufD#7C6(z^kI7>_ z(Lh-5U}tZ$nWMF{D~%*}WkVUL0VV!%Y@l6k{UvSXUIZwNZ=Khk<8E|l;%NE+M$3+l zur60;KDY9&NEtvF7a#}e03rvHiyR7$i(Np#u^A9%ocvB`@y(!U2tWu v4ld1n)zyb(u1PbghD)ml+r3PKWTzuD_^v)FlSRQ@XnP@D`jJX01b6=cQ2z(- literal 0 HcmV?d00001 diff --git a/generated/iigs/levels/level18.dat b/generated/iigs/levels/level18.dat new file mode 100644 index 0000000000000000000000000000000000000000..2303e0d174f825305fce854af5d2c2c6fc04d53f GIT binary patch literal 2034 zcmb_d%TB{U49ufxh$=lqMmJ+U&K)v?InX$c(WK+R`k-FWT9ou6k zg{SAkU3=KS><_!g0=O-<+oHs#YS-(sS*;#ihIb$%o!iYIM9$_6<8n4m~;4u z%_N_0Q&Y+QpLOFrpBYRhEL)wNtzt)op<}a{&RJ6XmgmBGUBoYDT+l5FQ=NYS7KCZP z1BP$VT|E1TVl5=|U))aLt3`>B&b|H#$q(>&bo+2TpU?LWOvE>~r?1mV*tD=C6K?Aa zEs&9Q-F01oPe9LI$`-t?YyLSgi1wNe=_crTN~0}b57cXc+~(G_Zbe8%xNqBrs2Ruv zJ)>3t`d}T=(e2!Yc#uA#Jv-uyp#e3r6wJpJi2YN^)XJG_+EbDPo=te>PeVeb>4tUb zoOQ92XTa|i@Pb)_Np+#^sDuP2MJN7v!|7pu($i$|^Rv2)lz7A>4g;(Hctfh76$1;R zjzv>o8GNico#=wUPNo+gZ~lBae1uB$q;zD|64r?DngojSXxhL1l0+IX#r8RciU z_X+MEfo}D>J_tAeO{WPfbJcpA?C1;icgt;J=tQR@vf&s(SBIh(KlbX@e;dzQzaoFC{hn=KngH-)+H|vl4uS}j zHPFH64MukF4e4U=GrEqdR5Uunh6~Dzd7_&?pkO2zO78%Aca}?iL3hT4DgmDe*B|S( zsrqjWfqBxissjmhic00bLBxbo_)}rTM4l%)Pg=E4bCYx0?hA?u_z^g5>nvvk_QJ9} z(fN8B9HLOBdjG%~)Kw(j$=mikEc%L8J(ft>lbhd?GXJ@{+DaJ~8 z-giMwf|PX0{>_6phXb_uI9>9JAT{S@ZFe2;j{SUNUOP|8dD_=G`>k-Nw68gm#P*z# zJ)Y|Q1wb2fuk^! zNu0^6L{)z&?)dlTe;PN_jTE7LZ30OnI@H&31kqT{aSH2-ygVjEdEc5`5rdaA-VH9W`&cnY z$D8(`d9iQWmj9NExO9gQ%W)z|pA4P`wFx34{w{SnQJqKm$-Tu79dDYk5{?69HEb%g k^InvVf3U>@OsiPB(a=Up86+~Aufj43UCsMxEoHj;2iAup7ytkO literal 0 HcmV?d00001 diff --git a/generated/iigs/levels/level21.dat b/generated/iigs/levels/level21.dat new file mode 100644 index 0000000000000000000000000000000000000000..cd178e52ef3e131547fcd6477d5dc8aaf02fe9bc GIT binary patch literal 2050 zcmb7_O^y>W5QTf3ZudkZAw)KV#3Fa#3}KZWKPMn2guexmK-q9WF2#HGW0%t-Mbx5W zSABl_u_gmoa{=?2$()hzyHqu%4^pGvDNL8i4ijoiz3cS# z-u3D$)uWE}U!zh^e2-s?y~yUFj>PoZn@7UMSnI$z7t}fr5$rj7_~sU%i0yaXc3kYr z&Y^YW7FYmz+5e2=vFz%R%jNQ>Ak*SEmgisRvt-4UJqk0mnier57Ri)yUdPZapF>OM zj31Sp`3u89!B63{aoD6(Yl2pBJB_0vK+Z(6gf@egZmG*g!i8=kst+ovTIB**^}G#y zHtrgvqJ!iH?OQ#1&D_iF#RWOHqb>EuoRyuH6*$F)Fvqag@z{OkXlrRJ>T&6MXl&CJ zJJt}s`l=;1~fcgN+Jz$}oor_I$ z3{v4u&5Zg}HxxrtFR@=VD*yb{8xXf3I$}aH*w*)}<^-?@?jdHSMdX?x)k7Qc%iR-y jSWl;>(PFy0n`WH6_n4=LhgL;dgW1V$Bp=h1Qmg(0#=!K@ literal 0 HcmV?d00001 diff --git a/generated/iigs/levels/level22.dat b/generated/iigs/levels/level22.dat new file mode 100644 index 0000000000000000000000000000000000000000..89df634fb86cb77d0d713fd402a7ab03b14bf721 GIT binary patch literal 2058 zcmb_d%Wm6143s6UWHmk%1&rPT<(7ND!9DqwB0tcEb=~v@7-->3QS`I=bDbf%4@EKJ zLm0prlCwi{m#}Z%ZQu0U&FyA8-d0uBy;@w3RR>h}UDsD_(^TuGdC@jEFW2qg*KPCf zYTaC4wavB6>?3Rz6dBL5=jVxh7Ws|he?-0*GUr;hp?@XcyxT*-w<_dITS8O6;onuPN$%437JwKJZ8cSX6 zS!CV|#-~)8mH>13jMRwj6mpF2l;<;2BS~aAkJ`Issi~3|Kt?L=8@t9*SB_|83jf0mKyhGpDDEXU*VEmkx6BENtSKMx0umh*Cjb2iMZhs}Z^ z45zFr6CvQsC0dynh6lWqG>;lRIUc!_Iq$~}fH%pPt`%@lof#J;az;ek{2)zEj_X>|;ZP9rZ&kTdo za7Z2VaNYRxhtvdmz%3a?-&Y}9L(m>P^Zd0E&qn}n=t9L9NiL6Bu=V%7wYbLeCf4jtza7JGj}&)CJD vQa7&UO4n5@#XYr~e)?0#!beyvLXS=3PO0_b;v%Fh(q@bnLvci`amxM&gh>u6 literal 0 HcmV?d00001 diff --git a/generated/iigs/levels/level23.dat b/generated/iigs/levels/level23.dat new file mode 100644 index 0000000000000000000000000000000000000000..ccf8623dfdd5af9218af3fcd4073bb39333ae942 GIT binary patch literal 2042 zcmd^9!A`?44DGTdS+&E2#Ch70JKr!)y@B8dSQs1JDuKG6$Io$^q$yK{IDrpN{QPRW z&sFaqnp@lK9(T?5sUn-J&8C{uMOkC!)z#u=U7Pdz+MHcsFJuMi+!nTX&)Hc3!ei1U z_wRXo=iW$VFK1LrbUC_L#&8}Ty9gjNvY;Wv1^&+7+-XEEe#g{J;eh|+?~nHOKGNhD z_cq+);ox>X)^**TBP7}NcSb^@sK1b!=GOzj=>LL_x+ z0zEk-Bo1N1BZ#OWagirA!yL&|dA(R{c$>(pCh&L)@Uj=xVzDt#Nj%UXYdAs70BA6> zpdl3Mp)uvSQ8?2@ro1>!aiej#FFC$t1Rgdz%qKh#W@IcKhBBfHi$l&Qg3oyPEUk?_ zlETSj##qY=7RAsIh5d7)F9)Gre+mz=eBQYFE=w_l9$}y8i<;0GM6a_4gg0E%H?dxb d>Df$MrBrCVw0gCQSxS2Ys`-7yX{}VuegO-K?a=@L literal 0 HcmV?d00001 diff --git a/generated/iigs/levels/level24.dat b/generated/iigs/levels/level24.dat new file mode 100644 index 0000000000000000000000000000000000000000..a499a94d1b4acd5d005ff8ff570cc2856e66aa1e GIT binary patch literal 2062 zcmb_c%WlFj5DZaGARr-CpkDchegi#mYgP4*M3MTIklJ#nxbn!E8$ZBLc4pUhLQ)3~ z9m(-NX2-iW?d{$8IvJ1dN8{l`6h)oO`06TZ!itk-vy~dNOjE2LR^KcK#vBGIRv)Wp z4p{|{KqZL4W}9t>#8$FuJBP82I5sZKyx6VYesXJYiY$ z&6@ii8OpPRFi-)ylmRP=zXD*^v{tA<6Kix@Lte=Qr8%DSIo?Ziz~z+(v9)?NltS(4 z_aJ$K5x7_8_+eDBl0i#zyr5V69^ckH?>*!x*1S5WAK3X4@>8g}VkxDfWun!98p05h z!^!Z!tJi#vkJ23LEL&xpNf2@_YR<&eV>X+Pyt7y=Zl;Lj_<}kAoX;g%9B0ai&&Cxb zKqY7cZK7y9M`DqF@h?UpZ2w`_7OUBAM@*Kv;`>ujLYrTqs$rc70=64rbOng?uxJ;| zZkI)>7b?wH-~a#s literal 0 HcmV?d00001 diff --git a/generated/iigs/levels/title.dat b/generated/iigs/levels/title.dat new file mode 100644 index 0000000000000000000000000000000000000000..9887b563cea400c708312b014cc0a86ce2c0f27a GIT binary patch literal 2028 zcmeH|O;5ux42GMPZjGo`)OJX_`NRoLLT~_1jE_mcw4qV73*QHR2|tS;haD%KLk9G~ z5lc&)H;-R?nGm=2bU&#t>*+-l#Pe&bczFPdcMM+W;3?(=kA~x%R{UUrWx0Z?EJs#& z*Q^GmDx(OFG+WKCv^rPHY+rUF!O+f}{J4TS1N^uM&K7fDGl%se1HrkL3_9F)`O3M8 z%v5G!FyK(eYyR@Tas(hM=X+}z{QL3{ogrN1X&)vdxE@q-niQ<#>dn`vVd8T;aF%Zk z3*AdA*gHBrSn-k@XBjMrDPfV6NwJ-5G@#@faZN(pRX!{$9d91P-3@f}0#Y=EGR}*n z+_g2n-}!twGoeZD}nF%V(ib~^_UHFL|0LHpvr9P`jn0KO5jnk=tMSWOHGMw0J9?Z{=5_jDjH#tI zwoCk|>sq$+c|hz#9qxK=twdQ?EjRswc9f-5kEH~jm@}%Aqd~*#*!`0n1o_C@hMjO+ z6f#C6M9Ua&0c$mfSH@cuw|MsmuI>s4MDe#faXuIO|I#Oe9cI~uWSPhzAQv_@)yM6h zHSBb~UWo(F)EfG%?Do_BQxrMuIL~L2=OV{|%!chBI|>hjb7pW4CCs0*gq!QKSya`= za*!thf6t^!auD!$;)56Qc9`d7yd7@bXO5TgcKQ3;aE13+YED1IO=+NU8i;QZ!KV{S zO6-ADkk4l{+{rje)E6iD21(e~Z$B^}l2MPkh5!esW-4*k=D9xo%6~ z2^E5MwnfH%sqypyHs7Ys;jDhJ#J3|`>22Ib%m%OaE{w)|4tD%rV?0Y>VE#6Z9ph~u zf7^4upn;PDc@Ng_d&P0=T$j}P@0EW~kbAAa)vGyCE&Y0^)ujrk0;+&2pbDr0s(>n> U3aA3AfGVI0r~;~hDzHm|caUC$WdHyG literal 0 HcmV?d00001 diff --git a/generated/iigs/tiles/tbank0.tbk b/generated/iigs/tiles/tbank0.tbk new file mode 100644 index 0000000000000000000000000000000000000000..8fd5cd9da902cc6522d6d437b829dd1c9e41b288 GIT binary patch literal 8236 zcmbuDO|ly|41}esEVGb~k}G(bb&j1wrN3@~1VetSNi z54XR6&-ms0{eC=OeBRX`T0dS7?H|o+N#5vXY`Iq0Je~_n8aMV!Pr4_5NecUlZ$FJ~ zovZ!(Wdf3gND*p+j33yW}LKP39t?CV#$Hy5CA+f08?CG#2ID zbB&8j*)RNZaVvk4w0Kzf2BmK6`NEklN1CaC?3V4?2VvPS{?;w@Ess421J;1rqAmN_ ze8hjsorJ@GP(tl)ez({D35kdQpyxAZ?H`3UP99jTyq2g^s#WJFae5z};va&Q1NQBM z$$g`iY2j8i;z(fsW-KpU)ffwjNu2%PvkLQ@yGA+ z8y5Uk@$!BXpX)5fMZy6Xw+L#3-0#jqsE;o(B_7UX#*6(O^bwybUH9_%-IttSFB~TK z+*`Pt|A-NVmH(YxW{wN{DffJH!u-xYwmF~=d!JEi;rx+jE(mtoLg1 zpXXO|%fPUGaz(`b`|o_t{B=IC8Tp9)#bSA+Xqhjb}3zBYj6^qfcku)0ulu!!k?gIWB) zO!!mA?_4 z8azwrRIRxstF2=Ifu+L9~%RqhUC*vGEJ?y(d&HayhW^MOBc z9p~gf?XLcn*VP(tZ7`Yl@n+sO$LIs<_%%9y@(wi#^)_jKRHmBdD}Tv;vJolf)tHUm zay0I{b^%u~Z8_cy8M7+V+Z@oVJxRP=i!A$eqt88YDK+UjE4Rl)1 zYaJ~hs=)px55v1srUqXQzPr{AoP6d_1=^Z2v5;z`Bm0y z1L7^TED=yW^vTwlMA%qo!&|0-}q0ddsvyTovBO;Ac<= zzA`W-;M_HM(MCX_w*ncI|IeOF-hVrC_4%jHeS;O(z!yTB-qSXJM5?QCYnr1Ju*S@t zs$uTf#IG{rnD}Dt*ziL~Q~k2kns*ug=}U8v!o=S^Cv1ux2gU}ke_ToZmzvcv`P$;}HJ0KC*F4 z!#($pD^~Uucg0l}C6`S5O`7iA|&u>ZAlr}(F54u$^F$Y~Vv z%~N7F+sZsj0Qo`1D`^x}H=5{wbOnTxZ!!K<8dbEGi@Dwk(utzwt__ukA3UufQ_M$i zV;5j9Dm1C9YttU2R4On~-RK%o&FcLS*%b`Hf@9%stCK*Jfyly=_OfYP;o(>x6eqd% z!z3& z8xU5=bx4TyMWtwDgOw-7W2N}drnAZU&TS6Nx%$+X8U<*!LS>{vv~As7E#E3+x<^p3 z8dLO?Ki(7auAnVwDSM<;vdWzlCBbr^2lg#zTsr8{kwYei$B=ykWZ&j^w1d4T702el zGM{Thx4*kl+2Ks#4X~>dVLiW8uiA4hRmDJiA1{EU$?BD^eUoZrI2yhqACV-=z($AHY zVe8b~jWGHywegaJM0`7xEl1`Km{ZEc>dU@%lu$qr+e8^~HI+6=@lQ|5bsSYslt2i? hcG@S81#QdqRnAO|e9DjP%fGZru3=3%bA9wk{0BDw--iGI literal 0 HcmV?d00001 diff --git a/generated/iigs/tiles/tbank1.tbk b/generated/iigs/tiles/tbank1.tbk new file mode 100644 index 0000000000000000000000000000000000000000..8cf99567c29e1c827b9a28ca780ebe87d84ea0ae GIT binary patch literal 32044 zcmeIvF;c@Y6og@GNJug%u#dvfK*vy0GH?Yddd@=6EjR#I;TEvFvK$i<=%{{qY{~M| z)6?hM`Lx5*X8BneS5dQUOsLgmd~q?&C}{-Q)7-lhre5|kZu@y z-Cd`yQ`f1Rx1twK7e@^0ykJo0&^F~fQ`5I3^n_OCvENU@%FvhZS2pt6qDp?bryQiyncYm9Pg5StX{qlKWJxz{eOV literal 0 HcmV?d00001 diff --git a/generated/iigs/tiles/tbank2.tbk b/generated/iigs/tiles/tbank2.tbk new file mode 100644 index 0000000000000000000000000000000000000000..2ead5e10d06efe233f836e85d3efe4e1bf61cdb4 GIT binary patch literal 32044 zcmeIwF;2rk5QSl{NJyd-I7dM=&>>1n1XrM<=PdNxf&*}s+ydTvW1A!jq(=HTvUly- znce;3`^US>S=*jz;Kqs9Akdl-7HX3g&j$JC>%jzU}|A zn1WtlzqTjWyDVNeO=(F{WEdyS`|uvL`=ec!uUiUqIZMm2^I9+Zu61qb^62OBy$dVo z3I0#2&)BWNj{71I2zn?aWsOv3b$I7RtBQuTEtjjLrt z*_1OiZ@OGdm3?_ZT?daYI2NfiKaC|cR2B^Z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 Z009ILKmY**5I_I{1Q0*~0R;Y;z&BwWEad&2; exit 2; } +done +if ! "$CADIUS" CATALOG "$data_disk" 2>/dev/null | grep -qE '^ STAXI +S16'; then + echo "bench-staxi-title: STAXI not on joey.2mg (JOEY_DISK_EXAMPLES=\"STAXI\" scripts/make-iigs-disk.sh)" >&2 + exit 2 +fi + +work=$(mktemp -d -t joeylib-staxi.XXXXXX) +trap 'rm -rf "$work"' EXIT +cp "$sys_disk" "$work/boot.po" +cp "$data_disk" "$work/joey.2mg" + +cat > "$work/staxi.lua" <> 4) & 0x0F] = true + checksum = (checksum + b) & 0xFFFFFF + end + local n = 0 + for _ in pairs(distinct) do n = n + 1 end + io.write(string.format("STAXI-%s label=$label frame=%d changes=%d distinctNibbles=%d nonZeroBytes=%d checksum=%06X\n", + tag, frame, nChanges, n, nonzero, checksum)) + io.flush() +end + +emu.register_frame_done(function() + frame = frame + 1 + while idx <= #steps and frame >= steps[idx][1] do + steps[idx][2]() + idx = idx + 1 + end + if frame >= 3800 then + local s = logoSum() + if s ~= prevSum then + io.write(string.format("STAXI-CHG frame=%d sum=%06X\n", frame, s)) + io.flush() + prevSum = s + nChanges = nChanges + 1 + if nChanges >= $maxChanges then + summary("DONE") + manager.machine:exit() + end + end + end + if frame % 1500 == 0 then + io.write(string.format("STAXI-HEART frame=%d changes=%d\n", frame, nChanges)) + io.flush() + end + if frame >= $maxFrames then + summary("TIMEOUT") + manager.machine:exit() + end +end) +LUA + +echo "bench-staxi-title[$label]: running STAXI headless under MAME (cap $maxFrames frames, $maxChanges changes)..." >&2 +cd "$work" +out=$(QT_QPA_PLATFORM=offscreen SDL_VIDEODRIVER=dummy SDL_AUDIODRIVER=dummy \ + timeout "${STAXI_WALL_TIMEOUT:-900}" mame apple2gs \ + -rompath "$rompath" \ + -flop3 "$work/boot.po" -flop4 "$work/joey.2mg" \ + -video none -sound none -nothrottle \ + -autoboot_script "$work/staxi.lua" &1) || true + +echo "$out" | grep -E '^STAXI-(CHG|HEART|DONE|TIMEOUT)' > "$repo/build/iigs/bin/staxi-title-$label.log" || true +tail -3 "$repo/build/iigs/bin/staxi-title-$label.log" >&2 +lines=$(grep -c '^STAXI-CHG' "$repo/build/iigs/bin/staxi-title-$label.log" || true) +echo "bench-staxi-title[$label]: $lines change events -> build/iigs/bin/staxi-title-$label.log" >&2 diff --git a/scripts/diag-staxi-screen.sh b/scripts/diag-staxi-screen.sh new file mode 100755 index 0000000..0e63232 --- /dev/null +++ b/scripts/diag-staxi-screen.sh @@ -0,0 +1,143 @@ +#!/usr/bin/env bash +# diag-staxi-screen.sh - one-off diagnostic for the STAXI title test: +# boot + launch STAXI, dump the full SHR framebuffer + palettes as hex +# at a target frame, then extract JOEYLOG.TXT from the work disk so the +# game's own init/asset-load log is visible. Outputs land in +# build/iigs/bin/ (staxi-shr.hex, staxi-joeylog.txt). +set -euo pipefail + +repo=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd) +: "${LLVM816_ROOT:?diag-staxi-screen.sh: source toolchains/env.sh first}" +CADIUS="${CADIUS:-$LLVM816_ROOT/tools/cadius/cadius}" + +sys_disk=$repo/toolchains/emulators/support/gsos-system.po +data_disk=$repo/build/iigs/bin/joey.2mg +rompath="${MAME_ROMPATH:-$HOME/.mame/roms}" +dumpFrame="${STAXI_DUMP_FRAME:-9000}" + +work=$(mktemp -d -t joeylib-staxidiag.XXXXXX) +trap 'rm -rf "$work"' EXIT +cp "$sys_disk" "$work/boot.po" +cp "$data_disk" "$work/joey.2mg" + +cat > "$work/diag.lua" <= steps[idx][1] do + steps[idx][2]() + idx = idx + 1 + end + -- Hang localization: sample the PC over 60 frames before the dump, + -- and probe NEWVIDEO (0xE0C029: bit7 = SHR on -> jlpInit ran). + if frame == $dumpFrame - 120 then + io.write(string.format("SHRPROBE newvideo=%02X shadow=%02X\n", + mem:read_u8(0xE0C029), mem:read_u8(0xE0C035))) + io.flush() + end + if frame >= $dumpFrame - 100 and frame < $dumpFrame - 40 then + local pc = cpu.state["PC"].value + local k = string.format("%06X", pc) + pcs[k] = (pcs[k] or 0) + 1 + end + if frame == $dumpFrame - 40 then + for k, v in pairs(pcs) do + io.write(string.format("SHRPC %s count=%d\n", k, v)) + end + io.flush() + end + if frame == $dumpFrame - 20 then + -- Locate the jlLog RAM ring without UBER's mailbox: bulk-read every + -- RAM bank and emit it as hex; the host greps for the build-stamp + -- text. read_range failures are reported, not swallowed. + local banks = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,0xE0,0xE1} + for _, bank in ipairs(banks) do + local base = bank * 65536 + local ok, buf = pcall(function() return mem:read_range(base, base + 65535, 8) end) + if ok and buf ~= nil then + for off = 0, 65535, 256 do + local chunk = string.sub(buf, off + 1, off + 256) + local hex = {} + for i = 1, #chunk do + hex[#hex + 1] = string.format("%02X", string.byte(chunk, i)) + end + io.write(string.format("SHRMEM %02X%04X %s\n", bank, off, table.concat(hex))) + end + else + io.write(string.format("SHRMEM-FAIL bank=%02X err=%s\n", bank, tostring(buf))) + end + end + io.flush() + end + if frame == $dumpFrame then + -- SHR pixel dump: 200 rows x 160 bytes as hex lines. + for row = 0, 199 do + local parts = {} + for b = 0, 159 do + parts[#parts + 1] = string.format("%02X", mem:read_u8(0xE12000 + row * 160 + b)) + end + io.write("SHRROW " .. table.concat(parts) .. "\n") + end + -- SCBs + palettes. + local scb = {} + for i = 0, 15 do scb[#scb + 1] = string.format("%02X", mem:read_u8(0xE19D00 + i)) end + io.write("SHRSCB " .. table.concat(scb, " ") .. "\n") + local pal = {} + for i = 0, 31 do pal[#pal + 1] = string.format("%02X", mem:read_u8(0xE19E00 + i)) end + io.write("SHRPAL " .. table.concat(pal, " ") .. "\n") + io.flush() + manager.machine:exit() + end +end) +LUA + +echo "diag-staxi: dumping SHR at frame $dumpFrame..." >&2 +cd "$work" +out=$(QT_QPA_PLATFORM=offscreen SDL_VIDEODRIVER=dummy SDL_AUDIODRIVER=dummy \ + timeout 900 mame apple2gs \ + -rompath "$rompath" \ + -flop3 "$work/boot.po" -flop4 "$work/joey.2mg" \ + -video none -sound none -nothrottle \ + -autoboot_script "$work/diag.lua" &1) || true + +echo "$out" | grep -E '^SHR(PROBE|PC)|^SHRMEM-FAIL' | sed 's/^/diag-staxi: /' >&2 +echo "$out" | grep -E '^SHRMEM ' > "$repo/build/iigs/bin/staxi-mem.hex" || true +echo "$out" | grep -E '^SHR(ROW|SCB|PAL)' > "$repo/build/iigs/bin/staxi-shr.hex" +wc -l "$repo/build/iigs/bin/staxi-shr.hex" >&2 + +# The game flushed its log to the volume root; pull it off the WORK copy. +rm -f "$repo/build/iigs/bin/staxi-joeylog.txt" "$work/JOEYLOG.TXT"* 2>/dev/null || true +"$CADIUS" EXTRACTFILE "$work/joey.2mg" "/JOEYLIB/JOEYLOG.TXT" "$work/" >/dev/null 2>&1 || true +found=$(ls "$work"/JOEYLOG.TXT* 2>/dev/null | head -1) +if [ -n "$found" ]; then + tr -d '\r' < "$found" > "$repo/build/iigs/bin/staxi-joeylog.txt" + echo "diag-staxi: extracted JOEYLOG.TXT:" >&2 +else + echo "diag-staxi: no JOEYLOG.TXT on work disk (flush never ran?)" >&2 +fi diff --git a/stRender.c b/stRender.c index c0fd1aa..bdab0cf 100644 --- a/stRender.c +++ b/stRender.c @@ -1139,42 +1139,34 @@ static void destroySprites(void) { } +// The 1000-glyph font streams straight onto the font surface via +// jlTileBankLoadToSurface -- no 32KB staging buffer. The old +// malloc(32000) was lethal on IIgs (the clang libc heap is ~665 +// bytes and malloc returns 1, not NULL, at exhaustion -- LLVM816-ASKS +// item 4 -- so jlTileBankLoad fread the payload through pointer 1 and +// shredded bank 0 before the first present), and a 32KB static blows +// the bank-0 BSS ceiling. The streaming loader exists for exactly +// this case; its block grid matches ST_FONT_COLS row-major layout. static bool loadFontSheet(jlSurfaceT *stage) { - jlTileT *fontTiles; - uint16_t count; - uint16_t i; - uint16_t palette[16]; + uint16_t count; + uint16_t palette[16]; (void)stage; - // Load font.tbk into a temp tile array, then paste each glyph - // into a regular surface that jlDrawText can sample. ~32 KB of - // temp memory for the 1000-tile font; freed before returning. - fontTiles = (jlTileT *)malloc(sizeof(jlTileT) * ST_FONT_TILES_MAX); - if (fontTiles == NULL) { - return false; - } - count = jlTileBankLoad(ST_FONT_PATH, fontTiles, ST_FONT_TILES_MAX, - NULL, palette); - if (count == 0u) { - free(fontTiles); - return false; - } gRender.fontSurface = jlSurfaceCreate(); if (gRender.fontSurface == NULL) { - free(fontTiles); + return false; + } + count = jlTileBankLoadToSurface(ST_FONT_PATH, gRender.fontSurface, palette); + if (count == 0u) { + jlSurfaceDestroy(gRender.fontSurface); + gRender.fontSurface = NULL; return false; } // Font palette is authoritative for the font surface so jlDrawText // reads back the authored colors. Stage palette is untouched. jlPaletteSet(gRender.fontSurface, 0u, palette); jlScbSetRange(gRender.fontSurface, 0, SURFACE_HEIGHT - 1, 0); - for (i = 0u; i < count; i++) { - uint8_t bx = (uint8_t)(i % ST_FONT_COLS); - uint8_t by = (uint8_t)(i / ST_FONT_COLS); - jlTilePaste(gRender.fontSurface, bx, by, &fontTiles[i]); - } gRender.fontReady = true; - free(fontTiles); return true; }