[EMULATION AMSTRAD CPC] AMSpiriT - work in Progress

Couvre tous les domaines de l'émulation logicielle 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 »

Merci Yves. :)
Oh Oui, il ne faut surtout pas céder au découragement, surtout qu’avec bientôt 3 ans de recul, je me rends compte à travers l’écriture de ce fil qu’il y a eu de très nombreux obstacles à surmonter. C’est un travail de très longue haleine mais à partir du moment où la motivation est là, rien ne semble insurmontable, ce n’est juste qu’une question de temps pour arriver à ses fins. Cela reste avant tout un défi intellectuel et c’est en cela que c’est intéressant. :wink:

Mais plus j’avance dans l’écriture de l’émulateur, plus je suis admiratif du boulot des ingénieurs Amstrad. Cet ordinateur est une merveille de conception et d’ingéniosité pour son prix : l’économie de puces, la gestions des ROM additionnelles, la mémoire partagée ...

En aparté je suis tombé par hasard sur ce lien racontant la genèse du CPC 464. C’est impressionnant de voir comment il a été construit en si peu de temps.
https://www.theregister.com/2014/02/12 ... d_cpc_464/
yves
Messages : 464
Inscription : 12 sept. 2007 21:32

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par yves »

Dmanu78 a écrit : 12 déc. 2020 22:13
Mais plus j’avance dans l’écriture de l’émulateur, plus je suis admiratif du boulot des ingénieurs Amstrad. Cet ordinateur est une merveille de conception et d’ingéniosité pour son prix : l’économie de puces, la gestions des ROM additionnelles, la mémoire partagée ...
C'est marrant car je m'étais fait exactement la même réflexion quand je travaillais à décortiquer la ROM et faire un émulateur du hector. Des ingénieurs brillants arrivé à un résultat très optimisé avec rien. J'avais d'ailleurs eu l'occasion de le confirmer quand j'ai pu rencontrer certains d'entre-eux: Brillants et simples, sans prise de tête.

Yves
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par hlide »

Et dire que t'a failli manger du 6502 à la place du Z80. Mais bon ce ne serait plus un CPC.
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 de l'émulateur...

Arrivé à ce stade de l'écriture de l'émulateur, la partie vidéo (GA et CRTC) étant à peu près opérationnelle pour un premier usage basique, la partie gestion des fichiers K7 étant écrite, il me restait donc 2 gros morceaux à terminer avant de commencer les tests de fonctionnement de l’émulateur : L'émulation du PSG (pour le son) et celui du processeur. .

Il s’agit à mon sens des éléments minimum pour émuler le CPC 464. D'autres "modules" non essentiels mais indispensables à l'usage viendront s'ajouter un peu plus tard mais chaque chose en son temps. Un émulateur se construisant brique par brique, j'ai préféré pour ma part me focaliser sur un seul sujet à la fois, quitte à y passer plusieurs semaines/mois. Je me répète mais c'est peu de dire que la patience reste une vraie vertu sur ce type de chantier.

J’ai donc choisi de m'atteler à l'émulation de la puce sonore. Le processeur attendra encore un peu. :D

Sans surprise, vous l'aurez deviné, la première étape a consisté à récupérer toute la documentation disponible et notamment le dataSheet de la puce sonore équipant toute la gamme CPC, le Yamaha AY-3-8912, afin de mieux comprendre son fonctionnement interne. J'ai de la chance, il existe de nombreuses documentations techniques sur cette puce.

Comme toujours sur le papier ça n'a l'air pas trop compliqué : Le AY est doté de 14 registres qui peuvent être adressés afin de générer un son et/ou bruit sur 3 voies indépendantes, sur 15 niveaux de volume fixe ou via une enveloppe de volume prédéfinie. En plus, le son généré n'est pas une une onde sinusoïdale mais une bête onde carré. La fréquence du son dépend tout simplement d'une simple impulsion de période fixe. Cette fréquence sonore est produite par division de la fréquence d'horloge d'entrée à 1 Mhz, la fréquence allant de 62.5 kHz (1/16 Mhz, inaudible bien sûr), jusqu'à un minimum de 15 Hz env (1/16/4095, très peu audible aussi). Même si les fréquences disponibles couvrent le spectre d'audition de l'oreille humaine, elles ont l’inconvénient d'être très peu présentes dans les aigus, un peu dans les médiums et beaucoup dans les graves. Bon, pas top mais on va faire avec alors. C'est ce que a le CPC dans le ventre.

