[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

Dmanu78
Messages : 268
Inscription : 20 juin 2020 14:28
Localisation : Yvelines

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Dmanu78 »

Suite de la saga de la genèse d'un émulateur Amstrad CPC en ce début d'année 2021...

Au moment où j'attaque le dernier gros morceau de l'émulateur, ce qui n'est pas la moindre des tâches puisqu'il s'agit rien de moins que d'émuler le moteur qui le fait tourner, à savoir le Zilog Z80A, il s'est déjà écoulé pas moins 2 ans de développement...Deux années pour apprendre un langage, à développer dans un environnement Windows, à apprivoiser ses API, à chercher et compiler toutes les documentations techniques pour émuler chacun des composants constituant le CPC. Deux années laborieuses mais finalement très enrichissantes intellectuellement qui mon permis de mieux comprendre le fonctionnement intime d'un ordinateur.

Au moment où je m'attèle donc à l''émulation du processeur, il me semble avoir fait le plus compliqué puisque dans ce cas, il n'y a pas de nouvelles API à découvrir, il me suffit "juste" de retranscrire informatiquement les opcodes telles que décrites dans les nombreux ouvrages traitant du Z80. En vérité, comme toujours dans le monde de l'émulation, ce n'est pas si simple et je vais passer encore de longs mois de développement sur ce gros moteur...

Sur le papier, un processeur n'est pas compliqué à émuler. C'est une puce un peu plus élaborée que les autres qui exécute des opérations arithmétiques et logiques en mettant à jour ses registres internes à chaque cycle d'horloge en fonction des opérations qu'on lui demande de faire.

Mais quand on rentre dans le détail, ça devient une habitude, c'est beaucoup beaucoup moins simple...

Premier point, le Z80A malgré le fait qu'il soit un ancien processeur 8/16 bits est en réalité d'une conception très complexe : Plusieurs centaines d'instructions à émuler, avec des instructions à décoder sur 1 , 2 octets (CBxx, DDxx, FDxx, EDxx..), voire 3 octets (DDCBxx, FDCBxx), 3 modes d'interruptions à gérer, une gestion de cycle d'attente, de nombreux registres internes (8, 8/16, 16 bits) et une certaine part de mystère puisque certaines instructions et certains registres internes, ne sont pas ou mal documentés.
Fort heureusement, sur ce dernier point, ce processeur est désormais très connu et on trouve sur internet de nombreuses sources d'informations dont le très précieux "The Undocumented Z80 Documented" regroupant l'ensemble des informations non transcrites officiellement sur ce processeur.

Deuxième point, j'ai choisi de travailler en T-States et cela va se payer cash avec un temps de développement accru, un code beaucoup plus complexe puisque, ne voulant décidément pas faire simple, j'ai poussé le vice à traiter les cycles d'horloges HAUT et BAS comme un vrai Z80. C'est là que je me suis plongé dans la découverte des cycles de décodage d'une instruction, le cycle M1 (le fetch) suivi des cycles de lecture/d'écriture, de l'insertion de cycles TWait à des endroits très précis de la séquence de décodage, la gestion des interruptions, avec ses règles... et ses exceptions. Bref, encore un chantier de longue haleine.
Comme toujours, outre la documentation technique disponible, ce chantier a été grandement facilité par le travail réalisé par certains passionnés dont Bathasarstudio qui a complètement séquencé la phase de décodage de toutes les instructions du Z80. Une vraie mine d'or qui m'a fait gagner pas mal de temps en tests et mieux fait comprendre le fonctionnement du Z80.
https://baltazarstudios.com/zilog-z80-u ... -behavior/

Cette phase de développement, même si elle n'est pas techniquement compliquée, a donc été extrêmement laborieuse. D'ailleurs très vite au cours du développement, je me suis aperçu qu'il fallait que je teste très en amont chacune des instructions que j'émulais. Un processeur mal émulé peut très vite être une source infinie d'erreurs lors de son exécution qui se paieront cash lors de la mise en route de l'émulateur et de son débogage. Il suffit d'une simple erreur sur la valeur d'un indicateur ou d'un registre pour faire planter un programme. Autant donc minimiser ces erreurs dès le départ.

Autant il est facile de vérifier à la main que l'instruction NOP fonctionne correctement (c'est la plus simple, elle ne fait rien en fait :D), autant il est compliqué de vérifier que l'instruction DAA fonctionne aussi bien...et à cela vient s'ajouter la vérification du respect des timings !!

