CPCSyntaxError

Die Amstrad-CPC-Emulation entwickelt sich weiter, und mit CPCSyntaxError erscheint ein neuer Emulator, der sich auf die exakte Nachbildung des originalen Hardware-Verhaltens konzentriert.

Es handelt sich um einen Windows-Emulator, der mit dem CPC 464, CPC 6128, CPC Plus und GX4000 kompatibel ist und auf einem zyklengenauen Modell der Grafikchips des Computers basiert. Ein besonderes Highlight des Projekts ist die Implementierung aller fünf CRTC-Typen, einschließlich der Modelle, die in klassischen CPCs verwendet wurden, sowie der ASICs aus der Plus-Reihe.

Der Emulator bildet außerdem verschiedene Versionen des Gate Array nach — zusammen mit ihren spezifischen Pixel-Timing-Eigenschaften — und modelliert Monitortypen wie den CTM 640/644, CM14, GT 64/65 und MM12.

Für den CPC Plus und GX4000 bietet CPCSyntaxError ASIC-spezifische Funktionen wie Hardware-Sprites, DMA-Sound, eine Palette mit 4096 Farben, Raster-Interrupts, Split-Screen-Effekte und weiches Scrolling.

Ein Emulator, der auch für Programmierer entwickelt wurde

CPCSyntaxError geht über das reine Ausführen von Spielen und Programmen hinaus. Das Projekt enthält einen Debugger mit Breakpoints und Bedingungen, Speicher-Watchpoints, Einzelschrittausführung, einen Disassembler mit Labels und einen Hex-Editor.

Darüber hinaus bietet er Echtzeit-Visualisierungsfenster für verschiedene CPC-Komponenten, darunter CRTC, Gate Array, Monitor, ASIC Plus, PSG, PPI, Tastaturmatrix, Disk-Controller und Kassettensystem.

Ein weiteres interessantes Feature ist die Integration des RASM-Assemblers, mit dem Code direkt in den Speicher der emulierten Maschine assembliert und innerhalb der Umgebung ausgeführt werden kann.

Die Benutzeroberfläche basiert auf SDL2, OpenGL und Dear ImGui und verfügt über andockbare sowie in der Größe veränderbare Fenster, sodass Benutzer ihren Arbeitsbereich nach eigenen Bedürfnissen gestalten können.

Es gibt auch noch verschiedene Erweiterungen, die fertiggestellt werden müssen, darunter die M4, Symbiface II/III, DigiBlaster, AmDrum DAC, Lightgun, Drucker und V9990/GFX9000.

7 „Gefällt mir“

Nur für Windows?

1 „Gefällt mir“

Ich habe ein bisschen am Quellcode herumgebastelt, und da ist wirklich nicht viel dabei, was speziell für Windows ist.

Es wäre super, wenn man es auch auf macOS und Linux kompilieren könnte!

Danke @XeNoMoRPH fürs Teilen.

…mit Quellcode unter dem von dir geposteten Link… GitHub - WacKEDmaN/CPCSyntaxError: Emulator for Amstrad CPC and Plus/GX4000 · GitHub

Sieht so aus, als ob das dann kurz davor steht, auch unter Linux zu laufen?

1 „Gefällt mir“

Ich werde dazu beim Autor nachfragen.

1 „Gefällt mir“

Ich habe das Bauen unter Linux noch nicht getestet… aber es wurde so entworfen, dass es plattformübergreifend kompatibel ist…

Ich muss noch viel daran arbeiten, stellt euch also auf Updates ein

3 „Gefällt mir“

Ich habe den Code aktualisiert, sodass er jetzt voll mit Linux kompatibel ist… Bauanleitung ist dabei

Bitte fragt mich nicht nach einer Mac-Version! Ich habe keinen Zugriff auf einen Mac!.. Aber die Linux-Version „sollte“ funktionieren!

3 „Gefällt mir“

Ich konnte es auf den Screenshots nicht erkennen, aber gibt es eine API-basierte Debugging-Funktion (externes Debugging) und Funktionen zum Laden von externem Code, sodass man es in einer Entwicklungs-Session mit VS Code oder anderen Tools ausführen kann?

Und kann es auch ROMs laden?

