[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 : 2767
Inscription : 02 nov. 2020 14:03

Re: [EMULATION AMSTRAD CPC] AMSpiriT - work in Progress

Message par Zebulon »

Oui je comprends maintenant. Tu émules quasiment au niveau du fonctionnement interne de la puce. Les deux applications critiques sont les démos et les protections.
Lone
Messages : 16
Inscription : 26 nov. 2020 09:53

Re: [EMULATION AMSTRAD CPC] AMSpiriT - work in Progress

Message par Lone »

Hello,

Pour être passé également par là (émulateur en T-state, affichage du moniteur au pixel, etc), il est effectivement compliqué - mais pas impossible d'optimiser le tout.

Le problème vient surtout du fait que l'optimisation est en général nuisible à un code compréhensible, logique et extensible.

J'ai opté, par exemple, pour une "compression" des temps morts : comprendre, détecter tous les "ticks" qui ne sont pas dépendant d'autre chose, pour tous les traiter en même temps : Lors du calcul d'un T-State, par exemple, on sait que le prochain T-state ou il se passera quelque chose ne sera pas avant, admettons, 3 ticks. On va donc ne pas repasser dans la routine avant, ce qui évite de passer dans du code inutile (et couteux, les appels de fonctions coutent cher sur les CPU modernes, à cause des problématiques de pipeline et de cache).
Idem sur le moniteur : Je calcule 16 pixels d'un coup, en reportant les modifications effectives, pour éviter un passage dans une longue fonction 16 fois (ce qui m'a, par exemple, fourni le plus gros gain de perf).

Après, on peut aussi expérimenter pour tenter d'améliorer les choses : switch ou tableau de fonction ? etc, etc..
C'est un boulot particulièrement passionnant, mais qui prend également beaucoup de temps...
Dmanu78
Messages : 267
Inscription : 20 juin 2020 14:28
Localisation : Yvelines

Re: [EMULATION AMSTRAD CPC] AMSpiriT - work in Progress

Message par Dmanu78 »

Hello Lone,

C’est exactement cela. Tu as parfaitement résumé la problématique à laquelle je suis confronté. Ce que l’on gagne en précision, on le perd en lisibilité du code. J’essaye justement de bien commenter mon code pour pouvoir le reprendre sans trop de mal plus tard et comprendre pourquoi je l’ai écrit comme cela.
En ce moment, j’optimise à minima, j’essaye juste de minimiser les appels de fonctions, très gourmandes en ressources CPU effectivement et je court-circuite les tic inutiles, çe qui me permet de limiter la casse. S’ajoute à cela l’usage d’options de compilation qui privilégient la performance et ça passe pour le moment.…
Mais une fois finalisé, je ferai effectivement des optimisations plus efficaces comme regrouper l’affichage des pixels par 8 ou 16…Il y a plein de trucs à tenter. :)
Dmanu78
Messages : 267
Inscription : 20 juin 2020 14:28
Localisation : Yvelines

Re: [EMULATION AMSTRAD CPC] AMSpiriT - work in Progress

Message par Dmanu78 »

Après un long moment de silence, me voilà de retour avec en prime une toute nouvelle version de AmspiriT. :)

Au premier abord, vous serez peut-être déçus de voir que rien n'a quasiment évolué depuis la dernière version de décembre dernier, que ce soit esthétiquement ou par ses fonctionnalités et vous constaterez même que l'émulateur s'est encore "empâté " et nécessite encore plus de puissance CPU pour tourner correctement. Et le pompon, c'est qu'en usage normal, vous ne verrez aucune différence sensible entre les 2 versions.
Bigre, alors 4 mois d'attente pour ça ! Quoi de neuf finalement ?

En vérité, le changement est plus subtil et plus en profondeur qu'il n'y parait. C'est bien sous le capot, dans le moteur de rendu de AmspiriT que les changement les plus important ont été faits. Je m'explique :

Si je reprends l'historique de l'élaboration de l'émulateur, celui-ci s'est construit progressivement. L'émulateur a été codé à partir des seuls documents officiellement disponibles au départ, puis s'est amélioré par petite touche à travers la bonne exécution de démos très techniques. Dans ses évolutions les plus récentes, la partie de rendu visuel de l'émulateur a donc été en grande partie élaborée empiriquement, par rétro-analyse des démos, par strate successive, faute de documentations disponibles sur le sujet.

