Java für Playstation 2 - ist das möglich?

Ursprünglicher Autor: Michael Kohn
  • Übersetzung
Bild

Einleitung


Mit diesem Projekt wollte ich eine Frage beantworten: Ist es möglich, eine Java-API für die Playstation 2 zu schreiben und darauf eine grafische Demo zu erstellen. Ich möchte keine Spoiler preisgeben, aber die Antwort lautet "Ja".

Vor einigen Jahren habe ich das Java Grinder- Projekt gestartet , das kompilierte Java-Klassendateien erhält und tatsächlich als Disassembler arbeitet. Anstatt Java in Assembler-Code zu zerlegen, erfolgt die Zerlegung in Assembler-Quellcode für echte Prozessoren. Wenn eine Klassendatei andere Klassendateien benötigt, werden diese ebenfalls gelesen und verarbeitet. Alle API-Methodenaufrufe werden in die Ausgabe geschrieben, entweder als Inline-Assembler-Code oder als Aufrufe von zuvor geschriebenen Funktionen, die ihre beabsichtigte Aufgabe ausführen.

Da Java Grinder in objektorientierten, objektorientierten, abstrakten, polymorphen und viel lauteren HR-Wörtern geschrieben wurde, musste für die Erweiterung eine Playstation2-Klasse erstellt werden, mit der die neue R5900-Klasse erweitert wurde.

Als Ergebnis war das Projekt mehr als ich erwartet hatte. Das System selbst ist ziemlich einfach, aber ich habe noch viel zu lernen und es ist nicht so einfach, nach Qualitätsinformationen zu suchen. Zum ersten Mal in diesem Projekt habe ich echte 3D-Programmierung aufgenommen. In einem anderen Beitrag habe ich bereits darüber gesprochen, was ich auf meiner Playstation 2-Programmierseite gelernt habe .

Nachfolgend finden Sie Videos und eine detaillierte Erläuterung des Entwicklungsprozesses.

Video



Ich habe eine Demo auf der PS2 slim aufgenommen, indem ich Audio- und Videokabel an einen DVD-Recorder anschließe. Ich war etwas besorgt, dass die PS2 über einen Macrovision-Schutz verfügt, der das Videosignal ruinieren könnte, aber entweder war sie ausgeschaltet oder der DVD-Recorder ignorierte sie. Das Video beginnt mit einer Demonstration dieser Playstation 2, auf der eine Demo läuft. Die Konsole ist mit einem Composite-Signal-VGA-Konverter verbunden, der mit einem LCD-Display verbunden ist. Dies zeigt, dass die Demo auf einer echten Maschine läuft. Dann fügte ich diesem Video einen Spleiß hinzu, der direkt von der PS2 im DVD-Recorder aufgenommen wurde.

YouTube: https://youtu.be/AjM069oKUGs

Zugehörige Projekte auf mikekohn.net


Java Grinder:Playstation 2 Java ,
Sega Genesis Java ,
Apple II Java ,
TI99 / 4A Java ,
C64 Java ,
dsPIC-Mandelbrots ,
Atari 2600 Java ,
chipKIT Java ,
Java Grinder ,
naken_asm

Demo