Vous l'aurez compris, n'ayant pas d'outils de tests à ma disposition... j'ai dû en créer un de toute pièce.

Image

Cet outil réalisé sur mesure m'a permis durant la phase de développement de tester l'exécution de chaque instruction, avec une visualisation des registres avant/après exécution, des timings de l'instruction en T-Stats et en situation "réelle" en la faisant tourner en boucle plusieurs milliers de fois à la vitesse de 4 MHz afin d'en mesurer le temps moyen d'exécution, que j'ai comparé à la valeur "catalogue", hors Twait bien entendu.

Dans certains cas cependant, ces tests unitaires ne suffisaient pas à m'assurer de la bonne exécution de certaines instructions, notamment celles arithmétiques, pour lesquelles les valeurs du registre F (Flag) peuvent beaucoup varier (ADD, ADC, SUB, SBC..). Pour ces cas, je me suis donc résolu à extraire les résultats attendus à partir d'un vrai CPC !. Je me suis donc bâti un petit programme pour simuler ces instructions sur un vrai CPC (un petit code assembleur fait à la main et appelé en BASIC) avec une sortie des résultats sur un fichier que je rapatriais sur mon PC pour l'intégrer à mon émulateur...

Image
Rien de tel qu'une vraie machine pour tester... (PS : oui je sais, mon petit bureau est un peu ... bordélique :D )

Image
La fameuse instruction DAA assez compliquée à tester => Elle est bien conforme au résultat d'un vrai Z80. Ouf !

Au final, cette seule partie m'a encore pris 6 mois de travail mais ce gros investissement sur les tests unitaires m'aura permis au final de limiter les erreurs sur la partie émulation du processeur. Il restera des coquilles bien sûr qui seront corrigées un peu plus tard lors de la première mise en marche de l'émulateur (5 ou 6 instructions mal codées de mémoire) mais cela restera très correct au regard de la dizaine de milliers de lignes de code (12.612 pour être précis) composant cette partie de l'émulation.
Le but de ces tests n'était pas de faire du 100% sans erreur mais de rendre l'émulation du Z80 suffisamment fiable (à 99%) pour pouvoir ensuite lancer sur mon émulateur des programmes tests plus rigoureux et complet encore pour avoir une émulation CPU parfaite à 100%. J'en parlerai un peu plus tard...

Voilà pour cette dernière grosse partie. Si vous avez suivi attentivement mes posts, vous avez dû noter que je n'ai pas abordé l'émulation du PPI Intel mais c'est sans regret car ça ne présente pas d'intérêt : il s'agit grossièrement d'un "Hub" centralisant les IO provenant du clavier/son/cassette...

En résumé : la partie vidéo étant codée (couple Gate Array/CRTC), la partie son également (AY), le PPI et enfin le processeur (Z80), tout est en place pour le grand moment attendu : le lancement d'un émulateur Amstrad CPC 464 fonctionnel...et la question cruciale qui me tenaille à ce moment là : N'ai-je pas fait fausse route à un moment ? Est-ce que cet ensemble d'engrenages assemblés séparément puis imbriqués les uns aux autres au dernier moment va fonctionner ? Car en 2 ans et demi, il n'a jamais été lancé une seule fois au complet !

Je lui mets sa ou plutôt ses 2 ROM d'origines sous le capot et je lance le moteur...
La suite sera pour un prochain post et sans spoiler...ça va tousser un peu et il va falloir donner quelques coups de manivelle quand même pour réussir à faire faire tourner le bouzin... :D

Merci pour votre intérêt à ce post, bonne lecture et très bonne année à vous tous... :)
Dernière modification par Dmanu78 le 31 janv. 2021 22:03, modifié 3 fois.
Avatar de l’utilisateur
Totor le Butor
Messages : 2224
Inscription : 07 sept. 2011 16:14
Localisation : Paris - Mezels

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Totor le Butor »