Mais vous l'aurez compris, comme toujours en émulation, si la théorie semble simple, la mise en œuvre est beaucoup moins aisée car 2 obstacles se sont rapidement présentés à moi : comment générer l'onde sonore en temps réel et comment l'envoyer vers les haut-parleurs de mon PC ?

Je me suis retrouvé exactement dans la même situation qu'avec la partie de l'affichage vidéo : Il est impossible d'adresser directement les informations à la puce sonore équipant tout PC. Pour pouvoir sortir du son, il faut encore et toujours en passer par les API système. Et sous Windows, c'est galère car il existe un gros paquets d'API sonores cohabitant ensemble et qui semblent n'être là que pour gérer la compatibilité avec les différentes versions de Windows. Entre les "Core Audio API", "DirectSound", "WASAPI" , "XAudio2" et les autres API "externes" disponibles, le choix ne manque pas. C'est un peu le bordel à vrai dire.
Au final, mon choix s'est porté sur XAudio2 qui est l'API la plus récente disponible, de bas-niveau et à faible latence, tout ce dont j'ai besoin pour produire mon onde sonore émulée. En plus cette API sait gérer de nombreux effets, comme l’ajout de filtres de fréquence qui me permettront plus tard d’affiner la qualité de l’émulation du PSG.

Je suis donc repassé d'une lecture de doc technique à la lecture des nombreux tutoriaux pour exploiter cette API...
En aparté, vous l'aurez compris, n'utilisant que des API Windows pour cet émulateur, celui-ci ne sera donc compatible que.. Windows ...et en version 10 je pense (XAudio2 n'est pas présent sur les versions antérieures il me semble)...

Reste maintenant la question de la génération en temps réel de l'onde sonore. En vérité, ça n'a pas été aussi compliqué que cela puisque j'avais déjà l'expérience de la lecture des fichiers K7 en .WAV qui contiennent également des ondes sonores "carrés".
Sur le principe, pour chacune des 3 voies, j'ai réservé une zone mémoire correspondant à la partie DATA d'un fichier virtuel WAV au format PCM (comme pour un fichier K7 en vérité), avec un baudrate de 125 kHz (nécessaire pour pouvoir gérer toutes les fréquences sonore produite par le AY).
Chacune des voies est programmée pour lire en boucle, et en tâche de fond, dans ces zones mémoires dédiées. Dès lors qu'un son doit être généré, il me suffit d'y écrire une fois toutes les 1/125.000 de seconde les impulsions correspondant à la fréquence sonore désirée et ..c'est tout. ça ne prend quasiment rien en ressource CPU et le résultat marche plutôt pas mal... voire même très bien sur les derniers tests que j'ai faits.

En vérité, j'ai quand même buté sur 2-3 trucs énervants lors de la mise au point de l'émulation de la puce sonore dont un pas encore complètement résolu à ce jour.
- Le premier point est l'apparition de temps en temps d'un grésillement sur le son produit. Un son pas propre. J'ai mis longtemps à comprendre que cela était dû au fait que l'API lisait les données à l’endroit approximatif où je les écrivais à ce même moment. Le son étant joué en continue, la lecture et écriture du son étant à la même vitesse, l'API jouait un son en cours de construction et générait un son bizarre.
- Le deuxième point a été la génération de l'onde pseudo-aléatoire du générateur de bruit du AY. Tout comme pour le calcul du CRC des fichiers K7, la recherche de l'algorithme mathématique permettant de générer ce "bruit" a été fastidieuse et au final, sachant que cela dépassait mes compétences mathématiques, j'ai repris un bout de code de 5-6 lignes trouvé sur internet (celui de l'Atari ST je crois, les puces sont similaires). Je ne sais pas si le son produit est exactement celui du CPC mais à l'oreille il n'en semble pas loin.
- Le troisième point n'est pas encore parfaitement résolu : le AY a la particularité de laisser le volume à un niveau constant lorsqu'une des voies sonores est éteinte. Un problème gênant apparait lorsque le niveau du volume varie dans ces conditions, un "claquement" sonore est émis lors de la transition, traduisant ce brusque changement de volume...Sur certaines démos jouant de la musique en exploitant cette propriété, on entend distinctement ces claquements à intervalles réguliers...J’arrive à les atténuer en lissant les transitions mais ce n’est pas parfait encore. Sujet en cours donc. Wait & See.

