CPCSyntaxError

L’émulation de l’Amstrad CPC continue de progresser, et CPCSyntaxError arrive avec pour objectif de reproduire fidèlement le comportement du matériel d’origine.

Il s’agit d’un émulateur Windows compatible avec les CPC 464, CPC 6128, CPC Plus et GX4000, conçu autour d’un modèle précis au cycle près des puces vidéo de l’ordinateur. L’une des fonctionnalités phares du projet est sa prise en charge des cinq types de CRTC, y compris les modèles utilisés dans les CPC classiques et les ASIC de la gamme Plus.

L’émulateur reproduit également différentes versions du Gate Array — avec leurs caractéristiques spécifiques de synchronisation des pixels — et modélise des types de moniteurs tels que les CTM 640/644, CM14, GT 64/65 et MM12.

Pour les CPC Plus et GX4000, CPCSyntaxError intègre les fonctionnalités spécifiques à l’ASIC, telles que les sprites matériels, le son DMA, une palette de 4096 couleurs, les interruptions raster, les effets de séparation d’écran (split-screen) et le défilement fluide.

Un émulateur aussi conçu pour les programmeurs

CPCSyntaxError ne se contente pas de lancer des jeux et des programmes. Le projet intègre un débogueur comprenant des points d’arrêt classiques et conditionnels, des points de surveillance de la mémoire, l’exécution pas à pas, un désassembleur avec étiquettes et un éditeur hexadécimal.

Il propose également des fenêtres de visualisation en temps réel pour divers composants du CPC, notamment le CRTC, le Gate Array, le moniteur, l’ASIC Plus, le PSG, le PPI, la matrice du clavier, le contrôleur de disquette et le système de cassette.

Une autre fonctionnalité intéressante est l’intégration de l’assembleur RASM, qui permet d’assembler du code directement dans la mémoire de la machine émulée et de l’exécuter au sein même de l’environnement.

L’interface est conçue avec SDL2, OpenGL et Dear ImGui, proposant des fenêtres ancrables et redimensionnables qui permettent aux utilisateurs d’organiser leur espace de travail selon leurs besoins.

Plusieurs extensions restent encore à finaliser, notamment la M4, la Symbiface II/III, le DigiBlaster, l’AmDrum DAC, le pistolet optique, l’imprimante et la V9990/GFX9000.

7 « J'aime »

Uniquement pour Windows?

1 « J'aime »

J’ai un peu bidouillé le code source et il n’y a pas grand-chose qui soit vraiment spécifique à Windows.

Ce serait sympa de pouvoir le compiler sur macOS et Linux !

Merci @XeNoMoRPH pour le partage.

…avec le code source fourni sur le lien que tu as publié… GitHub - WacKEDmaN/CPCSyntaxError: Emulator for Amstrad CPC and Plus/GX4000 · GitHub

On dirait que ça ne devrait pas tarder à fonctionner sous Linux, alors ?

1 « J'aime »

Je vais me renseigner auprès de l’auteur à ce sujet.

1 « J'aime »

je l’ai pas encore testé sur linux… mais ça a été conçu pour être multiplateforme…

j’ai encore pas mal de boulot dessus donc attendez-vous à des mises à jour

3 « J'aime »

j’ai mis à jour le code pour qu’il soit entièrement compatible avec linux… instructions de compilation incluses

s’il vous plaît ne me demandez pas de version Mac ! je n’y ai pas accès !.. mais la version linux « devrait » marcher !

3 « J'aime »

Je ne l’ai pas vu sur les captures d’écran, mais est-ce que ça vient avec des fonctionnalités de débogage via API (débogage externe) et de chargement de code externe, afin de pouvoir l’exécuter dans une session de développement avec VS Code ou d’autres outils ?

Aussi, est-ce que ça peut charger des ROM ?

il y a un mode headless via la CLI qui peut être utilisé pour le débogage… mais ce n’est probablement pas exactement ce que tu cherches !..

Ligne de commande

cpcse.exe --roms <folder> démarre avec un autre dossier de ROMs. Un mode capture d’écran headless est aussi disponible pour les scripts :

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

--mouse est un petit script exécuté après tout le reste : wait (attendre) des images, move (déplacer) la souris, click (cliquer), double-cliquer, maintenir le joystick (j<bits>,<images>), taper du texte, appuyer sur une key (touche), sauvegarder une capture d’écran – de quoi piloter un environnement comme SymbOS sans aucune fenêtre.

