[EMULATION AMSTRAD CPC] AMSpiriT - work in Progress

Couvre tous les domaines de l'émulation ou de la virtualisation ainsi que les discussions sur les divers outils associés.

Modérateurs : Papy.G, fneck, Carl

Zebulon
Messages : 2787
Inscription : 02 nov. 2020 14:03

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Zebulon »

Bravo et encore bravo. J'imagine que toutes les instructions "bloc" en R posaient le même problème. Je me demande comment c'est géré en interne dans le processeur, fait-il semblant de décoder les instructions équivalentes en boucle ? On aurait pu penser que ces instructions seraient justement plus rapides que d'écrire une boucle équivalente.

Pour les variations de synchro, les développeurs de ces démos ont poussé le couple numérique/analogique dans ses retranchements en effet. Ca ne m'étonne pas que les convertisseurs/upscalers n'aiment pas. Je n'ai plus de moniteur Amstrad et j'utilise une petite télé CRT avec un câble péritel. Même ça je pense que ça ne doit pas passer.
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par hlide »

En effet, les instructions qui se "répètent" (pas seulement LD[I/D]R mais aussi CP[I/D]R) doivent traiter les interruptions entre chaque instruction répétée. Et heureusement, parce qu'à 1000 itérations, on dépasse largement la milliseconde.
Dmanu78
Messages : 268
Inscription : 20 juin 2020 14:28
Localisation : Yvelines

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Dmanu78 »

Merci pour vos encouragements. ça me fait toujours autant plaisir :)

@Markerror
Un grand merci pour tes précieux conseils. Effectivement "MADNESS" est faite pour un CRTC 1 et je comprends mieux pourquoi j'avais mis des "verrues" bizarres dans le code pour le faire fonctionner sur un "CRTC 0". Du fait des particularités du CRTC 1, la démo fonctionne aussi bien mais sans patch. :)

J'ai profité de tes conseils pour lancer la démo "From Scratch" qui elle ne fonctionne que sur un CRTC type 1 (elle est sympa, elle prévient :D ). Après quelques petits correctifs sur le CRTC (hé oui, encore !), j'ai découvert cette démo qui est vraiment magnifique. Une des plus belles sur CPC assurément que je m'empresse de vous faire découvrir par ces quelques images.

Image
Les effets de plasma sont superbes. Le CPC n'est sensé afficher que 4 couleurs en mode 1...Il me semble qu'il y en a un peu plus à l'écran :D

Image
Ah oui, il y a bien plus que 4 couleurs...le tout en mouvement et en musique, il n'y a rien à dire. C'est superbe.

Image
Une petite dernière image de cette démo...Effet whaoo garanti car imaginez que tout bouge dans tous les sens !

Au final, je suis plus que satisfait que l'émulateur puisse la restituer parfaitement. Dans la foulée je me suis attaqué à une autre démo très sympa mais très technique aussi "Wake-up !". Cela fait plusieurs mois que j'essaie de la faire tourner correctement et il y avait encore jusqu'à peu encore pas mal de bugs graphiques. Mais c'est désormais chose faite, elle est désormais parfaitement restituée (sur un CRTC type 0 du moins).

Image
Wake-Up ! Une très belle démo tout en musique de bout en bout. Les développeurs de démos sur CPC m'impressionnent toujours autant. Chapeau bas.

Comme indiqué précédemment, je pense désormais faire une pause du côté de l'émulation du CRTC. Arrivé à ce stade, le fait de pouvoir émuler les démos réputées les plus techniques du CPC est déjà très gratifiant en soi. Il en reste de (très) nombreuses à tester mais il me reste aussi pas mal de boulot à terminer par ailleurs (l'ergonomie générale, l'émulation des joysticks, gestion du mapping du clavier notamment). Après m'être concentré de longues semaines sur le moteur de l'émulateur, je vais retravailler sur l'esthétique et l'ergonomie (mais sans d'effets bling bling :D ) et commencer à réfléchir à sa prochaine diffusion ... en primeur sur ce forum. :D
Markerror
Messages : 2121
Inscription : 31 oct. 2011 19:21
Localisation : Orléans
Contact :

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Markerror »