Enfin dernier point galère pour les tests : comment savoir si le son restitué est identique à celui produit par un vrai CPC... car il est beaucoup plus dur de comparer un son qu'une image. Dans ce cas, j'ai fait de l'empirique : J'ai écouté des sons simples sur YouTube produits par un vrai CPC et comparé à l'oreille ceux produits par l'émulateur.. Fastidieux mais nécessaire pour être sûr que le son de l'émulateur ressemble au vrai son d'un CPC.

Enfin, tout bon ouvrier devant avoir de bons outils, pour m'aider à accélérer la mise au point de l'émulation du PSG , j'ai crée un petit outil de test sur mesure qui m’a bien facilité les choses.

Image
Petit bonus, j’ai ajouté la gestion de la stéréo : je ne sais si c’est exploité en vrai mais c’est géré... :)

Ainsi se termine ce long post consacré à l'émulation de la partie sonore du CPC. Une bonne chose de faite.
Dans le prochain post j'aborderai le plus gros morceau : l'émulation du CPU...Plusieurs milliers de ligne de code. Le coding en mode T-States se paye très cher !!! :D
Dernière modification par Dmanu78 le 27 déc. 2020 19:33, modifié 7 fois.
Avatar de l’utilisateur
fneck
Site Admin
Messages : 17424
Inscription : 01 avr. 2007 12:03
Localisation : Drôme Provençale (26)
Contact :

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par fneck »

Je ne participe pas à ce sujet car j'en suis bien incapable...
Mais toutes mes félicitations pour la persévérance et le travail réalisé 8)
Fabien https://www.system-cfg.com
Les bonnes pratiques de l'utilisateur du forum viewtopic.php?f=14&t=3
Zebulon
Messages : 2788
Inscription : 02 nov. 2020 14:03

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Zebulon »

Dmanu78 a écrit : 26 déc. 2020 02:03 Petit bonus, j’ai ajouté la gestion de la stéréo : je ne sais si c’est exploité en vrai mais c’est géré... :)
Encore bravo et merci pour cette saga passionnante.

Oui en effet le HP interne est monophonique mais la prise jack sort un son stéréophonique.

A correspond au canal de droite, B correspond au centre et C correspond au canal de gauche. https://cpcrulez.fr/coding_basic-le_son_sur_AMSTRAD.htm
Lone
Messages : 16
Inscription : 26 nov. 2020 09:53

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Lone »

Ah, le son !
S'il y a bien un domaine ou l'on rentre dans le subjectif, c'est bien là : Difficile de dire si ça "sonne" comme un CPC (sans compter les effets indésirables : Tout dépend de la pièce, de la sortie, etc...)

Les problématiques, en plus dépendent autant de la génération elle-même, que de la manière de reproduire (avec la synchro elle-même : est-on plutôt légèrement trop rapide, et va-t-on "zapper" des buffers, ou est-on trop lent, et manquera-t-on de buffer ?). Une des solutions étant de synchroniser la vitesse du CPC émulé avec le nombre de tampons disponibles pour la génération du son, mais ceci est une autre (et passionnante) histoire.

Pour la génération elle-même, j'avais fini par ruser, en branchant la sortie casque d'un CPC+ vers l'entrée du PC : Le sampling à 125khz via audacity m'a montré qu'on avait, en fait, un rendu pas tout a fait identique : La faute à l'électronique de sortie, et notamment un filtre passe-haut qui "coupait" les fréquence les plus élevées. En comparant les wav générés et enregistrées, j'ai pu affiner -un peu- le rendu final...
Markerror
Messages : 2121
Inscription : 31 oct. 2011 19:21
Localisation : Orléans
Contact :

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Markerror »

Bonjour,

