From 29daa6e90eddb288a604c9b7f70d57101ae40b60 Mon Sep 17 00:00:00 2001 From: Randy Thiemann Date: Thu, 26 Oct 2023 10:44:00 +0200 Subject: [PATCH] Just for fun --- bin/DMGTRIS.GBC | Bin 65536 -> 65536 bytes bin/DMGTRIS.pocket | Bin 65536 -> 65536 bytes src/dmgfx.asm | 89 ++++++++++++++++++++++++++++++++++++++++ src/include/globals.asm | 4 +- src/main.asm | 19 +++++++-- src/memory.asm | 10 +++++ src/sprites.asm | 4 +- 7 files changed, 118 insertions(+), 8 deletions(-) create mode 100644 src/dmgfx.asm diff --git a/bin/DMGTRIS.GBC b/bin/DMGTRIS.GBC index 87c8dc97e33aa013a1f6d415c5360bc84bb46e2f..75302f97a144d657076e1de7a1ddb1ba0e519c07 100644 GIT binary patch delta 2621 zcmaKue{36P8OQJS&%}{x~PpRLpY%mqzC~FNf#n_6{`Cy(>{Zzir3I zoKvsy|I9qOQyp(*inyr$H8($Q=Hy>VX7pgo2d9(dMG=vCA(2Lu^CBGQgqbXQ40#JO zghgtRKJPEq|*XgKwfFi!lx)YWJdj|Ve7KhHrXk<@HNThd|C}FAbj3=OsA<$ zXWE3;q|5HlB8OC0d5_ASVCk<6IM*VSkSn+=f+tfaE8jO+;vAioo~y1!ap`N-K2?6N zC{wRiAF$fXi+ho5zMdHF65k=iWS=-o_TwLQV`Vo!9l-}tl4L}VWW|GI1;5oSn#oO3 zB75*;r)`#g;v)ZV8>bB!;jE8lZCtc`U4F?YulnS5pM1wBKjW7d{PLgta;Q;eetE2s zuCRl=1MU|+_*#gr4DvRZG+QkO$cm@zpwN~<4i0~nlbN*Y+g8gO#d4Cxk0U&b^vyx$ zj?a%;q&olO0mxU9EX}Y&pqyg3n$=maGsL^`6rx#@6YEJ9ZuzOdA=1($R)F~o<9Lf$ zt>VVJSR3&HH~o(0fu&`ZV*WnI;N6czoneikH(4Wopj95}r|&W@Pz{I+RM5Y})uwUj z>Bet2uXNHh?&uQuwCD8#{$ZEUoA$h{1^d#TpQ!;Z+a-@kElthpLwx}r>Y=8ls$v-O zIn^_B0Q^?dQRtM7rmM&khb}`24jRpCN6XM~sjJOzq4qfE;T8n$3gRqql1UQH zv+OmikT3cL{tB8f;kdNgB0zu87B5`wyKYB2gpI<=mjX57WpW%l*Is=M9;OZ7s#A~mFA#h4$8&J9_Cc5em}o1G^skVsRdcq0eW1wHRn*&J ze`6?nu8mdoI_bumnVEUBe6EeY19ZCmLv*?w{MrJ1L;ewU9mk;ZNKSDi)TPi?2x~Ru z59|5EImM~vEs7B`6XcKR`6IEMQlS}4$`L(;8XEFrx?wD*xbz8(kXiU0`A5~fYfyPK zr??Y%EU4CCEmh14vyAJrjOUa}y-XwYnbqwtdMD}9G4x)c{8_T7R3)a#lHy6otI|w+ z-L8@TWa+Nz)m>Qvj)ASMB#lUVqrJwd+Vwq1q`fAl>XMoTwPtI;HBee*vQ$9H^=ipT zUBjp|xfSUZYXw(uA1OEpv*Yu@l3hqo1wVKH6G6K8YrcjqUF0j(G;EP9PQw<-lIOhw z5Ie&mkU_BAZ-D0jd>la30A>I?0esQ`rvYpNc-R0I0IQ{rZveOtz=+|n0(c6* zum)mK{23q;kWU*H8-QN|*k^#V0L}sUOc5{#=ylNhb^QY9Q=mt6?F4-m^kH3BfOdmE zqH7muzov(@17vOh-z_mzg1!gzn0`YQXtl&~U3-?r8z3iCDLvV_A6<|xb)G@-)KJ#~ zsvV6$!`))0z$Qtn9d73BcvRZx-i}5kSGd_V8X@pSXC2=js0F?^+yH!UxTfwEJQ@++ zE?nkcf`C6S+QGr&sPxV7y{KOLvF5uPp4t%%GcMa5h8N01VP?ushnXdNGK`N#*6w3F zLmy=DQE4Lbyy;Glq(nY%yVE09!JGWyo;Gw%iuH86;XCUW!}KQ?16HvT5^wZ~sulId zon?wWA+{=I2{9-w^fq^P_vXzB7Jd^(OM+eJU&&h&aQI7kTY_!l&*$w4R>m*n%Mz@W zpUamgSTJ?7cQ@K4_95SG4A&nN;Oc%KF8ko$w@oYzl=t5L{pM81@Trcd`Rzl}NZ%Ks ztl#u)ufiw$wQmmIc$fdVuQm28hub)eyYRgnUh2ia0 z!+<+><3Di1fqr_k_yfV$CQthe*J?rd@>Zs*LtaMOG-lm7L*j=NGt@}2N?92Z*TexdBQ~2*+>aqS!^MyUj{{f(};8Xwr delta 2521 zcmZvee{2)y8OQJS&)81v*lmnWLU%`E#R+N1FFQ_1t`xQg)Rn;6vaSJ#!6+@1Ra%2; zI;fLvbO_B`vTHX$lW-@JRz=jUymoA(DDBb8cJ6JfPW)9SUAq#Rqk`y&knJg)Wj0A^988;`?8yT z-M7J7;nal*)AV`EBPp8Iux6l~0(V@{k5h#v+-B_OH+F%cAx1;tN-Vta$A1;uy+nNc^g zP8iR7@r5=r)6d#q(t_}hfEQ^34lJ$F8hD3Xz!Qsez7moTsSIo3eH1s`Cba=?aFgGba$spu z%l;?W>+HY%DbN{aRrIdbfY+}O*Q_F!R3_{L#Dpu!7tq>DTo`FcHGb4Va=5FLV{_g& zHT+5^7t48HEg9=_-q)ys9nInzAslL?7kLCO^5IaZx@@)uT=bZn0FQ)rKy_RVy^p*p zs4SF*%4Ga@Gz~?TeXsEo1ULLr6AP8=w{z@yw9SN50&d~}Uu*J1Yipi=u${Z6%{&&a z;m^stQMF0G{QdHtguEwTf-l?#X7oIH4`hjNhsf&L(eOg$Y+CV0S~<0}a-eQV2x{ee zM%gX#6Qv^IufpB@Po>~&6S+JxfA+N@bMvu5#l3;7)A*xlcvV|PP-X#uvb_$Xb+ z*{?h*Db6%q3N4thR$XyOj}J+Ts}#2=hN+q$zD193NlHp(DZ!*{(M{MxU2&_PuvJp3 z^a%`8wXn;JaT>4cSK^Z5PUG#ZbPv|Wo@#|zhV@y7CB>s}(=Y>ODt|Kh6q(wEZfK5! z@}yFoJ|Isi-n977*0RuADinpCeGBR`3l`|Cr8+G%Y>3M&SRk{O$~4iiAuY3Dfyi1a zGFcjKNXsaO1tK{r(i*PnTP!QH*a3~TRAXs}hOmrcSh~cL!b;}<6vicdvQ^m8`sCVu ztz`0V?44xl4C?`Q5Dr3~JOBqFPkC=>K!RlQZFUKnI?MX-zSeC|1Q(~kIpX74-^%YJ z)FceI4JI$NF@*oZ~kc1Oe%Xl(hyJ1JDj&&;Vut^#JZO zz%K#Z1n>g`SO9#mIOA6U?g8+Skzob!G=PB;NW$h10TF;aY^2x#yaiyL0iFl&B7h&3 zf$9W*4*d1He+2yf;QvVXUEn_t{*dlhg6{@@i|$u}A1wK6N(ZRA0sL-Jf(QJ&z~8D5 zs0N>Iaai}g)BII%w^3Kv+p!+KEc~_O5K3kHJCCB8coeGa7F6?1IY+DB%-V5WP`Z|( zxKI&ktcpivc-2{lmxXJ9_eJWSh)21L+PUzJ`g36d&zJCg5jc&@m^}#wdxE#a02V(K zRUVNBGXq?!FZz)4G<}ogcm`H`Cz4p+8Bv)+PXvCp zHb+!bVJxCr3QtGyxE5E;qaa z|1v;Moe5ic4+PG3^E7q7`!_DTVo&q!N=2IY2|}!~qbF80r`5>2&|A{#W%hK@nug1p zD%#TOQuajAo>uMb(PBkfZD%Knj-yJCk~OZ%1W(zD7A>F3H%qyx%M>7eqMWc>B`tartO zBMfd~@W-9_I}AP*!>=*;MFubL!8_aVF$P|y@NL3fJ^1eo*SCsXFaO6_)*>DZ=r0!h WfyQlKh}5hUr%@KgPg?%GdiuY6p0Z#7 diff --git a/bin/DMGTRIS.pocket b/bin/DMGTRIS.pocket index ed786f2e13d4e9d2876ed8d554f30555ac88b592..f64430bd34086a3689efd2d7ea08d41b34524211 100644 GIT binary patch delta 2621 zcmaKue{36P8OQJS&%} z<(zth|9krJo$7caUBCtPkGc7AGbjH-GNb#N{^d%L7ez$og?I{4&Wmu26J|2#5#-Iw z5EiIKj!7p_#4*_HNu>m|fV|S2g-=p+z>NBmL)K-hZL&jj;VY8M`J@__LHMlmh)$E6 z&XftQNf+H;Kn|&<{0@~n!O~YAaIS?ZA(wDx7*8gTmw#lk#5g)DJzZIiV$wG&eX9I^ zK_*|X9Jbm^3wx1lzV0aQ6yGO9WUn|&_Te9QVP!XdCXDx^1WAh=$%y;O3VydyG?VLM znhfK~4%;mK%z6IbHclJT!f7AP*tkgPy8Mz)UiHcAKKYhUKH--a{PG|CaQ1MU|+_)3tj4DdFXG*c-C$cm?AztECK4i0~VlbN*Y+g8o$#Zr>Nk0Lya^vyx$ zmd}rxq#FOD0mzq=3{A6qpp;^`n$=maGQ_*_6rvfD6>CWbZh6&T7j9}0%fNh!alA#W zRB`=nto3-2pnZMUDaQh=sXINwC9afL;ZI(y+=m(4oR084xW%RFbwP{>> zvi>`bD;+e2+dBn5<#{WQf7B`Tq&zQc!QPbTr)q#pcF7}BQ$wTrP@ji~dZ3}9q7Vjs zPW8+j0AFZ044tyka2a`G&}AsjL8E!?Xc-zVdAadj)EeVF+=9SeLYxIoGC?Bg+(edn zmc3>b@&&)ZUqTZm9Fta?1n3XinRGcELepwq1%qtmV6*B0RGau2ENI0lr5vWg?FE`_#2SgS5~ zP|qLCDo!nLQH+q8Ab&{DABtv`GR67kcakn0K_BKzpCXG&MSPkpDW15zD$TUk z>>BAy6z{55-IXQa=-=8(!ic1|TdSO^UEhO5TC1X}E~;5jYqkbl{l!%#iUpKhtCoz^ zHHXW`4j6|;l(|9__@_b`q;0uFa8&c4$ z=^?s4NtGjS1*}teE|{KT*LXMin^;2D#k+}u&vXFd__B|K830jm+-EpU0D1x3Yk+S7 zI7p)F;{66eKnB2aj{%+r@M!=M1DFBq1n^k{JOf}8zyk)b09Y+{d>g=B07eXl6~Ge! zhBOd`;!gpQfIMheYyf@^V6OpA12_ZV^98^hpw~g~)AjS9Pl6uRwG;Gd&z{hA)s4v@J4e6Pq*4*CwzWBLshpw$w`b?sReuYsIUrSy2mK6FmH&~XaIl7pQK zsCqOE4R?c?0-GeIcDR|h<56j&Ydad1T%ktSXqdnkoppSBpc?p|P#y3+p{knK@Mu_g zFMpAL2?GACXa@(6BhquBJ5jCl6U}!yG_|8G#JEgX2wo`nhnOid9b%Tu@en>7Ub~C! z4E{5X4@(o_XHB=dB_;eN+pTV~0^Z~gbhn@@Qnb6v4c}RB4$)W62drW_B;M{8RV(U= zIZG6KTx?cK;$pS5(9_t_)sr*FS?C=YEpc|0e=TQ?!{IOGY;m@YKby11SqZ<8D~Ypa zelAxUXVuB;J-g8^u^0JnVz~Y=4_Eg`aM=t0zHMT@zqIG(Z#SpfhfcOf%8WV5iEG^`nw!2aq#5_ z9|qjM8~=_IhWqIC!Vd&ri#+W!T&sEEYg?I$c6k|T)1=%E-9ZNj$e{i+!^JC6ck5Q7 pzrQH6u48E0A$OH7w(i?7vM>MNZ2q>{bpF48$w&G&&FAi3{ts@N;Kl#| delta 2521 zcmZvee{2)y8OQJS&p1x(IBSeeLVHJI#R+L*lGt%Va&2L2K-~zeE$bR^7>v?FS*10s zrh_`!M$6E=CA)S5GzoViSye>c%In59in1P^Z0Fu?>cn4V(zPq0IVyOOpc7tpx92_I zMd^mDd*A2zJkR^%`@WBT9vicbjoBtxbYYUat18WKOdg$N{0vS{KG466dqA809=ou7 z<(J&ax7Ztn?>5r@_T;N0lcd_pi01?=dZ=X+&dSGmB)`mM@`x~ggkhesB6=G6H4)4* zwTWrrIW$!H;3{7}&!J<;FHG9l96?*Gs3kXOpRqeeJNasSQK)wBr)CwHN8Gy&n!DxB zThLYEyyr3G6_$DLrrZrFYrJ9i)fkcG3pgIbqq*;RKeyP@44DwdYwJ*2c%e2x-Jh4; z+?%x-hGdPR9iK@>%xZ4o2?^+)DvcbTC7%d2uQr{xu*f0Z|Qz$)I>VD1I0eS2u}TP)szD zS#=Xz3FCPmz8E311FQokEed}M_>d;x!16k+iFe6Gybs|CWC#*9VIdGit%5(eFAQ<7 zTqFfm3%dx0)=DS3q9WFVlZX^$iLaN7FywTwA=Vn=t04KX%CI)Rmg1&6q&DG=9`aK? z2bLDK+<$_7l>>J^1vM(;L*@dsE%u) zzaU>4Dhp+xG8w-U%|Mam-fR94!41FK!b0Wxog8}sZMWdGfLl1g*IWG1I$9SVUd>(C zW}gVx@#p0|sK#Pk{sDP!Qr=t8;mdb`StC#03t8ejA+m7}g%>Ml^QvFc%BiQ719d|} zP%AgG${vaTv0fznHMpDqsT7=RAy)>;hQm;xB@ zDEH)Jh}F@UBkb%iGr9^LminiPiYMCCnz)->pR=k~)+(N8BcA{rzxNAt{9ee{7hoGo zkJEK32b9Mpr7}a8LW?G>)leEX;=_{S*5fwCG*t`4w;J)SDM_i)6D-PB!-PFFl(rcO z+a#shn7}ku8@sZUpz-PfB_S!E4BpXB_h4V@sdkuU#F%A7QoP1CO*3Gn@~2YIkm=p% zrsg^%PboE-gYvZE%ZPt(FAJ@wLgB*t7u97KEzns{b=qjy6qjAJKxRFaX`x|LT6WO_ zk@Zw$N*``Y%POV?A~`D395Rynfe2J7nwfGdVw8+gOH~V!a>N>zMC45AenlHT}GzQv9)-A`}U`TOH<$+@rhh* z$5#<*5k?|Isf&>U9*?LR+g$G0au?LQJd|`{kjy_rl-+NK?MeKLNFk|SV?FX!zCxbo z@0S&Pq7x9qR(%nS0Z2i{LuQ5rKp%jwnBWHhhUL^ezu6=R$N;3QGr>53)c}S}UYLO{A%!ny1!OGK-B}_XG;>i;NK1Y zHe)~y_;iaShVPri5pbZ(&Q7^+LepvrDTHQ$o+wCb&_6DI_v zdj(1e718GEL`;TPoqc3QxDI%KwBe~ljJu?r58rG&A13g82G6H~Gq{Y|Q(&+sc_$2D z@gp(iF=;3}$hAwZ7xYo{kbN1RkKp+SW~1C@sk?E>hg_iPnts*^ods>rAjcCzHks2#b_;=QPKT^|Z8U}%4(LF@S(n)UDmmh)P_ zE57jFtz^gGfsP^TrD0*HZ&wJuB+7OvseDU1pzM&IS9VI@SH3MBRCY;+lqV$fugAxI zs~#R@a2ta^=)(6f_;ehkwy94kb?6etrMUe*plPv{e8A diff --git a/src/dmgfx.asm b/src/dmgfx.asm new file mode 100644 index 0000000..d1665c6 --- /dev/null +++ b/src/dmgfx.asm @@ -0,0 +1,89 @@ +; DMGTRIS +; Copyright (C) 2023 - Randy Thiemann + +; This program is free software: you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation, either version 3 of the License, or +; (at your option) any later version. + +; This program is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. + +; You should have received a copy of the GNU General Public License +; along with this program. If not, see . + + +IF !DEF(DMGFX_ASM) +DEF DMGFX_ASM EQU 1 + + +INCLUDE "globals.asm" + + +SECTION "DMG Intro Effect", ROM0 +DoDMGEffect:: + ld a, [wInitialA] + cp a, $11 + ret z + + ; Yeet the logo + ld c, 10 +.loop0 + wait_vblank + ldh a, [rSCY] + dec a + ldh [rSCY], a + wait_vblank_end + dec c + jr nz, .loop0 + + ld c, 45 +.loop1 + wait_vblank + ldh a, [rSCY] + inc a + inc a + ldh [rSCY], a + wait_vblank_end + dec c + jr nz, .loop1 + + ; Fade + wait_vblank + ld a, PALETTE_MONO_2 + ldh [rBGP], a + + ld c, 20 +.loop2 + wait_vblank + wait_vblank_end + dec c + jr nz, .loop2 + + wait_vblank + ld a, PALETTE_MONO_1 + ldh [rBGP], a + + ld c, 20 +.loop3 + wait_vblank + wait_vblank_end + dec c + jr nz, .loop3 + + wait_vblank + ld a, PALETTE_MONO_0 + ldh [rBGP], a + + ld c, 20 +.loop4 + wait_vblank + wait_vblank_end + dec c + jr nz, .loop4 + ret + + +ENDC diff --git a/src/include/globals.asm b/src/include/globals.asm index a7a813c..99b39a3 100644 --- a/src/include/globals.asm +++ b/src/include/globals.asm @@ -26,9 +26,9 @@ INCLUDE "structs.asm" ; Waits for PPU mode to be 0 or 1. ; We don't wait for 2 because it's super short and impractical to do much of anything in. MACRO wait_vram - ld hl, rSTAT .wvr\@ - bit STATB_BUSY, [hl] + ldh a, [rSTAT] + bit STATB_BUSY, a jr nz, .wvr\@ ENDM diff --git a/src/main.asm b/src/main.asm index b44d3ea..ebea097 100644 --- a/src/main.asm +++ b/src/main.asm @@ -68,13 +68,20 @@ Main:: ld a, l ld [wInitialL], a - ; Turn off LCD during initialization. + ; Let the DMG have some fun with the initial screen. + call DoDMGEffect + + ; Turn off LCD during initialization, but not on DMG. + ld a, [wInitialA] + cp a, $11 + jr nz, :+ + wait_vram xor a, a ldh [rLCDC], a ; Set up stack - ld sp, wStackEnd-1 +: ld sp, wStackEnd-1 ; GBC? Double speed mode and set up palettes. ld a, [wInitialA] @@ -96,7 +103,7 @@ Main:: ld de, Tiles ld hl, _VRAM ld bc, TilesEnd - Tiles - call UnsafeMemCopy + call SafeMemCopy ; Clear OAM. call ClearOAM @@ -111,7 +118,11 @@ Main:: call SFXInit ; Set up the interrupt handlers. - call InitializeLCDCInterrupt + ld a, [wInitialA] + cp a, $11 + jr nz, :+ + wait_vblank +: call InitializeLCDCInterrupt ; Switch to gameplay state. call SwitchToTitle diff --git a/src/memory.asm b/src/memory.asm index 0892b49..c43033c 100644 --- a/src/memory.asm +++ b/src/memory.asm @@ -57,5 +57,15 @@ UnsafeMemSet:: jr nz, UnsafeMemSet ret +SafeMemSet:: + wait_vram + ld [hl], d + inc hl + dec bc + ld a, b + or a, c + jr nz, SafeMemSet + ret + ENDC diff --git a/src/sprites.asm b/src/sprites.asm index 35d4f52..254d169 100644 --- a/src/sprites.asm +++ b/src/sprites.asm @@ -85,11 +85,11 @@ ClearOAM:: ld hl, _OAMRAM ld bc, $9F ld d, 0 - call UnsafeMemSet + call SafeMemSet ld hl, wShadowOAM ld bc, $9F ld d, 0 - call UnsafeMemSet + call SafeMemSet ret