From cd5eb31dc8143068a34427663134cf2fb7782c47 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Fri, 17 May 2024 06:35:01 -0700 Subject: [PATCH] Multiple F3DEX3 versions (#112) * Working on it * Loading ucode from ROM working * Menu implemented * Fixed ifdefs in debug * Fixed crashing * Cleanup * Suppressed make auto generated messages * Reorganized RSP wrapper assembly files * Fixed merge bug --- F3DEX3/F3DEX3_BrW.code.bps | Bin 0 -> 4663 bytes F3DEX3/F3DEX3_BrW.data.bps | Bin 0 -> 211 bytes F3DEX3/F3DEX3_BrW_NOC.code.bps | Bin 0 -> 4529 bytes F3DEX3/F3DEX3_BrW_NOC.data.bps | Bin 0 -> 216 bytes F3DEX3/F3DEX3_BrW_NOC_PA.code.bps | Bin 0 -> 4508 bytes F3DEX3/F3DEX3_BrW_NOC_PA.data.bps | Bin 0 -> 219 bytes F3DEX3/F3DEX3_BrW_NOC_PB.code.bps | Bin 0 -> 4461 bytes F3DEX3/F3DEX3_BrW_NOC_PB.data.bps | Bin 0 -> 219 bytes F3DEX3/F3DEX3_BrW_NOC_PC.code.bps | Bin 0 -> 4545 bytes F3DEX3/F3DEX3_BrW_NOC_PC.data.bps | Bin 0 -> 219 bytes F3DEX3/F3DEX3_BrW_PA.code.bps | Bin 0 -> 4648 bytes F3DEX3/F3DEX3_BrW_PA.data.bps | Bin 0 -> 214 bytes F3DEX3/F3DEX3_BrW_PB.code.bps | Bin 0 -> 4592 bytes F3DEX3/F3DEX3_BrW_PB.data.bps | Bin 0 -> 214 bytes F3DEX3/F3DEX3_BrW_PC.code.bps | Bin 0 -> 4680 bytes F3DEX3/F3DEX3_BrW_PC.data.bps | Bin 0 -> 214 bytes Makefile | 88 ++++++---- .../{rsp.rodata.f3dex3.s => f3dzex2.rodata.s} | 18 +- data/rsp.rodata.s | 22 ++- data/rsp.text.s | 22 --- data/rsp_boot.text.s | 14 -- include/config/config_debug.h | 4 +- include/config/config_graphics.h | 5 + include/debug/menu.h | 4 + include/functions.h | 3 + include/occlusionplanes.h | 11 ++ include/variables.h | 7 + include/z64.h | 4 + spec | 90 +++++++++- src/code/graph.c | 14 +- src/code/sched.c | 6 + src/code/sys_ucode.c | 109 ++++++++++++ src/debug/menu.c | 164 ++++++++++++------ 33 files changed, 423 insertions(+), 162 deletions(-) create mode 100644 F3DEX3/F3DEX3_BrW.code.bps create mode 100644 F3DEX3/F3DEX3_BrW.data.bps create mode 100644 F3DEX3/F3DEX3_BrW_NOC.code.bps create mode 100644 F3DEX3/F3DEX3_BrW_NOC.data.bps create mode 100644 F3DEX3/F3DEX3_BrW_NOC_PA.code.bps create mode 100644 F3DEX3/F3DEX3_BrW_NOC_PA.data.bps create mode 100644 F3DEX3/F3DEX3_BrW_NOC_PB.code.bps create mode 100644 F3DEX3/F3DEX3_BrW_NOC_PB.data.bps create mode 100644 F3DEX3/F3DEX3_BrW_NOC_PC.code.bps create mode 100644 F3DEX3/F3DEX3_BrW_NOC_PC.data.bps create mode 100644 F3DEX3/F3DEX3_BrW_PA.code.bps create mode 100644 F3DEX3/F3DEX3_BrW_PA.data.bps create mode 100644 F3DEX3/F3DEX3_BrW_PB.code.bps create mode 100644 F3DEX3/F3DEX3_BrW_PB.data.bps create mode 100644 F3DEX3/F3DEX3_BrW_PC.code.bps create mode 100644 F3DEX3/F3DEX3_BrW_PC.data.bps rename data/{rsp.rodata.f3dex3.s => f3dzex2.rodata.s} (59%) delete mode 100644 data/rsp.text.s delete mode 100644 data/rsp_boot.text.s create mode 100644 include/occlusionplanes.h diff --git a/F3DEX3/F3DEX3_BrW.code.bps b/F3DEX3/F3DEX3_BrW.code.bps new file mode 100644 index 0000000000000000000000000000000000000000..c3f077d75e99f6d9cae394fa70baf566d5037422 GIT binary patch literal 4663 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 literal 0 HcmV?d00001 diff --git a/F3DEX3/F3DEX3_BrW_NOC.code.bps b/F3DEX3/F3DEX3_BrW_NOC.code.bps new file mode 100644 index 0000000000000000000000000000000000000000..dad55dc1c701d919e5763d67d2a4f4ab467d7b20 GIT binary patch literal 4529 zcmZuvvBP%wdk zbJC`lUJQ(a4h)JtGTbkEWVzq;$Z>z@;o<(m!N3wK)G)7+c~(=SGFM~MP8o)V9$AK# z9yx}N9v+6CzGr6_FfiO#kY->|kPryqU|_$dz$I9-Phk35V{3*V%GLiPm=k8G&*Pjv zSGk1$0CV&OrFk`cMqYCoE5(@H@C6p`qcl28@Feqp9?-i{4KbJuwjDgkR z|Lk=?7+BaJFg{hbWMDMbo@~-^k%K`Zh-uLe1~v``mK%#+F|hM6u-upxGN*CIq^81# z-v%IKcPns9U74Q9zjF#J!(IkSp+n3{0!oXM_;)cdMl&#XKTzOcVA-X>Ej+={>;DfA z{#y*7Kx1@VR^K^SL7su(%@c@Z75jXhipdrnA6$efUpk@33!KgrOWp}||UH$X6f zf$4;}fR2}FPrBFt|4AqJDKL23Uu8G+W^nKpzqZ`lyeHke{(rK!iQi^#lf2FSS`Ct| zuP!PuddGiXF8+Yw&Z}Dr3?~>A7)~%LFrHvhU^>C3z&wGQ;l39GL)HW?rb;g+fmbIO zB^bR}6thk+OE7z}8NNEfD#5Co&A`aOYURZ6+Cqilm4%8~9|OY)b_wF>V<;4~B>IA0*rx#Ch)(LJ2 zZZE##S0{KScu(+4@Sot2;W)u1!*zm3hUWyI44=VjCI*ma6$C`?CPu-WCa>@NQ(peI zVDc_-FY@r>VDK&sD|{&~!|44XZjsOE8B>CB@jlWv>PhOK?^!j={_2e}fX7BmW-A_vJ zGkMGR_?@cYX7ZMA;b-7F$mI29e~PgLGq;!6)+~<@4hE1}C&l^MKxUmP=VtTz)zeqo z(8w^kVnUy6Q)EL}YO$dgGq-nHZn3EsgM-({{Vp#B`31c`9`}7!$SvsgVeh$@0{jAA zACB?AD&Q7)bybGr)I|lx{^Ewvrc<{R7`*F_@t(SE!QmbM_Z)*rB!l;t5M!e$1_s_G zF2;u01_oX-{qD>n2UNYJ_MT((4p8-yI>x_LfG_x*FpFC|3SykzX%UR4ONdCAE8ODHffc}-FGGn4OICECF5ub}wen9`{YR_i#eMsnI}(CV`@=g<__RtVE<%t zh=D;Ni$TIW{^vP`Yz7YR_@Dg>PX8Zx$NzUf;Vi*%!dZsnM4|%I2`34b6HYQLClVAG zyc*?w6p|U3yc)%Q6`UA2yc#6^M6&;X@oEs{7s>knRw0>zw#<>~ z!ZIhOOUs;@t}Jt4x~9O%z%gZ8;f_XuX-%z6*Jib}W=&bv(iq>@^j3kNCt&L9|Nj(U zec2`Hz_7|No54Xe;s0;N_y2G0Yv{E&&A`|iu<1ptnqa zmUm&qC+~uYjo$GQpSm|P4x36KZ zm&6jj6Xh06UJ`5kPgPqm^&jm$Q6a$E-_U!iOn`NAgKeWsPlC67i@LW=d#HDOPqMd6 zi@LXcLmQ}A^)A@&IwhMy#XITVSp~-b|Gf*2yBaKKWbjVf+H08of4_Huxy!QkOxL^% z?0uECGB9~3srxLMEYY}CkC%smH2{=)#Tfq2nwHT#mFXG>1MB<#BWt}_RJAx5*o3`U zb+cwo$!u_2wt(r{w8czU1P(B;PB_g}tH8;?$e8KD!ok4$O5xc5|DftcDd_(%1=jli zX6_6OQ(iG$YxQK1VpN@6JD;ZVYlft|I|4daG7{r$U{|S;;+WP;W=p_aw#bf{f znJr^rm~x!yn&?#qCdCsBOlBSo3{yFouC+X8kZRRrkYac_J#OJzQ+@^p)AI}rCg&I! zCU3B8I{p8j*=hy`!F&eUsfkS2M87gHDZXN0GV@|!n0kom+SJEP*QUBMT|1%5!F$4$ zi}yq-C+~@++`L|?nt`S#7#O@*HG{oc^%FciIT#Ez8CV1r7}!kn7#K_(85m5G7#K_z zGccI)F)*0=Gcb5G-eu^!bl0O9R9&*|QIMD7X_04K#{7VRLqX{Of4zo+j^5^M{+*Mh zXG%7_W?=PTyvyJveN#($uLFYz(>(?g6$S>7!X@&I%TA~XuzAV<(3vFA-MD*NQ{$Ar zu8F^kjHkHwb@e`IpOP`Hqqm2RVb7$F*5w|PS~?juJSMgE8fr6h&uVB??c3D1v6o?m zhH76&ufb9Si%A`wLh*fOch!1pV@1Cw5X>r~MzE8fQ*BKj~-JfnI}S46J<(cUcn{SiR%@jJ)gr zCwK{+S?(o#=DC;X+4Q~_y$vEvW#1ZF8Mbe0X$+s%)R;A`saL3hfqT*c$p+zRizf&( zm3s+Kdmz`qz~m)*ZLyc=y#*c;ml>Fa4=6E<98hCtU^uhraA*8qzR7xv`zG{vw8sDD zYUpWY*jCoi()j#YQ{$>xO|9+$(^?u|-D~Q7-0mIU*U|d4{aH)vqxM5Bt?~bswY0|n zE^26LRN`xFYPJ6{t)*4|hgd^PtNl+9^QTfnORw@A2F9RICREG8 zz%uRCGnsk?E&&Dw3H}BJVa9R}2KGA&A_5G`um1l~5N3{75E0Ml;pV@2O zvPO=fV+{{O&$@zzjSA12);6q>;eN43mix^bIqp8ehKXEjc(}jxaW$-)(W}4}z%Xy) ztOXkn^hogkP?q3+p&-)zVwO>JqxfX+xf8h@7#zB`88`ouXlRU^)ihB8)SMP;sA|~C zzlY(Gg#w5RYLrczGnIem6ceVVzMkHe|4fILb+mp6_}0?;Az)TZ8v2z$+HQTP6T z@8SebhPz%9)ZHdpRBqapB1pBm3$Vv#GkdhHNAt)nqLPA3Hgt&~5*M#?O zUK6hSdu{0V^V)FU-|NCLKCcUV&+{;_O*m<2k>&mWxx2UAJzp=ODO!RK4BTEndmK(~ zm&o8?U@JViT_yw6+!Z*$z@os#z~D8#jltV~y1RG%5q_`fE$S!D4Klsw|4%q+X_Prp z`@gfGE`x-ZLUWS(hx3G6*E*=Ma}gWWw}uj$X-y|zF1_qzV{yubkl zHm{%88X8Uh`+H0|!QlOW?;CH)y~iiBHJ*&$``GKoepjy_d(SIs{{P@5_}qO`&Bd$J zuXuR>zjwi4HG_b`76uN3RV)l%g7^A#8yuThy`=B0^4i$9*z4A{#a`0)vb<(JYX>=9 ztbu{aU?8dI_{%HdxKz;QjBpyZ61lCqNBf?~1+0 zz5f4C^!k49xp(}%$AS+39(qlD?taqTD8p;xbN`c82AN(LpZNDnH_Y{t+WXu~y!F8P z3#JWT`~N2ytma_wn%8;SiC>Jwexp&-r^zf5z^${TaWg!~cFz zID1R_8TB9B>n$5*=sh#e$a`*?p?7?pQNLwF_X@>kZSS~yzFrdhT^YEe7`()f`!R?t zZ157_@9%B@Z?3oezgUm%ZU(Pg&t1K4KKEykh;;JW_1xEENcL0EyAfkhylfm4C$|1|-3 z2FB?eJyTgc+DrI%?$T;#oHE_@_*U^9tzHalj1dA#ERO$5X9aDxY$#HYWMEL>V&L<( zXVqE2&T!v5o;^Wh$1)mJkVDw@-rhYP5gV{@bZSu(s z1qLs%rCKL56_~v3qmG>{;^6eQ59&Wz%pvI|36kfk_mTj~bMbrI_qd(Rkzn+;Z{a_g zE5Yiub#3xVKZ$y;Elagd`b#i-+s`|8GKY)V+kRUA$y_dBud8d5Pv&v3dR9<1TV>L?%wgs6TM{4rF%i6RJck$wP_x0lQ z_w(X&_xIwB_wnKl_x0k5_4DEh<@c7%cJr1@=J%GYKISc1-0vmr@8Tux?&~Gx@8>1u z?*BqmLextz-sgpggpikDxUZK$te=-aD8H9*zKfS|y04c|zMq#+I!K*}mtZ|eouHRs nxv!T%t)G`bDgO&m31JQfR@oOK5&~=AixN}w z6x7aHG%obZ%qvOFOUdUt@bABN X<;tNWHTI^mDzD^%Z*si+-!BXR?3-BP literal 0 HcmV?d00001 diff --git a/F3DEX3/F3DEX3_BrW_NOC_PA.code.bps b/F3DEX3/F3DEX3_BrW_NOC_PA.code.bps new file mode 100644 index 0000000000000000000000000000000000000000..16bcaeb2d22d8b96ac70666480c1b36b82f2d998 GIT binary patch literal 4508 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 S1lGRE$tm)RoFlTK^ArH3J&~XQ literal 0 HcmV?d00001 diff --git a/F3DEX3/F3DEX3_BrW_NOC_PA.data.bps b/F3DEX3/F3DEX3_BrW_NOC_PA.data.bps new file mode 100644 index 0000000000000000000000000000000000000000..4075990a341d56a821aea7dbf02976a4ea1aa101 GIT binary patch literal 219 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
    NWj}hxh+`7YtT22pDW( z;4oOl!r&!%&p|MOfz?a;-YTz+eT%(rU0duWeJ{&v*0Xky+r=6fm<)C>9PkqC%kmO$ zaS&!;;P#R__xyx}f~1!~>t%!03=ZD^p1XVB+j|1k-1V;5d)({)|3t6v_nv#l-+L_R z@b9kI#OLlO&5bg=Ha_=1X=RYY2CwNo z>E8RFy9*}#JL|o_x5ImXZ-bZEwg&J2+a0|3ZSw%hdC%M0!NI_)<0W~uNWQopU0H*3|@23`+EsYJ>dQE7>oDE zcf8((&v?BnukmCf1`wm;(+b@<;83TJOgKcoJGd%b1D483Q@ z8F|kwGxUzHGwQc&=w6}Ntl}Ma&(}+0zbgZG6oZ%eaX$u;g$-Wf`~AJ`|IPK5{}=1g z-Ob>2>$$7f&FB6M5|K_`yPo@cOzCIv+WFkyScE~|OXgai*%Sr^FPU@xj3oK&h6<}u|ogV)?+Yz!hxn7sDx;{}yyUUT>K zuP^D`>N2Ly>|c1A_t=1E04&tIh&;hWp;}>$-u7ZTC$l*Oy%@JH zKUu)V?j0|laI%m~+>1>t_+*d&jBClldH?-lBd5-tlflUXo`gcu8(^ z_l{ql=p}P5-CNSj&0Erm-&->3n73q5zZbv1ixlG@elKZ%7cXgdUoR literal 0 HcmV?d00001 diff --git a/F3DEX3/F3DEX3_BrW_NOC_PB.data.bps b/F3DEX3/F3DEX3_BrW_NOC_PB.data.bps new file mode 100644 index 0000000000000000000000000000000000000000..f8cdc3abb567f859c7fbc6ba835fb91e9cccf693 GIT binary patch literal 219 zcmZxXO)XrHnF7(UHD@n~u$>-YU+}QYMa!KP_CI%J3EuIYvm=YLnF)%RvVA#O8 zL2!!L5y2^KCJg%A_Tp;_Bht*|b%7 literal 0 HcmV?d00001 diff --git a/F3DEX3/F3DEX3_BrW_NOC_PC.code.bps b/F3DEX3/F3DEX3_BrW_NOC_PC.code.bps new file mode 100644 index 0000000000000000000000000000000000000000..cbdf6a60a374c58f95b783a2522a70142216b257 GIT binary patch literal 4545 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 E0D^~`zyJUM literal 0 HcmV?d00001 diff --git a/F3DEX3/F3DEX3_BrW_NOC_PC.data.bps b/F3DEX3/F3DEX3_BrW_NOC_PC.data.bps new file mode 100644 index 0000000000000000000000000000000000000000..a398eb2a865bde6ecda001f9cfe1d136e7b0d96f GIT binary patch literal 219 zcmZxXO)XrHnF7(UHD@n~u$>-YU+}QYMa!KP_CI%J3EuIYvm=YLnF)%RvVA#O8 zL2!!L4Z$hhrVIw$4icNoBGb$j&Rv0J`N`RR910 literal 0 HcmV?d00001 diff --git a/F3DEX3/F3DEX3_BrW_PA.code.bps b/F3DEX3/F3DEX3_BrW_PA.code.bps new file mode 100644 index 0000000000000000000000000000000000000000..79c320beb96b6afbba8832feda88b8239ac1f445 GIT binary patch literal 4648 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 literal 0 HcmV?d00001 diff --git a/F3DEX3/F3DEX3_BrW_PA.data.bps b/F3DEX3/F3DEX3_BrW_PA.data.bps new file mode 100644 index 0000000000000000000000000000000000000000..c2bef5814c6b10f89426ee75c8f44c6b8181300c GIT binary patch literal 214 zcmZxXO z)XrHnF7(UHD@n~u$>%!m*Vy=Ha?@HS1{Mc~dWQP{Oy7hzsWsTOFt#-|%vNZfKeO}y z{{@q+TPLYBPx{~Ze_q2z1_lOJUKSqi00su`fJsU%o(&6_5*ThVFfjaJ*uc0!aE^F^ z;G7;427PXO@h#;M8D{cwrlu1nOqkH$->=iJ-D}a`+uJ{zt9@rvQ`3YSTm5=2U%a^g UV1}Kktjep;3$=y#e(a6_01&%ZJOBUy literal 0 HcmV?d00001 diff --git a/F3DEX3/F3DEX3_BrW_PB.code.bps b/F3DEX3/F3DEX3_BrW_PB.code.bps new file mode 100644 index 0000000000000000000000000000000000000000..0f21a1a1925828ff1e3bebb4be1cb3f996f3ef87 GIT binary patch literal 4592 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 ub%I`k<-T45wSHa#rTi~MC4@N`SjAq5NCxXO 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 literal 0 HcmV?d00001 diff --git a/F3DEX3/F3DEX3_BrW_PC.data.bps b/F3DEX3/F3DEX3_BrW_PC.data.bps new file mode 100644 index 0000000000000000000000000000000000000000..3356cd5d80b179ef17d7d3923ba4851738a8795a GIT binary patch literal 214 zcmZxXO z)XrHnF7(UHD@n~u$>%!m*Vy=Ha?@HS1{Mc~dWQP{Oy7hzsWsTOFt#-|%vNZfKeO}y z{{@q+TPLYBPx{~Ze_q2z1_lOJUKSqi00su`fJsU%o(&6_5*ThVFfjaJ*uc0!aEf?= z;FNAt1_N#fiOpq^Y32&@W@i2U{r!D?eY$-*J(hhvJ$ $@ $(LDSCRIPT): $(BUILD_DIR)/$(SPEC) - $(call print,Linking:,$<,$@) + $(call print,Creating linker script:,$<,$@) $(V)$(MKLDSCRIPT) $< $@ $(BUILD_DIR)/undefined_syms.txt: undefined_syms.txt - $(call print,Compiling:,$<,$@) + $(call print,Preprocessing:,$<,$@) $(V)$(CPP) $(CPPFLAGS) $< > $@ $(BUILD_DIR)/baserom/%.o: $(EXTRACTED_DIR)/baserom/% + $(call print,Wrapping binary to ELF:,$<,$@) + $(V)$(OBJCOPY) -I binary -O elf32-big $< $@ + +$(BUILD_DIR)/F3DEX3/%.o: F3DEX3/% + $(call print,Wrapping binary to ELF:,$<,$@) + $(V)mkdir -p $(BUILD_DIR)/F3DEX3 $(V)$(OBJCOPY) -I binary -O elf32-big $< $@ $(BUILD_DIR)/data/%.o: data/%.s - $(call print,Relocating:,$<,$@) + $(call print,Assembling:,$<,$@) $(V)$(AS) $(ASFLAGS) $< -o $@ -$(BUILD_DIR)/data/rsp.rodata.f3dex3.o: F3DEX3/F3DEX3_BrW.code F3DEX3/F3DEX3_BrW.data - $(BUILD_DIR)/assets/text/%.enc.h: assets/text/%.h $(EXTRACTED_DIR)/text/%.h assets/text/charmap.txt - $(call print,Compiling:,$<,$@) + $(call print,Encoding:,$<,$@) $(V)$(CPP) $(CPPFLAGS) -I$(EXTRACTED_DIR) $< | $(PYTHON) tools/msgenc.py - --output $@ --charmap assets/text/charmap.txt # Dependencies for files including message data headers @@ -617,6 +617,20 @@ $(BUILD_DIR)/assets/%.bin.inc.c: assets/%.bin $(BUILD_DIR)/assets/%.jpg.inc.c: assets/%.jpg $(V)$(ZAPD) bren -eh -i $< -o $@ +F3DEX3/f3dzex2.code: + $(V)$(PYTHON) tools/data_extractor.py --start 0xBCD0F0 --size 0x1630 --input $(BASEROM_DIR)/baserom-decompressed.z64 --output $@ + +F3DEX3/f3dzex2.data: + $(V)$(PYTHON) tools/data_extractor.py --start 0xBCE720 --size 0x420 --input $(BASEROM_DIR)/baserom-decompressed.z64 --output $@ + +F3DEX3/F3DEX3%.code: F3DEX3/F3DEX3%.code.bps F3DEX3/f3dzex2.code + $(V)$(FLIPS) --apply F3DEX3/F3DEX3$*.code.bps F3DEX3/f3dzex2.code $@ + +F3DEX3/F3DEX3%.data: F3DEX3/F3DEX3%.data.bps F3DEX3/f3dzex2.data + $(V)$(FLIPS) --apply F3DEX3/F3DEX3$*.data.bps F3DEX3/f3dzex2.data $@ + +.PRECIOUS: $(UCODE_FILES) + -include $(DEP_FILES) # Print target for debugging diff --git a/data/rsp.rodata.f3dex3.s b/data/f3dzex2.rodata.s similarity index 59% rename from data/rsp.rodata.f3dex3.s rename to data/f3dzex2.rodata.s index 1af806e8f..48953bfbe 100644 --- a/data/rsp.rodata.f3dex3.s +++ b/data/f3dzex2.rodata.s @@ -9,24 +9,10 @@ .balign 16 -glabel aspMainDataStart - .incbin "baseroms/gc-eu-mq-dbg/baserom-decompressed.z64", 0xBCCE10, 0x2E0 -glabel aspMainDataEnd - glabel gspF3DZEX2_NoN_PosLight_fifoTextStart - .incbin "F3DEX3/F3DEX3_BrW.code" + .incbin "baseroms/gc-eu-mq-dbg/baserom-decompressed.z64", 0xBCD0F0, 0x1630 glabel gspF3DZEX2_NoN_PosLight_fifoTextEnd -.balign 16 glabel gspF3DZEX2_NoN_PosLight_fifoDataStart - .incbin "F3DEX3/F3DEX3_BrW.data" + .incbin "baseroms/gc-eu-mq-dbg/baserom-decompressed.z64", 0xBCE720, 0x420 glabel gspF3DZEX2_NoN_PosLight_fifoDataEnd -.balign 16 - -glabel gspS2DEX2d_fifoDataStart - .incbin "baseroms/gc-eu-mq-dbg/baserom-decompressed.z64", 0xBCEB40, 0x390 -glabel gspS2DEX2d_fifoDataEnd - -glabel njpgdspMainDataStart - .incbin "baseroms/gc-eu-mq-dbg/baserom-decompressed.z64", 0xBCEED0, 0x60 -glabel njpgdspMainDataEnd diff --git a/data/rsp.rodata.s b/data/rsp.rodata.s index f3df8983f..5d3f61ea8 100644 --- a/data/rsp.rodata.s +++ b/data/rsp.rodata.s @@ -9,22 +9,30 @@ .balign 16 +glabel rspbootTextStart + .incbin "baseroms/gc-eu-mq-dbg/baserom-decompressed.z64", 0x9F20, 0xD0 +glabel rspbootTextEnd + +glabel aspMainTextStart + .incbin "baseroms/gc-eu-mq-dbg/baserom-decompressed.z64", 0xB89260, 0xFB0 +glabel aspMainTextEnd + glabel aspMainDataStart .incbin "baseroms/gc-eu-mq-dbg/baserom-decompressed.z64", 0xBCCE10, 0x2E0 glabel aspMainDataEnd -glabel gspF3DZEX2_NoN_PosLight_fifoTextStart - .incbin "baseroms/gc-eu-mq-dbg/baserom-decompressed.z64", 0xBCD0F0, 0x1630 -glabel gspF3DZEX2_NoN_PosLight_fifoTextEnd - -glabel gspF3DZEX2_NoN_PosLight_fifoDataStart - .incbin "baseroms/gc-eu-mq-dbg/baserom-decompressed.z64", 0xBCE720, 0x420 -glabel gspF3DZEX2_NoN_PosLight_fifoDataEnd +glabel gspS2DEX2d_fifoTextStart + .incbin "baseroms/gc-eu-mq-dbg/baserom-decompressed.z64", 0xB8A210, 0x18C0 +glabel gspS2DEX2d_fifoTextEnd glabel gspS2DEX2d_fifoDataStart .incbin "baseroms/gc-eu-mq-dbg/baserom-decompressed.z64", 0xBCEB40, 0x390 glabel gspS2DEX2d_fifoDataEnd +glabel njpgdspMainTextStart + .incbin "baseroms/gc-eu-mq-dbg/baserom-decompressed.z64", 0xB8BAD0, 0xAF0 +glabel njpgdspMainTextEnd + glabel njpgdspMainDataStart .incbin "baseroms/gc-eu-mq-dbg/baserom-decompressed.z64", 0xBCEED0, 0x60 glabel njpgdspMainDataEnd diff --git a/data/rsp.text.s b/data/rsp.text.s deleted file mode 100644 index 045d8d614..000000000 --- a/data/rsp.text.s +++ /dev/null @@ -1,22 +0,0 @@ -.include "macro.inc" - -# assembler directives -.set noat # allow manual use of $at -.set noreorder # don't insert nops after branches -.set gp=64 # allow use of 64-bit general purpose registers - -.section .text - -.balign 16 - -glabel aspMainTextStart - .incbin "baseroms/gc-eu-mq-dbg/baserom-decompressed.z64", 0xB89260, 0xFB0 -glabel aspMainTextEnd - -glabel gspS2DEX2d_fifoTextStart - .incbin "baseroms/gc-eu-mq-dbg/baserom-decompressed.z64", 0xB8A210, 0x18C0 -glabel gspS2DEX2d_fifoTextEnd - -glabel njpgdspMainTextStart - .incbin "baseroms/gc-eu-mq-dbg/baserom-decompressed.z64", 0xB8BAD0, 0xAF0 -glabel njpgdspMainTextEnd diff --git a/data/rsp_boot.text.s b/data/rsp_boot.text.s deleted file mode 100644 index 01fe3f0a7..000000000 --- a/data/rsp_boot.text.s +++ /dev/null @@ -1,14 +0,0 @@ -.include "macro.inc" - -# assembler directives -.set noat # allow manual use of $at -.set noreorder # don't insert nops after branches -.set gp=64 # allow use of 64-bit general purpose registers - -.section .text - -.balign 16 - -glabel rspbootTextStart - .incbin "baseroms/gc-eu-mq-dbg/baserom-decompressed.z64", 0x9F20, 0xD0 -glabel rspbootTextEnd diff --git a/include/config/config_debug.h b/include/config/config_debug.h index 77770ca19..ddbe5abff 100644 --- a/include/config/config_debug.h +++ b/include/config/config_debug.h @@ -1,5 +1,5 @@ -#ifndef CONFIG_BOOTUP_H -#define CONFIG_BOOTUP_H +#ifndef CONFIG_DEBUG_H +#define CONFIG_DEBUG_H /****************** * DEBUG SETTINGS * diff --git a/include/config/config_graphics.h b/include/config/config_graphics.h index 8fb163b91..8dfb54218 100644 --- a/include/config/config_graphics.h +++ b/include/config/config_graphics.h @@ -1,3 +1,6 @@ +#ifndef CONFIG_GRAPHICS_H +#define CONFIG_GRAPHICS_H + /***************** * GAME SETTINGS * *****************/ @@ -53,3 +56,5 @@ // Increase the size of small elements (improves readability on N64) #define WIDESCREEN_N64_MODE true + +#endif diff --git a/include/debug/menu.h b/include/debug/menu.h index 26d3e55f4..8ff61dc50 100644 --- a/include/debug/menu.h +++ b/include/debug/menu.h @@ -10,6 +10,10 @@ typedef enum MenuSelection { MENU_MIN = -1, MENU_COLVIEW, MENU_HITVIEW, +#if ENABLE_F3DEX3 + MENU_F3DEX3_PROF, + MENU_F3DEX3_OCC, +#endif MENU_MAX } MenuSelection; diff --git a/include/functions.h b/include/functions.h index bb5dfce9f..14f9747cd 100644 --- a/include/functions.h +++ b/include/functions.h @@ -1465,6 +1465,9 @@ u64* SysUcode_GetUCodeBoot(void); size_t SysUcode_GetUCodeBootSize(void); u64* SysUcode_GetUCode(void); u64* SysUcode_GetUCodeData(void); +#if ENABLE_F3DEX3 +void SysUcode_LoadNewUcodeIfChanged(); +#endif NORETURN void func_800D31A0(void); void func_800D31F0(void); void func_800D3210(void); diff --git a/include/occlusionplanes.h b/include/occlusionplanes.h new file mode 100644 index 000000000..0adf16519 --- /dev/null +++ b/include/occlusionplanes.h @@ -0,0 +1,11 @@ +#ifndef OCCLUSIONPLANES_H +#define OCCLUSIONPLANES_H + +typedef enum F3DEX3OccMode { + F3DEX3_OCC_MODE_AUTO, + F3DEX3_OCC_MODE_ALWAYS, + F3DEX3_OCC_MODE_NEVER, + F3DEX3_OCC_MODE_COUNT +} F3DEX3OccMode; + +#endif diff --git a/include/variables.h b/include/variables.h index f533c2b9c..a9ad68375 100644 --- a/include/variables.h +++ b/include/variables.h @@ -232,6 +232,13 @@ extern volatile OSTime gRSPOtherTimeAcc; extern volatile OSTime D_8016A578; extern volatile OSTime gRDPTimeAcc; +#if ENABLE_F3DEX3 +extern u8 gF3DEX3TextBuffer[]; +extern volatile s8 gF3DEX3ProfVersion; +extern volatile s8 gF3DEX3NOCVersion; +extern s8 gF3DEX3OccMode; +#endif + extern SfxBankEntry D_8016BAD0[9]; extern SfxBankEntry D_8016BC80[12]; extern SfxBankEntry D_8016BEC0[22]; diff --git a/include/z64.h b/include/z64.h index dd92f477a..1be46adfd 100644 --- a/include/z64.h +++ b/include/z64.h @@ -66,6 +66,10 @@ #include "debug.h" #endif +#if ENABLE_F3DEX3 +#include "occlusionplanes.h" +#endif + #define SCREEN_WIDTH 320 #define SCREEN_HEIGHT 240 diff --git a/spec b/spec index 9146580f0..d8b713263 100644 --- a/spec +++ b/spec @@ -132,7 +132,6 @@ beginseg include "$(BUILD_DIR)/src/libultra/os/sethwintrroutine.o" include "$(BUILD_DIR)/src/libultra/os/gethwintrroutine.o" include "$(BUILD_DIR)/src/libultra/os/setwatchlo.o" - include "$(BUILD_DIR)/data/rsp_boot.text.o" #ifdef COMPILER_GCC include "$(BUILD_DIR)/src/gcc_fix/missing_gcc_functions.o" #endif @@ -616,11 +615,9 @@ beginseg include "$(BUILD_DIR)/src/code/z_game_over.o" include "$(BUILD_DIR)/src/code/z_construct.o" include "$(BUILD_DIR)/data/audio_tables.rodata.o" - include "$(BUILD_DIR)/data/rsp.text.o" -#if ENABLE_F3DEX3 - include "$(BUILD_DIR)/data/rsp.rodata.f3dex3.o" -#else include "$(BUILD_DIR)/data/rsp.rodata.o" +#if !ENABLE_F3DEX3 + include "$(BUILD_DIR)/data/f3dzex2.rodata.o" #endif include "$(BUILD_DIR)/src/code/rainbow.o" endseg @@ -646,6 +643,89 @@ beginseg include "$(BUILD_DIR)/src/buffers/audio_heap.o" endseg +#if ENABLE_F3DEX3 +beginseg + name "F3DEX3_BrW_Text" + compress + include "$(BUILD_DIR)/F3DEX3/F3DEX3_BrW.code.o" +endseg +beginseg + name "F3DEX3_BrW_Data" + compress + include "$(BUILD_DIR)/F3DEX3/F3DEX3_BrW.data.o" +endseg +beginseg + name "F3DEX3_BrW_PA_Text" + compress + include "$(BUILD_DIR)/F3DEX3/F3DEX3_BrW_PA.code.o" +endseg +beginseg + name "F3DEX3_BrW_PA_Data" + compress + include "$(BUILD_DIR)/F3DEX3/F3DEX3_BrW_PA.data.o" +endseg +beginseg + name "F3DEX3_BrW_PB_Text" + compress + include "$(BUILD_DIR)/F3DEX3/F3DEX3_BrW_PB.code.o" +endseg +beginseg + name "F3DEX3_BrW_PB_Data" + compress + include "$(BUILD_DIR)/F3DEX3/F3DEX3_BrW_PB.data.o" +endseg +beginseg + name "F3DEX3_BrW_PC_Text" + compress + include "$(BUILD_DIR)/F3DEX3/F3DEX3_BrW_PC.code.o" +endseg +beginseg + name "F3DEX3_BrW_PC_Data" + compress + include "$(BUILD_DIR)/F3DEX3/F3DEX3_BrW_PC.data.o" +endseg +beginseg + name "F3DEX3_BrW_NOC_Text" + compress + include "$(BUILD_DIR)/F3DEX3/F3DEX3_BrW_NOC.code.o" +endseg +beginseg + name "F3DEX3_BrW_NOC_Data" + compress + include "$(BUILD_DIR)/F3DEX3/F3DEX3_BrW_NOC.data.o" +endseg +beginseg + name "F3DEX3_BrW_NOC_PA_Text" + compress + include "$(BUILD_DIR)/F3DEX3/F3DEX3_BrW_NOC_PA.code.o" +endseg +beginseg + name "F3DEX3_BrW_NOC_PA_Data" + compress + include "$(BUILD_DIR)/F3DEX3/F3DEX3_BrW_NOC_PA.data.o" +endseg +beginseg + name "F3DEX3_BrW_NOC_PB_Text" + compress + include "$(BUILD_DIR)/F3DEX3/F3DEX3_BrW_NOC_PB.code.o" +endseg +beginseg + name "F3DEX3_BrW_NOC_PB_Data" + compress + include "$(BUILD_DIR)/F3DEX3/F3DEX3_BrW_NOC_PB.data.o" +endseg +beginseg + name "F3DEX3_BrW_NOC_PC_Text" + compress + include "$(BUILD_DIR)/F3DEX3/F3DEX3_BrW_NOC_PC.code.o" +endseg +beginseg + name "F3DEX3_BrW_NOC_PC_Data" + compress + include "$(BUILD_DIR)/F3DEX3/F3DEX3_BrW_NOC_PC.data.o" +endseg +#endif + beginseg name "ovl_title" compress diff --git a/src/code/graph.c b/src/code/graph.c index a8cff4367..c06b961a8 100644 --- a/src/code/graph.c +++ b/src/code/graph.c @@ -23,14 +23,20 @@ CfbInfo sGraphCfbInfos[3]; #if IS_DEBUG FaultClient sGraphUcodeFaultClient; +#if ENABLE_F3DEX3 +#define GRAPH_UCODE_GLOBAL_SYMBOL gF3DEX3TextBuffer +#else +#define GRAPH_UCODE_GLOBAL_SYMBOL gspF3DZEX2_NoN_PosLight_fifoTextStart +#endif + UCodeInfo D_8012D230[3] = { - { UCODE_F3DZEX, gspF3DZEX2_NoN_PosLight_fifoTextStart }, + { UCODE_F3DZEX, GRAPH_UCODE_GLOBAL_SYMBOL }, { UCODE_UNK, NULL }, { UCODE_S2DEX, gspS2DEX2d_fifoTextStart }, }; UCodeInfo D_8012D248[3] = { - { UCODE_F3DZEX, gspF3DZEX2_NoN_PosLight_fifoTextStart }, + { UCODE_F3DZEX, GRAPH_UCODE_GLOBAL_SYMBOL }, { UCODE_UNK, NULL }, { UCODE_S2DEX, gspS2DEX2d_fifoTextStart }, }; @@ -59,7 +65,7 @@ void Graph_DisassembleUCode(Gfx* workBuf) { disassembler.enableLog = R_UCODE_DISAS_LOG_LEVEL; UCodeDisas_RegisterUCode(&disassembler, ARRAY_COUNT(D_8012D230), D_8012D230); - UCodeDisas_SetCurUCode(&disassembler, gspF3DZEX2_NoN_PosLight_fifoTextStart); + UCodeDisas_SetCurUCode(&disassembler, GRAPH_UCODE_GLOBAL_SYMBOL); UCodeDisas_Disassemble(&disassembler, workBuf); @@ -98,7 +104,7 @@ void Graph_UCodeFaultClient(Gfx* workBuf) { UCodeDisas_Init(&disassembler); disassembler.enableLog = true; UCodeDisas_RegisterUCode(&disassembler, ARRAY_COUNT(D_8012D248), D_8012D248); - UCodeDisas_SetCurUCode(&disassembler, gspF3DZEX2_NoN_PosLight_fifoTextStart); + UCodeDisas_SetCurUCode(&disassembler, GRAPH_UCODE_GLOBAL_SYMBOL); UCodeDisas_Disassemble(&disassembler, workBuf); UCodeDisas_Destroy(&disassembler); } diff --git a/src/code/sched.c b/src/code/sched.c index d2ec1a445..5adf69d57 100644 --- a/src/code/sched.c +++ b/src/code/sched.c @@ -396,6 +396,12 @@ void Sched_RunTask(Scheduler* sc, OSScTask* spTask, OSScTask* dpTask) { Sched_TaskComplete(sc, spTask); return; } + + #if ENABLE_F3DEX3 + if (spTask->list.t.type == M_GFXTASK && !(spTask->state & OS_SC_YIELDED)) { + SysUcode_LoadNewUcodeIfChanged(); + } + #endif spTask->state &= ~(OS_SC_YIELD | OS_SC_YIELDED); // Write back data cache and load the OSTask into the RSP diff --git a/src/code/sys_ucode.c b/src/code/sys_ucode.c index 2be2566e8..0d7b9b513 100644 --- a/src/code/sys_ucode.c +++ b/src/code/sys_ucode.c @@ -1,7 +1,9 @@ #include "global.h" +#if !ENABLE_F3DEX3 u64* sDefaultGSPUCodeText = gspF3DZEX2_NoN_PosLight_fifoTextStart; u64* sDefaultGSPUCodeData = gspF3DZEX2_NoN_PosLight_fifoDataStart; +#endif u64* SysUcode_GetUCodeBoot(void) { return rspbootTextStart; @@ -11,10 +13,117 @@ size_t SysUcode_GetUCodeBootSize(void) { return (size_t)((u8*)rspbootTextEnd - (u8*)rspbootTextStart); } +#if ENABLE_F3DEX3 + +DECLARE_ROM_SEGMENT(F3DEX3_BrW_Text) +DECLARE_ROM_SEGMENT(F3DEX3_BrW_Data) +DECLARE_ROM_SEGMENT(F3DEX3_BrW_PA_Text) +DECLARE_ROM_SEGMENT(F3DEX3_BrW_PA_Data) +DECLARE_ROM_SEGMENT(F3DEX3_BrW_PB_Text) +DECLARE_ROM_SEGMENT(F3DEX3_BrW_PB_Data) +DECLARE_ROM_SEGMENT(F3DEX3_BrW_PC_Text) +DECLARE_ROM_SEGMENT(F3DEX3_BrW_PC_Data) +DECLARE_ROM_SEGMENT(F3DEX3_BrW_NOC_Text) +DECLARE_ROM_SEGMENT(F3DEX3_BrW_NOC_Data) +DECLARE_ROM_SEGMENT(F3DEX3_BrW_NOC_PA_Text) +DECLARE_ROM_SEGMENT(F3DEX3_BrW_NOC_PA_Data) +DECLARE_ROM_SEGMENT(F3DEX3_BrW_NOC_PB_Text) +DECLARE_ROM_SEGMENT(F3DEX3_BrW_NOC_PB_Data) +DECLARE_ROM_SEGMENT(F3DEX3_BrW_NOC_PC_Text) +DECLARE_ROM_SEGMENT(F3DEX3_BrW_NOC_PC_Data) + +static const u8* const sF3DEX3TextRomStartAddrs[8] = { + _F3DEX3_BrW_TextSegmentRomStart, + _F3DEX3_BrW_PA_TextSegmentRomStart, + _F3DEX3_BrW_PB_TextSegmentRomStart, + _F3DEX3_BrW_PC_TextSegmentRomStart, + _F3DEX3_BrW_NOC_TextSegmentRomStart, + _F3DEX3_BrW_NOC_PA_TextSegmentRomStart, + _F3DEX3_BrW_NOC_PB_TextSegmentRomStart, + _F3DEX3_BrW_NOC_PC_TextSegmentRomStart, +}; +static const u8* const sF3DEX3TextRomEndAddrs[8] = { + _F3DEX3_BrW_TextSegmentRomEnd, + _F3DEX3_BrW_PA_TextSegmentRomEnd, + _F3DEX3_BrW_PB_TextSegmentRomEnd, + _F3DEX3_BrW_PC_TextSegmentRomEnd, + _F3DEX3_BrW_NOC_TextSegmentRomEnd, + _F3DEX3_BrW_NOC_PA_TextSegmentRomEnd, + _F3DEX3_BrW_NOC_PB_TextSegmentRomEnd, + _F3DEX3_BrW_NOC_PC_TextSegmentRomEnd, +}; +static const u8* const sF3DEX3DataRomStartAddrs[8] = { + _F3DEX3_BrW_DataSegmentRomStart, + _F3DEX3_BrW_PA_DataSegmentRomStart, + _F3DEX3_BrW_PB_DataSegmentRomStart, + _F3DEX3_BrW_PC_DataSegmentRomStart, + _F3DEX3_BrW_NOC_DataSegmentRomStart, + _F3DEX3_BrW_NOC_PA_DataSegmentRomStart, + _F3DEX3_BrW_NOC_PB_DataSegmentRomStart, + _F3DEX3_BrW_NOC_PC_DataSegmentRomStart, +}; +static const u8* const sF3DEX3DataRomEndAddrs[8] = { + _F3DEX3_BrW_DataSegmentRomEnd, + _F3DEX3_BrW_PA_DataSegmentRomEnd, + _F3DEX3_BrW_PB_DataSegmentRomEnd, + _F3DEX3_BrW_PC_DataSegmentRomEnd, + _F3DEX3_BrW_NOC_DataSegmentRomEnd, + _F3DEX3_BrW_NOC_PA_DataSegmentRomEnd, + _F3DEX3_BrW_NOC_PB_DataSegmentRomEnd, + _F3DEX3_BrW_NOC_PC_DataSegmentRomEnd, +}; + +/* These can't be automatically determined from the files, because that is only +known at link time, whereas these sizes have to be known at compile time. */ +#define F3DEX3_TEXT_MAX_SIZE 6144 /* currently 6032 bytes */ +#define F3DEX3_DATA_MAX_SIZE 768 /* currently 726 bytes */ + +__attribute__((aligned(16))) u8 gF3DEX3TextBuffer[F3DEX3_TEXT_MAX_SIZE]; +__attribute__((aligned(16))) u8 gF3DEX3DataBuffer[F3DEX3_DATA_MAX_SIZE]; + +static s8 sLoadedF3DEX3Version = -1; +volatile s8 gF3DEX3ProfVersion = 0; +volatile s8 gF3DEX3NOCVersion = 0; +s8 gF3DEX3OccMode = 0; + +void SysUcode_LoadNewUcodeIfChanged() { + s8 ver = gF3DEX3ProfVersion | (gF3DEX3NOCVersion << 2); + if(sLoadedF3DEX3Version == ver) return; + ver &= 7; // make sure valid + + u8* vrom = sF3DEX3TextRomStartAddrs[ver]; + u32 size = sF3DEX3TextRomEndAddrs[ver] - vrom; + if(size > F3DEX3_TEXT_MAX_SIZE){ + Fault_AddHungupAndCrash("ucode_text_too_big", __LINE__); + return; + } + DMA_REQUEST_SYNC(gF3DEX3TextBuffer, vrom, size, "sys_ucode.c", __LINE__); + + vrom = sF3DEX3DataRomStartAddrs[ver]; + size = sF3DEX3DataRomEndAddrs[ver] - vrom; + if(size > F3DEX3_DATA_MAX_SIZE){ + Fault_AddHungupAndCrash("ucode_data_too_big", __LINE__); + return; + } + DMA_REQUEST_SYNC(gF3DEX3DataBuffer, vrom, size, "sys_ucode.c", __LINE__); + + sLoadedF3DEX3Version = ver; +} + +#endif + u64* SysUcode_GetUCode(void) { +#if ENABLE_F3DEX3 + return (u64*)gF3DEX3TextBuffer; +#else return sDefaultGSPUCodeText; +#endif } u64* SysUcode_GetUCodeData(void) { +#if ENABLE_F3DEX3 + return (u64*)gF3DEX3DataBuffer; +#else return sDefaultGSPUCodeData; +#endif } diff --git a/src/debug/menu.c b/src/debug/menu.c index 180036236..598a44a1d 100644 --- a/src/debug/menu.c +++ b/src/debug/menu.c @@ -9,6 +9,10 @@ u8 ColliderView_Draw(void* unused); static MenuElement sMenuElements[MENU_MAX] = { { "Collision View", true, NULL, NULL, (MenuFunc)CollisionView_Draw }, { "Collider View", true, NULL, NULL, (MenuFunc)ColliderView_Draw }, +#if ENABLE_F3DEX3 + { "F3DEX3 profiling: ", false, NULL, NULL, NULL }, + { "F3DEX3 occ plane: ", false, NULL, NULL, NULL }, +#endif }; void Menu_Init(Menu* this) { @@ -23,66 +27,93 @@ void Menu_Init(Menu* this) { } void Menu_Update(Menu* this) { - if (this->pInput != NULL && MENU_CAN_UPDATE) { - u16 curBtn = this->pInput->cur.button; - u16 pressBtn = this->pInput->press.button; - u8 isHoldingR = CHECK_BTN_ALL(curBtn, BTN_R); - u8 i; + if (this->pInput == NULL || !MENU_CAN_UPDATE) { + return; + } + u16 curBtn = this->pInput->cur.button; + u16 pressBtn = this->pInput->press.button; + u8 isHoldingR = CHECK_BTN_ALL(curBtn, BTN_R); + u8 pressDLeft = CHECK_BTN_ALL(pressBtn, BTN_DLEFT); + u8 pressDRight = CHECK_BTN_ALL(pressBtn, BTN_DRIGHT); + u8 i; - if (isHoldingR && CHECK_BTN_ALL(pressBtn, BTN_L)) { - this->bShow ^= 1; - } - - if (this->bShow && isHoldingR && CHECK_BTN_ALL(pressBtn, BTN_DLEFT)) { - this->bExecute = 0; - } - - if ((this->bShow && !isHoldingR) || this->bBackgroundExecution) { - if (!this->bExecute || this->bBackgroundExecution) { - if (this->bShow && !isHoldingR) { - if (CHECK_BTN_ALL(pressBtn, BTN_DUP)) { - this->eSelection--; - if (this->eSelection == MENU_MIN) { - this->eSelection = MENU_MAX - 1; - } - } - - if (CHECK_BTN_ALL(pressBtn, BTN_DDOWN)) { - this->eSelection++; - if (this->eSelection == MENU_MAX) { - this->eSelection = MENU_MIN + 1; - } - } - - if (CHECK_BTN_ALL(pressBtn, BTN_L)) { - if (this->eSelection == MENU_COLVIEW) { - this->bColViewEnabled ^= 1; - } else if (this->eSelection == MENU_HITVIEW) { - this->bHitboxViewEnabled ^= 1; - } else { - this->bExecute = 1; - } - - this->nTimer = 1; - this->bBackgroundExecution = this->bColViewEnabled || this->bHitboxViewEnabled; - } - } - - if (this->nTimer > 0) { - this->nTimer--; + if (isHoldingR && CHECK_BTN_ALL(pressBtn, BTN_L)) { + this->bShow ^= 1; + } + if (this->bShow && isHoldingR && CHECK_BTN_ALL(pressBtn, BTN_DLEFT)) { + this->bExecute = 0; + } + u8 editActive = this->bShow && !isHoldingR; + if (!editActive && !this->bBackgroundExecution) { + return; + } + + if (!this->bExecute || this->bBackgroundExecution) { + if (editActive) { + if (CHECK_BTN_ALL(pressBtn, BTN_DUP)) { + this->eSelection--; + if (this->eSelection == MENU_MIN) { + this->eSelection = MENU_MAX - 1; } } - if (this->bExecute || this->bBackgroundExecution) { - for (i = 0; i < ARRAY_COUNT(sMenuElements); i++) { - MenuElement elem = sMenuElements[this->eSelection]; - - this->bBackgroundExecution = elem.bToggle; - if ((elem.updateFunc != NULL) && (elem.pStruct != NULL) && !elem.updateFunc(elem.pStruct)) { - PRINTF("[HackerOoT:Menu]: an error occurred while trying to run the update function\n"); - } + if (CHECK_BTN_ALL(pressBtn, BTN_DDOWN)) { + this->eSelection++; + if (this->eSelection == MENU_MAX) { + this->eSelection = MENU_MIN + 1; } } + + #if ENABLE_F3DEX3 + if(this->eSelection == MENU_F3DEX3_PROF){ + if(pressDLeft && gF3DEX3ProfVersion > 0){ + gF3DEX3ProfVersion--; + } + if(pressDRight && gF3DEX3ProfVersion < 3){ + gF3DEX3ProfVersion++; + } + }else if(this->eSelection == MENU_F3DEX3_OCC){ + if(pressDLeft && gF3DEX3OccMode > 0){ + gF3DEX3OccMode--; + } + if(pressDRight && gF3DEX3OccMode < F3DEX3_OCC_MODE_COUNT-1){ + gF3DEX3OccMode++; + } + if(gF3DEX3OccMode == F3DEX3_OCC_MODE_ALWAYS){ + gF3DEX3NOCVersion = 0; + }else if(gF3DEX3OccMode == F3DEX3_OCC_MODE_NEVER){ + gF3DEX3NOCVersion = 1; + } + } + #endif + + if (CHECK_BTN_ALL(pressBtn, BTN_L)) { + if (this->eSelection == MENU_COLVIEW) { + this->bColViewEnabled ^= 1; + } else if (this->eSelection == MENU_HITVIEW) { + this->bHitboxViewEnabled ^= 1; + } else { + this->bExecute = 1; + } + + this->nTimer = 1; + this->bBackgroundExecution = this->bColViewEnabled || this->bHitboxViewEnabled; + } + } + + if (this->nTimer > 0) { + this->nTimer--; + } + } + + if (this->bExecute || this->bBackgroundExecution) { + for (i = 0; i < ARRAY_COUNT(sMenuElements); i++) { + MenuElement elem = sMenuElements[this->eSelection]; + + this->bBackgroundExecution = elem.bToggle; + if ((elem.updateFunc != NULL) && (elem.pStruct != NULL) && !elem.updateFunc(elem.pStruct)) { + PRINTF("[HackerOoT:Menu]: an error occurred while trying to run the update function\n"); + } } } } @@ -123,6 +154,7 @@ void Menu_Draw(Menu* this) { if (this->bShow && !this->bExecute) { u32 color; + const char* text = sMenuElements[index].name; if (this->pInput != NULL && !CHECK_BTN_ALL(this->pInput->cur.button, BTN_R) && CHECK_BTN_ALL(this->pInput->cur.button, BTN_L)) { @@ -130,8 +162,30 @@ void Menu_Draw(Menu* this) { } else { color = i == this->eSelection ? COLOR_BLUE2 : COLOR_WHITE; } + + #if ENABLE_F3DEX3 + char tempBuffer[100]; + if(i == MENU_F3DEX3_PROF){ + static const char* const profStrings[4] = { + "Default >", + "< A >", + "< B >", + "< C", + }; + sprintf(tempBuffer, "%s%s", text, profStrings[gF3DEX3ProfVersion]); + text = tempBuffer; + }else if(i == MENU_F3DEX3_OCC){ + static const char* const occStrings[F3DEX3_OCC_MODE_COUNT] = { + "Auto >", + "< Always >", + "< Never", + }; + sprintf(tempBuffer, "%s%s", text, occStrings[gF3DEX3OccMode]); + text = tempBuffer; + } + #endif - Print_Screen(print, 4, i + 5, color, sMenuElements[index].name); + Print_Screen(print, 4, i + 5, color, text); } if (this->bShow && this->bExecute) {