Se baser sur des vidéo Youtube pour valider la qualité du son de l'émulation d'un AY, ce n'est pas forcément une bonne idée. La plupart du temps, ce sont des émulateurs qui jouent les musiques. Sur PC, ce qui se rapproche le plus du CPC, c'est Arkos tracker 2 car Targhan est pointilleux sur ce sujet :-).

Personnellement, je trouve que la fréquence de 1mhz pour l'AY du CPC est un bon choix car on bénéficie ainsi de beaux graves sur les voix hard (chose qu'un ST par exemple ne peux pas faire). C'est peut-être moins précis sur les aigüs, mais à la composition d'un morceau, ce n'est pas franchement génant.
Dernière modification par Markerror le 27 déc. 2020 09:18, modifié 1 fois.
Dmanu78
Messages : 268
Inscription : 20 juin 2020 14:28
Localisation : Yvelines

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Dmanu78 »

Merci de vos retours et pour vos encouragements.
Effectivement, juger de la qualité d'une restitution sonore est très subjectif en sachant que le rendu va dépendre énormément de la qualité du haut-parleur.

Youtube m'a bien aidé à l'époque de l'écriture de l'émulation du AY, car je ne pouvais pas encore exécuter l'émulateur. J'avais besoin d'être certain que je ne faisais pas fausse route avec ma solution de restitution du son (et notamment pour les bruitages et les enveloppes de volume préprogrammées).

J'ai trouvé cette petite vidéo qui avait l'énorme avantage de me permettre d'écouter sur un vaste panel d'échantillons le son correspondant au contenu des registres internes du AY . C'était parfait pour vérifier que le sortie produit par l'émulateur sonnait à peu près comme sur la vidéo. :)
https://www.youtube.com/watch?v=3k2qMxdwO7g

Je rentrais les mêmes valeurs dans mes registres internes du AY que celle affichées sur YouTube et comparais à l'oreille les sons produits. C'est très loin d'être rigoureux effectivement mais ça m'a permis de dégrossir mon travail et de corriger mon code notamment lorsqu'il y avait en jeu des variation rapide des enveloppes de volumes.

J'utilise maintenant un vrai CPC pour m'assurer que la restitution sonore de l'émulateur ne s'éloigne pas trop de l'original mais j'ai conscience du caractère imparfait de l'opération. Je n'en suis pas encore à enregistrer le son du CPC pour parfaire la restitution comme tu le fais Lone.

Mais il est certain que je devrai appliquer tôt ou tard des filtres et notamment sur les hautes fréquences car actuellement XAudio arrive à me sortir à des sons à plus de 20 kHz de fréquence (pour des valeurs de R0 < 5), ce qui est aberrant...
En tout cas, il est clair que le haut-parleur interne du CPC ne rend pas hommage à sa puce sonore. Sur mon CPC un peu fatigué, ça crachote dès que je tourne la molette du volume, ça sature dès que le volume monte, les graves semblent étouffés, j'ai l'impression d'avoir des médiums plus "nasillard"...Difficile à décrire n'étant pas un spécialiste du son mais ça fausse toute comparaison objective sachant que sur mon PC j'ai des hauts-parleurs un peu plus haut de gamme.

Je vous laisserai juger sur pièce lorsque que je commencerai à le mettre en téléchargement...et j'ajusterai selon vos retours :wink:
Dernière modification par Dmanu78 le 27 déc. 2020 15:50, modifié 1 fois.
Zebulon
Messages : 2788
Inscription : 02 nov. 2020 14:03

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Zebulon »

Oui le HP interne ne rend pas justice au CPC c'est certain (on arrive à faire mieux sur des téléphones portables actuels) mais la sortie stéréo est une tuerie sur un ampli ou un bon casque.

Après la puce a été très diversement exploitée, mais certaines musiques m'ont hantées (en vrac Cybernoid 1&2, Marauder intro et in-game, Commando, Druid, Ghost'n Goblins, Ikari Warriors, Last V8, Nebulus, Sapiens...). :D

J'ai toujours été fasciné par les Chiptunes comme on les appelle maintenant.

