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.
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.
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.
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.
Diese PS1 ist wirklich sehr hübsch geworden und ihr Zustand ist fast makellos. Und jetzt bootet sie auch wieder jeden beliebigen Code.