Es gibt einen Headless-Modus über die CLI, der zum Debuggen verwendet werden kann… ist aber wahrscheinlich nicht genau das, was du suchst!..

Befehlszeile

cpcse.exe --roms <Ordner> startet mit einem anderen ROM-Ordner. Für Scripting steht auch ein Headless-Screenshot-Modus zur Verfügung:

cpcse.exe --shot out.bmp --model cpc6128 --frames 200 [--disk game.dsk] [--type "RUN\"GAME\n"]
          [--cart file.cpr] [--tape file.cdt] [--sna file.sna] [--crtc 0-4]
          [--gate-array 40007|40008|40010] [--beam] [--ram 64-4160]
          [--m4 <Ordner>] [--gfx9000] [--v9990-shot gfx.bmp] [--video9000-shot mixed.bmp]
          [--opl4] [--playcity] [--speech ssa1|dktronics|lambdaspeak3] [--mp3card <Ordner>]
          [--dac digiblaster|amdrum] [--wav out.wav] [--sf2]
          [--mouse "w120;j5,60;j16,2;tDIR;kEnter;s<file.bmp>"]

--mouse ist ein kleines Skript, das ganz am Ende ausgeführt wird: wait (Warten in Frames), move (Maus bewegen), click (Klicken), double-click (Doppelklick), joystick halten (j<Bits>,<Frames>), type (Text tippen), key (Taste antippen), save (Screenshot speichern) – genug, um eine Benutzeroberfläche wie SymbOS ohne Fenster zu steuern.

Modelle: cpc464, cpc6128, cpc464plus, cpc6128plus, gx4000.

Die Headless-Modi geben Ausgaben in der Eingabeaufforderung aus, aus der sie gestartet wurden. cpcse.exe ist ein fensterbasiertes Programm, daher wartet die Eingabeaufforderung nicht darauf: Verwende start /wait cpcse.exe ... in einer Batch-Datei, die das Ergebnis benötigt.

Ich kann GDB und eine API + CLI für Befehle hinzufügen.

aktualisiert

Neu: Externe Fehlersuche und Code-Laden

Arbeite in VS Code (oder einem beliebigen Editor) und lass den Emulator deinem Build folgen. Alles bleibt deaktiviert, bis du es unter Einstellungen → Externe Fehlersuche oder über die Kommandozeile einschaltest. Die Server lauschen ausschließlich auf 127.0.0.1.

  • GDB-Server (--gdb, Port 12000) für die mame-Gegenstelle von DeZog: Debugging auf Quellcode-Ebene mit Haltepunkten (auch bedingten), Einzelschritt (hinein/drüber/heraus), Pause und Fortsetzen, Überwachungspunkten sowie der Anzeige und Bearbeitung von Speicher und Registern. DeZogs Haltepunkte werden auch im Debugger-Fenster des Emulators angezeigt. Einfache GDB-Clients funktionieren ebenfalls, zusammen mit den monitor-Befehlen von MAME.
  • Befehls-API (--api, Port 6128) und das neue Programm cpcse-ctl neben cpcse.exe für Build-Skripte. Es kann eine .bin-, .dsk-, .sna-, .cpr- oder Kassettendatei laden und ausführen, Eingaben über die Tastatur simulieren, Tasten drücken, Speicher und Register lesen und schreiben, Halte- und Überwachungspunkte setzen, disassemblieren, Schritte ausführen, auf einen Stopp warten und PNG- oder BMP-Screenshots erstellen. Anfragen bestehen jeweils aus einer Zeile als JSON oder in einer Kurzform (cpcse-ctl load build/game.bin 0x4000 entry).
  • Automatisches Neuladen (--watch): Die Ausgabe deines Builds wird bei jeder Änderung neu geladen und neugestartet. Das funktioniert für ein .bin oder ein .dsk mit einem danach eingegebenen Befehl.
  • Neue Kommandozeilenoptionen: --gdb[=port], --api[=port], --load file[@addr], --watch file[@addr], --run entry|addr, --reset, --command "RUN\"GAME\n" und --symbols file. Symbole können aus Dateien von RASM, sjasmplus, pasmo oder WinAPE stammen oder aus EQU-Listen; Adressen können als Labels angegeben werden.
  • Dokumentation: docs/external-debugging.md enthält eine DeZog-launch.json, einen VS-Code-Build-Task sowie sämtliche Optionen und Befehle.

Neu: Kassettendeck

Im Medienfenster unter Medien → Kassette und Debug → Chips → Kassette:

  • ein Kassettenzähler mit Reset-Button
  • die Zeitposition der Kassette und der aktuelle Block von der Gesamtzahl der Blöcke
  • Zurückspulen zum Anfang, einen Block zurück, Wiedergabe, Pause, Stopp, Vorspulen, Auswerfen
  • eine Liste der Kassettenblöcke zum direkten Anspringen
  • eine MOTOR-Anzeige

Neu: Assembler-Syntax-Hervorhebung

Der Editor des Assemblers hebt jeden Teil des Codes in einer eigenen Farbe hervor: Befehle, Register und Bedingungen, Direktiven, Zahlen, Zeichenketten, Kommentare, Label-Definitionen und die von ihnen verwendeten Labels. Unter Farben… kannst du jede Farbe anpassen oder die Hervorhebung ganz ausschalten. Deine Wahl wird gespeichert.

Neu: Auswerfen für Steckmodule und Snapshots

Steckmodule und Snapshots verfügen im Medienfenster und im Medienmenü jetzt über einen Auswerfen-Button, genau wie Disketten und Kassetten. Beim Auswerfen wird dieselbe Maschine ohne das jeweilige Medium neu gestartet. Der Snapshot-Bereich zeigt an, welcher Snapshot geladen ist.

Neu: Fenster, die sich anpassen, wenn sie schmal sind

Schaltflächenreihen, Werkzeugleisten und Text passen sich jetzt in jedem Fenster an die Fensterbreite an. So zeigt ein schmales oder Andock-Fenster alles an, anstatt Inhalte abzuschneiden. Das betrifft die Fenster für Maschine, Medien, Einstellungen, Debugger, Chips, Speicher, GFX9000, DSK-Editor, Assembler, CSL und Drucker.

Neu: GFX9000-VRAM-Bild wie im Display dargestellt

Debug → GFX9000 → VRAM-Bild färbt das VRAM jetzt so ein, wie das Bild dargestellt wird: Jede Ebene verwendet ihren eigenen Paletten-Offset, Sprite-Muster nutzen die Palette ihres Sprites und transparente Punkte zeigen die Hintergrundfarbe. In P1 werden die Ebenen A und B nebeneinander angezeigt. Wenn du mit der Maus über einen Punkt fährst, wird angezeigt, zu welcher Ebene er gehört.

2 „Gefällt mir“

gdb server

:heart_eyes:

Das hatte ich schon im alten Forum erwähnt. Es ermöglicht bestehenden Debugging-Clients, CPC-Programme zu debuggen.

Rhaa, gerade keine Zeit zum Testen. :sleepy_face:

1 „Gefällt mir“

Ich kann deinen Schmerz absolut nachfühlen, mein anderes großes Projekt ist auch SDL2/Imgui/OpenGL. Ich entwickle zwar unter Linux und nutze für die Windows-Releases Cross-Compiling in einer VM, habe dann aber am Ende doch einen PR für MacOS-Support angenommen. Imgui ist aber wirklich der absolute Oberhammer, ein echt fantastisches Stück Software.

2 „Gefällt mir“

Meistens muss ich mir gar keine zusätzliche Mühe geben, damit Mac und Linux gleichzeitig laufen.

Es ist Windows, das mir meistens auf die Eier geht, weil Microsoft sich an keinen einzigen Standard halten kann und alles auf seine eigene Art machen muss…

Das gesagt, habe ich es geschafft, CPCSyntaxError auf meinem M1 zu kompilieren, aber es stürzt beim Start mit diesem Fehler ab:

Failed to initialize OpenGL loader!
Assertion failed: (bd != nullptr && “Context or backend not initialized! Did you call ImGui_ImplOpenGL3_Init()?”), function ImGui_ImplOpenGL3_NewFrame, file imgui_impl_opengl3.cpp, line 333.

Ich versuche weiter, es zum Laufen zu bringen.

2 „Gefällt mir“

Unter macOS bekommst du einen modernen OpenGL-Kontext nur dann, wenn du explizit ein „3.2+ Core Profile, forward-compatible“ anforderst. Der Code fragt stattdessen nach einem einfachen 3.0 mit GLSL #version 130. macOS gibt daher einen veralteten 2.1-Kontext zurück, der OpenGL-Loader von ImGui verweigert diesen und der Assert folgt.

Ich aktualisiere den Code gerade… habe noch ein paar andere Probleme gefunden, die auf macOS ebenfalls zu Problemen führen würden… behebe sie also… die nächste Version „sollte“ dann auf dem Mac laufen… und das wird das letzte Update bis nächstes Wochenende sein!

3 „Gefällt mir“

v0.3.1: läuft auf macOS (Apple Silicon und Intel)

Neu: macOS

CPCSyntaxError lässt sich jetzt auf Macs bauen und ausführen, sowohl auf Apple Silicon (M1 und neuer) als auch auf Intel. Der Build eines Benutzers konnte zwar kompiliert werden, brach dann aber beim Start mit „Failed to initialize OpenGL loader!“ ab. macOS stellt ein modernes OpenGL nur für Programme bereit, die explizit einen 3.2 Core Profile Context anfordern — und der Emulator fordert diesen nun an. Die README enthält einen neuen Abschnitt Building from source → macOS:

xcode-select --install
brew install cmake ninja sdl2
cmake -S . -B build -G Ninja
cmake --build build
./build/cpcse

Weitere Dinge, die jetzt auf einem Mac funktionieren:

  • CSL-Skriptfenster: Es führt Skripte aus (es findet seine eigene Programmdatei auch ohne das Linux-/proc).
  • „Screenshot-Ordner öffnen“: Es verwendet open.
  • GDB-Server und Befehls-API: Ein Debugger, der die Verbindung während einer Antwort trennt, beendet das Programm nicht mehr.

Wenn der Grafiktreiber eines Computers OpenGL 3 überhaupt nicht bereitstellen kann, erklärt das Programm dies nun in einem Meldungsfenster, anstatt mit einem Assert abzubrechen.

Windows und Linux bleiben unverändert.

3 „Gefällt mir“

Jetzt funktioniert es!

Vielen Dank!

1 „Gefällt mir“

Ah, das würde erklären, warum bei meinem eigenen, ähnlichen Imgui-Projekt der PR für den macOS-Support, den ich bekommen hatte, das erforderliche OpenGL auf dieser Plattform auf 4 angehoben hat.