Lors de la dernière sortie de AmspiriT, je pensais sincèrement avoir quasiment fait le tour de l'émulation du couple CRTC / Gate Array. Je pensais par ailleurs que les derniers aménagements/correctifs se feraient par petites touches au gré des (quelques) anomalies qui seraient remontées.

En vérité je m'étais lourdement trompé car entre temps est sorti le guide qui me manquait tant, le fabuleux "compendium du CRTC" rédigé par @longshot (THE légende dans le monde des démomakers CPC). Ce guide décrit méthodiquement, registre par registre, le comportement de chacun de 4 types de CRTC utilisés dans un Amstrad CPC (oui, Amstrad n'a pas fait simple), ainsi que ses interactions avec le Gate Array et le processeur, du cas général aux cas les plus particuliers, tant appréciés des démomakers. Et cerise sur le gâteau, @longshot a écrit un ensemble de jeux de tests très complet (que je qualifierais d'acid-tests tant ils sont redoutables) dans son utilitaire "SHAKER" permettant de reproduire à loisir le comportement d'un registre, par type de CRTC. Un MUST HAVE pour tout concepteur d'émulateurs. Pour les curieux je rappelle le lien ci-dessous :
http://logonsystem.fr/html/downloadlogon.htm

A la lecture du compendium et suite à l'exécution des premiers tests de SHAKER, je me suis bien vite aperçu que l'émulation du CRTC dans AmspiriT était très perfectible, la faute aux choix opérés initialement et notamment celui d'avoir voulu unifier l'émulation des différents types de CRTC au sein d'un même code source. Car en vérité même si les 4 "types" de CRTC respectent le même cahier de charge en utilisation standard, dès que l'on sort de ses valeurs, leur comportement devient complètement différents, du fait d'une architecture interne complètement différente. Dès lors il devenait évident pour moi qu'il fallait dissocier le code source de chacun des CRTC et donc... repartir de zéro ...Voilà mon travail de ses 4 derniers mois. :(

Mais cela n'a pas été du temps perdu car cette réécriture de l'émulation du (des) CRTC m'a permis d'avoir un code source beaucoup plus propre et cohérent, en plus d'être plus facilement maintenable, en expurgeant toutes les "verrues" que j'y avais mises progressivement pour faire tourner telles ou telles démos. Désormais, plus rien de cela, le nouveau code source est exempt de tout "patch". En application directe du compendium, l'émulation de chaque CRTC devient donc "universel" et à priori devrait faire tourner toutes les démos futures sans intervention dans le code (du moins je l'espère).

Mais l'évolution la plus marquante a été ma façon de travailler. Jusqu'à présent je développais seul dans mon coin en glanant des infos à droite et à gauche et en me renseignant au besoin sur des forums. Depuis le début de l'année, je suis entré en contact avec un groupe de démomakers passionnés de CPC, et notamment Longshot, qui m'a activement guidé dans les derniers développements de AmspiriT sur des sujets techniques très pointus (notamment les subtiles différences de comportement entre l'instruction OUT et OUTI du z80, les différentes méthodes de décodages des couleurs dans la mémoire vidéo selon les modèles de Gate Array, les variations de longueurs des signaux HSYNC selon le type de CRTC... ).

Ces précieux échanges m'ont permis de porter la précision de l'émulation du couple CRTC/GA à un niveau que je ne pensais jamais atteindre et nous a également permis de bien mieux comprendre le fonctionnement de certaines caractéristiques des CRTC très mal documentées et donc mal émulées généralement (et notamment le fameux mode "Interlace" permettant d'afficher une image de 625 lignes en 2 frames consécutives interlacés).

Image
Exemple d'émulation du mode "INTERLACE VIDEO MODE " du CRTC. En haut "frame" PAIRE / en bas frame "IMPAIRE" (ou réciproquement).

En synthèse, sous une carrosserie inchangée, cette dernière version de AmspiriT bénéficie donc d'un moteur de rendu tout modernisé. :D
- Le Gate Array est désormais émulé à 16 Mhz pour une plus grande précision dans l'affichage des pixels (et reproduit donc fidèlement l'avance d'un pixel en Mode 2 par rapport aux autres modes graphiques du CPC, la variation de la durée d'un signal HSYNC, qui peut être que de quelques pixels,..)
- Les CRTC 0 et 1 (les plus courants) sont désormais pleinement émulés (avec une gestion fidèle de l'interlace) avec un haut degré de précision (y compris pour des ruptures de 1 NOP).
- Quelques bugs de timings au niveau de la génération du signal d'interruptions par la Gate Array ont été corrigés
- L'émulation du PPI a aussi été améliorée (prise en compte des modes autre que 0)

Au final, encore plein de boulot mais les bases techniques de l'émulateur sont désormais solides. Au programme à court/moyen terme, terminer l'émulation des CRTC type 2 et 4 (Pré-ASIC) pour en finir avec le rendu vidéo. Et ensuite...Wait & See.. :D

Le téléchargement de la dernière version se fait en première page de ce post, mais vous avez l'habitude maintenant. :wink:
TotO
Messages : 114
Inscription : 17 avr. 2015 23:31

Re: [EMULATION AMSTRAD CPC] AMSpiriT - work in Progress

Message par TotO »

Fantastique ! :o
Dmanu78
Messages : 267
Inscription : 20 juin 2020 14:28
Localisation : Yvelines

Re: [EMULATION AMSTRAD CPC] AMSpiriT - work in Progress

Message par Dmanu78 »

Merci :)

En complément de mon précédent message, quelques copies d'écran montrant les subtiles modifications apportées dans cette dernière version de AmspiriT : tous ces exemples ont été pris sur lors de l'exécution du test "SHAKER" évoqué plus avant. Bien entendu, tous les écrans ci-dessous sont le reflet de ce qui est réellement observé sur un vrai Amstrad CPC. :)

Image
Affichage avec une valeur du registre R0 du CRTC à 0. Soit des lignes de 1µs (contre 64µs en standard). Très compliquer à émuler. J'ai dû mettre 3 semaines pour complètement maitriser l'émulation de ce cas extrême.

Image
Affichage en avance de 1 pixel en mode 2 par rapport au mode 0 (il y a un changement de mode graphique à chaque ligne pour mieux voir l'effet).

Image
Affichage et fin du signal HSYNC du CRTC (bandes noires) en milieu d'octets (il y a en effet un décalage < 1 µs entre le moment où le CRTC envoie le signal HSYNC et celui où le Gate Array l'affiche à l'écran).
Dernière modification par Dmanu78 le 24 avr. 2022 10:21, modifié 1 fois.
TotO
Messages : 114
Inscription : 17 avr. 2015 23:31

Re: [EMULATION AMSTRAD CPC] AMSpiriT - work in Progress

Message par TotO »

C'est vraiment une très bonne chose que de s'intéresser avant tout au CRTC, car c'est l'enjeu même de l'émulation du CPC. Sinon, tu te retrouve comme la plupart qui sont perfectibles sur l'affichage et qui ne peuvent pas être corrigés par la suite, les rendant peut intéressants, sorti des jeux. Si en plus il intègre un bon debuggeur, ça serait le remplaçant tant attendu de WinAPE depuis une décennie pour les cross-développeurs.
Dmanu78
Messages : 267
Inscription : 20 juin 2020 14:28
Localisation : Yvelines

Re: [EMULATION AMSTRAD CPC] AMSpiriT - work in Progress

Message par Dmanu78 »

Oui, je le pense aussi. L’émulation du (des) CRTC reste le cœur de l’émulation d’un CPC. La sortie du compendium est une occasion unique d’avoir une émulation fidèle de ce composant, même dans des cas extrêmes. A court terme, je vais aborder l’émulation du CRTC ‘le mal aimé’ type 2 qui recèle quelques surprises et enfin ce sera le type 4, la version « pre-Asic », préambule à une future émulation du type 3 équipant les CPC « plus ». C’est le développement de ce que j’appelle le « core » de l’émulateur.
A moyen terme, et c’est aussi l’intérêt d’être en contact avec des demomakers, l’émulateur va progressivement glisser vers un usage typé cross-développeur, avec une ouverture vers d’autres environnements que Windows ce qui permettra d’y intégrer de puissants outils de déboggage dessus. Mais je n’aborderai pas trop avant ce sujet pour l’instant. Il y a encore beaucoup à faire avant d’en arriver là… :wink:
TotO
Messages : 114
Inscription : 17 avr. 2015 23:31

Re: [EMULATION AMSTRAD CPC] AMSpiriT - work in Progress

Message par TotO »

Oui, Longshot a fait un excellent travail, cela aurait pu s'appeler La Bible du CRTC. Jamais ce circuit n'aura autant été trituré que sur CPC ! :)
C'est une très bonne chose que de savoir le support prochain du CRTC 2 (le plus vieux ?) puis de celui intégré en pré-ASIC et ASIC, ce qui pourrait laisser présager une évolution de l'émulateur vers la gamme Amstrad Plus. Bonne continuation ! ;) (tu rigoleras aussi pour le FDC)
Dmanu78
Messages : 267
Inscription : 20 juin 2020 14:28
Localisation : Yvelines