Faire bien tourner la From Scratch, c'est du bon boulot :-). Tiens, sinon, si tu es motivé, autre truc à tester Made in Vanity, la deuxième partie de la One screen colonies. Je crois qu'il y a dedans de la belle rupture verticale :-).
Dmanu78
Messages : 268
Inscription : 20 juin 2020 14:28
Localisation : Yvelines

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Dmanu78 »

:) Tu titilles décidément beaucoup ma curiosité. Je suis impressionné par ta connaissance du monde des démomakers CPC :o

C'est bien cette partie de la démo que tu évoques ? Effectivement il y a de la rupture verticale dedans...Elle semble bien passer en émulation CRTC "0" :) mais j'ai encore quelques petits défauts visuels en émulation CRTC "1". Il y a du mieux mais j'ai encore pas mal de pain sur la planche avant d'en terminer avec l'émulation des CRTC...

Image
@Markerror >> One Screen colonies - part 2
Dernière modification par Dmanu78 le 01 mai 2021 23:12, modifié 1 fois.
Avatar de l’utilisateur
Sebiohazard
Messages : 425
Inscription : 30 avr. 2019 15:07

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Sebiohazard »

Hello Dmanu !

Bravo à toi pour ce travail gigantesque ! J'avais une question concernant la programmation de ton émulateur... programmer est une chose certes, mais comment as-tu appris le fonctionnement de l'Amstrad CPC ?!

Comment à partir de tes connaissances en C as-tu pu émuler le CPU par exemple ? Si tu pouvais vulgariser cela pour moi, dans les grandes lignes évidemment, ce serait super sympa merci, car cela reste un véritable mystère !

Vivement la première release ici sur le forum 8)
Image
Dmanu78
Messages : 268
Inscription : 20 juin 2020 14:28
Localisation : Yvelines

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Dmanu78 »

Hello Sebiohazard,

C'est une vaste question mais je peux te donner quelques pistes.
Pour mon information, tu cherches à émuler quelle machine ?

Pour construire un émulateur, il faut identifier au préalable les composants "actifs" qui composent l'ordinateur/ou la console, étudier comment ils communiquent avec le processeur, qui reste le chef d'orchestre de l'ensemble et comprendre les fonctions qu'ils accomplissent. Il y a donc un gros travail de documentation à faire au préalable : il te faut récupérer toutes les documentations existantes/datasheets/Schémas électroniques pour comprendre comment de petit monde s'interconnecte pour former un tout cohérent.

Si tu as suivi le fil du post, tu auras remarqué que j'ai traité l'émulation par petits bouts indépendants, composant par composant, que j'ai testé un par un et que j'ai fait fonctionner qu'une fois l'ensemble codé. Cela se traduit dans mon code source en C par autant de fichiers *.cpp que j'ai de composants : Z80.cpp, GateArray.cpp, PPI.cpp, CRTC.cpp ... Les différentes fonctions sont appelées dans une boucle principale de 16 Mhz située dans le Gate-Array.

Si on part sur le CPU, c'est pas si difficile que cela à émuler : c'est juste fastidieux. Il te faudra bien sur avoir une bonne documentation sur le CPU que tu souhaites émuler. Dans mon cas, Z80 est un processeur très bien documenté maintenant qui n'a quasiment plus de secret.

En fait, un processeur ne fait pas grand chose en soi. il va se "contenter" de lire une adresse mémoire pour décoder et traiter une instruction. Une fois cela fait, il incrémente un compteur interne (le PC ou Program Counter) pour lire et traiter l’instruction suivante..
En terme de programmation, il te faudra donc créer autant de variables qu'il y a des registres internes dans le processeur puis affecter à ces variables des valeurs adéquates en fonction de l'instructions à traiter (lire une donnée, écrire une donnée, faire une addition, faire un test conditionnel...).

La phase de décodage va permettre de sélectionner la fonction qui sera exécutée en interne par le CPU. Ce n'est pas si compliqué puisque c'est câblé en dur dans le processeur : par exemple sur un Z80, l'instruction 0x41 va copier le contenu du registre C dans le registre B.
En langage C, tu va ainsi copier le contenu de la variable Reg_C dans Reg_B. Tout simplement....

En pratique, quelques exemples à partir de mon code source :

Image
1. Création des variables internes correspondants aux différents registres du Z80 (A, B, C, F, H, L...)

