CPCSyntaxError

L’emulazione dell’Amstrad CPC continua ad avanzare e arriva CPCSyntaxError, un emulatore sviluppato con l’obiettivo di riprodurre fedelmente il comportamento dell’hardware originale.

Si tratta di un emulatore per Windows compatibile con CPC 464, CPC 6128, CPC Plus e GX4000, sviluppato attorno a un modello «cycle-accurate» (accurato al singolo ciclo di clock) dei chip video del computer. Una caratteristica di punta del progetto è l’implementazione di tutti e cinque i tipi di CRTC, inclusi i modelli usati nei CPC classici e gli ASIC presenti nella gamma Plus.

L’emulatore replica anche varie versioni del Gate Array — con le loro specifiche caratteristiche di pixel-timing — e modella tipi di monitor come CTM 640/644, CM14, GT 64/65 e MM12.

Per il CPC Plus e il GX4000, CPCSyntaxError integra funzionalità specifiche per ASIC come sprite hardware, audio DMA, una palette a 4096 colori, interruzioni raster, effetti split-screen e uno scrolling fluido.

Un emulatore pensato anche per i programmatori

CPCSyntaxError va oltre la semplice esecuzione di giochi e programmi. Il progetto integra un debugger completo di breakpoint e condizioni, watchpoint di memoria, esecuzione passo-passo, un disassembler con etichette e un editor esadecimale.

Offre inoltre finestre di visualizzazione in tempo reale per vari componenti del CPC, tra cui CRTC, Gate Array, monitor, ASIC Plus, PSG, PPI, matrice della tastiera, controller del disco e sistema a cassette.

Un’altra funzione interessante è l’inclusione dell’assembler RASM, che consente di assemblare il codice direttamente nella memoria della macchina emulata ed eseguirlo all’interno dell’ambiente stesso.

L’interfaccia è realizzata utilizzando SDL2, OpenGL e Dear ImGui, e presenta finestre ridimensionabili e agganciabili che permettono agli utenti di organizzare lo spazio di lavoro in base alle proprie esigenze.

Ci sono anche diverse espansioni in fase di completamento, tra cui M4, Symbiface II/III, DigiBlaster, AmDrum DAC, pistola ottica (light gun), stampante e V9990/GFX9000.

7 Mi Piace

Solo per Windows?

1 Mi Piace

Ho smanettato un po’ con il codice sorgente e non c’è molto che sia davvero specifico per Windows.

Sarebbe bello poterlo compilare su macOS e Linux!

Grazie @XeNoMoRPH per la condivisione.

…con codice sorgente fornito al link che hai pubblicato… GitHub - WacKEDmaN/CPCSyntaxError: Emulator for Amstrad CPC and Plus/GX4000 · GitHub

Sembra che sia quasi pronto per funzionare su Linux allora?

1 Mi Piace

Chiederò all’autore a riguardo.

1 Mi Piace

non l’ho ancora provato a compilare su linux… ma è stato progettato per essere cross-compatibile…

ho ancora parecchio lavoro da farci, quindi aspettati dei nuovi aggiornamenti

3 Mi Piace

ho aggiornato il codice per renderlo completamente compatibile con linux… istruzioni di build incluse

per favore non chiedetemi una versione per Mac! non ne ho uno a disposizione!.. ma la versione per linux «dovrebbe» funzionare!

3 Mi Piace

Non sono riuscito a vederlo dagli screenshot, ma è dotato di funzionalità di debugging basate su API (debugging esterno) e caricamento di codice esterno, in modo da poterlo eseguire in una sessione di sviluppo con VS Code o altri strumenti?

Inoltre, può caricare le ROM?

C’è una modalità headless via CLI che può essere usata per il debugging… anche se probabilmente non è esattamente quello che cerchi!..

Riga di comando

cpcse.exe --roms <cartella> si avvia con un’altra cartella ROM. È disponibile anche una modalità screenshot headless per gli script:

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 <cartella>] [--gfx9000] [--v9990-shot gfx.bmp] [--video9000-shot mixed.bmp]
          [--opl4] [--playcity] [--speech ssa1|dktronics|lambdaspeak3] [--mp3card <cartella>]
          [--dac digiblaster|amdrum] [--wav out.wav] [--sf2]
          [--mouse "w120;j5,60;j16,2;tDIR;kEnter;s<file.bmp>"]

--mouse è un piccolo script eseguito dopo tutto il resto: wait (attendi) frame, move (sposta) il mouse, click (fai clic), double-click (doppio clic), tieni premuto il joystick (j<bit>,<frame>), type (digita) testo, premi un key (tasto), save (salva) uno screenshot – quanto basta per gestire un desktop come SymbOS senza alcuna finestra.

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

Le modalità headless stampano sul Prompt dei comandi da cui sono state avviate. cpcse.exe è un programma con interfaccia a finestre, quindi il prompt non lo attende: usa start /wait cpcse.exe ... in un file batch che richiede il risultato.

posso aggiungere GDB e API + CLI per i comandi

aggiornato

Novità: debug esterno e caricamento del codice

Lavora in VS Code (o in qualsiasi altro editor) e lascia che l’emulatore segua le tue build. Tutto è disattivato finché non lo attivi in Impostazioni → Debug esterno o da riga di comando. I server restano in ascolto solo su 127.0.0.1.

  • Server GDB (--gdb, porta 12000) per la modalità remota mame di DeZog: debug a livello di codice sorgente con punti di interruzione (anche condizionali), esecuzione istruzione per istruzione/passaggio oltre/uscita, pausa e ripresa, watchpoint, nonché visualizzazione e modifica di memoria e registri. I punti di interruzione di DeZog vengono mostrati anche nella finestra Debugger dell’emulatore. Funzionano anche i client gdb tradizionali, insieme ai comandi monitor di MAME.
  • API dei comandi (--api, porta 6128) e il nuovo programma cpcse-ctl accanto a cpcse.exe, per gli script di build. Può caricare ed eseguire file .bin, .dsk, .sna, .cpr o cassette, digitare sulla tastiera, premere tasti, leggere e scrivere memoria e registri, impostare punti di interruzione e watchpoint, disassemblare, avanzare passo-passo, attendere un arresto e scattare screenshot in formato PNG o BMP. Le richieste sono di una sola riga ciascuna, sotto forma di JSON o in forma breve (cpcse-ctl load build/game.bin 0x4000 entry).
  • Ricaricamento automatico (--watch): l’output della tua build viene ricaricato e riavviato ogni volta che cambia. Funziona sia per i file .bin, sia per i .dsk con un comando digitato di seguito.
  • Nuove opzioni da riga di comando: --gdb[=porta], --api[=porta], --load file[@indirizzo], --watch file[@indirizzo], --run entry|indirizzo, --reset, --command "RUN\"GAME\n" e --symbols file. I simboli possono provenire da file RASM, sjasmplus, pasmo o WinAPE, oppure da elenchi EQU, e gli indirizzi possono essere forniti come etichette.
  • Documentazione: docs/external-debugging.md include un file launch.json per DeZog, un’attività di build per VS Code e ogni singola opzione e comando.

Novità: registratore a cassette

Nella finestra Media, su Media → Cassetta e Debug → Chip → Cassetta:

  • un contatore del nastro con pulsante di azzeramento
  • la posizione temporale della cassetta e il blocco corrente rispetto al totale
  • riavvolgimento all’inizio, blocco precedente, riproduzione, pausa, stop, avanzamento veloce, espulsione
  • un elenco dei blocchi della cassetta a cui saltare direttamente
  • una spia MOTOR

Novità: evidenziazione della sintassi dell’assembler

L’editor dell’assembler colora ogni parte del codice con un colore dedicato: istruzioni, registri e condizioni, direttive, numeri, stringhe, commenti, definizioni di etichette e le etichette utilizzate. Colori… ti permette di modificare ciascun colore o disattivare la colorazione; le tue preferenze verranno salvate.

Novità: Espelli per cartucce e snapshot

Cartucce e snapshot ora dispongono di un pulsante Espelli nella finestra Media e nel menu Media, proprio come dischi e cassette. L’espulsione riavvia la stessa macchina senza il supporto inserito. La sezione Snapshot mostra quale snapshot è attualmente caricata.

Novità: finestre adattabili quando sono strette

Le righe di pulsanti, le barre degli strumenti e il testo ora vanno a capo adattandosi alla larghezza della finestra in ogni schermata: in questo modo, una finestra stretta o affiancata mostra tutto il contenuto invece di tagliarlo. Questo aggiornamento riguarda le finestre Macchina, Media, Impostazioni, Debugger, Chip, Memoria, GFX9000, Editor DSK, Assembler, CSL e Stampante.

Novità: immagine VRAM del GFX9000 fedele alla resa a schermo

Debug → GFX9000 → Immagine VRAM ora applica i colori alla VRAM esattamente come appaiono nell’immagine: ogni livello utilizza il proprio offset di tavolozza, i pattern degli sprite usano la tavolozza del rispettivo sprite e i punti trasparenti mostrano il colore dello sfondo. In P1, i livelli A e B sono mostrati uno accanto all’altro, e passando il cursore su un punto viene indicato a quale livello appartiene.

2 Mi Piace

gdb server

:heart_eyes:

L’avevo già accennato nel vecchio forum. Consente ai client di debugging esistenti di fare il debug dei programmi CPC.

Rhaa, niente tempo per testare ora. :sleepy_face:

1 Mi Piace

Ti capisco benissimo, l’altro mio grande progetto è sempre in SDL2/Imgui/OpenGL e, pur sviluppando su Linux e compilando in cross-compilazione su una VM per le release Windows, alla fine ho accettato una PR per il supporto a MacOS. Imgui è davvero una figata pazzesca comunque, è un pezzo di software fantastico.

2 Mi Piace

Di solito non devo fare alcuno sforzo extra per far funzionare Mac e Linux contemporaneamente.

È Windows quello che di solito mi rompe le scatole, perché Microsoft non riesce a seguire un singolo standard e deve fare le cose a modo suo…

Detto questo, sono riuscito a compilare CPCSyntaxError sul mio M1, ma va in crash all’avvio con questo errore:

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.

Continuerò a provare a farlo funzionare.

2 Mi Piace

Su macOS si ottiene un contesto OpenGL moderno solo se si richiede esplicitamente un Core Profile 3.2+ forward-compatible. Il codice richiede semplicemente la versione 3.0 con GLSL #version 130, quindi macOS restituisce un contesto legacy 2.1; l’OpenGL loader di ImGui lo rifiuta e di conseguenza scatta l’assert.

Sto aggiornando il codice ora… ho trovato anche altri problemi che causerebbero errori su macOS, quindi li sto risolvendo… la prossima versione “dovrebbe” permetterne l’esecuzione su Mac… e sarà l’ultimo aggiornamento fino al prossimo fine settimana!

3 Mi Piace

v0.3.1: funziona su macOS (Apple silicon e Intel)

Novità: macOS

CPCSyntaxError ora viene compilato ed eseguito su Mac, sia con Apple silicon (M1 e successivi) che Intel. La build di un utente veniva compilata, ma si bloccava all’avvio con l’errore «Failed to initialize OpenGL loader!». macOS fornisce un OpenGL moderno solo ai programmi che richiedono un contesto 3.2 Core Profile, e ora l’emulatore ne richiede uno. Il README contiene una nuova sezione Building from source → macOS:

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

Altre funzionalità che ora funzionano su Mac:

  • Finestra degli script CSL: esegue gli script (trova il proprio file di programma senza usare /proc di Linux).
  • «Apri cartella screenshot»: utilizza open.
  • Server GDB e API dei comandi: un debugger che si disconnette a metà risposta non causa più l’arresto del programma.

Se il driver grafico di un computer non supporta affatto OpenGL 3, il programma ora lo spiega chiaramente tramite una finestra di messaggio anziché bloccarsi con un’assert.

Nessuna modifica per Windows e Linux.

3 Mi Piace

Ora funziona!

Grazie mille!

1 Mi Piace

Ah, questo spiegherebbe perché nel mio progetto simile basato su Imgui, la PR per il supporto a macOS che avevo ricevuto aggiornava l’OpenGL richiesto alla versione 4 su quella piattaforma.