Ich erinnere mich an die Sega Genesis Java- Demo . Es tut mir leid, dass ich sie nicht interessanter gemacht habe. Dann war es für mich interessanter, die Fähigkeiten der Java API zu demonstrieren. Als ich dieses Projekt startete, entschied ich mich, etwas ernsthafteres zu machen. Leider bin ich wieder ausgebrannt, als ich das System studierte und eine API erstellte, die nicht ausreichte, um eine große Demo zu erstellen.

  • 3 Billion Devices Logo: Dies ist ein 3 Milliarden Gerät mit niedriger Auflösung und Java-Logo, das Joe Davisson für seine Commodore 64 Java- Demo erstellt hat .
  • Logos: Ich habe sie mit einem Marker gezeichnet und gescannt (mit Ausnahme des Java-Logos).
  • Sterne: Ich habe den Code tatsächlich aus der Sega Genesis Java- Demo kopiert und an die Playstation 2-API angepasst. Der Text wird auch hier mit einer Markierung geschrieben und gescannt.
  • Mandelbrot-Fraktale: Sie werden mit der Vektoreinheit 0 dargestellt, die Fraktale berechnet, und die Vektoreinheit 1 führt 3D-Berechnungen durch. MIPS steuert, was beide Vektorgeräte tun.
  • Cubes: Ich habe diese Cubes in Wings3d gezeichnet und C-Code geschrieben, um STL-Dateien in Arrays zu konvertieren, die Java Grinder verwenden kann . Ich habe die Farben manuell hinzugefügt.
  • Ring der Quadrate: Nur ein Versuch, viele sich bewegende Objekte auf dem Bildschirm zu zeichnen. Es hat sich wahrscheinlich gelohnt, weitere Objekte hinzuzufügen, bis das System langsamer wurde.

Musik


Für die Demo habe ich drei Kompositionen komponiert und aufgenommen, aber als Ergebnis habe ich nur zwei verwendet. Die erste Komposition ist eigentlich eine Melodie, die ich für ein anderes Projekt geschrieben habe, das vor etwa einem Jahr auf meiner Website veröffentlicht wurde ( das Münzprüferprojekt ). Anfangs gab es nur einen Teil. Nachdem das Projekt abgeschlossen war, dachte ich, es wäre interessant, ein Gitarrensolo darauf zu setzen, und nach der Aufnahme stellte ich mir vor, dass diese Musik spielt, während die Stars in der Demo fliegen. Ich habe es erst nach wenigen Monaten geschafft. Die Gitarre in der Komposition ist die Fender Strat I-Muschel .

Das zweite Lied habe ich nur einen Tag vor der Veröffentlichung des Artikels aufgenommen. Das Gitarrensolo klingt ein bisschen… betrunken, weil es auf einer Gitarre gespielt wird, die ich zu einem Fretless gemacht habe. Ich kann es nicht sehr gut spielen und die hohen Töne werden sehr schnell ausgeblendet, aber die Folien klingen ziemlich cool. Der Rhythmuspart wurde auf meinem Yngwie Wanna-Be-Kit gespielt (billig überbackene Squier Strat, DOD YJM308-Overdrive und Mini-Marshall mit 9-Volt-Batterien).

Ich habe das Schlagzeug für beide Songs mit Hilfe des Programms Drums ++ programmiert, das vor langer Zeit geschrieben wurde . Es empfängt Textdateien, die in der von mir erfundenen Sprache geschrieben sind, und wandelt sie in .mid-Dateien um, die ich in die Apple Garage Band importiert habe. Danach können Sie Grund- und Gitarrenspuren aufnehmen. Die Quelldateien fretless.dpp und shoebox.dpp befinden sich im Assets-Ordner meines Demo-Repositorys.

Die Musik wird auf dem SPU2-Gerät der Playstation 2 abgespielt. Dank des R5900-Chips können andere Aufgaben erledigt werden. Wegen der fehlenden Dokumentation habe ich die Demo fast ohne Musik beendet. Mehr dazu unten.

Hier sind zwei MP3-Songs:


Entwicklung


Das Projekt wurde lange Zeit entwickelt. Ich fing an, die R5900 Emotion Engine-Anweisungen zum MIPS-Assembler in naken_asm hinzuzufügen , dann nahm ich Gleitkomma-Anweisungen und Makro- / Mikro-Modus-Vektor-Einheitenanweisungen auf. Nach einer großen Verschnaufpause für andere Projekte erkundete ich alle anderen Aspekte, die für diese Demo erforderlich waren, und fügte hinzu, ihre Unterstützung in Java Grinder hinzuzufügen . Wenn sich jemand für Low-Level-Details interessiert, habe ich eine Seite erstellt, auf der ich alle gesammelten Informationen dokumentieren wollte: Playstation 2-Programmierung .