Re: [EMULATION AMSTRAD CPC] AMSpiriT - work in Progress

Message par Dmanu78 »

oh que oui, le FDC est déjà partiellement émulé mais il n'est pas terminé, loin de là. Il y a pas mal de particularités à prendre en compte. @lone m'a gentiment fourni un jeu de tests complet pour m'aider dans le développement mais comme je me focalise sur le CRTC, je n'ai plus remis le nez dedans depuis quelques mois. Mais ce n'est que partie remise. :wink:
Dmanu78
Messages : 267
Inscription : 20 juin 2020 14:28
Localisation : Yvelines

Re: [EMULATION AMSTRAD CPC] AMSpiriT - work in Progress

Message par Dmanu78 »

:D hé hé oui je connais. J’ai téléchargé tout le lot. Roudoudou a fait un gros boulot de vulgarisation pour comprendre le fonctionnement du FDC. Maintenant faut que je mette tout cela en application…Faut juste que je trouve du temps…
Markerror
Messages : 2121
Inscription : 31 oct. 2011 19:21
Localisation : Orléans
Contact :

Re: [EMULATION AMSTRAD CPC] AMSpiriT - work in Progress

Message par Markerror »

Joli travail ! Amstrad a utilisé différents types de CRTC au cours de la carrière de la machine sans forcément avoir conscience des différences entre les modèles. Après tout, leurs caractéristiques "de base" sont toutes identiques, et il faut les pousser dans leurs retranchements pour avoir des problèmes de compatibilité. Les acheteurs de composants ne se doutaient probablement pas qu'il y aurait des gars assez tordus pour programmer la puce "à la volée" :-).
Dmanu78
Messages : 267
Inscription : 20 juin 2020 14:28
Localisation : Yvelines

