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

Bild

Einführung


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

Vor einigen Jahren habe ich ein Java Grinder- Projekt gestartet, das kompilierte Java-Klassendateien empfängt und tatsächlich als Disassembler arbeitet. Anstatt jedoch in Java-Assembler-Code zu zerlegen, wird er für echte Prozessoren in Assembler-Quellcode zerlegt. Wenn die Klassendatei andere Klassendateien benötigt, werden diese ebenfalls gelesen und verarbeitet. Alle API-Methodenaufrufe werden entweder als integrierter Assembler-Code oder als Aufruf vorab geschriebener Funktionen, die ihre beabsichtigte Aufgabe ausführen, in die Ausgabe geschrieben.

Da Java Grinder in C ++ geschrieben wurde, objektorientierte, abstrahierte, polymorphe und viele weitere bekannte HR-Lieblingswörter, war es zum Erweitern hauptsächlich erforderlich, die Playstation2-Klasse zu erstellen, die neue R5900-Klasse zu erweitern und die Hauptgenerator-Klasse zu erweitern.

Infolgedessen stellte sich heraus, dass das Projekt größer war als ich erwartet hatte. Das System selbst ist recht einfach, aber ich muss noch viel lernen, und es ist nicht so einfach, qualitativ hochwertige Informationen zu finden. Tatsächlich habe ich zum ersten Mal in diesem Projekt echte 3D-Programmierung aufgenommen. In einem anderen Beitrag habe ich bereits darüber gesprochen, was ich auf meiner Playstation 2-Programmierseite gelernt habe.

Unten finden Sie ein Video und eine detaillierte Erläuterung des Entwicklungsprozesses.

Video



Ich habe eine Demo auf einer PS2 Slim aufgenommen, indem ich Audio- und Videokabel an einen DVD-Brenner angeschlossen habe. Ich war ein wenig besorgt, dass die PS2 einen Macrovision-Schutz hatte, der das Videosignal ruinieren würde, aber er war entweder ausgeschaltet oder der DVD-Recorder ignorierte ihn. Das Video beginnt mit einer Demonstration der realen Playstation 2, auf der eine Demo ausgeführt wird. Die Konsole ist mit einem zusammengesetzten Signal-VGA-Wandler verbunden, der mit einem LCD-Display verbunden ist, um zu beweisen, dass die Demo auf einem realen Computer ausgeführt wird. Dann habe ich einen Kleber mit dem echten Video hinzugefügt, das direkt von der PS2 im DVD-Recorder aufgenommen wurde.

YouTube: https://youtu.be/AjM069oKUGs

Ähnliche Projekte bei mikekohn.net


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

Demo


Ich erinnere mich an die Java- Demo von Sega Genesis und bedauere ein wenig, dass ich sie nicht interessanter gemacht habe. Dann war es für mich interessanter, die Funktionen der Java-API zu demonstrieren. Als ich dieses Projekt startete, beschloss ich, etwas Ernsthafteres zu tun. Leider war ich beim Studium des Systems und beim Erstellen der API wieder so ausgebrannt, dass ich nicht genug Kraft für eine große Demo hatte.

  • 3-Milliarden-Geräte-Logo: Dies ist das niedrigauflösende 3-Milliarden-Geräte-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).
  • Stars: Ich habe den Code aus der Sega Genesis Java- Demo kopiert und ihn so geändert, dass er mit der Playstation 2-API funktioniert. Der Text hier wird ebenfalls mit einem Marker geschrieben und gescannt.
  • Mandelbrot-Fraktale: Sie werden mit der Vektoreinheit 0 demonstriert, 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 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, bevor das System langsamer wurde.

Musik


Für die Demo habe ich drei Songs 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 ungefähr einem Jahr auf meiner Website veröffentlicht wurde ( Münzakzeptorprojekt ) ... 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 ein paar Monaten geschafft. Die Gitarre in der Komposition ist Fender Strat I überbacken .