Passionnant :D !!
Born to bricole
[Rch] Vieux composants électroniques et circuits intégrés toute époque et vieilles cartes .
Avatar de l’utilisateur
6502man
Messages : 12286
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par 6502man »

Lecture très intéressante :D
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
Dmanu78
Messages : 268
Inscription : 20 juin 2020 14:28
Localisation : Yvelines

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Dmanu78 »

Suite et (presque) fin de la saga pour les lecteurs les plus assidus... :D

Maintenant que les différents modules composant l'émulateur ont été testés unitairement et sont désormais réunis pour fonctionner de concert, les ROM Système et Basic du CPC installées, nous arrivons maintenant à la dernière et plus importante étape de la construction de l'émulateur : son baptême du feu..

Les premiers pas du nouveau né sont... décevants. Il ne se passe absolument rien. Les compteurs internes tournent visiblement, preuve que la boucle principale s'exécute mais à part cela, c'est le néant absolu, rien ne s'affiche à l'écran.

Voici donc venir le moment le plus fastidieux que je redoutais le plus : tracer et trouver les différents bug à l'origine des erreurs d'exécution du code.

Au début, j'étais un peu naïf, et j'ai commencé à déboguer mon code "à la main" en exécutant l'émulateur en mode "DEBUG" via Visual Studio (et il est très efficace pour cela), et en traçant l'exécution de chaque instruction en me référant en parallèle au listing papier de la ROM présent dans la fameuse "Bible du CPC" citée dans un post précédent.

Autant dire que ça m'a juste permis de corriger les très gros bugs de fonctionnement : un problème de lecture d'un octet en mémoire dû à une mauvaise synchro entre le Z80 et Gate-Array, une instruction CALL qui revenait à une mauvaise adresse suite à un RET...Ce sont des bugs facilement pistables qui ont donc été très vite corrigés.
Après la correction des plus gros défauts, c'est devenu très vite intenable. Trop lourd, trop fastidieux, cette méthode ne fonctionnait plus pour traquer les erreurs de fonctionnement plus subtiles.

Le fonctionnement en T-States de l'émulateur complexifie la lecture et le débogage du code. De plus, la ROM de 2x 16Ko du CPC est très optimisée et donc complexe à déchiffrer, avec la gestion d'un mode pagination en prime (on ne sait plus si le "PC" est en ROM ou en RAM) et il devient rapidement impossible de s'y retrouver en travaillant sur le listing papier dès que l'on s'enfonce dans les entrailles de la ROM.

Dans un émulateur, rien n'est décidément simple et l'histoire va donc se répéter... J'ai donc dû me résoudre à créer un nouvel outil sur mesure qui me permettra de déboguer l'exécution du code avec une vision synthétique du contenu des registres des puces spécialisées...C'est absolument nécessaire, pas d’alternative possible pour vérifier que l'ensemble fonctionne correctement...

Je suis donc reparti pour quelques semaines de coding afin de créer un désassembleur et en y incluant toutes les informations visuelles dont j'aurais besoin pour la suite...

Cette longue étape de mise au point, qui n'est pas encore terminée puisque j'améliore l'outil de débogage au fur et à mesure des problèmes rencontrés, m'a permis de progresser dans la résolution des bogues jusqu'à enfin obtenir l'écran d’accueil tant attendu, après 2 ans et demi de travail et 160 itérations de version...Oh Joie :)

Image
Et voilà, la boucle est bouclée et retour à l'image du premier post. Tout cela pour en arriver là. :o

Image
Work in progress. Le panneau de débogage créée pour l'occasion..une fenêtre de plus mais désormais diablement utile...

L'exaltation des premiers instants passée...je me suis remis au travail car de nombreux bugs restaient encore présents en usage basique dont certains bien coriaces qui m'ont pris plusieurs jours/semaines de recherche. J'avais par exemple systématiquement 1 ou 2 lignes qui ne s'affichaient pas à l'écran. J'ai passé de longs moments à triturer mon code dans le CRTC/ Gate Array avant de comprendre que c'était un bête problème de resizing du bitmap écran provenant de Direct2D... suite à une erreur de ma part sur les dimensions de la fenêtre graphique. Grrr !

