cursos:ensamblador:lenguaje_5

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
cursos:ensamblador:lenguaje_5 [10-12-2010 13:23] – [De la teoria a la practica] sromerocursos:ensamblador:lenguaje_5 [24-01-2024 11:55] (actual) – [Enlaces] sromero
Línea 1: Línea 1:
- 
 ====== Lenguaje Ensamblador del Z80 (V) ====== ====== Lenguaje Ensamblador del Z80 (V) ======
  
Línea 5: Línea 4:
 ===== Puertos de E/S y Tabla de Opcodes ===== ===== Puertos de E/S y Tabla de Opcodes =====
  
 + En este capítulo se introducirán las instrucciones ''IN'' y ''OUT'' para la exploración de los puertos del microprocesador, mostrando cómo el acceso a dichos puertos nos permitirá la gestión de los diferentes dispositivos conectados al microprocesador (teclado, altavoz, controladora de disco, etc...).
  
- En este capítulo se introducirán las instrucciones **IN** y **OUT** para la exploración + Finalmente, para acabar con la descripción del juego de instrucciones del Z80 veremos algunos ejemplos de //opcodes no documentados//, y una //tabla-resumen// con la mayoría de instrucciones, así como sus tiempos de ejecución y tamaños.
-de los puertos del microprocesador, mostrando cómo el acceso a dichos puertos nos +
-permitirá la gestión de los diferentes dispositivos conectados al microprocesador +
-(teclado, altavoz, controladora de disco, etc...). +
- +
- Finalmente, para acabar con la descripción del juego de instrucciones del Z80 +
-veremos algunos ejemplos de //opcodes no documentados//, y una //tabla-resumen// con +
-la mayoría de instrucciones, así como sus tiempos de ejecución y tamaños.+
  
 \\  \\ 
 ===== Los puertos E/S ===== ===== Los puertos E/S =====
  
- Como ya vimos en su momento, el microprocesador Z80 se conecta + Como ya vimos en su momento, el microprocesador Z80 se conecta mediante los puertos de entrada/salida de la CPU a los periféricos externos (teclado, cassette y altavoz de audio), pudiendo leer el estado de los mismos (leer del teclado, leer del cassette) y escribir en ellos (escribir en el altavoz para reproducir sonido, escribir en el cassette) por medio de estas conexiones conocidas como "//I/O Ports//".
-mediante los puertos de entrada/salida de la CPU a los periféricos +
-externos (teclado, cassette y altavoz de audio), pudiendo leer el +
-estado de los mismos (leer del teclado, leer del cassette) y escribir +
-en ellos (escribir en el altavoz para reproducir sonido, escribir en +
-el cassette) por medio de estas conexiones conocidas como "//I/O Ports//".+
  
 +\\ 
 {{ cursos:ensamblador:esquema_zx.gif |Esquema del hardware de un ZX Spectrum}} {{ cursos:ensamblador:esquema_zx.gif |Esquema del hardware de un ZX Spectrum}}
 +\\ 
  
-Aunque para nosotros el teclado o el altavoz puedan ser parte del +Aunque para nosotros el teclado o el altavoz puedan ser parte del ordenador, para el Z80, el microprocesador en sí mismo, son tan externos a él como el monitor o el joystick. Nuestro microprocesador accede a todos estos elementos externos mediante una serie de patillas (buses de datos y direcciones) que son conectadas eléctricamente a todos los elementos externos con los que queremos que interactúe. La memoria, el teclado, el altavoz, o los mismos pines del bus trasero del Spectrum, se conectan al Z80 y éste nos permite su acceso a través de dichas líneas, o de los puertos de entrada/salida (I/O).
-ordenador, para el Z80, el microprocesador en sí mismo, son tan +
-externos a él como el monitor o el joystick. Nuestro microprocesador +
-accede a todos estos elementos externos mediante una serie de patillas +
-(buses de datos y direcciones) que son conectadas eléctricamente a +
-todos los elementos externos con los que queremos que interactúe. La +
-memoria, el teclado, el altavoz, o los mismos pines del bus trasero +
-del Spectrum, se conectan al Z80 y éste nos permite su acceso a través +
-de dichas líneas, o de los puertos de entrada/salida (I/O).+
  
 +Otros sistemas utilizan lo que se conoce como //Memory-Mapped I/O//, que significa que los puertos de I/O están directamente conectado a posiciones de memoria concretas, y que leyendo o escribiendo en ellas se puede acceder a los dispositivos que las tienen mapeadas. 
 +
 +En el caso del Spectrum no es así, los puertos no están mapeados sobre ninguna dirección de la RAM sino que debemos leerlos y escribir en ellos manualmente con las instrucciones ''IN'' y ''OUT''.
  
 \\  \\ 
 ===== IN y OUT ===== ===== IN y OUT =====
  
- Ya conocemos la existencia y significado de los puertos y su conexión + Ya conocemos la existencia y significado de los puertos y su conexión con el microprocesador. Sólo resta saber: ¿cómo accedemos a un puerto tanto para leer como para escribir desde nuestros programas en ensamblador?
-con el microprocesador. Sólo resta saber: ¿cómo accedemos a un puerto +
-tanto para leer como para escribir desde nuestros programas en +
-ensamblador?+
  
- La respuesta la tienen los comandos **IN** **OUT** del Z80.+ La respuesta la tienen los comandos ''IN'' ''OUT'' del Z80. 
  
- Comenzaremos con **IN**, que nos permite leer el valor de un puerto ya + Comenzaremos con ''IN'', que nos permite leer el valor de un puerto ya sea directamente, o cargado sobre el registro BC:
-sea directamente, o cargado sobre el registro BC:+
  
 \\  \\ 
-**IN registro, (C)** \\  +**in r, (c)** \\  
-Leemos el puerto "BCy ponemos su contenido en el registro especificado. +Leemos el puerto apuntado por el valor contenido en el registro **BC** y ponemos su contenido en el registro de 8 bits 'r' especificado. En realidad, pese a que teóricamente el Spectrum sólo tiene acceso a puertos E/S de 8 bits (0-255), para acceder a los puertos, ''in r, (c)'' pone todo el valor de BC en el bus de direcciones.
-En realidad, pese a que teóricamente el Spectrum sólo tiene acceso a puertos +
-E/S de 8 bits (0-255), para acceder a los puertos, IN r, (C) pone todo el valor +
-de BC en el bus de direcciones.+
  
 +\\ 
 **IN A, (puerto)** \\  **IN A, (puerto)** \\ 
- Leemos el puerto "A*256 + Puerto" y ponemos su contenido en A. En esta + Leemos el puerto "A*256 + Puerto" y ponemos su contenido en A. En esta ocasión, el Spectrum pone en el bus de direcciones el valor del registro de 16 bits formado por A y (puerto) (en lugar de BC).
-ocasión, el Spectrum pone en el bus de direcciones el valor del registro +
-de 16 bits formado por A y (puerto) (en lugar de BC).+
 \\  \\ 
 \\  \\ 
 + Podemos usar una u otra forma según nos interese. Por ejemplo, si tenemos el registro BC en uso y no queremos modificar su valor, y el puerto es un valor fijo en el código, podemos usar la segunda forma que sólo utiliza A.
  