(Ich hatte standardmäßig auch 3/#130 verwendet)

Neue Version hochgeladen… die aktuellen Erweiterungsgeräte sind fertiggestellt (allerdings noch ohne Webinterface auf der M4).. bitte lass mich wissen, falls du irgendwelche Probleme findest… oder falls du etwas Bestimmtes hinzugefügt haben möchtest…

v0.4.0: M4 WiFi, das SYMBiFACE IDE/CF-Laufwerk, LambdaSpeak 3s Epson- und DECtalk-Sprachausgabe

Neu: Das WLAN des M4-Boards

Das WLAN des M4 nutzt jetzt die Internetverbindung deines PCs.

  • Sockets: CPC-Programme öffnen TCP-Verbindungen, schlagen Hostnamen nach und betreiben ihre eigenen Server. Dukes TCP- und Telnet-Beispiele funktionieren; der Telnet-Client loggt sich auf telehack.com ein.
  • Downloads: |HTTPGET speichert eine Datei aus dem Web auf der Karte des M4, inklusive der Formate @ (lautlos) und >name (speichern unter), dem Dateinamen des Servers selbst und Weiterleitungen. |HTTPMEM lädt direkt in den Speicher herunter, inklusive offset=. Nur unverschlüsseltes HTTP, genau wie auf dem echten Board.
  • Status: |NETSTAT zeigt die Adresse deines PCs an, |NETSET und |WIFI funktionieren, und SymbOS’ M4-Netzwerk-Daemon steht die Socket-Schnittstelle des Boards zur Kommunikation zur Verfügung.
  • Einstellungen: unter Erweiterungen → M4-Board:
    • WLAN: Das Netzwerk des PCs ist standardmäßig aktiviert.
    • Server: Andere Computer zulassen ist standardmäßig deaktiviert, sodass ein CPC-Serverprogramm nur von deinem eigenen PC aus erreichbar ist.

Neu: Das SYMBiFACE II / III IDE/CF-Laufwerk

Beide Symbiface-Karten verfügen jetzt über ihre IDE/CF-Schnittstelle.

  • Das Laufwerk ist ein Ordner: symide neben der cpcse.exe (wird beim ersten Mal erstellt) oder ein beliebiger Ordner, den du unter Erweiterungen → Symbiface auswählst.
  • Was SymbOS sieht: eine FAT16-Partition, einschließlich langer Dateinamen. Es listet sie auf, liest und schreibt darauf, und Änderungen werden direkt im Ordner gespeichert.
  • Befehlszeile: --ide <Ordner>, --sf3 und --xrom <Slot>=<Datei>, was für ein Erweiterungs-ROM wie die ROM-Version von SymbOS passt.

Neu: LambdaSpeak 3s Epson- und DECtalk-Sprachausgabe

LambdaSpeak 3 macht jetzt genau das, was das Board selbst tut.

  • Seine Steuerbytes, mit den exakten Bereit-Werten, die jeder Modus auf den Bus legt.
  • Getter für Lautstärke, Stimme, Sprechgeschwindigkeit, Version, Modus und die Uhrzeit.
  • Gesprochene Bestätigungen, wie „Native Epson mode.“.
  • Blockierende Sprachausgabe, die den Z80 anhält, bis ein Satz zu Ende gesprochen wurde; &DF stoppt sie.
  • Epson- und DECtalk-Text wird mit den eigenen Stimmen deines Computers gesprochen: den Windows-Sprachstimmen, say unter macOS, espeak-ng unter Linux. Da die DECtalk-Firmware des Epson-Chips nicht öffentlich ist, klingt es wie dein PC und nicht wie DECtalk.
  • Befehle im Text: Die Stimmwechsel, das Flüstern, die Tonhöhe und die Geschwindigkeit des Epson-Parsers sowie DECtalks Stimmen im [:np]-Stil, [:rate], [:dv ap] und Phonem-Strings.
  • Getestet mit LambdaSpeaks eigener Software: ENGLISH.BAS, WELCOME.BAS und MP3.BAS von LS300.DSK sowie TFMs MP3-PLAY.BAS mit seinem RSX-ROM laufen alle.
4 „Gefällt mir“

Ich habe ein neues Update mit ein paar neuen Features und einigen Fixes hinter den Kulissen …

v0.5.0: Cheats mit einem Assistenten, Bandaufnahme und Turbo-Laden, HFE- und IPF-Disketten, ein Echtzeit-Diskettenlaufwerk

Neu: Cheats, mit einem Assistenten

Tools → Cheats (POKE-Finder) findet heraus, wo ein Spiel seine Leben, Munition, Zeit oder Energie speichert, und friert diese Werte ein.

  • Der Assistent fragt nur nach dem, was du sehen kannst. Wähle „Eine Zahl auf dem Bildschirm“, gib an, was dort steht, spiele weiter, bis sich der Wert ändert, und gib ihn erneut ein. Nach zwei oder drei Runden bleiben meist nur noch ein oder zwei Speicherstellen übrig.
  • Funktioniert auch mit Balken und Anzeigen. Wenn du bei Energie oder Treibstoff keine genaue Zahl hast, gib einfach an, ob der Balken gesunken oder gestiegen ist oder gleich geblieben ist.
  • Danach wird es ausprobiert. Der Finder friert den Wert bei deiner Auswahl ein und fragt dich, ob er unverändert geblieben ist. Wenn nicht, probiert er die Speicherstellen nacheinander durch.
  • Er muss nicht wissen, wie das Spiel die Zahl speichert. Er sucht auf alle erdenklichen Arten gleichzeitig: wie sie ist, als um eins kleiner (falls Leben ab 0 gezählt werden) und als BCD (häufig bei Punkteständen und Leben). Die Suche deckt den gesamten RAM ab, einschließlich der 128K-Bänke.
  • Suchen-Tab: Derselbe Finder für manuelle Suche, 8 oder 16 Bit, mit Rückgängig-Funktion.
  • POKEs aus Magazinen: Einfach eintippen (POKE &1234,0, auch mehrere pro Zeile).
  • Mit dem Spiel gespeichert: Die Cheats eines Spiels werden daneben als <spiel>.pok abgelegt und geladen (deaktiviert), sobald das Spiel startet.

Neu: Bandaufnahme und Turbo-Laden

  • Aufnahme auf dem Kassettendeck: Zeichnet das auf, was der CPC speichert (SAVE) – ab der aktuellen Bandposition oder auf ein Neues leeres Band. Band speichern unter sichert es als .cdt.
  • Standardblöcke: Das eigene Format der Firmware wird zu Standard-Turboblöcken (TZX &11) – klein und von anderen Emulatoren lesbar. Alles andere wird als rohes Signal gespeichert.
  • Turbo: Ein Button und ein Schieberegler auf dem Deck, bis zu 20× oder unbegrenzt. Während sich das Band bewegt, läuft der gesamte CPC schneller. So funktioniert jeder Loader, auch kopiergeschützte, genauso wie früher.
  • Zurückgeschrieben: Wenn „Disk- und Band-Schreibzugriffe in Dateien speichern“ aktiviert ist, wird eine auf einer .cdt-Datei gemachte Aufnahme direkt in deren Datei zurückgeschrieben.
  • Kommandozeile: --record-tape out.cdt nimmt bei Headless-Durchläufen auf ein leeres Band auf.

Neu: HFE- und IPF-Disketten sowie zurückgespeicherte Disketten

  • HFE (das Format des Gotek) wird gelesen und zurückgeschrieben. Spuren, die der CPC nicht verändert hat, bleiben Bit für Bit erhalten.
  • IPF wird über die SPS-Decoder-Bibliothek gelesen (nicht-kommerzielle Lizenz). IPF-Originale sind schreibgeschützt.
  • Zurückgespeichert: Was ein Programm auf eine Diskette schreibt, wandert zurück in deren Image-Datei – im eigenen Format des Images (Medien → „Disk- und Band-Schreibzugriffe in Dateien speichern“). --disk-writeback macht dasselbe bei Headless-Durchläufen.

Neu: Das Diskettenlaufwerk in Echtzeit

  • Die Diskette dreht sich: 300 U/min unter einem 250-kbit/s-Kopf. Die Bytes eines Sektors kommen an, wenn er vorbeiläuft. HFE- und IPF-Images nutzen die Sektorpositionen aus ihrem eigenen Bitstream.
  • Timing: Schreib-/Lesekopf-Schritte (Seeks) nutzen die vom Programm eingestellte Step-Rate, und das Laufwerk ist erst bereit, wenn die Diskette auf Drehzahl ist.
  • Langsames Programm: Ist ein Programm zu langsam für die ankommenden Bytes, kommt es zu einem Overrun – genau wie auf einem echten CPC.

Neu: Multiface II, die RS232C-Karte, DSK-Images auf dem M4

  • Multiface II: F10 ist die STOP-Taste; Menü, Speichern und Neuladen funktionieren. Das ROM ist nicht enthalten: Lege eine Datei mit „multiface“ im Namen in den Ordner roms/.
  • Serielle RS232C-Schnittstelle (von Amstrad und Pace):
    • Verbindung führt zu: einem TCP-Port, mit dem sich andere Programme verbinden können (telnet localhost 2323), einer ausgehenden Verbindung (ein BBS, ein Telnet-Server), einem der seriellen Ports deines PCs oder einem Loopback-Stecker.
    • Einstellungen: unter Erweiterungen oder --serial.
    • Das ROM ist nicht enthalten: Setze es in einen ROM-Slot ein.
  • M4-Board: DSK-Images auf dessen Karte werden wie Ordner geöffnet, genau wie auf der echten Hardware. |CD,"spiel.dsk", danach lesen CAT, LOAD und RUN die Dateien darin.
5 „Gefällt mir“

Beeindruckender Funktionsumfang, Brocky! Ist der Quellcode irgendwo verfügbar? Ich kann mich nicht erinnern, Informationen zum Repository gesehen zu haben. EDIT: Ich bin definitiv blind! Hab’s gefunden :grin:

1 „Gefällt mir“