Ich habe die zweite Komposition nur einen Tag vor der Veröffentlichung des Artikels aufgenommen. Das Gitarrensolo klingt ein wenig ... betrunken, weil es auf einer Gitarre gespielt wird, die ich in Fretless verwandelt habe. Ich kann es nicht sehr gut spielen und hohe Noten werden sehr schnell ausgeblendet, aber die Folien klingen ziemlich cool. Der rhythmische Part wurde auf meinem Yngwie-Kit gespielt (billiger überbackener Squier Strat, DOD YJM308 Overdrive und Mini-Marshall mit 9-Volt-Batterien).

Ich habe Schlagzeug für beide Kompositionen mit dem lang geschriebenen Programm Drums ++ programmiert. Es empfängt Eingabetextdateien, die in meiner eigenen Sprache aufgezeichnet wurden, und wandelt sie in .mid-Dateien um, die ich in das Apple Garage Band importiert habe. Danach können Sie Basis- und Gitarrenspuren aufnehmen. Die Quelldateien fretless.dpp und shoesbox.dpp befinden sich im Assets-Ordner meines Demo-Repositorys.

Die Musik wird von der Playstation 2 SPU2 wiedergegeben und kann dank des R5900 andere Arbeiten ausführen. Aufgrund des Mangels an guter Dokumentation habe ich die Demo fast ohne Musik beendet. Mehr dazu weiter unten.

Hier sind zwei Titel im MP3-Format:


Entwicklung


Das Projekt wurde lange entwickelt. Ich fing an, dem MIPS-Assembler in naken_asm R5900 Emotion Engine-Anweisungen hinzuzufügen , und ging dann zu Gleitkomma-Anweisungen und Anweisungen für Makro- / Mikrovektoreinheiten über . Ich machte eine große Pause, um an anderen Projekten zu arbeiten, studierte alle anderen Aspekte, die für diese Demo erforderlich waren, und fügte ihre Unterstützung Java Grinder hinzu . Wenn jemand an Details auf niedriger Ebene interessiert ist, habe ich eine Seite erstellt, auf der ich versucht habe, alle gesammelten Informationen zu dokumentieren: Playstation 2-Programmierung .

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

Bei der Arbeit mit dem Code für Sega habe ich einen Fehler gemacht: Ich habe ihn erst auf dem Computer getestet, als die Demo geschrieben wurde. Es gab mindestens drei Kuriositäten im Sega-Code, die der Emulator ignorierte, aber die reale Maschine gefiel ihnen nicht. Dieses Mal habe ich nach dem Schreiben der einzelnen Teile des Codes diese auf einer realen Maschine getestet, sodass sie nach Abschluss der Demo sowohl auf realen Geräten als auch auf dem Emulator funktioniert. Ich bin wieder auf Dinge gestoßen, die im Emulator funktionierten, aber nicht auf einer echten PS2 gestartet sind. Ich habe auch festgestellt, dass es auf einer echten Playstation 2 funktioniert, aber im Emulator nicht richtig funktioniert.

API-Funktionen


  • Die Vektoreinheit 0 verfügt über Methoden zum Laden / Ausführen von Code und zum Laden / Entladen von Daten.
  • Die Vektoreinheit 1 führt 3D-Rotationen und -Projektionen durch.
  • Texturen im 16- oder 24-Bit-Format (Transparenz wird schwarz angezeigt).
  • Texturen im 16-Bit-Format können RLE-codiert werden.
  • Code zum Zeichnen von Punkten, Linien, Dreiecken mit und ohne Texturen.
  • Nebel und Schatten von Guro.
  • Methoden für den Zugriff auf einen Zufallszahlengenerator.
  • Verwenden von zwei Kontexten (Ersetzen von Seiten)
  • Fügen Sie große Binärdaten in den kompilierten Assembler-Code ein.
  • Musik spielen.

API


Der Hauptteil der API ist in der Playstation2- Klasse festgelegt. Anfangs wollte ich ihm einen großen Freiheitsgrad geben - die Möglichkeit, Videomodi und dergleichen einzustellen, aber dann dachte ich, es wäre vielleicht besser, all diese Schwierigkeiten zu verbergen. Im Wesentlichen wird lediglich ein Interlaced-Display mit einer Größe von 640 x 448 eingerichtet. Wie bei anderen Java Grinder- Projekten habe ich Methoden / Funktionen nach Bedarf hinzugefügt.

