Uno de mis eternos proyectos, que retomo una y otra vez y que nunca termino, es diseñar y programar el emulador de un microprocesador.
El núcleo del proyecto de programación es el lector de instrucciones, y eso nos lleva a que una pieza fundamental del diseño es el juego de instrucciones.
Una de las operaciones fundamentales de un procesador es, evidentemente, leer un valor de la memoria y depositarlo en un registro o viceversa, escribir en la memoria un valor presente en un registro.
El diseño de procesador que he elegido implica que estas dos fundamentales operaciones se realicen únicamente desde el registro que he denominado A.
A estas operaciones les he asignado los mnemónicos LEE y SCR y los códigos binarios 0xc0 y 0xc1. Ambas operaciones necesitan como argumento una dirección de memoria.
Asumiendo que el procesador emulado es una estructura de datos que almacenamos en procesador, que la memoria es una matriz que almacenamos en memoria, y que el puntero de instrucción es el registro CI del procesador, el código de emulación para estas instrucciones lo he programado como sigue:
switch(memoria[chip->CI])
{
case 0xc0 /* Instrucción LEE */
chip->A=memoria[memoria[chip->CI+1]];
break;
case 0xc1 /* Instrucción SCR*/
memoria[memoria[chip->CI+1]]=chip->A;
break;
/* Aquí el código para otras instrucciones */
}
Con este código, una instrucción de dos bytes como 0xc0 0x12 se desensambla como LEE 0x12, es decir, "coge el contenido de la posición de memoria 0x12 y cópialo en el registro A".
Continuaré más adelante...
No hay comentarios:
Publicar un comentario