Modèles : cpc464, cpc6128, cpc464plus, cpc6128plus, gx4000.

Les modes headless écrivent directement dans l’Invite de commandes d’où ils ont été lancés. cpcse.exe étant un programme fenêtré, l’invite n’attend pas son exécution : utilise start /wait cpcse.exe ... dans un fichier batch s’il a besoin du résultat.

je peux ajouter GDB et une API + CLI pour les commandes

mis à jour

Nouveau : débogage externe et chargement de code

Travaillez dans VS Code (ou n’importe quel éditeur) et laissez l’émulateur suivre votre build. Tout reste désactivé jusqu’à ce que vous l’activiez dans Settings → External debugging ou en ligne de commande. Les serveurs écoutent uniquement sur 127.0.0.1.

  • Serveur GDB (--gdb, port 12000) pour la cible distante mame de DeZog : débogage au niveau du code source avec points d’arrêt (y compris conditionnels), pas à pas détaillé/principal/sortant, pause et reprise, points d’observation (watchpoints), ainsi que visualisation et modification de la mémoire et des registres. Les points d’arrêt de DeZog s’affichent également dans la fenêtre Debugger de l’émulateur. Les clients gdb classiques fonctionnent aussi, tout comme les commandes monitor de MAME.
  • API de commandes (--api, port 6128) et le nouveau programme cpcse-ctl à côté de cpcse.exe, pour les scripts de build. Il peut charger un fichier .bin, .dsk, .sna, .cpr ou une cassette et le lancer, saisir du texte au clavier, appuyer sur des touches, lire et écrire dans la mémoire et les registres, définir des points d’arrêt et d’observation, désassembler, exécuter pas à pas, attendre un arrêt et prendre des captures d’écran au format PNG ou BMP. Les requêtes s’effectuent sur une seule ligne, en JSON ou sous un format court (cpcse-ctl load build/game.bin 0x4000 entry).
  • Rechargement automatique (--watch) : le fichier de sortie de votre build est rechargé et relancé à chaque modification. Cela fonctionne pour un fichier .bin, ou un .dsk suivi d’une commande saisie.
  • Nouvelles options en ligne de commande : --gdb[=port], --api[=port], --load file[@addr], --watch file[@addr], --run entry|addr, --reset, --command "RUN\"GAME\n" et --symbols file. Les symboles peuvent provenir de fichiers RASM, sjasmplus, pasmo ou WinAPE, ou de listes EQU, et les adresses peuvent être fournies sous forme d’étiquettes (labels).
  • Documentation : docs/external-debugging.md contient un fichier launch.json pour DeZog, une tâche de build VS Code, ainsi que l’ensemble des options et commandes.

Nouveau : lecteur de cassette

Dans la fenêtre Media, Media → Tape et Debug → Chips → Tape :

  • un compteur de cassette avec un bouton de réinitialisation
  • la position temporelle de la cassette, ainsi que le numéro du bloc en cours sur le total
  • rembobinage au début, bloc précédent, lecture, pause, arrêt, avance rapide, éjection
  • une liste des blocs de la cassette permettant d’y accéder directement
  • un voyant lumineux MOTOR

Nouveau : coloration syntaxique de l’assembleur

L’éditeur de l’assembleur colore chaque partie du code dans sa propre couleur : instructions, registres et conditions, directives, nombres, chaînes de caractères, commentaires, définitions d’étiquettes et les étiquettes qu’elles utilisent. Colours… vous permet de modifier chaque couleur ou de désactiver la coloration, et votre choix est sauvegardé.

Nouveau : Éjection pour les cartouches et les captures instantanées (snapshots)

Les cartouches et les snapshots disposent désormais d’un bouton Eject dans la fenêtre Media et le menu Media, tout comme les disques et les cassettes. L’éjection redémarre la même machine sans le fichier. La section Snapshot indique quel snapshot est actuellement chargé.

Nouveau : fenêtres s’adaptant lorsqu’elles sont étroites

Les rangées de boutons, les barres d’outils et le texte s’adaptent désormais à la largeur de la fenêtre dans chaque fenêtre. Ainsi, une fenêtre étroite ou ancrée affiche tout son contenu au lieu de le tronquer. Cela concerne les fenêtres Machine, Media, Settings, le débogueur, Chips, Memory, GFX9000, l’éditeur DSK, l’assembleur, CSL et l’imprimante.

