CPC-POWER : CPC-SOFTS - CPCArchives 
Options de Recherche :
 
 
 

ARTICLES

11 / 11

CPCEmuPower

CPCEmuPower créé par Megachur est un programme qui émule le plus précisément possible un ordinateur Amstrad CPC.

Son écriture a été initiée après l'attaque du site http://www.cpc-power.com qui a entrainé l'arrêt de l'utilisation de l'émulateur Web Java CPC de DevilMarkus !
Il a donc été écrit à l'origine en langage javascript/html5 afin de pouvoir être intégré au site http://www.cpc-power.com. Ce choix permet d'avoir une compatibilité sur tous les navigateurs respectant les standards w3c en matière de html5/javascript (Firefox, Chrome, Edge, Safari, etc.) et donc tous les systèmes d'exploitation (Windows, Linux, Android, IOS, etc.).

L'objectif principal a été d'être le plus fidèle au hardware. Les Amstrad CPC sont de solides constitutions électroniques mais il y a un risque prochain de ne plus pouvoir disposer d'un ordinateur fonctionnel !

CPCEmuPower se veut donc un émulateur très précis.

Les documentations hardware des constructeurs de chipset ont été la base du développement. Je suis parti à chaque fois de zéro et j'ai construit progressivement l'émulation de chaque composant hardware. J'avais déjà eu une première expérience de code d'émulateur Amstrad CPC lors de la construction de celui de Mame.
Le fonctionnement interne de certains chipset ont été très peu documentés par leur créateur... En tout du moins, les documentations n'ont pas été publiées au public. C'est le cas du Gate Array d'Amstrad qui malgré l'arrêt de sa commercialisation n'a pas diffusé les documentations hardware.
Une partir de l'émulation a donc été créé à partir de tests empirique afin de comprendre le fonctionnement interne des composants.

La base de l'émulation a été construite en quelques semaines autour du 'coeur' de l'Amstrad CPC : le Gate Array !

Je remercie au passage Grim/Arkos^Semilanceata pour le site http://www.grimware.org qui est plein d'informations hardware sur les composants de l'Amstrad CPC et également, pour la publication de mesure prise sur le hardware de la sortie sonore du composant AY-3-8912 ou des couleurs.
Dommage qu'il ne soit pas encore complet sur tous les composants !
Je remercie également Gérald, OffseT et Lone pour leurs échanges et leurs précieuses aides sur l'émulation précise des composants hardware.

Donc, les 16 appels par microseconds du Gate Array (16Mhz) sont totalement émulés, il en va de même pour les autres composants :

  • Z80 (4Mhz) 4 appels par microsecondes avec chaque micro instruction (T-State) du Z80 émulés et bien sûr les spécificités 'Amstrad CPC' comme l'accès à la mémoire (WAIT) générés par le Gate Array
  • AY-3-8912 (1Mhz) - rendu précis et son précis ! Vous pouvez déjà profiter de cela avec le Player ym sur le site www.cpc-power.com dans l'onglet musique de chaque fiche !
  • CRTC (1Mhz), rendu le plus fidèle pour les crtc0 et 1... Emulation du CRTC 2 mais comme je n'en possède pas je n'ai pu faire l'émulation que depuis le document constructeur...
  • PPI, FDC, RAM, etc...


N'attendez donc pas une performance supérieure aux autres émulateurs qui n'émule pas 'exactement' le hardware du cpc. Même si la performance a été optimisée à son maximum, il n'y a eu aucune concession sur ce point !

L'avantage d'être parti de ce principe est que le niveau de compatibilité est très bonne. Les incompatibilités étant dû à des modèles de composants (CRTC, PPI, etc.) où les différences ne sont pas documentés ou connues à ce stade. Seul des tests sur ces configurations hardware permettrait de comprendre et d'émuler ces particuliarités...

Après quelques mois de code et de test, l'émulateur a prit sa forme actuelle. Ensuite, une longue campagne de test a été effectuée. Notamment, pour l'émulation des CRTCs 0 et 1 et le rendu vidéo avec comparaison systématique du rendu visuel sur le 'vrai' hardware. D'une façon générique, cela permet d'identifier quelques fois des différences les modèles des composants qui différent entre les constructeurs.

Le dernier ajout a été le son grâce aux nouveautés javascript/html5 édités par le W3C concernant la gestion du son en javascript...
Cependant, malgré tous mes efforts de l'époque le son n'est pas correctement et exactement synchronisé avec l'émulation. On l'entend bien mais il est 'haché' régulièrement car les frames par seconds de sont pas respectées alors qu’elles doivent être constantes pour une bonne qualité du son.
Cela est dû à l'implémentation des APIs audio dans le moteur d'exécution javascript dans les navigateurs : même si des améliorations récentes ont été effectuées, en javacript, il est plus courant de jouer un wave, ogg, mp3 que de générer et jouer un son en temps réel !
Seule la partie émulation AY-3-8912 en javascript est déjà intégré au Player ym du site http://www.cpc-power.com.
Après de longs mois de tentative et de frustration à ce sujet, j'ai décidé de porter le code de l'émulateur en C++.

