From 1eb235fc4c5e37ace6e5c96eca5da0996ff224ef Mon Sep 17 00:00:00 2001 From: blondie7575 Date: Sun, 23 Jul 2023 14:59:55 -0700 Subject: [PATCH] Ground work on title screen --- Art/Assets/TitleScreen.gif | Bin 0 -> 2010 bytes Art/Assets/TitleScreen.xcf | Bin 0 -> 9241 bytes GSCats.xcodeproj/project.pbxproj | 6 +- GenerateRawImage.py | 24 ++++++ Makefile | 14 +++- gamemanager.s | 9 --- gscats.s | 3 +- input.s | 40 +++++++++- loader.s | 68 +++++++++++++--- loadingBar.s | 2 +- titleScreen.s | 129 +++++++++++++++++++++++++++++++ 11 files changed, 271 insertions(+), 24 deletions(-) create mode 100644 Art/Assets/TitleScreen.gif create mode 100644 Art/Assets/TitleScreen.xcf create mode 100755 GenerateRawImage.py create mode 100644 titleScreen.s diff --git a/Art/Assets/TitleScreen.gif b/Art/Assets/TitleScreen.gif new file mode 100644 index 0000000000000000000000000000000000000000..410e1a0b382a905e15bbffd937cb589040af6256 GIT binary patch literal 2010 zcmb7;`#%#31BZtky~|wd@L z?SK>zpa?Mj*#!LW2tZZ>2B&)Y7y6NF0#-VLj0aGE^U*aM*p2S=w%r;Gq- z(I5#0qq^0ORfn+FFmI=6XooX|fu#lvC$Npb*@AVf9pBh(j~v+ez8@7G^E@^#J|Xc% z(#zzO)U@=B%&b@0Ik~vg3Iv5bvwRQ;SOx^iDlzRSR5#LC%Xw)4bO2RSVec3mpnuRKkGgo0(&~krfV2G%ZJyo zkQ*LXR8=IE48sgA;kPjEaHB>}5Rs+TsXKMq!n338F}EK;@4q zH%J8!gHFD}eXjOe0~V6hPE7?Z6(&(+g{u#b9Xi$)_HsB5!NIBW0qqWPElvr9bj_sa zXZ_6M{CS+@*mEoDl%pn(8@IOQ$LUh@BKnu56}6+G+`cz$s5eOCFe4#ICyaL$TLjs~ zjH9ZVRo5VhMc}uGvxOEwwne0C&&!N|OgFw6=I0dD=Bd2zH`XT%G7JPQ#x%&6l_|FGJbiOPPWmKA0i9pes>E>xRD%R#+8 zl1x-)@7ywlhRP-M#@T*~&YT}B(6#=hmutoEj^{+m8ko#phTPY2$*`>FI%XUHNOZD2 zoT)aYt2r-@c~LOq=K={bI52C_rLS}%&)2Zq9>-lnmzyKzO;OY zei%~k?ES^m4ca(U6tcOL9>P(^1Bo^j7e6NnIm8K+;7_-OEW_X!Qh=QsJ%NaV94XB! z%fuY_0bWu2wJ1M^Jn_iB0%t6y69w{SV;5693m-wi^&OLMK89>qhYY4_`l&Q=84wjO`lggNTbT4i>KRIXzc zo|m}|QQzo1NTJKoA`EVf({&t;R$KLR?p787-&2@)wKQmL7sjLt=dz0wD+aHY!ne+L z6nyo`bqV>;a<624Y{_M0`J^fvR9U^k-2c>mhUr}4U(#E!|JcDo_nMw^#1yp!NM*wR?FApPMsU z$|pBkZ~G&)#x=wL5~tQJw+5Dlw;ft|krWf$pJ`$ukAAJ0)d*RXoHM$zGLIge5#2H? zpoei&F__a1+aoPr*oVB8O%8ZHXC{-MUEO+@T-(84eOJSLokE(pAiiY#ac&|(HbUav z-F_V&XhEW#DG4`vqEc?L`Hgv45btp}e&vHu2BF`2L!OAmi}U`-peRP_=FcaGPtQG( zPIwa}#mpf1)R*jP$3}F(Yz2wW8h%u9qIs;02b;Zb!}Xo47vS%AaJlW+9j^x;rYE;@ z>a~@ivdhfYMlNHRe$uj##bk;iDLOFbsOM4c6lg& zOF`v`_qFFy|GaRT^JvlVvMEG51D)<|idLV}<9> z)0H2bWxH-o-LxAVIjiBNeDAmz*Co4TYOp<921aC6?gy*}KX;g;?hd6{W#7t3w_zMK z#l5>3ql0zSa6ffAFYTDQN}$UeQQyv<>4M*WMRF)Nyu)DLrf+A{lFN;K?OATT?VJ{N z`I%4#>;B$$Zl`>ONrFAwQ(b`TbEq)OWw3pqg1o`xiu0BBoJVc~{205!yqUoX#0Ut} z@|72R?fakN1^JFjQP5FFe+XSruoidK_7RVNrDD#ha)dJz3-*MSCr=-6N`MWg?Uj&jBFJ_d#lsa)NZAuK*|icj z1aaCSBP0BNt7neXmJ zpB3 literal 0 HcmV?d00001 diff --git a/Art/Assets/TitleScreen.xcf b/Art/Assets/TitleScreen.xcf new file mode 100644 index 0000000000000000000000000000000000000000..39ada7d5ff21394dafd3d0aeb283361ce89c98a4 GIT binary patch literal 9241 zcmd5>d3apabw6|8yxHF9&1kb0+tO&WWgA(xyvP`1)&i#Vt65Wm8!SsBc|ewoEQ19& za-a!Ik_HkQ;u6ZzHZ92qd?a9}CFz%dDQyD@O9+8a#)igVW3UZgu%wxH`aAc%Hy(s> zX+Hkwv+tbs-E;1}=bn4sRZnKk+SG>5?$ot&=FTOe!0Gt;4>X1LU9=?&? z+C;Z@7eBXo-o7W#-rn8Kn}0}*f3$V$*6rK3({)ciaKR6t%?utDqXndcQnbjKcMwU# zQ-&5qi=$2QaM3GA`v9$|2X3`=_ODr!?i&QHy(l?rAl)&T?n+&k8C;z@ciEpU7fDj9 zX4Z7{q+5ChGF`s*51ZEw4)vx}>-u{$T{B|M-94TCz5N5JW(`^fdRBF$=IDQOXF$B_ zIO4e}{ZGUj)~)U6%=Go7=7Sh2Bs{!jeP3oUmFeqTon9yU{oUQ`(u1ivqF#Wz=*N}C z-wV8U;tlh_4L= zxF044cnFQaHv!%C9!zf-Z0YS7N)Lb~V+mZ-yryH|>h)_=^-El2=@KkWU#h#mZ}8L= z^=EdhyE;8^ZKf9?ab|yS*NXbQd?4L3(7(Q~3tA0b`pFB|Wv)+yyKz;ab7Fu?bkANeXYR=h=d>@HKX2~5_O=D{ z7a=C0d)4}NgPHE3)PTf|blAV4WleuqI@LAQ*Rdwk>9KTF=N(&}foIqR+AW#*f+u)! z0pW+I7mUGSS61_R@RXhELZV?KVMi=ZwAnU(m2Ftl>=MgK z0BN$TtOlDCQOnf7_4pOl2wteyFIjfTs!49&8IaV%YyhyvE(MIj&Q#bC%%?(DP;+9|RM<7`u-5-LZdxIaUjvIl^e26m z055{2c%HKCgr(4TF+7dg$viG&3!n!D?WmQ&c*5W)a13Y*9Rh8D4uUR%ABA)re4*v- zFg%P|QBcB>F@!*KLbxHj4E=JfT4PZ?VngHNmjQ3X(8?ubK5e|si85`;u!fD(Z7dlb ziO#=l&4%l`mbV1jC|fnKZ8Xf;_a41ODdKsGr%|qY^Jo!|Z%+s4D~g-Q={ykP(dWOu zwsYu#cMQ%wId!|@26BwML+orj$)sFh`OAv=h{5&bs0YFQt`Q-}yek9--v;`phDCgX z$#ujRf;?DJM0`(>Q{-Mz^?y%sJG4_{#Qt< zYAF}n@MfIHvUee?j(`K+0TJpK9$B=N0<+HgoxkL z><7V~UPD=P_QFJva#J^s=&o0Ty`+SAwc;Ym2F`yX7nQziz+M6N7R46j%+BA##?jFb zV1E*VlM8$+asYOa!wf+F|UL2 zBwy-;ehKpXadKMsn<9MyWVu4nyd7eboRZ(*?agKs4(|_%{BVfJhj4!07Zy{+PlY)5 z%J~6kwmz)b$s!t|^nQr5&JVuzMg-pGg0~@LMt5xPTY1f$zeTX_IAy6;`X`H>+yRr( z_na*@kL|k^2jage>9%Qql(R3i&pRB%G-hYs@`{5E@xj)sEVzA@k|}6?-sF!)w_bo0 zI_>eSVw;YXoVIe{#=%v~TU8m2wss9&yXv$^h_WTiuet#n4Y{$$u0%d`+YG&NIi{?c z*vt{zNoXW$Gxn%qRe)IqSc(1W!%Acqp)0VD1x~^)78rzH4EjDEv5S$TT)vMRcsGE) zO)V?dxMZhF(8B*DE?EZor9kTTcuf1V&@#ZnH)45P5%}!e{oiq!kC+|M`BM&-0CKJ5 z!+^!e{gO=sn1!U~nV=JxMH||J+sLdX7`cg=ii0nBQ0LEt#ua)FAs1eaT-ZaENO#h* z-~0P#ve-@I=7_UvOz{kI>R!h#*@-0$F8UeIB>oE_v0aQGgP1Htl(^WYY;x14wH3ss zu&O9~AwVU0#82`>C5@l%ZA_Y3$LtuPaFqA=6`ykB^LOe?KU^frx&o5)x3)evI1ZQ(+$6 ziO-J8%n{vB_86ac!rVs9g-IEvJ6Lerj>|1RE;sl|ZVVqPg*|>|`YqQ3SDz(2?ZJ9P z;oEMcJ}e9|vWYWpAkkbi4|%USj9d_l(iqRC^A7C7HvcsSyqM@}<~x$ei-?5FMEvSE zcJoURe*@w_eCx-U^Vv4#;;RltIJf7bNLUKx8!+8e_ zg5-2L5q6wgY$`#93vlk>?J?w>b6+rV(ER+ggl6ZiIX@nw(dI9$zoGAfNeE8lk2u11 zCN`~!a78H2peoyuMxp7Z#JQ%=kFW$<6h zSShY1p^1jzGDSXKiG&nG>aMh=gFnMAx7si|3$xFOpe}KnU{6ZjLKqhx60$<#`82%Q zj5lZEonosMzcK4lB&j%!mt8q@MPepp!?VBmHDrlRIRC!zAR$kp$RuGKL|JWp4CMBCQfR40^AUdm#?~hg*{DI1miS)`SRvA zjkg#4N=a8^(V>RHe}4Jhk4E>t_VCbjgT|Nr^uu><#)d;J5u>9ei#u+8^mk)Ow9e^I zS)6^Uwd4`(xU=0-#H8^*zxLj3d*SR(oYBEMvB&rBGuav2jf!NwuY{cmF>f|`Z1f^h zt1(l~gZE-oU4y(dL!#tKpc@MvDD4-UMGBAX+S#sCkv(x^_bkUaxl3bF>k zUr&&20PkYRE(09?xXda208_CA!Y!DWedUEx;9o-FbbDFyCdhJ^VH6mPYZ1p>=b<9Z z zhl!)y?tdT5J$2K_nY=5=hxb16S68jPvS-8H&y3*!d9A*goYZqk&K=rhApsayY&jI; z?1x*rN?YlWF>P7LzzxG2dRLxTb14l6cA~_Zc7irpp95@7gw?u0V&pIRL}iqT@@dLe zxz62;JSRE4*vi?KK2?g5?d22_n1n<=Q+=qA(OiAuqF_UwcTWJJg2-y_N3HblzA5zQ zhs$+?Z$a$2w%sBU{(~bqTM9_Yy$T#tUmnP*iCYYmmjRrha*72!Tt2;Pq-0b@Hs+Z4 zv1uq&KCMl5>p^T;1}e3nhe{hL26r&ptV&jY~mRc{1r2U&1z5>q)g31xU6KCh$c*x5mipQTiwP@*^*nca1 zUVxpyLuI5t3h(ooIetPCRV5Uk_IVD@GGYbRt3HeI`2_ln2{Z-@t{$$BeGc?nG7~0o z!0SsFddLABhFdn6Z$rT^^v185hdK{}GcY$}CSF5{cf>34_+H#~I48e|l)eTMRCfox z>W=v!F1>MN9KcyBRh_euq*5({VO_~(om)^BYYt5NRb0)n+D*xwE6MF|tsr<{l;rXi zPyRw*u8Kn!_*bU?pRR|spZNJ>uZLx11yAMnV?=)R-c4kc{7C{&O8(X%(7RboEpuu4 z&A$V@3Rg1nRA1@B$$MNlwa0}ua%GLD_BIdR>A}q&e87XRdGJjSdi~VOUpw&Bj=C@v z@L<$~zQ0u-UFX3WF2s#!lI&sgD58Hp4wrdk@mz$?9MoQ|6z4Y3eiNDC0w>}=@6+J? zg7?IZ&@L~IzNFdOZX0lsFQf<$V=S(BzaSHbVh~xEHdK(#ka~qYBu!xeV_F zpdW(Ga(HL}x_B6R$8f{bvCyXpn*qEldNJS@CG&U`Us66l44Z;S;b#bT1()%dfQ)vG z79U(X3?G8HG{xiD9zMAMPR2M;MZh$h+v zUZh$`LtF}IzOIv}_XOvLd1gJ zmTmZ&#LCC8;!!k9!%{?|&^|1Np3sSceee+0RAOD?eqxiI=k6@oUB}u~9TO6RF&yL- z8Y--YdoopNnstmYX1^MAB}VS!RhS)IDC1p;;Q&pft98s7uwlX{=|^JFrQ>>)kI|Oy z=NK)q>Bg=2CUGuw*o*y%cmy*O_H<;QMm${ZkYvSN{RC#w?>CG+>f>cPLKOT{xX=h- z9uy*W9AhJlH;~7x!0`En_+t21g$k+?d7}z{NC?4B75Q(!V@^Z2jTY7H%i_Yx`gNSV1k} z>C}1kLBnBJr_np_8+8fi^73;Bvi=O0SHH}I7kcn=4|aGkN~=~SUoRHLe>NtMzpWz!rLr3ETTixuN*bJ)|jAdBF>@)sU`I+^NZN~+mZrJ5+E zYG}HupcYk3Z7NRfDojgIeGdmVx%&1dd{Zo?pju23wUFYfjS{MrO4Teql9^PdJ!zzB zRYz0NTS`r#dhJyOdM=}xs)SBbNt&%ajKfNd=EI|fDnyI4w+a>mG;Dp@wV0&i!bz%G zdpt$eQ?06njVaWqs({{ft*D;EF& literal 0 HcmV?d00001 diff --git a/GSCats.xcodeproj/project.pbxproj b/GSCats.xcodeproj/project.pbxproj index c8a454a..04f1f3a 100644 --- a/GSCats.xcodeproj/project.pbxproj +++ b/GSCats.xcodeproj/project.pbxproj @@ -18,6 +18,8 @@ 701E708E2A67844B0030C35D /* loaderGraphics.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = loaderGraphics.s; sourceTree = ""; }; 701E708F2A69CE520030C35D /* loadingBar.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = loadingBar.s; sourceTree = ""; }; 701E70902A6A23800030C35D /* sharedGraphics.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = sharedGraphics.s; sourceTree = ""; }; + 701E70912A6DA4D80030C35D /* GenerateRawImage.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = GenerateRawImage.py; sourceTree = ""; }; + 701E70922A6DC5910030C35D /* titleScreen.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = titleScreen.s; sourceTree = ""; }; 705456862A43E03B00A2B866 /* GeneratePixelCircle.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = GeneratePixelCircle.py; sourceTree = ""; }; 705456882A4D336200A2B866 /* animation.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = animation.s; sourceTree = ""; }; 7059502B1F37A0BE00BBE90F /* GenerateVRAMTable.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = GenerateVRAMTable.py; sourceTree = ""; }; @@ -64,9 +66,10 @@ 701E708E2A67844B0030C35D /* loaderGraphics.s */, 701E708F2A69CE520030C35D /* loadingBar.s */, 701E70902A6A23800030C35D /* sharedGraphics.s */, - 70E9D8601F2BD95400555C19 /* graphics.s */, + 701E70922A6DC5910030C35D /* titleScreen.s */, 70E9D8611F2BD95400555C19 /* gscats.s */, 70A80FB01F43D7F200BD34C9 /* gamemanager.s */, + 70E9D8601F2BD95400555C19 /* graphics.s */, 7099E3841F41022100182A82 /* gameobject.s */, 70F011D123B989B800C8873F /* random.s */, 706DF1651F2D4A8100AA6680 /* terrain.s */, @@ -95,6 +98,7 @@ 7076E9222A57AED90006E295 /* CompileFont.py */, 70FE79D21F8814A600E0095C /* MerlinToCA65.sh */, 700F72872112428D00225B17 /* RenumberSpriteFiles.sh */, + 701E70912A6DA4D80030C35D /* GenerateRawImage.py */, 7088096D1F2ECE8D00D4C950 /* GenerateRenderSpans.py */, 7059502B1F37A0BE00BBE90F /* GenerateVRAMTable.py */, 7099E3851F4107B100182A82 /* GenerateVRAMYOffset.py */, diff --git a/GenerateRawImage.py b/GenerateRawImage.py new file mode 100755 index 0000000..5978eb1 --- /dev/null +++ b/GenerateRawImage.py @@ -0,0 +1,24 @@ +#!/usr/bin/python3 + +import sys +import PIL +from PIL import Image +from numpy import asarray + +def main(argv): + image = Image.open(argv[0]) + outputFilename = argv[1] + pixels = asarray(image) + + with open(outputFilename, 'bw') as output: + for y in range(0,image.size[1]): + for x in range(0,image.size[0],2): + highPixel = pixels[y][x] << 4 + lowPixel = pixels[y][x+1] + byte = highPixel | lowPixel + output.write(bytes([byte])) + +if __name__ == "__main__": + main(sys.argv[1:]) + + diff --git a/Makefile b/Makefile index 0c9d905..ca7ec31 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,7 @@ CODEBANK=CODEBANK\#060000 EXEC=$(PGM)\#06$(ADDR) SOUNDBANK=SOUNDBANK\#060000 FONTBANK=FONTBANK\#060000 +TITLESCREEN=TITLE\#060000 PGM=gscats MRSPRITE=../MrSprite/mrsprite @@ -31,7 +32,7 @@ SPRITEBANK=$(SPRITES)\#060000 FLIPLIST=$(wildcard Art/*Fan.gif) $(wildcard Art/*Spit*.gif) REMOTESYMBOLS= # -Wl $(shell ./ParseMapFile.py *.map) <- Use this to share symbols across code banks -all: clean diskimage fonts $(PGM) loader emulate +all: clean diskimage fonts titlescreen $(PGM) loader emulate emulate: # Leading hypen needed because GSPlus maddeningly returns code 1 (error) always and for no reason @@ -51,8 +52,10 @@ $(PGM): $(CAD) ADDFILE $(PGM).2mg /$(VOLNAME) $(SPRITEBANK) $(CAD) ADDFILE $(PGM).2mg /$(VOLNAME) $(SOUNDBANK) $(CAD) ADDFILE $(PGM).2mg /$(VOLNAME) $(FONTBANK) + $(CAD) ADDFILE $(PGM).2mg /$(VOLNAME) $(TITLESCREEN) rm -f $(CODEBANK) rm -f $(FONTBANK) + rm -f $(TITLESCREEN) rm -f $(PGM).o loader: @@ -62,16 +65,23 @@ loader: rm -f loader.o fonts: - rm -rf $(FONTBANK) + rm -f $(FONTBANK) ./CompileFont.py 4 5 48 0 "tinyNum" "Art/Assets/TinyNumbers.gif" > fonts.s ./CompileFont.py 8 8 32 0 "font8" "Art/Assets/Font8x8.gif" >> fonts.s # ./CompileFont.py 16 16 32 14 "font16" "Art/Assets/Font16x16.gif" > font16x16.s @PATH=$(PATH):/usr/local/bin; $(CL65) -t apple2enh -C linkerConfig --cpu 65816 --start-addr 0000 -lfontEngine.lst fontEngine.s -o $(FONTBANK) rm -f fontEngine.o +titlescreen: + rm -f $(TITLESCREEN) + ./GenerateRawImage.py "Art/Assets/TitleScreen.gif" "$(TITLESCREEN)" + clean: rm -f $(PGM) rm -f $(PGM).o + rm -f $(CODEBANK) + rm -f $(FONTBANK) + rm -f $(TITLESCREEN) rm -f loader rm -f loader.o rm -f Art/*m.gif diff --git a/gamemanager.s b/gamemanager.s index 9d36973..9f0942d 100644 --- a/gamemanager.s +++ b/gamemanager.s @@ -13,15 +13,6 @@ beginGameplay: lda #1 jsr seedRandom - ; Set up sprite rendering - BITS8 - lda #3 - sta SpriteBankBank00+3 ; Tell compiled sprites what bank they are in - BITS16 - - ; Set up audio - jsr initSoundSystem - ; Erase the screen ldx #$0000 ldy #200 diff --git a/gscats.s b/gscats.s index 405fca7..a1864d5 100644 --- a/gscats.s +++ b/gscats.s @@ -22,7 +22,7 @@ mainBank2: sta TEXTCOLOR BITS16 - jmp beginGameplay + jmp titleScreen quitGame: NORMALMEMORY @@ -49,6 +49,7 @@ quitGame: .include "dirt.s" .include "crosshair.s" .include "progressBar.s" +.include "titleScreen.s" endMainBank2: diff --git a/input.s b/input.s index c2673e1..54e4179 100644 --- a/input.s +++ b/input.s @@ -5,9 +5,44 @@ ; Created by Quinn Dunki on 8/15/17 ; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; kbdScanTitle +; Processes keyboard input for title screen +; +; Trashes A +; + +kbdScanTitle: + BITS8 + lda KBD + bpl kbdScanTitleDone + sta KBDSTROBE + + cmp #(8 + $80) + beq kbdScanLeftArrowTitle + +kbdScanTitleDone: + BITS16 + rts + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Title Screen Key Handlers +; + +kbdScanLeftArrowTitle: + BITS16 + lda #1 + sta menuActionRequested + rts + + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; kbdScanGameplay/Debug -; Processes keyboard input +; Processes keyboard input for gameplay ; ; Trashes A ; @@ -58,6 +93,9 @@ kbdScanDebugPiggyback: bra kbdScanDone +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Gameplay Key Handlers +; kbdScanRightArrow: BITS16 diff --git a/loader.s b/loader.s index 0b4ed7a..fa377c4 100644 --- a/loader.s +++ b/loader.s @@ -12,8 +12,8 @@ .include "equates.s" .include "macros.s" -LOADBUFFER = $1000 ; Clear of this loader code -BUFFERSIZE = $8200 ; About max size we can fit between buffer and this loader code +LOADBUFFER = $1100 ; Clear of this loader code +BUFFERSIZE = $8000 ; About max size we can fit between buffer and this loader code MAINENTRY = $020000 .org $800 @@ -240,7 +240,7 @@ mainContinue2: addProgress LOADSTEP -; EMULATION + EMULATION ; Load rest of font data into bank 0 (needed if font size exceeds BUFFERSIZE) ; jsr PRODOS @@ -249,9 +249,9 @@ mainContinue2: ; bne ioErrorJmp ; Close the file -; jsr PRODOS -; .byte $cc -; .addr fileClose + jsr PRODOS + .byte $cc + .addr fileClose ; NATIVE @@ -262,6 +262,50 @@ mainContinue2: ; ldy #BUFFERSIZE ; jsr copyBytes + bra mainContinue3 + +ioErrorJmp: + jmp ioError + +mainContinue3: + +; EMULATION + + ; Open the title screen file + jsr PRODOS + .byte $c8 + .addr fileOpenTitle + bne ioErrorJmp + + NATIVE + addProgress LOADSTEP + EMULATION + + ; Load the title screen data into bank 0 + jsr PRODOS + .byte $ca + .addr fileRead + bne ioErrorJmp + + NATIVE + addProgress LOADSTEP + + ; Copy title screen data into bank 6 + ldx fileReadLen + lda #6 + ldy #0 + jsr copyBytes + + EMULATION + + ; Close the file + jsr PRODOS + .byte $cc + .addr fileClose + + NATIVE + addProgress LOADSTEP + ; Set up a long jump into bank 2, and ; a way for game code to get back here to exit ; properly to ProDOS 8 @@ -287,9 +331,6 @@ returnToProDOS: sta TEXTCOLOR rts -ioErrorJmp: - jmp ioError - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -385,6 +426,13 @@ fileOpenFonts: .byte 0 ; Result (file handle) .byte 0 ; Padding +fileOpenTitle: + .byte 3 + .addr titlePath + .addr $9200 ; 1k below BASIC.SYSTEM + .byte 0 ; Result (file handle) + .byte 0 ; Padding + codePath: pstring "/GSAPP/CODEBANK" spritePath: @@ -393,6 +441,8 @@ soundPath: pstring "/GSAPP/SOUNDBANK" fontPath: pstring "/GSAPP/FONTBANK" +titlePath: + pstring "/GSAPP/TITLE" .include "sharedGraphics.s" .include "loaderGraphics.s" diff --git a/loadingBar.s b/loadingBar.s index 7f5d1eb..7bfcb5a 100644 --- a/loadingBar.s +++ b/loadingBar.s @@ -134,7 +134,7 @@ CBR_VRAM = 6 currentLoadingBar: .word 0 ; Active .word 0 ; Current progress in bytes - .word 57 ; Final progress in bytes + .word 66 ; Final progress in bytes .word $5eb4 ; VRAM position (top left) diff --git a/titleScreen.s b/titleScreen.s new file mode 100644 index 0000000..78247cb --- /dev/null +++ b/titleScreen.s @@ -0,0 +1,129 @@ +; +; titleScreen +; A friendly place to start the game +; +; Created by Quinn Dunki on 7/23/23 +; + +.a16 +.i16 + +titlePalette: + .word $06af,$0072,$0072,$0861,$0c93,$0eb4,$0d66,$0f9a,$0777,$0d00,$0bbb,$ddd,$007b,$0a5b,$0000,$0fff + +TITLE_ANIMATION_FRAMES = 5 +CAT_DELAY = 300 + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; titleScreen +; +; Shows the title screen and main game menu +; +titleScreen: + + lda #%10000000 ; Set all SCBs to 320, no interrupts, palette 0 + jsr initSCBs + + ; Copy title screen art from where it was loaded in bank 6 + ; This isn't fast, but doesn't need to be + ldx #0 + +titleScreenCopyLoop: + lda $060000,x + sta VRAM,x + inx + inx + cpx #$7d00 + bne titleScreenCopyLoop + + ; Set up sprite rendering + BITS8 + lda #3 + sta SpriteBankBank00+3 ; Tell compiled sprites what bank they are in + BITS16 + + ; Set up audio + jsr initSoundSystem + + ; Fade in + lda #titlePalette + sta PARAML2 + jsr paletteFade + +titleScreenMainLoop: + + ; Track animations + jsr nextVBL + lda titleAnimationCounter + inc + cmp TITLE_ANIMATION_FRAMES + jsr titleScreenResetAnimation + + ; Time animations of cats + lda animationDelay0 + dec + bne titleScreenStillCat + lda #CAT_DELAY + sta animationDelay0 + + ; Render next frame of cats + lda #titleAnimationPos0 + sta PARAML0 + ldx #TITLE_ANIMATION_FRAMES + ldy #30 + lda #ANIMATION_SIZE_16x32 + jsr renderAnimation + bra titleScreenNextCat + +titleScreenStillCat: + sta animationDelay0 + ldy #$5d79 + lda #29 + jsr drawSpriteBankSafe + +titleScreenNextCat: + lda animationDelay1 + dec + bne titleScreenStillCat2 + lda #CAT_DELAY + sta animationDelay1 + + lda #titleAnimationPos1 + sta PARAML0 + ldx #TITLE_ANIMATION_FRAMES + ldy #21 + lda #ANIMATION_SIZE_16x32 + jsr renderAnimation + bra titleScreenKeyboard + +titleScreenStillCat2: + sta animationDelay1 + ldy #$5da0 + lda #20 + jsr drawSpriteBankSafe + +titleScreenKeyboard: + ; Check for selection + jsr kbdScanTitle + lda menuActionRequested + beq titleScreenMainLoop + + jmp beginGameplay + +titleScreenResetAnimation: + stz titleAnimationCounter + rts + +titleAnimationCounter: + .word 0 +titleAnimationPos0: + .word 130,120 +titleAnimationPos1: + .word 208,120 +animationDelay0: + .word CAT_DELAY/2 +animationDelay1: + .word CAT_DELAY +menuActionRequested: + .word 0