From bbb75838cd6cfa0012618416dd0848f2a16c86b7 Mon Sep 17 00:00:00 2001 From: Dennis Ranke Date: Sun, 2 Apr 2023 23:21:31 +0200 Subject: [PATCH 1/3] first unoptimized version of blitSprite & grabSprite --- examples/curlywas/sprites.cwa | 21 ++++++++++++ examples/include/microw8-api.cwa | 2 ++ examples/include/microw8-api.wat | 2 ++ platform/bin/loader.wasm | Bin 1269 -> 1282 bytes platform/bin/platform.uw8 | Bin 3892 -> 4028 bytes platform/src/platform.cwa | 54 +++++++++++++++++++++++++++++++ uw8-tool/src/base_module.rs | 15 +++++++++ 7 files changed, 94 insertions(+) create mode 100644 examples/curlywas/sprites.cwa diff --git a/examples/curlywas/sprites.cwa b/examples/curlywas/sprites.cwa new file mode 100644 index 0000000..4515026 --- /dev/null +++ b/examples/curlywas/sprites.cwa @@ -0,0 +1,21 @@ +include "../include/microw8-api.cwa" + +const SPRITE = 0x20000; + +export fn upd() { + cls(0); + let t = time(); + let i: i32; + loop spriteLoop { + let inline x = sin(t * -1.3 + i as f32 / 8_f) * 180_f + 160_f; + let inline y = sin(t * 1.7 + i as f32 / 9_f) * 140_f + 120_f; + blitSprite(SPRITE, 16, x as i32, y as i32, 0x100); + branch_if (i +:= 1) < 200: spriteLoop; + } +} + +start fn start() { + printChar('OO'); + circle(8_f, 8_f, 6_f, 75); + grabSprite(SPRITE, 16, 0, 0, 0); +} diff --git a/examples/include/microw8-api.cwa b/examples/include/microw8-api.cwa index c537642..60c9478 100644 --- a/examples/include/microw8-api.cwa +++ b/examples/include/microw8-api.cwa @@ -35,6 +35,8 @@ import "env.circle_outline" fn circle_outline(f32, f32, f32, i32); import "env.exp" fn exp(f32) -> f32; import "env.playNote" fn playNote(i32, i32); import "env.sndGes" fn sndGes(i32) -> f32; +import "env.blitSprite" fn blitSprite(i32, i32, i32, i32, i32); +import "env.grabSprite" fn grabSprite(i32, i32, i32, i32, i32); const TIME_MS = 0x40; const GAMEPAD = 0x44; diff --git a/examples/include/microw8-api.wat b/examples/include/microw8-api.wat index 04bd403..e006e59 100644 --- a/examples/include/microw8-api.wat +++ b/examples/include/microw8-api.wat @@ -35,6 +35,8 @@ (import "env" "exp" (func $exp (param f32) (result f32))) (import "env" "playNote" (func $playNote (param i32) (param i32))) (import "env" "sndGes" (func $sndGes (param i32) (result f32))) +(import "env" "blitSprite" (func $blitSprite (param i32) (param i32) (param i32) (param i32) (param i32))) +(import "env" "grabSprite" (func $grabSprite (param i32) (param i32) (param i32) (param i32) (param i32))) ;; to use defines, include this file with a preprocessor ;; like gpp (https://logological.org/gpp). diff --git a/platform/bin/loader.wasm b/platform/bin/loader.wasm index 83425e2095c469579b1e332e8906775cf66e5800..0055ae6e59db4d745a7fd862e19853f030cd623d 100644 GIT binary patch delta 512 zcmV+b0{{K>34#i+4FiAk0|5X*01NB`75~@wM{$MsE2p94?FNZt7`A*A-Vpm%ALKH1 z0x>oekB~`cUHrFeCcoBaIt4`(%E~T7!+_HnnSij^r2;KXXWX6dlOBV?c?CAtuq8!w z2N5Ge5l!>kfq-T|-J#7wn~tl@J@m)!6|0{BeCfH4^VG57Yw&-AFqm(CQzCeawdE*R z+~#A6Fw$TX;l0=5m?c`?=|dEgfqrn09VM==^x`LL7sj`{M~O&7t=T!Ct%)%N>I+ft z)|IX+XcvLHi>+Mt%qp%Dvap!4zt|2M+2SWMY!|{6Fx?v5XO^;^)EH85f6|PQ&*g@c z_1NWy7cnO3eG2k5d{7r^#Idrq5Z-m4tdvCk(=+St$8++^lt6^%JT3Ukrl+mxbceOZ#>0WeR8atoO3+Bu(M&on$ zH5$F`dlg}trV@agd0DK0mRm;QUv5UVp3sU^cSWi6at2!B7qI;mUo{v3-H&3^{I~jl C009yJ delta 499 zcmVzH<&UgS-0dkIF0MM)4 zSb0XAUT-`6EC3gR40+3EzqN}RhmER*S6&yN@3hgfyodIB>AZh2VqIbQ&74UVVAjVnx_QqP2R8#07MfZWR=gD>I$R8yd<`5h2q zE$s{i$>Ayz#GtY+%lmQm`3hf{3zBZLoJ5tFA`Vgr92$iVS5rj}X9Ssfdd(RQVI|#Y zhnUS&1H>M9{AzzTwjy)5pLG4i1Xa09tWnxBcXCgcUr^n_!(%o=B*nAJG*h0bW`8HW zfzMtag^b^=f8Pr7P}*QktoG6(F@EV?QBbS0&h(YYRobFpse5)eSG*!HOTMDELw4BF&{} z0q?H&ERO-%%+Xt?j^uZDbZ0K!e9Y$aOWTk+&ho~l*Mc!S*`vR71aEXRy(Azq2(bCy p=~l7Y6i!G{NmSr~@S6xvvp~{~1CX^Ow7I2=f>A5*>z(1UsQOh|`eFb8 diff --git a/platform/bin/platform.uw8 b/platform/bin/platform.uw8 index 2425d513c13e60795216e9ef3226b268e9486756..d19e1a901aa1fb7ece9eccebcdd816db94fda4ad 100644 GIT binary patch literal 4028 zcmV;t4@2+*Dc`Wd&Gq;iwcw`JdmO^_4jh_?W0@6OOsjT2Bgt^7I#6xE3+;4UIM+di zwh;)bdci;0ry^~2`>ydWR(vO6c0?sEB=VSR-{fUDGr>ANpV$84E23$dWav0UCkdRq z&H4HNFW);RU7V3}Wyh@qgs;($!Zo6yy#lR2k!AyNqoze;k+&}%#0~uFS7yPM_*E}M zIJnQVluGOzK?!L&9 zRt(+DxiUkfnxH4xGZ(OeVig;v7ua@cPThZuVD21yhzY{$X3K(92s;xF+Q>c>Hr*}a z79L->KM9~cnjuNVeVYsqa1PTE_{PF-lx8;Y zZEtE?;yZseJI4p~U0adUPJ&e0l

W_GCQ!7rEs}A@nm3m9n|OMK4CxMr7+@T;qN^ z->><>_1Eyf-Wnuc&%L_SyUWRrfHV%nnHo7_1gj-zL2$>@W$IbcZDd?enF%aXeQm>h zj22NJV01Cl4q33wsz_8zG}JmT_Q7JTO6^)vbppJjh2CF6gF_s@!UtytCw7%~a&Bqx zxUugE4i=olwreF41UNU1O%Q?31tKJR2;qAIq&bFJ(Vrx#yVYwTtM5Ajk_RQv*{fY- zCYz_NuRj_2zbn?@fNWIaKalV$%Bn4ctu(3A<6CXMuPf*z1v9E#2+*2GQ>P!8T0d+Q z*4CZ|WoJ%WTdL!kVx2Y z$dB%3EyA1no&06?(h;jC^U2{MfKPQSDUr0LNBP0SiRibl`4o;u8kfe1YqV?;x}{MM z1@!t6%FD#dMS$j4OA!kp#vomzZ7NhsHgwLMT{S@OcfXfk;NEu;-Ho`ce>V7qB5b8+i4 z?X+SEa-d;*M0SXAvi7Qgd#9_L10|xvAaa@2rgu3&j=H^V;ga6MEM6+h8j z4z~owK##@<3?#)45ld0n1*EA0?4QH9MeUzMV=-h^#1z&5h3pu6iYij)cQM>fM5c{%$66pU`&)!+X@aTVZQ=`qdU6eOt#)fjgyJjB zZ)eClm{{9EN4C&b;B2tNs`DilW4C>lH5LpkYj<=`zy+0@K z-9mOnf|ZWC!LZKFG_6FzPloq8N$iU~J6SE@-P+@o92bbI+0G z1z!akOc(vyoXai%azQT1WBtzfF8(loSByFj_)yT@vfnz$*Wi!>2TUn* zi@hrs-paVh6!-GA91xry_@=iFXOe~Lwe6SW3X@Rcwx1}3=#e>P&>*wyH;TnY2c-XG zhPEt6ohlna)wPLeukOfdtOS_uu7ME?Jsll)W}U zjW|Yc3QA>X*(!=0!F5ofdr0_wu0CU}A(na8pk5%|Ivbp0Qv0dN>7x0W#&V&wZ%*y@ zdSggbf_#xld$mz+Lp3$&Y2NFC=j0}fmi*tk1fverHi1qQiz;{b^f=0QCT~BShVvrw zS)Cyfu?Fl6{jt$GN4-XB0O6oF5GnK-ED`a1vrdrsq$1QY zKt}_9PHt^9Rw2*x!g*8$mR{0GNZJ6ym(Y0=N13DRdRXTyFy`_Wmj9Vf zdyNz_>$N%d1}}bI4$(S{ad*M-XH*o?M%by>gSR|JhS4*(vM3P&lh%HaNUcP-qn<(a zRNw3Kwv%A)%I?lnVt*32RX_9+xuLAm!u?bp9pql>Ysy6zdl41<1oBSrzwRK}7fK~X5AMP3x{3aN)2_TqXr#TaMZO$?w1*OI!ZUE`whVj;)RYlu=N1^Vrqq#< z`+=a8IHX!*`@*#l<>~M00Ws0%L@WY{40~PV592-R+~;Y~_UzBmb3-AM_`I~}<46qw zBgA4~YtF0MCGs|Lhq~HQ{NN0tmZf|;SByuO9FCeAaOo$fgvV=<#TRwyKcz~<$qxy( z##TLuG>-f=!|t!(0&%V=nnxFwVZ8$GC@_ELShVqA7p8RH2Y_RRnF_?*o-8w?7O5w^O%iPa`4GJ6=67)Nr|X5`Wc#Wzm6$f| z^;E$r-~CORMQVxQF(Bq9zA@Zi@D3i_NQL*$7*Zmft%lKUZLE1n* z2oTw(ue{_(8kEK+C0ag%j9^EuJFgrdQv)R|FI6zy5n!Bxr5klvhL?s68}5+fu{Rg_ z&LdYDS?uFtIZ0q`Li2DP>=7lP1y~`+7_Fff%vOEumfauG_duj;qp7mXC9Psv_)m&k zZ5jfg%v{`jKqa!Qlt0&(yL?fB!)u*7aO$pBOe}{*3DoZK;mSs58+$G~90BMMS|(^< zuQ7%aGpBZ|16fBphJSnZ$zY9b;P5ZXQ!vVr zf^4(3n$<=G1QYb(GMD-%r>&jhuaX2*@`DW4#shtUw#-cCoRA^)==VZVCyvQl^ zQFXi`iS*)DVUF+*l=lbei2EX1NZsGiX{q+-RJhBwt2S50%0)g`>MBnPlh4r2rdN;?Nf z2EZ=#gyAWUjQfN&)G+z_ z5!)A^T&INd9pH<%;MEBY8@th8;e_6xF#Gb3OvJ<*?l>0}57z&wO>ms`ofu4C2mQoB zF{EW2Z7$LtQ<<0m7?EbwAdj@l*81j)Q>$R8$0IqSfaKY#Pg)0@+4`K##`{onFsUg@ z7C84`zAf(%xlW}9`gMFO5{F>H>{HKHyN((`NQ%!OOLLQ@d=gi%x z(W1=mzXMC~-rfLPI_aYaS9~fSH4-z{ZIF6!A5k^~be}P3GkIcz<1E7C$>z_Xz@f`Q z-yT%;-0-Jt*6?)_cHHJ7+?w^3hj=M;{nelike@Y-e#a&HuKqkot$`!v@e0c!=q9?+ ze@1(J=b1A|0ma%G5H7VbA)R+K0YSUf7>^kSM5}uEOcBi;(OunhYR2=@jkOmxAfmr- zXxeZ~FH47>$%!?s)DVw?X1Dpeh|CAc6-Yj^0N^5!2E@hQmmN{YE;&M>BakTf4ela% znlFnL?Fh{Rk3*lx91R;7A@^zcP!__fqmNO0NlXhfoYnWEAOefVnA*9%cxE zF#k#X*uCtP@a4g#W>Yf`sS6UYf|CrIN^-q^erFWok}+Ac_Jsq5(_iVw=LhzW9nmP7 z2YsnoBs2t%0o$A38^N$uI?!Cl5{Cl5q;Pu_-jGyM9}K+o8zSS_w-swua#zd6(nf+U z0vlP@NP^V)GBmc+Zq^hJR3Cd{W%<#MTjnTnEyt#a z74TSeq2UAc11wgv13p5jt5SY1;TAY^oG*LRgg>k0^-LZkyrrq+_C3BteX*(b_iF>V zZ)7ZfE`*?P>9v^Mi#WK$$z8#>xlqW{VS|2Y_3XZ2EK_-pdeYMg7U&{U5>Gi=v}}ixtZ(T~{!K@sQ{n1+Vbs~PDWW3Q1)QIW%y*0qRng8pap>lYHZIV!L(o;hn;nC z%CV>=5u0)b7eS%Byefe(=40BZm**CEgh+JU6!+{dTrm#vNYH22P+wQW{1-*etWvhj z19WEeuCb}6?`$yQX{@{BsydCXGmV;j#(kHqztp}!ZCcJw;WM0tgHFhRuvw322U8;3 z79D;f2s4%o57Xf?SMjFMhjRmkMHr+^Np$7G&5(GNYHK`~Ry!#N$SPlltEjlJEq(iD+Yj z92k?&WK0_kp}&mMy707gB&gS9VsG$sAb!HCr~zHxPaCY^?NfzVCry!m7zx_t_*_vP=8)D9U?)&G#e{Rts3YY>3{Zos#dZbJ7H zG&h@0H@S)SeF6@ZH|c$C63?$7Z9XAcAb%qPDltDc$xu;Ajx<0zA!y#pS)5b0_*FT) zH3ypn&<)-s2>W?t4H=g0@#U0R6HaDS6dA48l-A)Affq&HJVdTSH_wx{w5#9o&sn4a4l zw&S<#Q^Y1$R(?`dAxz`jgd9eXuG?hpYP(=r&^n@UTaRe-xI|elzFLg__{H+auD9*k zkkQKRo`#7f&*GDZ*BDLYGz5|mJyjiE=-Kh7h`Qw`jwa+-%jt0En-83Ra$0L&ufh*C zT3-{u)W?@=pV5qyVo~Wig2_D7h|D-vaZ%86a5se}CwCrNUrAofAQiPLkCveENyw~p z(L?9EK~Pqp!4{+pjry>gRJDGx&+dmiZhZ2oO|X3hKId9Cxz^4!)rQzPsemIrV+Fv_ zp>nKZ8W+sVkk`uj1ory8g6y^Inq!f+s*oQ-{qKa!F=bPqor#v9S|nbXjNiBVE9EC| zEcRnU2Z5w!zOIwuO;O=(Lz=Y<&BRUCgSOdrcfml z;?{wUcy?2a9mzZEC|}8ka~$u@xm@nsTKM+>O#e(XfabLQWW>09Z_{M-Fh!3s2b&nc|3X37MwL%`}3 zN*#-+NVJC;Ym-Kvs1sM>wd)HBTrm{;#9qf8hUxC@?S!tUWB)si z-4<{ciQo`a>z$6pH-*d&mNt|u5_yM~%i?K^#lQ*WA0YeBrmf@7<6}L61&LRgf5>a= zoE3?$zh291H7CM-z`ZOif(#idhjD~=)o;c+XPTGEQ*VKT;hoIA9d#hqBo|y*`|8%M zi&T3kzDKI{uhtLL6`k|#yiDDX%-DgOoS!NWJt6+E{$h2lSMaT&n;^jpx54J-SaT!30&4>7kX7Q{eVi zRwXFhPnUy5La6re>`<5_ChU3hR=xzV>1HtO6P{p&c}C@fE?vp58*CLaQlO>Vx;qj9 z+GkL@oFelG(BktkH|jD2rX&+gF>1`L+mRtjoy+!_>STr)(7dvgR$e^3~8AKql{mfSB`JjywIR` zz8^;WkfD@>Z{j*`bQ=mYp%!r`%RSP!iMt$t(ajky=S#xx?~(8o!@1Bo1<^+!aVcB6%Vqc;2dI7dT+M+8TS(w5+U?rR;dnCjz1Pc zF7MBov@;R55G$IowLOKITpbA)RW@y*J#L1Nuuw1Jf${~PvHL-{g3C=f^jg#M%KwY_Nf27Qo5Z&M(9zrA zajvA12jqkVs$dojqqvLUEB?SvuS?0SKs*Y`*wAQW7;iY|Y59;Cak_A@t>gNF78FsYfGt;b30wjmmdV~!kDuIiVA7Wi6 z-@OJyh-fkjB3PPiT9;x-F>6kw((d0Xi&?8B4+E>`4^em zvrXIu9xFn7pKzsZP-uYO#%YJ|VDPr!>WBdai`*Wf&)NzMG{0Z`}pM`2};gHrJUiSI6Q zb>dE!+gq@@zv&cg6$s|@I%^1`jbfcx>5&-iJ8-Y z^kVkwq|LA2`MR?^@&ydXp@RkAUc+cv7!uk@1PB~up}cITxf5KpB8u2uo1EZ#s2NfT z{5d2;-*jMhwgFS%O*GW-cb;A(jipTe+h6$9v?yUP=RcxKg-ujT%Ykh{0-c{P z{js7e2i-H$nH+|e^{jiBCVctNP-N%B1m(jN($dwS$4A*Ia=9$+=^@d3Jg-P z#_Gy1gyp4uwuQkbw91xR_x$Iu+rgE;DR| C>cf8k diff --git a/platform/src/platform.cwa b/platform/src/platform.cwa index c6e37fd..db1e2f9 100644 --- a/platform/src/platform.cwa +++ b/platform/src/platform.cwa @@ -352,6 +352,60 @@ export fn line(x1: f32, y1: f32, x2: f32, y2: f32, col: i32) { setPixel(i32.trunc_sat_f32_s(x1 + f * dx), i32.trunc_sat_f32_s(y1 + f * dy), col); } +export fn blitSprite(sprite: i32, size: i32, x: i32, y: i32, control: i32) { + let width = size & 65535; + let height = select(size >> 16, size >> 16, width); + let trans = (control & 511) - 256; + let flip_x = 1 - ((control >> 8) & 2); + let flip_y = 1 - ((control >> 9) & 2); + if flip_x < 0 { + sprite += width - 1; + } + if flip_y < 0 { + sprite += (height - 1) * width; + } + + let ly = 0; + loop yloop { + let lx = 0; + loop xloop { + let col = (sprite + lx * flip_x + ly * flip_y * height)?0; + if col != trans { + setPixel(x + lx, y + ly, col); + } + branch_if (lx +:= 1) < width: xloop; + } + branch_if (ly +:= 1) < height: yloop; + } +} + +export fn grabSprite(sprite: i32, size: i32, x: i32, y: i32, control: i32) { + let width = size & 65535; + let height = select(size >> 16, size >> 16, width); + let trans = (control & 511) - 256; + let flip_x = 1 - ((control >> 8) & 2); + let flip_y = 1 - ((control >> 9) & 2); + if flip_x < 0 { + sprite += width - 1; + } + if flip_y < 0 { + sprite += (height - 1) * width; + } + + let ly = 0; + loop yloop { + let lx = 0; + loop xloop { + let col = getPixel(x + lx, y + ly); + if col != trans { + (sprite + lx * flip_x + ly * flip_y * height)?0 = col; + } + branch_if (lx +:= 1) < width: xloop; + } + branch_if (ly +:= 1) < height: yloop; + } +} + ////////// // TEXT // ////////// diff --git a/uw8-tool/src/base_module.rs b/uw8-tool/src/base_module.rs index 9b86735..afcf077 100644 --- a/uw8-tool/src/base_module.rs +++ b/uw8-tool/src/base_module.rs @@ -169,6 +169,21 @@ impl BaseModule { add_function(&mut functions, &type_map, "playNote", &[I32, I32], None); add_function(&mut functions, &type_map, "sndGes", &[I32], Some(F32)); + add_function( + &mut functions, + &type_map, + "blitSprite", + &[I32, I32, I32, I32, I32], + None, + ); + add_function( + &mut functions, + &type_map, + "grabSprite", + &[I32, I32, I32, I32, I32], + None, + ); + for i in functions.len()..64 { add_function( &mut functions, From 4a1d607bcbd8f38714b0e003cb944a44ea326414 Mon Sep 17 00:00:00 2001 From: Dennis Ranke Date: Mon, 3 Apr 2023 00:09:02 +0200 Subject: [PATCH 2/3] optimize blitSprite --- platform/bin/platform.uw8 | Bin 4028 -> 4146 bytes platform/src/platform.cwa | 34 +++++++++++++++++++++++++--------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/platform/bin/platform.uw8 b/platform/bin/platform.uw8 index d19e1a901aa1fb7ece9eccebcdd816db94fda4ad..33b8e166afb379b646676d46934033d18a3cdf19 100644 GIT binary patch literal 4146 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 literal 4028 zcmV;t4@2+*Dc`Wd&Gq;iwcw`JdmO^_4jh_?W0@6OOsjT2Bgt^7I#6xE3+;4UIM+di zwh;)bdci;0ry^~2`>ydWR(vO6c0?sEB=VSR-{fUDGr>ANpV$84E23$dWav0UCkdRq z&H4HNFW);RU7V3}Wyh@qgs;($!Zo6yy#lR2k!AyNqoze;k+&}%#0~uFS7yPM_*E}M zIJnQVluGOzK?!L&9 zRt(+DxiUkfnxH4xGZ(OeVig;v7ua@cPThZuVD21yhzY{$X3K(92s;xF+Q>c>Hr*}a z79L->KM9~cnjuNVeVYsqa1PTE_{PF-lx8;Y zZEtE?;yZseJI4p~U0adUPJ&e0l

W_GCQ!7rEs}A@nm3m9n|OMK4CxMr7+@T;qN^ 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 16, size >> 16, width); + let lazy width = size & 65535; + let lazy height = select(size >> 16, size >> 16, width); + + let lazy x0 = select(x < 0, -x, 0); + let lazy x1 = select(x + width > 320, 320 - x, width); + let lazy y0 = select(y < 0, -y, 0); + let lazy y1 = select(y + height > 240, 240 - y, height); + + let lazy numRows = y1 - y0; + let lazy numCols = x1 - x0; + if numRows <= 0 | numCols <= 0 { + return; + } + let trans = (control & 511) - 256; - let flip_x = 1 - ((control >> 8) & 2); - let flip_y = 1 - ((control >> 9) & 2); + let lazy flip_x = 1 - ((control >> 8) & 2); + let lazy flip_y = 1 - ((control >> 9) & 2); if flip_x < 0 { sprite += width - 1; } @@ -365,17 +377,21 @@ export fn blitSprite(sprite: i32, size: i32, x: i32, y: i32, control: i32) { sprite += (height - 1) * width; } - let ly = 0; + let srcRow = sprite + x0 * flip_x + y0 * flip_y * width; + let dstRow = x + x0 + (y + y0) * 320; + loop yloop { let lx = 0; loop xloop { - let col = (sprite + lx * flip_x + ly * flip_y * height)?0; + let lazy col = (srcRow + lx * flip_x)?0; if col != trans { - setPixel(x + lx, y + ly, col); + (dstRow + lx)?120 = col; } - branch_if (lx +:= 1) < width: xloop; + branch_if (lx +:= 1) < numCols: xloop; } - branch_if (ly +:= 1) < height: yloop; + srcRow += width * flip_y; + dstRow += 320; + branch_if numRows -:= 1: yloop; } } From c8a9f533efc35ccef24f5b9fc298d712053cd345 Mon Sep 17 00:00:00 2001 From: Dennis Ranke Date: Mon, 3 Apr 2023 23:44:12 +0200 Subject: [PATCH 3/3] copy optimized blitSprite impl to grabSprite, add simple docs --- examples/include/microw8-api.cwa | 4 +-- examples/include/microw8-api.wat | 4 +-- platform/bin/loader.wasm | Bin 1282 -> 1282 bytes platform/bin/platform.uw8 | Bin 4146 -> 4097 bytes platform/src/platform.cwa | 50 ++++++++++++++++++++----------- site/content/docs.md | 19 ++++++++++-- uw8-tool/src/base_module.rs | 4 +-- 7 files changed, 56 insertions(+), 25 deletions(-) diff --git a/examples/include/microw8-api.cwa b/examples/include/microw8-api.cwa index 60c9478..f7c7456 100644 --- a/examples/include/microw8-api.cwa +++ b/examples/include/microw8-api.cwa @@ -30,8 +30,8 @@ import "env.printInt" fn printInt(i32); import "env.setTextColor" fn setTextColor(i32); import "env.setBackgroundColor" fn setBackgroundColor(i32); import "env.setCursorPosition" fn setCursorPosition(i32, i32); -import "env.rectangle_outline" fn rectangle_outline(f32, f32, f32, f32, i32); -import "env.circle_outline" fn circle_outline(f32, f32, f32, i32); +import "env.rectangleOutline" fn rectangleOutline(f32, f32, f32, f32, i32); +import "env.circleOutline" fn circleOutline(f32, f32, f32, i32); import "env.exp" fn exp(f32) -> f32; import "env.playNote" fn playNote(i32, i32); import "env.sndGes" fn sndGes(i32) -> f32; diff --git a/examples/include/microw8-api.wat b/examples/include/microw8-api.wat index e006e59..55c43ce 100644 --- a/examples/include/microw8-api.wat +++ b/examples/include/microw8-api.wat @@ -30,8 +30,8 @@ (import "env" "setTextColor" (func $setTextColor (param i32))) (import "env" "setBackgroundColor" (func $setBackgroundColor (param i32))) (import "env" "setCursorPosition" (func $setCursorPosition (param i32) (param i32))) -(import "env" "rectangle_outline" (func $rectangle_outline (param f32) (param f32) (param f32) (param f32) (param i32))) -(import "env" "circle_outline" (func $circle_outline (param f32) (param f32) (param f32) (param i32))) +(import "env" "rectangleOutline" (func $rectangleOutline (param f32) (param f32) (param f32) (param f32) (param i32))) +(import "env" "circleOutline" (func $circleOutline (param f32) (param f32) (param f32) (param i32))) (import "env" "exp" (func $exp (param f32) (result f32))) (import "env" "playNote" (func $playNote (param i32) (param i32))) (import "env" "sndGes" (func $sndGes (param i32) (result f32))) diff --git a/platform/bin/loader.wasm b/platform/bin/loader.wasm index 0055ae6e59db4d745a7fd862e19853f030cd623d..ac3ef2a9f65fc995f60da4cab334e51306687cc9 100644 GIT binary patch delta 503 zcmV{LPtWOyQ3N)W}tNzchanV#;tvmEF91jTCn!I4S|$drk& z#7Id=YQb*OUZysl3xnv5Ude(Q^;G-=vClU~%dQI|^xwaAy9s}Ai$wgGlzy^N{MpG0 zlrB>%tS3Jz0ryWNN#fY}NN$`sZCG$S5o|DZ3*v!;Ax#c~$}g9CSrV(DrwIw!tO}Q| z@hnO1{$Sg89t{i^Cl`6p$e>US1U#QTtf$dhawH$(fx^;JS>Os*A?m1`kNS*Ins-pj zC_Jx59tVM+lK6iRz{<9by_};nxND{TPu#M!=^FDaHXG0Oh>>h!)B4hl^^H7}d!_>7 zpl0LVjue_k?){0n(_+D9r|8W3y7;QZ?QUJ~jjaQ>wMj(*s>c4%B}iD2+iVFsfX(OS zZ3mra^5pPpff{Uo*Ae^rYinS*yjS-rS>GD--3?3y$@6bQk64!?xe+OrWW}^*y5b6g z4ID6R?CgKXCV#0Hjlgmu)P1W?du65K&|8IGZTXsrWO|FmVdR%9_Z7o4rp8oqG9?q9 t#*o|JaA8;c)Un}f@PjazZ+=rEc#D6v8F*jmp z#jNJnTYW~EUb=q~IS2Hh7B>BXZnY(n|4|(0tp3KmKj1^cLmt} zG*!@A7o*;-K}5P52O_SJqTitfI+_0==Np5EmRi_yJOv0$IghWd9;#EH;~0b)2dvBf z$8qm5;2ik;O@?kcbhD#xgv2R(Z@cm6(YG6W>;bD`YSC|P!Y-r{>JA1VVXlTQdAJ;; zY;~Vi#+AOZGJD<%9=FBff<8${l8olj%6=9mD t5`dd|S*(DTTSnnuZbr49(27)dMXB_123q15u>BQZH5dWik7CpOxB5uf{$Bt9 diff --git a/platform/bin/platform.uw8 b/platform/bin/platform.uw8 index 33b8e166afb379b646676d46934033d18a3cdf19..16b588b0380e69117f013b69dcc52c8b3dac69d8 100644 GIT binary patch literal 4097 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 diff --git a/platform/src/platform.cwa b/platform/src/platform.cwa index e211f89..24cd220 100644 --- a/platform/src/platform.cwa +++ b/platform/src/platform.cwa @@ -171,7 +171,7 @@ export fn rectangle(x: f32, y: f32, w: f32, h: f32, col: i32) { } } -export fn rectangle_outline(x: f32, y: f32, w: f32, h: f32, col: i32) { +export fn rectangleOutline(x: f32, y: f32, w: f32, h: f32, col: i32) { let xl = nearest(x) as i32; let xr = nearest(x + w) as i32; let yt = nearest(y) as i32; @@ -212,7 +212,7 @@ export fn circle(cx: f32, cy: f32, radius: f32, col: i32) { } } -export fn circle_outline(cx: f32, cy: f32, radius: f32, col: i32) { +export fn circleOutline(cx: f32, cy: f32, radius: f32, col: i32) { let prev_w: f32; let y = clamp(nearest(cy - radius) as i32, -1, 241); let maxY = clamp(nearest(cy + radius) as i32, -1, 241); @@ -377,30 +377,42 @@ export fn blitSprite(sprite: i32, size: i32, x: i32, y: i32, control: i32) { sprite += (height - 1) * width; } - let srcRow = sprite + x0 * flip_x + y0 * flip_y * width; - let dstRow = x + x0 + (y + y0) * 320; + let spriteRow = sprite + x0 * flip_x + y0 * flip_y * width; + let screenRow = x + x0 + (y + y0) * 320; loop yloop { let lx = 0; loop xloop { - let lazy col = (srcRow + lx * flip_x)?0; + let lazy col = (spriteRow + lx * flip_x)?0; if col != trans { - (dstRow + lx)?120 = col; + (screenRow + lx)?120 = col; } branch_if (lx +:= 1) < numCols: xloop; } - srcRow += width * flip_y; - dstRow += 320; + spriteRow += width * flip_y; + screenRow += 320; branch_if numRows -:= 1: yloop; } } export fn grabSprite(sprite: i32, size: i32, x: i32, y: i32, control: i32) { - let width = size & 65535; - let height = select(size >> 16, size >> 16, width); + let lazy width = size & 65535; + let lazy height = select(size >> 16, size >> 16, width); + + let lazy x0 = select(x < 0, -x, 0); + let lazy x1 = select(x + width > 320, 320 - x, width); + let lazy y0 = select(y < 0, -y, 0); + let lazy y1 = select(y + height > 240, 240 - y, height); + + let lazy numRows = y1 - y0; + let lazy numCols = x1 - x0; + if numRows <= 0 | numCols <= 0 { + return; + } + let trans = (control & 511) - 256; - let flip_x = 1 - ((control >> 8) & 2); - let flip_y = 1 - ((control >> 9) & 2); + let lazy flip_x = 1 - ((control >> 8) & 2); + let lazy flip_y = 1 - ((control >> 9) & 2); if flip_x < 0 { sprite += width - 1; } @@ -408,17 +420,21 @@ export fn grabSprite(sprite: i32, size: i32, x: i32, y: i32, control: i32) { sprite += (height - 1) * width; } - let ly = 0; + let spriteRow = sprite + x0 * flip_x + y0 * flip_y * width; + let screenRow = x + x0 + (y + y0) * 320; + loop yloop { let lx = 0; loop xloop { - let col = getPixel(x + lx, y + ly); + let lazy col = (screenRow + lx)?120; if col != trans { - (sprite + lx * flip_x + ly * flip_y * height)?0 = col; + (spriteRow + lx * flip_x)?0 = col; } - branch_if (lx +:= 1) < width: xloop; + branch_if (lx +:= 1) < numCols: xloop; } - branch_if (ly +:= 1) < height: yloop; + spriteRow += width * flip_y; + screenRow += 320; + branch_if numRows -:= 1: yloop; } } diff --git a/site/content/docs.md b/site/content/docs.md index 71a8f41..1b414f2 100644 --- a/site/content/docs.md +++ b/site/content/docs.md @@ -146,13 +146,13 @@ Fills the circle at `cx, cy` and with `radius` with the given color index. (Sets all pixels where the pixel center lies inside the circle.) -### fn rectangle_outline(x: f32, y: f32, w: f32, h: f32, color: i32) +### fn rectangleOutline(x: f32, y: f32, w: f32, h: f32, color: i32) Draws a one pixel outline on the inside of the given rectangle. (Draws the outermost pixels that are still inside the rectangle area.) -### fn circle_outline(cx: f32, cy: f32, radius: f32, color: i32) +### fn circleOutline(cx: f32, cy: f32, radius: f32, color: i32) Draws a one pixel outline on the inside of the given circle. @@ -162,6 +162,21 @@ Draws a one pixel outline on the inside of the given circle. Draws a line from `x1,y1` to `x2,y2` in the given color index. +### fn blitSprite(spriteData: i32, size: i32, x: i32, y: i32, control: i32) + +Copies the pixel data at `spriteData` onto the screen at `x`, `y`. The size of the sprite is passed as `width | (height << 16)`. +If the height is given as 0, the sprite is is treated as square (width x width). + +The control parameter controls masking and flipping of the sprite: +* bits 0-7: color mask index +* bit 8: switch on masked blit (pixel with color mask index are treated as transparent) +* bit 9: flip sprite x +* bit 10: flip sprite y + +### fn grabSprite(spriteData: i32, size: i32, x: i32, y: i32, control: i32) + +Copies the pixel data on the screen at `x`, `y` to `spriteData`. Parameters are exactly the same as `blitSprite`. + ## Input MicroW8 provides input from a gamepad with one D-Pad and 4 buttons, or a keyboard emulation thereof. diff --git a/uw8-tool/src/base_module.rs b/uw8-tool/src/base_module.rs index afcf077..7192d61 100644 --- a/uw8-tool/src/base_module.rs +++ b/uw8-tool/src/base_module.rs @@ -152,14 +152,14 @@ impl BaseModule { add_function( &mut functions, &type_map, - "rectangle_outline", + "rectangleOutline", &[F32, F32, F32, F32, I32], None, ); add_function( &mut functions, &type_map, - "circle_outline", + "circleOutline", &[F32, F32, F32, I32], None, );