Pour la partie compilation C++ - MinGW | Minimalist GNU for Windows http://www.mingw.org/
Pour la partie graphique et sonore, j'ai utilisé la library SDL2 - Simple DirectMedia Layer - https://www.libsdl.org/
Pour l'atelier de genie logiciel, j'ai utilisé Code::Blocks IDE - http://www.codeblocks.org

En quelques semaines, tous les différents composants d'émulation ont été portés dans ce langage.
Ensuite, l'interface a été revue et optimisée. Toutes les améliorations ont été portées également sur la partie javascript/html5 qui est maintenue à jour en parallèle (exemple : ajout des formats CT-RAW et IPFs pour la partie disquette). Laissant un jour la possibilité de proposer la version javascript/html5 si les soucis de son sont réglés ou si la demande ou les dons utilisateur sont important histoire de nous motiver ;-) !

L'émulateur peut donc être exécuté sur tous les Windows (XP, 7, 8.1, 10) et sur des processeurs Intel Core Duo x86 minimum du fait des options d'optimisation actuellement paramétrés dans G++ pour ce niveau de processeur.

Il peut également être exécuté sur Linux avec Wine. Un portage 'natif' pourrait être envisagé car les composants utilisés pour le développement C++ (SDL2, CodeBlocks et GNU GCC sont disponibles sous Linux).


Personnalisation :
Les images affichées sur les icones du bas de la fenêtre ainsi que les sons du lecteur de disquette sont personnalisables. Il suffit de les remplacer en respectant pour les images les mêmes dimensions.
Par défaut, les images viennent du site http://www.cpc-power.com..
Si vous réaliser de meilleurs images, n'hésitez pas à me les communiquer, je les diffuserai sous forme de theme/skin personnalisé.
Pour les sons du lecteur de disquette, vous pouvez en enregistrer de meilleurs qualités. Tous les fréquence de wave devraient être supportés.
Si vous réaliser de meilleurs sons, n'hésitez pas à me les communiquer, je remplacerai ceux fournis par défaut !

Répertoires par défaut :
.IMG
image des boutons du bas de la fênetre au format bmp - 24 bits
.ROM
roms libres de droits (c) Amstrad + Parados (pour charger des roms différentes, voir l'aide - ligne de commandes)
.WAVE
sons lecteur de disquettes (insert/eject disquette et changement de pistes) - si vous les changer, attention à leur durée la plus courte possible car actuellement, ces sons ne sont pas mixés avec le son de l'émulation AY mais le coupe/remplace une court instant.         


Associer cpcepower par défaut à des fichiers en fonction de leur extension disquettes .dsk,.raw,.ipf + les snapshots .sna. :
il faut créer un fichier CPCEPower.bat et y mettre le contenu suivant :
C:xxxCPCEPower_SDL.exe -c128 -0 %1

ou xxx est le chemin où vous avez mis l'executable. les options suivantes sont mis à titre d'exemple. Elle servent à activer l'émulation en mode cpc 6128 et charger le fichier mis en paramètre par Windows (%1).  

Ensuite faire l'association du fichier avec le .bat ainsi créé. Quand vous double-cliquer sur tous les fichiers avec l'extension souhaité, l'émulateur se lancera avec ce fichier.


Il existe bien sûr encore quelques points d'améliorations (liste non exhaustive) :
CTM: La hsync et la vsync sont partiellement émulés. Il manque la distorsion de l'image pour le hsync (composant LA7800 de SANYO). Cela provoque un affichage décalé sur certaines demos.
SNA: faire en sorte que la sauvegarde du sna est lieu au moment du début de la VBL si besoin ?
CRTC2, CRTC3 et ASIC (CRTC4) - faire l'émulation des CPC+ -> pour cela je dois avoir ces Amstrad, tous les dons sont les bienvenus.
PPI: coder l'émulation des autres modes que le 1, mais aucun programme CPC, hormis ceux créés par Arnold les utilsent...
Autres composants hardwares additionnels (Multiface 2, Magnum Phaser, X-MEM, etc.) : toute aide technique sur les documentations 'hardware' et des dons sont les bienvenus.
Menu: faire des menus dans la fenêtre interne pour le paramétrage interactif et les chargements des fichiers disquettes, k7, etc.
Finaliser la gestion et les différents claviers virtuels : très utile pour la saisie de multiples caractères simultanés ou en mode tablette.

 

Vous souhaitez envoyer vos commentaires, suggestions d'améliorations, bugs rencontrés, aide ou dons de matériel Amstrad, vous pouvez utiliser le formulaire de cpc-power : me contacter

 

Vous souhaitez nous aider ou nous supporter en faisant un don concernant l'émulateur CPCEmuPower  :

 

Article rédigé par : Megachur

 

Article créé le : Dimanche 17 Septembre 2017 à 16 h 24
Dernière mise à jour le : Dimanche 01 Octobre 2017 à 14 h 08
 
 

CPC-POWER/CPCArchives, projet maintenu par Fredouille.
Programmation par Kukulcan © 2007-2024 tous droits réservés.
Reproduction sans autorisation interdite. Tous les titres utilisées appartiennent à leurs propriétaires respectifs.