Image
Un des problèmes rencontrés bien chronophage à résoudre. Mais pourquoi diantre des lignes manquent à l'appel ??

Après encore quelques nouvelles semaines fastidieuses de traque des derniers bugs visibles, après avoir testé et retesté les principales instructions BASIC, tapé des petits listings du manuel d'instruction, les plus gros dysfonctionnements constatés semblent avoir été corrigés et l'émulateur fonctionne désormais correctement en usage basique. La première étape de mon objectif initial est enfin atteint ! I'm Happy :D

Certes, ce n'est qu'une étape mais elle est diablement importante. Vous me direz que c'est terminé maintenant ? Pas tout à fait en fait, et en vérité je pense que l'émulateur ne sera jamais complètement terminé tant il y a de choses à parfaire dessus.

Mon but ultime est d'en faire un émulateur le plus proche du fonctionnement d'un vrai CPC...mais la route est encore très longue pour y parvenir car c'est désormais maintenant que les choses sérieuses vont commencer : Tester l'émulateur dans les cas les plus extrêmes : bench CPU, démos, jeux commerciaux ... la liste est longue et presque non exhaustive.

Et pour arriver à cet objectif, je vais encore avoir besoin de mettre grandement la main dans le code car s'il existe énormément de programmes CPC disponibles sur internet...la plupart sont au format DSK (format disquette). :shock:
Et pour accéder à ce merveilleux monde logiciel, il va donc falloir que l'émulateur puisse lire ce format et cela sous-entend qu'il va me falloir ajouter un nouveau module pour pouvoir continuer mes tests : la gestion des "Floppy Disk". Un de plus....

Allez, le chantier continue donc. Suite au prochain post, en prime vous aurez droit à de belles images pour vous récompenser de votre patience et vous montrer l'avancement de l'émulateur à ce jour :wink:
Dernière modification par Dmanu78 le 24 mars 2021 13:45, modifié 2 fois.
Lone
Messages : 16
Inscription : 26 nov. 2020 09:53

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Lone »

Toujours aussi intéressant, merci de nous faire partager tout ça !
Je vois que nos approche ont été radicalement opposées (j'ai commencé par le z80, le désassembleur et le débuggeur, en ayant très vite un visuel et un moteur "minimal" que j'ai, par la suite, réécrit plusieurs fois). Pour autant, le résultat est semblable !

Je trouve toutefois tes interface très claires, et le design très agréable (quelque chose que je n'ai jamais su faire).
Et je salue aussi l'abnégation : 2 ans et quelques de patience avant d'avoir un résultat visible, chapeau !
Dmanu78
Messages : 268
Inscription : 20 juin 2020 14:28
Localisation : Yvelines

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Dmanu78 »

Merci Lone. :) Heureux que ce partage d’expérience te plaise.
Je n’ai certainement pas choisi le chemin le plus simple mais c’est cela qui est intéressant. Je te rassure ce n’est pas 2 ans à temps plein. Au début, je ne codais que les samedis après-midi sur mon temps libre. En 2020 j’ai accéléré le développement du fait du confinement. C’est une occupation qui en vaut une autre après tout. Mais il y a un effet addictif je trouve. Plus ça avance, plus j’ai envie d’y passer du temps. Il faut que je me force à rester raisonnable.
J’essaye d’avoir une ergonomie épurée dans le dessin de mes fenêtres. Je suis assez sensible à l’esthétique général.
L’émulateur commence aussi à évoluer esthétiquement et sera à terme très graphique. J’essaye de supprimer les menus déroulants pour ne laisser place qu’à des icônes.
Il me reste encore de nombreuses petites choses annexes à terminer : un panneau de configuration par exemple mais je ne désespère pas de proposer une première bêta de l’émulateur en téléchargement au printemps. :wink:
Avatar de l’utilisateur
bubulemaster
Messages : 1082
Inscription : 01 juil. 2014 13:48
Localisation : Nantes

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par bubulemaster »