Nouveau : image VRAM du GFX9000 telle qu’affichée à l’écran

Debug → GFX9000 → VRAM image colore désormais la VRAM de la même manière que l’image à l’écran : chaque couche utilise son propre décalage de palette, les motifs de sprites utilisent la palette de leur sprite, et les points transparents laissent apparaître la couleur de fond. En P1, les couches A et B sont affichées côte à côte, et survoler un point indique à quelle couche il appartient.

2 « J'aime »

gdb server

:heart_eyes:

J’avais mentionné ça dans l’ancien forum. Ça permet aux clients de débogage existants de déboguer les programmes CPC.

Rhaa pas le temps de tester maintenant. :sleepy_face:

1 « J'aime »

Je compatis, mon autre gros projet repose aussi sur SDL2/Imgui/OpenGL. Bien que je développe sous Linux et que je fasse de la compilation croisée dans une VM pour les versions Windows, j’ai fini par accepter une PR pour le support de MacOS. Cela dit, imgui c’est vraiment la cerise sur le gâteau, c’est un superbe logiciel.

2 « J'aime »

En général, je n’ai pas vraiment besoin de faire d’efforts particuliers pour que ça fonctionne sur Mac et Linux en même temps.

C’est Windows qui me casse les couilles d’habitude, parce que Microsoft est incapable de suivre le moindre standard et doit toujours faire les choses à sa sauce…

Cela dit, j’ai réussi à compiler CPCSyntaxError sur mon M1, mais ça plante au démarrage avec cette erreur :

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.

Je vais continuer d’essayer de le faire fonctionner.

2 « J'aime »

Sur macOS, vous n’obtenez un contexte OpenGL moderne que si vous demandez explicitement un Core Profile 3.2+ compatible avec les versions ultérieures. Le code demande un simple 3.0 avec GLSL #version 130, donc macOS renvoie un contexte hérité 2.1, le chargeur OpenGL d’ImGui le refuse, et l’assertion échoue.

Je mets à jour le code dès maintenant… j’ai trouvé quelques autres problèmes qui causeraient aussi des soucis sur macOS… donc je les corrige… la prochaine version « devrait » lui permettre de tourner sur Mac… et ce sera la dernière mise à jour jusqu’au week-end prochain !

3 « J'aime »

v0.3.1 : fonctionne sur macOS (Puces Apple et Intel)

Nouveauté : macOS

CPCSyntaxError s’installe et s’exécute désormais sur Mac, aussi bien sur les puces Apple (M1 et ultérieures) que sur Intel. Le build d’un utilisateur avait compilé, mais s’arrêtait au démarrage avec le message « Failed to initialize OpenGL loader! ». macOS ne fournit un OpenGL moderne qu’aux programmes qui demandent un contexte de profil Core 3.2, et c’est ce que fait désormais l’émulateur. Le fichier README contient une nouvelle section Building from source → macOS :

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

Autres fonctionnalités qui marchent désormais sur Mac :

  • Fenêtre des scripts CSL : elle exécute les scripts (elle trouve son propre fichier programme sans le /proc de Linux).
  • « Ouvrir le dossier des captures d’écran » : elle utilise open.
  • Serveur GDB et API de commande : un débogueur qui se déconnecte au milieu d’une réponse ne ferme plus le programme.

Si le pilote graphique d’un ordinateur ne peut pas du tout fournir OpenGL 3, le programme l’explique désormais dans une boîte de dialogue au lieu de s’arrêter brutalement avec un assert.

Windows et Linux restent inchangés.

3 « J'aime »

Maintenant, ça marche !

Merci beaucoup !

1 « J'aime »

Ah, ça expliquerait pourquoi sur mon propre projet Imgui similaire, la PR pour le support MacOS que j’avais reçue mettait à niveau l’OpenGL requis vers la version 4 sur cette plateforme.