Ich habe hauptsächlich mit dem PCXS2-Emulator programmiert. Es ist sehr praktisch, weil ich darin Register und ähnliches auf dem Bildschirm erkunden kann. Es ist jedoch definitiv nicht so flexibel und einfach wie MAME bei der Entwicklung der Sega Genesis . In MAME ist es beispielsweise einfacher, Arbeitsspeicher und RAM sowie Video- / Audio-Register zu untersuchen, um sicherzustellen, dass der Java Grinder ordnungsgemäß funktioniert .

Bei der Arbeit mit dem Code für Sega habe ich einen Fehler gemacht - ich habe ihn nicht auf der Maschine getestet, bis die Demo geschrieben wurde. Im Sega-Code gab es mindestens drei Seltsamkeiten, die der Emulator ignorierte, aber sie mochten das echte Auto nicht. Nachdem ich diesmal separate Teile des Codes geschrieben hatte, testete ich sie auf einer echten Maschine. Nach Abschluss der Demo funktionierte sie auf der realen Hardware und im Emulator. Ich stieß wieder auf Dinge, die im Emulator funktionierten, lief aber nicht mit einer echten PS2. Ich habe auch herausgefunden, was auf einer echten Playstation 2 funktioniert, aber sie wurde im Emulator falsch ausgeführt.

API-Funktionen


  • Vector Unit 0 verfügt über Methoden zum Laden / Ausführen von Code und zum Laden / Entladen von Daten.
  • Die Vektoreinheit 1 führt 3D-Drehungen und -Projektionen durch.
  • Texturen im 16-Bit- oder 24-Bit-Format (Transparenz wird schwarz angezeigt).
  • Texturen im 16-Bit-Format können RLE codiert werden.
  • Der Code zum Zeichnen von Punkten, Linien, Dreiecken mit und ohne Texturen.
  • Nebel und Schattierung von Guro.
  • Methoden für den Zugriff auf einen Zufallszahlengenerator.
  • Zwei Kontexte verwenden (Seiten ersetzen)
  • Einfügen großer binärer Daten in kompilierten Assembler-Code.
  • Musik abspielen

API


Der Hauptteil der API ist in der Playstation2- Klasse definiert . Anfangs wollte ich ihm ein größeres Maß an Freiheit geben - die Möglichkeit, Videomodi und ähnliches einzustellen, aber dann dachte ich, dass es vielleicht besser wäre, all diese Schwierigkeiten zu verbergen. Tatsächlich wird die Anzeige durch Interlaced-Scanning einfach auf 640 x 488 eingestellt. Wie bei anderen Java Grinder- Projekten habe ich grundsätzlich Methoden / Funktionen nach Bedarf hinzugefügt.

Es gibt noch eine Reihe von Klassen, die ich den langweiligen Namen Draw3D gegeben habe. In der Tat definieren sie alle Arten von Grundelementen, die der Graphics Synthesizer mit Unterstützung für 16-, 24- und 32-Bit-Texturen zeichnen kann. Ich dachte darüber nach, 8-Bit-Texturen hinzuzufügen, entschied mich jedoch, es noch nicht zu tun. Draw3D bietet 3D-Drehungen, Projektion, Hardware-DMA-Übertragung, Texturen usw. Sie werden sich wahrscheinlich fragen, warum ich es nicht auf OpenGL-Basis erstellt habe, aber ich hatte zuvor noch nie mit OpenGL gearbeitet. Ich war einmal mit der einfachen Programmierung von ps2dev beschäftigt, aber da war nichts Ernstes und ich erinnere mich kaum an dieses Projekt, also wiederhole ich - wir können davon ausgehen, dass dies das erste Mal ist, dass ich etwas Ernstes in 3D mache.

