★ CODING ★ ANTOINE ★ ASSEMBLEUR Z80 - Les codes spéciaux ★ |
Z80: Les Codes Speciaux (1/2) | Coding Antoine |
Eh oui ! Après vous avoir fait ch.. en vous bassinant sur les codes non-valides du Z80 et en vous refilant une routine dont vous ne saviez que faire et qui de plus etait buggeé, je vais enfin TOUT vous dire sur ces fameux codes. Tout d'abord il faut que je réponde à une question que vous vous posez surement: Ma qu'est-ce que ça sont que ces codes spéciaux (combien de fois vais-je répéter ce mot ?!) ? Et bien ce sont des codes qui ne sont pas mentionnés dans les livres classiques tels "l'initiation à l'assembleur" ou "le langage machine de l'Amstrad", et qui normalement sont inconnus de la plupart des programmeurs. Notez qu'à la fin du bouquin "la Bible du CPC 6128", les auteurs parlent d'"instructions spéciales du type &CB (IX+d)" ; en vérité ce que leur désassembleur ne digère pas, ce sont des codes tout à fait normaux comme SRL (IY+4) - par exemple - rien à voir donc avec ce dont je vais vous parler.Pour étudier ces codes, il faut un programme de test qui est normalement sur une des deux faces du disk... Quand vous l'exécutez il vous demande tout d'abord les valeurs à mettre dans les registres avant l'instruction à étudier, puis il vous demande le code hexa à étudier (16 octets maxi); cela peut etre un appel à une routine, si c'est une routine système il faudra prendre les valeurs système des registres alternatifs, sinon cette option n'est pas indispensable... Voilà pour le prog. de test. Mais j'en vois qui perdent leur patience et c'est tout à fait normal...donc les codes spéciaux se divisent en fait en 2 catégories: C'est bien sur la deuxième catégorie qui est la plus intéressante, mais nous allons aussi voir la première. Mais plutot que de traiter ces deux parties indépendamment l'une de l'autre, je préfère séparer les différents thèmes: codes en &CB, codes en &ED, index 8 bits, et enfin index en &CB avec post-transfert... allez c'est parti !!! CODES EN &CB: Si vous avez une table des codes Z80, vous aurez remarqué qu'il y a une ligne vacante "en-dessous" de SLA, c'est-à-dire de CB 30 à CB 37. En effet ces codes correspondent en fait à une instruction nommée SLI. Elle fait la meme chose que SLA à une différence près: au lieu de décaler un 0 dans le bit de poids faible, elle y décale un 1... CB 30 CB 31 CB 32 CB 33 CB 34 CB 35 CB 36 CB 37CODES EN &ED: Rien de compliqué à comprendre ici non plus... Par contre c'est beaucoup plus bordélique (et je reste poli...) ! C'est pourquoi je vais dès maintenant vous refiler une table et les explications viendront après : |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
4 | IN B, (C) | OUT (C),B | SBC HL,BC | LD (ADR),BC | NEG | RETN | IM 0 | LD I,A |
5 | IN D, (C) | OUT (C),D | SBC HL,DE | LD (ADR),DE | *NEG | *RETN | IM 1 | LD A,I |
6 | IN H, (C) | OUT (C),H | SBC HL,HL | LD (ADR),HL | *NEG | *RETN | *RESET | RRD |
7 | *NOP | *NOP | SBC HL,SP | LD (ADR),SP* | NEG | *RETN | *NOP | *NOP |
8 | 9 | A | B | C | D | E | F | |
4 | IN C, (C) | OUT (C),C | ADC HL,BC | LD BC,(ADR) | *NEG | RETI | *RESET | LD R,A |
5 | IN E, (C) | OUT (C),E | ADC HL,DE | LD DE,(ADR) | *NEG | *RETI | IM 2 | LD A,R |
6 | IN L, (C) | OUT (C),L | ADC HL,HL | LD HL,(ADR) | *NEG | *RESET | *RESET | RLD |
7 | IN A, (C) | OUT (C),A | ADC HL,SP | LD SP,(ADR) | *NEG | *RESET | *RESET | *NOP |
Vous aurez remarqué qu'en abscisse est porté le quartet faible et en ordonnée le quartet fort de l'instruction...ainsi l'instruction ADC HL,SP a pour code ED 7A... Les instructions précédées d'un astérisque sont les nouveaux codes. Ils correspondent tous à des instructions déjà existantes, sauf une que l'on va donc approfondir: l'instruction RESET.
Comme son nom l'indique elle effectue un reset du Z80. Mais me direz-vous cela correspond alors à RST 0 ? Non car cette dernière effectue simplement un saut à l'adresse &0000 comme un CALL 0. Tandis que RESET fait une sorte de reset hard de notre bon vieux Z80, c'est-à-dire que le PC passe à 0, que les interruptions sont inhibées, que le mode d'interruption IM 0 est activé et que l'exécution du programme reprend en &0000... Par contre le contenu des autres registres est conservé...
Pour mettre tout ceci en évidence voici une petite routine :
INDEX 8 BITS: C'est la partie la plus connue de ces codes spéciaux... Il s'agit de codes permettant aux registres IX et IY, de pouvoir etre manipulés par 8 bits...c'est-à-dire d'adresser indépendamment l'octet faible et l'octet fort...Pour cela, je ne vais pas vous mettre de tables mais plutot essayer d'éclaircir la logique de décodage des codes par le Z80. En effet, lorsque le Z80 rencontre une instruction portant au départ sur HL, et que celle-ci est précédée de DD ou FD, il remplace HL par IX ou IY; idem pour (HL) qui devient respectivement (IX+d) ou (IY+d), tout ceci à l'exception des codes en &ED et de EX DE,HL, mais vous devriez normalement déjà le savoir...
Maintenant, si l'instruction en question ne porte ni sur HL, ni sur (HL), le Z80 fait de meme avec H et L...ce qui permet de manipuler les 2 octets des regs. d'index indépendamment l'un de l'autre. En effet si l'instruction porte sur H ou L, c'est-à-dire en fait sur l'octet high ou low du reg. double HL, il le remplace par l'octet correspondant du reg. d'index sélectionné. Par exemple:
le code 4C correspond à LD C,H ... donc le code FD 4C fait de meme, mais en remplaçant H par l'octet High de IY.
Les conventions d'écriture sont :
Maintenant que nous avons vu les instructions qui acceptent l'adressage index 8 bits, que deviennent les autres codes précédés d'un code d'index DD ou FD ?? Et bien ils se divisent en 3 groupes:
INDEX EN &CB AVEC POST-TRANSFERT INDEXE: et c'est là que ça commence à devenir compliqué... Rien que le nom déjà a un je-ne-sais-quoi d'effrayant !! Allez je le répète pour vous achever complètement: codes spéciaux d'index en &CB avec post-transfert indexé... Remarquez que ce nom horrible, c'est moi qui l'ai inventé, alors...
Et puis tiens pour commencer on va le décortiquer un peu ce nom, pour savoir à quoi on a affaire...voyons voyons... Déjà on voit les mots 'index en &CB' et 'transfert indexé'. Ce sont donc des instructions de la forme: FD/DD CB dis cod . Où 'dis' est la distance de l'adressage indexé (8 bits signés...) et 'cod' le code d'opération. Oui bon d'accord mais pour l'instant ça nous avance pas à grand-chose.
Pour comprendre parfaitement ce dont il s'agit, il faut encore une fois expliquer le décodage par le Z80... Quand le Z80 rencontre un code en &CB précédé d'un code d'index: codXY_CB_dis_code , il effectue l'instruction correspondante en adressage indexé, c'est-à-dire sur (XY+dis). Mais ensuite, comme l'indique l'expression "post-transfert indexé", il charge le résultat de l'opération dans le registre normalement concerné s'il n'y avait pas eu de code d'index...
Par exemple le code FD CB 08 13 correspond à RL (IY+8) suivi de LD E,(IY+8). En effet CB 13 est le code de RL E et FD 08 fait pointer sur l'adresse (IY+8). Cette instruction sera notée par convention RL (IY+8)/E. Cette notation fait à mon avis bien apparaitre l'adressage indexé et la notion de post-transfert, c'est pourquoi je l'ai choisie.
A noter que l'instruction SLI vue plus haut permet aussi l'adressage indexé avec post-transfert. Par contre, l'instruction BIT n'effectue JAMAIS de post-transfert, les codes spéciaux correspondront en fait à un adressage indexé normal, du type BIT (IX+d) ou BIT (IY+d).
Et vi c'est enfin fini !! Hein ? Quoi ??!? Vous voulez savoir de quelle couleur sont les rasters de la Zebig Megademo ?? Incroyable...Y'en a qui suivent l'article depuis le début et qui n'ont pas encore compris de quoi ça parlait...vraiment lamentable !! Bon pour quand meme finir sur quelque chose de sérieux, je dirai que le débat sur les instructions spéciales n'est pas clos, et qu'il tout à fait possible de le reprendre une prochaine fois, notamment si vous n'avez pas tout compris, et si vous me le dites, paske je peux pas savoir si vous me le signalez pas, je m'appelle pas 36 15 Madame Irma...
Sinon, vous devriez normalement avoir droit, le mois prochain, à un petit cours assembleur sur les instructions dont on parle moins: DAA, RLD et RRD, etc... D'ailleurs vous pouvez parfaitement allonger cette liste, vous n'avez qu'à m'écrire... Ah bien sur, ce ne sera pas aussi long que ce mois-ci, mais là c'était parce que j'avais pris du retard... Allez mijotez-bien sur toutes ces nouvelles instructions et n'oubliez pas de vous aider du prog. de test que je vous ai mis sur le disk...ça vous aidera à comprendre comment elles fonctionnent...
Lire le correctif de MM&PF numéro°7
|
|