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.