(Anch’io usavo la 3/#130 di default)

Nuova versione caricata… completati i dispositivi di espansione attuali (anche se l’M4 non ha un’interfaccia web).. per favore fammi sapere se riscontri problemi… o se vorresti vedere aggiunta qualche funzione specifica…

v0.4.0: M4 WiFi, l’unità IDE/CF della SYMBiFACE, e la sintesi vocale Epson e DECtalk di LambdaSpeak 3

Novità: il Wi-Fi della scheda M4

Il Wi-Fi dell’M4 ora utilizza la connessione Internet del tuo PC.

  • Socket: i programmi per CPC aprono connessioni TCP, risolvono i nomi host ed eseguono i propri server. Gli esempi TCP e telnet di Duke funzionano; il client telnet si connette a telehack.com.
  • Download: |HTTPGET salva un file dal web sulla scheda dell’M4, supportando le sintassi @ (silenzioso) e >nome (salva con nome), il nome file originale del server e i reindirizzamenti. |HTTPMEM scarica direttamente in memoria, inclusa la gestione di offset=. Supporta solo HTTP non cifrato, proprio come sulla scheda reale.
  • Stato: |NETSTAT mostra l’indirizzo del tuo PC, |NETSET e |WIFI funzionano, e il demone di rete dell’M4 per SymbOS ha a disposizione l’interfaccia socket della scheda per comunicare.
  • Impostazioni: in Espansioni → Scheda M4:
    • Wi-Fi: la rete del PC è attiva di default.
    • Server: accetta altri computer è disattivato di default, quindi un programma server CPC può essere raggiunto solo dal tuo PC.

Novità: l’unità IDE/CF di SYMBiFACE II / III

Entrambe le schede Symbiface ora dispongono dell’interfaccia IDE/CF.

  • L’unità è una cartella: la cartella symide situata accanto a cpcse.exe (creata al primo avvio) o qualsiasi cartella a tua scelta sotto Espansioni → Symbiface.
  • Cosa vede SymbOS: una partizione FAT16, inclusi i nomi di file lunghi. Può elencare, leggere e scrivere i file, e le sue modifiche vengono salvate direttamente nella cartella.
  • Linea di comando: --ide <cartella>, --sf3, e --xrom <slot>=<file>, utile per caricare una ROM di espansione come la versione ROM di SymbOS.

Novità: sintesi vocale Epson e DECtalk di LambdaSpeak 3

LambdaSpeak 3 ora fa esattamente ciò che fa la scheda reale.

  • I suoi byte di controllo, con gli esatti valori di pronto (ready) che ogni modalità invia sul bus.
  • Comandi di lettura (getter) per volume, voce, velocità (rate), versione, modalità e clock.
  • Conferme vocali, come «Native Epson mode.».
  • Sintesi bloccante che trattiene lo Z80 fino al termine della frase; &DF la interrompe.
  • Il testo Epson e DECtalk viene letto utilizzando le voci di sistema del tuo computer: le voci di sistema di Windows, say su macOS, espeak-ng su Linux. Il firmware DECtalk del chip Epson non è pubblico, quindi l’audio userà la voce del tuo PC e non quella nativa del DECtalk.
  • Comandi all’interno del testo: cambi di voce, bisbiglio, tono (pitch) e velocità del parser Epson, e le voci in stile [:np], [:rate], [:dv ap] e le stringhe di fonemi del DECtalk.
  • Testato con il software nativo di LambdaSpeak: ENGLISH.BAS, WELCOME.BAS e MP3.BAS da LS300.DSK, oltre a MP3-PLAY.BAS di TFM con la sua ROM RSX, funzionano tutti perfettamente.
4 Mi Piace

ho un nuovo aggiornamento con alcune nuove funzionalità e diverse correzioni sotto il cofano…

v0.5.0: cheat con procedura guidata, registrazione su cassetta e caricamento turbo, dischi HFE e IPF, un lettore di dischi in tempo reale

Novità: Cheat, con procedura guidata

Strumenti → Cheat (ricerca POKE) trova dove un gioco memorizza le sue vite, munizioni, tempo o energia, e li blocca lì.

  • La procedura guidata chiede solo ciò che puoi vedere. Scegli “un numero sullo schermo”, indica cosa c’è scritto, gioca finché non cambia e indicalo di nuovo. In due o tre passaggi di solito rimangono solo uno o due indirizzi.
  • Funziona anche con le barre e gli indicatori. Per l’energia o il carburante senza un valore numerico, indicale se la barra è scesa, salita o rimasta uguale.
  • Poi fa una prova. Blocca il numero al valore scelto e chiede se è rimasto fisso. In caso contrario, prova gli indirizzi uno alla volta.
  • Non serve sapere come il gioco memorizza il valore. Cerca in tutti i modi contemporaneamente: così com’è, decrementato di uno (vite contate da 0) e come BCD (comune per punteggi e vite). La ricerca copre tutta la RAM, banchi da 128K inclusi.
  • Scheda di ricerca: lo stesso strumento manuale, a 8 o 16 bit, con funzione di annullamento.
  • POKE da una rivista: inseriscili direttamente (POKE &1234,0, anche più di uno per riga).
  • Salvati insieme al gioco: i cheat di un gioco vengono salvati accanto ad esso come <gioco>.pok e caricati (disattivati) ogni volta che si avvia il gioco.

Novità: registrazione su cassetta e caricamento turbo

  • Rec sul registratore registra ciò che il CPC salva (SAVE), a partire dal punto in cui si trova il nastro o su un Nuovo nastro vuoto. Salva nastro come lo esporta in un file .cdt.
  • Blocchi standard: il formato nativo del firmware viene convertito in blocchi turbo standard (TZX &11), leggeri e leggibili da altri emulatori. Tutto il resto viene conservato come segnale grezzo.
  • Turbo: un pulsante e uno slider sul registratore, fino a 20× o senza limiti. Mentre la cassetta scorre, l’intero CPC gira più veloce, così qualsiasi caricatore, compresi quelli con protezione, funziona normalmente.
  • Riscrittura: abilitando “Salva le modifiche a dischi e nastri sui rispettivi file”, la registrazione effettuata su un .cdt viene salvata direttamente nel file originale.
  • Linea di comando: --record-tape out.cdt registra su un nastro vuoto durante le esecuzioni in modalità headless.

Novità: dischi HFE e IPF, e salvataggio dei dischi

  • HFE (il formato del Gotek) viene letto e riscritto. Le tracce non modificate dal CPC rimangono identiche bit per bit.
  • IPF viene letto tramite la libreria di decodifica SPS (licenza non commerciale). Gli IPF originali sono protetti da scrittura.
  • Salvataggio modifiche: ciò che un programma scrive su un disco viene salvato nel relativo file immagine, nel suo formato originale (Media → “Salva le modifiche a dischi e nastri sui rispettivi file”). --disk-writeback fa la stessa cosa nelle esecuzioni headless.

Novità: lettore di dischi in tempo reale

  • Il disco gira: 300 giri/min sotto una testina da 250 kbit/s. I byte di un settore vengono letti al suo passaggio. Le immagini HFE e IPF usano le posizioni dei settori dal proprio bitstream.
  • Tempistiche: i riposizionamenti (seek) usano lo step rate impostato dal programma e il lettore è pronto solo quando il disco ha raggiunto la velocità di regime.
  • Programmi lenti: un programma troppo lento per elaborare i byte subisce un errore di overrun, proprio come su un vero CPC.

Novità: Multiface II, scheda RS232C, immagini DSK su M4

  • Multiface II: F10 funge da pulsante STOP; il suo menu, le funzioni di salvataggio e ricaricamento funzionano regolarmente. La sua ROM non è inclusa: inserisci un file contenente “multiface” nel nome all’interno della cartella roms/.
  • Interfaccia seriale RS232C (Amstrad e Pace):
    • La sua linea si collega a: una porta TCP a cui altri programmi possono connettersi (telnet localhost 2323), una connessione in uscita (una BBS, un server telnet), una delle porte seriali del tuo PC o un connettore di loopback.
    • Impostazioni: sotto Espansioni, o con --serial.
    • La sua ROM non è inclusa: inseriscila in uno slot ROM.
  • Scheda M4: le immagini DSK sulla scheda si aprono come cartelle, proprio come sulla scheda reale. Usando |CD,"gioco.dsk", e poi CAT, LOAD e RUN, si leggono i file al suo interno.
5 Mi Piace

Impressionante quantità di funzionalità Brocky, il codice sorgente è disponibile da qualche parte? Non ricordo di aver visto informazioni sulla repository. EDIT: Sono decisamente cieco! L’ho trovata :grin:

1 Mi Piace