Es gibt noch eine andere Klasse von Klassen, denen ich den langweiligen Namen Draw3D gegeben habe . Im Wesentlichen definieren sie alle Arten von Grundelementen, die Graphics Synthesizer mit Unterstützung für 16-, 24- und 32-Bit-Texturen rendern kann. Ich dachte darüber nach, 8-Bit-Texturen hinzuzufügen, entschied mich aber, dies noch nicht zu tun. Draw3D bietet 3D-Rotationen, Projektion, DMA-Hardwareübertragung, Texturen usw. Sie werden sich wahrscheinlich fragen, warum ich es nicht auf OpenGL-Basis erstellt habe, aber noch nie mit OpenGL gearbeitet habe. Es war einmal eine Zeit, in der ich mich mit einfacher ps2dev-Programmierung beschäftigte, aber es gab dort 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 Caches, 3D-Computing usw. kümmern. Die Amortisation dafür war jedoch eine Abnahme der Vielseitigkeit. Wenn beispielsweise die Textur vom Prozessor geändert wurde, sich jedoch nur die ersten 64 Pixel geändert haben, müssen Sie nur eine 64-Byte-Cache-Zeile löschen, Java Grinder löscht jedoch das gesamte Bild. Es markiert Objekte, daher werden sie nur bei Bedarf gelöscht, löscht jedoch das gesamte Speicherfragment. Mit hoher Wahrscheinlichkeit ändert sich beim Ändern von 64 Bytes auch das gesamte Bild.

Vektoreinheit 0 (VU0)


Java Grinder-Benutzer können VU0 kostenlos verwenden. Ich habe den Demo-Teil "Zwei Vektoreinheiten, ein MIPS" verwendet, um die Mandelbrot-Fraktale zu rendern. Der Code kann besser optimiert werden, zum Beispiel haben die meisten Gleitkommabefehle für Vektoreinheiten eine Laufzeit von 1 und eine Latenz von 4. Soweit ich weiß, bedeutet dies, dass das Register, wenn es das Ziel für den Befehl ist, in einem Zyklus ausgeführt werden kann, jedoch für Damit das Ergebnis verfügbar ist, sind 4 Zyklen erforderlich. Wenn dieses Register verwendet wird, bleibt die Vektoreinheit inaktiv, bis sie bereit ist. Daher besteht die Idee darin, dass Sie die Anweisungen so anordnen müssen, dass Sie jede Anweisung in einem Zyklus ohne Ausfallzeiten ausführen können. Als ich letztes Jahr die Mandelbrot-Fraktale auf der Playstation 3 erstellt habe , habe ich diesen Code optimiert und gleichzeitig 8 Pixel (2 SIMD-Register) berechnet und dabei eine große Geschwindigkeitssteigerung festgestellt. Im aktuellen Fall habe ich versucht, den Code leichter lesbar zu machen, sodass ich mich nicht um seine Optimierung gekümmert habe.

VU0 enthält nur 4 KB Datenspeicher, und Sie schreiben dort nicht das gesamte Fraktalbild. Daher sendet MIPS jeweils nur die Koordinaten von 1/8 des Bildes.

Die Seltsamkeit, auf die ich bei der Arbeit mit VU0 gestoßen bin: Ich habe den VU0-Code zunächst mithilfe von Anweisungen ausgeführt und VIF0_STAT verwendet, um den Abschluss ihrer Ausführung zu überprüfen. Es scheint, dass VIF0_STAT nicht funktioniert, wenn Sie VU0 nicht mit dem VIF-Paket starten. Dies ist im Emulator behoben, aber der Fehler liegt immer noch in der realen Hardware. 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 die parallelen Vergleichsanweisungen fehlen, die in Intel X86_64, Playstation 3 und sogar im Befehlssatz MIPS R5900 Emotion Engine enthalten sind. Mandelbrot-Fraktale müssen die Formel iterativ berechnen, bis das Ergebnis überlegen ist. Mit einem anderen Befehlssatz würde ich nur einen parallelen Vergleich durchführen, der eine Maske für alle binären 1 oder 0 erstellt. Die Maske kann verwendet werden, um das Inkrementieren von Farbzählern zu stoppen. Für Playstation 2 musste ich eine sehr umständliche Formel ableiten, die der fraktalen Formel ziemlich nahe kommt. Ich habe dies im Quellcode von mandelbrot_vu0.asm in Zeilen mit auskommentiertem Python dokumentiert.