Image
2. Création d'un tableau de décodage des opcodes (contenant le nom de l'instruction, sa longueur en octet, son timings et M et Tstates

Image
3. Traitement des instructions (ici 0x40 => 0x47 )

J'espère que ces quelques explications te donneront quelques pistes. :)

La partie la plus délicate à traiter dans un émulateur concerne la partie communication des instructions I/O aux autres composants et la gestion de la synchronisation entre les différentes composants...mais c'est un autre sujet.
Avatar de l’utilisateur
Sebiohazard
Messages : 425
Inscription : 30 avr. 2019 15:07

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Sebiohazard »

Hello Dmanu !

Merci pour tes retours & tes explications :)
Dmanu78 a écrit : 03 mai 2021 00:18 Pour mon information, tu cherches à émuler quelle machine ?
Pour l'instant je cherche à comprendre & assimiler tout ce que j'ai appris en C :) donc très loin de moi l'idée d'émuler quoique ce soit malheureusement, mais c'est mon rêve d'y arriver un jour... ou pas je ne sais pas si j'en suis capable !

Mais pour répondre à ta question j'aimerais bien émuler la ColecoVision ou le Commodore 64. En regardant tes screenshots je m'aperçois que je retrouve ce que j'ai appris: les switchs, les fonctions, les tableaux, chapitre sur lequel je suis & je sèche d'ailleurs, ainsi que les pointeurs... j'ai de la peine à comprendre tout ça, vraiment pas évident !

Donc j'admire encore plus le travail que tu as réalisé, c'est impressionnant toutes les connaissances & le savoir que tu as acquis ! Je pense que si j'avais commencé à programmer à 12 ans en BASIC sur C64, j'aurais plus de facilité que de commencer le C à 46 ans :)

Tu as commencé à programmer à quel âge ? Quel IDE utilises-tu ? Moi Code Blocks sous Windows...

Encore merci & salutations !
Image
Dmanu78
Messages : 268
Inscription : 20 juin 2020 14:28
Localisation : Yvelines

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Dmanu78 »

Ne t’inquiète pas, si cela peut te rassurer, j’ai vraiment appris le C à l’occasion de ce projet. Je ne l’avais quasiment jamais pratiqué avant.Je suis d’ailleurs très loin de maîtriser tout le potentiel du C++ et je ne comprends pas la moitié des listings en C++ que je peux voir passer. L’émulateur est codé à 90% en C avec un peu de spécificités C++ mais le ++ n’est pas indispensable. Tu remarqueras que mon code est très scolaire/très commenté pour des raisons de clarté. Il pourrait être largement optimisé mais il me convient parfaitement comme cela. Quand je reprends un bout de code 6 mois plus tard, j’aime bien ne pas me reposer de questions. D’ailleurs il est intéressant de voir que mon coding à bien évolué en 3 ans. Et je me surprends à réécrire dans mon émulateur mes plus anciens bouts de code qui trahissent une certaine jeunesse dans mes connaissances en programmation. :D
Il te faudra donc persévérer… et rien de tel que d’avoir un beau projet en tête pour arriver à ses fins.
De mon côté je travaille avec Visual Studio qui est très bien pour mon usage.
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par __sam__ »

C'est quoi la différence entre C et C++ ? Essayez par vous même: On vois pas trop ce qui change de prime abord. Mais là où ca devient drôle, c'est lorsqu'on répète l'opération: Clairement ce qu'on gagne avec C++ ce sont des effets de bords aux comportements imprévisibles.

[EDIT] Ah! c'est pas de ca dont on parle quand on dit C++ ? Mais si mais si.. vous verrez.. tout est toujours lié aux effets de bords en fin de compte.

sam (Vive la programmation fonctionnelle où l'effet de bord n'existe pas!)
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Dmanu78
Messages : 268
Inscription : 20 juin 2020 14:28
Localisation : Yvelines

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Dmanu78 »

Je reviens avec quelques news sur l'avancement de l'émulateur.
Depuis mon dernier post , j'ai (un peu) levé le pied sur les tests du CRTC pour refaire une passe générale d'optimisation. Il n'y a pas de miracle, mon émulateur reste globalement assez lent du fait de son écriture en T-States mais autant faire en sorte de ne pas gâcher inutilement de précieux cycles machine lors de son fonctionnement.

