[TZZ80] Emulation de la partie CPU du Z280

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

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

[TZZ80] Emulation de la partie CPU du Z280

Message par hlide »

Je commence à réfléchir sur la manière d'intégrer le jeu d'instruction du Z280 dans l'émulateur TZZ80. Le Z280 est un MCU mais je ne veux m'intéresser qu'à la partie CPU du Z280 et plus particulièrement dans le mode Z80 de son bus (seulement 8 bits de données au lieu des 16 bits).

Le jeu d'instructions du Z280 est une extension du jeu d'instructions Z80 ; les améliorations comprennent la prise en charge de modes d'adressage supplémentaires pour les instructions Z80 ainsi que l'ajout de nouvelles instructions. Le jeu d'instructions de l'unité centrale Z280 fournit un complément complet d'opérations arithmétiques sur 8 et 16 bits, y compris la multiplication et la division signées et non signées. Des instructions de calcul supplémentaires sur 8 bits prennent en charge les opérations logiques et décimales. Les instructions de manipulation de bits, de rotation et d'insertion complètent les capacités de manipulation de données de l'unité centrale Z280. Les instructions Jump, Call et Return ont des versions conditionnelles et inconditionnelles ; l'adressage relatif est fourni pour les instructions Jump et Call afin de prendre en charge les programmes indépendants de la position.

L'objectif est d'avoir une sorte de ZZ80 (Z280 en mode Z80) qui soit entièrement 100% compatible avec du Z80 pour que n'importe quelle machine à base de Z80 puisse faire fonctionner ses programmes originaux.

Le Z280 reprend une grande partie de la compatibilité du Z80 qui avait été abandonné dans le Z180 (et le Z380) donc ça facilite pas mal le travail de ce côte-ci.

Il reste quelques différences :
- Il n'est pas clairement établi si une instruction de la table principale préfixé avec DD ou FD et n'ayant pas une opération particulière se comporte de la même manière qu'en Z80 : exécution de la même instruction sans le préfixe mais avec 4 cycles supplémentaires. Je présume que oui, car je ne vois pas d'exception sur une instruction inconnue (elles ne semblent exister que pour les instructions étendues EPU ou privilégiés que j'exclue du TZZ80).
- L'instruction SL1 (SLA mais en décalage logique avec insertion de 1 en LSB) n'est plus et est remplacé par TSET (test and set). Pour l'heure, je laisse SL1.
- Les instructions du style LD r, rot (IX/IY+d) ou LD r, SET/RESET n, (IX/IY+d) ne sont pas implémentées en Z280. Je les laisse implémentées à la Z80. Je ne crois pas avoir vu une implémentation différente pour le Z280 à la place.

De ce que j'ai vu, les implémentations des nouveautés se font avec DDxx, FDxx, DDEDxx et FDEDxx. Les deux dernières n'existant pas avec le Z80. Je suis en train de faire un fichier CSV (;) qui me permettra de mieux décoder chaque instruction et faire apparaître un motif X,Y,Z car la documentation du MPU ne donne pas facilement le décodage à faire. Pas mal de boulot...
Notator
Messages : 1300
Inscription : 09 août 2015 20:13

Re: [TZZ80] Emulation de la partie CPU du Z280

Message par Notator »

L'objectif est d'avoir une sorte de ZZ80 (Z280 en mode Z80) qui soit entièrement 100% compatible avec du Z80 pour que n'importe quelle machine à base de Z80 puisse faire fonctionner ses programmes originaux.
Et ???
Je suppose que, vu le gros travail d'adaptation que ça semble demander, l'objectif n'est pas juste d'obtenir la même chose qu'un Z80, mais d'avoir un gain en plus (plus rapide, plus de champ mémoire, plus de ?...) ?
Notator est le nom d'un programme séquenceur Midi et notation musicale pour Atari ST(e) (puis Mac).
Avatar de l’utilisateur
hlide
Messages : 3507
Inscription : 29 nov. 2017 10:23

Re: [TZZ80] Emulation de la partie CPU du Z280

Message par hlide »

Ce fil ne concerne que l'ajout d'une partie des instructions du Z280, pas les différentes stratégies d'optimisations d'accélération qui seront également applicables. Je suis en train de faire l'inventaire.

Mode d'adressage "m" :
- (HL)
- (IX+55h)
- (IY+55h)
- (3344h)
- (HL+1122h) *
- (IX+1122h) *
- (IY+1122h) *
- (HL+IX) *
- (HL+IY) *
- (IX+IY) *
- (SP+1122h) * ; Gestion de variables locales !
- (PC+1122h) * ; Code et variables statiques relogeables !

m est applicable sur LD, INC, DEC, ADD, SUB.
LDA : équivalent LEA des 8086.
INCW /DECW/LDW/NEG HL : opérations 16-bit.
ADD HL,A : addition avec extension de signe
EXTS A/HL : extension du signe
EX A,r/m : échange entre registre ou mémoire

Etc.
__sam__
Messages : 7988
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [TZZ80] Emulation de la partie CPU du Z280

Message par __sam__ »

Un truc m'intrique les 55h, 1122h ce sont des valeurs génériques 8 ou 16 bits (xxh et yyyyh) et pas spécifiquement ces seules valeurs là je suppose (55h et 1122h).
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Avatar de l’utilisateur
hlide
Messages : 3507
Inscription : 29 nov. 2017 10:23

Re: [TZZ80] Emulation de la partie CPU du Z280

Message par hlide »

Euh oui, ça permet de distinguer la nature de l'octet ou le mot qui est présent dans l'instruction. Le 1122h désigne un offset 16-bit, le 3344h une adresse directe 16-bit, le 55h un offset 8-bit après les registres IX/IY, le 66h un octet de donnée, le 77h un déplacement relatif 8-bit de saut, le 8899h un mot 16-bit de donnée :

LDW (3344h),8899h ; stock un mot 16-bit constant à l'adresse absolue.
PUSH (3344h) ; devrait push-er le contenu à l'adresse 3344h
PUSH <1122h> ou PUSH (PC+1122H) ; devrait push-er le contenu à l'adresse PC+1122h
JP <1122h> ou JP (PC+1122h) ; saut relatif 16-bit

Un bon point, c'est que la valeur en octet des ces octets/mots est une indication de leur place dans l'instruction. Ainsi, on comprends aisément que 3344h doit être extrait avant la constante 8899h à la suite de l'opcode lors de l'exécution.

Les cycles sont beaucoup plus courts mais il faut garder en tête que l'opcode fetch et l'exécution sont en parallèle et peuvent faire varier les cycles à cause des caches. De fait, je ne vais pas chercher à répliquer le timing exact car il y a trop de variables et ce ne serait pas un gain à le faire.
Avatar de l’utilisateur
hlide
Messages : 3507
Inscription : 29 nov. 2017 10:23

Re: [TZZ80] Emulation de la partie CPU du Z280

Message par hlide »

Bon je viens de "terminer" mon fichier CSV (;) que j'ai converti en table ascii ici. C'est un premier jet qu'il faudra que je confronte avec la liste alphabétique des instructions de la doc (faire un script qui reproduit cette liste à partir du CSV et comparer et corriger le CSV). Les instructions suivies d'un * sont des instructions introduites avec l'architecture Z800, celles suivies de ** sont celles que je compte pas implémenter (coprocesseur, protection et espace system-user, etc.).
tZZ80.Z280.ascii.txt
(107.12 Kio) Téléchargé 27 fois
EDIT: fichier remis à jour avec des corrections.
Répondre