From f857a9e25878481956c134a52dd8026ea8d8cc26 Mon Sep 17 00:00:00 2001 From: sillysagiri Date: Wed, 17 Jul 2024 22:01:06 +0700 Subject: [PATCH] refactor --- .../index/fastlz.c.8A18BA9F336ADC07.idx | Bin 0 -> 4332 bytes .../index/fastlz.h.923513FC4EC1A70F.idx | Bin 0 -> 1246 bytes .../index/main.cpp.E75C1826F3CA04A7.idx | Bin 0 -> 7234 bytes .../index/raylibds.hpp.BEB3D2E4A936324F.idx | Bin 0 -> 5896 bytes .../index/rcore.cpp.B26817C90F5925C9.idx | Bin 0 -> 1812 bytes .../index/rshapes.cpp.A8EDB11A130CB5D0.idx | Bin 0 -> 8148 bytes .../index/rtextures.cpp.A33887F0F1FEC268.idx | Bin 0 -> 8398 bytes .gitignore | 30 +- .vscode/settings.json | 8 +- CMakeLists.txt | 48 --- Makefile | 293 ++++++++++++++++ arm7/CMakeLists.txt | 21 -- arm7/src/main.cpp | 99 ------ assets/convert.sh | 17 +- encoder/CMakeLists.txt | 2 +- encoder/main.cpp | 251 ++++++------- encoder/rle.c | 121 ------- icon.bmp | Bin 0 -> 1142 bytes libs/RaylibDS | 2 +- nitrofs/.keep | 0 src/main.cpp | 332 ++++++++---------- 21 files changed, 564 insertions(+), 660 deletions(-) create mode 100644 .cache/clangd/index/fastlz.c.8A18BA9F336ADC07.idx create mode 100644 .cache/clangd/index/fastlz.h.923513FC4EC1A70F.idx create mode 100644 .cache/clangd/index/main.cpp.E75C1826F3CA04A7.idx create mode 100644 .cache/clangd/index/raylibds.hpp.BEB3D2E4A936324F.idx create mode 100644 .cache/clangd/index/rcore.cpp.B26817C90F5925C9.idx create mode 100644 .cache/clangd/index/rshapes.cpp.A8EDB11A130CB5D0.idx create mode 100644 .cache/clangd/index/rtextures.cpp.A33887F0F1FEC268.idx delete mode 100755 CMakeLists.txt create mode 100644 Makefile delete mode 100755 arm7/CMakeLists.txt delete mode 100755 arm7/src/main.cpp delete mode 100644 encoder/rle.c create mode 100644 icon.bmp create mode 100644 nitrofs/.keep diff --git a/.cache/clangd/index/fastlz.c.8A18BA9F336ADC07.idx b/.cache/clangd/index/fastlz.c.8A18BA9F336ADC07.idx new file mode 100644 index 0000000000000000000000000000000000000000..530d611173351b35505df45154952d9d99186a63 GIT binary patch literal 4332 zcmZ9O2UJwY8prRT zHp93Fdv6F2S+`ukFpMtuKWbfM=q?U2FvD!fD)9@5c;u{iFDhQmY{r;}?4-4)ux9G^ zG1n88`O0$D#NA^L+4@-c?1C=M(>*@E*Rs8y-m}j2fu2)XQrYW@EZu({2d`V!U)bISd=dEd5(6S9u%OtH8KC=pL zO?At)EYSB)pJ?p(vu^2&=tyR+Wl7lVQysg%d-DAT#U`~(QFwxxd~(Hdd(q1+K?^<( zO6L9MH|@ogMzuUKfQ zaN2!CmGyR8(>~8tE+D0L^+Pl&zppXYbDx^us>MMUZ1RgXJ}|jnAoKajp~1_@O80}^ zFNujKKiAE&*=mso+Kio!)!g?wb=PpbSQvEVHyC;|r}@DA7xShS{W)P^t)QlCviFwP zS9jP%DOcT1o=`2gcWj^i{O+i_J(F}Yt@iI*R1|VWILF-cVug1=bbmtoEYF>adv%rd z_}gpI85OUaU-S;X_^Z36&12~tr=;9q%Ua=;%!;_aP0#O!M5!WoUvsc}7qn+d_njxc zC|wbHZB5IzB{_w6E|+RwYQ=5dmup1%^SggAn)6FHQ*_wv_+6~!A!JIOUwArtcziZ` zO=Qk5MR^@(R=D{`bp8INz~5@QeP_fp>3!dy_W9L4>r|T&n!CWH{@Sm2$(Z1N zj~+w6e1pb>e_P&KP#ig!4XZnTFdM3q# zId0b~dPS{Q~oocgP|d$2t`eQBMs;lUZ}YVH*KEb@MTaBI$Abv+-J zn)Tki>DW=>w)y+`xaj!xQBfZTlVqsO@rOTe`jBkBGA6yL!T(8@LruiWg@YPV6KjeWUv=C4*{=4S%9l=d$~eskcU4DE zZSl3nhF1`LG5+(QN89)+gnFNX9gGrh;}?s3|zHY zGU-@oRm{cOq;)Bc$=RcvA1b`Qxnk3#HF1jE<=oBEUn}pa7KI-d29{5Gbb5bJeOP9g zW_j4NWS8z`tuNP4k4-APe_Z90HTT`A;K5^k1LDo+A8a@As@<_~R_#P_O8hv5{mQO3 z6j9&5c+!J#o3b~3X1DW%4XeIA9JXL_+0T`k3l|;v*wi6-^RT?qb_rslV!{L6A;Y-b zwmD|LX0i!pCNm713vezl92vO&HS}-cbFGVWeGJSnW5r1_pdbSpj0{9#=({UG zX2x-n<4ABE8H@}>61Y*=)3_**lh|;QekABea(jh9A!jr+)WK8>V6Qg*;EL8QetS8| zcuo?41LQ*wvVxia9e2h-<%k(aE?fn)tAO#yKqMaR`lV`N7bak45+^AE+9hDr$Ur0_ z^Xgcu)z!Y3vE?KkNYH`w?dJ&Q=rbB3H8ivj-<4&vwKfDU#mp2=60IF=GV~xTL|qEE zJ-4EIIcA)=a0S$^fW{*Okvt4N+bc113BimVCsAUh@z8^WyUG?yEgj%W%vf{br%3P= z$?O*i7ReY5p#To;q4)fx!8@j5t1)BANg9Bl0qBhkWR(bUmc_}>!4}L+;3Toyv4%qr z58dgu`|sOJTML$$O9;NfPlD zCmc2v74{-|FBKAZ0r7~nh>&XCWIx=Ak;Wc+B2qL+ z{EuS6Y#~%HgnBd;w~+cRq(@Rgiitb#a3zuT$%eW0hUEgHoRm@;Fir#J)aYrz zF%39VE&;+4phbL&Ih#%_0n_>HS^|`mtAMZyXpsWIoc|S7z@2g<5H$iR{YZ_#v=LZQ zehfs9`SB(oYU1+~AbP^*rvN?$8g%|spz{cs3Me^Z5XT2cQPkAAmXspb_PR5FX^m^C8aXHLeAUJv;|sGZiS*&e!LBe+W6cK zMeTfk2H`WPLFYe%I?tdHy#6pVz=L*#Xkj$3Bg6`0d6k_EG~mInbkhW z@8PEl6SEmel0ol9%w{7=Hf54f?m`{@Jw{(#4g}>uhh#W1By9QLv8c$PDDGDzgV=~K zJX^o{?RF)!cVO(vG=_1Ye+GpIhsik{Z8%0^s)x0uTAFernW4cb9bJ86a}%){^FMU_ B0~Y`Q literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/fastlz.h.923513FC4EC1A70F.idx b/.cache/clangd/index/fastlz.h.923513FC4EC1A70F.idx new file mode 100644 index 0000000000000000000000000000000000000000..bceee08cffdcb84d3259784e3238706d319af632 GIT binary patch literal 1246 zcmWIYbaT7L!oc91;#rZKT9OE4G6(^2aY<2T95Vw$AqN9P#hj%fzWKK;1itRvpTrld z5UCM1X_@5@F_oK2H_Ui1F>!whx^T%u&8w5i{!MAuzwdUFCh69{VRH3fc66rs=X*Bi zo`_ytn`d?S+N1?LFC8_%Bs%pF=Oo>otdEy}?t8Xx)r|=m-bQcsWajSK@~L$q!;D4k z4~-7`y!`yFPTVDGldSlrNs1M|UAJ%PCNVWg-8^;7e7B|`d!_jG%i$fI7jEqibawU|5XiH-QZUOU0ZZ-s)@ z?TH2%Do?K8+0?ix`_nY-^(!td*u&sca#QT3(Jv>~hXOfM;})K+47d}hJ3Z&%vDRzH zMSBW@+!^JzK2|7JGAT-4F)7h%tHDw(yX%>ACPs**3T3HYW0bd0?JwFpHFxfdpW6x+ zCOudgw=eJTgtoZl!cXqqwYR;0|6a|${jZO6x;0M8QK@n84}#v8Fi&&6vLPbl^jopo%VOtLnKuha_>07`87ysLcd~5V$b6unIqD*hm@_*= zjC93eZ^w&AlD+e`hXtRTx(q$HFzTi@di58{{5@;;>#Acmd#7Y>v5{2!|EQ8(p0Ucs zmkrFWte>Kj#y@$letvlP@MG-1itn29yFdAq+%VZWsd)DPR;Ks+pR7DrV(55z^8Cd{ zA6<$obCZ&Rxh<)N{q5bTByAoB9v}|{_-t5gBpEn4*%bW;;wA3`VbOVLuIOODE!q=6Pzn#6Gw+<*Q!66|46BhgZ;?#0h)4op3zpegzs;jH2>*x`K1`O!w!Z6_p zgECVSGvXu+!)VEWdPdr`-&ls3s$`hVO*PS}LvM7^w3J-iadvi}r1FUO%%lEEwquqp z+0U6h--YQioIKPxuI8M2kRI2 z8z*%*lcT)H4L;+s1Nx1+EU8ZPo3QZK6ra32=HQYA z%Nv62ire-LPx6SF-n-ZJx0e3ga$i@c_{|#@4I5mZKj|xnu(Ia(;zcvBoXCB=eR8k2 zxiWdX2W;?8LfBIU7D2zL*z0Rl0UfuN`q#w%kG4+>z^t z1P)v`XVtCo9w*ig+LyG)J|H{cYfZ+3n?JC7ob9i>H6L?NdcX2=l=i^Bwa*j6ixWdj z&cQB^zo$eF;biac&b4`;$ZUJ>?ffbvy~CkHKRuZ^BWl5o8`u7-9pM|cdTDdJX@7*a zkNDqGwfgkVC#qjP0@LCSAIa^%>EfB2t2SP@Sliy~P1(M){nEa1YSR5W=6Um(wcjk; zk-ch7ajO4&w;}62x0U_UzuB!Q@ltW*Nr)f+pIbkE`%7fX%kb!#8?(QzS^sBGzk~p< zg6B(99+q6W5c1WMlAXD`zs~e=`tIc=t5-uBzwe=)9zMBRayeqxz0jRAqCdD5Uap?# zc6#CI?rpwU*);ELcEt}9Ybu^f(k?YA-F}KvMi%{`x_=}hQBf(^=BBztzq{aEIpU3})~>$!zR|~-)4@SU9DC0W?tE{{u61iKTio_JWBqc% z@)b<_ywu6hEEwiSdDE@ixzDWCtdD`=T^wE9O#|_K)1Slazm7Q!ZnD*|!36e@d#FqU z!higJxBU9;R0kCk$T0kH#c)T{fbhJq*wM8|t`j(bz(Zt1G^PRJl9=@|_H#U3RLnpE zM@ym|O#{NkfdM}biw$sBF+B)8LNUV5G$8C;G5hbJpNiZ$ragi8gJeJ0@(vOQTU;W#K4CXy@|ryl2I8W8q2-uiFRkN4Vfj3(o=Veza2JP* z`Uiicjpdl$g!x3tL`&0v@VKAvoP9jDcoN49M&??n)&}7%Cz|8qKG-B{*j|KrdwF}c zX+U@~Oqlk0hC_~q4JU9Xc_%B=fN+nC!Z?jp&^dWmkN+PwU0pY!YmHQgvkL*w} z5d{8R^0~$|AiSn(`fHh@c8`kbOW?th!FHwrVSg9-@}UE-ea|so1ilZ_`=I4@Qk@V? zO@H9q?b_4LffZ`D9}&()Xpm_cOs(bCZlrUBsv(@&RbR_IU3Sq}m`$((ei0pU8&+?IW} zT`q)7_>U=(1#|WOquXIH$Bl>QA4xFWY7`u)y(& zkf_4xq0{`oj|zApA=6txxdj{$xL}AHUsc;#PJrFO?gk|S9}~UD`yDzUCqnwFeZ?!y z@xkg~kx~q)ES)+mOC{lWJ)@V4=Hd0u`gW9R1f~(p&_-}>1QEvoC{daMA9@JKyR+^J z^fr#~!S+z#wc_{z>;MH`aR1)b%B%Cn*^)Cn2Y60*Iz4@E@%e~dwnV%lV2ePGhvWDv zu&4q{F@o`r03Lx%ygK|7fG3p3AS_dwf-e=($I?elg<1->OTme5QV4d1;7sX*pgRbT zbkj<(tpq2eF_cS{twK1lJxsTuOlGmOw3K=R@+aUxWs7K)Q2)ZLfjwmMR34|jZaWHaa>C8YU;w3rYk^}828zZzcf-llV z(HFM&{ZQ#l7V10c{mgx%QzMA<-Ox=LR^HXl#FPn;Ai6K+DNwe`Pa}_ZmKZ)hb|b4Z zG#R3zF>T3}t_$1ek$W#CHb3eZ-78`_5B>p)WnE@H~!>p@db zX$nJ^iL~-wT=RZyg&$H`A zrYETpVE6s?LIsV7@qInp|m zoNTUouGxLfQfG-&h%BPW^FH5)FkKJQ^&sw6(G;H?1U$| z&;ZZ?TD<6}EQ^1OC>jB;f%+QQphs~064rVNt3^-wFd_PxPx*)8gkKZLo4^HuP7AV6 z)t``#B0v%(iQ!FQEwRacR5Y4Q$3wg*@3U`fI(~fXHikuy4Q;g`7ELq1Oe8xFVTMRBLUVi+ z6D7g=!l&U)`YEqFiR9~DV7Cj}pu9U&O*^ZG)=eQmoK2jVYDV|CG{$z&xFj;&4Dx1h zMX|9=C1w+9RBE=amR+ssb?9Z;%Ni{lJuK8o@%Usi;Z+7u24bGrY31;t&-gbfCZX6} zG(7E|-88G1m(L);29Rz5(VC%M0vE)NdYUGY@H1eBSmsFhIWWhJ%7jcaYCg;tsjt5Z zwGSzO@de>r3{XrR7)2+!QYfzJxe7pC0A~4dC0MTn@j`I?VX!{jI#6nkgDqOU%s4;I zfAT#eG0qx*HPmVx{}$M{phCUozpj2dYWUx|N{%1S43}f-=J*lJ2s!2-jvvX4lw(my z^0?h}F=&uvWRt8%r{MS$ZHgnMilAQ+45oAy^s9owD5a2u-Jd{vyqg^V53v7$0)>0- z@WE-zZ?0>lLe_#hP}AF44^VGTzXSFiSmTErZ)CyPI_|RttcVYA-kV$w6V?%PlmnDg zbKF@cZF%T_Mgabejp(m|od(8!Id}1TqR={+TnDMvgD;W)1OJ%Z8vzAd3BP!Cyr}jW$IjY;`@OA1o>H(Y zg%0%l7a)HD&ZvrmBfhTx_Fm?VlRcr(>QeGUXd1lnZLR7IjrpCAA za$geLNR{KW9Y`Df@84&)_v^TvHs2FqGr(rrQ|KP1+Ah`=3cxl{Zll&iPnIZJHL5~Y z#xA4FIKBcbDrh;N{M6mz#@$>i|9Y+Mv!C$K2gnC0TGw^K`B@J)oZC;-kl~Wyj_U=% zJ+=dRz4-TU&*0yJoB!^2$RwZbHd+ok+7~{1*SF;m`949NAQqbBzCd3i48?84#+r08 zq^qV;sSVdgLpvFRlfex;3XV5)G5Ax;Pwl6rR`QqmE6pgizZn*06K01N$; zLl0sIGK5gd+sa#mxrpQaWPVokSYei7qAQYv$og2(gM`b%%_-|}v1$_nN@yMQLvIwk zGqm2EHnKiOwkuu{jxS(+3s|w!h>>^xHEG=Dqr}#65T`-ipq0p75S}*htP;~R1ins4 zOw~FT?^gmB-(0MFRZTd31IlkemV&aBZivg3%2ux?9KRGSmzrn60$>Zwqti0*Uk0J51CBok@`Ip7 z`wLmq;xMQwT>$|V5Ju@b=vD_I=BDUYZ%$tW_8O=V-;`H*A|!m)MbefFWdZ7iGnECD z63PNf31tCNXj9UEm_Pmq!Owmx?Ln2FUWo9sh+z%~F7`fjiQM8Ekko(;J-};VU(-A& zb!}TRUncDCq za3{f@(k-BD0bBGHFlVyyry23Sm6fYe>d+oJY-{(=A-z-|L=Ke6;9)q(IBNDr0*DQ3<5Y<9L; z9a98~BHI25$5d3AAFCRyszFbWX=JU9tk_oxVNO%PiVeWsRpFW#WAIBNn-T1c;D-8> z4V+tATl>pv0%W^od*SqIukQ@|^>5#k>2)AoM{_TemY5PJoFF|dK0Q|WAvR$Q<0sIj zKMTJ0z1M_MOP`&Q`*!i`?BBH;FudZm@xzN5}f*GA{AYpZLgbG2{)XXgK++ENMt literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/raylibds.hpp.BEB3D2E4A936324F.idx b/.cache/clangd/index/raylibds.hpp.BEB3D2E4A936324F.idx new file mode 100644 index 0000000000000000000000000000000000000000..8309768db60d51eea4c90310ea9288f77e441cde GIT binary patch literal 5896 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 E7jsa9-~a#s literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/rshapes.cpp.A8EDB11A130CB5D0.idx b/.cache/clangd/index/rshapes.cpp.A8EDB11A130CB5D0.idx new file mode 100644 index 0000000000000000000000000000000000000000..3aa5daa26ed05ddb7492aa7c3f2fbd7c98309321 GIT binary patch literal 8148 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 literal 0 HcmV?d00001 diff --git a/.gitignore b/.gitignore index af7e047..61d738d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,27 +1,13 @@ -/assets/*.* -/assets/out/*.bmp +/assets/* +/assets/out/* !/assets/convert.sh -/build +/build/* /build* -/resource/image.bin -/resource/music.raw -/resource/palette.bin +/nitrofs/image.bin +/nitrofs/music.raw +/nitrofs/palette.bin -/.cache - -/NDS/nitrofiles/* -!/NDS/nitrofiles/.gitignore -/NDS/cmake -/NDS/compile_commands.json -/NDS/.cache -/NDS/build -/NDS/dist - -/encoder/node_modules -/encoder/data_compress -/encoder/temp -/encoder/cpp/lzss - -/temp +compile_commands.json +*.nds \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 9ba109b..3d382b2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,9 @@ { "clangd.arguments": [ - "--query-driver=/opt/devkitpro/devkitARM/bin/arm-none-eabi-g++" - ] + "--query-driver=/opt/wonderful/toolchain/gcc-arm-none-eabi/bin/arm-none-eabi-*" + ], + "files.exclude": { + ".cache": true, + "build": true + } } \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100755 index feb000e..0000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,48 +0,0 @@ -cmake_minimum_required(VERSION 3.27) - -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_EXPORT_COMPILE_COMMANDS ON) - -set(PROJECT_NAME "badapple") - -set(NDSTOOL_NAME ${PROJECT_NAME} CACHE BOOL "") -set(NDSTOOL_SUBTITLE1 "Created by sillysagiri" CACHE BOOL "") -set(NDSTOOL_SUBTITLE2 "sillysagiri.my.id" CACHE BOOL "") -set(NDSTOOL_NITROFS "resource" CACHE BOOL "") - -message(STATUS "Downloading fastlz library") -include(FetchContent) -FetchContent_Declare(fastlz URL https://git.sillysagiri.my.id/MirrorRepo/FastLZ/archive/master.zip) -FetchContent_MakeAvailable(fastlz) - -set(NDSTOOL_ARM7 "${CMAKE_BINARY_DIR}/arm7/arm7.elf" CACHE BOOL "") -# set(NDSTOOL_ARM9 arm9 CACHE BOOL "") - -project(${PROJECT_NAME}) - -file(GLOB_RECURSE PROJECT_SOURCES CONFIGURE_DEPENDS - "src/*.cpp" - ${fastlz_SOURCE_DIR}/fastlz.c) - -set(PROJECT_INCLUDE - "src" - ${fastlz_SOURCE_DIR}) - -set(PROJECT_VENDOR - "filesystem" - "fat" - "mm9") - -add_executable(${PROJECT_NAME} ${PROJECT_SOURCES}) -target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_INCLUDE}) -target_link_libraries(${PROJECT_NAME} PUBLIC ${PROJECT_VENDOR}) - -nds_create_rom(${PROJECT_NAME}) - -# yeah i know its stupid, but its working!! -add_custom_command( - TARGET ${PROJECT_NAME} PRE_BUILD - COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/arm7 - COMMAND ${DEVKITPRO}/portlibs/nds/bin/arm-none-eabi-cmake -S ${CMAKE_SOURCE_DIR}/arm7 ${CMAKE_BINARY_DIR}/arm7 - COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/arm7 -) \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..9cd4266 --- /dev/null +++ b/Makefile @@ -0,0 +1,293 @@ +# SPDX-License-Identifier: CC0-1.0 +# +# SPDX-FileContributor: Antonio Niño Díaz, 2023 + +export BLOCKSDS ?= /opt/blocksds/core +export BLOCKSDSEXT ?= /opt/blocksds/external + +export WONDERFUL_TOOLCHAIN ?= /opt/wonderful +ARM_NONE_EABI_PATH ?= $(WONDERFUL_TOOLCHAIN)/toolchain/gcc-arm-none-eabi/bin/ + +# User config +# =========== + +NAME := badapple + +GAME_TITLE := Bad Apple +GAME_SUBTITLE := Built with BlocksDS +GAME_AUTHOR := sillysagiri +GAME_ICON := icon.bmp + +# DLDI and internal SD slot of DSi +# -------------------------------- + +# Root folder of the SD image +SDROOT := sdroot +# Name of the generated image it "DSi-1.sd" for no$gba in DSi mode +SDIMAGE := image.bin + +# Source code paths +# ----------------- + +SOURCEDIRS := src libs/FastLZ/fastlz.c libs/RaylibDS +INCLUDEDIRS := src libs/FastLZ libs/RaylibDS +GFXDIRS := +BINDIRS := +AUDIODIRS := +# A single directory that is the root of NitroFS: +NITROFSDIR := nitrofs + +# Defines passed to all files +# --------------------------- + +DEFINES := -DARM9 + +# Libraries +# --------- + +LIBS := -lmm9 -lnds9 +LIBDIRS := $(BLOCKSDS)/libs/maxmod \ + $(BLOCKSDS)/libs/libnds + +# Build artifacts +# --------------- + +BUILDDIR := build/$(NAME) +ELF := build/$(NAME).elf +DUMP := build/$(NAME).dump +MAP := build/$(NAME).map +ROM := $(NAME).nds + +# If NITROFSDIR is set, the output of mmutil will be placed in that directory +SOUNDBANKINFODIR := $(BUILDDIR)/maxmod +ifeq ($(strip $(NITROFSDIR)),) + SOUNDBANKDIR := $(BUILDDIR)/maxmod +else + SOUNDBANKDIR := $(NITROFSDIR) +endif + +# Tools +# ----- + +PREFIX := $(ARM_NONE_EABI_PATH)arm-none-eabi- +CC := $(PREFIX)gcc +CXX := $(PREFIX)g++ +LD := $(PREFIX)gcc +OBJDUMP := $(PREFIX)objdump +MKDIR := mkdir +RM := rm -rf + +# Verbose flag +# ------------ + +ifeq ($(VERBOSE),1) +V := +else +V := @ +endif + +# Source files +# ------------ + +ifneq ($(BINDIRS),) + SOURCES_BIN := $(shell find -L $(BINDIRS) -name "*.bin") + INCLUDEDIRS += $(addprefix $(BUILDDIR)/,$(BINDIRS)) +endif +ifneq ($(GFXDIRS),) + SOURCES_PNG := $(shell find -L $(GFXDIRS) -name "*.png") + INCLUDEDIRS += $(addprefix $(BUILDDIR)/,$(GFXDIRS)) +endif +ifneq ($(AUDIODIRS),) + SOURCES_AUDIO := $(shell find -L $(AUDIODIRS) -regex '.*\.\(it\|mod\|s3m\|wav\|xm\)') + ifneq ($(SOURCES_AUDIO),) + INCLUDEDIRS += $(SOUNDBANKINFODIR) + endif +endif + +SOURCES_S := $(shell find -L $(SOURCEDIRS) -name "*.s") +SOURCES_C := $(shell find -L $(SOURCEDIRS) -name "*.c") +SOURCES_CPP := $(shell find -L $(SOURCEDIRS) -name "*.cpp") + +# Compiler and linker flags +# ------------------------- + +ARCH := -mthumb -mcpu=arm946e-s+nofp + +SPECS := $(BLOCKSDS)/sys/crts/ds_arm9.specs + +WARNFLAGS := -Wall + +ifeq ($(SOURCES_CPP),) + LIBS += -lc +else + LIBS += -lstdc++ -lc +endif + +INCLUDEFLAGS := $(foreach path,$(INCLUDEDIRS),-I$(path)) \ + $(foreach path,$(LIBDIRS),-I$(path)/include) + +LIBDIRSFLAGS := $(foreach path,$(LIBDIRS),-L$(path)/lib) + +ASFLAGS += -x assembler-with-cpp $(DEFINES) $(INCLUDEFLAGS) \ + $(ARCH) -ffunction-sections -fdata-sections \ + -specs=$(SPECS) + +CFLAGS += -std=gnu17 $(WARNFLAGS) $(DEFINES) $(INCLUDEFLAGS) \ + $(ARCH) -O2 -ffunction-sections -fdata-sections \ + -specs=$(SPECS) + +CXXFLAGS += -std=gnu++17 $(WARNFLAGS) $(DEFINES) $(INCLUDEFLAGS) \ + $(ARCH) -O2 -ffunction-sections -fdata-sections \ + -fno-exceptions -fno-rtti \ + -specs=$(SPECS) + +LDFLAGS := $(ARCH) $(LIBDIRSFLAGS) -Wl,-Map,$(MAP) $(DEFINES) \ + -Wl,--start-group $(LIBS) -Wl,--end-group -specs=$(SPECS) + +# Intermediate build files +# ------------------------ + +OBJS_ASSETS := $(addsuffix .o,$(addprefix $(BUILDDIR)/,$(SOURCES_BIN))) \ + $(addsuffix .o,$(addprefix $(BUILDDIR)/,$(SOURCES_PNG))) + +HEADERS_ASSETS := $(patsubst %.bin,%_bin.h,$(addprefix $(BUILDDIR)/,$(SOURCES_BIN))) \ + $(patsubst %.png,%.h,$(addprefix $(BUILDDIR)/,$(SOURCES_PNG))) + +ifneq ($(SOURCES_AUDIO),) + ifeq ($(strip $(NITROFSDIR)),) + OBJS_ASSETS += $(SOUNDBANKDIR)/soundbank.c.o + endif + HEADERS_ASSETS += $(SOUNDBANKINFODIR)/soundbank.h +endif + +OBJS_SOURCES := $(addsuffix .o,$(addprefix $(BUILDDIR)/,$(SOURCES_S))) \ + $(addsuffix .o,$(addprefix $(BUILDDIR)/,$(SOURCES_C))) \ + $(addsuffix .o,$(addprefix $(BUILDDIR)/,$(SOURCES_CPP))) + +OBJS := $(OBJS_ASSETS) $(OBJS_SOURCES) + +DEPS := $(OBJS:.o=.d) + +# Targets +# ------- + +.PHONY: all clean dump dldipatch sdimage + +all: $(ROM) + +ifneq ($(strip $(NITROFSDIR)),) +# Additional arguments for ndstool +NDSTOOL_ARGS := -d $(NITROFSDIR) + +# Make the NDS ROM depend on the filesystem only if it is needed +$(ROM): $(NITROFSDIR) +endif + +# Combine the title strings +ifeq ($(strip $(GAME_SUBTITLE)),) + GAME_FULL_TITLE := $(GAME_TITLE);$(GAME_AUTHOR) +else + GAME_FULL_TITLE := $(GAME_TITLE);$(GAME_SUBTITLE);$(GAME_AUTHOR) +endif + +$(ROM): $(ELF) + @echo " NDSTOOL $@" + $(V)$(BLOCKSDS)/tools/ndstool/ndstool -c $@ \ + -7 $(BLOCKSDS)/sys/default_arm7/arm7.elf -9 $(ELF) \ + -b $(GAME_ICON) "$(GAME_FULL_TITLE)" \ + $(NDSTOOL_ARGS) + +$(ELF): $(OBJS) + @echo " LD $@" + $(V)$(LD) -o $@ $(OBJS) $(LDFLAGS) + +$(DUMP): $(ELF) + @echo " OBJDUMP $@" + $(V)$(OBJDUMP) -h -C -S $< > $@ + +dump: $(DUMP) + +clean: + @echo " CLEAN" + $(V)$(RM) $(ROM) $(DUMP) build $(SDIMAGE) \ + $(SOUNDBANKDIR)/soundbank.bin + +sdimage: + @echo " MKFATIMG $(SDIMAGE) $(SDROOT)" + $(V)$(BLOCKSDS)/tools/mkfatimg/mkfatimg -t $(SDROOT) $(SDIMAGE) + +dldipatch: $(ROM) + @echo " DLDIPATCH $(ROM)" + $(V)$(BLOCKSDS)/tools/dldipatch/dldipatch patch \ + $(BLOCKSDS)/sys/dldi_r4/r4tf.dldi $(ROM) + +# Rules +# ----- + +$(BUILDDIR)/%.s.o : %.s + @echo " AS $<" + @$(MKDIR) -p $(@D) + $(V)$(CC) $(ASFLAGS) -MMD -MP -c -o $@ $< + +$(BUILDDIR)/%.c.o : %.c + @echo " CC $<" + @$(MKDIR) -p $(@D) + $(V)$(CC) $(CFLAGS) -MMD -MP -c -o $@ $< + +$(BUILDDIR)/%.arm.c.o : %.arm.c + @echo " CC $<" + @$(MKDIR) -p $(@D) + $(V)$(CC) $(CFLAGS) -MMD -MP -marm -mlong-calls -c -o $@ $< + +$(BUILDDIR)/%.cpp.o : %.cpp + @echo " CXX $<" + @$(MKDIR) -p $(@D) + $(V)$(CXX) $(CXXFLAGS) -MMD -MP -c -o $@ $< + +$(BUILDDIR)/%.arm.cpp.o : %.arm.cpp + @echo " CXX $<" + @$(MKDIR) -p $(@D) + $(V)$(CXX) $(CXXFLAGS) -MMD -MP -marm -mlong-calls -c -o $@ $< + +$(BUILDDIR)/%.bin.o $(BUILDDIR)/%_bin.h : %.bin + @echo " BIN2C $<" + @$(MKDIR) -p $(@D) + $(V)$(BLOCKSDS)/tools/bin2c/bin2c $< $(@D) + $(V)$(CC) $(CFLAGS) -MMD -MP -c -o $(BUILDDIR)/$*.bin.o $(BUILDDIR)/$*_bin.c + +$(BUILDDIR)/%.png.o $(BUILDDIR)/%.h : %.png %.grit + @echo " GRIT $<" + @$(MKDIR) -p $(@D) + $(V)$(BLOCKSDS)/tools/grit/grit $< -ftc -W1 -o$(BUILDDIR)/$* + $(V)$(CC) $(CFLAGS) -MMD -MP -c -o $(BUILDDIR)/$*.png.o $(BUILDDIR)/$*.c + $(V)touch $(BUILDDIR)/$*.png.o $(BUILDDIR)/$*.h + +ifneq ($(SOURCES_AUDIO),) + +$(SOUNDBANKINFODIR)/soundbank.h: $(SOURCES_AUDIO) + @echo " MMUTIL $^" + @$(MKDIR) -p $(@D) + @$(BLOCKSDS)/tools/mmutil/mmutil $^ -d \ + -o$(SOUNDBANKDIR)/soundbank.bin -h$(SOUNDBANKINFODIR)/soundbank.h + +ifeq ($(strip $(NITROFSDIR)),) +$(SOUNDBANKDIR)/soundbank.c.o: $(SOUNDBANKINFODIR)/soundbank.h + @echo " BIN2C soundbank.bin" + $(V)$(BLOCKSDS)/tools/bin2c/bin2c $(SOUNDBANKDIR)/soundbank.bin \ + $(SOUNDBANKDIR) + @echo " CC.9 soundbank_bin.c" + $(V)$(CC) $(CFLAGS) -MMD -MP -c -o $(SOUNDBANKDIR)/soundbank.c.o \ + $(SOUNDBANKDIR)/soundbank_bin.c +endif + +endif + +# All assets must be built before the source code +# ----------------------------------------------- + +$(SOURCES_S) $(SOURCES_C) $(SOURCES_CPP): $(HEADERS_ASSETS) + +# Include dependency files if they exist +# -------------------------------------- + +-include $(DEPS) diff --git a/arm7/CMakeLists.txt b/arm7/CMakeLists.txt deleted file mode 100755 index 9eb3196..0000000 --- a/arm7/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -cmake_minimum_required(VERSION 3.10) - -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_EXPORT_COMPILE_COMMANDS ON) - -# armv5te arm9 -# armv4t arm7 -set(CMAKE_SYSTEM_PROCESSOR "armv4t") - -project(arm7) - -set(PROJECT_INCLUDE - "src") - -file(GLOB PROJECT_SOURCES CONFIGURE_DEPENDS - "src/*.cpp" - "src/**/*.cpp") - -add_executable(arm7 ${PROJECT_SOURCES}) -target_include_directories(arm7 PRIVATE ${PROJECT_INCLUDE}) -target_link_libraries(arm7 PUBLIC dswifi7 mm7 filesystem fat) diff --git a/arm7/src/main.cpp b/arm7/src/main.cpp deleted file mode 100755 index cc23440..0000000 --- a/arm7/src/main.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/*--------------------------------------------------------------------------------- - - default ARM7 core - - Copyright (C) 2005 - 2010 - Michael Noland (joat) - Jason Rogers (dovoto) - Dave Murphy (WinterMute) - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any - damages arising from the use of this software. - - Permission is granted to anyone to use this software for any - purpose, including commercial applications, and to alter it and - redistribute it freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you - must not claim that you wrote the original software. If you use - this software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - - 2. Altered source versions must be plainly marked as such, and - must not be misrepresented as being the original software. - - 3. This notice may not be removed or altered from any source - distribution. - ----------------------------------------------------------------------------------*/ -#include -#include -#include -#include -#include -#include -#include - -static FILE *in_music = NULL; - - -void VblankHandler(void) { - Wifi_Update(); -} - - -void VcountHandler() { - inputGetAndSend(); -} - -volatile bool exitflag = false; - -void powerButtonCB() { - exitflag = true; -} - - - -int main() { - // clear sound registers - dmaFillWords(0, (void*)0x04000400, 0x100); - - REG_SOUNDCNT |= SOUND_ENABLE; - writePowerManagement(PM_CONTROL_REG, ( readPowerManagement(PM_CONTROL_REG) & ~PM_SOUND_MUTE ) | PM_SOUND_AMP ); - powerOn(POWER_SOUND); - - readUserSettings(); - ledBlink(0); - - irqInit(); - // Start the RTC tracking IRQ - initClockIRQ(); - fifoInit(); - touchInit(); - - mmInstall(FIFO_MAXMOD); - - SetYtrigger(80); - - installWifiFIFO(); - installSoundFIFO(); - - installSystemFIFO(); - - irqSet(IRQ_VCOUNT, VcountHandler); - irqSet(IRQ_VBLANK, VblankHandler); - - irqEnable( IRQ_VBLANK | IRQ_VCOUNT | IRQ_NETWORK); - - setPowerButtonCB(powerButtonCB); - - // Keep the ARM7 mostly idle - while (!exitflag) { - if ( 0 == (REG_KEYINPUT & (KEY_A | KEY_B))) { - exitflag = true; - } - swiWaitForVBlank(); - } - return 0; -} diff --git a/assets/convert.sh b/assets/convert.sh index 642a5f5..b0f428d 100644 --- a/assets/convert.sh +++ b/assets/convert.sh @@ -1,18 +1,15 @@ #!/bin/sh palette="palette.png" -video="video.mp4" +video="video.webm" +# output="video_out.gif" output="out/out_%d.bmp" -filters="fps=60,scale=256x192" -skip="-t 1 -ss 00:8" +filters="scale=256x192:flags=lanczos:force_original_aspect_ratio=decrease,pad=256:192:-1:-1:color=black" -# old -ffmpeg -i $video -vf "$filters,palettegen=max_colors=256:reserve_transparent=" -y $palette -ffmpeg -i $video -i $palette -lavfi "$filters [x]; [x][1:v] paletteuse=dither=none" -y $output - -# unreleased -# ffmpeg -i $video -vf "$filters" out/out_%d.bmp +# video +ffmpeg -i $video -vf "$filters,palettegen=max_colors=256:reserve_transparent=0:stats_mode=diff" -y $palette +ffmpeg -i $video -i $palette -filter_complex "$filters,setpts=0.8*PTS[x];[x][1:v]paletteuse=dither=none" -y $output # audio -ffmpeg -i $video -f s16le -ac 1 -ar 22050 music.raw \ No newline at end of file +ffmpeg -i $video -f s16le -filter:a "atempo=1.25" -vn -ac 1 -ar 22050 -y music.raw \ No newline at end of file diff --git a/encoder/CMakeLists.txt b/encoder/CMakeLists.txt index 9c4ee00..70cebb7 100644 --- a/encoder/CMakeLists.txt +++ b/encoder/CMakeLists.txt @@ -9,7 +9,7 @@ project(${PROJECT_NAME}) message(STATUS "Downloading fastlz library") include(FetchContent) -FetchContent_Declare(fastlz URL https://git.sillysagiri.my.id/MirrorRepo/FastLZ/archive/master.zip) +FetchContent_Declare(fastlz URL https://github.com/ariya/FastLZ/archive/refs/heads/master.zip) FetchContent_MakeAvailable(fastlz) file(GLOB_RECURSE PROJECT_SOURCES CONFIGURE_DEPENDS diff --git a/encoder/main.cpp b/encoder/main.cpp index 577f086..a1c1f5f 100644 --- a/encoder/main.cpp +++ b/encoder/main.cpp @@ -1,13 +1,8 @@ + #include -#include #include -#include #include #include -#include -#include -#include -#include #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" @@ -15,177 +10,132 @@ extern "C" char *RLE_Code(unsigned char *raw_buffer, int raw_len, int *new_len); -unsigned short RGB15(int r, int g, int b); +#define RGBtoRGB15(r,g,b) (((r >> 3) & 0x1F) | (((g >> 3) & 0x1F) << 5) | (((b >> 3) & 0x1F) << 10)) +#define ASSETS_PATH "../assets" -std::string path_out = "../assets/out/"; -std::string path_palette = "../assets/palette.png"; -std::string path_resource = "../resource"; -std::string path_images = "../assets/out/out_"; -std::string path_test = "../assets/out/out_3667.bmp"; +#define PALETTE_SIZE 256 +#define FRAME_SIZE 256*192 +#define CHUNK_SIZE 10 -std::vector usingRLE = {999999}; -// std::vector usingRLE = {840, 841, 842, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1041, 1459, 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, 1472, 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487, 1488, 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, 1513, 1514, 1515, 1516, 1517, 1518, 1519, 1520, 1521, 1522, 1523, 1524, 1525, 1526, 1527, 1528, 1532, 1533, 1534, 1535, 1536, 1537, 1538, 1539, 1540, 1541, 1542, 1543, 1544, 1545, 1546, 1547, 1548, 1549, 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1598, 1599, 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, 1626, 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, 1656, 1657, 1658, 1659, 1660, 1661, 1664, 1666, 1719, 1720, 1723, 1724, 1725, 1726, 1727, 1728, 1729, 1730, 1731, 1732, 1733, 1734, 1735, 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1746, 1747, 1748, 1749, 1750, 1751, 1752, 1753, 1754, 1755, 1756, 1757, 1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783, 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1791, 1792, 1793, 1794, 1795, 1796, 1797, 1798, 1799, 1800, 1801, 1802, 1803, 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, 1814, 1815, 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853, 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, 1864, 1865, 1866, 1867, 1868, 1869, 1870, 1871, 1872, 1873, 1874, 1875, 1876, 1877, 1878, 1879, 1880, 1881, 1882, 1883, 1884, 1885, 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927, 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1943, 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 3191, 3192, 3193, 3196, 3197, 3198, 3225, 3227, 3228, 3229}; +uint16_t palette_buffer[PALETTE_SIZE]; +size_t chunk_counter = 0; +size_t chunk_current = 0; -constexpr int palette_size = 256; -uint16_t palette_map[palette_size]; +size_t frame_total = 0; +uint8_t frame_buffer[FRAME_SIZE*CHUNK_SIZE]; -constexpr int chunk_size = 10; -volatile int chunk_counter = 0; -volatile int chunk_current = 0; - -constexpr int frame_size = 256*192; -volatile int frame_total = -1; -volatile int frame_counter = 0; -uint8_t frame_map[frame_size*chunk_size]; - -uint32_t compress_size, compress_flag; -volatile int compress_size_biggest; -uint8_t compress_data[frame_size*chunk_size*2]; +uint32_t compress_size; +uint32_t compress_size_total; +size_t compress_size_biggest; +uint8_t compress_buffer[FRAME_SIZE*CHUNK_SIZE*2]; std::ofstream file_out; +void Frame_RAWtoRGB15(unsigned char *frame, unsigned char *dest); + int main() { printf("Finding total frame..."); // Find total frame - for (const auto& entry : std::filesystem::directory_iterator(path_out)) { + for (const auto& entry : std::filesystem::directory_iterator(ASSETS_PATH "/out/")) { if (entry.is_regular_file()) { std::string filename = entry.path().filename().string(); - - if (filename.substr(0, 4) == "out_" && filename.substr(filename.size() - 4) == ".bmp") { - int number = std::stoi(filename.substr(4, filename.size() - 8)); - - if (number > frame_total) { - frame_total = number; - } + int extpos = filename.find(".bmp", 4); + if (extpos != std::string::npos) + { + int number = std::stoi(filename.substr(4, extpos-4)); + if (number > frame_total) frame_total = number; } } } // Generate palette - printf("Generating palette map..."); - int temp_w, temp_h, temp_n; - unsigned char *palette_raw = stbi_load(path_palette.c_str(), &temp_w, &temp_h, &temp_n, 3); - - for (int i=0; i %i,%i,%i (%i)\n", i, r, g, b, palette[i]); + palette_buffer[i] = RGBtoRGB15(r, g, b); } - printf("Writing palette map..."); - file_out.open(path_resource + "/palette.bin", std::ios::binary); - file_out.write(reinterpret_cast(palette_map), sizeof(palette_map)); + printf("Writing palette map...\n"); + file_out.open(ASSETS_PATH "/palette.bin", std::ios::binary); + file_out.write(reinterpret_cast(palette_buffer), sizeof(palette_buffer)); file_out.close(); - printf("Generating image map..."); + printf("Generating image map...\n"); std::stringstream ss; - int fastlz_total = 0; - int raw_total = 0; - int rle_total = 0; - file_out.open(path_resource + "/image.bin", std::ios::binary); + file_out.open(ASSETS_PATH "/image.bin", std::ios::binary); - for (frame_counter=1; frame_counter<=frame_total; frame_counter++) + // Calculate the number of complete iterations needed + int numIterations = frame_total / CHUNK_SIZE; + + // Calculate the number of remaining items + int remainingItems = frame_total % CHUNK_SIZE; + + for (int i=0; i palette not found!!!\n", frame_counter); - else frame_map[rgb + chunk_counter*frame_size] = palette_index; + Frame_RAWtoRGB15(frame_raw, &frame_buffer[i_chunk*FRAME_SIZE]); + } + + compress_size = fastlz_compress_level(1, frame_buffer, FRAME_SIZE*CHUNK_SIZE, compress_buffer); + if ((compress_size) > compress_size_biggest) compress_size_biggest = compress_size; + compress_size_total += compress_size; + + file_out.write(reinterpret_cast(&compress_size), sizeof(uint32_t)); + file_out.write(reinterpret_cast(compress_buffer), compress_size); + + printf("write chunk %i bytes %i/%i\n", compress_size, i, numIterations-1); + } + + // Handle remaining frame + if (remainingItems > 0) { + memset(frame_buffer, 0, FRAME_SIZE*CHUNK_SIZE); + + int i_chunk = 0; + for (int k = frame_total-remainingItems; k done\n", chunk_counter, frame_counter, frame_total, ((float)frame_counter/frame_total)*100, "%"); - chunk_counter++; + compress_size = fastlz_compress_level(1, frame_buffer, FRAME_SIZE*CHUNK_SIZE, compress_buffer); + if ((compress_size) > compress_size_biggest) compress_size_biggest = compress_size; + compress_size_total += compress_size; - if (chunk_counter >= chunk_size) - { + file_out.write(reinterpret_cast(&compress_size), sizeof(uint32_t)); + file_out.write(reinterpret_cast(compress_buffer), compress_size); - bool isRLE = false; - - for (auto y : usingRLE) - if (chunk_current == y) - isRLE = true; - - if (isRLE) - { - char *temp = RLE_Code(compress_data, frame_size*chunk_size, (int*)&compress_size); - compress_flag = (compress_size << 2) | 0xfffffffd; - - if (compress_size > frame_size*chunk_size) - { - free(temp); - compress_size = frame_size*chunk_size; - compress_flag = (compress_size << 2) | 0xfffffffe; - memcpy(compress_data, frame_map, compress_size); - printf("raw > "); - raw_total++; - } - else - { - memcpy(compress_data, temp, compress_size); - free(temp); - - printf("rle > "); - rle_total++; - } - } - else - { - compress_size = fastlz_compress_level(1, frame_map, frame_size*chunk_size, compress_data); - compress_flag = (compress_size << 2); - - if (compress_size > frame_size*chunk_size) - { - compress_size = frame_size*chunk_size; - compress_flag = (compress_size << 2) | 0xfffffffe; - memcpy(compress_data, frame_map, compress_size); - printf("raw > "); - raw_total++; - } - else - { - printf("fastlz > "); - fastlz_total++; - } - } - - file_out.write(reinterpret_cast(&compress_flag), sizeof(uint32_t)); - file_out.write(reinterpret_cast(compress_data), compress_size); - - chunk_counter = 0; - if ((compress_size) > compress_size_biggest) compress_size_biggest = compress_size; - printf("write batch %i %i/%i\n", compress_size, chunk_current, frame_total/chunk_size); - - chunk_current++; - } + printf("write remaining chunk %i bytes\n", compress_size); } file_out.close(); @@ -193,19 +143,30 @@ int main() // Print printf("Total Frame: %i\n", frame_total); printf("Biggest : %i\n", compress_size_biggest); - printf("fastlz : %i\n", fastlz_total); - printf("rle : %i\n", rle_total); - printf("raw : %i\n", raw_total); + printf("Total Size : %1.fmb\n", static_cast(compress_size_total) / (1024*1024)); } -unsigned short RGB15(int r, int g, int b) { - unsigned short rgb15 = - ((r >> 3) << 10) | - ((g >> 3) << 5) | - (b >> 3); +void Frame_RAWtoRGB15(unsigned char *frame, unsigned char *dest) +{ + for (int rgb=0; rgb. --*/ -/*----------------------------------------------------------------------------*/ - -/*----------------------------------------------------------------------------*/ -#include -#include -#include - -/*----------------------------------------------------------------------------*/ -#define CMD_DECODE 0x00 // decode -#define CMD_CODE_30 0x30 // RLE magic number - -#define RLE_CHECK 1 // bits to check -#define RLE_MASK 0x80 // bits position: - // ((((1 << RLE_CHECK) - 1) << (8 - RLE_CHECK) -#define RLE_LENGTH 0x7F // length, (0xFF & ~RLE_MASK) - -#define RLE_THRESHOLD 2 // max number of bytes to not encode -#define RLE_N 0x80 // max store, (RLE_LENGTH + 1) -#define RLE_F 0x82 // max coded, (RLE_LENGTH + RLE_THRESHOLD + 1) - -#define RAW_MINIM 0x00000000 // empty file, 0 bytes -#define RAW_MAXIM 0x00FFFFFF // 3-bytes length, 16MB - 1 - -#define RLE_MINIM 0x00000004 // header only (empty RAW file) -#define RLE_MAXIM 0x01400000 // 0x01020003, padded to 20MB: - // * header, 4 - // * length, RAW_MAXIM - // * flags, (RAW_MAXIM + RLE_N - 1) / RLE_N - // 4 + 0x00FFFFFF + 0x00020000 + padding - -/*----------------------------------------------------------------------------*/ -#define BREAK(text) { printf(text); return; } -#define EXIT(text) { printf(text); exit(-1); } - -/*----------------------------------------------------------------------------*/ -void Title(void); -void Usage(void); - -char *Load(char *filename, int *length, int min, int max); -void Save(char *filename, char *buffer, int length); -char *Memory(int length, int size); - -void RLE_Decode(char *filename); -void RLE_Encode(char *filename); -char *RLE_Code(unsigned char *raw_buffer, int raw_len, int *new_len); - - -/*----------------------------------------------------------------------------*/ -char *Memory(int length, int size) { - char *fb; - - fb = (char *) calloc(length, size); - if (fb == NULL) EXIT("\nMemory error\n"); - - return(fb); -} - -/*----------------------------------------------------------------------------*/ -char *RLE_Code(unsigned char *raw_buffer, int raw_len, int *new_len) { - unsigned char *pak_buffer, *pak, *raw, *raw_end, store[RLE_N]; - unsigned int pak_len, len, store_len, count; - - pak_len = 4 + raw_len + ((raw_len + RLE_N - 1) / RLE_N); - pak_buffer = (unsigned char *) Memory(pak_len, sizeof(char)); - - *(unsigned int *)pak_buffer = CMD_CODE_30 | (raw_len << 8); - - pak = pak_buffer + 4; - raw = raw_buffer; - raw_end = raw_buffer + raw_len; - - store_len = 0; - while (raw < raw_end) { - for (len = 1; len < RLE_F; len++) { - if (raw + len == raw_end) break; - if (*(raw + len) != *raw) break; - } - - if (len <= RLE_THRESHOLD) store[store_len++] = *raw++; - - if ((store_len == RLE_N) || (store_len && (len > RLE_THRESHOLD))) { - *pak++ = store_len - 1; - for (count = 0; count < store_len; count++) *pak++ = store[count]; - store_len = 0; - } - - if (len > RLE_THRESHOLD) { - *pak++ = RLE_MASK | (len - (RLE_THRESHOLD + 1)); - *pak++ = *raw; - raw += len; - } - } - if (store_len) { - *pak++ = store_len - 1; - for (count = 0; count < store_len; count++) *pak++ = store[count]; - } - - *new_len = pak - pak_buffer; - - return(pak_buffer); -} - -/*----------------------------------------------------------------------------*/ -/*-- EOF Copyright (C) 2011 CUE --*/ -/*----------------------------------------------------------------------------*/ diff --git a/icon.bmp b/icon.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c5a571c41273844de1d8b28c22c88b1e1ca67591 GIT binary patch literal 1142 zcma)4yH3O~5Zv21i9c@Psc9MtAyCK{5%O{od0w(}t}J>r@$G`HU2?Wga zs4ex2)E@$b*9@k|1bo^cGMoyJ`mukRa8VRhRn>A#g_r&W6TP-Md>}y2u|LrtK_2oD zIILi`g44kMAYl-fCnoovz1PAn@yWkq`4c~MW`h*|5C1Kc)A5LY=D!&g{k01M-d5#& za1Qbe_rv_RRpAfy=Kq3T{U7zQzcIi0Z_DHUM*olSX@l5;-VaSM(U1PufARAJw(67n MlNJvC@P85E2SFHJ6aWAK literal 0 HcmV?d00001 diff --git a/libs/RaylibDS b/libs/RaylibDS index d93b30d..a55a77f 160000 --- a/libs/RaylibDS +++ b/libs/RaylibDS @@ -1 +1 @@ -Subproject commit d93b30d1b1f60d10adac7734b2d2cef8aee581f7 +Subproject commit a55a77fd3e960f472655ee3b9bbe9329202c8a50 diff --git a/nitrofs/.keep b/nitrofs/.keep new file mode 100644 index 0000000..e69de29 diff --git a/src/main.cpp b/src/main.cpp index d8d6dc6..b2973e5 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,31 +1,28 @@ #include "fastlz.h" -#include -#include -#include -#include +#include "filesystem.h" +#include "nds/arm9/console.h" +#include "raylibds.hpp" +#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include -#include -#include -#define TIMER_SPEED (BUS_CLOCK/1024) +#define PALETTE_SIZE 256 +#define FRAME_SIZE 256*192 +#define CHUNK_SIZE 10 +#define QUEUE_SIZE 6 +#define FRAMERATE 30 + +#define STREAM_CHUNK_SIZE 32000 +#define STREAM_QUEUE_SIZE 4 +#define MMSTREAM_BUF_SIZE 9600 void wait_forever(const char* msg); -size_t LoadFile(const char* file, unsigned char **buffer); void LoadNextChunk(void *output); -void onVBL(); +void TimerCallback(); +void VBLCallback(); +void FrameStep(); +int ThreadEntrypoint(void *arg); +mm_word on_stream_request( mm_word length, mm_addr dest, mm_stream_formats format ); class CircularQueue { public: @@ -77,48 +74,23 @@ public: int ptr_background; int ptr_subbackground; -volatile int file_image = -1; -volatile int file_music = -1; +FILE *file_image = nullptr; +FILE *file_music = nullptr; -volatile bool noQueue = false; -constexpr int queue_size = 6; +int chunk_current = 0; -constexpr int chunk_size = 10; -volatile int chunk_counter = 0; -volatile int chunk_current = 0; +uint8_t *frame_decompress; +uint8_t *frame_buffer; +uint8_t *stream_buffer; -constexpr int frame_size = 256*192; -volatile int frame_counter = 0; -uint8_t frame_decompress[frame_size*chunk_size]; -uint8_t frame_buffer[frame_size*chunk_size*queue_size]; -CircularQueue frame_queue(queue_size); +int stream_index; +int stream_buffer_current; +bool stream_need_update = false; -constexpr int music_buffer_size = 4000*16; +CircularQueue frame_queue(QUEUE_SIZE); +CircularQueue stream_queue(STREAM_QUEUE_SIZE); -mm_word on_stream_request( mm_word length, mm_addr dest, mm_stream_formats format ) { - if(file_music){ - size_t samplesize = 1; - switch(format){ - case MM_STREAM_8BIT_MONO: samplesize = 1; break; - case MM_STREAM_8BIT_STEREO: samplesize = 2; break; - case MM_STREAM_16BIT_MONO: samplesize = 2; break; - case MM_STREAM_16BIT_STEREO: samplesize = 4; break; - } - - int res = read(file_music, dest, length*samplesize); - - if(res){ - length = res/samplesize; - } else { - mmStreamClose(); - close(file_music); - length = 0; - } - - } - - return length; -} +int music_buffer_size = 4000*16; int main(void) { @@ -126,74 +98,53 @@ int main(void) { videoSetModeSub(MODE_5_2D); vramSetBankA(VRAM_A_MAIN_BG); - vramSetBankB(VRAM_B_TEXTURE); vramSetBankC(VRAM_C_SUB_BG); vramSetBankF(VRAM_F_TEX_PALETTE); - lcdMainOnBottom(); - // consoleDemoInit(); consoleDebugInit(DebugDevice_NOCASH); - nitroFSInit(NULL); + frame_decompress = (uint8_t*)malloc(FRAME_SIZE*CHUNK_SIZE); + frame_buffer = (uint8_t*)malloc(FRAME_SIZE*CHUNK_SIZE*QUEUE_SIZE); + stream_buffer = (uint8_t*)malloc(STREAM_CHUNK_SIZE*STREAM_QUEUE_SIZE); - file_image = open("nitro:/image.bin", O_RDONLY); - if (file_image == -1) wait_forever("cannot load image.bin"); + sassert( + frame_buffer != nullptr || + frame_decompress != nullptr || + stream_buffer != nullptr, + "failed to allocate memmory"); - file_music = open("nitro:/music.raw", O_RDONLY); - if (file_music == -1) wait_forever("cannot load music.raw"); + bool nitrofs = nitroFSInit(NULL); + sassert(nitrofs, "error nitrofs"); - unsigned char* pal = NULL; - size_t pal_len = LoadFile("nitro:/palette.bin", &pal); + file_image = fopen("nitro:/image.bin", "rb"); + sassert(file_image != nullptr, "failed to load image.bin"); + + file_music = fopen("nitro:/music.raw", "rb"); + sassert(file_image != nullptr, "failed to load music.raw"); + + int pal_len; + unsigned char* pal = Raylib::LoadFile("nitro:/palette.bin", pal_len); ptr_background = bgInit(3, BgType_Bmp8, BgSize_B8_256x256, 0, 0); ptr_subbackground = bgInitSub(3, BgType_Bmp8, BgSize_B8_256x256, VRAM_C_SUB_BG, 0); + DC_FlushRange(pal, pal_len); + dmaCopy(pal, BG_PALETTE, pal_len); dmaCopy(pal, BG_PALETTE_SUB, pal_len); - // glScreen2D(); + free(pal); - // glLoadTileSet( - // img_washer, - // 512, 512, - // 512, 521, - // GL_RGB256, - // TEXTURE_SIZE_512, TEXTURE_SIZE_512, - // GL_TEXTURE_WRAP_S|GL_TEXTURE_WRAP_T|TEXGEN_OFF|GL_TEXTURE_COLOR0_TRANSPARENT, - // 8, - // (u16*)sagiri_washer_pal, - // (u8*)sagiri_washer); - - // DC_FlushAll(); - - // fprintf(stderr, "start debug\n"); - // int cframe = 0; - // int hframe = 0; - // int ticks = 0; - - - // while(!feof(in)) - // { - // timerStart(0, ClockDivider_1024, 0, NULL); - // readNextBatch(in , chunk); - // ticks = timerStop(0); - // int milis = ((ticks%TIMER_SPEED)*1000) /TIMER_SPEED; - - // if (milis > 50) fprintf(stderr, "%i\n", cframe); - // cframe++; - // } - - // fprintf(stderr, "%i\n", hframe); - - - // fseek(in, 0, SEEK_SET); - - fprintf(stderr, "preload start\n"); while(!frame_queue.isFull()) { frame_queue.push(); - LoadNextChunk(&frame_buffer[frame_size*chunk_size*frame_queue.rear]); + LoadNextChunk(&frame_buffer[FRAME_SIZE*CHUNK_SIZE*frame_queue.rear]); } - fprintf(stderr, "preload done %i\n", frame_queue.current); + + while(!stream_queue.isFull()) { + stream_queue.push(); + fread(&stream_buffer[STREAM_CHUNK_SIZE*stream_queue.rear], sizeof(uint8_t), STREAM_CHUNK_SIZE, file_music); + } + stream_index = 0; DC_FlushAll(); @@ -206,115 +157,116 @@ int main(void) { mm_stream mystream; mystream.sampling_rate = 22050; - mystream.buffer_length = music_buffer_size; + mystream.buffer_length = MMSTREAM_BUF_SIZE; mystream.callback = on_stream_request; mystream.format = MM_STREAM_16BIT_MONO; mystream.timer = MM_TIMER2; - mystream.manual = true; + mystream.manual = false; - DC_FlushAll(); + timerStart(0, ClockDivider_1024, TIMER_FREQ_1024(FRAMERATE), TimerCallback); + cothread_create(ThreadEntrypoint, NULL, 0, COTHREAD_DETACHED); mmStreamOpen( &mystream ); - free(pal); - while(1) { + cothread_yield_irq(IRQ_VBLANK); + scanKeys(); - irqSet(IRQ_VBLANK, onVBL); - - if (!frame_queue.isFull()) { - frame_queue.push(); - LoadNextChunk(&frame_buffer[frame_size*chunk_size*frame_queue.rear]); - // fprintf(stderr, "read %i\n", queue.rear); - } - - if (!(frame_counter % 4)) mmStreamUpdate(); + if (keysUp() & KEY_A) break; } return 0; } -void onVBL() +int ThreadEntrypoint(void *arg) { - // DC_FlushRange(&chunk[256*192*4 * queue.front + 256*192*chunk_counter], 256*192*4); - dmaCopyAsynch(&frame_buffer[frame_size*chunk_size*frame_queue.front + frame_size*chunk_counter], bgGetGfxPtr(ptr_subbackground), frame_size); - // if (frame_queue.current < frame_queue.size*0.4) { - // fprintf(stderr, "%i\n ", chunk_counter); - // fprintf(stderr, "count: %i, %i\n ", chunk_counter, frame_queue.current); - // } - - chunk_counter++; - frame_counter++; - - if (chunk_counter >= chunk_size) { - if (!frame_queue.isEmpty()) { - frame_queue.pop(); - chunk_counter = 0; - } else { - chunk_counter = chunk_size; - noQueue = true; - fprintf(stderr, "NO QUEUE!!!!!\n"); + while(1) { + if (!frame_queue.isFull()) + { + frame_queue.push(); + LoadNextChunk(&frame_buffer[FRAME_SIZE*CHUNK_SIZE*frame_queue.rear]); } + cothread_yield(); + + if (!stream_queue.isFull()) + { + stream_queue.push(); + + fread(stream_buffer+ stream_queue.rear*STREAM_CHUNK_SIZE, sizeof(uint8_t), STREAM_CHUNK_SIZE, file_music); + if (feof(file_music)) { + memset(stream_buffer+ stream_queue.rear*STREAM_CHUNK_SIZE, 0, STREAM_CHUNK_SIZE); + mmStreamClose(); + } + } + cothread_yield(); } + + return 0; +} + +void FrameStep() +{ + // if (feof(file_image)) return; + + dmaCopyAsynch(&frame_buffer[FRAME_SIZE*CHUNK_SIZE*frame_queue.front + FRAME_SIZE*chunk_current], bgGetGfxPtr(ptr_background), FRAME_SIZE); + dmaCopyAsynch(&frame_buffer[FRAME_SIZE*CHUNK_SIZE*frame_queue.front + FRAME_SIZE*chunk_current], bgGetGfxPtr(ptr_subbackground), FRAME_SIZE); + + chunk_current++; + + if (chunk_current >= CHUNK_SIZE) { + chunk_current = 0; + frame_queue.pop(); + } +} + +void TimerCallback() +{ + FrameStep(); } void LoadNextChunk(void *output) { uint32_t compress_size; - read(file_image, &compress_size, sizeof(uint32_t)); + fread(&compress_size, sizeof(uint32_t), 1, file_image); + + fread(frame_decompress, sizeof(uint8_t), compress_size, file_image); + fastlz_decompress(frame_decompress, compress_size, output, FRAME_SIZE*CHUNK_SIZE); +} + +mm_word on_stream_request( mm_word length, mm_addr dest, mm_stream_formats format ) { - uint32_t flag = compress_size & 0x3; - compress_size = compress_size >> 2; - - - if (flag == 0x01) // RLE - { - read(file_image, frame_decompress, compress_size); - decompress(frame_decompress, output, RLE); - // fprintf(stderr, "RLE\n"); + size_t samplesize = 1; + switch(format){ + case MM_STREAM_8BIT_MONO: samplesize = 1; break; + case MM_STREAM_8BIT_STEREO: samplesize = 2; break; + case MM_STREAM_16BIT_MONO: samplesize = 2; break; + case MM_STREAM_16BIT_STEREO: samplesize = 4; break; } - else if (flag == 0x10) // RAW + int len = length*samplesize; + + if (feof(file_music)) { - read(file_image, output, compress_size); - // fprintf(stderr, "RAW\n"); - } - else if (flag == 0x00) // fastlz - { - read(file_image, frame_decompress, compress_size); - fastlz_decompress(frame_decompress, compress_size, output, frame_size*chunk_size); - // fprintf(stderr, "fastlz\n"); - } - chunk_current++; - noQueue = false; - // DC_FlushRange(output, 256*192*4); -} - -size_t LoadFile(const char* file, unsigned char **buffer) -{ - FILE *in = fopen(file, "rb"); - if (in == NULL) wait_forever("cannot load file!"); - - fseek(in, 0, SEEK_END); - long file_size = ftell(in); - rewind(in); - - *buffer = (unsigned char*)malloc(file_size); - if (*buffer == NULL) wait_forever("Failed to malloc!"); - - size_t bytes_read = fread(*buffer, 1, file_size, in); - if (bytes_read != file_size) - { - fclose(in); - free(*buffer); - wait_forever("Failed to read"); + mmStreamClose(); + uint8_t temp[len]; + memset(temp, 0, len); + DC_FlushAll(); + dmaCopyAsynch(temp, dest, len); + return length; } - return bytes_read; -} + int bytesToCopy = std::min(len, STREAM_CHUNK_SIZE-stream_index); + dmaCopyAsynch(stream_buffer + stream_queue.front*STREAM_CHUNK_SIZE + stream_index, dest, bytesToCopy); + stream_index += bytesToCopy; -void wait_forever(const char* msg) -{ - fprintf(stderr, "%s\n", msg); - fprintf(stderr, "%s\n", msg); - while (1) swiWaitForVBlank(); + if (stream_index >= STREAM_CHUNK_SIZE) + { + stream_queue.pop(); + stream_index = len - bytesToCopy; + // stream_index = 0; + + dmaCopyAsynch(stream_buffer + stream_queue.front*STREAM_CHUNK_SIZE, dest+bytesToCopy, stream_index); + } + + // return bytesToCopy/2; + return length; } \ No newline at end of file