Mon appétit vorace s'est ensuite tourné vers la Megadrive mais ce n'est plus tout à fait la même catégorie. (Mais quand même les musiques de Sonic ou l'intro de Streets of Rage...) :mrgreen:
Dmanu78
Messages : 268
Inscription : 20 juin 2020 14:28
Localisation : Yvelines

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Dmanu78 »

Merci Zebulon, c’est très intéressant. Je n’ai jamais pensé à utiliser la sortie son du CPC. Je vais tester ça. :D
D’ailleurs j’y pense. Pour me faire gagner un peu de temps dans la mise au de l’émulateur, avez vous des utilitaires, musiques, démos de référence à me recommander en priorité (pouvant être chargé au format dsk de préférence) ?. Je teste actuellement le comportement de l’émulateur sur quelques démos trouvées un peu par hasard sur les sites spécialisés mais il y a tellement de choix que c’est compliqué de tout choisir...
Lone
Messages : 16
Inscription : 26 nov. 2020 09:53

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Lone »

@Dmanu78 : je serais tenté de dire, ça dépend ce que tu veux tester.
Pour le son, c'est bien de voir la musique, mais aussi la synthèse vocale ou les samples (Crazy cars 2, le manoir de Mortevielle, par exemple).

Pour les protections et les dumps, là j'ai des tests automatiques basés sur une centaine de cas différents, pour vérifier les régressions et les différents cas (sans doute la partie ou j'ai passé le plus d'énergie, si tu veux des listes de tests, je peux te fournir des zips !).

Pour les CRTCs, c'est les démos bien sur le plus difficile. Ne serait-ce que faire tourner toutes les parties de "The démo" ou de la 30 Years megademo.

Pour le Z80, il y a les tests de Patrick Rak ( https://www.cpc-power.com/index.php?pag ... &num=12883 ). Ou encore "Le nécromancien", dont la protection, si je ne confond pas tout, est basé sur l'incrément du registre I correct.

Pour le reste, rien que ne me vienne à l'esprit...
Dmanu78
Messages : 268
Inscription : 20 juin 2020 14:28
Localisation : Yvelines

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Dmanu78 »

Un grand merci pour ta réponse Lone.
Je vais regarder tout cela de très près.
Je viens juste de commencer l’émulation du FDC (juste pour la lecture en fait, il ne sait pas encore écrire ni formater) et pour l’instant je ne peux lire que les format dsk de base. Je ne vais pas toucher pas aux systèmes de protection du FDD pour l’instant mais je sera avec grand plaisir que je récupérerai bien tes listes de tests.
Mais rien que le fait de pouvoir lire basiquement les fichiers au format dsk m’ouvre la porte un catalogue énorme de fichiers à tester.
En ce moment je me replonge dans les entrailles du CRTC pour tester les cas extrêmes, utilisés dans les démos justement. Ça m’a déjà permis de corriger plein de petits défauts de timings... C’est justement grâce à une démo exploitant les rasters que je me suis aperçu que j’avais oublié un TWait dans l’instruction OUT...Ce simple oubli suffisait à décaler d’un NOP les timing suite à un appel de OUT et au final les rasters étaient tout décalés...Par contre, l’ajout d’un extra Twait dans l’instruction IN me fait planter certaines démos...très étrange. Je ne sais pas où est la vérité la dedans. Je marche par tâtonnement...
Je suis tombé justement hier sur un forum anglais sur le BBC Micro dans lequel un certain longshot, qui semble être une référence dans le monde des demomakers du CPC, expliquait en détail les spécificités de chacun des modèles de CRTC utilisés dans le CPC... Une vrai mine d’informations qui me font prendre conscience qu’il y a encore du boulot mais c’est sympa. :D
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par hlide »

Lone a écrit : 27 déc. 2020 23:55 Ou encore "Le nécromancien", dont la protection, si je ne confond pas tout, est basé sur l'incrément du registre I correct.
Ca demande une explication car si je connaissais l'incrément de R (bit 7 intouché par l'incrément pour le Z80 originel du CPC) par cycle M1 mais pas celui de I.
Lone
Messages : 16
Inscription : 26 nov. 2020 09:53

Re: [EMULATION AMSTRAD CPC] work in Progress

Message par Lone »

hlide a écrit : 28 déc. 2020 14:48 (...)
Effectivement, c'est R (je ne vois pas ce que I vient faire là d'ailleurs :) )
Répondre