Todos los programas escritos para un microprocesador (en nuestro caso las ROMs de la Master System) no son más que una sucesión de instrucciones comprensibles por dicho procesador.

Cada instrucción específica afectará de diferente manera a ciertos elementos del procesador (registros principalmente) o a dispositivos conectados a él (memorias y otros dispositivos de entrada/salida).

De esta manera podemos dividir las instrucciones en varios grupos como serían las de carga (mueven información entre registros o registros y memoria), aritméticas y lógicas (operan con los datos), de salto y bifurcaciones, etc.

Las instrucciones están formadas siempre por un código de operación (un prefijo que indica de qué instrucción se trata) y cero o más parámetros necesarios para la instrucción en cuestión.

En el caso del Z80, los códigos de operación de su juego de instrucciones siempre ocupan un byte, por lo tanto existen 256 códigos de operación diferentes que nos resultarían en unas teóricas 256 instrucciones diferentes. Sin embargo, esto último no es cierto; en este procesador existen ciertos códigos de operación que se usan como un prefijo, de modo que su siguiente parámetro (otro byte) se usará como un subcódigo de operación que añadirá otras 256 instrucciones diferentes.

En el Z80 tenemos 4 de estos prefijos: CB, DD, ED y FD, pero aun hay más, hay otros dos prefijos de segundo nivel que abren otras 256 posibles instrucciones cada uno: DDCB y FDCB. En definitiva, gracias a estos prefijos contamos con unas 1700 posibles instrucciones (algunos códigos de operación no se utilizan).

Cada una de estas instrucciones tiene una correspondencia en ensamblador (un código mnemónico) para facilitar la programación por parte del usuario, así la instrucción de CO (código de operación) 0×00 se corresponde con el mnemónico NOP, 0xD1 con POP DE o 0xDD94 con SUB IXh.

El procesador a la hora de ejecutar un programa no hace más que ir leyendo de las posiciones de memoria apuntadas por el PC (el registro contador de programa) y ejecutando la instrucción correspondiente al código de operación allí encontrado. ¿Sencillo, verdad?

A la hora de programar el núcleo del Z80 para el emulador la tarea más larga y cansina por lo repetitivo es la de implementar estas 1700 instrucciones, pues si bien muchas de ellas son iguales solo que cambiando los parámetros (mover cada uno de los distintos registros al acumulador, por ejemplo), aun así se quedan en unas 150 instrucciones totalmente diferentes unas de otras.

Por otro lado, para obtener una implementación más eficiente mi idea es crear una tabla con todas ellas (las 1700) a la que se salte tras analizar el CO leido.

Espero que haya quedado claro, sino ya sabéis, preguntad en los comentarios y haré lo posible para hacerlo más entendible :)