Do-It-Yourself Hardware Spielkonsolen

Bau eines PS1 Modchips aus einem Arduino / ATmega328

PSX bootet wieder CD-Rs und Import-Disks

Ich hatte gerade noch eine PS1 auf der Werkbank. Aber ich habe noch eine zweite geschenkt bekommen. Eine ziemlich verstaubte. Und ich habe noch einen 2. Satz Kondensatoren. Also dachte ich mir, ich gebe der auch noch ein bisschen Liebe und eine gründliche Reinigung. Das Ganze wäre keinen neuen Artikel wert, da ich die Prozedur – inklusive CD-Wartung – genau so wiederholt habe.

Aber auch in dieser Playstation habe ich einen Modchip gefunden, diesmal mit 4 Kabeln. Das sagt mir, dass dieser Modchip definitiv ein dummer Chip ist, der nicht weiß, wann eine Authentifizierung erforderlich ist. Entweder sendet er ständig den SCEE Code oder nach einem festen Timing. Beides kann von einigen Spielen als Anti-Piraterie-Maßnahme erkannt werden. Deshalb wollte ich “mal eben” einen modernen Modchip einbauen. Zuerst musste der alte raus, da die Installation ziemlich krude war. Immerhin hatte der Vorbesitzer ihn großflächig mit Klebeband isoliert.

Nach einer gründlichen Reinigung und dem Austausch aller Kondensatoren sieht das Mainboard schon wieder viel ansehnlicher aus.

Alte Modchip(s) wiederverwenden?

Einer der Modchips hat seine Beschriftung weggeätzt, der andere ist ein PIC12C508A Microcontroller von Microchip Technology, der mittlerweile EOL sein sollte. Mit moderner Firmware könnte er aber immer noch das machen, was er soll. Leider ist er nur einmal programmierbar, also fällt er aus. Der andere wird etwas ähnliches sein.

Ich habe im Moment keine PICs hier herumfliegen, also habe ich nach einer Alternative gesucht und bin auf das PsNee_V8 Projekt gestoßen. Dies ist ein Fork der PsNee Open-Source Firmware mit primär einem Timing-Fix für PAL Konsolen als Arduino Sketch. Die Firmware beherrscht alle Anti-Piracy Methoden und funktioniert auf allen PS1 Modellen außer der PSone (das letzte “Slim” Modell). Dazu muss sie allerdings mit den entsprechenden Einstellungen kompiliert und ohne Bootloader und bestimmten Fuse-Bits geflasht werden. Der Weg über den Arduino Bootloader würde zu lange dauern und das Init der PS1 Firmware verpassen.

Einen Arduino nano Klon habe ich in “Box 2” gefunden, wie mir mein Bauteilmanager gesagt hat. Fuse-Bits hatte ich bei den Dingern aber noch nie setzen müssen und ohne Bootloader hatte ich auch noch nie gearbeitet, so dass ich ganz schön querlesen musste. Diese kleine Odyssee war dann doch etwas wilder, sodass ich das für mich und andere Modwillige hier niederschreiben wollte.

PsNee Software kompilieren und Arduino flashen

Da der Arduino ohne Bootloader sowieso nicht mehr über USB programmiert werden kann, habe ich seinen SPI-Port mit einem Arduino Uno verkabelt, um letzteren als Arduino als SPI”-Programmer zu verwenden. Zuvor habe ich noch den 6-poligen Header auf den Nano gelötet.

Umgebung vorbereiten

Das Projekt empfiehlt die “alte” Arduino-IDE in der Version 1.8.xx. Zusätzlich benötige ich das Minicore Addon. Dazu trage ich in den Einstellungen der IDE unter “Zusätzliche Boardmanager-URLs” die URL https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json ein. Nun installiere ich den Boardadministrator “Minicore”. Wo man vorher nur aus Arduino-Boards auswählen konnte, erscheint nun die neue Oberkategorie Minicore und die Programmiereinstellungen haben sich vervielfacht. Diese müssen wie im folgenden Screenshot dargestellt eingestellt werden.

Werkzeugmenü der Arduino IDE mit den neuen Minicore-Einstellungen
Werkzeugmenü der Arduino IDE mit den neuen Minicore-Einstellungen

Jetzt kann bereits auf “Bootloader brennen” geklickt werden, um die fehlerfreie Kommunikation zwischen PC <> Uno <> Nano zu überprüfen. Dieser Schritt löscht den Bootloader, setzt aber die Fuses nicht vollständig auf die Empfehlung des PsNee-Projekts. Ab jetzt ist es nicht mehr möglich, den Nano über USB zu programmieren, bis man den Arduino Bootloader über SPI wieder installiert hat!

Fuses lesen und setzen

Will man eine japanische PS1 modden, benötigt man spezielle Fusebits, für alle anderen sollten sie wie folgt gesetzt werden: High: DF, Low: FF, Extended: FF

Hier ist ein Fusebit-Rechner zur Berechnung und Kontrolle.

Dieser Schritt wird in der Readme des Projekts an prominenter Stelle erwähnt, aber das “Wie” wird nicht erklärt. Anscheinend kann man dafür aber die CLI-Software avrdude verwenden. Also zuerst die Fusebits lesen, um zu sehen, ob alles funktioniert. Die einzelnen Fusebits sind jeweils mit einem eigenen “-U” gekennzeichnet. Außerdem muss der Chiptyp, die serielle Schnittstelle, die Baudrate und der Programmertyp angegeben werden.

avrdude -p m328p -P /dev/ttyACM0 -c avrisp -b 19200 -U hfuse:r:-:h -U lfuse:r:-:h -U efuse:r:-:h -U lock:r:-:h

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.02s