Ich finde es cool in den Vektoreinheiten der Playstation 2-Konsole, dass es großartig ist, dass ich keine anderen Sätze von SIMD-Anweisungen gesehen habe, in denen alle FPU-Anweisungen das Attribut .xyzw haben können, das der Anweisung mitteilt, welche der vier Gleitkommazahlen sie enthält betrifft. Das heißt, wenn ich das Ergebnis der Anweisung brauchte, um nur die x-Komponente des Vektors zu beeinflussen, würde ich einfach .x am Ende der Anweisung hinzufügen. Eine andere interessante Sache ist, dass es sich um einen Satz von VLIW-Befehlen handelt, dh in jedem Zyklus werden zwei Befehle gleichzeitig ausgeführt. Tatsächlich ähnelt das Modul eher einem DSP als einem Allzweckprozessor.

Vektoreinheit 1 (VU1)


VU1 ist von Java Grinder für die Durchführung von 3D-Rotationen, -Bewegungen und -Projektionen reserviert. Draw3D-Objekte werden mit der draw () -Methode an VU1 übergeben, bei der die Punkte mithilfe des Vektoreinheiten-Assemblers konvertiert und an den Grafiksynthesizer übertragen werden. Der Assembler-Code in VU1 kann viel besser auf Geschwindigkeit optimiert werden, ist jedoch für meine Zwecke geeignet. Daher habe ich beschlossen, den Code leicht lesbar zu lassen (nicht optimiert).

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

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

MIPS R5900


Ich mochte den MIPS-Befehlssatz nicht wirklich, bis ich anfing, an diesem Projekt zu arbeiten. Tatsächlich ist es ziemlich einfach, mit dieser CPU zu arbeiten. Die Emotion Engine-Version dieser CPU verfügt über sehr praktische Funktionen. Vor allem sind die Register 128 Bit lang, aber tatsächlich werden sie einfach zum Laden / Speichern und SIMD verwendet. Das heißt, in Wirklichkeit sind dies 128-Bit-Register, 64-Bit-ALU und 32-Bit-Zeiger.

Es war auch möglich, Optimierungen in den Haupt-MIPS-Code einzuführen, aber ich habe dies nicht getan, um die Lesbarkeit des Codes zu gewährleisten, oder aus Zeitgründen. Beispielsweise ist die MIPS-CPU für einen Zyklus inaktiv, wenn das Zielbefehlsregister unmittelbar nach dem Einstellen verwendet wurde. Dieses Verhalten könnte verbessert werden.

Java-Hacks


Java Grinder selbst hat auch seine eigenen ... Kuriositäten, aber etwas fehlt einfach, hauptsächlich, weil ich mich ursprünglich auf das MSP430 konzentriert habe und es größtenteils ein Experiment war. Eines der fehlenden Elemente war die Unfähigkeit, Speicher für Objekte zuzuweisen. Ich habe diese Funktion auf Playstation 2 hinzugefügt, um mehrere Objekte zu instanziieren, hauptsächlich mithilfe der Draw3D-API. Ich habe keine Speicherzuordnungen oder Garbage Collectors geschrieben, daher werden alle neuen Aufrufe auf dem Stapel ausgeführt. Ich dachte daran, so etwas wie einen dynamischen Speicherzuweiser zu implementieren, aber am Ende entschied ich mich, es nicht zu komplizieren. Ich habe auch für Playstation 2 erweiterte Unterstützung für Gleitkommazahlen (Float) hinzugefügt (teilweise war diese Unterstützung noch im Epiphany / Parallella-Code enthalten). Einige andere Dinge, wie der lange und der doppelte Typ, werden immer noch nicht unterstützt.