J'ai découvert assez récemment que Visual studio avait une option de "profileur de performance" permettant de monitorer les ressources CPU consommées par les Threads. J'en ai tiré de précieux enseignements pour optimiser mon code. Premier enseignement : Éviter autant que possible les appels de fonctions, surtout dans la boucle principale de 16 Mhz, ça consomme vraiment énormément de ressources. En remplaçant de petites fonctions fréquemment appelées par des macros, j'ai gagné énormément. Autre enseignement, je croyais que la création de plusieurs Threads distincts du thread principal me permettrait d'économiser les ressources CPU pour mon thread principal. Apparemment je me trompais et c'est d'autant plus frappant avec ma routine de scan des touches claviers.

Initialement j'avais crée un thread spécifique pour scanner l'état du clavier à intervalle régulier. C'est une bête boucle dans le thread avec un compteur déclenchant l'appel à la routine de scan toutes les 10ms environ. C'est largement suffisant pour récupérer l'état de saisie des touches du clavier. Quelle ne fût pas ma surprise de voir que cette simple boucle était la principale consommatrice de ressource CPU ! Il m'a suffit de remplacer ce thread par la création d'un Timer programmé pour appeler automatiquement cette même fonction tous les 10ms pour gagner énormément en ressource CPU. Le clavier fonctionne toujours aussi bien mais en ne consommant quasiment plus rien. La preuve en image.

Image
Avant la modification. Le thread de scan du clavier est le plus grand consommateur de ressource CPU de l'émulateur.

Image
Après la modification. Remplacement du Thread par un Timer. Aucun changement à l’usage mais que de ressources CPU économisés ! PS: J’en ai profité aussi pour optimiser l’affichage vidéo en passant. Quelques pourcents de ressource CPU gagné. C’est toujours ça de pris.

En parallèle, j'ai également retravaillé l'émulation de la puce sonore à travers le mixage des 3 voies sonores du AY. Jusqu'à présent, je laissais faire l'API X-Audio 2 mélanger à sa façon les 3 voies sonores pour restituer le son (mono ou stéréo). ça fonctionne très bien mais je n'étais pas super satisfait du rendu final. Je trouvais qu'il y avait un déséquilibre sonore entre les 3 voies. Aussi, en me replongeant dans les équations mathématiques relatives aux puissances sonores (ah les fameux log), je me suis amusé à recréer une table de mixage qui renvoie le niveau de volume résultant du "mélange" des volumes de chacune des 3 voies. Cette table a été calculée en tenant compte du diagramme du circuit de rendu sonore du CPC (où je me suis aperçu que l'intensité du courant de la voie "B" deux fois moindre que celles de la voie A et C pour le mode Stéréo). Au final, le rendu sonore me semble bien plus équilibré et harmonieux. Maintenant il y a beaucoup de subjectivité, aussi j'ai laissé au choix les 2 méthodes de rendu sonore. Pas de jaloux comme cela. :)

Autre fonctionnalité ajoutée en surfant sur l’excellentissime site "les sucres en morceaux" http://cpc.sylvestre.org/ , je me suis dit que ce serait bien d'émuler le moniteur monochrome vert GT64 des CPC. Le rendu de ce moniteur permet d'avoir 27 dégradés de vert avec des paliers très fins et donc de produire des images mieux définies qu'en couleur, même en basse résolution. J'ai un peu galéré à trouver les bons rendus du "vert" mais le résultat final me semble pas trop mal. Vous voulez des preuves en image, il suffit de lancer la démo G_max notamment et d'admirer le résultat :

Image
16 niveaux de vert en 160*200. Bluffant !

Image
idem.

Image
27 niveaux de vert affiché simultanément (mode alterné / ça scintille un peu). J'ai dû prendre une photo de l'écran pour que l'image rende bien. Bien exploité, le CPC est capable de faire des miracles..

En regardant l'émulateur WinApe, je me suis aperçu que son auteur a créé une suite d'outils de tests bien pratique qui m'a permis de tester les timings de chacune des instructions du Z80 sans et/avec les interruptions et en intégrant les cycles /WAIT States, ce qui m'a permis de corriger un bug de timing dans les instructions OTIR notamment.

Image
Tout va bien. L'ensemble du jeu d'instructions du Z80 est désormais parfaitement dans les timings. Je ne touche plus à rien :)