- Por ejemplo, estas 2 lecturas de puerto (usando los 2 formatos de la + Si por contra el puerto es una variable que cambia (por ejemplo, para leer alguna de las filas del teclado, ya que el estado de cada fila de teclas está presente en un puerto diferente), necesitaremos usar la forma 1.
-instrucción IN vistos anteriormenteson equivalentes:+
  
-<code z80> + Por ejemploestas 2 lecturas de puerto (usando los 2 formatos de la instrucción IN vistos anteriormente) son equivalentes:
- ; Forma 1 +
- LD BCFFFEh +
- IN A, (C)       ; A = Lectura de puerto FFFEh+
  
- ; Forma 2 +<code z80> 
- LD AFFh +; Forma 1 
- IN A, (FEh    ; A = Lectura de puerto FFFEh+ld bc$fffe 
 +in a, (c      ; A = Lectura de puerto $fffe
  
 +; Forma 2
 +ld a, $ff
 +in a, ($fe)     ; A = Lectura de puerto $fffe
 </code> </code>
  
- Aunque la instrucción de la "Forma 1" hable del puerto C, en realidad + Aunque la instrucción de la "Forma 1" hable del puerto C, en realidad el puerto es un valor de 16 bits y se carga en el registro BC.
-el puerto es un valor de 16 bits y se carga en el registro BC.+
  
- De la misma forma, podemos escribir un valor en un puerto con sus equivalentes "OUT":+ De la misma forma, podemos escribir un valor en un puerto con sus equivalentes ''OUT'':
  
 \\  \\ 
Línea 88: Línea 65:
 Escribimos en "puerto" (valor de 8 bits) el valor de A. Escribimos en "puerto" (valor de 8 bits) el valor de A.
  
-**OUT (C), registro** \\  +\\  
-Escribimos en el puerto "C" el valor contenido en "registro" (aunque se pone el +**out (c), r** \\  
-valor de BC en el bus de direcciones).+Escribimos en el puerto "C" el valor contenido en el registro de 8 bits "r" (aunque se pone el valor de BC completo en el bus de direcciones).
 \\  \\ 
 \\  \\ 
  
- Curiosamente, como se explica en el excelente documento "//The + Como se explica en el excelente documento "//The Undocumented Z80 Documented//" (que habla de las funcionalidades y opcodes no documentados del Z80), los puertos del Spectrum son oficialmente de 8 bits (0-255) aunque realmente se pone o bien BC o bien (A*256)+PUERTO en el bus de direcciones, por lo que en el fondo se pueden acceder a todos los 65536 puertos disponibles.
-Undocumented Z80 Documented//" (que habla de las funcionalidades y +
-opcodes no documentados del Z80), los puertos del Spectrum son +
-oficialmente de 8 bits (0-255) aunque realmente se pone o bien BC o +
-bien (A*256)+PUERTO en el bus de direcciones, por lo que en el fondo +
-se pueden acceder a todos los 65536 puertos disponibles.+
  
  La forma en que estas instrucciones afectan a los flags es la siguiente:  La forma en que estas instrucciones afectan a los flags es la siguiente:
Línea 107: Línea 79:
    Instrucción       |S Z H P N C|    Instrucción       |S Z H P N C|
  ----------------------------------  ----------------------------------
-   IN A, (n)         |- - - - - -| +   in a, (n)         |- - - - - -| 
-   IN r, (C)         |* * * P 0 -| +   in r, (c)         |* * * P 0 -| 
-   OUT (C), r        |- - - - - -| +   out (c), r        |- - - - - -| 
-   OUT (n),        |- - - - - -|+   out (n),        |- - - - - -|
 </code> </code>
  
- Aunque entre los 2 formatos OUT no debería haber ninguna diferencia funcional, cabe destacar que "OUT (N), A" es 1 t-estado o ciclo de reloj más rápida que "OUT (C), A", tardando 11 y 12 t-estados respectivamente.+ Aunque entre los 2 formatos OUT no debería haber ninguna diferencia funcional, cabe destacar que ''out (N), a'' es 1 t-estado o ciclo de reloj más rápida que ''out (c), a'', tardando 11 y 12 t-estados respectivamente.
  
 + Finalmente, comentar que también existe una instrucción no descrita en la documentación del Z80 llamada ''out (c), 0'', la cual nos puede permitir mandar un 0 a un puerto sin la necesidad de utilizar un registro para establecer dicho valor.
  
 \\  \\ 
-===== Instrucciones de puerto repetitivas e incrementales =====+===== La ULA y los dispositivos I/O del Spectrum =====
  
 +Como acabamos de ver, mediante las instrucciones ''IN'' y ''OUT'' podemos acceder a los dispositivos I/O del Spectrum.
 +
 +Pero ¿qué dispositivos I/O tenemos en el Spectrum?
 +
 +En un Spectrum básico sin ningún hardware de expansión conectado al slot trasero, tendremos los siguientes dispositivos a los que nos puede interesar acceder para hacer juegos y programas:
 +
 +   * El **teclado**. Concretamente, nos interesará leer con ''IN'' el estado de las "teclas" (pulsada/no pulsada) en las diferentes "filas del teclado".
 +
 +   * El **altavoz** (o //buzzer//), donde nos interesará escribir con ''OUT'' un valor para activarlo o desactivarlo y así generar sonido.
 +
 +   * El **cassette**, donde nos interesará tanto leer (''IN'') como escribir (''OUT'') un valor para acceder a datos en cinta.
 +
 +   * El **color del borde**, que es un conjunto de 3 bits (por tanto, 8 colores diferentes) que nos permite cambiar el color actual del borde con ''OUT''.
 +
 +Todos estos dispositivos básicos, los que vienen de serie con un Spectrum, están conectados a la ULA, y los accederemos a través de ella.
 +
 +Por otra parte, los dispositivos que se conectan al conector de expansión trasero tendrán su propio puerto para leerlos y escribir en ellos, que deberemos consultar en la documentación técnica del fabricante de dicho dispositivos si queremos hacer código que lo use. Por ejemplo, el **Kempston Mouse** utiliza los puertos $fbdf (coordenada X del ratón), $ffdf (coordenada Y del ratón) y $fadf para el estado de los botones.
 +
 +Y ahora viene una peculiaridad: los diseñadores del Spectrum conectaron el bit 0 del bus de direcciones de I/O a la ULA, de forma que un 0 en el bit 0 en este puerto (BC par) "seleccionará" a la ULA como dispositivo destinatario del ''IN'' o el ''OUT''. Por tanto, para acceder a la ULA dejaremos el resto de los bits a uno pero el bit 0 debe de estar inactivo:
 +
 +   * Puerto = **$XXFE** => Selecciona acceso a los dispositivos conectados a la ULA (**XX** indicará el dispositivo).
 +   * Puerto = **$NNNN** => Siendo **NNNN** un valor impar, selecciona el acceso al dispositivo indicado por ese valor.
 +
 +Por eso, utilizaremos un valor **$XXFE** para seleccionar la ULA, y será el valor de **XX** (la parte alta de BC) la que marcará qué dispositivo exacto de la ULA se quiere acceder.
 +
 +La mayoría de los puertos que veremos en código de Spectrum que accede a puertos acaban por este motivo en $fe.
 +
 +Por ejemplo, para leer el estado de las diferentes filas del teclado usaremos la instrucción ''IN $XXfe'', estableciendo **$XX** con ciertos valores concretos para indicar a la ULA qué fila exacta queremos leer (cada fila contiene el estado -pulsado o no- de 5 teclas).
 +
 +En cambio, todas las direcciones de BC impares (bit 0 a 1), se utilizan para acceder a otros dispositivos diferentes de la ULA que podamos tener conectados al bus de expansión. Se puede apreciar en el ejemplo del Kempston Mouse que hemos visto hace un momento que todos sus puertos son impares (acaban en **$df**).
 +
 +Para escribir tenemos otra peculiaridad. Si queremos escribir en un dispositivo externo diferente de la ULA, utilizaremos un valor de BC impar, y podremos escribir en él por ejemplo el valor del registro A. Para acceder a otros dispositivos que no sean la ULA, necesitaremos usar ''OUT'' junto al registro BC.
 +
 +Pero en el caso de escribir en dispositivos conectados a la ULA, la escritura está "centralizada" en un sólo valor de 8 bits. No podemos mandarle un valor al borde, o un valor al cassette, o un valor al altavoz del Spectrum, sino que sólo podemos "mandarle un valor a la ULA", un único valor de 8 bits cuyos bits se envían a los diferentes dispositivos. Es como si la ULA, para escritura I/O, sólo tuviera un puerto.
 +
 +De nuevo la parte baja de BC selecciona la ULA con el valor *$fe* pero en este caso, realmente no seleccionamos un puerto al que escribir sino que la parte alta es ignorada y el valor de A llega directamente a la ULA con el siguiente significado:
 +
 +\\ 
 +|< 50% >|
 +^ Bit ^ 7 ^ 6 ^ 5 ^ 4 ^ 2 ^ 1 ^ 0 ^
 +| ''OUT''\\ (escribir en ULA) | - | - | Altavoz | MIC | Bit 2 Borde (Green) | Bit 1 Borde (Red) | Bit 0 Borde (Blue) |
 +| ''IN''\\ (leer de ULA) | - | EAR | - | Bit 4 tecla | Bit 3 tecla | Bit 2 tecla | Bit 1 tecla | Bit 0 tecla |
 +\\ 
 +
 +A lo largo de este y los siguientes capítulos veremos cómo utilizar estos bits.
 +
 +\\ 
 +===== Instrucciones de puerto repetitivas e incrementales =====
  
- Al igual que LD carga un valor de un origen a un destino, y tiene sus correspondientes + Al igual que ''LD'' carga un valor de un origen a un destino, y tiene sus correspondientes instrucciones incrementales (''LDI'' "carga e incrementa", ''LDD'' "carga y decrementa") o repetitivas (''LDIR'' "carga, incrementa y repite BC veces", ''LDDR'' "carga, decrementa, y repite BC veces"), ''IN'' ''OUT'' tienen sus equivalentes incrementales y repetidores.
-instrucciones incrementales (LDI "carga e incrementa", LDD "carga y decrementa") o +
-repetitivas (LDIR "carga, incrementa y repite BC veces", LDDR "carga, decrementa, y +
-repite BC veces"), IN y OUT tienen sus equivalentes incrementales y repetidores.+
  
  Así:  Así:
  
-  * **IND** : +  * **ind** :
     * Leemos en la dirección de memoria apuntada por HL ([HL]) el valor contenido en el puerto C.     * Leemos en la dirección de memoria apuntada por HL ([HL]) el valor contenido en el puerto C.
     * Decrementamos HL.     * Decrementamos HL.
     * Decrementamos B     * Decrementamos B
  
-  * **INI** : +  * **ini** :
     * Leemos en la dirección de memoria apuntada por HL ([HL]) el valor contenido en el puerto C.     * Leemos en la dirección de memoria apuntada por HL ([HL]) el valor contenido en el puerto C.
     * Incrementamos HL.     * Incrementamos HL.
     * Decrementamos B     * Decrementamos B
  
-  * **OUTD** : +  * **outd** :
     * Escribimos en el puerto C el valor de la dirección de memoria apuntada por HL ([HL])     * Escribimos en el puerto C el valor de la dirección de memoria apuntada por HL ([HL])
     * Decrementamos HL.     * Decrementamos HL.
     * Decrementamos B     * Decrementamos B
  
-  * **OUTI** : +  * **outi** :
     * Escribimos en el puerto C el valor de la dirección de memoria apuntada por HL ([HL])     * Escribimos en el puerto C el valor de la dirección de memoria apuntada por HL ([HL])
     * Incrementamos HL.     * Incrementamos HL.
     * Decrementamos B     * Decrementamos B
  
- Y sus versiones repetitivas **INDR, INIR, OTDR** **OTIR**, que realizan la misma + Y sus versiones repetitivas ''INDR''''INIR''''OTDR'' ''OTIR'', que realizan la misma función que sus hermanas incrementales, repitiéndolo hasta que BC sea cero.
-función que sus hermanas incrementales, repitiéndolo hasta que BC sea cero.+
  
  Las afectaciones de flags de estas funciones son las siguientes:  Las afectaciones de flags de estas funciones son las siguientes:
Línea 158: Línea 175:
    Instrucción       |S Z H P N C|    Instrucción       |S Z H P N C|
  ----------------------------------  ----------------------------------
-   INI               |? * ? ? 1 ?| +   ini               |? * ? ? 1 ?| 
-   IND               |? * ? ? 1 ?| +   ind               |? * ? ? 1 ?| 
-   OUTI              |? * ? ? 1 ?| +   outi              |? * ? ? 1 ?| 
-   OUTD              |? * ? ? 1 ?| +   outd              |? * ? ? 1 ?| 
-   INDR              |? 1 ? ? 1 ?| +   indr              |? 1 ? ? 1 ?| 
-   INIR              |? 1 ? ? 1 ?| +   inir              |? 1 ? ? 1 ?| 
-   OTDR              |? 1 ? ? 1 ?| +   otdr              |? 1 ? ? 1 ?| 
-   OTIR              |? 1 ? ? 1 ?|+   otir              |? 1 ? ? 1 ?|
 </code> </code>
  
-Nota: Pese a que la documentación oficial dice que estas instrucciones no +Nota: Pese a que la documentación oficial dice que estas instrucciones no afectan al Carry Flag, las pruebas hechas a posteriori y recopiladas en la información disponible sobre Opcodes No Documentados del Z80 sugieren que sí que son modificados.
-afectan al Carry Flag, las pruebas hechas a posteriori y recopiladas en +
-la información disponible sobre Opcodes No Documentados del Z80 sugieren que +
-sí que son modificados.+
  
 \\  \\ 
 ===== Algunos puertos E/S comunes ===== ===== Algunos puertos E/S comunes =====
  
- Para terminar con el tema de los puertos de Entrada y Salida, vamos a hacer + Para terminar con el tema de los puertos de Entrada y Salida, vamos a hacer referencia a algunos puertos disponibles en el Sinclair Spectrum (algunos de ellos sólo en ciertos modelos).
-referencia a algunos puertos disponibles en el Sinclair Spectrum (algunos de  +
-ellos sólo en ciertos modelos).+
  
- Como veremos en capítulo dedicado al teclado, existe una serie de puertos + Como veremos en capítulo dedicado al teclado, existe una serie de puertos E/S que acceden directamente a la lectura del estado de las diferentes teclas de nuestro Spectrum. Leyendo del puerto adecuado, y chequeando en la respuesta obtenida el bit concreto asociado a la tecla que queremos consultar podremos conocer si una determinada tecla está pulsada (0) o no pulsada (1), como podemos ver en el siguiente ejemplo:
-E/S que acceden directamente a la lectura del estado de las diferentes teclas +
-de nuestro Spectrum. Leyendo del puerto adecuado, y chequeando en la respuesta +
-obtenida el bit concreto asociado a la tecla que queremos consultar podremos +
-conocer si una determinada tecla está pulsada (0) o no pulsada (1), como +
-podemos ver en el siguiente ejemplo:+
  
 <code z80> <code z80>
-  ; Lectura de la tecla "P" en un bucle +    ; Lectura de la tecla "P" en un bucle 
-  ORG 50000+    ORG 50000
  
 bucle: bucle:
-  LD BC, $DFFE         ; Semifila "P" a "Y" +    ld bc, $dffe         ; Semifila "P" a "Y" 
-  IN A, (C)            ; Leemos el puerto +    in a, (c)            ; Leemos el puerto 
-  BIT 0,             ; Testeamos el bit 0 +    bit 0,             ; Testeamos el bit 0 
-  JR Z, salir          ; Si esta a 0 (pulsado) salir. +    jr z, salir          ; Si esta a 0 (pulsado) salir. 
-  JR bucle             ; Si no (a 1, no pulsado) repetimos+    jr bucle             ; Si no (a 1, no pulsado) repetimos
  
 salir: salir:
-  RET+    ret 
 + 
 +    END 50000
 </code> </code>
  
- El anterior ejemplo lee constantemente el puerto $DFFE a la espera de + El anterior ejemplo lee constantemente el puerto **$dffe** a la espera de que el bit 0 de la respuesta obtenida de dicha lectura sea 0, lo que quiere decir que la tecla "p" ha sido pulsada.
-que el bit 0 de la respuesta obtenida de dicha lectura sea 0, lo que quiere +
-decir que la tecla "p" ha sido pulsada.+
  
- Aunque los veremos en su momento en profundidadestos son los puertos + La parte baja de **$dffe** (es decir**$fe**) especifica al Z80 que queremos acceder a alguno de los puertos controlados por la ULA, mientras que la parte alta (**$df**) indica qué dispositivo exacto de los que controla la ULA queremos acceder. En este caso, la fila del teclado que contiene el estado de las teclas "Y", "U", "I", "O", y "P". Manteniendo la parte baja fija ("acceso a la ULA") y variando la parte alta ("fila del teclado") podríamos mediante varios ''IN'' leer el estado de todo el teclado, fila a fila.
-asociados las diferentes filas de teclas:+
  
 + Aunque los veremos en su momento en profundidad, estos son los puertos asociados a las diferentes filas de teclas:
  
-^ Puerto ^ Bits: ^ D4 ^ D3 ^ D2 ^ D1 ^ D0 ^  +\\  
-| 65278d (FEFEh) | Teclas: | "V" | "C" | "X" | "Z" | CAPS | +|< 60% >| 
-| 65022d (FDFEh) | Teclas: | "G" | "F" | "D" | "S" | "A"+^ Puerto ^ Bits: ^ D4 ^ D3 ^ D2 ^ D1 ^ D0 ^ 
-| 64510d (FBFEh) | Teclas: | "T" | "R" | "E" | "W" | "Q"+| 65278d ($fefe) | Teclas: | "V" | "C" | "X" | "Z" | CAPS | 
-| 63486d (F7FEh) | Teclas: | "5" | "4" | "3" | "2" | "1"+| 65022d ($fdfe) | Teclas: | "G" | "F" | "D" | "S" | "A"
-| 61438d (EFFEh) | Teclas: | "0" | "9" | "8" | "7" | "6"+| 64510d ($fbfe) | Teclas: | "T" | "R" | "E" | "W" | "Q"
-| 57342d (DFFEh) | Teclas: | "Y" | "U" | "I" | "O" | "P"+| 63486d ($f7fe) | Teclas: | "5" | "4" | "3" | "2" | "1"
-| 49150d (BFFEh) | Teclas: | "H" | "J" | "K" | "L" | ENTER | +| 61438d ($effe) | Teclas: | "0" | "9" | "8" | "7" | "6"
-| 32766d (7FFEh) | Teclas: | "B" | "N" | "M" | SYMB | SPACE | +| 57342d ($dffe) | Teclas: | "Y" | "U" | "I" | "O" | "P"
- +| 49150d ($bffe) | Teclas: | "H" | "J" | "K" | "L" | ENTER | 
-  +| 32766d ($7ffe) | Teclas: | "B" | "N" | "M" | SYMB | SPACE | 
- El bit 6 de los puertos que hemos visto para el teclado tiene un valor +\\ 
-aleatorio, excepto cuando se pulsa PLAY en el cassette, y es a través +
-de dicho bit de donde podremos obtener los datos a cargar.+
  
- La escritura en el puerto 00FEh permite //acceder al altavoz// (bit 4) +El bit 6 de los puertos que hemos visto para el teclado tiene un valor aleatorio, excepto cuando se pulsa PLAY en el cassette, es través de dicho bit de donde podremos obtener los datos cargar.
-y a la señal de audio para grabar cinta (bit 3)Los bits 0, 1 y 2 +
-controlan //el color del borde//, como podemos ver en el siguiente ejemplo:+
  
 + La escritura en el puerto **$00fe** permite //acceder al altavoz// (bit 4) y a la señal de audio para grabar a cinta (bit 3). Los bits 0, 1 y 2 controlan //el color del borde//, como podemos ver en el siguiente ejemplo:
  
 <code z80> <code z80>
-  ; Cambio del color del borde al pulsar espacio +; Cambio del color del borde al pulsar espacio 
-  ORG 50000+    ORG 50000
  
-  LD B, 6              ; 6 iteraciones, color inicial borde+    ld b, 6              ; 6 iteraciones, color inicial borde
  
 bucle: bucle:
-  LD A, $7F            ; Semifila B a ESPACIO +    ld a, $7f            ; Semifila B a ESPACIO 
-  IN A, ($FE)          ; Leemos el puerto +    in a, ($fe)          ; Leemos el puerto 
-  BIT 0,             ; Testeamos el bit 0 (ESPACIO) +    bit 0,             ; Testeamos el bit 0 (ESPACIO) 
-  JR NZ, bucle         ; Si esta a 1 (no pulsado), esperar+    jr nz, bucle         ; Si esta a 1 (no pulsado), esperar
  
-  LD A             ; A = B +    ld a             ; A = B 
-  OUT (254),         ; Cambiamos el color del borde+    out ($fe),         ; Cambiamos el color del borde
  
-suelta_tecla:          ; Ahora esperamos a que se suelte la tecla +suelta_tecla:            ; Ahora esperamos a que se suelte la tecla 
-  LD A, $7F            ; Semifila B a ESPACIO +    ld a, $7f            ; Semifila B a ESPACIO 
-  IN A, ($FE)          ; Leemos el puerto +    in a, ($fe)          ; Leemos el puerto 
-  BIT 0,             ; Testeamos el bit 0 +    bit 0,             ; Testeamos el bit 0 
-  JR Z, suelta_tecla   ; Saltamos hasta que se suelte+    jr z, suelta_tecla   ; Saltamos hasta que se suelte
  
-  djnz bucle           ; Repetimos "B" veces+    djnz bucle           ; Repetimos "B" veces
  
 salir: salir:
-  RET+    ret
  
-  END 50000            ; Ejecucion en 50000+    END 50000            ; Ejecucion en 50000
 </code> </code>
  
 \\  \\ 
-{{ cursos:ensamblador:borde.png |Ejecución del programa de cambio de borde}}+{{ cursos:ensamblador:borde.png?640 |Ejecución del programa de cambio de borde}}
 \\  \\ 
  
- El puerto 7FFDh gestiona la //paginación en los modos de 128K//, + El puerto **$7ffd** gestiona la //paginación en los modos de 128K//, permitiendo cambiar el modelo de páginas de memoria (algo que no vamos a ver en este capítulo).
-permitiendo cambiar el modelo de páginas de memoria (algo que +
-no vamos a ver en este capítulo).+
  
- Los puertos BFFDh FFFDh gestionan el //chip de sonido// en aquellos + Los puertos **$bffd** **$fffd** gestionan el //chip de sonido// en aquellos modelos que dispongan de él, así como el RS232/MIdi y el interfaz AUX.
-modelos que dispongan de él, así como el RS232/MIDI y el interfaz +
-AUX.+
  
- Finalmente, el puerto 0FFDh gestiona //el puerto paralelo de impresora//, + Finalmente, el puerto **$0ffd** gestiona //el puerto paralelo de impresora//, y los puertos **$2ffd** **$3ffd** permiten gestionar la controladora de disco en aquellos modelos de Spectrum que dispongan de ella.
-y los puertos 2FFDh 3FFDh permiten gestionar la controladora de disco en +
-aquellos modelos de Spectrum que dispongan de ella.+
  
- Podéis encontrar más información sobre los puertos de Entrada y + Podéis encontrar más información sobre los puertos de Entrada y Salida en el //capítulo 8 sección 23 del manual del +2A y +3//, disponible online en World Of Spectrum.
-Salida en el //capítulo 8 sección 23 del manual del +2A y +3//, disponible +
-online en World Of Spectrum.+
  
 \\  \\ 
 ===== Tabla de instrucciones, ciclos y tamaños ===== ===== Tabla de instrucciones, ciclos y tamaños =====
  
- A continuación se incluye una tabla donde se hace referencia a las instrucciones + A continuación se incluye una tabla donde se hace referencia a las instrucciones del microprocesador Z80 (campo Mnemonic), los ciclos de reloj que tarda en ejecutarse (campo Clck), el tamaño en bytes de la instrucción codificada (Siz), la afectación de Flags (SZHPNC), el opcode y su descripción en cuanto a ejecución.
-del microprocesador Z80 (campo Mnemonic), los ciclos de reloj que tarda en ejecutarse +
-(campo Clck), el tamaño en bytes de la instrucción codificada (Siz), la afectación +
-de Flags (SZHPNC), el opcode y su descripción en cuanto a ejecución.+
  
- La tabla forma parte de un documento llamado "**The Complete Z80 OP-Code Reference**", + La tabla forma parte de un documento llamado "**The Complete Z80 OP-Code Reference**", de //Devin Gardner//.
-de //Devin Gardner//.+
  
 \\  \\ 
Línea 296: Línea 288:
 |Mnemonic     |Clck|Siz|SZHPNC|  OP-Code      Description      |        Notes         | |Mnemonic     |Clck|Siz|SZHPNC|  OP-Code      Description      |        Notes         |
 --------------+----+---+------+------------+---------------------+----------------------- --------------+----+---+------+------------+---------------------+-----------------------
-|ADC A,r      | 4  | 1 |***V0*|88+rb       |Add with Carry       |A=A+s+CY              | +|adc a,r      | 4  | 1 |***V0*|88+rb       |Add with Carry       |A=A+s+CY              | 
-|ADC A,N      | 7  | 2 |      |CE XX                                                | +|adc a,N      | 7  | 2 |      |CE XX                                                | 
-|ADC A,(HL)   | 7  | 1 |      |8E          |                                          | +|adc a,(hl)   | 7  | 1 |      |8E          |                                          | 
-|ADC A,(IX+N) | 19 | 3 |      |DD 8E XX    |                                          | +|adc a,(ix+n) | 19 | 3 |      |DD 8E XX    |                                          | 
-|ADC A,(IY+N) | 19 | 3 |      |FD 8E XX    |                                          | +|adc a,(iy+n) | 19 | 3 |      |FD 8E XX    |                                          | 
-|ADC HL,BC    | 15 | 2 |**?V0*|ED 4A       |Add with Carry       |HL=HL+ss+CY           | +|adc hl,bc    | 15 | 2 |**?V0*|ED 4A       |Add with Carry       |HL=HL+ss+CY           | 
-|ADC HL,DE    | 15 | 2 |      |ED 5A                                                | +|adc hl,de    | 15 | 2 |      |ED 5A                                                | 
-|ADC HL,HL    | 15 | 2 |      |ED 6A                                                | +|adc hl,hl    | 15 | 2 |      |ED 6A                                                | 
-|ADC HL,SP    | 15 | 2 |      |ED 7A                                                |+|adc hl,sp    | 15 | 2 |      |ED 7A                                                |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|ADD A,r      | 4  | 1 |***V0*|80+rb       |Add (8-bit)          |A=A+s                 | +|add a,r      | 4  | 1 |***V0*|80+rb       |Add (8-bit)          |A=A+s                 | 
-|ADD A,N      | 7  | 2 |      |C6 XX                                                | +|add a,N      | 7  | 2 |      |C6 XX                                                | 
-|ADD A,(HL)   | 7  | 1 |      |86          |                                          | +|add a,(hl)   | 7  | 1 |      |86          |                                          | 
-|ADD A,(IX+N) | 19 | 3 |      |DD 86 XX    |                                          | +|add a,(ix+n) | 19 | 3 |      |DD 86 XX    |                                          | 
-|ADD A,(IY+N) | 19 | 3 |      |FD 86 XX    |                                          | +|add a,(iy+n) | 19 | 3 |      |FD 86 XX    |                                          | 
-|ADD HL,BC    | 11 | 1 |--?-0*|09          |Add (16-bit)         |HL=HL+ss              | +|add hl,bc    | 11 | 1 |--?-0*|09          |Add (16-bit)         |HL=HL+ss              | 
-|ADD HL,DE    | 11 | 1 |      |19          |                                          | +|add hl,de    | 11 | 1 |      |19          |                                          | 
-|ADD HL,HL    | 11 | 1 |      |29          |                                          | +|add hl,hl    | 11 | 1 |      |29          |                                          | 
-|ADD HL,SP    | 11 | 1 |      |39          |                                          | +|add hl,sp    | 11 | 1 |      |39          |                                          | 
-|ADD IX,BC    | 15 | 2 |--?-0*|DD 09       |Add (IX register)    |IX=IX+pp              | +|add ix,bc    | 15 | 2 |--?-0*|DD 09       |Add (IX register)    |IX=IX+pp              | 
-|ADD IX,DE    | 15 | 2 |      |DD 19                                                | +|add ix,de    | 15 | 2 |      |DD 19                                                | 
-|ADD IX,IX    | 15 | 2 |      |DD 29                                                | +|add ix,ix    | 15 | 2 |      |DD 29                                                | 
-|ADD IX,SP    | 15 | 2 |      |DD 39                                                | +|add ix,sp    | 15 | 2 |      |DD 39                                                | 
-|ADD IY,BC    | 15 | 2 |--?-0*|FD 09       |Add (IY register)    |IY=IY+rr              | +|add iy,bc    | 15 | 2 |--?-0*|FD 09       |Add (IY register)    |IY=IY+rr              | 
-|ADD IY,DE    | 15 | 2 |      |FD 19                                                | +|add iy,de    | 15 | 2 |      |FD 19                                                | 
-|ADD IY,IY    | 15 | 2 |      |FD 29                                                | +|add iy,iy    | 15 | 2 |      |FD 29                                                | 
-|ADD IY,SP    | 15 | 2 |      |FD 39                                                |+|add iy,sp    | 15 | 2 |      |FD 39                                                |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|AND r        | 4  | 1 |***P00|A0+rb       |Logical AND          |A=A&                | +|and r        | 4  | 1 |***P00|A0+rb       |Logical AND          |A=A&                | 
-|AND N        | 7  | 2 |      |E6 XX                                                | +|and N        | 7  | 2 |      |E6 XX                                                | 
-|AND (HL)     | 7  | 1 |      |A6          |                                          | +|and (hl)     | 7  | 1 |      |A6          |                                          | 
-|AND (IX+N)   | 19 | 3 |      |DD A6 XX    |                                          | +|and (ix+n)   | 19 | 3 |      |DD A6 XX    |                                          | 
-|AND (IY+N)   | 19 | 3 |      |FD A6 XX    |                                          |+|and (iy+n)   | 19 | 3 |      |FD A6 XX    |                                          |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|BIT b,r      | 8  | 2 |?*1?0-|CB 40+8*b+rb|Test Bit             |m&{2^b}               | +|bit b,r      | 8  | 2 |?*1?0-|CB 40+8*b+rb|Test Bit             |m&{2^b}               | 
-|BIT b,(HL)   | 12 | 2 |      |CB 46+8*b                                            | +|bit b,(hl)   | 12 | 2 |      |CB 46+8*b                                            | 
-|BIT b,(IX+N) | 20 | 4 |      |DD CB XX 46+8*b                                        | +|bit b,(ix+N) | 20 | 4 |      |DD CB XX 46+8*b                                        | 
-|BIT b,(IY+N) | 20 | 4 |      |FD CB XX 46+8*b                                        |+|bit b,(iy+N) | 20 | 4 |      |FD CB XX 46+8*b                                        |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|CALL NN      | 17 | 3 |------|CD XX XX    |Unconditional Call   |-(SP)=PC,PC=nn        | +|call NN      | 17 | 3 |------|CD XX XX    |Unconditional Call   |-(SP)=PC,PC=nn        | 
-|CALL C,NN    |17/1| 3 |------|DC XX XX    |Conditional Call     |If Carry = 1          | +|call c,NN    |17/1| 3 |------|DC XX XX    |Conditional Call     |If Carry = 1          | 
-|CALL NC,NN   |17/1| 3 |      |D4 XX XX    |                     |If carry = 0          | +|call nc,NN   |17/1| 3 |      |D4 XX XX    |                     |If carry = 0          | 
-|CALL M,NN    |17/1| 3 |      |FC XX XX    |                     |If Sign = 1 (negative)| +|call m,NN    |17/1| 3 |      |FC XX XX    |                     |If Sign = 1 (negative)| 
-|CALL P,NN    |17/1| 3 |      |F4 XX XX    |                     |If Sign = 0 (positive)| +|call p,NN    |17/1| 3 |      |F4 XX XX    |                     |If Sign = 0 (positive)| 
-|CALL Z,NN    |17/1| 3 |      |CC XX XX    |                     |If Zero = 1 (ans.=0) +|call z,NN    |17/1| 3 |      |CC XX XX    |                     |If Zero = 1 (ans.=0) 
-|CALL NZ,NN   |17/1| 3 |      |C4 XX XX    |                     |If Zero = 0 (non-zero)| +|call nz,NN   |17/1| 3 |      |C4 XX XX    |                     |If Zero = 0 (non-zero)| 
-|CALL PE,NN   |17/1| 3 |      |EC XX XX    |                     |If Parity = 1 (even) +|call pe,NN   |17/1| 3 |      |EC XX XX    |                     |If Parity = 1 (even) 
-|CALL PO,NN   |17/1| 3 |      |E4 XX XX    |                     |If Parity = 0 (odd)   |+|call po,NN   |17/1| 3 |      |E4 XX XX    |                     |If Parity = 0 (odd)   |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|CCF          | 4  | 1 |--?-0*|3F          |Complement Carry Flag|CY=~CY                |+|ccf          | 4  | 1 |--?-0*|3F          |Complement Carry Flag|CY=~CY                |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|CP r         | 4  | 1 |***V1*|B8+rb       |Compare              |Compare A-s           | +|cp r         | 4  | 1 |***V1*|B8+rb       |Compare              |Compare A-s           | 
-|CP N         | 7  | 2 |      |FE XX                                                | +|cp N         | 7  | 2 |      |FE XX                                                | 
-|CP (HL)      | 7  | 1 |      |BE          |                                          | +|cp (hl)      | 7  | 1 |      |BE          |                                          | 
-|CP (IX+N)    | 19 | 3 |      |DD BE XX    |                                          | +|cp (ix+n)    | 19 | 3 |      |DD BE XX    |                                          | 
-|CP (IY+N)    | 19 | 3 |      |FD BE XX    |                                          | +|cp (iy+n)    | 19 | 3 |      |FD BE XX    |                                          | 
-|CPD          | 16 | 2 |****1-|ED A9       |Compare and Decrement|A-(HL),HL=HL-1,BC=BC-1| +|cpd          | 16 | 2 |****1-|ED A9       |Compare and Decrement|A-(HL),HL=HL-1,BC=BC-1| 
-|CPDR         |21/1| 2 |****1-|ED B9       |Compare, Dec., Repeat|CPD till A=(HL)or BC=0| +|cpdr         |21/1| 2 |****1-|ED B9       |Compare, Dec., Repeat|cpd till A=(HL)or BC=0| 
-|CPI          | 16 | 2 |****1-|ED A1       |Compare and Increment|A-(HL),HL=HL+1,BC=BC-1| +|cpi          | 16 | 2 |****1-|ED A1       |Compare and Increment|A-(HL),HL=HL+1,BC=BC-1| 
-|CPIR         |21/1| 2 |****1-|ED B1       |Compare, Inc., Repeat|CPI till A=(HL)or BC=0|+|cpir         |21/1| 2 |****1-|ED B1       |Compare, Inc., Repeat|cpi till A=(HL)or BC=0|
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|CPL          | 4  | 1 |--1-1-|2F          |Complement           |A=~A                  |+|cpl          | 4  | 1 |--1-1-|2F          |Complement           |A=~A                  |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|DAA          | 4  | 1 |***P-*|27          |Decimal Adjust Acc.  |A=BCD format  (dec.)  |+|daa          | 4  | 1 |***P-*|27          |Decimal Adjust Acc.  |A=BCD format  (dec.)  |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|DEC A        | 4  | 1 |***V1-|3D          |Decrement (8-bit)    |s=s-1                 | +|dec a        | 4  | 1 |***V1-|3D          |Decrement (8-bit)    |s=s-1                 | 
-|DEC B        | 4  | 1 |      |05          |                                          | +|dec b        | 4  | 1 |      |05          |                                          | 
-|DEC C        | 4  | 1 |      |0D          |                                          | +|dec c        | 4  | 1 |      |0D          |                                          | 
-|DEC D        | 4  | 1 |      |15          |                                          | +|dec d        | 4  | 1 |      |15          |                                          | 
-|DEC E        | 4  | 1 |      |1D          |                                          | +|dec e        | 4  | 1 |      |1D          |                                          | 
-|DEC H        | 4  | 1 |      |25          |                                          | +|dec h        | 4  | 1 |      |25          |                                          | 
-|DEC L        | 4  | 2 |      |2D          |                                          | +|dec l        | 4  | 2 |      |2D          |                                          | 
-|DEC (HL)     | 11 | 1 |      |35          |                                          | +|dec (hl)     | 11 | 1 |      |35          |                                          | 
-|DEC (IX+N)   | 23 | 3 |      |DD 35 XX    |                                          | +|dec (ix+n)   | 23 | 3 |      |DD 35 XX    |                                          | 
-|DEC (IY+N)   | 23 | 3 |      |FD 35 XX    |                                          | +|dec (iy+n)   | 23 | 3 |      |FD 35 XX    |                                          | 
-|DEC BC       | 6  | 1 |------|0B          |Decrement (16-bit)   |ss=ss-1               | +|dec bc       | 6  | 1 |------|0B          |Decrement (16-bit)   |ss=ss-1               | 
-|DEC DE       | 6  | 1 |      |1B          |                                          | +|dec de       | 6  | 1 |      |1B          |                                          | 
-|DEC HL       | 6  | 1 |      |2B          |                                          | +|dec hl       | 6  | 1 |      |2B          |                                          | 
-|DEC SP       | 6  | 1 |      |3B          |                                          | +|dec sp       | 6  | 1 |      |3B          |                                          | 
-|DEC IX       | 10 | 2 |------|DD 2B       |Decrement            |xx=xx-1               | +|dec ix       | 10 | 2 |------|DD 2B       |Decrement            |xx=xx-1               | 
-|DEC IY       | 10 | 2 |      |FD 2B                                                |+|dec iy       | 10 | 2 |      |FD 2B                                                |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|DI           | 4  | 1 |------|F3          |Disable Interrupts                        |+|di           | 4  | 1 |------|F3          |Disable Interrupts                        |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|DJNZ $+2     |13/8| 1 |------|10          |Dec., Jump Non-Zero  |B=B-1 till B=0        |+|djnz $+2     |13/8| 1 |------|10          |Dec., Jump Non-Zero  |B=B-1 till B=0        |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|EI           | 4  | 1 |------|FB          |Enable Interrupts    |                      |+|ei           | 4  | 1 |------|FB          |Enable Interrupts    |                      |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|EX (SP),HL   | 19 | 1 |------|E3          |Exchange             |(SP)<->HL             | +|ex (sp),hl   | 19 | 1 |------|E3          |Exchange             |(SP)<->HL             | 
-|EX (SP),IX   | 23 | 2 |------|DD E3                           |(SP)<->xx             | +|ex (sp),ix   | 23 | 2 |------|DD E3                           |(SP)<->xx             | 
-|EX (SP),IY   | 23 | 2 |      |FD E3                                                | +|ex (sp),iy   | 23 | 2 |      |FD E3                                                | 
-|EX AF,AF   | 4  | 1 |------|08          |                     |AF<->AF'              | +|ex af,af   | 4  | 1 |------|08          |                     |AF<->AF'              | 
-|EX DE,HL     | 4  | 1 |------|EB          |                     |DE<->HL               | +|ex de,hl     | 4  | 1 |------|EB          |                     |DE<->HL               | 
-|EXX          | 4  | 1 |------|D9          |Exchange             |qq<->qq'   (except AF)|+|exx          | 4  | 1 |------|D9          |Exchange             |qq<->qq'   (except AF)|
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|HALT         | 4  | 1 |------|76          |Halt                                      |+|halt         | 4  | 1 |------|76          |Halt                                      |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|IM 0         | 8  | 2 |------|ED 46       |Interrupt Mode                   (n=0,1,2)| +|im 0         | 8  | 2 |------|ED 46       |Interrupt Mode                   (n=0,1,2)| 
-|IM 1         | 8  | 2 |      |ED 56                                                | +|im 1         | 8  | 2 |      |ED 56                                                | 
-|IM 2         | 8  | 2 |      |ED 5E                                                |+|im 2         | 8  | 2 |      |ED 5E                                                |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|IN A,(N)     | 11 | 2 |------|DB XX       |Input                |A=(n)                 | +|in a,(N)     | 11 | 2 |------|DB XX       |Input                |A=(n)                 | 
-|IN (C)       | 12 | 2 |***P0-|ED 70       |Input*                       (Unsupported)| +|in (c)       | 12 | 2 |***P0-|ED 70       |Input*                       (Unsupported)| 
-|IN A,(C)     | 12 | 2 |***P0-|ED 78       |Input                |r=(C)                 | +|in a,(c)     | 12 | 2 |***P0-|ED 78       |Input                |r=(C)                 | 
-|IN B,(C)     | 12 | 2 |      |ED 40                                                | +|in b,(c)     | 12 | 2 |      |ED 40                                                | 
-|IN C,(C)     | 12 | 2 |      |ED 48                                                | +|in c,(c)     | 12 | 2 |      |ED 48                                                | 
-|IN D,(C)     | 12 | 2 |      |ED 50                                                | +|in d,(c)     | 12 | 2 |      |ED 50                                                | 
-|IN E,(C)     | 12 | 2 |      |ED 58                                                | +|in e,(c)     | 12 | 2 |      |ED 58                                                | 
-|IN H,(C)     | 12 | 2 |      |ED 60                                                | +|in h,(c)     | 12 | 2 |      |ED 60                                                | 
-|IN L,(C)     | 12 | 2 |      |ED 68                                                |+|in l,(c)     | 12 | 2 |      |ED 68                                                |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|INC A        | 4  | 1 |***V0-|3C          |Increment (8-bit)    |r=r+1                 | +|inc a        | 4  | 1 |***V0-|3C          |Increment (8-bit)    |r=r+1                 | 
-|INC B        | 4  | 1 |      |04          |                                          | +|inc b        | 4  | 1 |      |04          |                                          | 
-|INC C        | 4  | 1 |      |0C          |                                          | +|inc c        | 4  | 1 |      |0C          |                                          | 
-|INC D        | 4  | 1 |      |14          |                                          | +|inc d        | 4  | 1 |      |14          |                                          | 
-|INC E        | 4  | 1 |      |1C          |                                          | +|inc e        | 4  | 1 |      |1C          |                                          | 
-|INC H        | 4  | 1 |      |24          |                                          | +|inc h        | 4  | 1 |      |24          |                                          | 
-|INC L        | 4  | 1 |      |2C          |                                          | +|inc l        | 4  | 1 |      |2C          |                                          | 
-|INC BC       | 6  | 1 |------|03          |Increment (16-bit)   |ss=ss+1               | +|inc bc       | 6  | 1 |------|03          |Increment (16-bit)   |ss=ss+1               | 
-|INC DE       | 6  | 1 |      |13          |                                          | +|inc de       | 6  | 1 |      |13          |                                          | 
-|INC HL       | 6  | 1 |      |23          |                                          | +|inc hl       | 6  | 1 |      |23          |                                          | 
-|INC SP       | 6  | 1 |      |33          |                                          | +|inc sp       | 6  | 1 |      |33          |                                          | 
-|INC IX       | 10 | 2 |------|DD 23       |Increment            |xx=xx+1               | +|inc ix       | 10 | 2 |------|DD 23       |Increment            |xx=xx+1               | 
-|INC IY       | 10 | 2 |      |FD 23                                                | +|inc iy       | 10 | 2 |      |FD 23                                                | 
-|INC (HL)     | 11 | 1 |***V0-|34          |Increment (indirect) |(HL)=(HL)+1           | +|inc (hl)     | 11 | 1 |***V0-|34          |Increment (indirect) |(HL)=(HL)+1           | 
-|INC (IX+N)   | 23 | 3 |***V0-|DD 34 XX    |Increment            |(xx+d)=(xx+d)+1       | +|inc (ix+n)   | 23 | 3 |***V0-|DD 34 XX    |Increment            |(xx+d)=(xx+d)+1       | 
-|INC (IY+N)   | 23 | 3 |      |FD 34 XX    |                                          |+|inc (iy+n)   | 23 | 3 |      |FD 34 XX    |                                          |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|IND          | 16 | 2 |?*??1-|ED AA       |Input and Decrement  |(HL)=(C),HL=HL-1,B=B-1| +|ind          | 16 | 2 |?*??1-|ED AA       |Input and Decrement  |(HL)=(C),HL=HL-1,B=B-1| 
-|INDR         |21/1| 2 |?1??1-|ED BA       |Input, Dec., Repeat  |IND till B=0          | +|indr         |21/1| 2 |?1??1-|ED BA       |Input, Dec., Repeat  |ind till B=0          | 
-|INI          | 16 | 2 |?*??1-|ED A2       |Input and Increment  |(HL)=(C),HL=HL+1,B=B-1| +|ini          | 16 | 2 |?*??1-|ED A2       |Input and Increment  |(HL)=(C),HL=HL+1,B=B-1| 
-|INIR         |21/1| 2 |?1??1-|ED B2       |Input, Inc., Repeat  |INI till B=0          |+|inir         |21/1| 2 |?1??1-|ED B2       |Input, Inc., Repeat  |ini till B=0          |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|JP $NN       | 10 | 3 |------|C3 XX XX    |Unconditional Jump   |PC=nn                 | +|jp $NN       | 10 | 3 |------|C3 XX XX    |Unconditional Jump   |PC=nn                 | 
-|JP (HL)      | 4  | 1 |------|E9          |Unconditional Jump   |PC=(HL)               | +|jp (hl)      | 4  | 1 |------|E9          |Unconditional Jump   |PC=(HL)               | 
-|JP (IX)      | 8  | 2 |------|DD E9       |Unconditional Jump   |PC=(xx)               | +|jp (ix)      | 8  | 2 |------|DD E9       |Unconditional Jump   |PC=(xx)               | 
-|JP (IY)      | 8  | 2 |      |FD E9                                                | +|jp (iy)      | 8  | 2 |      |FD E9                                                | 
-|JP C,$NN     |10/1| 3 |------|DA XX XX    |Conditional Jump     |If Carry = 1          | +|jp c,$NN     |10/1| 3 |------|DA XX XX    |Conditional Jump     |If Carry = 1          | 
-|JP NC,$NN    |10/1| 3 |      |D2 XX XX    |                     |If Carry = 0          | +|jp nc,$NN    |10/1| 3 |      |D2 XX XX    |                     |If Carry = 0          | 
-|JP M,$NN     |10/1| 3 |      |FA XX XX    |                     |If Sign = 1 (negative)| +|jp m,$NN     |10/1| 3 |      |FA XX XX    |                     |If Sign = 1 (negative)| 
-|JP P,$NN     |10/1| 3 |      |F2 XX XX    |                     |If Sign = 0 (positive)| +|jp p,$NN     |10/1| 3 |      |F2 XX XX    |                     |If Sign = 0 (positive)| 
-|JP Z,$NN     |10/1| 3 |      |CA XX XX    |                     |If Zero = 1 (ans.= 0) | +|jp z,$NN     |10/1| 3 |      |CA XX XX    |                     |If Zero = 1 (ans.= 0) | 
-|JP NZ,$NN    |10/1| 3 |      |C2 XX XX    |                     |If Zero = 0 (non-zero)| +|jp nz,$NN    |10/1| 3 |      |C2 XX XX    |                     |If Zero = 0 (non-zero)| 
-|JP PE,$NN    |10/1| 3 |      |EA XX XX    |                     |If Parity = 1 (even) +|jp pe,$NN    |10/1| 3 |      |EA XX XX    |                     |If Parity = 1 (even) 
-|JP PO,$NN    |10/1| 3 |      |E2 XX XX    |                     |If Parity = 0 (odd)   |+|jp po,$NN    |10/1| 3 |      |E2 XX XX    |                     |If Parity = 0 (odd)   |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|JR $N+2      | 12 | 2 |------|18 XX       |Relative Jump        |PC=PC+e               | +|jr $N+2      | 12 | 2 |------|18 XX       |Relative Jump        |PC=PC+e               | 
-|JR C,$N+2    |12/7| 2 |------|38 XX       |Cond. Relative Jump  |If cc JR(cc=C,NC,NZ,Z)| +|jr c,$N+2    |12/7| 2 |------|38 XX       |Cond. Relative Jump  |If cc jr(cc=C,NC,NZ,Z)| 
-|JR NC,$N+2   |12/7| 2 |      |30 XX                                                | +|jr nc,$N+2   |12/7| 2 |      |30 XX                                                | 
-|JR Z,$N+2    |12/7| 2 |      |28 XX                                                | +|jr z,$N+2    |12/7| 2 |      |28 XX                                                | 
-|JR NZ,$N+2   |12/7| 2 |      |20 XX                                                |+|jr nz,$N+2   |12/7| 2 |      |20 XX                                                |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|LD I,      | 9  | 2 |------|ED 47       |Load*                |dst=src               | +|ld i,      | 9  | 2 |------|ED 47       |Load*                |dst=src               | 
-|LD R,      | 9  | 2 |      |ED 4F                                                | +|ld r,      | 9  | 2 |      |ED 4F                                                | 
-|LD A,      | 9  | 2 |**0*0-|ED 57       |Load*                |dst=src               | +|ld a,      | 9  | 2 |**0*0-|ED 57       |Load*                |dst=src               | 
-|LD A,      | 9  | 2 |      |ED 5F                                                | +|ld a,      | 9  | 2 |      |ED 5F                                                | 
-|LD A,r       | 4  | 1 |------|78+rb       |Load (8-bit)         |dst=src               | +|ld a,r       | 4  | 1 |------|78+rb       |Load (8-bit)         |dst=src               | 
-|LD A,N       | 7  | 2 |      |3E XX                                                | +|ld a,N       | 7  | 2 |      |3E XX                                                | 
-|LD A,(BC)    | 7  | 1 |      |0A          |                                          | +|ld a,(bc)    | 7  | 1 |      |0A          |                                          | 
-|LD A,(DE)    | 7  | 1 |      |1A          |                                          | +|ld a,(de)    | 7  | 1 |      |1A          |                                          | 
-|LD A,(HL)    | 7  | 1 |      |7E          |                                          | +|ld a,(hl)    | 7  | 1 |      |7E          |                                          | 
-|LD A,(IX+N)  | 19 | 3 |      |DD 7E XX    |                                          | +|ld a,(ix+n)  | 19 | 3 |      |DD 7E XX    |                                          | 
-|LD A,(IY+N)  | 19 | 3 |      |FD 7E XX    |                                          | +|ld a,(iy+n)  | 19 | 3 |      |FD 7E XX    |                                          | 
-|LD A,(NN)    | 13 | 3 |      |3A XX XX    |                                          | +|ld a,(NN)    | 13 | 3 |      |3A XX XX    |                                          | 
-|LD B,r       | 4  | 1 |      |40+rb                                                | +|ld b,r       | 4  | 1 |      |40+rb                                                | 
-|LD B,N       | 7  | 2 |      |06 XX                                                | +|ld b,N       | 7  | 2 |      |06 XX                                                | 
-|LD B,(HL)    | 7  | 1 |      |46          |                                          | +|ld b,(hl)    | 7  | 1 |      |46          |                                          | 
-|LD B,(IX+N)  | 19 | 3 |      |DD 46 XX    |                                          | +|ld b,(ix+n)  | 19 | 3 |      |DD 46 XX    |                                          | 
-|LD B,(IY+N)  | 19 | 3 |      |FD 46 XX    |                                          | +|ld b,(iy+n)  | 19 | 3 |      |FD 46 XX    |                                          | 
-|LD C,r       | 4  | 1 |      |48+rb                                                | +|ld c,r       | 4  | 1 |      |48+rb                                                | 
-|LD C,N       | 7  | 2 |      |0E XX                                                | +|ld c,N       | 7  | 2 |      |0E XX                                                | 
-|LD C,(HL)    | 7  | 1 |      |4E          |                                          | +|ld c,(hl)    | 7  | 1 |      |4E          |                                          | 
-|LD C,(IX+N)  | 19 | 3 |      |DD 4E XX    |                                          | +|ld c,(ix+n)  | 19 | 3 |      |DD 4E XX    |                                          | 
-|LD C,(IY+N)  | 19 | 3 |      |FD 4E XX    |                                          | +|ld c,(iy+n)  | 19 | 3 |      |FD 4E XX    |                                          | 
-|LD D,r       | 4  | 1 |      |50+rb                                                | +|ld d,r       | 4  | 1 |      |50+rb                                                | 
-|LD D,N       | 7  | 2 |      |16 XX                                                | +|ld d,N       | 7  | 2 |      |16 XX                                                | 
-|LD D,(HL)    | 7  | 1 |      |56          |                                          | +|ld d,(hl)    | 7  | 1 |      |56          |                                          | 
-|LD D,(IX+N)  | 19 | 3 |      |DD 56 XX    |                                          | +|ld d,(ix+n)  | 19 | 3 |      |DD 56 XX    |                                          | 
-|LD D,(IY+N)  | 19 | 3 |      |FD 56 XX    |                                          | +|ld d,(iy+n)  | 19 | 3 |      |FD 56 XX    |                                          | 
-|LD E,r       | 4  | 1 |      |58+rb                                                | +|ld e,r       | 4  | 1 |      |58+rb                                                | 
-|LD E,N       | 7  | 2 |      |1E XX                                                | +|ld e,N       | 7  | 2 |      |1E XX                                                | 
-|LD E,(HL)    | 7  | 1 |      |5E          |                                          | +|ld e,(hl)    | 7  | 1 |      |5E          |                                          | 
-|LD E,(IX+N)  | 19 | 3 |      |DD 5E XX    |                                          | +|ld e,(ix+n)  | 19 | 3 |      |DD 5E XX    |                                          | 
-|LD E,(IY+N)  | 19 | 3 |      |FD 5E XX    |                                          | +|ld e,(iy+n)  | 19 | 3 |      |FD 5E XX    |                                          | 
-|LD H,r       | 4  | 1 |      |60+rb                                                | +|ld h,r       | 4  | 1 |      |60+rb                                                | 
-|LD H,N       | 7  | 2 |      |26 XX                                                | +|ld h,N       | 7  | 2 |      |26 XX                                                | 
-|LD H,(HL)    | 7  | 1 |      |66          |                                          | +|ld h,(hl)    | 7  | 1 |      |66          |                                          | 
-|LD H,(IX+N)  | 19 | 3 |      |DD 66 XX    |                                          | +|ld h,(ix+n)  | 19 | 3 |      |DD 66 XX    |                                          | 
-|LD H,(IY+N)  | 19 | 3 |      |FD 66 XX    |                                          | +|ld h,(iy+n)  | 19 | 3 |      |FD 66 XX    |                                          | 
-|LD L,r       | 4  | 1 |      |68+rb                                                | +|ld l,r       | 4  | 1 |      |68+rb                                                | 
-|LD L,N       | 7  | 2 |      |2E XX                                                | +|ld l,N       | 7  | 2 |      |2E XX                                                | 
-|LD L,(HL)    | 7  | 1 |      |6E          |                                          | +|ld l,(hl)    | 7  | 1 |      |6E          |                                          | 
-|LD L,(IX+N)  | 19 | 3 |      |DD 6E XX    |                                          | +|ld l,(ix+n)  | 19 | 3 |      |DD 6E XX    |                                          | 
-|LD L,(IY+N)  | 19 | 3 |      |FD 6E XX    |                                          | +|ld l,(iy+n)  | 19 | 3 |      |FD 6E XX    |                                          | 
-|LD BC,(NN)   | 20 | 4 |------|ED 4B XX XX |Load (16-bit)        |dst=src               | +|ld bc,(NN)   | 20 | 4 |------|ED 4B XX XX |Load (16-bit)        |dst=src               | 
-|LD BC,NN     | 10 | 3 |      |01 XX XX    |                                          | +|ld bc,NN     | 10 | 3 |      |01 XX XX    |                                          | 
-|LD DE,(NN)   | 20 | 4 |      |ED 5B XX XX |                                          | +|ld de,(NN)   | 20 | 4 |      |ED 5B XX XX |                                          | 
-|LD DE,NN     | 10 | 3 |      |11 XX XX    |                                          | +|ld de,NN     | 10 | 3 |      |11 XX XX    |                                          | 
-|LD HL,(NN)   | 20 | 3 |      |2A XX XX    |                                          | +|ld hl,(NN)   | 20 | 3 |      |2A XX XX    |                                          | 
-|LD HL,NN     | 10 | 3 |      |21 XX XX    |                                          | +|ld hl,NN     | 10 | 3 |      |21 XX XX    |                                          | 
-|LD SP,(NN)   | 20 | 4 |      |ED 7B XX XX |                                          | +|ld sp,(NN)   | 20 | 4 |      |ED 7B XX XX |                                          | 
-|LD SP,HL     | 6  | 1 |      |F9          |                                          | +|ld sp,hl     | 6  | 1 |      |F9          |                                          | 
-|LD SP,IX     | 10 | 2 |      |DD F9                                                | +|ld sp,ix     | 10 | 2 |      |DD F9                                                | 
-|LD SP,IY     | 10 | 2 |      |FD F9                                                | +|ld sp,iy     | 10 | 2 |      |FD F9                                                | 
-|LD SP,NN     | 10 | 3 |      |31 XX XX    |                                          | +|ld sp,NN     | 10 | 3 |      |31 XX XX    |                                          | 
-|LD IX,(NN)   | 20 | 4 |      |DD 2A XX XX |                                          | +|ld ix,(NN)   | 20 | 4 |      |DD 2A XX XX |                                          | 
-|LD IX,NN     | 14 | 4 |      |DD 21 XX XX |                                          | +|ld ix,NN     | 14 | 4 |      |DD 21 XX XX |                                          | 
-|LD IY,(NN)   | 20 | 4 |      |FD 2A XX XX |                                          | +|ld iy,(NN)   | 20 | 4 |      |FD 2A XX XX |                                          | 
-|LD IY,NN     | 14 | 4 |      |FD 21 XX XX |                                          | +|ld iy,NN     | 14 | 4 |      |FD 21 XX XX |                                          | 
-|LD (HL),r    | 7  | 1 |------|70+rb       |Load (Indirect)      |dst=src               | +|ld (hl),r    | 7  | 1 |------|70+rb       |Load (Indirect)      |dst=src               | 
-|LD (HL),N    | 10 | 2 |      |36 XX                                                | +|ld (hl),N    | 10 | 2 |      |36 XX                                                | 
-|LD (BC),   | 7  | 1 |      |02          |                                          | +|ld (bc),   | 7  | 1 |      |02          |                                          | 
-|LD (DE),   | 7  | 1 |      |12          |                                          | +|ld (de),   | 7  | 1 |      |12          |                                          | 
-|LD (NN),   | 13 | 3 |      |32 XX XX    |                                          | +|ld (NN),   | 13 | 3 |      |32 XX XX    |                                          | 
-|LD (NN),BC   | 20 | 4 |      |ED 43 XX XX |                                          | +|ld (NN),bc   | 20 | 4 |      |ED 43 XX XX |                                          | 
-|LD (NN),DE   | 20 | 4 |      |ED 53 XX XX |                                          | +|ld (NN),de   | 20 | 4 |      |ED 53 XX XX |                                          | 
-|LD (NN),HL   | 16 | 3 |      |22 XX XX    |                                          | +|ld (NN),hl   | 16 | 3 |      |22 XX XX    |                                          | 
-|LD (NN),IX   | 20 | 4 |      |DD 22 XX XX |                                          | +|ld (NN),ix   | 20 | 4 |      |DD 22 XX XX |                                          | 
-|LD (NN),IY   | 20 | 4 |      |FD 22 XX XX |                                          | +|ld (NN),iy   | 20 | 4 |      |FD 22 XX XX |                                          | 
-|LD (NN),SP   | 20 | 4 |      |ED 73 XX XX |                                          | +|ld (NN),sp   | 20 | 4 |      |ED 73 XX XX |                                          | 
-|LD (IX+N),r  | 19 | 3 |      |DD 70+rb XX |                                          | +|ld (ix+n),r  | 19 | 3 |      |DD 70+rb XX |                                          | 
-|LD (IX+N),N  | 19 | 4 |      |DD 36 XX XX |                                          | +|ld (ix+n),N  | 19 | 4 |      |DD 36 XX XX |                                          | 
-|LD (IY+N),r  | 19 | 3 |      |FD 70+rb XX |                                          | +|ld (iy+n),r  | 19 | 3 |      |FD 70+rb XX |                                          | 
-|LD (IY+N),N  | 19 | 4 |      |FD 36 XX XX |                                          |+|ld (iy+n),N  | 19 | 4 |      |FD 36 XX XX |                                          |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|LDD          | 16 | 2 |--0*0-|ED A8       |Load and Decrement   |(DE)=(HL),HL=HL-1,#   | +|ldd          | 16 | 2 |--0*0-|ED A8       |Load and Decrement   |(DE)=(HL),HL=HL-1,#   | 
-|LDDR         |21/1| 2 |--000-|ED B8       |Load, Dec., Repeat   |LDD till BC=0         | +|lddr         |21/1| 2 |--000-|ED B8       |Load, Dec., Repeat   |ldd till BC=0         | 
-|LDI          | 16 | 2 |--0*0-|ED A0       |Load and Increment   |(DE)=(HL),HL=HL+1,#   | +|ldi          | 16 | 2 |--0*0-|ED A0       |Load and Increment   |(DE)=(HL),HL=HL+1,#   | 
-|LDIR         |21/1| 2 |--000-|ED B0       |Load, Inc., Repeat   |LDI till BC=0         |+|ldir         |21/1| 2 |--000-|ED B0       |Load, Inc., Repeat   |ldi till BC=0         |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|NEG          | 8  | 2 |***V1*|ED 44       |Negate               |A=-A                  |+|neg          | 8  | 2 |***V1*|ED 44       |Negate               |A=-A                  |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|NOP          | 4  | 1 |------|00          |No Operation                              |+|nop          | 4  | 1 |------|00          |No Operation                              |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|OR r         | 4  | 1 |***P00|B0+rb       |Logical inclusive OR |A=Avs                 | +|or r         | 4  | 1 |***P00|B0+rb       |Logical inclusive OR |A=Avs                 | 
-|OR N         | 7  | 2 |      |F6 XX                                                | +|or N         | 7  | 2 |      |F6 XX                                                | 
-|OR (HL)      | 7  | 1 |      |B6          |                                          | +|or (hl)      | 7  | 1 |      |B6          |                                          | 
-|OR (IX+N)    | 19 | 3 |      |DD B6 XX    |                                          | +|or (ix+n)    | 19 | 3 |      |DD B6 XX    |                                          | 
-|OR (IY+N)    | 19 | 3 |      |FD B6 XX    |                                          |+|or (iy+n)    | 19 | 3 |      |FD B6 XX    |                                          |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|OUT (N),   | 11 | 2 |------|D3 XX       |Output               |(n)=A                 | +|out (N),   | 11 | 2 |------|D3 XX       |Output               |(n)=A                 | 
-|OUT (C),0    | 12 | 2 |------|ED 71       |Output*              |         (Unsupported)| +|out (c),0    | 12 | 2 |------|ED 71       |Output*              |         (Unsupported)| 
-|OUT (C),   | 12 | 2 |------|ED 79       |Output               |(C)=r                 | +|out (c),   | 12 | 2 |------|ED 79       |Output               |(C)=r                 | 
-|OUT (C),   | 12 | 2 |      |ED 41                                                | +|out (c),   | 12 | 2 |      |ED 41                                                | 
-|OUT (C),   | 12 | 2 |      |ED 49                                                | +|out (c),   | 12 | 2 |      |ED 49                                                | 
-|OUT (C),   | 12 | 2 |      |ED 51                                                | +|out (c),   | 12 | 2 |      |ED 51                                                | 
-|OUT (C),   | 12 | 2 |      |ED 59                                                | +|out (c),   | 12 | 2 |      |ED 59                                                | 
-|OUT (C),   | 12 | 2 |      |ED 61                                                | +|out (c),   | 12 | 2 |      |ED 61                                                | 
-|OUT (C),   | 12 | 2 |      |ED 69                                                |+|out (c),   | 12 | 2 |      |ED 69                                                |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|OUTD         | 16 | 2 |?*??1-|ED AB       |Output and Decrement |(C)=(HL),HL=HL-1,B=B-1| +|outd         | 16 | 2 |?*??1-|ED AB       |Output and Decrement |(C)=(HL),HL=HL-1,B=B-1| 
-|OTDR         |21/1| 2 |?1??1-|ED BB       |Output, Dec., Repeat |OUTD till B=0         | +|otdr         |21/1| 2 |?1??1-|ED BB       |Output, Dec., Repeat |outd till B=0         | 
-|OUTI         | 16 | 2 |?*??1-|ED A3       |Output and Increment |(C)=(HL),HL=HL+1,B=B-1| +|outi         | 16 | 2 |?*??1-|ED A3       |Output and Increment |(C)=(HL),HL=HL+1,B=B-1| 
-|OTIR         |21/1| 2 |?1??1-|ED B3       |Output, Inc., Repeat |OUTI till B=0         |+|otir         |21/1| 2 |?1??1-|ED B3       |Output, Inc., Repeat |outi till B=0         |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|POP AF       | 10 | 1 |------|F1          |Pop                  |qq=(SP)+              | +|pop af       | 10 | 1 |------|F1          |Pop                  |qq=(SP)+              | 
-|POP BC       | 10 | 1 |      |C1          |                                          | +|pop bc       | 10 | 1 |      |C1          |                                          | 
-|POP DE       | 10 | 1 |      |D1          |                                          | +|pop de       | 10 | 1 |      |D1          |                                          | 
-|POP HL       | 10 | 1 |      |E1          |                                          | +|pop hl       | 10 | 1 |      |E1          |                                          | 
-|POP IX       | 14 | 2 |------|DD E1       |Pop                  |xx=(SP)+              | +|pop ix       | 14 | 2 |------|DD E1       |Pop                  |xx=(SP)+              | 
-|POP IY       | 14 | 2 |      |FD E1                                                | +|pop iy       | 14 | 2 |      |FD E1                                                | 
-|PUSH AF      | 11 | 1 |------|F5          |Push                 |-(SP)=qq              | +|push af      | 11 | 1 |------|F5          |Push                 |-(SP)=qq              | 
-|PUSH BC      | 11 | 1 |      |C5          |                                          | +|push bc      | 11 | 1 |      |C5          |                                          | 
-|PUSH DE      | 11 | 1 |      |D5          |                                          | +|push de      | 11 | 1 |      |D5          |                                          | 
-|PUSH HL      | 11 | 1 |      |E5          |                                          | +|push hl      | 11 | 1 |      |E5          |                                          | 
-|PUSH IX      | 15 | 2 |------|DD E5       |Push                 |-(SP)=xx              | +|push ix      | 15 | 2 |------|DD E5       |Push                 |-(SP)=xx              | 
-|PUSH IY      | 15 | 2 |      |FD E5                                                |+|push iy      | 15 | 2 |      |FD E5                                                |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|RES b,r      | 8  | 2 |------|CB 80+8*b+rb|Reset bit            |m=m&{~2^b}            | +|res b,r      | 8  | 2 |------|CB 80+8*b+rb|Reset bit            |m=m&{~2^b}            | 
-|RES b,(HL)   | 15 | 2 |------|CB 86+8*b                                            | +|res b,(hl)   | 15 | 2 |------|CB 86+8*b                                            | 
-|RES b,(IX+N) | 23 | 4 |------|DD CB XX 86+8*b                                        | +|res b,(ix+N) | 23 | 4 |------|DD CB XX 86+8*b                                        | 
-|RES b,(IY+N) | 23 | 4 |------|FD CB XX 86+8*b                                        |+|res b,(iy+N) | 23 | 4 |------|FD CB XX 86+8*b                                        |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|RET          | 10 | 1 |------|C9          |Return               |PC=(SP)+              | +|ret          | 10 | 1 |------|C9          |Return               |PC=(SP)+              | 
-|RET C        |11/5| 1 |------|D8          |Conditional Return   |If Carry = 1          | +|ret c        |11/5| 1 |------|D8          |Conditional Return   |If Carry = 1          | 
-|RET NC       |11/5| 1 |      |D0          |                     |If Carry = 0          | +|ret nc       |11/5| 1 |      |D0          |                     |If Carry = 0          | 
-|RET M        |11/5| 1 |      |F8          |                     |If Sign = 1 (negative)| +|ret m        |11/5| 1 |      |F8          |                     |If Sign = 1 (negative)| 
-|RET P        |11/5| 1 |      |F0          |                     |If Sign = 0 (positive)| +|ret p        |11/5| 1 |      |F0          |                     |If Sign = 0 (positive)| 
-|RET Z        |11/5| 1 |      |C8          |                     |If Zero = 1 (ans.=0) +|ret z        |11/5| 1 |      |C8          |                     |If Zero = 1 (ans.=0) 
-|RET NZ       |11/5| 1 |      |C0          |                     |If Zero = 0 (non-zero)| +|ret nz       |11/5| 1 |      |C0          |                     |If Zero = 0 (non-zero)| 
-|RET PE       |11/5| 1 |      |E8          |                     |If Parity = 1 (even) +|ret pe       |11/5| 1 |      |E8          |                     |If Parity = 1 (even) 
-|RET PO       |11/5| 1 |      |E0          |                     |If Parity = 0 (odd)   |+|ret po       |11/5| 1 |      |E0          |                     |If Parity = 0 (odd)   |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|RETI         | 14 | 2 |------|ED 4D       |Return from Interrupt|PC=(SP)+              | +|reti         | 14 | 2 |------|ED 4D       |Return from Interrupt|PC=(SP)+              | 
-|RETN         | 14 | 2 |------|ED 45       |Return from NMI      |PC=(SP)+              |+|retn         | 14 | 2 |------|ED 45       |Return from NMI      |PC=(SP)+              |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|RLA          | 4  | 1 |--0-0*|17          |Rotate Left Acc.     |A={CY,A}<           | +|rla          | 4  | 1 |--0-0*|17          |Rotate Left Acc.     |A={CY,A}<           | 
-|RL r         | 8  | 2 |**0P0*|CB 10+rb    |Rotate Left          |m={CY,m}<           | +|rl r         | 8  | 2 |**0P0*|CB 10+rb    |Rotate Left          |m={CY,m}<           | 
-|RL (HL)      | 15 | 2 |      |CB 16                                                | +|rl (hl)      | 15 | 2 |      |CB 16                                                | 
-|RL (IX+N)    | 23 | 4 |      |DD CB XX 16 |                                          | +|rl (ix+n)    | 23 | 4 |      |DD CB XX 16 |                                          | 
-|RL (IY+N)    | 23 | 4 |      |FD CB XX 16 |                                          | +|rl (iy+n)    | 23 | 4 |      |FD CB XX 16 |                                          | 
-|RLCA         | 4  | 1 |--0-0*|07          |Rotate Left Cir. Acc.|A=A<                | +|rlca         | 4  | 1 |--0-0*|07          |Rotate Left Cir. Acc.|A=A<                | 
-|RLC r        | 8  | 2 |**0P0*|CB 00+rb    |Rotate Left Circular |m=m<                | +|rlc r        | 8  | 2 |**0P0*|CB 00+rb    |Rotate Left Circular |m=m<                | 
-|RLC (HL)     | 15 | 2 |      |CB 06                                                | +|rlc (hl)     | 15 | 2 |      |CB 06                                                | 
-|RLC (IX+N)   | 23 | 4 |      |DD CB XX 06 |                                          | +|rlc (ix+n)   | 23 | 4 |      |DD CB XX 06 |                                          | 
-|RLC (IY+N)   | 23 | 4 |      |FD CB XX 06 |                                          | +|rlc (iy+n)   | 23 | 4 |      |FD CB XX 06 |                                          | 
-|RLD          | 18 | 2 |**0P0-|ED 6F       |Rotate Left 4 bits   |{A,(HL)}={A,(HL)}<- ##| +|rld          | 18 | 2 |**0P0-|ED 6F       |Rotate Left 4 bits   |{A,(hl)}={A,(hl)}<- ##| 
-|RRA          | 4  | 1 |--0-0*|1F          |Rotate Right Acc.    |A=->{CY,A}            | +|rra          | 4  | 1 |--0-0*|1F          |Rotate Right Acc.    |A=->{CY,A}            | 
-|RR r         | 8  | 2 |**0P0*|CB 18+rb    |Rotate Right         |m=->{CY,m}            | +|rr r         | 8  | 2 |**0P0*|CB 18+rb    |Rotate Right         |m=->{CY,m}            | 
-|RR (HL)      | 15 | 2 |      |CB 1E                                                | +|rr (hl)      | 15 | 2 |      |CB 1E                                                | 
-|RR (IX+N)    | 23 | 4 |      |DD CB XX 1E |                                          | +|rr (ix+n)    | 23 | 4 |      |DD CB XX 1E |                                          | 
-|RR (IY+N)    | 23 | 4 |      |FD CB XX 1E |                                          | +|rr (iy+n)    | 23 | 4 |      |FD CB XX 1E |                                          | 
-|RRCA         | 4  | 1 |--0-0*|0F          |Rotate Right Cir.Acc.|A=->                | +|rrca         | 4  | 1 |--0-0*|0F          |Rotate Right Cir.Acc.|A=->                | 
-|RRC r        | 8  | 2 |**0P0*|CB 08+rb    |Rotate Right Circular|m=->                | +|rrc r        | 8  | 2 |**0P0*|CB 08+rb    |Rotate Right Circular|m=->                | 
-|RRC (HL)     | 15 | 2 |      |CB 0E                                                | +|rrc (hl)     | 15 | 2 |      |CB 0E                                                | 
-|RRC (IX+N)   | 23 | 4 |      |DD CB XX 0E |                                          | +|rrc (ix+n)   | 23 | 4 |      |DD CB XX 0E |                                          | 
-|RRC (IY+N)   | 23 | 4 |      |FD CB XX 0E |                                          | +|rrc (iy+n)   | 23 | 4 |      |FD CB XX 0E |                                          | 
-|RRD          | 18 | 2 |**0P0-|ED 67       |Rotate Right 4 bits  |{A,(HL)}=->{A,(HL)} ##|+|rrd          | 18 | 2 |**0P0-|ED 67       |Rotate Right 4 bits  |{A,(hl)}=->{A,(hl)} ##|
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|RST 0        | 11 | 1 |------|C7          |Restart              | (p=0H,8H,10H,...,38H)| +|rst 0        | 11 | 1 |------|C7          |Restart              | (p=0H,8H,10H,...,38H)| 
-|RST 08H      | 11 | 1 |      |CF          |                                          | +|rst 08H      | 11 | 1 |      |CF          |                                          | 
-|RST 10H      | 11 | 1 |      |D7          |                                          | +|rst 10H      | 11 | 1 |      |D7          |                                          | 
-|RST 18H      | 11 | 1 |      |DF          |                                          | +|rst 18H      | 11 | 1 |      |DF          |                                          | 
-|RST 20H      | 11 | 1 |      |E7          |                                          | +|rst 20H      | 11 | 1 |      |E7          |                                          | 
-|RST 28H      | 11 | 1 |      |EF          |                                          | +|rst 28H      | 11 | 1 |      |EF          |                                          | 
-|RST 30H      | 11 | 1 |      |F7          |                                          | +|rst 30H      | 11 | 1 |      |F7          |                                          | 
-|RST 38H      | 11 | 1 |      |FF          |                                          |+|rst 38H      | 11 | 1 |      |FF          |                                          |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|SBC r        | 4  | 1 |***V1*|98+rb       |Subtract with Carry  |A=A-s-CY              | +|sbc r        | 4  | 1 |***V1*|98+rb       |Subtract with Carry  |A=A-s-CY              | 
-|SBC A,N      | 7  | 2 |      |DE XX                                                | +|sbc a,N      | 7  | 2 |      |DE XX                                                | 
-|SBC (HL)     | 7  | 1 |      |9E          |                                          | +|sbc (hl)     | 7  | 1 |      |9E          |                                          | 
-|SBC A,(IX+N) | 19 | 3 |      |DD 9E XX    |                                          | +|sbc a,(ix+n) | 19 | 3 |      |DD 9E XX    |                                          | 
-|SBC A,(IY+N) | 19 | 3 |      |FD 9E XX    |                                          | +|sbc a,(iy+n) | 19 | 3 |      |FD 9E XX    |                                          | 
-|SBC HL,BC    | 15 | 2 |**?V1*|ED 42       |Subtract with Carry  |HL=HL-ss-CY           | +|sbc hl,bc    | 15 | 2 |**?V1*|ED 42       |Subtract with Carry  |HL=HL-ss-CY           | 
-|SBC HL,DE    | 15 | 2 |      |ED 52                                                | +|sbc hl,de    | 15 | 2 |      |ED 52                                                | 
-|SBC HL,HL    | 15 | 2 |      |ED 62                                                | +|sbc hl,hl    | 15 | 2 |      |ED 62                                                | 
-|SBC HL,SP    | 15 | 2 |      |ED 72                                                |+|sbc hl,sp    | 15 | 2 |      |ED 72                                                |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|SCF          | 4  | 1 |--0-01|37          |Set Carry Flag       |CY=1                  |+|scf          | 4  | 1 |--0-01|37          |Set Carry Flag       |CY=1                  |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|SET b,r      | 8  | 2 |------|CB C0+8*b+rb|Set bit              |m=mv{2^b}             | +|set b,r      | 8  | 2 |------|CB C0+8*b+rb|Set bit              |m=mv{2^b}             | 
-|SET b,(HL)   | 15 | 2 |      |CB C6+8*b                                            | +|set b,(hl)   | 15 | 2 |      |CB C6+8*b                                            | 
-|SET b,(IX+N) | 23 | 4 |      |DD CB XX C6+8*b                                        | +|set b,(ix+N) | 23 | 4 |      |DD CB XX C6+8*b                                        | 
-|SET b,(IY+N) | 23 | 4 |      |FD CB XX C6+8*b                                        |+|set b,(iy+N) | 23 | 4 |      |FD CB XX C6+8*b                                        |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|SLA r        | 8  | 2 |**0P0*|CB 20+rb    |Shift Left Arithmetic|m=m*2                 | +|sla r        | 8  | 2 |**0P0*|CB 20+rb    |Shift Left Arithmetic|m=m*2                 | 
-|SLA (HL)     | 15 | 2 |      |CB 26                                                | +|sla (hl)     | 15 | 2 |      |CB 26                                                | 
-|SLA (IX+N)   | 23 | 4 |      |DD CB XX 26 |                                          | +|sla (ix+n)   | 23 | 4 |      |DD CB XX 26 |                                          | 
-|SLA (IY+N)   | 23 | 4 |      |FD CB XX 26 |                                          | +|sla (iy+n)   | 23 | 4 |      |FD CB XX 26 |                                          | 
-|SRA r        | 8  | 2 |**0P0*|CB 28+rb    |Shift Right Arith.   |m=m/                | +|sra r        | 8  | 2 |**0P0*|CB 28+rb    |Shift Right Arith.   |m=m/                | 
-|SRA (HL)     | 15 | 2 |      |CB 2E                                                | +|sra (hl)     | 15 | 2 |      |CB 2E                                                | 
-|SRA (IX+N)   | 23 | 4 |      |DD CB XX 2E |                                          | +|sra (ix+n)   | 23 | 4 |      |DD CB XX 2E |                                          | 
-|SRA (IY+N)   | 23 | 4 |      |FD CB XX 2E |                                          |+|sra (iy+n)   | 23 | 4 |      |FD CB XX 2E |                                          |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|SLL r        | 8  | 2 |**0P0*|CB 30+rb    |Shift Left Logical*  |m={0,m,CY}<         | +|sll r        | 8  | 2 |**0P0*|CB 30+rb    |Shift Left Logical*  |m={0,m,CY}<         | 
-|SLL (HL)     | 15 | 2 |      |CB 36                            (SLL instructions   | +|sll (hl)     | 15 | 2 |      |CB 36                            (SLL instructions   | 
-|SLL (IX+N)   | 23 | 4 |      |DD CB XX 36 |                         are Unsupported) | +|sll (ix+n)   | 23 | 4 |      |DD CB XX 36 |                         are Unsupported) | 
-|SLL (IY+N)   | 23 | 4 |      |FD CB XX 36 |                                          | +|sll (iy+n)   | 23 | 4 |      |FD CB XX 36 |                                          | 
-|SRL r        | 8  | 2 |**0P0*|CB 38+rb    |Shift Right Logical  |m=->{0,m,CY}          | +|srl r        | 8  | 2 |**0P0*|CB 38+rb    |Shift Right Logical  |m=->{0,m,CY}          | 
-|SRL (HL)     | 15 | 2 |      |CB 3E                                                | +|srl (hl)     | 15 | 2 |      |CB 3E                                                | 
-|SRL (IX+N)   | 23 | 4 |      |DD CB XX 3E |                                          | +|srl (ix+n)   | 23 | 4 |      |DD CB XX 3E |                                          | 
-|SRL (IY+N)   | 23 | 4 |      |FD CB XX 3E |                                          |+|srl (iy+n)   | 23 | 4 |      |FD CB XX 3E |                                          |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|SUB r        | 4  | 1 |***V1*|90+rb       |Subtract             |A=A-s                 | +|sub r        | 4  | 1 |***V1*|90+rb       |Subtract             |A=A-s                 | 
-|SUB N        | 7  | 2 |      |D6 XX                                                | +|sub N        | 7  | 2 |      |D6 XX                                                | 
-|SUB (HL)     | 7  | 1 |      |96          |                                          | +|sub (hl)     | 7  | 1 |      |96          |                                          | 
-|SUB (IX+N)   | 19 | 3 |      |DD 96 XX    |                                          | +|sub (ix+n)   | 19 | 3 |      |DD 96 XX    |                                          | 
-|SUB (IY+N)   | 19 | 3 |      |FD 96 XX    |                                          |+|sub (iy+n)   | 19 | 3 |      |FD 96 XX    |                                          |
 +-------------+----+---+------+------------+---------------------+----------------------+ +-------------+----+---+------+------------+---------------------+----------------------+
-|XOR r        | 4  | 1 |***P00|A8+rb       |Logical Exclusive OR |A=Axs                 | +|xor r        | 4  | 1 |***P00|A8+rb       |Logical Exclusive OR |A=Axs                 | 
-|XOR N        | 7  | 2 |      |EE XX                                                | +|xor N        | 7  | 2 |      |EE XX                                                | 
-|XOR (HL)     | 7  | 1 |      |AE          |                                          | +|xor (hl)     | 7  | 1 |      |AE          |                                          | 
-|XOR (IX+N)   | 19 | 3 |      |DD AE XX    |                                          | +|xor (ix+n)   | 19 | 3 |      |DD AE XX    |                                          | 
-|XOR (IY+N)   | 19 | 3 |      |FD AE XX    |                                          |+|xor (iy+n)   | 19 | 3 |      |FD AE XX    |                                          |
 --------------+----+---+------+------------+---------------------+----------------------- --------------+----+---+------+------------+---------------------+-----------------------
  
Línea 689: Línea 681:
 | cc            |Condition (C,M,NC,NZ,P,PE,PO,Z)              | | cc            |Condition (C,M,NC,NZ,P,PE,PO,Z)              |
 | d             |One-byte expression (-128 to +127)           | | d             |One-byte expression (-128 to +127)           |
-| dst           |Destination s, ss, (BC), (DE), (HL), (nn)    |+| dst           |Destination s, ss, (BC), (de), (HL), (nn)    |
 | e             |One-byte expression (-126 to +129)           | | e             |One-byte expression (-126 to +129)           |
-| m             |Any register r, (HL) or (xx+d)               |+| m             |Any register r, (hl) or (xx+d)               |
 | n             |One-byte expression (0 to 255)               | | n             |One-byte expression (0 to 255)               |
 | nn            |Two-byte expression (0 to 65535)             | | nn            |Two-byte expression (0 to 65535)             |
 | pp            |Register pair BC, DE, IX or SP               | | pp            |Register pair BC, DE, IX or SP               |
-| qq            |Register pair AF, BC, DE or HL               | +| qq            |Register pair AF, BC, de or HL               | 
-| qq'           |Alternative register pair AF, BC, DE or HL   |+| qq'           |Alternative register pair AF, BC, de or HL   |
 | r             |Register A, B, C, D, E, H or L               | | r             |Register A, B, C, D, E, H or L               |
 | rr            |Register pair BC, DE, IY or SP               | | rr            |Register pair BC, DE, IY or SP               |
-| s             |Any register r, value n, (HL) or (xx+d)      | +| s             |Any register r, value n, (hl) or (xx+d)      | 
-| src           |Source s, ss, (BC), (DE), (HL), nn, (nn)     | +| src           |Source s, ss, (BC), (de), (HL), nn, (nn)     | 
-| ss            |Register pair BC, DE, HL or SP               |+| ss            |Register pair BC, DE, hl or SP               |
 | xx            |Index register IX or IY                      | | xx            |Index register IX or IY                      |
 | +  -  *  /  ^ |Add/subtract/multiply/divide/exponent        | | +  -  *  /  ^ |Add/subtract/multiply/divide/exponent        |
Línea 716: Línea 708:
  Unos apuntes sobre esta tabla:  Unos apuntes sobre esta tabla:
  
-1.- En instrucciones como "ADC A, rpodemos ver una defición del OPCODE como "88+rb". +1.- En instrucciones como ''adc a, r'' podemos ver una defición del OPCODE como "$88+rb". En este caso, el opcode final se obtendría sumando a "$88" un valor de 0 a 7 según el registro al que nos referimos:
-En este caso, el opcode final se obtendría sumando a "88h" un valor de 0 a 7 según +
-el registro al que nos referimos:+
  
-^ Registro ^ Valor RB ^+|< 40% 50% 50% >| 
 +^ Registro ^ Valor rb ^
 | A | 7 | | A | 7 |
 | B | 0 | | B | 0 |
Línea 730: Línea 721:
 | (HL) | 6 | | (HL) | 6 |
  
- Por ejemplo, "ADC AB" se codificaría en memoria como "88+0=88".+ Por ejemplo, ''adc ab'' se codificaría en memoria como "$88+0=$88".
  
  
-2.- En los saltos hay 2 tiempos de ejecución diferentes (por ejemplo, 10/1). En este +2.- En los saltos hay 2 tiempos de ejecución diferentes (por ejemplo, 10/1). En este caso el valor más alto (10) son los t-estados o ciclos que toma la instrucción cuando el salto se realiza, y el más bajo (1) es lo que tarda la instrucción cuando no se salta al destino. Como véis, a la hora de programar una rutina que tenga saltos o bifurcaciones, es interesante programarla de forma que el caso más común, el que se produzca la mayoría de las veces, no produzca un salto.
-caso el valor más alto (10) son los t-estados o ciclos que toma la instrucción cuando +
-el salto se realiza, y el más bajo (1) es lo que tarda la instrucción cuando no se +
-salta al destino. Como véis, a la hora de programar una rutina que tenga saltos o +
-bifurcaciones, es interesante programarla de forma que el caso más común, el que se +
-produzca la mayoría de las veces, no produzca un salto.+
  
 3.- La descripción de las afectaciones de flags son las siguientes: 3.- La descripción de las afectaciones de flags son las siguientes:
Línea 757: Línea 743:
 ===== Instrucciones no documentadas del Z80 ===== ===== Instrucciones no documentadas del Z80 =====
  
- En Internet podemos encontrar gran cantidad de documentación acerca del Z80 + En Internet podemos encontrar gran cantidad de documentación acerca del Z80 y su juego de instrucciones, incluyendo las especificaciones oficiales del microprocesador Z80 de Zilog.
-y su juego de instrucciones, incluyendo las especificaciones oficiales del +
-microprocesador Z80 de Zilog. +
  
- No obstante, existen una serie de instrucciones u opcodes que el microprocesador + No obstante, existen una serie de instrucciones u opcodes que el microprocesador puede ejecutar y que no están detallados en la documentación oficial de Zilog. Con respecto a esto, tenemos la suerte de disponer de algo que los programadores de la época del Spectrum no tenían: una descripción detallada de las instrucciones no documentadas del Z80. Aunque la mayoría son instrucciones repetidas de sus versiones documentadas, hay algunas instrucciones curiosas y a las que tal vez le podamos sacar alguna utilidad.
-puede ejecutar y que no están detallados en la documentación oficial de Zilog. +
-Con respecto a esto, tenemos la suerte de disponer de algo que los programadores +
-de la época del Spectrum no tenían: una descripción detallada de las instrucciones +
-no documentadas del Z80. Aunque la mayoría son instrucciones repetidas de sus +
-versiones documentadas, hay algunas instrucciones curiosas y a las que tal vez +
-le podamos sacar alguna utilidad. +
  
- ¿Por qué existen estos opcodes y no fueron documentados? Supongo que algunos de + ¿Por qué existen estos opcodes y no fueron documentados? Supongo que algunos de ellos no fueron considerados como "merecedores de utilidad alguna" y los ingenieros de Zilog no los documentaron, o tal vez sean simplemente un resultado no previsto de la ejecución del Z80 porque los diseñadores no pensaron que al microprocesador pudieran llegarle dichos códigos. El caso es que para el microprocesador existen "todos" los opcodes, otra cosa es qué haga al leerlos y decodificarlos. En este caso algunos de ellos realizan funciones válidas mientras que otros son el equivalente a ejecutar 2 instrucciones ''NOP'', por ejemplo.
-ellos no fueron considerados como "merecedores de utilidad alguna" y los ingenieros +
-de Zilog no los documentaron, o tal vez sean simplemente un resultado no previsto +
-de la ejecución del Z80 porque los diseñadores no pensaron que al microprocesador +
-pudieran llegarle dichos códigos. El caso es que para el microprocesador existen +
-"todos" los opcodes, otra cosa es qué haga al leerlos y decodificarlos. En este +
-caso algunos de ellos realizan funciones válidas mientras que otros son el equivalente +
-a ejecutar 2 instrucciones NOP, por ejemplo.+
  
- ¿Cuál es la utilidad de estas instrucciones para los programadores? Para ser + ¿Cuál es la utilidad de estas instrucciones para los programadores? Para ser sinceros, como programadores con un ensamblador o un ensamblador cruzado, poca. Si haces tus programas desde cero con un programa ensamblador, éste se encargará de la conversión de instrucciones estándar a opcodes, aunque no viene mal conocer la existencia de estas instrucciones. Para los programadores de emuladores y de desensambladores, el conocimiento de estos opcodes es vital.
-sinceros, como programadores con un ensamblador o un ensamblador cruzado, poca. +
-Si haces tus programas desde cero con un programa ensamblador, éste se encargará +
-de la conversión de instrucciones estándar a opcodes, aunque no viene mal conocer +
-la existencia de estas instrucciones. Para los programadores de emuladores y de +
-desensambladores, el conocimiento de estos opcodes es vital.+
  
- El juego Sabre Wulf, por ejemplo, utiliza una de estas instrucciones en la determinación + El juego Sabre Wulf, por ejemplo, utiliza una de estas instrucciones en la determinación del camino de uno de los enemigos en pantalla (la instrucción SLL, que veremos a continuación), hasta el punto en que los primeros emuladores de Spectrum emulaban mal este juego hasta que incluyeron dicha instrucción en la emulación.
-del camino de uno de los enemigos en pantalla (la instrucción SLL, que veremos a +
-continuación), hasta el punto en que los primeros emuladores de Spectrum emulaban +
-mal este juego hasta que incluyeron dicha instrucción en la emulación.+
  
- Los "//undocumented opcodes//" son esencialmente opcodes con prefijos CB, ED, DD o FD + Los "//undocumented opcodes//" son esencialmente opcodes con prefijos CB, ED, DD o FD que hacen unas determinadas operaciones y que no están incluídos en la "lista oficial" que hemos visto hasta ahora. Todos los ejemplos que veremos a continuación están extraídos del documento "The Undocumented Z80 Documented", de Sean Young.
-que hacen unas determinadas operaciones y que no están incluídos en la "lista oficial" +
-que hemos visto hasta ahora. Todos los ejemplos que veremos a continuación están +
-extraídos del documento "The Undocumented Z80 Documented", de Sean Young.+
  
 \\  \\ 
-==== Prefijo CB ====+==== Prefijo $CB ====
  
- Por ejemplo, los opcodes CB 30, CB 31, CB 32, CB 33, CB 34, CB 35, CB 36 y CB 37 + Por ejemplo, los opcodes $CB $30, $CB $31, $CB $32, $CB $33, $CB $34, $CB $35, $CB $36 y $CB $37 definen una nueva instrucción: **SLL**.
-definen una nueva instrucción: **SLL**.+
  
-^ OPCODE ^ INSTRUCCION ^  +|< 40% 50% 50% >| 
-| CB 30 | SLL B +^ OPCODE ^ INSTRUCCION ^ 
-| CB 31 | SLL C +$CB $30 | sll b 
-| CB 32 | SLL D +$CB $31 | sll c 
-| CB 33 | SLL E +$CB $32 | sll d 
-| CB 34 | SLL H +$CB $33 | sll e 
-| CB 35 | SLL L +$CB $34 | sll h 
-| CB 36 | SLL (HL) | +$CB $35 | sll l 
-| CB 37 | SLL A +$CB $36 | sll (hl) | 
 +$CB $37 | sll a |
  
- **SLL (Shift Logical Left)** funciona exactamente igual que SLA salvo porque pone a + ''SLL'' (Shift Logical Left) funciona exactamente igual que ''SLA'' salvo porque pone a 1 el bit 0 (mientras que sla lo ponía a 0).
-1 el bit 0 (mientras que SLA lo ponía a 0).+
  
 \\  \\ 
-==== Prefijos DD y FD ====+==== Prefijos $DD y $FD ====
  
- En general, una instrucción precedida por el opcode DD se ejecuta igual que sin él + En general, una instrucción precedida por el opcode ''$DD'' se ejecuta igual que sin él excepto por las siguientes reglas:
-excepto por las siguientes reglas:+
  
-  * Si la instrucción usaba el registro HL, éste se sustituye por IX (excepto en las instrucciones EX DEHL y EXX). +  * Si la instrucción usaba el registro HL, éste se sustituye por IX (excepto en las instrucciones ''ex dehl'' ''EXX''). 
-  * Cualquier uso de (HL) se reemplaza por (IX+d), excepto JP (HL). +  * Cualquier uso de (HL) se reemplaza por (IX+d), excepto ''jp (hl)''
-  * Cualquier acceso a H se reemplaza por IXh (byte alto de IX), excepto en el uso de (IX+d). +  * Cualquier acceso a H se reemplaza por IXh (byte alto de IX), excepto en el uso de (ix+d). 
-  * Cualquier acceso a L se reemplaza por IXl (byte alto de IX), excepto en el uso de (IX+d).+  * Cualquier acceso a L se reemplaza por IXl (byte alto de IX), excepto en el uso de (ix+d).
  
  Por ejemplo:  Por ejemplo:
  
-^ Sin el prefijo DD ^ Con el Prefijo DD ^  +|< 40% 50% 50% >| 
-LD HL, 0 | LD IX, 0 | +^ Sin el prefijo $DD ^ Con el Prefijo $DD ^ 
-LD HLD IXh+ld hl, 0 | ld ix, 0 | 
-LD H, (HL) | LD H, (IX+d) | +ld hld ixh
-     +ld h, (hl) | ld h, (ix+d) |
  
-El caso de FD es exactamente igual que el de DD, pero usando el registro IY en lugar del IX.+El caso de $FD es exactamente igual que el de $DD, pero usando el registro IY en lugar del IX.
  
 \\  \\ 
 ==== Prefijo ED ==== ==== Prefijo ED ====
  
- Hay una gran cantidad de instrucciones ED XX indocumentadas. Muchos de ellos realizan + Hay una gran cantidad de instrucciones ''$ED XX'' indocumentadas. Muchos de ellos realizan la misma función que sus equivalentes sin $ED delante, mientras que otros simplemente son leídos y decodificados, resultando, a niveles prácticos, equivalentes a 2 instrucciones ''NOP''. Veamos algunos de ellos:
-la misma función que sus equivalentes sin ED delante, mientras que otros simplemente +
-son leídos y decodificados, resultando, a niveles prácticos, equivalentes a 2 instrucciones +
-NOP. Veamos algunos de ellos:+
  
 +|< 40% 50% 50% >|
 ^ OPCODE ^ INSTRUCCION ^ ^ OPCODE ^ INSTRUCCION ^
-| ED 4C | NEG +$ED $4C | neg 
-| ED 4E | IM 0 | +$ED $4E | im 0 | 
-| ED 44 | NEG +$ED $44 | neg 
-| ED 45 | RETN +$ED $45 | retn 
-| ED 5C | NEG +$ED $5C | neg 
-| ED 5D | RETN +$ED $5D | retn 
-| ED 64 | NEG +$ED $64 | neg 
-| ED 65 | RETN +$ED $65 | retn 
-| ED 66 | IM 0 | +$ED $66 | im 0 | 
-| ED 6C | NEG +$ED $6C | neg 
-| ED 6D | RETN +$ED $6D | retn 
-| ED 6E | IM 0 | +$ED $6E | im 0 | 
-| ED 70 | IN (C) / IN F,(C) | +$ED $70 | in (c) / in f,(c) | 
-| ED 71 | OUT (C),0 | +$ED $71 | out (c),0 | 
-| ED 74 | NEG +$ED $74 | neg 
-| ED 75 | RETN +$ED $75 | retn 
-| ED 76 | IM1 +$ED $76 | im1 
-| ED 77 | NOP +$ED $77 | nop 
-| ED 7C | NEG +$ED $7C | neg 
-| ED 7D | RETN +$ED $7D | retn 
-| ED 7E | IM2 +$ED $7E | im2 
-| ED 7F | NOP | +$ED $7F | nop |
  
- Aparte de los duplicados de NOP, NEG, IM0, etc, podemos ver un par de instrucciones + Aparte de los duplicados de ''NOP''''NEG''''IM 0'', etc, podemos ver un par de instrucciones curiosas y que nos pueden ser de utilidad. Por ejemplo:
-curiosas y que nos pueden ser de utilidad. Por ejemplo:+
  
 <code> <code>
-ED 70       IN (C)+$ED $70       IN (C)
 </code> </code>
  
 + Esta instrucción lee el puerto C, pero no almacena el resultado de la lectura en ningún lugar. No obstante, altera los flags del registro F como corresponde al resultado leído. Puede ser interesante si sólo nos interesa, por ejemplo, si el valor leído es cero o no (flag Z), y no queremos perder un registro para almacenar el resultado.
  
- Esta instrucción lee el puerto C, pero no almacena el resultado de la lectura en 
-ningún lugar. No obstante, altera los flags del registro F como corresponde al 
-resultado leído. Puede ser interesante si sólo nos interesa, por ejemplo, si el 
-valor leído es cero o no (flag Z), y no queremos perder un registro para almacenar 
-el resultado. 
-  
  
 \\  \\ 
-==== Prefijos DDCB FDCB ====+==== Prefijos $DD $CB $FD $CB ====
  
- Las instrucciones DDCB FDCB no documentadas almacenan el resultado de la + Las instrucciones de prefijo "$DD $CB" "$FD $CB" no documentadas almacenan el resultado de la operación de la instrucción equivalente sin prefijo (si existe dicho resultado) en uno de los registros de propósito general: B, C, D, E, H, L, ninguno o A, según los 3 bits más bajos del último byte del opcode (000=B, 001=C, 010=D, etc).
-operación de la instrucción equivalente sin prefijo (si existe dicho resultado) +
-en uno de los registros de propósito general: B, C, D, E, H, L, ninguno o A, +
-según los 3 bits más bajos del último byte del opcode (000=B, 001=C, 010=D, etc).+
  
  Así, supongamos el siguiente opcode sí documentado:  Así, supongamos el siguiente opcode sí documentado:
  
 <code> <code>
- DD CB 01 06         RLC (IX+01h)+$DD $CB $01 $06         rlc (ix+$01)
 </code> </code>
  
- Si hacemos los 3 últimos bits de dicho opcode 010 (010), el resultado de la  + Si hacemos los 3 últimos bits de dicho opcode 010 (010), el resultado de la operación se copia al registro D (010 = D en nuestra definición anterior), con lo que realmente, en lugar de ''rlc (ix+$01)'' se ejecuta:
-operación se copia al registro D (010 = D en nuestra definición anterior), con +
-lo que realmente, en lugar de "RLC (IX+01h)se ejecuta:+
  
 <code z80> <code z80>
- LD D, (IX+01h+ld d, (ix+$01
- RLC D +rlc d 
- LD (IX+01h), D+ld (ix+$01), d
 </code> </code>
  
- La notación que sugiere //Sean Young// para estos opcodes es: "RLC (IX+01h), D".+ La notación que sugiere //Sean Young// para estos opcodes es: ''rlc (ix+$01), d''".
  
 + Con el prefijo $FD $CB ocurre igual que con $DD $CB, salvo que se usa el registro IY en lugar de IX.
  
- Con el prefijo FDCB ocurre igual que con DDCBsalvo que se usa el registro IY +\\  
-en lugar de IX.+===== Ortogonalidad del juego de instrucciones ===== 
 + 
 + Como ya se ha comentado anteriormente, el juego de instrucciones del Z80 no es ortogonal, es decir, todas las instrucciones no están definidas para trabajar con todos los operandos/registros. 
 + 
 + Es muy probable que en algún momento estemos programando, escribamos ''ld bc, de'', y nuestro programa ensamblador nos indique con un error que dicha instrucción no existe. ¿Por quési parece una instrucción básica? Mover el valor de DE a BC, por ejemplo para preparar un bucle. 
 + 
 + El motivo es muy sencillo: el Z80 es una CPU de 8 bits, y por simplicidad interna de su microcódigo, sencillamente no tiene espacio y capacidad para alojar todas las combinaciones de instrucciones y operandos. Esto hubiera encarecido el procesador y su diseño al tener que añadir más prefijos de opcodes y más microcódigo para ejecutarlos. 
 + 
 + No obstante, podemos simular muchas de estas "operaciones no existentes" con alternativas. Por ejemplo: 
 + 
 +<code z80> 
 +ld hl, de      ; Esta instruccion no existe en Z80 
 +</code> 
 + 
 +No podemos hacer esto, pero sí que podemos hacer lo siguiente: 
 + 
 +<code z80> 
 +push de 
 +pop hl 
 +</code> 
 + 
 +O, mejor aún, algo más eficiente: 
 + 
 +<code z80> 
 +ld h, d 
 +ld l, e 
 +</code> 
 + 
 +Estas soluciones alternativas son tan comunes que incluso algunos ensambladores como **sjasmplus** aceptarán ''ld hl, de'' y a la hora de realizar el proceso de ensamblado sustituirán la instrucción por el par de LD's de 8 bits que acabamos de ver. 
 + 
 +Estas instrucciones "no permitidas" pero "transformadas" son conocidas en **sjasmplus** como "**Fake Instructions**". Cuando sjasmplus encuentra un ''ld hl, de'' lo sustituye en el binario ensamblado por su alternativa de 8 bits. 
 + 
 +Como no todos los programas ensambladores las aceptan, **mi recomendación es que no las uses**, y que añadas el flag ''<nowiki>--</nowiki>syntax=f'' a sjasmplus para que te avise con un warning si estás usando alguna de ellas, de forma que puedas reemplazarla por su equivalente aceptado por el Z80. De no hacerlo así, tu código no podrá ser ensamblado por otros programas ensambladores y podrá llevar a confusión a otras personas al estudiarlo. 
 + 
 +Lo que sí es útil para nosotros es conocer estas posibilidades para poder usarlas en nuestros programas. Escribir manualmente en nuestro código las instrucciones alternativas para ejecutar la tarea que o comando que necesitamos ejecutar. 
 + 
 +Veamos las "FAKE INSTRUCTIONS" tal cual las define sjasmplus en su documentación. Además, alguna de las instrucciones se puede codificar de 2 maneras diferentes: 
 + 
 +|< 50% 50% 50% >| 
 +^ Instrucción\\ no existente ^ Alternativa ^ 
 +| ld bc, bc | ld b, b\\ ld c, c | 
 +| ld bc, de | ld b, d\\ ld c, e | 
 +| ld bc, hl | ld b, h\\ ld c, l | 
 +| ld bc, ix | ld b, ixh\\ ld c, ixl | 
 +| ld bc, iy | ld b, YH\\ ld c, iyl | 
 +| ld bc, (hl) | ld c, (hl)\\ inc hl\\ ld b, (hl)\\ dec hl | 
 +| ld bc, (ix+nn) | ld c, (ix+nn)\\ ld b, (ix+NN+1) | 
 +| ld bc, (iy+nn) | ld c, (iy+nn)\\ ld b, (iy+NN+1) | 
 +| ld de, bc | ld d, b\\ ld e, c | 
 +| ld de, de | ld d, d\\ ld e, e | 
 +| ld de, hl | ld d, h\\ ld e, l | 
 +| ld de, ix | ld d, ixh\\ ld e, ixl | 
 +| ld de, iy | ld d, YH\\ ld e, iyl | 
 +| ld de, (hl)  | ld e, (hl)\\ inc hl\\ ld d, (hl)\\ dec hl | 
 +| ld de, (ix+nn)  | ld e, (ix+nn)\\ ld d, (ix+NN+1) | 
 +| ld de, (iy+nn)  | ld e, (iy+nn)\\ ld d, (iy+NN+1) | 
 +| ld hl, bc | ld h, b\\ ld l, c | 
 +| ld hl, de | ld h, d\\ ld l, e | 
 +| ld hl, hl | ld h, h\\ ld l, l | 
 +| ld hl, ix | push ix\\ pop hl | 
 +| ld hl, iy | push iy\\ pop hl | 
 +| ld hl, (ix+nn)  | ld l, (ix+nn)\\ ld h, (ix+NN+1) | 
 +| ld hl, (iy+nn)  | ld l, (iy+nn)\\ ld h, (iy+NN+1) | 
 +| ld ix, bc | ld ixh, b\\ ld ixl, c | 
 +| ld ix, de | ld ixh, d\\ ld ixl, e | 
 +| ld ix, hl | push hl\\ pop ix | 
 +| ld ix, ix | ld ixh, ixh\\ ld ixl, ixl | 
 +| ld ix, iy | push iy\\ pop ix | 
 +| ld iy, bc | ld iyh, b\\ ld iyl, c | 
 +| ld iy, de | ld iyh, d\\ ld iyl, e | 
 +| ld iy, hl | push hl\\ pop iy | 
 +| ld iy, ix | push ix\\ pop iy | 
 +| ld iy, iy | ld iyh, YH\\ ld iyl, iyl | 
 +| ld (hl), bc | ld (hl), c\\ inc hl\\ ld (hl), b\\ dec hl | 
 +| ld (hl), de | ld (hl), e\\ inc hl\\ ld (hl), d\\ dec hl | 
 +| ld (ix+nn), bc | ld (ix+nn), c\\ ld (ix+NN+1), b | 
 +| ld (ix+nn), de | ld (ix+nn), e\\ ld (ix+NN+1), d | 
 +| ld (ix+nn), hl | ld (ix+nn), l\\ ld (ix+NN+1), h | 
 +| ld (iy+nn), bc | ld (iy+nn), c\\ ld (iy+NN+1), b | 
 +| ld (iy+nn), de | ld (iy+nn), e\\ ld (iy+NN+1), d | 
 +| ld (iy+nn), hl | ld (iy+nn), l\\ ld (iy+NN+1), h | 
 + 
 +|< 50% 50% 50% >| 
 +^ Instrucción\\ no existente ^ Alternativa ^ 
 +| adc de, bc | ex de, hl\\ adc hl, bc\\ ex de, hl | 
 +| adc de, de | ex de, hl\\ adc hl, hl\\ ex de, hl | 
 +| adc de, de | rl e\\ rl d (-7T) | 
 +| adc de, hl | ex de, hl\\ adc hl, de\\ ex de, hl | 
 +| adc de, sp | ex de, hl\\ adc hl, sp\\ ex de, hl | 
 +| add de, bc | ex de, hl\\ add hl, bc\\ ex de, hl | 
 +| add de, de | ex de, hl\\ add hl, hl\\ ex de, hl | 
 +| add de, de | srl e\\ rl d (-3T) | 
 +| add de, hl | ex de, hl\\ add hl, de\\ ex de, hl | 
 +| add de, sp | ex de, hl\\ add hl, sp\\ ex de, hl | 
 +| sbc de, bc | ex de, hl\\ sbc hl, bc\\ ex de, hl | 
 +| sbc de, de | ex de, hl\\ sbc hl, hl\\ ex de, hl | 
 +| sbc de, hl | ex de, hl\\ sbc hl, de\\ ex de, hl | 
 +| sbc de, sp | ex de, hl\\ sbc hl, sp\\ ex de, hl | 
 +| sub de, bc | or a\\ ex de, hl\\ sbc hl, bc\\ ex de, hl | 
 +| sub de, de | or a\\ ex de, hl\\ sbc hl, hl\\ ex de, hl | 
 +| sub de, de | ld de,  0 (-17T) | 
 +| sub de, hl | or a\\ ex de, hl\\ sbc hl, de\\ ex de, hl | 
 +| sub de, sp | or a\\ ex de, hl\\ sbc hl, sp\\ ex de, hl | 
 +| sub hl, bc | or a\\ sbc hl, bc | 
 +| sub hl, de | or a\\ sbc hl, de | 
 +| sub hl, hl | or a\\ sbc hl, hl | 
 +| sub hl, hl | ld hl, 0 (-9T) | 
 +| sub hl, sp | or a\\ sbc hl, sp | 
 + 
 +|< 50% 50% 50% >| 
 +^ Instrucción\\ no existente ^ Alternativa ^ 
 +| rl bc | rl c\\ rl b | 
 +| rl de | rl e\\ rl d | 
 +| rl hl | rl l\\ rl h | 
 +| rr bc | rr b\\ rr c | 
 +| rr de | rr d\\ rr e | 
 +| rr hl | rr h\\ rr l | 
 +| sla bc | sla c\\ rl b | 
 +| sla de | sla e\\ rl d | 
 +| sla hl | add hl, hl | 
 +| sll bc | sli c\\ rl b | 
 +| sll de | sli e\\ rl d | 
 +| sll hl | sli l\\ rl h | 
 +| sli bc | sli c\\ rl b | 
 +| sli de | sli e\\ rl d | 
 +| sli hl | sli l\\ rl h | 
 +| sra bc | sra b\\ rr c | 
 +| sra de | sra d\\ rr e | 
 +| sra hl | sra h\\ rr l | 
 +| srl bc | srl b\\ rr c | 
 +| srl de | srl d\\ rr e | 
 +| srl hl | srl h\\ rr l | 
 + 
 +|< 50% 50% 50% >| 
 +^ Instrucción\\ no existente ^ Alternativa ^ 
 +| ldi bc, (hl) | ld c, (hl)\\ inc hl\\ ld b, (hl)\\ inc hl | 
 +| ldi bc, (ix+NN) | ld c, (ix+nn)\\ inc ix\\ ld b, (ix+nn)\\ inc ix | 
 +| ldi bc, (iy+NN) | ld c, (iy+nn)\\ inc iy\\ ld b, (iy+nn)\\ inc iy | 
 +| ldi de, (hl) | ld e, (hl)\\ inc hl\\ ld d, (hl)\\ inc hl | 
 +| ldi de, (ix+NN) | ld e, (ix+nn)\\ inc ix\\ ld d, (ix+nn)\\ inc ix | 
 +| ldi de, (iy+NN) | ld e, (iy+nn)\\ inc iy\\ ld d, (iy+nn)\\ inc iy | 
 +| ldi hl, (ix+NN) | ld l, (ix+nn)\\ inc ix\\ ld h, (ix+nn)\\ inc ix | 
 +| ldi hl, (iy+NN) | ld l, (iy+nn)\\ inc iy\\ ld h, (iy+nn)\\ inc iy | 
 +| ldi (hl), bc  | ld (hl), c\\ inc hl\\ ld (hl), b\\ inc hl | 
 +| ldi (hl), de  | ld (hl), e\\ inc hl\\ ld (hl), d\\ inc hl | 
 +| ldi (ix+NN), bc | ld (ix+nn), c\\ inc ix\\ ld (ix+nn), b\\ inc ix | 
 +| ldi (ix+NN), de | ld (ix+nn), e\\ inc ix\\ ld (ix+nn), d\\ inc ix | 
 +| ldi (ix+NN), hl | ld (ix+nn), l\\ inc ix\\ ld (ix+nn), h\\ inc ix | 
 +| ldi (iy+NN), bc | ld (iy+nn), c\\ inc iy\\ ld (iy+nn), b\\ inc iy | 
 +| ldi (iy+NN), de | ld (iy+nn), e\\ inc iy\\ ld (iy+nn), d\\ inc iy | 
 +| ldi (iy+NN), hl | ld (iy+nn), l\\ inc iy\\ ld (iy+nn), h\\ inc iy | 
 +| ldi a, (bc) | ld a, (bc)\\ inc bc | 
 +| ldi a, (de) | ld a, (de)\\ inc de | 
 +| ldi a, (hl) | ld a, (hl)\\ inc hl | 
 +| ldi b, (hl) | ld b, (hl)\\ inc hl | 
 +| ldi c, (hl) | ld c, (hl)\\ inc hl | 
 +| ldi d, (hl) | ld d, (hl)\\ inc hl | 
 +| ldi e, (hl) | ld e, (hl)\\ inc hl | 
 +| ldi h, (hl) | ld h, (hl)\\ inc hl | 
 +| ldi l, (hl) | ld l, (hl)\\ inc hl | 
 +| ldi a, (ix+NN) | ld a, (ix+nn)\\ inc ix | 
 +| ldi b, (ix+NN) | ld b, (ix+nn)\\ inc ix | 
 +| ldi c, (ix+NN) | ld c, (ix+nn)\\ inc ix | 
 +| ldi d, (ix+NN) | ld d, (ix+nn)\\ inc ix | 
 +| ldi e, (ix+NN) | ld e, (ix+nn)\\ inc ix | 
 +| ldi h, (ix+NN) | ld h, (ix+nn)\\ inc ix | 
 +| ldi l, (ix+NN) | ld l, (ix+nn)\\ inc ix | 
 +| ldi a, (iy+NN) | ld a, (iy+nn)\\ inc iy | 
 +| ldi b, (iy+NN) | ld b, (iy+nn)\\ inc iy | 
 +| ldi c, (iy+NN) | ld c, (iy+nn)\\ inc iy | 
 +| ldi d, (iy+NN) | ld d, (iy+nn)\\ inc iy | 
 +| ldi e, (iy+NN) | ld e, (iy+nn)\\ inc iy | 
 +| ldi h, (iy+NN) | ld h, (iy+nn)\\ inc iy | 
 +| ldi l, (iy+NN) | ld l, (iy+nn)\\ inc iy | 
 +| ldi (bc), a | ld (bc), a\\ inc bc | 
 +| ldi (de), a | ld (de), a\\ inc de | 
 +| ldi (hl), a | ld (hl), a\\ inc hl | 
 +| ldi (hl), b | ld (hl), b\\ inc hl | 
 +| ldi (hl), c | ld (hl), c\\ inc hl | 
 +| ldi (hl), d | ld (hl), d\\ inc hl | 
 +| ldi (hl), e | ld (hl), e\\ inc hl | 
 +| ldi (hl), h | ld (hl), h\\ inc hl | 
 +| ldi (hl), k | ld (hl), l\\ inc hl | 
 +| ldi (ix+NN), a | ld (ix+nn), a\\ inc ix | 
 +| ldi (ix+NN), b | ld (ix+nn), b\\ inc ix | 
 +| ldi (ix+NN), c | ld (ix+nn), c\\ inc ix | 
 +| ldi (ix+NN), d | ld (ix+nn), d\\ inc ix | 
 +| ldi (ix+NN), e | ld (ix+nn), e\\ inc ix | 
 +| ldi (ix+NN), h | ld (ix+nn), h\\ inc ix | 
 +| ldi (ix+NN), l | ld (ix+nn), l\\ inc ix | 
 +| ldi (iy+NN), a | ld (iy+nn), a\\ inc iy | 
 +| ldi (iy+NN), b | ld (iy+nn), b\\ inc iy | 
 +| ldi (iy+NN), c | ld (iy+nn), c\\ inc iy | 
 +| ldi (iy+NN), d | ld (iy+nn), d\\ inc iy | 
 +| ldi (iy+NN), e | ld (iy+nn), e\\ inc iy | 
 +| ldi (iy+NN), h | ld (iy+nn), h\\ inc iy | 
 +| ldi (iy+NN), l | ld (iy+nn), l\\ inc iy | 
 +| ldi (hl), MM | ld (hl), MM\\ inc hl | 
 +| ldi (ix+NN), MM | ld (ix+nn), MM\\ inc ix | 
 +| ldi (iy+NN), MM | ld (iy+nn), MM\\ inc iy | 
 + 
 +|< 50% 50% 50% >| 
 +^ Instrucción\\ no existente ^ Alternativa ^ 
 +| ldd a, (bc) | ld a, (bc)\\ dec bc | 
 +| ldd a, (de) | ld a, (de)\\ dec de | 
 +| ldd a, (hl) | ld a, (hl)\\ dec hl | 
 +| ldd b, (hl) | ld b, (hl)\\ dec hl | 
 +| ldd c, (hl) | ld c, (hl)\\ dec hl | 
 +| ldd d, (hl) | ld d, (hl)\\ dec hl | 
 +| ldd e, (hl) | ld e, (hl)\\ dec hl | 
 +| ldd h, (hl) | ld h, (hl)\\ dec hl | 
 +| ldd l, (hl) | ld l, (hl)\\ dec hl | 
 +| ldd a, (ix+NN) | ld a, (ix+nn)\\ dec ix | 
 +| ldd b, (ix+NN) | ld b, (ix+nn)\\ dec ix | 
 +| ldd c, (ix+NN) | ld c, (ix+nn)\\ dec ix | 
 +| ldd d, (ix+NN) | ld d, (ix+nn)\\ dec ix | 
 +| ldd e, (ix+NN) | ld e, (ix+nn)\\ dec ix | 
 +| ldd h, (ix+NN) | ld h, (ix+nn)\\ dec ix | 
 +| ldd l, (ix+NN) | ld l, (ix+nn)\\ dec ix | 
 +| ldd a, (iy+NN) | ld a, (iy+nn)\\ dec iy | 
 +| ldd b, (iy+NN) | ld b, (iy+nn)\\ dec iy | 
 +| ldd c, (iy+NN) | ld c, (iy+nn)\\ dec iy | 
 +| ldd d, (iy+NN) | ld d, (iy+nn)\\ dec iy | 
 +| ldd e, (iy+NN) | ld e, (iy+nn)\\ dec iy | 
 +| ldd h, (iy+NN) | ld h, (iy+nn)\\ dec iy | 
 +| ldd l, (iy+NN) | ld l, (iy+nn)\\ dec iy | 
 +| ldd (bc), a | ld (bc), a\\ dec bc | 
 +| ldd (de), a | ld (de), a\\ dec de | 
 +| ldd (hl), a | ld (hl), a\\ dec hl | 
 +| ldd (hl), b | ld (hl), b\\ dec hl | 
 +| ldd (hl), c | ld (hl), c\\ dec hl | 
 +| ldd (hl), d | ld (hl), d\\ dec hl | 
 +| ldd (hl), e | ld (hl), e\\ dec hl | 
 +| ldd (hl), h | ld (hl), h\\ dec hl | 
 +| ldd (hl), l | ld (hl), l\\ dec hl | 
 +| ldd (ix+NN), a | ld (ix+nn), a\\ dec ix | 
 +| ldd (ix+NN), b | ld (ix+nn), b\\ dec ix | 
 +| ldd (ix+NN), c | ld (ix+nn), c\\ dec ix | 
 +| ldd (ix+NN), d | ld (ix+nn), d\\ dec ix | 
 +| ldd (ix+NN), e | ld (ix+nn), e\\ dec ix | 
 +| ldd (ix+NN), h | ld (ix+nn), h\\ dec ix | 
 +| ldd (ix+NN), k | ld (ix+nn), l\\ dec ix | 
 +| ldd (iy+NN), a | ld (iy+nn), a\\ dec iy | 
 +| ldd (iy+NN), b | ld (iy+nn), b\\ dec iy | 
 +| ldd (iy+NN), c | ld (iy+nn), c\\ dec iy | 
 +| ldd (iy+NN), d | ld (iy+nn), d\\ dec iy | 
 +| ldd (iy+NN), e | ld (iy+nn), e\\ dec iy | 
 +| ldd (iy+NN), h | ld (iy+nn), h\\ dec iy | 
 +| ldd (iy+NN), l | ld (iy+nn), l\\ dec iy | 
 +| ldd (hl), MM | ld (hl), MM\\ dec hl | 
 +| ldd (ix+NN), MM | ld (ix+nn), MM\\ dec ix | 
 +| ldd (iy+NN), MM | ld (iy+nn), MM\\ dec iy | 
 + 
 +|< 50% 50% 50% >| 
 +^ Instrucción\\ no existente ^ Alternativa ^ 
 +| ex bc, hl | push hl\\ ld l, c\\ ld h, b\\ pop bc | 
 +| ex bc, hl | push bc\\ ex (sp), hl\\ pop bc | 
 +| ex bc, ix | push bc\\ ex (sp), ix\\ pop bc | 
 +| ex bc, iy | push bc\\ ex (sp), iy\\ pop bc | 
 +| ex af, hl | push af\\ ex (sp), hl\\ pop af | 
 +| ex af, ix | push af\\ ex (sp), ix\\ pop af | 
 +| ex af, iy | push af\\ ex (sp), iy\\ pop af | 
 +| ex de, ix | push de\\ ex (sp), ix\\ pop de | 
 +| ex de, iy | push de\\ ex (sp), iy\\ pop de |
  
 \\  \\ 
 ===== De la teoría a la práctica ===== ===== De la teoría a la práctica =====
  
- Con este capítulo hemos cubierto el 99% de las instrucciones soportadas + Con este capítulo hemos cubierto el 99% de las instrucciones soportadas por el microprocesador Z80. Con la excepción de los //Modos de Interrupciones// del Z80 y sus aplicaciones, ya tenemos a nuestra disposición las piezas básicas para formar cualquier programa o rutina en ensamblador.
-por el microprocesador Z80. Con la excepción de los //Modos de Interrupciones// +
-del Z80 y sus aplicaciones, ya tenemos a nuestra disposición las piezas +
-básicas para formar cualquier programa o rutina en ensamblador.+
  
- No obstante, todavía quedan por delante muchas horas de programación + No obstante, todavía quedan por delante muchas horas de programación para dominar este lenguaje, así como diferentes técnicas, trucos, rutinas y mapas de memoria que nos permitan dibujar nuestros gráficos, realizar rutinas complejas, utilizar el sistema de interrupciones del microprocesador para realizar controles de temporización de nuestros programas, o reproducir sonido.
-para dominar este lenguaje, así como diferentes técnicas, trucos, +
-rutinas y mapas de memoria que nos permitan dibujar nuestros gráficos, +
-realizar rutinas complejas, utilizar el sistema de interrupciones del +
-microprocesador para realizar controles de temporización de nuestros +
-programas, o reproducir sonido.+
  
 \\  \\ 
Línea 941: Línea 1141:
   * [[http://www.z80.info|Web del Z80]]   * [[http://www.z80.info|Web del Z80]]
   * [[http://www.worldofspectrum.org/faq/reference/z80reference.htm|Z80 Reference de WOS]]   * [[http://www.worldofspectrum.org/faq/reference/z80reference.htm|Z80 Reference de WOS]]
-  * [[http://ti86.acz.org/z80_ref.htm|Z80 Reference de TI86]]   +  * [[http://ti86.acz.org/z80_ref.htm|Z80 Reference de TI86]] 
-  * [[http://icarus.ticalc.org/articles/z80_faq.html|FAQ de Icarus Productions]] +  * [[http://icarus.ticalc.org/articles/z80_faq.html|FAQ de Icarus Productions]]
   * [[http://www.speccy.org/trastero/cosas/Fichas/fichas.htm|Microfichas de CM de MicroHobby]]   * [[http://www.speccy.org/trastero/cosas/Fichas/fichas.htm|Microfichas de CM de MicroHobby]]
   * [[http://www.ticalc.org/pub/text/z80/|Tablas de ensamblado y t-estados]] (pulsar en z80.txt, z80_reference.txt, z80time.txt).   * [[http://www.ticalc.org/pub/text/z80/|Tablas de ensamblado y t-estados]] (pulsar en z80.txt, z80_reference.txt, z80time.txt).
   * [[http://www.z80.info/lesson1.htm|Curso de ASM de z80.info]]   * [[http://www.z80.info/lesson1.htm|Curso de ASM de z80.info]]
-  * [[http://www.arrakis.es/~ninsesabe/pasmo/|PASMO]] 
   * [[http://www.myquest.nl/z80undocumented/z80-documented.pdf|Instrucciones no documentadas]] (1)   * [[http://www.myquest.nl/z80undocumented/z80-documented.pdf|Instrucciones no documentadas]] (1)
   * [[http://www.z80.info/zip/z80-documented.pdf|Instrucciones no documentadas]] (2)   * [[http://www.z80.info/zip/z80-documented.pdf|Instrucciones no documentadas]] (2)
 +  * {{:cursos:ensamblador:zx-ports-full-table.pdf|ZX Spectrum Guide to the ZX Spectrum ports}}
 +  * {{:cursos:ensamblador:velesoft-zxporty-cz.pdf|ZX SPECTRUM - PORTS TABLE (Velesoft)}}
  
 +\\  
 +**[ [[.:indice|⬉]] | [[.:lenguaje_4|⬅]] | [[.:habituales|➡]] ]**
  • cursos/ensamblador/lenguaje_5.1291987392.txt.gz
  • Última modificación: 10-12-2010 13:23
  • por sromero