Mise en place de DRZ80
DRZ80, comment l'intégrer dans son émulation z80 ?
Attention, tutoriel réservé aux personnes connaissant l'arm, l'émulation z80 et le fonctionnement de drz80, bref, c'est pas pour tout le monde, vous êtes prévenus
!
Aussi, un grand merci à Reesy de nous avoir donner un tel émulateur de Z80, il est superbe ! Vous pouvez consulter la page des émulateurs de ce dernier ici.
Tout d'abord, récupérer la version disponible en bas de cette page, qui fonctionne bien avec mon émulateur DSMasterPlus.
Ensuite, tout le pb vient du fait que drZ80, pour l'adressage des registres PC et SP au moins, ne supporte pas de ne pas adresser toute la mémoire disponible du z80 directement, de 0 à FFFFh.
Il faut donc lui faire croire, lorsque l'on a des mappers sur la mémoire, que ses derniers sont "contigues" par rapport à la mémoire normale de gestion du Z80 par le PC.
Le fichier d'interfaçage de drz80
Ce dernier étant réalisé en assembleur, nous devont réaliser un fichier "wrapper" d'interfaçage pour les fonctions les plus communes de drz80.
L'exécution du z80
Celle ci est très simple et se borne à exécuter un certain nombre de cycles d'horloges au processeur, je garde aussi le nombre de cycles depuis le début, pour des besoins de synchros des HBL / VBL si besoin est.

L'init / reset du z80
Ces 2 fonctions sont aussi assez simple et se bornent à préparer l'exécution de drz80. Attention à bien appeler l'init AVANT le reset, ce dernier initialisant les registres PC et SP.

Le truc où il ne faut pas se faire avoir est que les fonctions de lecture de la mémoire prennent DANS L'ORDRE : la donnée et ENSUITE l'adresse mémoire et non le contraire comme dans beaucoup d'autes émulateurs.
Un chose importante aussi à retenir, est que nous allons laisser drz80 gérer lui même les interruptions.
Dans beaucoup de releases de ce dernier pour MameGP2x, la gestions des interruptions est "poolée" via une "daizy chain", permettant de gérer plusieurs interruptions, nous n'en avons pas besoin.
D'où la gestion suivante, dans le haut du fichier drz80 à avoir :

Les fonctions de rebase
C'est là le plus compliqué dans notre mise en place. En fait, l'émulateur attend que nous lui disoins comment utiliser trouver l'emplacement de base de notre PC et SP pour l'émulation.

Dans notre cas, l'emplacement de base est le mapper concerné, on ne touche pas à l'adresse, même si cela peut impliquer un dépassement de la taille de notre mapper.
Dans mon cas, j'ai 8 mappers, donc adressablent de 0..7, d'où le adresse>>13.
le mapper[0] prendra donc l'adressage de 0 à 1FFFh, le 1 de 2000h à 3FFFh, etc ...
Et oui, je sais, si on ajoute l'adressage du mapper à l'adresse passée, notre PC ou SP s'envole vers les cieux car ils dépassent la taille de notre mapper, mais ce n'est pas grave 
Enfin, nous avons les fonctions de base de lecture et écriture en 16 bits, là, rien d'extraordinaire

Aussi, comme la gestion de la reinit des interruptions est géré dans notre code, le callback de ce dernier pour drz80 ne fait rien ...

Passons maintenant à notre code proprement dit pour notre émulateur
Les fcts de lecture et d'écriture mémoire
Sans rentrer dans les détails, elle fonctionne comme le rebasePC / SP, elle prend donc le bon mapper et comme pour le rebase, ajoute l'adresse mémoire.


L'initialisation de nos mappers
C'est là que toute l'astuce réside, comme drz80 ne supporte pas un adressage qui va "à droite à gauche" de nos adresse, on va lui faire croire que nos mappers possèdent un adressage contigue.
Ainsi, mes 8 mappers pour DSMasterPlus sont déclarés de la façon suivante :

Le mapper 0 ne possédant pas de décalage (car adressant de 0 à 1FFFh), il n'y a rien de différent.
A partir du mapper 1, on enlève donc la valeur de la taille d'un mapper multiplié par le numéro du mapper
Ainsi, pour ce dernier, si le Z80 demande l'adresse 3E25h, on aura le mapper 1 car 3E25>>13 = 1
Et mapper[1] + 3E25h - 2000h = 1E25h, donc on adresse la bonne case mémoire de ce dernier !
Et ainsi de suite pour les autres mappers :) c'est tout bête mais cela fonctionne sans pb.
Bien entendu, à chaque changement d'adressage des mappers, il faut appliquer de nouveau cette soustraction pour toujours bien adresser.
Ainsi, pour DSMaster Plus, les mappers peuvent être changer, pour vous donner un exemple, voici un "bout de code" de cette réassignation .

DRZ80 version de DrSMS (154 fois) | 21 Feb 2007 | size: 27 kB |





