Quelques news du projet après un petit mois d'absence...
Le développement de l'émulateur avance à bon rythme et j'ai finalement passé le plus gros de mon temps à réécrire la partie concernant l'émulation du FDC (floppy Disk Controller). A l'origine, le module avait été développé un peu à la va-vite essentiellement dans un but fonctionnel, à savoir pouvoir lire les fichiers .DSK pour parfaire l'émulation des autres composants (dont le fameux CRTC).
Pour les DSK "classiques", simple face et non protégés, ça passait mais je me suis vite aperçu que le module pêchait lors de la lecture des démos écrites sous des formats plus atypiques (en double face, avec des identifiants de piste ne correspondant pas à la piste physiquement lues : Batman forever par exemple)
Un autre problème est apparu sur certaines démos récentes dans lesquelles les accès disques se font sous interruption afin notamment de jouer de la musique en même temps (Démos Phortem, Phx..). Je me suis aperçu que la gestion des timings et des codes erreurs du FDC devenait alors super importante.
En temps normal, les interruptions sont désactivées durant les accès au disque et c'est logique car sur CPC le FDC ne fonctionne pas en mode DMA et envoie un octet toutes les 26 µs environ (d'après la document officielle mais j'ai vu le chiffre de 32 µs.. bon, en réalité c'est un peu entre les deux, j'ai mis plutôt le timing à 30 µs et ça fonctionne plutôt bien) et le processeur doit absolument lire la donnée dans cet intervalle de temps sous peine d'avoir un code erreur "OverRun" généré par le FDC (ça bouchonne
, un nouvel octet est disponible alors que le précédemment n'a pas encore été lu). Les boucles de lecture du FDC dans les programmes sont donc très optimisées.
Dans ces démos fonctionnant sous interruption pour jouer une musique sans ralentissement ou saccade, il est donc tout à fait normal qu'il y ait de temps en temps des erreurs "OverRun" lors des accès disques et notamment lorsque d'une interruption intervient,toutes les 52 lignes HBL, à certains moments non désirés. Ces démos savent reconnaitre ce cas et refont une tentative de lecture jusqu'à ce que ça passe. Il faut donc bien gérer les codes erreurs à travers les 4 registres dédiés du FDC.
De plus, il y a des timing précis à respecter lors d'un changement de lecture de piste (instructions SEEK, RECALIBRATE) et certaines démos génèrent des erreurs si les accès sont trop rapides..ou trop lents...Bref, une petite réécriture plus rigoureuse du module d'émulation du FDC s'imposait pour pouvoir gérer correctement toutes ces situations.
J'ai donc opté pour la création en mémoire d'une "image disk" à partir du fichier DSK, en insérant les différents octets de contrôles comme indiqué dans la documentation (octets GAP, synchro, Index, datas ...) et en partant du principe que je transmets un octet toutes les 30 µs et pour une lecture complète de la piste en 200 ms (un disque réel tourne à 300 tours/min soit 5 tours/sec).
Après de nombreux tâtonnements dus notamment à la bonne gestion des codes erreurs, j'arrive enfin à découvrir de très belles démos assez spectaculaires visuellement. A ce stade l'émulation reste partielle puisque je n'ai implémenté que 6-7 commandes sur les 15 disponibles du FDC (il manque notamment les commandes d'écriture...) mais c'est suffisant pour faire tourner un peu plus de nouvelles démos récentes. Et j'ai surtout l'impression que le socle technique de l'émulation du FDC est désormais plus robuste.
En complément, j'en ai profité pour affiner l'émulation du CRTC version "1" qui présentait quelques imperfections et que j'ai pu améliorer grâce à ces nouvelles démos.
Comme toujours quelques illustrations de l'avancement de l'émulateur en images :
La démo "Phortem" qui, si elle n'est pas la plus impressionnante techniquement, a une "histoire" bien à elle avec une musique jouant sans discontinuer tout du long de la démo. Une belle découverte. J'adore perso.
Autre plan de Phortem.
Phx.. Autre démo pêchue, très rythmé, très technique avec une musique en continue également.
Image symbole de Phx.. On la voit beaucoup...
La démo mythique de Batman Forever, très longue, très technique aussi avec des très beaux effets visuels (en CRTC 1 ...elle se mérite)
Toujours Batman, superbe image..Les graphistes sur CPC m'impressionnent toujours autant.
Une des dernières images de la démo mais vous remarquerez qu'elle n'est pas rendue top top...Au début je croyait que ça venait d'un bug de rendu de l'émulateur .. et bien non. En regardant le code, je me suis aperçu que cette image est rendue en modifiant ce fameux registre R2 à chaque saut de ligne (ce registre est utilisé pour créer des effets de vague sur moniteur CRT si vous vous souvenez d'un post précédent). Je ne sais pas pourquoi l'auteur a fait cela (peut être pour avoir une image plus nette en CRT) mais autant dire que via mon émulateur, le rendu est plutôt dégueulasse avec un décalage de 2 octets une ligne sur 2...mais c'est un rendu correct sur du LCD...Il va peut être falloir que j'émule ce phénomène finalement même si je ne suis pas fana de la chose (comme le rendu scanline mais c'est une autre histoire).
Enfin autre démo très technique, logon's Run, avec une multitude de plans en animation dans la même image, dont du 3D. Superbe à voir en mouvement. Le progrès des démomakers est vraiment impressionnant sur CPC quand je compare leurs dernières réalisations avec celles produites dans les années 90. Plus rythmées, plus maitrisées techniquement, les dernières démos produites sur CPC depuis 2010 sont vraiment bluffantes.
Au final, 95% des démos que j'ai testé tournent désormais correctement et je pense désormais (et vraiment) faire une pause dans le développement de l'émulateur pour m'attaquer à la partie finition et interface de l'émulateur pour le mettre à votre disposition. Je le mettrai en téléchargement d'ici fin aout je pense. Encore un peu de patience...