(J’utilisais aussi la version 3/#130 par défaut)

Nouvelle version mise en ligne… extensions actuelles terminées (pas d’interface web sur la M4 cela dit).. n’hésitez pas à me signaler tout problème… ou si vous souhaitez voir quelque chose en particulier…

v0.4.0 : WiFi de la M4, lecteur IDE/CF de la SYMBiFACE, synthèse vocale Epson et DECtalk de la LambdaSpeak 3

Nouveauté : le WiFi de la carte M4

Le WiFi de la M4 utilise désormais la connexion Internet de votre PC.

  • Sockets : les programmes CPC ouvrent des connexions TCP, résolvent des noms d’hôte et exécutent leurs propres serveurs. Les exemples TCP et telnet de Duke fonctionnent ; le client telnet se connecte à telehack.com.
  • Téléchargements : |HTTPGET enregistre un fichier du Web sur la carte de la M4, avec ses variantes @ (silencieuse) et >nom (enregistrer sous), le nom de fichier d’origine du serveur et les redirections. |HTTPMEM télécharge directement en mémoire, paramètre offset= inclus. HTTP simple uniquement, comme sur la vraie carte.
  • Statut : |NETSTAT affiche l’adresse de votre PC, |NETSET et |WIFI fonctionnent, et le démon réseau M4 de SymbOS peut communiquer via l’interface socket de la carte.
  • Paramètres : sous Extensions → Carte M4 :
    • WiFi : le réseau du PC est activé par défaut.
    • Serveurs : accepter d’autres ordinateurs est désactivé par défaut, de sorte qu’un programme serveur CPC ne soit accessible que depuis votre propre PC.

Nouveauté : le lecteur IDE/CF de la SYMBiFACE II / III

Les deux cartes Symbiface disposent désormais de leur interface IDE/CF.

  • Le lecteur est un dossier : symide à côté de cpcse.exe, créé la première fois, ou n’importe quel dossier de votre choix sous Extensions → Symbiface.
  • Ce que voit SymbOS : une partition FAT16, noms de fichiers longs inclus. Il liste, lit et écrit dessus, et les modifications sont répercutées dans le dossier.
  • Ligne de commande : --ide <dossier>, --sf3 et --xrom <emplacement>=<fichier>, ce qui permet d’installer une ROM d’extension comme la version ROM de SymbOS.

Nouveauté : la synthèse vocale Epson et DECtalk de la LambdaSpeak 3

La LambdaSpeak 3 fait désormais exactement ce que fait la carte physique.

  • Ses octets de contrôle, avec les valeurs exactes de disponibilité que chaque mode place sur le bus.
  • Les accesseurs (getters) pour le volume, la voix, le débit, la version, le mode et l’horloge.
  • Les confirmations vocales, comme « Native Epson mode. ».
  • La parole bloquante qui met le Z80 en attente jusqu’à ce qu’une phrase soit terminée ; &DF l’interrompt.
  • Le texte Epson et DECtalk est prononcé avec les voix intégrées de votre ordinateur : les voix vocales de Windows, say sur macOS, espeak-ng sur Linux. Le micrologiciel DECtalk de la puce Epson n’étant pas public, le rendu sonore utilise votre PC et non le son original DECtalk.
  • Commandes intégrées au texte : les changements de voix du parseur Epson, le chuchotement, la hauteur et la vitesse, ainsi que les voix au format [:np] de DECtalk, [:rate], [:dv ap] et les chaînes de phonèmes.
  • Testé avec le propre logiciel de LambdaSpeak : ENGLISH.BAS, WELCOME.BAS et MP3.BAS de LS300.DSK, ainsi que MP3-PLAY.BAS de TFM avec sa ROM RSX, fonctionnent tous.
4 « J'aime »

J’ai une nouvelle mise à jour avec quelques nouvelles fonctionnalités et des correctifs sous le capot…

v0.5.0 : cheats avec un assistant pas à pas, enregistrement de cassette et chargement turbo, disquettes HFE et IPF, un lecteur de disquette en temps réel

Nouveau : Cheats, avec assistant pas à pas

Outils → Cheats (chercheur de POKE) trouve où un jeu conserve ses vies, ses munitions, le temps ou l’énergie, et les bloque.

  • L’assistant ne vous demande que ce que vous voyez à l’écran. Choisissez « un nombre à l’écran », indiquez ce qu’il affiche, jouez jusqu’à ce qu’il change, et indiquez la nouvelle valeur. Deux ou trois tours suffisent généralement à isoler un ou deux emplacements.
  • Fonctionne aussi avec les barres et jauges. Pour l’énergie ou le carburant sans valeur chiffrée, indiquez simplement si la barre a diminué, augmenté ou est restée identique.
  • Ensuite, il teste. Il bloque la valeur sur ce que vous choisissez et demande si elle est restée fixe. Si ce n’est pas le case, il teste les emplacements un par un.
  • Inutile de savoir comment le jeu stocke le nombre. Il cherche selon tous les formats à la fois : valeur brute, valeur moins un (vies comptées à partir de 0), et BCD (courant pour les scores et les vies). La recherche couvre toute la mémoire vive (RAM), y compris les banques 128K.
  • Onglet Recherche : le même outil en mode manuel, en 8 ou 16 bits, avec option d’annulation (undo).
  • POKEs issus de magazines : saisissez-les directement (POKE &1234,0, plusieurs par ligne).
  • Sauvegardé avec le jeu : les cheats d’un jeu sont conservés à côté sous la forme <jeu>.pok, et se chargent (désactivés) à chaque fois que le jeu est lancé.

Nouveau : enregistrement de cassette et chargement turbo

  • Rec sur le lecteur de cassette enregistre ce que le CPC sauvegarde (SAVE), à partir de la position actuelle de la bande ou sur une Nouvelle cassette vierge. Enregistrer la cassette sous écrit le résultat dans un fichier .cdt.
  • Blocs standards : le format propre du firmware devient des blocs turbo standards (TZX &11), légers et lisibles par d’autres émulateurs. Tout le reste est conservé sous forme de signal brut.
  • Turbo : un bouton et un curseur sur le lecteur permettent d’accélérer jusqu’à 20× ou sans limite. Pendant que la bande tourne, tout le CPC s’exécute plus vite : tous les chargeurs, y compris ceux avec protection, fonctionnent exactement comme d’habitude.
  • Réécriture : avec l’option « Enregistrer les écrites disquette et cassette dans leurs fichiers » activée, un enregistrement effectué sur un .cdt est réécrit directement dans son fichier.
  • Ligne de commande : --record-tape out.cdt enregistre sur une cassette vierge lors des exécutions sans interface (headless).

Nouveau : disquettes HFE et IPF, et réécriture sur disquette

  • HFE (le format du Gotek) est lu et réécrit. Les pistes auxquelles le CPC n’a pas touché restent inchangées au bit près.
  • IPF est lu via la bibliothèque de décodage SPS (licence non commerciale). Les originaux au format IPF sont protégés en écriture.
  • Réécriture : ce qu’un programme écrit sur une disquette est réécrit dans son fichier image, dans le format propre de l’image (Média → « Enregistrer les écritures disquette et cassette dans leurs fichiers »). L’option --disk-writeback fait de même en mode headless.

Nouveau : le lecteur de disquette en temps réel

  • La disquette tourne : 300 tr/min sous une tête de 250 kbit/s. Les octets d’un secteur arrivent à son passage. Les images HFE et IPF utilisent la position des secteurs issue de leur propre flux de bits.
  • Timing : les déplacements de tête (seeks) respectent la vitesse de pas réglée par le programme, et le lecteur n’est prêt que lorsque la disquette a atteint sa vitesse de croisière.
  • Programmes lents : un programme trop lent pour traiter les octets subit un dépassement de capacité (overrun), comme sur un vrai CPC.

Nouveau : Multiface II, carte RS232C, images DSK sur la carte M4

  • Multiface II : F10 sert de bouton STOP ; son menu, la sauvegarde et le rechargement fonctionnent. Sa ROM n’est pas incluse : placez un fichier contenant « multiface » dans son nom dans le dossier roms/.
  • Interface série RS232C (d’Amstrad et de Pace) :
    • Sa ligne est reliée à : un port TCP auquel d’autres programmes se connectent (telnet localhost 2323), une connexion sortante (un BBS, un serveur telnet), l’un des ports série de votre PC, ou une prise de bouclage (loopback).
    • Paramètres : dans Extensions, ou via --serial.
    • Sa ROM n’est pas incluse : installez-la dans un emplacement ROM.
  • Carte M4 : les images DSK sur sa carte s’ouvrent comme des dossiers, comme sur la vraie carte. |CD,"game.dsk", puis CAT, LOAD et RUN lisent les fichiers qu’elles contiennent.
5 « J'aime »

Impressionnant toutes ces fonctionnalités Brocky, est-ce que le code source est disponible quelque part ? Je ne me souviens pas avoir vu d’informations sur un dépôt. ÉDIT : Je suis carrément aveugle ! Je l’ai trouvé :grin:

1 « J'aime »