Ton travail et tes comptes rendus sont vraiment impressionnant.
J'ai toujours été épaté par les gens qui font des émulateurs car émuler du matériel et même un OS est une tâche difficile.

Bravo
Le 80286 et suivant sont des processeurs beaucoup trop évolués qui n'auraient jamais dû être inventés :-).
Vinted | Le bon coin | Ebay
Avatar de l’utilisateur
Totor le Butor
Messages : 2224
Inscription : 07 sept. 2011 16:14
Localisation : Paris - Mezels

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Totor le Butor »

Impressionnant :shock: !
Born to bricole
[Rch] Vieux composants électroniques et circuits intégrés toute époque et vieilles cartes .
Avatar de l’utilisateur
Sebiohazard
Messages : 425
Inscription : 30 avr. 2019 15:07

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Sebiohazard »

bubulemaster a écrit : 27 janv. 2021 14:37 Ton travail et tes comptes rendus sont vraiment impressionnant.
J'ai toujours été épaté par les gens qui font des émulateurs car émuler du matériel et même un OS est une tâche difficile.
Pareil comme je lai dit depuis que je suis sur ce forum, j'ai beaucoup de respect & d'admiration pour les programmeurs & notamment ceux qui se spécialisent dans l'émulation !
Dmanu78 a écrit : 26 janv. 2021 23:28 J’essaye d’avoir une ergonomie épurée dans le dessin de mes fenêtres. Je suis assez sensible à l’esthétique général.
J'y suis également sensible, est-ce que tu connais l'émulateur Retro Virtual Machine à voir ici ? Penses-tu avoir la même approche graphique ? Des petites choses toutes bêtes mais qui je trouve manquent souvent aux émulateurs, un compteur pour les jeux / programmes au format cassette & un indicateur " LED " d'accès disque pour les jeux / programmes au format disquette :)

Salutations !
Image
Dmanu78
Messages : 268
Inscription : 20 juin 2020 14:28
Localisation : Yvelines

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Dmanu78 »

Merci pour tous vos encouragements. :D

@Sebiohazard
oui, j'ai vu Retro Virtual Machine. Il est vraiment impressionnant avec une interface graphique à tomber. Whaou !! :shock:
On sent un vrai pro de l'informatique derrière ça.

Maintenant, je trouve qu'il en fait presque un peu trop. Il y a plein d'effets graphiques, des effets chatoyants, des fenêtres qui rebondissent etc.. l’auteur s'est visiblement bien faire plaisir mais je trouve à titre personnel que ça fait trop bling bling.
L'essentiel dans un émulateur c'est avant tout la qualité et la précision de l'émulation, ce qu'il y a sous le capot. Tout le reste est secondaire même si une ergonomie bien pensée et une esthétique agréable est importante pour donner envie bien entendu.
Avatar de l’utilisateur
Sebiohazard
Messages : 425
Inscription : 30 avr. 2019 15:07

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Sebiohazard »

Dmanu78 a écrit : 29 janv. 2021 00:23 oui, j'ai vu Retro Virtual Machine. Il est vraiment impressionnant avec une interface graphique à tomber. Whaou !! :shock:
On sent un vrai pro de l'informatique derrière ça.
Hello Dmanu je voulais te dire que pour moi tu es déjà un pro, arriver à programmer un émulateur de A à Z est un défi extrêmement compliqué à réaliser & n'est de loin pas accessible à Mr tout le monde !

Hâte d'essayer ta future release :) au fait tu n'as pas répondu à ma question concernant les petits plus y aura-t-il un compteur & ou un indicateur lumineux ?
Penses-tu avoir la même approche graphique ? Des petites choses toutes bêtes mais qui je trouve manquent souvent aux émulateurs, un compteur pour les jeux / programmes au format cassette & un indicateur " LED " d'accès disque pour les jeux / programmes au format disquette :)
Salutations !
Image
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par hlide »