Das wahrscheinlich nervigste, was ich getan habe, war die schreckliche Einschränkung von Java-Klassendateien. Die Java-Methode kann nicht größer als 64 KB sein, wenn ich mich richtig erinnere. Möglicherweise ist dies normal, aber das Problem tritt auf, wenn die Klassendatei ein statisches Array enthält und es nicht als Binärdaten in die Klassendatei kopiert wird. Es wird als Java-Assembler-Anweisung in einem statischen Initialisierer in die Klassendatei eingefügt, um ein Array zu erstellen. Ich habe versucht, Bilder in Klassendateien als statische Byte [] -Arrays zu speichern, aber einige davon passten nicht. Daher habe ich der Klassendatei von Memory Java Grinder eine Methode hinzugefügt:

byte[] Memory.preloadByteArray(String filename); 

Diese Datei wird nicht zur Laufzeit heruntergeladen, sondern zur Erstellungszeit mithilfe der Anweisung .binfile naken_asm . Bilder werden während der Montage in die Ausgabe-Binärdatei kopiert.

Vor diesem Hintergrund hoffe ich wirklich, dass James Gosling niemals über mein Projekt stolpern wird.

Bilder


Die Draw3D-API kann 16-, 24- und 32-Bit-Texturen verwenden. Texturpixel können Pixel für Pixel oder durch Laden mit Byte [] -Arrays eingestellt werden. Ich habe auch die Möglichkeit hinzugefügt, Bilder im Format {Länge, lo16, hi16} RLE-zu komprimieren, wobei lo16 und hi16 die 16-Bit-Farbe im Little-Endian-Format sind, die in die Textur "Länge" kopiert wird.

Die Werkzeuge


Bei der Arbeit an Sega zum Erstellen von Tools zum Erstellen von Bildern, Musik und dergleichen habe ich die Google Go-Sprache verwendet, um eine neue Sprache zu lernen. Diesmal habe ich es mit Rust versucht. Das erste Tool konvertiert Binärdateien in Java-Quellcode und das zweite konvertiert BMP in das Binärformat, das in Texturen geladen werden kann, einschließlich im RLE-Format. Aus diesem Grund habe ich sie in Python geschrieben, falls jemand mit mir eine Demo erstellen möchte.

Ton


Nachdem wir herausgefunden hatten, wie die Grafik- und Vektoreinheiten funktionieren, war der letzte Schritt der Ton. Ich dachte, es wäre der einfachste Teil, besonders nachdem ich das PDF mit der Sony SPU2-Beschreibung studiert habe. Wie falsch ich war. Dieser Teil des Systems ist sehr schlecht dokumentiert.

Als erstes habe ich herausgefunden, dass SPU2 (Sound Processing Unit) mit IOP (I / O-Prozessor, auch bekannt als Playstation 1-Prozessor) verbunden ist. Die Playstation 2-CPU ist über SIF mit diesem IOP verbunden. Sonys PDF erwähnt nur SIF DMA, sagt aber nichts über seine Verwendung aus.

Infolgedessen habe ich mich geweigert, SIF zu verwenden, aber beschlossen, naken_asm einen Linker hinzuzufügen, damit ich kernel.a aus dem PS2DEV-SDK verwenden kann. Linker verdient, aber gescheitert.

Zu diesem Zeitpunkt habe ich bereits entschieden, dass ich den Sound nicht zum Laufen bringen kann, und ich wollte die Demo nur ohne ihn beenden. Aber es hat mich gequält, also habe ich beschlossen, mir den Quellcode verschiedener Playstation 2-Emulatoren anzusehen, um zu verstehen, wie SIF funktioniert. Schließlich habe ich herausgefunden, wie man direkt auf Speicher aus MIPS R3000-Code in IOP zugreift und ihn ausführt (es gibt ein Beispiel im Beispielordner des naken_asm-Repositorys). Ich habe es geschafft, den Sound im Emulator zum Laufen zu bringen.

