From e77c0d43e98b45b51c28711a13f7932ac3bf8648 Mon Sep 17 00:00:00 2001 From: dajoho Date: Wed, 3 Apr 2024 18:27:33 +0200 Subject: [PATCH] latest version --- pandash | Bin 11552 -> 13952 bytes src/main.cpp | 230 +++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 195 insertions(+), 35 deletions(-) diff --git a/pandash b/pandash index d1085cf743a74860527d3ffbc56aad7323990fd9..77efd7b5027282711c0789f9fd9917fc62a167e5 100755 GIT binary patch delta 10198 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�i=cl-_!Y5SKi1TCIP@ygumhcsLnsM{##>nCd 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%0Da=d?{4d`L+e z=QE3(F!6oSsIz;qUV%*!n~DRlxPYdJO=q%;#z@L(?Zolwze68_lUDdQ+ z)5NYjo->DxHAz%denxr>U~Q0VuEU`B_2(E$jrElMSGY0XzrB=cc0tJ15Y z;K;&P)HAn$lf)Wxc?ciY>3^Gqzmnm*f47S}v!LV3mbYxb&CgyT=PHkH zTX19O)dPqU(LAKJ<kA+pp%)Xjs|q(>G{jE;kEH%ucmA8Iwqf=B>He#8J(6Ch=}+e4~b_37aNUa`z-| z=3V=w@?3wb5fWjwrkfh2vszZZp?A1vw=a=yvRKiTDbL4wCrzveLJOW`e0n{rFG8(LgXylGIgZ zGfrvZ=6oeG;?Ap>fn)Ez7osD>5 zoWa^OH3lXJ80m!AZC88waxl?~7~-_ASjTmqEVy}^l;*AJe$mE{w`a?@JpzYph@C{f z8w1-}w%CLNgW5)0qA~N6J6Ivy)*LVAn^ry2F^Xh2N!>k~ zYO(p{f>yDPKax{JW-UboI7GG)_vJTrM{cs}|6|3&!7qLDR`gb)GRZI6GwSjJFOw{9 z^NoJmdPIdgV^V9rqp@Wn(%;Nu$M!liFMnp)g4sd;P5w?7KWv&$e|Y%(LT;vQ0g@Lb zP59flm9KL`V8_i2Bx7uw2)etM`gGSK17iq?VcB^rbHhPiXz{b#p`lbirQw-K#NbYQ zAdc575?z{3=8H(EBFUeIv1cL`TOqxl!%P8=*cg(TcnUeEf#0b%3KNXLcygh=5R6

k2cpB<)Lb~y8m?A^ID4D+?e;Fpi68WYM;4VU)b@zNxXQ|_ovyZ z+35@3nZhM7NO#P6p1PxCcDqh+bl>wfGUnCQVH7pCJaxx9tOkfVbBrZ}`Z6`kmx0MiT5UYP;#lW_FP zWEza-S>H2I1-M5_E#2XnpShHKxCtAw8XhEeDjFa%0e_top=N}@Ej(K5SCbQ_=xm;2b?`Ir<<=UIe z4UT+jpvKP>IS&$4E&gZCaYg;XLWKAW!N70*S1;*>OqsAUsP=ZD7B=w+?cg|=n%s#>e`%%U9K_DQQQzY#5vVQwq6RBCh) zMmV9>HiIrzV^+0RWZ=K;m`YG5OO2Le_BVobi;oob`zxdy{f?&O)BzWh?n*GZA)nVNxZwdlOxrW@6o za){S(yV0jZjc(Br3_zz8Qy&S>;(D}J`A|oDWwW{#JzN_g`0nJ|yFpV4r_r8y=*$Isz7(2kA0(*9(92(P zmWE}};WqTASN70@)s}+D9)9s^Tk zsiYpVR5VJlUerX5kM21Ap(|l$Ox85insh=)%^?aa0m$(fpd3#o-&AE{D^ZvMv--Lt z)_v`@&;;s1$XNyQ!x-PR$K^7VB$p)UN>AhVKSSz3LVAZlw)^HFv26q@8b{^`PwGmM zqpb&!a>fNqI{+ayq*Nj*RsT@^Hp_Wr0TQiRzH3BEO0V&ev*mTJKUy{N5dW4oWF%-p z4V5C?rKHvF8l?0YhD0+~Jf>mH`_9oY7RK$}$O5Lh|5j41)$PTz(3wW*onM+STJsylS@dIXIRja=FqJKY9Ny`n)6CI&gWV*+UIAq}dUks(x06E(PRgQJ&st2H2F%7AK7C5@A0;pk#rgMz~{ZRWvw-K69(8i%g{)nz%3hL~j zH9;-!OYypGm5}laKu-@xS0#W{UjU>7OLuiYsi7g-sXgjJsLp0Z2u+O9#-S1Zn66+3 z>YSoAK@-#Ex&=ni#2jrLn&B&T1%puM60HeZ7+cnTA=9J8)5f7?UPJyaDD%^<3O%rW z2$5|HiPr-D{@ofgXt z7aI(Dd_-A3)>NxndQocR9)~pCG%6H84Nb^^+YqEyAQOD3v3u3Xc1cdW?rnRUh$we; zaL0H{RXwF7?^=g7WfRijJTy7*3(3-0D{cZgZTvwoIrxh)DXa||8b=n$%aC9Mxm#qi z-2rMFLmH()Eox{2;i?2fQ0LU-QDm+in#m0!TRT8)b4XoKqZ(THR>q7mmm-PIBJh}k&l?K@zO&Ph`d+-HW zgB+=+lQV*D-Ov<-D!dIn)Djh3puN`$o;3C_5`o{g1pf+d+Dc@N72B7{w35tbk9hF)Oq#@EMmj4@+p1a1o(G%ij~Wx-9_H z)No}lm??)R!j!Qxdhjk7Tp&I;}`CaF2z20F}gET z0Z*F#>p3WX4J$kzo)dPA!r^$n{5RUOFMcWj&|Dux0YC=;03ZMWpYt}MfGMj^kgzd@ z*%^sH`R4{AJao#}SU7X&B%b2ImIZ5MV@RV14B!M^kmw$-gW@3J*|1)ryS@a(K1|6> zZPZp1*WnBPOS$lFZIl84E`3-%qybQ5cvKQwMb#Ok3 zrad-nJ;oieyk5u@HS$J%c${5`b^NjOqQmcCtG%e#;Ds#&ZIw0uOa$DM)rkU6k(Ji( zE`dclmp05C(wG8ISA-DX-2fGM>y+i{Wi*r2&HO8K)w*UCi%QWaJog;90KKp-PxwhD z(8y_!MY!Fw1{)X+cT$0cM>~nu4;2cAT;?_sf%SiU&^pYjmj*UZhABkEcWc&ln_r{2 z{R$w5Q2>rDT5J5D_+O@PB4f?}yZy4zA%dFCoU61S_sU=W_p%!QbLd3^z~fo~0RA6l CIzVs$ delta 7777 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 diff --git a/src/main.cpp b/src/main.cpp index 71638bc..adb8bc7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -51,18 +51,37 @@ void ppsspp() pandoryExec("/tmp/pandory/bin/PPSSPPGold --fullscreen"); } +void mountThumbnails() +{ + // only remount if the squashfs/.pandorythumbs isn't there + if (!Fs::exists("/tmp/pandory/share/retroarch/thumbnails/lost+found")) { + system("mount -o bind /mnt/Pandory/.user/.config/retroarch/thumbnails/ /tmp/pandory/share/retroarch/thumbnails"); + + // Support both types of thumbnail pack, look in .fs and the main folder. prefer the sqxz. + system("mount -o loop,ro /mnt/Pandory/.pandorythumbs /tmp/pandory/share/retroarch/thumbnails"); + system("mount -o loop,ro /mnt/Pandory/.fs/.pandorythumbs /tmp/pandory/share/retroarch/thumbnails"); + + system("mount -o loop,ro /mnt/Pandory/pandorythumbs.sqxz /tmp/pandory/share/retroarch/thumbnails"); + system("mount -o loop,ro /mnt/Pandory/.fs/pandorythumbs.sqxz /tmp/pandory/share/retroarch/thumbnails"); + + system("mount -o bind /tmp/pandory/share/retroarch/thumbnails/Arcade '/tmp/pandory/share/retroarch/thumbnails/FBNeo - Arcade Games'"); + system("mount -o bind /tmp/pandory/share/retroarch/thumbnails/Arcade '/tmp/pandory/share/retroarch/thumbnails/MAME'"); + } +} + + void retroarch() { // if mode == retroarch shuffleMusic(); // TODO: just complain instead if at 60hz. autopatch retroarch.cfg for 50/60hz - system("busybox ash /tmp/pandory/bin/checkfreq.sh"); + //system("busybox ash /tmp/pandory/bin/checkfreq.sh"); + + mountThumbnails(); + + pandoryExec("mount -o remount,rw /mnt"); // fix 1.2.1 being a dick - system("mount -o bind /mnt/Pandory/.user/.config/retroarch/thumbnails/ /tmp/pandory/share/retroarch/thumbnails"); - system("mount -o loop,ro /mnt/Pandory/.pandorythumbs /tmp/pandory/share/retroarch/thumbnails"); - system("mount -o bind /tmp/pandory/share/retroarch/thumbnails/Arcade '/tmp/pandory/share/retroarch/thumbnails/FBNeo - Arcade Games'"); - system("mount -o bind /tmp/pandory/share/retroarch/thumbnails/Arcade '/tmp/pandory/share/retroarch/thumbnails/MAME'"); pandoryExec("/tmp/pandory/bin/retroarch -c /mnt/Pandory/.user/.config/retroarch/retroarch.cfg"); } @@ -119,16 +138,14 @@ void hatari() void vanillaTD() { - system("cd \"/mnt/Pandory/.roms/Vanilla Conquer/TD/\" && ./vanillatd"); + system("launchconquer.sh cnctd"); } void vanillaRA() { - system("cd \"/mnt/Pandory/.roms/Vanilla Conquer/RA/\" && ./vanillara"); + system("launchconquer.sh cncra"); } - - void loadKernelModule(const std::string &module) { std::string modulePath = "/tmp/pandory/lib/modules/"; @@ -159,15 +176,77 @@ void enableNetwork() loadKernelModule("squashfs"); + // wait for interfaces and bring them up system("sleep 5"); + system("ifup lo"); system("ifconfig eth0 up"); //dhcp - system("busybox udhcpc -s /tmp/pandory/etc/udhcpc.script &"); + system("busybox udhcpc -q -s /tmp/pandory/etc/udhcpc.script &"); + // return; // exit test for 1.2.1 firmware + + //system("cp -f /tmp/pandory/bin/busybox /tmp/busybox; nohup /tmp/busybox telnetd -p 4444 -l /bin/sh >/dev/null &"); + // system("cd /mnt/Pandory/.webserver && php -S 0.0.0.0:80 &"); + //system("dropbear -r /mnt/Pandory/.user/.config/dropbear/dropbear_rsa_host_key -E -p 0.0.0.0:22 &"); + return; +} - system("cd /mnt/Pandory/.webserver && php -S 0.0.0.0:80 &"); - system("dropbear -r /mnt/Pandory/.user/.config/dropbear/dropbear_rsa_host_key -E -p 0.0.0.0:22 &"); +void ocp() +{ + pandoryExec("cd \"/mnt/Pandory/.roms/Media - Music\"; ocp-sdl2"); + return; +} + +void flycast() +{ + pandoryExec("flycast"); + return; +} + +void bindMountFile(const std::string &src, const std::string &dest) +{ + pandoryExec("touch '" + dest +"'"); + pandoryExec("mount -o bind '"+ src +"' '"+dest+"'"); +} + +void copyKickstarts() +{ + // bind mount r/w copies from memory + /* -1483a091 */ bindMountFile("/tmp/bios/kick33180.A500", "/mnt/Pandory/.user/.config/amiberry/kickstarts/Kickstart v1.2 r33.180 (1986)(Commodore)(A500-A1000-A2000).rom"); + /* @c4f0f55f */ bindMountFile("/tmp/bios/kick34005.A500", "/mnt/Pandory/.user/.config/amiberry/kickstarts/Kickstart v1.3 rev 34.5 (1987)(Commodore)(A500-A1000-A2000-CDTV).rom"); + /* -c3bdb240 */ bindMountFile("/tmp/bios/kick37175.A500", "/mnt/Pandory/.user/.config/amiberry/kickstarts/Kickstart v2.04 rev 37.175 (1991)(Commodore)(A500+).rom"); + /* @43b0df7b */ bindMountFile("/tmp/bios/kick37350.A600", "/mnt/Pandory/.user/.config/amiberry/kickstarts/Kickstart v2.05 rev 37.350 (1992)(Commodore)(A600HD)[!].rom"); + /* -6c9b07d2 */ bindMountFile("/tmp/bios/kick39106.A1200", "/mnt/Pandory/.user/.config/amiberry/kickstarts/Kickstart v3.0 rev 39.106 (1992)(Commodore)(A1200)[!].rom"); + /* -fc24ae0d */ bindMountFile("/tmp/bios/kick40063.A600", "/mnt/Pandory/.user/.config/amiberry/kickstarts/Kickstart v3.1 rev 40.63 (1993)(Commodore)(A500-A600-A2000)[!].rom"); + /* @1483a091 */ bindMountFile("/tmp/bios/kick40068.A1200", "/mnt/Pandory/.user/.config/amiberry/kickstarts/Kickstart v3.1 rev 40.68 (1993)(Commodore)(A1200)[!].rom"); + /* -d6bae334 */ bindMountFile("/tmp/bios/kick40068.A4000", "/mnt/Pandory/.user/.config/amiberry/kickstarts/Kickstart v3.1 rev 40.68 (1993)(Commodore)(A4000).rom"); + + + // and go overboard on the whdboot ones + bindMountFile("/tmp/bios/kick33180.A500", "/mnt/Pandory/.user/.config/amiberry/whdboot/save-data/Kickstarts/kick33180.A500"); + bindMountFile("/tmp/bios/kick33180.A500.RTB", "/mnt/Pandory/.user/.config/amiberry/whdboot/save-data/Kickstarts/kick33180.A500.RTB"); + bindMountFile("/tmp/bios/kick33192.A500.RTB", "/mnt/Pandory/.user/.config/amiberry/whdboot/save-data/Kickstarts/kick33192.A500.RTB"); + bindMountFile("/tmp/bios/kick34005.A500", "/mnt/Pandory/.user/.config/amiberry/whdboot/save-data/Kickstarts/kick34005.A500"); + bindMountFile("/tmp/bios/kick34005.A500.RTB", "/mnt/Pandory/.user/.config/amiberry/whdboot/save-data/Kickstarts/kick34005.A500.RTB"); + bindMountFile("/tmp/bios/kick37175.A500", "/mnt/Pandory/.user/.config/amiberry/whdboot/save-data/Kickstarts/kick37175.A500"); + bindMountFile("/tmp/bios/kick37350.A600", "/mnt/Pandory/.user/.config/amiberry/whdboot/save-data/Kickstarts/kick37350.A600"); + bindMountFile("/tmp/bios/kick39106.A1200", "/mnt/Pandory/.user/.config/amiberry/whdboot/save-data/Kickstarts/kick39106.A1200"); + bindMountFile("/tmp/bios/kick40063.A600", "/mnt/Pandory/.user/.config/amiberry/whdboot/save-data/Kickstarts/kick40063.A600"); + bindMountFile("/tmp/bios/kick40063.A600.RTB", "/mnt/Pandory/.user/.config/amiberry/whdboot/save-data/Kickstarts/kick40063.A600.RTB"); + bindMountFile("/tmp/bios/kick40068.A1200", "/mnt/Pandory/.user/.config/amiberry/whdboot/save-data/Kickstarts/kick40068.A1200"); + bindMountFile("/tmp/bios/kick40068.A1200.RTB", "/mnt/Pandory/.user/.config/amiberry/whdboot/save-data/Kickstarts/kick40068.A1200.RTB"); + bindMountFile("/tmp/bios/kick40068.A4000", "/mnt/Pandory/.user/.config/amiberry/whdboot/save-data/Kickstarts/kick40068.A4000"); + bindMountFile("/tmp/bios/kick40068.A4000.RTB", "/mnt/Pandory/.user/.config/amiberry/whdboot/save-data/Kickstarts/kick40068.A4000.RTB"); + + // ..and to the whdload boot folder + //bindMountFile("/tmp/bios/kick34005.A500", "/mnt/Pandory/.user/.config/amiberry/whdboot/save-data/Kickstarts/kick34005.A500"); + //bindMountFile("/tmp/bios/kick37350.A600", "/mnt/Pandory/.user/.config/amiberry/whdboot/save-data/Kickstarts/kick37350.A600"); + //bindMountFile("/tmp/bios/kick40068.A1200", "/mnt/Pandory/.user/.config/amiberry/whdboot/save-data/Kickstarts/kick40068.A1200"); + + // ..and the rtb files, because whdload. the a600 one doesn't exist. + //bindMountFile("/tmp/bios/kick34005.A500.RTB", "/mnt/Pandory/.user/.config/amiberry/whdboot/save-data/Kickstarts/kick34005.A500.RTB"); + //bindMountFile("/tmp/bios/kick40068.A1200.RTB", "/mnt/Pandory/.user/.config/amiberry/whdboot/save-data/Kickstarts/kick40068.A1200.RTB"); } void prepareBios() @@ -177,26 +256,20 @@ void prepareBios() chdir("/tmp/bios/"); // Symlink all the nand-kickstarts to /tmp/bios/ - system("find /usr/share/amiberry/kickstarts/ -type f -exec ash -c 'ln -sfv {} $(basename {})' \\;"); + //system("find /usr/share/amiberry/kickstarts/ -type f -exec ash -c 'ln -sfv {} $(basename {})' \\;"); + // Copy instead + pandoryExec("cp -n /usr/share/amiberry/kickstarts/* /tmp/bios/"); // Symlink all the libre amiberry-fallback-kickstarts to /tmp/bios/ - system("find /mnt/Pandory/.user/.config/amiberry/kickstarts/ -type f -exec ash -c 'ln -sfv {} $(basename {})' \\;"); + //system("find /mnt/Pandory/.user/.config/amiberry/kickstarts/ -type f -exec ash -c 'ln -sfv {} $(basename {})' \\;"); - // Rsync the preferred kickstarts to their correct names in the amiberry kickstart folder - system("rsync -av --size-only /usr/share/amiberry/kickstarts/kick34005.A500 '/mnt/Pandory/.user/.config/amiberry/kickstarts/Kickstart v1.3 rev 34.5 (1987)(Commodore)(A500-A1000-A2000-CDTV).rom'"); - system("rsync -av --size-only /usr/share/amiberry/kickstarts/kick37350.A600 '/mnt/Pandory/.user/.config/amiberry/kickstarts/Kickstart v2.05 rev 37.350 (1992)(Commodore)(A600HD)[!].rom'"); - system("rsync -av --size-only /usr/share/amiberry/kickstarts/kick40068.A1200 '/mnt/Pandory/.user/.config/amiberry/kickstarts/Kickstart v3.1 rev 40.68 (1993)(Commodore)(A1200)[!].rom'"); - - // ..and to the whdload boot folder - system("rsync -av --size-only /usr/share/amiberry/kickstarts/kick34005.A500 /mnt/Pandory/.user/.config/amiberry/whdboot/save-data/Kickstarts/"); - system("rsync -av --size-only /usr/share/amiberry/kickstarts/kick37350.A600 /mnt/Pandory/.user/.config/amiberry/whdboot/save-data/Kickstarts/"); - system("rsync -av --size-only /usr/share/amiberry/kickstarts/kick40068.A1200 /mnt/Pandory/.user/.config/amiberry/whdboot/save-data/Kickstarts/"); - - // ..and the rtb files, because whdload. the a600 one doesn't exist. - system("rsync -av --size-only /usr/share/amiberry/kickstarts/kick34005.A500.RTB /mnt/Pandory/.user/.config/amiberry/whdboot/save-data/Kickstarts/"); - system("rsync -av --size-only /usr/share/amiberry/kickstarts/kick40068.A1200.RTB /mnt/Pandory/.user/.config/amiberry/whdboot/save-data/Kickstarts/"); + // Symlink everything in retroarch/system to /tmp/bios, but in a cooler way than above + system("for i in /mnt/Pandory/.user/.config/retroarch/system/*; do ln -fs \"$i\" $(basename \"$i\"); done;"); + + copyKickstarts(); } + void parseAmiberryCommandLine(std::string const &name, std::string const &mode) { std::string cmd = "ps -oargs | grep -v grep | grep amiberry | grep \""+name+"\" && touch /tmp/pandory_mode_" + mode; @@ -208,6 +281,37 @@ void clearCaches() pandoryExec("busybox sysctl vm.drop_caches=3"); } +void magiterm() +{ + pandoryExec("MagiTerm"); +} + +void atari800() +{ + pandoryExec("atari800.sh"); +} + +void crispydoom() +{ + pandoryExec("cd /mnt/Pandory/.roms/Crispy; crispy-setup"); +} + +void eduke32() +{ + pandoryExec("cd /mnt/Pandory/.roms/EDuke32; eduke32"); +} + + +// vice stuff +void x64() { pandoryExec("cd '/mnt/Pandory/.roms/Commodore - 64' ; /tmp/pandory/bin/vice.sh x64"); } +void x128() { pandoryExec("cd '/mnt/Pandory/.roms/Commodore - 128'; /tmp/pandory/bin/vice.sh x128"); } +void xpet() { pandoryExec("cd '/mnt/Pandory/.roms/Commodore - PET'; /tmp/pandory/bin/vice.sh xpet"); } +void xvic() { pandoryExec("cd '/mnt/Pandory/.roms/Commodore - VIC-20'; /tmp/pandory/bin/vice.sh xvic"); } +void xplus4() { pandoryExec("cd '/mnt/Pandory/.roms/Commodore - PLUS4'; /tmp/pandory/bin/vice.sh xplus4"); } +void xcbm2() { pandoryExec("cd '/mnt/Pandory/.roms/Commodore - CBM-II'; /tmp/pandory/bin/vice.sh xcbm2"); } +void xcbm5x0() { pandoryExec("cd '/mnt/Pandory/.roms/Commodore - CBM-II'; /tmp/pandory/bin/vice.sh xcbm5x0"); } +void vsid() { pandoryExec("cd '/mnt/Pandory/.roms/Commodore - SID Music'; /tmp/pandory/bin/vice.sh vsid"); } + int main(int argc, char *argv[]) { // init pandory libraries and paths @@ -217,6 +321,13 @@ int main(int argc, char *argv[]) // empty caches clearCaches(); + pandoryExec("mount -o remount,rw /mnt"); // fix 1.2.1 being a dick + + // restore configs if one has been fiddled with by the menu + pandoryExec("rsync -av --size-only /tmp/pandory/share/launchers/ /mnt/Pandory/"); + + // this is an extra bonus for people who manage to get their a500 connected up (they get an atari emulator) + pandoryExec("ip addr | grep global && ( ([ ! -e /mnt/Pandory/.user/.net ] && panwarn \"You have activated an easter-egg.\n\nA new emulator is available in the Pandory folder.\" \" Returning to Pandory \"); touch /mnt/Pandory/.user/.net; rsync -av --size-only /tmp/pandory/share/launchers_net/ /mnt/Pandory/)"); CommandLineArguments args = CommandLineArguments(argc, argv); std::string mode = args.getArgument(1); @@ -247,12 +358,10 @@ int main(int argc, char *argv[]) return 0; } - freezeProcess("manhattan"); freezeProcess("skyline"); freezeProcess("amiberry"); - if (!Fs::exists("/tmp/pandory_original_amiberry")) { pandoryExec("mkdir /tmp/dbus/"); pandoryExec("mount -o bind /mnt/Pandory/.user /root"); @@ -260,10 +369,11 @@ int main(int argc, char *argv[]) pandoryExec("mount -o bind /tmp/pandory/bin/amiberry-proxy.sh /usr/bin/amiberry"); pandoryExec("mount -o bind /tmp/pandory/share/terminfo/ /usr/share/terminfo/"); + // fork network in the background pandoryExec("pandash network &"); - // prepare bios in the background -> do it sync instead of async + // prepare bios -> do it sync instead of async pandoryExec("pandash bios"); // rsync /etc/ to /tmp/etc/ and bind mount it back so it's writable @@ -276,7 +386,7 @@ int main(int argc, char *argv[]) pandoryExec("cp -fv /mnt/Pandory/.user/.config/dropbear/shadow /etc/shadow"); pandoryExec("cp -fv /mnt/Pandory/.user/.config/dropbear/passwd /etc/passwd"); } - + system("rm -f /tmp/pandory_mode_*"); parseAmiberryCommandLine("Start AMiNIMiga", "aminimiga"); @@ -285,16 +395,34 @@ int main(int argc, char *argv[]) parseAmiberryCommandLine("Start PPSSPP (PSP)", "ppsspp"); parseAmiberryCommandLine("Start Darkplaces (Quake)", "darkplaces"); - parseAmiberryCommandLine("Start Hatari (Atari)", "hatari"); + parseAmiberryCommandLine("Start Crispy (DOOM - Heretic - Hexen)", "crispydoom"); + parseAmiberryCommandLine("Start EDuke32 (Duke3D)", "eduke32"); + + parseAmiberryCommandLine("Start Hatari (Atari ST)", "hatari"); parseAmiberryCommandLine("Start Amiberry 5 (Amiga)", "amiberry5"); parseAmiberryCommandLine("Start OpenBor (Beat-em-ups)", "openbor"); parseAmiberryCommandLine("Start Terminal (Linux)", "terminal"); parseAmiberryCommandLine("Start ScummVM (Adventure Games)", "scummvm"); parseAmiberryCommandLine("Start Zesarux (Spectrum)", "spectrum"); + parseAmiberryCommandLine("Start Flycast (Dreamcast)", "flycast"); + parseAmiberryCommandLine("Start OpenCubic (MOD-Player)", "ocp"); + parseAmiberryCommandLine("Start Atari800 (Atari 8-Bit)", "atari800"); + + parseAmiberryCommandLine("Start MagiTerm (BBS Client)", "magiterm"); parseAmiberryCommandLine("Start DOSBox Staging (IBM PC)", "dosbox"); - parseAmiberryCommandLine("Start Tiberian Dawn (C&C)", "vanillatd"); - parseAmiberryCommandLine("Start Red Alert (C&C)", "vanillara"); + parseAmiberryCommandLine("Start VanillaConquer (C&C1 Tiberian Dawn)", "vanillatd"); + parseAmiberryCommandLine("Start VanillaConquer (C&C2 Red Alert)", "vanillara"); + + parseAmiberryCommandLine("Start VICE (C64)", "x64"); + parseAmiberryCommandLine("Start VICE (C128)", "x128"); + parseAmiberryCommandLine("Start VICE (PET)", "xpet"); + parseAmiberryCommandLine("Start VICE (VIC-20)", "xvic"); + parseAmiberryCommandLine("Start VICE (PLUS4)", "xplus4"); + parseAmiberryCommandLine("Start VICE (CBM II B)", "xcbm2"); + parseAmiberryCommandLine("Start VICE (CBM II P)", "xcbm5x0"); + parseAmiberryCommandLine("Start VICE (SID Player)", "vsid"); + // free up memory forceKill("amiberry"); @@ -311,17 +439,29 @@ int main(int argc, char *argv[]) darkplaces(); } else if (Fs::exists("/tmp/pandory_mode_spectrum")) { spectrum(); - } else if (Fs::exists("/tmp/pandory_mode_dosbox")) { + } else if (Fs::exists("/tmp/pandory_mode_ocp")) { + ocp(); + } else if (Fs::exists("/tmp/pandory_mode_atari800")) { + atari800(); + } + else if (Fs::exists("/tmp/pandory_mode_magiterm")) { + magiterm(); + } + else if (Fs::exists("/tmp/pandory_mode_dosbox")) { dosbox(); } else if (Fs::exists("/tmp/pandory_mode_hatari")) { hatari(); } else if (Fs::exists("/tmp/pandory_mode_amiberry5")) { + // make sure the usb has the most recent files written + pandoryExec("sync"); // start amiberry with no arguments amiberry5("", ""); } else if (Fs::exists("/tmp/pandory_mode_scummvm")) { scummvm(); } else if (Fs::exists("/tmp/pandory_mode_openbor")) { openbor(); + } else if (Fs::exists("/tmp/pandory_mode_flycast")) { + flycast(); } else if (Fs::exists("/tmp/pandory_mode_vanillatd")) { vanillaTD(); } else if (Fs::exists("/tmp/pandory_mode_vanillara")) { @@ -337,6 +477,26 @@ int main(int argc, char *argv[]) } else if (Fs::exists("/tmp/pandory_mode_upgrade")) { //pandoryExec("echo 'echo Upgrade to the full Pandory500 to add many emulators and new features to your A500 Mini. https://go.teampandory.com/a500 && sleep 10 && exit' > /tmp/pandoryshell"); pandoryExec("mpv.sh /tmp/pandory/etc/pandory.mp4"); + } else if (Fs::exists("/tmp/pandory_mode_x64")) { + x64(); + } else if (Fs::exists("/tmp/pandory_mode_x128")) { + x128(); + } else if (Fs::exists("/tmp/pandory_mode_xpet")) { + xpet(); + } else if (Fs::exists("/tmp/pandory_mode_xvic")) { + xvic(); + } else if (Fs::exists("/tmp/pandory_mode_xplus4")) { + xplus4(); + } else if (Fs::exists("/tmp/pandory_mode_xcbm2")) { + xcbm2(); + } else if (Fs::exists("/tmp/pandory_mode_xcbm5x0")) { + xcbm5x0(); + } else if (Fs::exists("/tmp/pandory_mode_vsid")) { + vsid(); + } else if (Fs::exists("/tmp/pandory_mode_crispydoom")) { + crispydoom(); + } else if (Fs::exists("/tmp/pandory_mode_eduke32")) { + eduke32(); } else { retroarch(); }