Re: [EMULATION AMSTRAD CPC] AMSpiriT - work in Progress

Message par Dmanu78 »

Merci Markerror. :)
oh oui, je connais maintenant des personnes assez tordues pour distordre le comportement des CRTC à la volée, et de manière très surprenante parfois.... D'où l’intérêt de bien émuler distinctement chacun des modèles de CRTC. Car pour un développeur d'émulateur, rentrer dans ce monde de l’extrême demande une infinie patience. Quelques pixels affichés en plus ou en moins à l'écran suite peuvent révéler des règles d’affichage très spécifiques...et tout l'art de l'exercice est de trouver LA règle générale qui fonctionne dans tous les cas de figure. Ce n'est pas simple du tout mais on y tend, et c'est ce qui est amusant dans l'histoire. :)
Avatar de l’utilisateur
Sebiohazard
Messages : 425
Inscription : 30 avr. 2019 15:07

Re: [EMULATION AMSTRAD CPC] AMSpiriT - work in Progress

Message par Sebiohazard »

Hello Dmanu !

J'ai un soucis avec un jeu sur ton émulateur... c'est Lode Runner dont je joins une copie en pièce jointe pour que tu l'essaies chez toi.

Le soucis est qu'avec le clavier je peux déplacer mon personnages de gauche à droite mais pas monter aux échelles ?! Donc c'est injouable !

As-tu une solution ? Merci :)

Lode Runner.zip
(52.58 Kio) Téléchargé 64 fois
Image
Répondre