Am Ende stellte ich fest, dass sich der IOP-Speicher (einschließlich SPU2) im Bereich der Emotion Engine befand. Daher habe ich viel Aufwand betrieben (die Dokumentation ist extrem klein und in keinem der Emulatoren vollständig korrekt implementiert, aber es spielt keine Rolle, ob sie funktionieren ) Habe ich gelernt mit Ton zu arbeiten.

Vergleich von Emulator und Eisen


Ich habe einige Unterschiede zwischen der Ausführung auf einer realen Maschine und in einem Emulator festgestellt.

  • Wenn das GIF-Paket das PRIM-Register auf beide IIP-Werte (Schattierungsmethode) setzt und die FIX-Bits alle 1 sind, berücksichtigt der Emulator das IIP-Bit und führt eine Gouro-Schattierung durch, während reale Geräte eine flache Schattierung durchführen.
  • Wenn das GIF-Paket über PATH3 (EE direkt an GS) übertragen wird und das EOP-Flag (Packet End) nicht gesetzt ist, führt dies, wenn VU1 versucht, das GIF-Paket über PATH 1 (VU1 an GS) zu senden, zu einem Absturz der realen Hardware wird im Emulator funktionieren.
  • Das Überspringen des Löschens des CPU-Caches vor der DMA-Übertragung ist nicht erforderlich, führt jedoch auf einem realen Computer zu einem merkwürdigen Verhalten.
  • Wenn Sie SPU2 im EE-Bereich platzieren, kann der Emulator einfach Audiodaten in FIFO SPU2 aufzeichnen. Auf einer echten Playstation 2 muss nach dem Aufzeichnen von 32 Wörtern in das Register geschrieben werden, um einen Befehl zum Löschen des FIFO zu erteilen. Bei realer Hardware sollte beim Einstellen der Übertragungs- / Startadresse von SPU2 der Übertragungsmodus auf 0 gesetzt werden. Emulatoren ist es egal, ob der Modus den Wert 0 hat.
  • Das Schreiben von IOPs von EE in die zugewiesenen Speicherregister stürzt auf einem realen Computer ab, obwohl er sich im Kernelmodus befindet. Der Emulator ermöglicht, dass solche Operationen unabhängig vom aktuellen CPU-Modus funktionieren.
  • Die Verwendung von SIF-DMA-Kanälen funktioniert im Emulator, aber ich konnte sie immer noch nicht dazu bringen, an realen Geräten zu arbeiten. Ich habe sogar im Kernel-Modus einen Speicherzugriffsfehler für SIF-DMA-Register erhalten.
  • Der Emulator ist zu langsam, um eine Demo auszuführen, wenn Fraktale mit VU0 berechnet werden, sodass der Sound nicht synchron ist.

Zusammenfassend


Ich wollte fast vom ersten Moment an ein Programm für Playstation 2 schreiben. Tatsächlich hatte ich schon lange ein Linux-Kit für PS2 (ich glaube, deshalb habe ich Playstation 2 gekauft), und ich habe sogar versucht, mit der PS2DEV-Bibliothek in C zu arbeiten, aber dies ist eine völlig andere Erfahrung als das direkte Programmieren in Assemblersprache für Eisen.

Ich muss Lukash dafür danken, dass er den alten Assembler-Quellcode und die PS2-Dokumente gespeichert hat. Ich bin mir nicht sicher, ob ich überhaupt ohne die Duke 3 Star-Demo anfangen könnte, die mir bei der Initialisierung der Ausrüstung geholfen hat. Ich bin auch den Entwicklern des PCSX2- Emulators dankbar, der den Debugging-Prozess erheblich beschleunigt hat. Außerdem könnte ich den Sound nicht herausfinden, wenn ich nicht auf den Quellcode des Emulators geschaut hätte und nicht verstanden hätte, was falsch war.

Und danke an Sony für diesen schönen kleinen Computer. Wenn jemand von Sony diesen Artikel liest, ist hier ein Tipp: Warum nicht auf die Größe eines Rapsberry Pi verkleinern und als Board 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

Source: https://habr.com/ru/post/de423751/


All Articles