Es gibt Beispiele für die Verwendung all dieser Dinge, nicht nur in der Demo, sondern auch im Beispielordner .
Fast alle Schwierigkeiten sind in der API verborgen. Der Entwickler muss sich nicht um das Löschen des Cache, um 3D-Computing usw. kümmern. Der dafür bezahlte Preis war jedoch eine Verringerung der Vielseitigkeit. Wenn die Textur beispielsweise vom Prozessor geändert wurde, sich aber nur die ersten 64 Pixel geändert haben, muss nur eine 64-Byte-Cachezeile gelöscht werden. Der Java-Grinder löscht jedoch das gesamte Bild. Es markiert Objekte, sodass sie nur dann gelöscht werden, wenn dies erforderlich ist, aber das gesamte Fragment des Speichers wird gelöscht. Wenn Sie 64 Byte ändern, ändert sich mit einer hohen Wahrscheinlichkeit auch das gesamte Bild.

Vektoreinheit 0 (VU0)


Java Grinder-Benutzer können VU0 kostenlos verwenden. Ich habe den Demo-Teil "Two Vector Units, One MIPS" verwendet, um die Mandelbrot-Fraktale zu zeichnen. Der Code kann besser optimiert werden, zum Beispiel haben die meisten Gleitkomma-Vektorbefehle eine Zeit von 1 und eine Latenzzeit 4. Nach meinem Verständnis bedeutet dies, dass, wenn ein Register ein Ziel für einen Befehl ist, es in einem Zyklus ausgeführt werden kann, jedoch in der Reihenfolge Das Ergebnis ist verfügbar, es dauert 4 Zyklen. Wenn dieses Register verwendet wird, bleibt die Vektoreinheit inaktiv, bis sie bereit ist. Daher sollten Sie die Anweisungen so anordnen, dass Sie jede Anweisung in einem Zyklus ohne Ausfallzeiten ausführen können. Als ich letztes Jahr Mandelbrot-Fraktale auf einer Playstation 3 erstellt habeIch habe diesen Code optimiert und gleichzeitig 8 Pixel (2 SIMD-Register) gleichzeitig berechnet. Dabei wurde eine starke Geschwindigkeitssteigerung festgestellt. Im aktuellen Fall habe ich versucht, den Code lesbarer zu machen, sodass ich mich nicht mit der Optimierung beschäftigte.

VU0 enthält nur 4 KB Datenspeicher, und dort wird nicht das gesamte Bild des Fraktals aufgezeichnet. Daher sendet MIPS nur 1/8 der Koordinaten gleichzeitig.

Die Fremdartigkeit, die mir bei der Arbeit mit VU0 begegnet ist: Ich habe den VU0-Code zunächst mit Anweisungen ausgeführt und mit VIF0_STAT den Abschluss der Ausführung überprüft. Es scheint, dass VIF0_STAT nur funktioniert, wenn Sie VU0 mit einem VIF-Paket starten. Dies ist im Emulator behoben, der Fehler ist jedoch in der realen Hardware noch vorhanden. Als Ergebnis fand ich heraus, dass vcallms und die Verwendung von cfc2 in Register 29 in beiden Fällen funktionieren.

Es scheint mir, dass den Befehlssätzen für Vektoreinheiten der parallele Vergleichsbefehl fehlt, der in Intel X86_64, Playstation 3 und sogar im MIPS R5900 Emotion Engine-Befehlssatz enthalten ist. Mandelbrot-Fraktale müssen eine Formel iterativ berechnen, bis das Ergebnis übersteigt. Daher würde ich bei einem anderen Satz von Anweisungen einfach einen Parallelvergleich durchführen, der eine Maske für alle binären 1 oder 0 erstellt. Mit der Maske kann das Inkrementieren von Farbzählern gestoppt werden. Für die Playstation 2 musste ich eine sehr unbeholfene Formel herleiten, die der fraktalen Formel ziemlich nahe kommt. Ich habe es im Quellcode mandelbrot_vu0.asm in Zeilen mit auskommentiertem Python dokumentiert .

