CC51B - Arquitectura de Computadores : Tarea #4
El ZX Spectrum 48K
por Denis Fuenzalida

( Introducción / Lenguaje de Máquina / Interrupciones / Memoria / Canales / Punto Flotante )


Instrucciones de máquina del chip Z80

Las instrucciones de máquina de un Z80 son, en su mayoria, de 1 byte de largo, sin considerar posibles operandos, de 1 o 2 bytes. Los códigos (en hexadecimal) CB, DD, ED y FD nos son instrucciones propiamente tales, sino que son prefijos de otros sets de instrucciones, que se revisan a continuación.

Puede consultarse la tabla de ASCII extendido del Spectrum para una lista de los nemónicos más comunes.

Prefijo CB

Hay 248 instrucciones con prefijo CB. Un bloque de instrucciones de máquina, entre CB 30 y CB 37 no aparecen en la lista del manual del Spectrum. Este conjunto de operaciones son principalmente del tipo SLL, Shift Left Logical, y siempre encienden el flag ZERO.

Prefijo ED

Hay bastantes instrucciones NO oficiales en este grupo. En el bloque entre ED 00 y ED 3F, y entre ED 80 y ED FF no son realmente muy útiles (salvo por instrucciones de bloques) y simplemente toman varios ciclos e incrementan el registro R en 2. La mayoría de los códigos que se muestran en el rango ED 40 - ED 7F tienen algún efecto, la lista completa es: ( las instrucciones marcadas con * son NO oficiales, i.e. no aparecen en la documentación de Zilog, los fabricantes del Z80).

        ED40   IN B,(C)                 ED60   IN H,(C)
        ED41   OUT (C),B                ED61   OUT (C),H
        ED42   SBC HL,BC                ED62   SBC HL,HL
        ED43   LD (nn),BC               ED63   LD (nn),HL
        ED44   NEG                      ED64 * NEG
        ED45   RETN                     ED65 * RETN
        ED46   IM 0                     ED66 * IM 0
        ED47   LD I,A                   ED67   RRD
        ED48   IN C,(C)                 ED68   IN L,(C)
        ED49   OUT (C),C                ED69   OUT (C),L
        ED4A   ADC HL,BC                ED6A   ADC HL,HL
        ED4B   LD BC,(nn)               ED6B   LD HL,(nn)
        ED4C * NEG                      ED6C * NEG
        ED4D   RETI                     ED6D * RETN
        ED4E * IM 0/1                   ED6E * IM 0/1
        ED4F   LD R,A                   ED6F   RLD
        ED50   IN D,(C)                 ED70   IN (C)
        ED51   OUT (C),D                ED71 * OUT (C),0
        ED52   SBC HL,DE                ED72   SBC HL,SP
        ED53   LD (nn),DE               ED73   LD (nn),SP
        ED54 * NEG                      ED74 * NEG
        ED55 * RETN                     ED75 * RETN
        ED56   IM 1                     ED76 * IM 1
        ED57   LD A,I                   ED77 * NOP
        ED58   IN E,(C)                 ED78   IN A,(C)
        ED59   OUT (C),E                ED79   OUT (C),A
        ED5A   ADC HL,DE                ED7A   ADC HL,SP
        ED5B   LD DE,(nn)               ED7B   LD SP,(nn)
        ED5C * NEG                      ED7C * NEG
        ED5D * RETN                     ED7D * RETN
        ED5E   IM 2                     ED7E * IM 2
        ED5F   LD A,R                   ED7F * NOP

Los prefijos DD y FD

Los prefijos DD y FD preceden las instrucciones que usan los registros índice IX e IY. Si se mira como funcionan cuidadosamente, puede verse la forma en que operan:

    Hex        Assembler

    2A nn      LD HL,(nn)
    DD 2A nn   LD IX,(nn)
    7E         LD A,(HL)
    DD 7E d    LD A,(IX+d)

Un prefijo DD simplemente cambia el significado de HL en la siguiente instrucción. Si un byte de la memoria está direccionado indirectamente vía HL, como en la 2da parte del ejemplo, entonces se le agrega un byte de desplazamiento. Si ocurre lo contrario, entonces la instrucción actúa en IX en vez de HL.

También es posible tener instrucciones doblemente desplazadas: DD CB y FD CB (Si DD o FD precede a una instrucción ED, el DD o FD se ignora, lo que implica que estas instrucciones nunca operan con IX o IY). Con las instrucciones CB, la situación es más interesante. Cada instrucción DD CB opera sobre [IX+nn], pero también copia el resultado del registro usado por le instrucción original, excepto cuando este es (HL). Por ejemplo:

        CB CE           SET 0,(HL)
        CB C0           SET 0,B
        DD CB nn CE     SET 0,(IX+nn)
        DD CB nn C0     SET 0,(IX+nn) ; Copio el resultado al registro B

No hay una forma estándar de denotar estas instrucciones doblemente desplazadas. También vale la pena notar que el byte de offset es el tercero, bajo toda circunstancia: Para las instrucciones con 1 sólo desplazamiento, el byte de offset está después del byte de la operación (e.g. DD 2A nn es LD HL,(nn)), mientras que para las instrucciones con doble desplazamiento, el byte de offset está ANTES del byte de la operación.