𑇢^^^°< Technical stuff https://www.schnappy.xyz/ Fri, 01 Jul 2022 21:50:44 +0200 Fri, 01 Jul 2022 21:50:44 +0200 Pico PS4 - Remote play without a PSN account <h1>PS4 - Remote play without a PSN account</h1> <p>For whatever reason, some genius at Sony thought it would make sense to make having an activated PSN account mandatory in order to be able to use remote play.<br /> Since firmware 7.0, you must provide your PSN account ID, which is a unique 8 bytes identifier tied to your PSN account. </p> <p>I don't want to offer Sony my private data just for the privilege to use remote play on my lan, so I was glad to find that you can avoid creating a PSN account and still be able to register new devices. </p> <p><strong>It does need your PS4 to be jailbroken for at least a few minutes though</strong>, and generating a fake account ID, which I guess if you ever plan on using a real PSN account, could have unforeseen consequences. You've been warned.</p> <h2>Steps</h2> <ul> <li><a href="https://invidious.fdn.fr/watch?v=yVFbo23BCK4&amp;list=PLn7ji3VsPy3Gryq_sCOMp6H87jXywCMPI&amp;index=0">Jailbreak your PS4</a></li> <li>Install <a href="https://github.com/bucanero/apollo-ps4">Apollo Save Tool</a> (also available via the <a href="https://github.com/LightningMods/PS4-Store/releases">HB store</a></li> <li>Open 'Apollo Save Tool', then go to 'User tools', 'Activate fake account'. You should see something like :</li> </ul> <pre><code>Activate Offline Account YourUserName (0000000000000000)</code></pre> <p><img src="https://www.schnappy.xyz/assets/ps4-apollo_1.jpg" alt="Apollo fake account registration" /> <img src="https://www.schnappy.xyz/assets/ps4-apollo_2.jpg" alt="Apollo fake account registration" /> <img src="https://www.schnappy.xyz/assets/ps4-apollo_3.jpg" alt="Apollo fake account registration" /></p> <ul> <li>Close then re-open 'Apollo', go back to 'User tools' and write down the generated ID (the hexadecimal string between the parenthesis)</li> <li>You then have to convert this 16 characters hexadecimal string to int, then to base64. Here is a python one liner :</li> </ul> <pre><code class="language-python">python -c 'import base64;print( "Your 8 bytes, base64 encoded account ID is : " + base64.b64encode(int( "1a2b3c4d5e6f7a8b", 16 ).to_bytes(8, "little")).decode())'</code></pre> <p><strong>Make sure to replace <code>1a2b3c4d5e6f7a8b</code> with your generated ID</strong><br /> The base64 ID will look like that : <code>i3pvXk08Kxo=</code>. Alternatively, use the following script :<br /> <a href="https://gist.github.com/ABelliqueux/30f03a6bd8dcc087c4319a529d934b1b">https://gist.github.com/ABelliqueux/30f03a6bd8dcc087c4319a529d934b1b</a><br /> or run it online:<br /> <a href="https://trinket.io/python3/352d094d9c">https://trinket.io/python3/352d094d9c</a> </p> <ul> <li>Install and launch <a href="https://sr.ht/~thestr4ng3r/chiaki/">Chiaki</a></li> <li>On your PS4, go to Settings &gt; Remote play connection settings &gt; Add device <img src="https://www.schnappy.xyz/assets/ps4-register_dev.jpg" alt="Register device" /> <img src="https://www.schnappy.xyz/assets/ps4-register_pin.jpg" alt="Register PIN" /></li> <li>Back in chiaki, connec to your PS4, and when asked to register, enter the base64 account ID you found earlier and the 8 digits PIN number that's displayed by your PS4. </li> <li>Enjoy.</li> </ul> <h2>Bonus : Fix Android's broken Dualshock 4 layout</h2> <p>What I wanted to achieve was use the libre software <a href="https://f-droid.org/packages/com.metallic.chiaki/">chiaki</a> on my old android tablet. While the client works great, it looks like the default layout for the Dualshock 4 on android is sub-optimal, not to say sucky. At least you can connect your DS4 via bluetooth as a regular gamepad, and not need a 3rd party app like for the DS3, so there's progress there. </p> <p>To fix the layout, you need to own your hardware, which means it has to be rooted, since we'll be accessing some system files.<br /> You also have to <a href="https://developer.android.com/studio/debug/dev-options">enable developer mode and USB debugging</a>, and <a href="https://www.xda-developers.com/install-adb-windows-macos-linux/">install ADB</a> on your computer. </p> <p>You then have to put a file with the correct layout in <code>/system/usr/keylayout</code>. </p> <h3>Steps</h3> <ul> <li>Download the layout file from <a href="https://www.schnappy.xyz/assets/android-dualshock4-layout.zip">here</a> and extract the two kl layout files it contains.</li> <li>Connect your android device to your computer</li> <li>Copy the .kl files from your computer to your device with your file browser, for example in your download folder ; <code>/storage/emulated/0/Download</code> </li> <li>In a terminal/cmd, launch and ADB shell on your device with :<pre><code>adb shell</code></pre> </li> <li>Switch to super user by typing:<pre><code>su</code></pre> </li> <li>Remount <code>/system</code> with read-write permissions :<pre><code>mount -o remount,rw /system</code></pre> </li> <li>Copy the new layout files to the <code>/system/usr/keylayout</code> folder :<pre><code>cp /storage/emulated/0/Download/*.kl /system/usr/keylayout/</code></pre> </li> <li>Make sure the permissions on the files are correct :<pre><code>chmod 644 /system/usr/keylayout/Vendor_054c*.kl</code></pre> </li> <li>Reboot your device<pre><code>reboot</code></pre> </li> </ul> <p>Your DS4 should now be mapped correctly.</p> <h2>Sources &amp; More</h2> <p>Pics : <a href="https://www.digitaltrends.com/gaming/how-to-stream-from-your-ps4-to-your-pc/">https://www.digitaltrends.com/gaming/how-to-stream-from-your-ps4-to-your-pc/</a><br /> Android keylayout : <a href="https://forum.xda-developers.com/t/root-dualshock-4-correct-keymaps-controller-bug-fix-kl-file.2817223/page-2">https://forum.xda-developers.com/t/root-dualshock-4-correct-keymaps-controller-bug-fix-kl-file.2817223/page-2</a><br /> MODDED WARFARE's tutorial series on PS4 jailbreak : <a href="https://invidious.fdn.fr/playlist?list=PLn7ji3VsPy3Gryq_sCOMp6H87jXywCMPI">https://invidious.fdn.fr/playlist?list=PLn7ji3VsPy3Gryq_sCOMp6H87jXywCMPI</a><br /> Real PSN account ID script : <a href="https://github.com/thestr4ng3r/chiaki/issues/158">https://github.com/thestr4ng3r/chiaki/issues/158</a> </p> Sun, 06 Mar 2022 01:00:00 +0100 https://www.schnappy.xyz/?PS4-remote_play_without_psn_account https://www.schnappy.xyz/?PS4-remote_play_without_psn_account Making your Vibram 5 fingers last - Update <h1>Making your Vibram 5 Fingers last - Update</h1> <p>As I mentionned in my <a href="/?making_your_vibram_5fingers_last">previous article</a>, here comes the time to get back to this rubber insole hack with some numbers. </p> <p>So here is the result after <strong>355km</strong> in them insoles, <strong>~1600km</strong> total for the shoes :</p> <p><img src="https://www.schnappy.xyz/assets/insole_after_350km.jpg" alt="inside" /> <img src="https://www.schnappy.xyz/assets/outsole_after_350km.jpg" alt="out" /></p> <p>That's not bad as it means this makes the shoes last about <strong>1/3rd</strong> of their typical mileage longer. I can no longer use the left shoe though, as the little finger has become separated from its siblings :( </p> <p><img src="https://www.schnappy.xyz/assets/ohno.jpg" alt="sad" /></p> Sat, 05 Feb 2022 01:00:00 +0100 https://www.schnappy.xyz/?making_your_vibram_5fingers_last_update https://www.schnappy.xyz/?making_your_vibram_5fingers_last_update Making your Vibram 5 fingers last <h1>Making your Vibram 5 Fingers last</h1> <p><img src="https://www.schnappy.xyz/assets/vibram5f-holes.jpg" alt="Notice a pattern ?" /></p> <p>I noticed that after ~1000km, my V-trails 's soles tend to develop holes around the metatarsal heads area.<br /> Wether it's due to a slight over-suppination on my part or thiner material in this particular spot, all ten pairs I owned had this particular outcome. </p> <p>These have around 1200km in them ; <img src="https://www.schnappy.xyz/assets/hole-y-molly.jpg" alt="1200km on the clock" /></p> <p>Clocking roughly 2500km/year, this means I wear out two pairs a year. That's a lot of money at ~150€ / pair, and more importantly, a lot of waste in the long run (pun intended). It recently occured to me (about time...) that I could do something to further increase the usability of my gear.</p> <h2>Custom, tailor-made, pure synthetic rubber insoles</h2> <p>Using a salvaged wheelbarrow innertube, I traced the shape of my feet on the rubber and cut insoles, that I was able to fit in the shoes quite easily.</p> <p><img src="https://www.schnappy.xyz/assets/newshoe.jpg" alt="new insoles" /></p> <p>I was worried the insole would fold in the shoe while running, but this did not occur during my last runs so I guess this is viable.<br /> I expect this solution to increase usability by a few hundred kilometers. <a href="/?making_your_vibram_5fingers_last_update">And it did</a></p> Fri, 24 Dec 2021 01:00:00 +0100 https://www.schnappy.xyz/?making_your_vibram_5fingers_last https://www.schnappy.xyz/?making_your_vibram_5fingers_last Bookeen Cybook Orizon : Tear Down and Serial IO <h1>Hacking with the Bookeen Cybook Orizon Tear down and Serial connection</h1> <p>Let's connect via Serial to this device, setup the wireless card, and enable an ssh server on it.</p> <h2>Connecting SIO</h2> <p>The serial connection is on the debug connector JA901 at the bottom left of the board :</p> <p><img src="https://www.schnappy.xyz/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_cybook_orizon_ja901_debug_connector.jpg" alt="JA901 location on mb" /></p> <p>Pinout is (right to left with the battery on bottom) :</p> <table> <thead> <tr> <th>Pin</th> <th>Usage</th> </tr> </thead> <tbody> <tr> <td>1 TX1</td> <td>UNUSED</td> </tr> <tr> <td>2 RX1</td> <td>UNUSED</td> </tr> <tr> <td>3 TX0</td> <td><strong>SERIAL TX</strong></td> </tr> <tr> <td>4 RX0</td> <td><strong>SERIAL RX</strong></td> </tr> <tr> <td>5 TX3</td> <td>UNUSED</td> </tr> <tr> <td>6 RX3</td> <td>UNUSED</td> </tr> <tr> <td>7-13</td> <td>?</td> </tr> <tr> <td>14-16 GND</td> <td><strong>SERIAL GND</strong></td> </tr> <tr> <td>16-18 VDD</td> <td><strong>SERIAL VCC (3.3V)</strong></td> </tr> </tbody> </table> <p><img src="https://www.schnappy.xyz/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_cybook_orizon_serial_ttl.jpg" alt="JA901 pinout" /></p> <p>You can then use minicom to login :</p> <pre><code class="language-bash">sudo minicom -b 115200 -D /dev/ttyUSB0</code></pre> <p>Login : root </p> <pre><code class="language-bash">FnX Bootloader for s3c2416 build on confucius version master_6376fd19638ef062_b360 Build time "Mon, 11 Oct 2010 14:15:38 +0200" Copyright (C) 2010 Bookeen Detected: Bookeen Cybook Orizon, A00/A01/A022;FnX - Bookeen Cybook Orizon - Terminal Battery level: [==================================== ] Info: Battery condition reasonable Info: Reset/boot due to Software reset I0: 00000000... Starting: Uncompressing Linux.......................................................................... ***: Cybook Linux Starting... ***: Prepare filesystem... ***: Does software want to update? No ***: Check if user want to update... ***: Verify partitions... fsck 1.41.9 (22-Aug-2009) rootfs: clean, 1177/38456 files, 120508/153600 blocks boot: clean, 15/3840 files, 9958/15360 blocks (check deferred; on battery) privatefs: recovering journal privatefs: clean, 66/2560 files, 1516/10240 blocks (check deferred; on battery) ***: Continue booting..... ***: Doing critical nasty things...... ***: Starting BooReader... Welcome to your Cybook Orizon! CybookOrizon login: root login[872]: root login on 'ttySAC0' [root@CybookOrizon ~]#</code></pre> <h2>Keep the device awake</h2> <p>You need to either power the device via micro USB, or kill processes <code>ebrmain</code> and <code>boordr</code> :</p> <pre><code class="language-bash">pkill ebrmain pkill boordr </code></pre> <h2>Wifi connection</h2> <h3>Firmware loading</h3> <p>You can load the wifi firmware and enable the wifi interface (which will apear as 'eth0') with the init script that's in <code>/etc/init.d</code> :</p> <pre><code class="language-bash">/etc/init.d/wireless start [root@CybookOrizon ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:27:13:F7:E3:F7 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:58 (58.0 B) TX bytes:0 (0.0 B) </code></pre> <h3>Connecting to a network</h3> <p>You can use <code>iwlist scan</code> to search for your network, which you can then connect to using <code>wpa_supplicant</code>.</p> <p>Edit <code>/etc/network/interfaces</code> and add the following lines :</p> <pre><code>auto eth0 iface eth0 inet dhcp</code></pre> <p>Create the file <code>/etc/wpa_supplicant.conf</code> that should contain :</p> <pre><code>network={ ssid="yourSSID" psk="yourPSK" }</code></pre> <p>Then run <code>wpa_supplicant -Dwext -ieth0 -c/etc/wpa_supplicant.conf &amp;</code> and once connected, use the network init script :</p> <pre><code>/etc/init.d/network start</code></pre> <p>You should now be connected to your Wireless AP.</p> <h3>SSH connection</h3> <p>By default the root account has no password, so you should change it in order to be able to connect via SSH :</p> <pre><code>passwd # then type your password two times</code></pre> <p>Finally, you can start the dropbear ssh server with <code>/etc/init.d/dropbear start</code>.</p> <p>As this is quite an old version of dropbear, the generating utility <code>dropbearkey</code> only comes with rsa/dss, and the only available key exchange algorithm is SHA-1, which was disabled in openssh 8.8.</p> <p>If you plan on using an ssh key to login, you'll have to re-enable those algorithms :</p> <pre><code>ssh -o KexAlgorithms=diffie-hellman-group1-sha1 -o HostkeyAlgorithms=ssh-rsa -i .ssh/bookeen_rsa_key root@10.10.10.10</code></pre> <p>Have fun :)</p> <h2>CPU info</h2> <pre><code>cat /proc/cpuinfo Processor : ARM926EJ-S rev 5 (v5l) BogoMIPS : 199.47 Features : swp half thumb fastmult edsp java CPU implementer : 0x41 CPU architecture: 5TEJ CPU variant : 0x0 CPU part : 0x926 CPU revision : 5 Cache type : write-back Cache clean : cp15 c7 ops Cache lockdown : format C Cache format : Harvard I size : 16384 I assoc : 4 I line length : 32 I sets : 128 D size : 16384 D assoc : 4 D line length : 32 D sets : 128 Hardware : Cybook Orizon Revision : 0100 Serial : 0000000000000000</code></pre> <h2>Hardware components</h2> <p>SOC : <a href="https://elinux.org/S3C2416">S3C2416</a><br /> Screen: <a href="https://wiki.mobileread.com/wiki/SiPix">Sipix</a> AUO 6" 800x600 A0608E02<br /> Display controller : AUO K-1900<br /> Video DRAM : Etron Tech EM686165VE-7H<br /> Wifi/Bluetooth : <a href="https://www.google.com/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;ved=0CCwQFjAA&amp;url=http%3A%2F%2Fmr2857gb.googlecode.com%2Fsvn%2Ftrunk%2Fdata%2520sheet%2Fwifi%2FWM-BN-BM-01_PRD_v2.3%252020091221.pdf&amp;ei=97esUYSvJ6PT0QWqjYGYDQ&amp;usg=AFQjCNGDYlpKc_9zgodMOIT3pAZfGHf7eQ&amp;bvm=bv.47244034,d.d2k">USI WM-BN-BM-01-0</a><br /> Storage : Hynnix H26M210010AR e-NAND 2GB Flash<br /> Memory : 32MB<br /> CPU : 200 Mhz </p> <h2>Misc</h2> <h3>bootsplash screen</h3> <p>The boot splash picture is in <code>/boot/</code> and is a 600x800 greyscale, indexed 16 colors bmp file (filesize 240,1 KB). </p> <p><strong>If using gimp to edit it, make sure to check the compatibility option "Do not write colorspace information".</strong> </p> <p>Then, to replace it, you first have to mount <code>/boot</code> as rw ;</p> <pre><code>mount /boot mount -o remount,rw /boot</code></pre> <p>then edit your boot splash pic, and put it on the device as <code>/boot/bootsplash.bmp</code> via ssh:</p> <pre><code>scp bootsplash.bmp CybookOrizonIP:/boot/</code></pre> <p><img src="https://www.schnappy.xyz/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_bootsplash.jpg" alt="Custom bootsplash" /></p> <h3>Screensaver and thumbnail file formats</h3> <p>The file format is <code>t4b</code>, and you can find some scripts to convert from an to this format here : </p> <p><a href="https://github.com/ABelliqueux/t4b-tools">https://github.com/ABelliqueux/t4b-tools</a> </p> <p>The default screen saver pictures are in <code>/mnt/app/res/ds</code>.<br /> Most UI assets are in <code>/mnt/app/res/img</code>.</p> <h3>Wifi + SSH at boot</h3> <p>In order to enable Wireless, connect to your AP and start the SSH server automatically at boot, you can create a script in <code>/etc/init.d</code> with this content :</p> <pre><code># Start ALL the things ! # case "$1" in start) echo "Killing useless processes..." pkill ebrmain pkill boordr echo "Enabling wireless" /etc/init.d/wireless start echo "Connecting to AP..." wpa_supplicant -B -Dwext -ieth0 -c/etc/wpa_supplicant.conf sleep 3 echo "Init network" /etc/init.d/network stop /etc/init.d/network start echo "Starting SSH..." /etc/init.d/dropbear start ;; stop) echo -n "Stopping all the things !" /etc/init.d/dropbear stop /etc/init.d/network stop /etc/init.d/wireless stop ;; restart|reload) "$0" stop "$0" start ;; *) echo $"Usage: $0 {start|stop|restart}" exit 1 esac exit $?</code></pre> <p>Make sure the script has the right owner/permissions :</p> <pre><code>chmod 755 /etc/init.d/* chown default:default /etc/init.d/*</code></pre> <p>Then, remove/backup the existing symlinks in <code>/etc/rc.d</code> : </p> <pre><code>rm /etc/rc.d/*</code></pre> <p>and create a new one to your script :</p> <pre><code>ln -s /etc/init.d/custom /etc/rc.d/S05custom</code></pre> <h3>Input</h3> <p>The Cybook's physical buttons (up, left, down, right, middle and on/off/sleep) can be accessed from <code>/dev/cyio</code><br /> Pressing a button triggers the following packets :</p> <table> <thead> <tr> <th>Button</th> <th>Packet content HEX</th> <th>ASCII</th> </tr> </thead> <tbody> <tr> <td>Left</td> <td>6B 80 10 6C</td> <td>l</td> </tr> <tr> <td>Up</td> <td>6B 80 10 75</td> <td>u</td> </tr> <tr> <td>Right</td> <td>6B 80 10 72</td> <td>r</td> </tr> <tr> <td>Down</td> <td>6B 80 10 64</td> <td>d</td> </tr> <tr> <td>Center</td> <td>6B 80 10 65</td> <td>e</td> </tr> <tr> <td>Sleep</td> <td>6B 80 10 6F</td> <td>o</td> </tr> </tbody> </table> <p><img src="https://www.schnappy.xyz/assets/bidouille/demontage_d_un_bookeen_orizon/cyio.png" alt="Cybook IO" /> </p> <h2>Pictures</h2> <p><img src="https://www.schnappy.xyz/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_orizon-01.jpg" alt="bookeen orizon tear up" /><br /> <img src="https://www.schnappy.xyz/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_orizon-02.jpg" alt="bookeen orizon tear up" /><br /> <img src="https://www.schnappy.xyz/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_orizon-03.jpg" alt="bookeen orizon tear up" /><br /> <img src="https://www.schnappy.xyz/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_orizon-04.jpg" alt="bookeen orizon tear up" /><br /> <img src="https://www.schnappy.xyz/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_orizon-05.jpg" alt="bookeen orizon tear up" /><br /> <img src="https://www.schnappy.xyz/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_orizon-06.jpg" alt="bookeen orizon tear up" /><br /> <img src="https://www.schnappy.xyz/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_orizon-07.jpg" alt="bookeen orizon tear up" /><br /> <img src="https://www.schnappy.xyz/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_orizon-08.jpg" alt="screen_A0608E02 connector" /><br /> <img src="https://www.schnappy.xyz/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_orizon-09.jpg" alt="bookeen orizon tear up" /><br /> <img src="https://www.schnappy.xyz/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_orizon-10.jpg" alt="bookeen orizon tear up" /><br /> <img src="https://www.schnappy.xyz/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_orizon-11.jpg" alt="AUO K1900 - Etrontech EM686165VE-7H" /><br /> <img src="https://www.schnappy.xyz/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_orizon-12.jpg" alt="AUO K1900" /><br /> <img src="https://www.schnappy.xyz/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_orizon-13.jpg" alt="unpopuated USB" /><br /> <img src="https://www.schnappy.xyz/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_cybook_orizon_screen_A0608E02.jpg" alt="screen_A0608E02" /><br /> <img src="https://www.schnappy.xyz/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_cybook_orizon_hynnix_H26M210010AR.jpg" alt="_hynnix_H26M210010AR" /> </p> <h2>Links</h2> <p><a href="http://wiki.mobileread.com/wiki/Cybook_Orizon">http://wiki.mobileread.com/wiki/Cybook_Orizon</a><br /> <a href="https://www.e-ink-info.com/why-did-bookeen-use-sipix-and-not-e-ink-their-upcoming-orizon-reader">https://www.e-ink-info.com/why-did-bookeen-use-sipix-and-not-e-ink-their-upcoming-orizon-reader</a><br /> <a href="https://web.archive.org/web/20101203015220/http://www.fwma.de/pmwiki/pmwiki.php?n=Main.OYO">https://web.archive.org/web/20101203015220/http://www.fwma.de/pmwiki/pmwiki.php?n=Main.OYO</a><br /> <a href="https://shkspr.mobi/blog/2013/04/disassembling-an-ereader/">https://shkspr.mobi/blog/2013/04/disassembling-an-ereader/</a><br /> <a href="https://wiki.techinc.nl/OYO_Hacking">https://wiki.techinc.nl/OYO_Hacking</a><br /> <a href="https://web.archive.org/web/20141218033547/http://ownyo.de/">https://web.archive.org/web/20141218033547/http://ownyo.de/</a><br /> <a href="https://p2k.unkris.ac.id/IT/2-3065-2962/Qisda-ES900_21112_p2k-unkris.html">https://p2k.unkris.ac.id/IT/2-3065-2962/Qisda-ES900_21112_p2k-unkris.html</a> </p> Fri, 19 Nov 2021 01:00:00 +0100 https://www.schnappy.xyz/?hacking_with_bookeen_cybook_orizon https://www.schnappy.xyz/?hacking_with_bookeen_cybook_orizon RE: Pseudo-reflections in TRII on Psx - the code part II <h1>RE: Pseudo-reflections in TRII on Psx - the code part II</h1> <p>Following up on my <a href="https://www.schnappy.xyz/?tr2_not_shaders-follow_up">follow-up</a> to <a href="https://schnappy.xyz/?tr2_not_shaders">an article</a> about a pseudo-reflection effect in the Tomb Raider I &amp; II games on psx, picking up where we left of ; </p> <blockquote> <p>In this pic, you can see that Lara's reflection looks cloudy. This <em>could be</em> because a second primitive with semi-transparency is drawn above the one doing the reflection. </p> </blockquote> <p><img src="https://www.schnappy.xyz/assets/tr2-wall-1.jpg" alt="TR2 on Psx : The Great Wall level" /></p> <p>Now this might sound a bit expensive to draw two primitives instead of one, but it's not really. In fact, you can do the calculations once, and apply the resulting coordinates to 2 different primitives.</p> <pre><code class="language-c">// cast nextpri as POLY_GT3 poly[0] = (POLY_GT3 *)nextpri; poly[1] = (POLY_GT3 *)nextpri+sizeof(POLY_GT3); // Initialize the primitives SetPolyGT3(poly[0]); SetPolyGT3(poly[1]); // Reflection Cube // This cube has its UVs mapped directly to VRAM coordinates // We're using the framebuffers as a texture (0,0 and 0,256) // Get 256x256 texture page that's at x0, y0 poly[1]-&gt;tpage = getTPage( 2, stpRate, 0, !(db) * 256 // Here, we're using db's value that can be either 0 or 1 to determine the texture page Y coordinate. ); // Set STP SetSemiTrans(poly[1], stpFlag); // Map coordinates from drawarea (320x240) to texture size (256x240) in fixed point math // x = x * (256 / 320) =&gt; ( x * ( 256 * 4096 ) / 320 ) / 4096 =&gt; x * 3276 &gt;&gt; 12 // y = y * (240 / 240) =&gt; ( y * ( 240 * 4096 ) / 240 ) / 4096 =&gt; y * 4096 &gt;&gt; 12 == y setUV3( poly[1], (poly[1]-&gt;x0 * normH) &gt;&gt; 12, poly[1]-&gt;y0 - (!(db) * 16) , // We're using db's value again to add a 16 pixels offset to the Y's coordinates of the UVs (poly[1]-&gt;x1 * normH) &gt;&gt; 12, poly[1]-&gt;y1 - (!(db) * 16), // We have to do that because the buffer is 240 high, whereas our texture page is 256, hence 256 - 240 == 16 (poly[1]-&gt;x2 * normH) &gt;&gt; 12, poly[1]-&gt;y2 - (!(db) * 16) ); // Draw "container" cube // This cube has a texture with transparent areas. // STP bit is set on PNG's alpha channel : img2tim -usealpha -org 320 0 -o cube.tim cube.png poly[0]-&gt;tpage = getTPage( timImages[0].mode&amp;0x3, stpRate, timImages[0].prect-&gt;x, timImages[0].prect-&gt;y ); // If 8/4bpp, load CLUT to vram if ( (timImages[0].mode &amp; 0x3) &lt; 2 ) { setClut( poly[0], timImages[0].crect-&gt;x, timImages[0].crect-&gt;y ); } // Set UV coordinates setUV3(poly[0], modelCube.u[i].vx, modelCube.u[i].vy, modelCube.u[i+2].vx, modelCube.u[i+2].vy, modelCube.u[i+1].vx, modelCube.u[i+1].vy ); // Rotate, translate, and project the vectors and output the results into a primitive // curTriangle, +1, +2 point to the vertices index of the triangle we're drawing. OTz = RotTransPers(&amp;modelCube_mesh[ modelCube_index[ curTriangle[0] ] ] , ( long * ) &amp;poly[1]-&gt;x0, &amp;p, &amp;Flag); OTz += RotTransPers(&amp;modelCube_mesh[ modelCube_index[ curTriangle[0] + 2] ], ( long*) &amp;poly[1]-&gt;x1, &amp;p, &amp;Flag); OTz += RotTransPers(&amp;modelCube_mesh[ modelCube_index[ curTriangle[0] + 1] ], ( long * ) &amp;poly[1]-&gt;x2, &amp;p, &amp;Flag); // Instead of doing the same calculations for the "prism" cube, use results from above directly poly[0]-&gt;x0 = poly[1]-&gt;x0; poly[0]-&gt;y0 = poly[1]-&gt;y0; poly[0]-&gt;x1 = poly[1]-&gt;x1; poly[0]-&gt;y1 = poly[1]-&gt;y1; poly[0]-&gt;x2 = poly[1]-&gt;x2; poly[0]-&gt;y2 = poly[1]-&gt;y2;</code></pre> <p>And there you have it :</p> <p><img src="https://www.schnappy.xyz/assets/double_prim.gif" alt="Double primitive with transparency" /></p> <p>Here's a pic that hopefully shows a bit more :</p> <p><img src="https://www.schnappy.xyz/assets/double_prim.jpg" alt="Double primitive with transparency" /></p> <p>You can see the two cubes with the right one being the "reflection"... </p> <p>You can easily get various graphical result by tweaking the colors/depth/size of the primitives !</p> <p><img src="https://www.schnappy.xyz/assets/cell-shading.jpg" alt="Double primitive with transparency" /></p> <h2>Full code and more infos</h2> <p>The full code is available at <a href="https://github.com/ABelliqueux/nolibgs_hello_worlds/tree/main/hello_fx">https://github.com/ABelliqueux/nolibgs_hello_worlds/tree/main/hello_fx</a> </p> <p>You can find more details about semi-transparency and primitive transparency on the PSX here : </p> <p><a href="https://github.com/ABelliqueux/nolibgs_hello_worlds/wiki/STP">https://github.com/ABelliqueux/nolibgs_hello_worlds/wiki/STP</a> </p> <p><a href="https://github.com/ABelliqueux/nolibgs_hello_worlds/wiki/TIM#transparency">https://github.com/ABelliqueux/nolibgs_hello_worlds/wiki/TIM#transparency</a></p> <hr /> <h2>Links and notes</h2> <p>Original articles : </p> <p><a href="https://www.schnappy.xyz/?tr2_not_shaders">https://www.schnappy.xyz/?tr2_not_shaders</a><br /> <a href="https://www.schnappy.xyz/?tr2_not_shaders-follow_up">https://www.schnappy.xyz/?tr2_not_shaders-follow_up</a></p> <p>Thanks to psxdev users gwald and sicklebrick, and to <a href="https://twitter.com/cnhyv">Paul Douglas</a> for their time and answers.</p> Thu, 18 Nov 2021 01:00:00 +0100 https://www.schnappy.xyz/?tr2_not_shaders-part3 https://www.schnappy.xyz/?tr2_not_shaders-part3 PSXDEV: Change the debug font appearance and color <h1>Change the debug font appearance and color</h1> <p><img src="https://www.schnappy.xyz/assets/debug_font.gif" alt="Funky!" /></p> <p>Changing the debug font face and color can be useful if you don't want or don't have time to implement a full-fledged font atlas solution, but still want to be able to customize the default font a bit.</p> <h2>Basics</h2> <p>According to PsyQ's doc, the <code>FntLoad()</code> function is in charge of loading the texture and <a href="https://www.computerhope.com/jargon/c/clut.htm">CLUT</a> in the PSX vram.<br /> By default it will load a 128x32 image to xy coordinates <code>960, 0</code>, and its clut will be loaded at <code>960,0+128</code>.</p> <p>Using a custom debug font is then a simple matter of loading an image into vram at those coordinates, and/or altering the clut.</p> <h2>Color</h2> <p><img src="https://www.schnappy.xyz/assets/debug_font_color.png" alt="A custom debug font color" /></p> <p>The CLUT is loaded at <code>x,y+128</code> ( 960,128 by default ) and consists of two horizontal pixels for the default font; the first is black (RGB 0,0,0) and is the background colour.<br /> The second one is white (RGB 255,255,255) and is the foreground (or text) colour. You can use the <code>ClearImage()</code> function to draw a colored rectangle anywhere in vram, so why not draw a 1x1 pixel at 961,128 and see the result ? </p> <p><strong>Note that setting the pixel at 960x128 to a different color overides <code>FntOpen()</code>'s <code>isbg</code> value.</strong></p> <pre><code class="language-c">// Used for font texture position in vram #define FONTX 960 #define FONTY 0 // Two color vectors R,G,B CVECTOR fntColor = { 255, 0, 0 }; CVECTOR fntColorBG = { 0, 0, 0 }; void FntColor(CVECTOR fgcol, CVECTOR bgcol ) { // The debug font clut is at tx, ty + 128 // tx = bg color // tx + 1 = fg color // We can override the color by drawing a rect at these coordinates // // Define 1 pixel at 960,128 (background color) and 1 pixel at 961, 128 (foreground color) RECT fg = { FONTX+1, FONTY + 128, 1, 1 }; RECT bg = { FONTX, FONTY + 128, 1, 1 }; // Set colors ClearImage(&amp;fg, fgcol.r, fgcol.g, fgcol.b); ClearImage(&amp;bg, bgcol.r, bgcol.g, bgcol.b); }</code></pre> <p>All you have to do after that is calling <code>FntColor()</code> after <code>FntLoad()</code> and <code>FntOpen()</code> :</p> <pre><code class="language-c">FntLoad(FONTX, FONTY); // Load font to vram at FONTX,FONTY FntOpen(100, 100, 48, 20, 0, 12 ); // FntOpen(x, y, width, height, black_bg, max. nbr. chars) FntColor(fntColor, fntColorBG);</code></pre> <p>You can check in a vram viewer that the pixels at those coordinates have the new colors ;</p> <p><img src="https://www.schnappy.xyz/assets/debug_font_vram.png" alt="the debug font texture in VRAM" /></p> <h2>Fontface</h2> <p>Changing the font face allows you to use customized 7x7 pixels glyph and a full 4bpp CLUT, that's quite nice ! The latin aphabet debug font has 64 glyphs ; 4 lines, 16 glyphs per line in this order : </p> <p><strong>Notice that the first glyph on the first line is empty</strong></p> <pre><code> !"#$%&amp;'()*+,-./ 0123456789:;&lt;=^? @ABCDEFGHIJKLMNO PQRSTUVWXYZ[\]&gt;</code></pre> <p>The fontface should be a 128x32, 16 colors palettized image with each glyphs taking 7x7 pixels :</p> <p><img src="https://www.schnappy.xyz/assets/debug_font_tpl.png" alt="template" /></p> <p>For reference, here is an example : </p> <p><img src="https://www.schnappy.xyz/assets/debug_font_spr.png" alt="template" /></p> <p>Gimp or Aseprite are tools that would do the trick.</p> <h3>Converting the image to TIM</h3> <p>Using Lameguy64's <code>img2tim</code> utility, convert the image to <a href="https://github.com/ABelliqueux/nolibgs_hello_worlds/wiki/TIM">tim</a> :</p> <pre><code>img2tim -b -usealpha -org 960 0 -plt 960 128 -bpp 4 -o output.tim input.png</code></pre> <h3>Including the tim file</h3> <p>If using nugget+psyq, as described <a href="https://github.com/ABelliqueux/nolibgs_hello_worlds/wiki/(Archived)--Embedding-binary-data-in-your-psx-executable">here</a>, you have to add the tim file to your <code>SRCS</code>, then add these conversion instructions in your makefile :</p> <pre><code class="language-mk">%.o: %.tim $(PREFIX)-objcopy -I binary --set-section-alignment .data=4 --rename-section .data=.rodata,alloc,load,readonly,data,contents -O elf32-tradlittlemips -B mips $&lt; $@</code></pre> <p>To access the data in code, use the following declarations :</p> <pre><code>extern unsigned long _binary_output_tim_start[]; extern unsigned long _binary_output_tim_end[]; extern unsigned long _binary_output_tim_length;</code></pre> <h3>Loading the image to vram</h3> <p>Using a nice function written by Lameguy64 ;</p> <pre><code class="language-c">extern unsigned long _binary_fnt_tim_start[]; extern unsigned long _binary_fnt_tim_end[]; extern unsigned long _binary_fnt_tim_length; // Loading an image to vram. See https://github.com/ABelliqueux/nolibgs_hello_worlds/blob/main/hello_sprt/hello_sprt.c#L42 TIM_IMAGE fontface; void LoadTexture(u_long * tim, TIM_IMAGE * tparam){ OpenTIM(tim); ReadTIM(tparam); LoadImage(tparam-&gt;prect, tparam-&gt;paddr); DrawSync(0); if (tparam-&gt;mode &amp; 0x8){ // check 4th bit LoadImage(tparam-&gt;crect, tparam-&gt;caddr); DrawSync(0); } }</code></pre> <p>Then in <code>main()</code>, call it once after init:</p> <pre><code class="language-c">LoadTexture(_binary_fnt_tim_start, &amp;fontface);</code></pre> <h2>Full code</h2> <p>A full example is available here : <a href="https://github.com/ABelliqueux/nolibgs_hello_worlds/tree/main/hello_font">https://github.com/ABelliqueux/nolibgs_hello_worlds/tree/main/hello_font</a> </p> <h2>Doc &amp; Sources</h2> <ul> <li><code>FntLoad()</code> ref : <a href="http://psx.arthus.net/sdk/Psy-Q/DOCS/LibRef47.pdf">http://psx.arthus.net/sdk/Psy-Q/DOCS/FileFormat47.pdf</a>, p.292 </li> <li>Nolibgs wiki TIM page : <a href="https://github.com/ABelliqueux/nolibgs_hello_worlds/wiki/TIM">https://github.com/ABelliqueux/nolibgs_hello_worlds/wiki/TIM</a> </li> </ul> Mon, 25 Oct 2021 02:00:00 +0200 https://www.schnappy.xyz/?psxdev-change_font_color https://www.schnappy.xyz/?psxdev-change_font_color PSXDEV: NuggetQ : Changing the Load Address of a PSX exe <h1>NuggetQ : Changing the Load Address of a PSX exe</h1> <p>In order to change the Load Memory Address (LMA) of your psx executable, you should use one of those solutions ;</p> <pre><code class="language-bash">$ file hello_poly.ps-exe hello_poly.ps-exe: Sony Playstation executable PC=0x8001f000, .text=[0x8001f000,0x1c000], Stack=0x801fff00, ()</code></pre> <h2>From the command line</h2> <p>When compiling, use the following command :</p> <pre><code class="language-bash">LDFLAGS ="-Xlinker --defsym=TLOAD_ADDR=0x80010000" make</code></pre> <h2>From the Makefile</h2> <p>In the project's makefile, add the following line :</p> <pre><code class="language-mk">LDFLAGS += -Xlinker --defsym=TLOAD_ADDR=0x80010000</code></pre> <h2>With an ld script</h2> <p>In the project's Makefile, add a line to include the ld script:</p> <pre><code class="language-mk">OVERLAYSCRIPT ?= script.ld</code></pre> <p>in the linked script, add the following lines :</p> <pre><code>TLOAD_ADDR = 0x8001f000; /*Changes the PC*/ __heap_base = 0x8001f000; /* Build fails if not provided */</code></pre> <h2>Source</h2> <p><a href="https://discord.com/channels/642647820683444236/646781091252011058/791255427990945823">https://discord.com/channels/642647820683444236/646781091252011058/791255427990945823</a><br /> <a href="https://discord.com/channels/642647820683444236/663664210525290507/894235813657837569">https://discord.com/channels/642647820683444236/663664210525290507/894235813657837569</a> </p> Sun, 03 Oct 2021 02:00:00 +0200 https://www.schnappy.xyz/?psxdev-nuggetQ_change_load_address https://www.schnappy.xyz/?psxdev-nuggetQ_change_load_address PSXDEV: Generate a PSX disk image with lua-interface <h1>Generate a PSX disk image with lua-interface</h1> <h2>PSX image</h2> <p>Get <code>lua-interface</code> here : <a href="http://static.grumpycoder.net/pixel/lua-interface-distrib/">http://static.grumpycoder.net/pixel/lua-interface-distrib/</a> . </p> <h3>Script</h3> <p>Create a <code>master.lua</code> file with this content :</p> <pre><code class="language-lua">function main() loadmodule "lualibs" loadmodule "luahandle" loadmodule "luacd" iso_file = Output "myiso.bin" iso = isobuilder(iso_file) pvd = PVD() pvd.sysid = "PLAYSTATION" pvd.volid = "MYISO" pvd.pubid = "YOURNAME" pvd.appid = "YOURAPP" root = iso:setbasics(pvd) root:setbasicsxa() iso:createfile(root, "PSX.EXE", Input "your.psexe"):setbasicsxa() falsesect = {} for i = 1, 148, 1 do iso:createsector(falsesect, MODE2) end iso:close() end</code></pre> <p>Use the <code>master.lua</code> script , changing l.15 'your.psexe' value to reflect your psx exe 's filename : </p> <pre><code>./lua-interface.exe -e "main()" master.lua</code></pre> <h2>Generate your audio tracks with ffmpeg</h2> <pre><code>ffmpeg -i input.file -f s16le -acodec pcm_s16le track.bin</code></pre> <h2>Create the Cue file</h2> <p>The cue file should follow this format :</p> <pre><code>FILE "psxfile.bin" BINARY TRACK 01 MODE2/2352 INDEX 01 00:00:00 FILE "audio1.bin" BINARY TRACK 02 AUDIO INDEX 01 00:00:00 FILE "audio2.bin" BINARY TRACK 03 AUDIO INDEX 00 00:00:00 INDEX 01 00:02:00</code></pre> <p>'psxfile.bin' should be the file generated by the lua script. 'audio1.bin', etc. should be the files generated with ffmpeg. </p> <h2>Source</h2> <p><a href="https://discord.com/channels/642647820683444236/663664210525290507/796078666148610089">https://discord.com/channels/642647820683444236/663664210525290507/796078666148610089</a><br /> <a href="https://discord.com/channels/642647820683444236/642848592754901033/891744067933831200">https://discord.com/channels/642647820683444236/642848592754901033/891744067933831200</a> </p> Sun, 26 Sep 2021 02:00:00 +0200 https://www.schnappy.xyz/?psxdev-generate_disk_image_lua https://www.schnappy.xyz/?psxdev-generate_disk_image_lua PSXDEV: Change the PSX's boot logo <h1>Creating a custom psx boot logo</h1> <p><img src="https://www.schnappy.xyz/assets/hblogo.png" alt="A custom psx boot logo!" /></p> <h2>Needed tools :</h2> <ul> <li>PsyQ's <a href="http://psx.arthus.net/sdk/Psy-Q/PSXGraphicStudio.zip">utilities</a> : <code>dxf2rsd.exe</code>, <code>RSDLINK.EXE</code> and <code>rsdtool.exe</code> (aternatively, Lameguy64's <a href="https://github.com/Lameguy64/smxtool"><code>smxtool</code></a> ) </li> <li><a href="https://www.dosbox.com/">Dosbox</a> to run the dos program above.</li> <li>Blender and optionnaly <a href="https://github.com/Lameguy64/Blender-RSD-Plugin">Lameguy64's Blender RSD plugin</a> </li> <li>BootEdit2 available here : <a href="http://psx.arthus.net/tools/bootedit2.zip">http://psx.arthus.net/tools/bootedit2.zip</a> </li> </ul> <h2>Steps</h2> <h3>Blender model creation</h3> <p>Create a model in blender. Keep your polycount low. For reference, the original psx logo has 560 triangles.<br /> Make sure you only have one mesh in your object !</p> <p><img src="https://www.schnappy.xyz/assets/bootedit-blender.png" alt="Logo in blender" /></p> <h4>Set shading to "Flat"</h4> <p>Tab into "Edit mode" with your object selected, and make sur your object's faces are set to "Flat" in "Shading". </p> <h4>Use vertex paint for colors</h4> <p>Either use vertex painting directly, or bake the object's materials to vertex color :</p> <ol> <li>In the "Material" tab, "Shading" section, check "Shadeless" for each material<br /> <img src="https://www.schnappy.xyz/assets/blender279_bake_mat_to_vertex_col_1.png" alt="Set materials to shadeless" /> </li> <li>In the "Data" tab, add a Vertex Color layer in the "Vertex colors" section<br /> <img src="https://www.schnappy.xyz/assets/blender279_bake_mat_to_vertex_col_2.png" alt="Add vertex color layer" /> </li> <li>In the "Render" tab, "Bake" section, check "Bake to Vertex Color", then hit "Bake" after making sure your object is selected.<br /> <img src="https://www.schnappy.xyz/assets/blender279_bake_mat_to_vertex_col_3.png" alt="Check &#039;Bake to Vertex Color&#039; and Bake" /> </li> </ol> <p>You can check this worked by switching to Vertex Paint mode. </p> <h4>Exporting using the RSD plugin</h4> <p>Make sure you apply transformations to your object before exporting.<br /> In object mode, that's <code>Ctrl</code> + <code>A</code>, 'Location', 'Rotation &amp; Scale'. </p> <p>Ideally, your object should be at <code>0,0,0</code>, and have X and Y dimensions of ~18 blender units.<br /> Your object's front should point towards Blender's <code>-Y</code> axis (that's toward your eye by default). </p> <p><img src="https://www.schnappy.xyz/assets/boot_logo_size.png" alt="Object&#039;s rough size, orientation and location" /> </p> <p>Then, export your object using <a href="https://github.com/Lameguy64/Blender-RSD-Plugin">Lameguy64's RSD plugin</a> and proceed to the "RSD to TMD conversion" step. </p> <h4>Exporting using the DXF plugin</h4> <p><strong>This method is not recommended as Color information is lost</strong> </p> <h5>Object orientation</h5> <p>The psx space coordinates is Y-UP, so you might have to make it so the top of your object points towards the positive Y axis in Blender (that's the green axis, pointing away from you).<br /> <img src="https://www.schnappy.xyz/assets/blender_yup_object.png" alt="Rotating the object" /><br /> The key sequence to do that in Blender is <code>Tab</code> into edit mode, hit <code>A</code> key, hit <code>R</code> key, hit <code>X</code> key, hit <code>-</code>, <code>9</code>, <code>0</code> then hit <code>Enter</code>. </p> <ol> <li> <p>Export from blender as dxf with the <a href="https://archive.blender.org/wiki/index.php/Extensions:2.6/Py/Scripts/Import-Export/DXF_Exporter/">"Export Autocad DXF"</a> plugin.</p> </li> <li> <p>Use psyq's <code>dxf2rsd.exe</code> utility with dosbox to convert the DXF to RSD using the <code>-back</code> option to flip normals:</p> <pre><code>DXF2RSD.EXE -o logo.rsd -back model.dxf</code></pre> </li> <li> <p>Edit the RSD file with PsyQ's old <code>rsdtool</code> or use the modern <a href="https://github.com/Lameguy64/smxtool"><code>smxtool</code></a> to add colors and save as RSD.</p> </li> </ol> <p><img src="https://www.schnappy.xyz/assets/bootedit-smxtool.png" alt="Logo in smxtool" /></p> <h4>Checking the MAT file</h4> <p>You have to make sure the final <code>.MAT</code> file generated has every line's columns 2 to 4 look has these values ; <code>2 F C</code>. E.g :</p> <pre><code>x 2 F C rrr ggg bbb</code></pre> <p><code>x</code> is the vertex index.<br /> <code>2</code> &gt; 0x2 (0010) means 'Light-source calculations performed' and 'Double-faced polygon.'<br /> <code>F</code> means flat shaded<br /> <code>C</code> means color and <code>rrr ggg bbb</code> is the color value. </p> <p>See the '[Flag]' section in <a href="http://psx.arthus.net/sdk/Psy-Q/DOCS/FileFormat47.pdf">http://psx.arthus.net/sdk/Psy-Q/DOCS/FileFormat47.pdf</a>, p.56 for more details on these values.</p> <h3>RSD to TMD conversion</h3> <p>Convert the RSD to TMD using psyq's <code>RSDLINK.EXE</code> tool with dosbox :</p> <pre><code>RSDLINK.EXE -s XXX.X -o logo.tmd logo.rsd</code></pre> <p>Here <code>-s XXX.X</code> is needed so that the model is scaled to the correct size. </p> <p><strong>The scale factor is not the same if you used DXF vs RSD export.</strong> </p> <p>If using the DXF export plugin, scale factor is <code>240.0</code>. </p> <p>If using the RSD export plugin, scale factor is <code>60.0</code>. </p> <h3>Patching the disk image</h3> <p>Patch your disk image with <a href="http://psx.arthus.net/tools/bootedit2.zip"><code>BootEdit.exe</code></a> by selecting your bin file, then the new tmd file.</p> <p>You can also change the license text; These are two 32 characters field with pre-determined spaces. </p> <p>Apply the patch and voila !</p> <p><img src="https://www.schnappy.xyz/assets/bootedit-patch.png" alt="Patch disk image" /></p> <h2>Logos to download</h2> <p>You can download the TMDs and corresponding blend for logos I made here : </p> <p><a href="http://psx.arthus.net/homebrew/assets/boot_logos/">http://psx.arthus.net/homebrew/assets/boot_logos/</a> </p> <p><img src="https://www.schnappy.xyz/assets/hblogo.png" alt="Homebrew logo" /><br /> <img src="https://www.schnappy.xyz/assets/hb_chs.png" alt="32bit logo" /> <img src="https://www.schnappy.xyz/assets/32blogo.png" alt="32bit logo" /></p> <h2>Tips and infos</h2> <h3>Original PSX logo</h3> <p>For reference, the original psx logo ranges from XYZ (-611, -775, -943) to (608, 231, 594) and has 560 triangles.</p> <p><img src="https://www.schnappy.xyz/assets/tmdinfo-psx.png" alt="PSX&#039;s logo specs" /></p> <p>You can check a tmd file with the <code>TMDINFO.EXE</code> utility:</p> <pre><code>TMDINFO.EXE logo.tmd</code></pre> <h4>Original logo colors</h4> <p>The original colors in the logo are : </p> <table> <thead> <tr> <th>Color</th> <th>HEX</th> <th>RGB</th> </tr> </thead> <tbody> <tr> <td><span style="background-color:#82D2C8;padding:0.2em;">Green</span></td> <td>82D2C8</td> <td>130, 210, 200</td> </tr> <tr> <td><span style="background-color:#8BADD7;padding:0.2em;">Blue</span></td> <td>8BADD7</td> <td>139, 173, 215</td> </tr> <tr> <td><span style="background-color:#FBDF00;padding:0.2em;">Yellow</span></td> <td>FBDF00</td> <td>251, 223, 0</td> </tr> <tr> <td><span style="background-color:#FF3232;padding:0.2em;">Red</span></td> <td>FF3232</td> <td>255, 50 , 50</td> </tr> </tbody> </table> <h3>MAT file</h3> <p>To reduce filesize, one can use a range to specify color/shading/flags in one line :</p> <pre><code>0-256 0 F C 200 200 200 # Use light-source, flat shaded, grey for vertices 0 to 256</code></pre> <p>This would result in a stylish grey logo... </p> <p><img src="https://www.schnappy.xyz/assets/bootedit-bw.png" alt="Style" /> </p> <h3>Run Dos program from Linux CLI</h3> <p>You can ran a DOS program directly from CLI :</p> <pre><code class="language-bash">dosbox -c "rsdlink.exe -s 60.0 B:\input.rsd -o B:\output.tmd"</code></pre> <p>Here, <code>B:\</code> is mapped to the folder that contains the input and ouptu files :</p> <p>In <code>dosbox.conf</code> 'z <code>[autoexec]</code> section :</p> <pre><code>MOUNT B ~/path/to/files</code></pre> <h4>Bash script</h4> <p>Here is a small bash wrapper to convert rsd to tmd :</p> <pre><code class="language-bash">#!/bin/bash if [ "$1" == "-h" ] || [ "$1" == "" ]; then echo "Usage : rsd2tmd.sh scale output.tmd input.rsd" fi dosbox -c "rsdlink.exe -s ${1} -o B:\\$2 B:\\$3" -c "exit"</code></pre> <h2>Converting TMD back to an OBJ file</h2> <p>A small java utility is available that can convert TMDs back to Wavefront OBJ files : <a href="https://github.com/ABelliqueux/tmd2obj">https://github.com/ABelliqueux/tmd2obj</a>. </p> <h2>Doc &amp; Sources</h2> <ul> <li>PSXDEV.net topic : <a href="www.psxdev.net/forum/viewtopic.php?t=156&amp;sid=fa6e4327893620c1a1b5a5e548879685">www.psxdev.net/forum/viewtopic.php?t=156&amp;sid=fa6e4327893620c1a1b5a5e548879685</a> </li> <li>Original Darsel engineering tutorial : <a href="https://web.archive.org/web/20041229035553/http://www.fortunecity.com/greenfield/wolf/51/ETMDv10.htm">https://web.archive.org/web/20041229035553/http://www.fortunecity.com/greenfield/wolf/51/ETMDv10.htm</a> - mirror : <a href="http://psx.arthus.net/docs/bootedit-tut-mirror.html">http://psx.arthus.net/docs/bootedit-tut-mirror.html</a> </li> <li>TMD and RSD file formats are documented here : <a href="http://psx.arthus.net/sdk/Psy-Q/DOCS/FileFormat47.pdf">http://psx.arthus.net/sdk/Psy-Q/DOCS/FileFormat47.pdf</a>, p.49 </li> <li>Usage of PsyQ utitlies are documented here : <a href="http://psx.arthus.net/sdk/Psy-Q/DOCS/Devrefs/Dataconv.pdf">http://psx.arthus.net/sdk/Psy-Q/DOCS/Devrefs/Dataconv.pdf</a> p.81, 117 &amp; 127 </li> </ul> Sun, 26 Sep 2021 02:00:00 +0200 https://www.schnappy.xyz/?psxdev-change_psx_boot_logo https://www.schnappy.xyz/?psxdev-change_psx_boot_logo PSXDEV: .bss VS .data <h2>.bss VS .data</h2> <p><code>.bss</code> is a "section [that] is guaranteed to be all zeros when the program is loaded into memory". That's a section that will always contain 0s when loaded, hence its content does not have to be stored. </p> <p><code>.data</code> is a section that's stored in the ELF, and need to be read upon loading.</p> <h3>Moving values to .data</h3> <p>Initializing a global variable with something else than <code>0</code> means moving it from <code>.bss</code> to <code>.data</code>.</p> <p>So if you're doing; e.g:</p> <pre><code class="language-c">static int8_t buffer[1024] = {1};</code></pre> <p>what you're actually doing is moving it from <code>.bss</code> to <code>.data</code>. </p> <p>A reason to do that would be to ensure that the data gets initialized to 0s even if <code>.bss</code> initialization is skipped, which you could be willing to do if this section's initialization was really slow on some hardware.</p> <h3>Implications on PSX</h3> <p>On PSX, <code>.bss</code> initialization is slow : </p> <p><strong>Nicolas Noble:</strong></p> <blockquote> <p>DMA (.data) versus a byte-wise memset (.bss) ; a byte-wise memset that's running off the bios ROM, that takes about 20 cycles per instructions therefore takes about 40 cycles per byte to set to 0. </p> </blockquote> <p>On the other hand, initializating from <code>.data</code>, you have to take into account the PSX's slow CDROM speed.</p> <h2>Source</h2> <p><a href="https://discord.com/channels/642647820683444236/663664210525290507/868225849202208838">https://discord.com/channels/642647820683444236/663664210525290507/868225849202208838</a><br /> <a href="https://stackoverflow.com/a/16557776">https://stackoverflow.com/a/16557776</a> </p> Mon, 02 Aug 2021 02:00:00 +0200 https://www.schnappy.xyz/?psxdev-.bss_vs_.data https://www.schnappy.xyz/?psxdev-.bss_vs_.data