En parallèle à tout cela, j'ai commencé à mettre en place un petit panneau de configuration bien pratique pour jongler dans les réglages.

A ce stade, l'émulateur commence donc à prendre une forme sympathique. Petit à petit approche le moment où je l'estimerai digne d'être mis en téléchargement. Encore un peu de patience, ce ne sera plus très long (du moins je l'espère...). :)
Dernière modification par Dmanu78 le 03 juin 2021 22:41, modifié 2 fois.
Markerror
Messages : 2121
Inscription : 31 oct. 2011 19:21
Localisation : Orléans
Contact :

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Markerror »

Bravo pour ce boulot et le suivi !

Si tu veux te changer les idées, Roudoudou a sorti un jeu qui détecte quand il tourne sur un émulateur : Open Tower Defense.
Le jeu est d'arriver à faire en sorte que le programme ne se rende pas compte qui n'est pas sur un "vrai" cpc :-).

Le rendu mono est un vrai plus, car pas mal de vieilles démos allemandes ont été faites sur des GT-65 (ça explique le choix des couleurs assez étrange quand on les regarde sur un moniteur couleur). Il y a quelques slideshow également qui profitent de cet écran, mais mis à part ce qu'à fait Sylvestre, rien d'inoubliable (habituellement, des petites dames peu vétues :-) )
Avatar de l’utilisateur
leduigou
Messages : 542
Inscription : 08 mai 2011 21:00
Localisation : Paris, 6ème

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par leduigou »

Bravo pour ce travail, surtout quand on voit le rendu !
De mon côté, je fais du c++, c’est mon fils qui m’explique la programmation orientée objet !
J’en suis à mon 4ème émulateur sous 6809. Je voudrais émuler le Goupil G3 sous 8088 et Z80. Pourrais-tu me donner accès à ton code de l’émulation du Z80. Comme tu le dis, c’est pas compliqué mais très fastidieux ! Je ne sais pas si tu as le debuggeur qui va avec, mais ça aussi ça m’intéresse...

Par ailleurs, je développe sous Qt, c’est très facile de faire les interfaces et c’est multi plateforme (PC, Mac et Linux)

Bon courage pour la suite...
Frederic
Cordialement
Frédéric

Forget the C:\ prompt! Real computing starts with +++
Dmanu78
Messages : 268
Inscription : 20 juin 2020 14:28
Localisation : Yvelines

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Dmanu78 »

Comme toujours merci @markerror pour tes judicieuses remarques et anecdotes très intéressantes.
Je vais regarder le jeu de Roudoudou cela avec intérêt. Je m’aperçois en vérité qu’il est très difficile de se faire passer pour un véritable CPC. Mon émulateur ne passe pas encore incognito auprès de certaines démos :lol:
Pour découvrir comment la détection se fait, c’est assez compliqué puisqu’il faut désassembler le code et essayer de comprendre le test, ce qui est loin d’être simple quand on ne sait pas ce que l’on cherche.

Sur CPC il est finalement assez facile de débusquer un émulateur en testant chacun de ces composants : des instructions non documentées du z80 par exemple, mais aussi des instructions sous interruption pour vérifier les timings, ou tester le registre R du z80 suite à l’exécution d’une séquence d’instructions très précise. On peut aussi tester le comportement du CRTC et notamment son mode interlacé qui est très peu émulé car inutilisé sur un vrai CPC. On peut aussi tester le comportement du PPI en mode 1 ou 2 car seul le mode 0 est exploité dans un vrai CPC et les 2 autres modes ne sont quasiment jamais émulés, sauf sous sur ACE peut être. Bref, la création de l’ultime émulateur CPC reste un très très long chantier mais c’est stimulant :D
Markerror
Messages : 2121
Inscription : 31 oct. 2011 19:21
Localisation : Orléans
Contact :

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Markerror »

Je pense que la plupart des tests de détection se basent sur le comportement du hardware, les instructions cachées et le registre R étant utilisées dans certaines protections commerciales, ça serait étonnant que les émulateurs récents ne soient pas capables d'avoir les bons timings.

Effectivement, le plus efficace, c'est de trouver un test qui n'est pas émulé. Ca doit commencer à être compliqué maintenant :-).
Répondre