RVM n'est pas le meilleur émulateur de l'Amstrad CPC. L'auteur a peut être bien soigné l'interface (c'est ce que voit en premier le "client" en démo) mais ça doit se faire au détriment de quelque chose. Je crois même que l'auteur s'est désintéressé d'aller plus loin pour une émulation CPC plus, ce qui pour moi en dit long sur la volonté de l'auteur sur "la qualité et la précision de l'émulateur sous le capot". D'autant que RVM n'est pas uniquement orienté Amstrad.
Dmanu78
Messages : 268
Inscription : 20 juin 2020 14:28
Localisation : Yvelines

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Dmanu78 »

Suite de l'aventure de construction d'un émulateur CPC "from scratch".

Après m'être assuré que l'émulateur tournait correctement en usage basique, j'étais toutefois convaincu qu'il ne fallait pas que je me satisfasse de cette situation et que des bugs résiduels étaient encore bien présents.

Avant d'aller plus loin dans l'avancement de l'émulateur, je devais d'abord m'assurer que le moteur d'émulation du Z80 soit exempt de bugs. J'avais à ce stade corrigé 4-5 bugs liés à une mauvaise exécution d'instructions du Z80 mais j'étais persuadé que d'autres bugs plus subtiles étaient présents, ou alors j’avais vraiment été très bon dès le départ.. Humm...Non, mieux fallait vérifier.
Le contenu des ROM du CPC est en effet bien loin d'exploiter toutes les instructions du Z80. Mon émulateur fonctionne peut être avec 99% des instructions, mais comment en être certain à 100% ? Cette étape de vérification poussée est donc importante pour éliminer toutes nouvelles sources potentielles de bugs qui proviendraient d'une mauvaise l'émulation du z80. Par expérience, la détection d'une instruction Z80 mal exécutée est très compliquée à résoudre. Cette étape n'est donc pas du temps perdu.

En regardant sur différents forums, je me suis aperçu qu'il existait bien des utilitaires de tests CPU pour Amstrad CPC. Je citerai le fameux et redouté ZEXALL ou son petit frère ZEXDOC qui sont une référence dans le monde de l'émulation Z80 mais aussi les différents tests de Patrick Rak, comme indiqué par Lone dans un précédent post, qui sont bien complémentaires. J'ai aussi trouvé des tests z80 vraiment très pointus provenant de l'auteur de ACE.

Maintenant, il y a un problème. Pour lancer ces tests, je dois les charger en mémoire. Mon émulateur à ce moment là ne sait pas encore lire nativement (à partir de la ROM système donc) les fichiers "cassette" et surtout les fichiers "disquette". C'est très problématique. J'avais absolument besoin de vérifier que la partie émulation du Z80 soit parfaite avant d'aller plus loin.

Les programmes de tests évoqués plus haut sont tous au format DSK (disquette)...il n'y a donc pas à réfléchir trop longtemps. Il faut que je développe la partie émulation du lecteur de disquette (au moins partiellement) pour atteindre cet objectif.

Et je suis donc reparti pour un nouveau plongeon dans les ouvrages techniques...Comment est structurée une disquette, comment fonctionne le "Floppy Disk Controler" (FDC) équipant le CPC, comment y accéder à partir du CPC, et quelle est la structure de ces fameux fichiers DSK ? bref la totale. En vérité, c'est assez complexe, passionnant certes.. mais complexe.

Sur un AMSTRAD CPC 464, pour pouvoir lire une disquette, il faut préalablement y connecter une interface dite "DDI" sur le port d'extension qui sera elle même reliée à un lecteur de disquette externe (sur un 664 ou 6128, la carte mère contient déjà ces aménagements). Outre le FDC, cette interface contient une ROM additionnelle de 16Ko pilotant les transferts de données avec le lecteur de disquette et contient également de nouvelles instructions BASIC.

Côté "logiciel", dans un premier temps,il m'a fallu comprendre la structure des fichiers DSK et l'implémenter dans l'émulateur. C'est plus simple à lire qu'un fichier "Tape" au format .CDT mais il faut être très méticuleux car y a pas mal de structures imbriquées les unes aux autres, comme des poupées russes.

Côté "technique", la première étape a donc été de gérer les ROM additionnelles au sein de l'émulateur. Ce n'est pas le plus compliqué mais au final je suis resté extrêmement admiratif du boulot des concepteurs du CPC d'avoir prévu une gestion aussi efficace des ROMS externes dès le CPC 464.

La deuxième étape a consisté à émuler le FDC et là, c'est une toute autre paire de manche. Le FDC765 de Nec, son petit nom, est une puce très complexe de 40 broches contenant 5 registres d'état et 15 instructions (lire donnée, écrire les données, formater, rechercher...). En plus sur CPC, elle a été castrée puisque le mode DMA n'y est pas connecté et les octets d'une disquette sont lues à la mano, un par un, piloté par le Z80. ça a été la partie la plus délicate, j'ai dû reprendre le coding à plusieurs reprises. Au final, plusieurs semaines encore à travailler dessus !

Je précise que mon but n'étant pas à ce stade de faire une émulation parfaite du contrôleur, (ça viendra plus tard) mais de l'émuler à minima afin de pouvoir "charger" le contenu d'une disquette en mémoire et vérifier l'émulation du Z80.

Arrive enfin, la troisième et dernière étape consistant à tester le tout une fois la fameuse ROM 7 "DDI" implémentée dans l'émulateur.
Et là, ça me manque pas... plantage au premier lancement !! Et surprise, ça ne vient pas de la partie fraichement codée mais d'une instruction Z80 mal exécutée dans cette ROM, encore une... Il est décidément urgent que je teste l'émulation du Z80 de fond en comble.

Après encore quelques jours de tests et de débogage arrive enfin le moment où le catalogue d'un fichier DSK s'affiche correctement à partir de l'instruction BASIC "CAT" tapée sur l'émulateur CPC 464. Nous sommes alors fin aout 2020 et l'accès au monde des logiciels CPC s'ouvre enfin en grand pour mon émulateur. Je vais enfin pouvoir lire des disquettes !

Image
Encore une petite victoire symbolique. La première tentative réussie de lecture du catalogue d'une disquette.

Ensuite, tout va aller très vite. Ce verrou sauté, je vais commencer à charger de nombreux logiciels de tests dont le fameux ZEXALL évoqué plus haut. Et effectivement, le décodage des instructions est perfectible...

Image
Aïe, et oui, je m'en doutais je ne suis pas parfait :lol: ...de nombreuses instructions sont mal décodées.

Quelques semaines plus tard, car oui, ce programme teste des instructions non documentées du z80 (grrr!), le test se termine avec succès, sans erreur... YESS... mais non, le deuxième jeu de tests de P. Rak me détectent de nouvelles erreurs :shock: ...et c'est reparti pour un nouveaux lots de correctifs...

Image
OK. C'est bon pour ZEXALL, test concluant.

Image
Ok. C'est bon pour l'ensemble des tests Z80 de P. Rak (Flags, MEMPTR, Complete..)

Image

Image
Ok pour les tests CPU de l'auteur de ACE qui sont bien pointus (évolution du flag PV sous interruption avec les instructions "LD A,I & LD A,R" qu'il n'est pas possible de passer en mode NOP je pense, évolution du registre R sous interruption...)

Au final, cette longue étape n'a pas été faite pour rien. J'ai désormais la quasi-certitude que l'émulation du Z80 est fiable à quasiment 100% (bon, allez, à 99,99%).

Je peux maintenant m'atteler à tester d'autres composants du CPC et notamment le CRTC, qui m’intrigue drôlement quand on le pousse dans ces derniers retranchements. Pour tester ce composant, rien de plus simple, il suffit de trouver des démos... :shock: et.. pfff, oh là là oui, il y a encore du boulot...
A suivre.

Image
Non, ce n'est pas la fin du post... juste la fin d'une démo. De plus belles images suivront :wink: Remarquez au passage la nouvelle ergonomie de l'émulateur...
Zebulon
Messages : 2788
Inscription : 02 nov. 2020 14:03

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Zebulon »

Surperbe ! Encore et encore bravo. :) Pas mal les jeux de tests pour le Z80 mais effectivement il faut des fondations solides. Une épopée vraiment passionnante et j'ai hâte de poser ma souris sur ce nouvel émulateur. :D
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par hlide »

Comment dire ? *BIG THUMB* pour la gestion et le test propre du Z80. C'est rondement bien mené.
Répondre