Ich finde es großartig bei den Geräten der Playstation 2 Console Vector Unit, dass ich keine anderen Sätze von SIMD-Anweisungen gesehen habe, in denen alle FPU-Anweisungen ein .xyzw-Attribut haben können, das die vier Fließkommazahlen angibt beeinflusst. Das heißt, wenn ich das Ergebnis der Anweisung brauchte, um nur die x-Komponente des Vektors zu beeinflussen, dann würde ich einfach .x am Ende der Anweisung hinzufügen. Eine andere interessante Sache ist, dass dies ein Satz von VLIW-Befehlen ist, das heißt, dass in jedem Zyklus zwei Befehle gleichzeitig ausgeführt werden. Tatsächlich ähnelt das Modul eher einem DSP als einem Universalprozessor.

Vektoreinheit 1 (VU1)


VU1 ist von Java Grinder für die Durchführung von 3D-Drehungen, Bewegungen und Projektionen reserviert. Draw3D-Objekte werden mit der draw () -Methode an VU1 übergeben. Dabei werden mit dem Vector Unit Assembler Punkte konvertiert und an den Graphics Synthesizer übertragen. Der Assembler-Code in VU1 kann zwar wesentlich schneller optimiert werden, ist aber für meine Zwecke geeignet. Daher habe ich mich entschieden, den Code gut lesbar zu machen (nicht optimiert).

Um die Formeln von Projektionen und Wendungen zu studieren, habe ich Wikipedia: Projektionen und Wendungen verwendet .

Der 3D-Transformationscode befindet sich auch im naken_asm- Repository als einfache .asm-Datei: rotation_vu1.asm .

MIPS R5900


Ich mochte den MIPS-Befehlssatz nicht wirklich, bis ich an diesem Projekt arbeitete. Tatsächlich ist diese CPU sehr einfach zu bedienen. Die Emotion Engine-Version dieser CPU verfügt über sehr praktische Funktionen. Vor allem Register haben eine Länge von 128 Bits, werden jedoch in der Tat einfach zum Laden / Speichern und zum SIMD verwendet. Das heißt, in Wirklichkeit sind dies 128-Bit-Register, 64-Bit-ALU und 32-Bit-Zeiger.

Es war auch möglich, eine Optimierung des MIPS-Hauptcodes vorzunehmen, aber ich habe es nicht getan, um den Code lesbar zu halten oder aus Zeitmangel. Beispielsweise ist die MIPS-CPU für einen Zyklus inaktiv, wenn das Zielanweisungsregister unmittelbar nach seiner Einstellung verwendet wurde. Dieses Verhalten könnte verbessert werden.

Java-Hacks


In der Java-Mühle selbstes gibt auch ... kuriositäten, aber etwas ist einfach nicht genug, hauptsächlich, weil ich anfangs auf MSP430 gerichtet war und es größtenteils ein experiment war. Eines der fehlenden Elemente war die Unfähigkeit, Speicher für Objekte zu reservieren. Ich habe diese Funktion in Playstation 2 hinzugefügt, um Instanzen mehrerer Objekte zu erstellen, hauptsächlich mit der Draw3D-API. Ich habe keine Speicherzuteiler oder Speicherbereiniger geschrieben, daher werden alle Aufrufe von "neu" auf dem Stack ausgeführt. Ich habe darüber nachgedacht, etwas wie einen dynamischen Speicherzuweiser zu implementieren, aber am Ende entschied ich mich, die Dinge nicht zu komplizieren. Ich habe auch erweiterte Unterstützung für Gleitkommazahlen (Float) für die Playstation 2 hinzugefügt (einige dieser Unterstützung befand sich noch im Code von Epiphany / Parallella). Einige andere Dinge wie die Typen "long" und "double" werden immer noch nicht unterstützt.

