Emulación de una CPU

Hacia ya tiempo que tenía en mente desarrollar un procesador por software, de hecho los primeros ficheros que tengo sobre este proyecto y la documentación datan de 2009-2010, pero debido a que es un proyecto al que hay que dedicarle bastante tiempo lo fui dejando de lado.

Este año me propuse ir desarrollandolo poco a poco a modo de pasatiempo en mis vacaciones, pero al final el ansia por ver almenos algo básico funcionando ha conseguido que me ponga a desarrollarlo antes de tiempo.

En esta entrada voy a enseñar algunas características y explicar algunos aspectos del proyecto.

Para empezar, el procesador no es mi objetivo, mi objetivo es un poco más ambicioso, es desarrollar un sistema completo con RAM, ROM, CPU y GPU.

La CPU, que es lo que viene al caso en esta entrada, es de 8 bits, capaz de direccionar hasta 16KB de memoria RAM que y tiene un juego de instrucciones de 512 instrucciones que se dividen en 256 instrucciones base y 256 instrucciones extendidas. Actualmente tengo implementadas las 256 instrucciones del juego base.

El procesador consta de 7 registros básicos de 8 bits más uno de flags. Estos registros se pueden unir para formar registros de 16 bits. A parte de estos registros tiene otros 2 de uso específico, el PC (Program Counter) y el SP (Stack Pointer) de 16 bits cada uno.

La fase de busqueda, decodificación y ejecución no tienen mucho misterio

bOps es un array de punteros a funcion.

En principio quería avanzar en la CPU propiamente dicha pero conforme iba terminando me di cuenta que necesitaría también un módulo debug (al estilo gdb) para poder probar a fondo el funcionamiento de la CPU.

Para poder hacer pruebas he tenido que crear una memoria con un esquema que no es el que yo quería pero para comprobar el correcto funcionamiento de la CPU es suficiente, esta memoria es de 1KB y se divide de la siguiente forma:

  • 0x00 - 0xFF (256 bytes): En estas posiciones se encuentra el bootloader, aunque ocupa bastante menos que 256 bytes.
  • 0x100 - 0x1FF (256 bytes): Memoria para código. Tras arrancar la CPU el bootloader salta a la posición 0x100 donde se carga el código de programa.
  • 0x200 - 0x3FF (512 bytes): Memoria RAM. Dentro de la memoria RAM cabe destacar la pila que es inicializada a 0x3FF y que va decreciendo conforme se van introduciendo datos en la misma.

Con todo esto ya estaban todos los elementos "hardware", faltan los elementos software, esto es el bootloader y un programa para testear el funcionamiento de la CPU.

No tengo compilador ni traductor para la CPU así que en vez de programar en ensamblador, he tenido que programarlo directamente en código máquina.

El bootloader simplemente inicializar una serie de registros y prepara al procesador para dar el salto a la memoria de código.

El bootloader se establece directamente en la creación de la memoria.

Con el bootloader listo ya somo capaces de dar el salto a la memoria de instrucciones, así que el último elemento que queda es un programa que ejecutar. He optado por un programa sencillo que simplemente implementa el algoritmo de la multiplicación. Al igual que el bootloader al no tener ni compilador ni traductor no he podido usar ensamblador y por tanto lo he escrito en código máquina.

Esta vez si, el programa se encuentra en un fichero a parte, y que se llama mult4x4. El código del programa (en código máquina) es:

El programa multiplica 3 por 3, y escribe en la RAM una cadena con el resultado (pasado a ascii), concretamente escribe "El resultado es: 9". También coloca el registro bc en la pila para después recuperarlo en de.

Con todo esto ya podemos ver en funcionamiento la CPU.

No descarto hacer un traductor de ensamblador a código máquina, total ya he tenido que hacer un desensamblador para el depurador. Aún así, cuando se estudia completamente un procesador, no es muy traumático escribir código máquina directamente.

Unas capturas de pantalla del programa, el bootloader, el diseño del código fuente y un ejemplo del depurador.

El código fuente lo subiré a github en breve.

1 2 3 4 5 6

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *