[EMULATION AMSTRAD CPC] 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 : Carl, Papy.G, fneck

Zebulon
Messages : 527
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 : 2240
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 : 106
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 : 1749
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 : 106
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 : 257
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 : 106
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 : 257
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 : 106
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 : 5885
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
Répondre