avrdude: Device signature = 0x1e950f (probably lgt8fx328p)
avrdude: reading hfuse memory:

Reading | ################################################## | 100% 0.01s

avrdude: writing output file "<stdout>"
0xd7
avrdude: reading lfuse memory:

Reading | ################################################## | 100% 0.01s

avrdude: writing output file "<stdout>"
0xf7
avrdude: reading efuse memory:

Reading | ################################################## | 100% 0.01s

avrdude: writing output file "<stdout>"
0xff
avrdude: reading lock memory:

Reading | ################################################## | 100% 0.01s

avrdude: writing output file "<stdout>"
0xcf

avrdude: safemode: Fuses OK (E:FF, H:D7, L:F7)

avrdude done.  Thank you.Code-Sprache: Bash (bash)

Als nächstes setze ich die Fuses wie empfohlen.

avrdude -p m328p -P /dev/ttyACM0 -c avrisp -b 19200 -U lfuse:w:0xFF:m -U hfuse:w:0xDF:m -U efuse:w:0xFF:m

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.02s

avrdude: Device signature = 0x1e950f (probably lgt8fx328p)
avrdude: reading input file "0xFF"
avrdude: writing lfuse (1 bytes):

Writing | ################################################## | 100% 0.02s

avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0xFF:
avrdude: load data lfuse data from input file 0xFF:
avrdude: input file 0xFF contains 1 bytes
avrdude: reading on-chip lfuse data:

Reading | ################################################## | 100% 0.01s

avrdude: verifying ...
avrdude: 1 bytes of lfuse verified
avrdude: reading input file "0xDF"
avrdude: writing hfuse (1 bytes):

Writing | ################################################## | 100% 0.02s

avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0xDF:
avrdude: load data hfuse data from input file 0xDF:
avrdude: input file 0xDF contains 1 bytes
avrdude: reading on-chip hfuse data:

Reading | ################################################## | 100% 0.01s

avrdude: verifying ...
avrdude: 1 bytes of hfuse verified
avrdude: reading input file "0xFF"
avrdude: writing efuse (1 bytes):

Writing | ################################################## | 100% 0.01s

avrdude: 1 bytes of efuse written
avrdude: verifying efuse memory against 0xFF:
avrdude: load data efuse data from input file 0xFF:
avrdude: input file 0xFF contains 1 bytes
avrdude: reading on-chip efuse data:

Reading | ################################################## | 100% 0.01s

avrdude: verifying ...
avrdude: 1 bytes of efuse verified

avrdude: safemode: Fuses OK (E:FF, H:DF, L:FF)

avrdude done.  Thank you.Code-Sprache: PHP (php)

Sketch anpassen und hochladen

Da diese PS1 nicht japanisch ist, kann ich die meisten Einstellungen ignorieren und muss nur die Zeile auskommentieren.

#define PAL_FAT          // Use for all PAL FAT models. No BIOS patching needed.
Code-Sprache: Arduino (arduino)

Im Github-Repository sind die Header-Dateien in das Unterverzeichnis ausgelagert, werden aber im Sketch ohne dieses referenziert. Auch das musste ich schnell anpassen.

#include "include/config.h"
#include "include/settings.h"
#include "include/patching.h"Code-Sprache: Arduino (arduino)

Und los geht die wilde Fahrt.

Arduino IDE mit geöffnetem PsNee Sketch

Nach dem Flashen leuchtet die steuerbare LED (im Gegensatz zu vorher nach dem Löschen des Bootloaders). Diese LED wird in Zukunft anzeigen, wann der Kopierschutzcode injiziert wird. Der PsNee Modchip ist nun fertig und kann installiert werden.

PsNee Modchip einbauen

Bevor ich mit dem Löten beginne, befestige ich den Nano an einer Stelle, an der Platz zwischen der Platine und dem unteren RF Shield ist. An dieser Stelle sollten keine Standoffs in der Abschirmung sein. Und die Drähte sollten so kurz wie möglich sein.

Beim PU-18 Mainboard sind die Lötpunkte hier. Aber auch die anderen Mainboards sind in der Installationsanleitung berücksichtigt.

Lötpunkte auf PU-18 Mainboard
Lötpunkte auf PU-18 Mainboard
PsNee / Arduino Nano Pinout

Ich verwende silikonbeschichteten Draht, den ich mit einer Pinzette und einer Nadel in die gewünschte Form biege. Unter dem Arduino habe ich Kaptonband zur Isolierung angebracht. Beim Passtest stellt sich heraus, dass sowohl die Stiftleiste als auch der USB-Port zu dick sind. Diese müssen also weg. Dann entferne ich an jedem Draht etwas von der Silikonummantelung und verlöte die Konstruktion.

Arduino nano mit PsNee_V8 Firmware

Diese PS1 ist wirklich sehr hübsch geworden und ihr Zustand ist fast makellos. Und jetzt bootet sie auch wieder jeden beliebigen Code.

Gewartete und gereinigte PSX in hervorragendem Zustand
Gewartete und gereinigte PSX in hervorragendem Zustand

Autor

Seit Kindheitstagen ist der Computer sein Begleiter. Was mit Linux anfing, wurde 2005 ein/e Beruf/ung, die weit über den Arbeitsplatz hinausgeht. Durch stetige Weiterentwicklung fasste er auch im *BSD Segment Fuß und bietet mittlerweile professionelle Lösungen im Bereich Hosting, Networking und Infrastruktur an. Als Ausgleich beschäftigt er sich neben Computerspielen mit der Fotografie.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.