Das Ärgerlichste war wahrscheinlich die schreckliche Einschränkung der Java-Klassendateien. Die Java-Methode darf nicht mehr als 64 KB sein, wenn ich mich richtig erinnere. Das ist vielleicht normal, aber das Problem tritt auf, wenn sich in der Klassendatei ein statisches Array befindet und es nicht als Binärdaten in die Klassendatei geschrieben wird. Es wird in einer Klassendatei als Assembly-Java-Anweisung in einem statischen Initialisierer zum Erstellen eines Arrays platziert. Ich habe versucht, Bilder als statische Byte [] - Arrays in Klassendateien zu speichern, aber einige von ihnen passten nicht. Daher fügte ich der Klassendatei der Klasse "Memory Java Grinder" eine Methode hinzu:

byte[] Memory.preloadByteArray(String filename);

Es lädt diese Datei nicht zur Laufzeit, sondern lädt sie zur Buildzeit mit der .binfile naken_asm- Direktive . Bilder werden zur Erstellungszeit in die binäre Ausgabedatei kopiert.

In diesem Sinne hoffe ich sehr, dass James Gosling niemals über mein Projekt stolpern wird.

Bilder


Die Draw3D-API kann 16-, 24- und 32-Bit-Texturen verwenden. Textur-Pixel können Pixel für Pixel oder durch Laden mit Byte [] - Arrays angegeben werden. Ich fügte außerdem die Möglichkeit hinzu, RLE-Bilder im Format {length, lo16, hi16} zu komprimieren, wobei lo16 und hi16 das 16-Bit-Little-Endian-Format sind, das in die Texturlänge "mal" kopiert wird.

Werkzeuge


Bei der Arbeit an Sega zur Erstellung von Tools zum Erstellen von Bildern, Musik und Ähnlichem habe ich die Google Go-Sprache verwendet, nur um eine neue Sprache zu lernen. Dieses Mal habe ich Rust versucht. Das erste Tool konvertiert Binärdateien in Java-Quellcode und das zweite Tool konvertiert BMP in ein Binärformat, das in Texturen einschließlich RLE geladen werden kann. Daher habe ich sie in Python geschrieben, falls jemand mit mir eine Demo erstellen möchte.

Ton


Nach der Funktionsweise der Grafiken und Geräte der Vector-Einheit war der letzte Schritt der Klang. Ich dachte, es wäre der einfachste Teil, vor allem nachdem ich ein PDF mit einer Beschreibung von Sony SPU2 studiert hatte. Wie war ich falsch? Dieser Teil des Systems ist sehr schlecht dokumentiert.

Das erste, was ich herausfand, ist, dass SPU2 (Sound Processing Unit) an einen IOP (I / O-Prozessor, auch als Playstation 1-Prozessor bezeichnet) angeschlossen ist. Die Playstation 2-CPU ist über ein sogenanntes SIF mit diesem IOP verbunden. In der PDF-Datei von Sony wird nur SIF-DMA erwähnt, über die Verwendung wird jedoch nichts gesagt.

Daher lehnte ich es ab, SIF zu verwenden, entschied mich jedoch, naken_asm einen Linker hinzuzufügen, damit ich kernel.a vom PS2DEV-SDK verwenden kann. Linker verdient, aber es ist nichts passiert.

Zu diesem Zeitpunkt hatte ich bereits entschieden, dass ich den Sound nicht machen kann, und wollte die Demo einfach ohne fertigstellen. Aber es quälte mich, also beschloss ich, mir den Quellcode verschiedener Playstation 2-Emulatoren anzusehen, um herauszufinden, wie SIF funktioniert. Schließlich habe ich herausgefunden, wie direkter Speicherzugriff über den MIPS R3000-Code im IOP ausgeführt und ausgeführt werden kann (ein Beispiel befindet sich im Beispielordner des Repositorys naken_asm). Es ist mir gelungen, den Sound im Emulator zu arbeiten.

Am Ende fand ich heraus, dass der IOP-Speicher (einschließlich SPU2) im Emotion Engine-Bereich platziert wurde. Daher wurde viel Mühe aufgewendet (es gibt nur wenig Dokumentation und ist in keinem der Emulatoren vollständig implementiert, aber für seine Arbeit spielt es keine Rolle Ich lernte, mit Sound zu arbeiten.

Vergleich von Emulator und Eisen


Ich fand einige Unterschiede zwischen dem Ausführen auf einer echten Maschine und in einem Emulator.

  • Wenn das GIF-Paket das PRIM-Register auf beide IIP-Werte setzt (Schattierungsmethode) und die FIX-Bits alle 1 sind, berücksichtigt der Emulator das IIP-Bit und führt eine Goura-Schattierung aus, während die eigentliche Ausrüstung eine flache Schattierung durchführt.
  • Wenn das GIF-Paket über PATH3 (EE direkt an GS) übertragen wird und das EOP-Flag (Ende des Pakets) nicht gesetzt ist, dann, wenn VU1 versucht, das GIF-Paket über PATH 1 (VU1 bis GS) zu senden, dann hängt es in echter Hardware, aber wird im Emulator arbeiten.
  • Das Überspringen des Löschens des CPU-Caches vor der DMA-Übertragung ist nicht erforderlich, führt jedoch auf einer realen Maschine zu einem merkwürdigen Verhalten.
  • Wenn Sie die SPU2 im EE-Bereich platzieren, kann der Emulator die Audiodaten einfach im FIFO SPU2 aufnehmen. Auf einer echten Playstation 2 müssen Sie, nachdem Sie 32 Halbwörter geschrieben haben, in das Register schreiben, um den Befehl zum Löschen des FIFOs zu geben. Auch bei echter Hardware muss beim Einstellen der Sende- / Startadresse der SPU2 der Übertragungsmodus auf 0 eingestellt werden. Den Emulatoren ist es egal, ob der Modus den Wert 0 hat.
  • Das Schreiben in die Register des zugewiesenen IOP-Speichers von EE führt dazu, dass die reale Maschine ausfällt, obwohl sie sich im Kernelmodus befindet. Mit dem Emulator können solche Operationen unabhängig vom aktuellen CPU-Modus ausgeführt werden.
  • Verwenden von Kanälen SIF DMA funktioniert im Emulator, aber ich konnte sie nicht dazu bringen, an echten Geräten zu arbeiten. Ich habe auch im Kernelmodus einen Speicherzugriffsfehler für SIF-DMA-Register erhalten.
  • Der Emulator ist zu langsam für die Demo, wenn Fraktale mit VU0 berechnet werden, so dass der Ton nicht synchron ist.

Zusammenfassend


Ich wollte von Anfang an ein Programm für die Playstation 2 schreiben. Tatsächlich hatte ich bereits ein Linux-Kit für PS2 (ich glaube, aus diesem Grund habe ich Playstation 2 erworben), und ich habe sogar versucht, mit PS2DEV in C zu arbeiten. Dies ist jedoch eine völlig andere Erfahrung als bei der Programmierung in Assembler für Eisen.

Ich muss Lukash dafür danken, dass er den alten Assembly-Quellcode und die PS2-Dokumente aufbewahrt hat. Ich bin mir nicht sicher, ob ich überhaupt ohne die 3 Star Duke-Entwickler-Demo starten könnte, die mir beim Initialisieren der Hardware half. Ich bin auch den Entwicklern des PCSX2- Emulators dankbar., beschleunigte den Debugging-Prozess erheblich. Außerdem konnte ich nicht mit dem Sound umgehen, wenn ich nicht den Quellcode des Emulators angesehen und nicht verstanden hatte, was falsch war.

Und danke an Sony für diesen schönen kleinen Computer. Wenn jemand von Sony diesen Artikel liest, dann ist hier ein Tipp für Sie: Warum nicht auf die Größe von Rapsberry Pi drücken und als Gebühr für Hobbyprojekte verkaufen? :)

Demo erstellen


git clone https://github.com/mikeakohn/playstation2_demo.git
git clone https://github.com/mikeakohn/java_grinder.git
git clone https://github.com/mikeakohn/naken_asm.git
cd naken_asm
./configure
make
cd ..
cd java_grinder
make java
make
cd ..
cd playstation2_demo
make

Jetzt auch beliebt: