Implementación de una CPU en Java con manejo de varios tipos de instrucciones.
Versión mejorada y depurada de la implementación anterior.
Operaciones:
- suma (ADD)
- resta (SUB)
- multiplicación (MULT)
- división (DIV)
- manejo de pila (PUSH,POP,POPA)
- operaciones con registros (MOV, INC, DEC, LOOP, GO)
# Componentes principales Registros y Memoria:
accumulator: Acumulador para operaciones aritméticas y lógicas.
programCounter: Contador de programa que apunta a la siguiente instrucción a ejecutar.
memory: Memoria principal que utiliza un HashMap para almacenar valores en direcciones de memoria.
stack: Una pila utilizada para operaciones PUSH, POP y DEL.
carryFlag y overflowFlag: Banderas de estado para acarreo y desbordamiento.
Instrucciones:
Los opcodes están definidos como constantes de tipo byte, representando diversas instrucciones que la CPU puede ejecutar.
Método run(): Ejecuta un bucle hasta que la CPU se detenga (running = false). Decodifica la instrucción del memory en base al programCounter, descompone en opcode y operando. Ejecuta la instrucción correspondiente usando un switch en el opcode.
Instrucciones Aritméticas y Lógicas: ADD, SUB, ADC, SBC, AND, EOR, ORA, etc., realizan operaciones aritméticas y lógicas. Las instrucciones de desvío (JMP, JZ, BCC, BCS, etc.) modifican el programCounter basado en el estado de los flags y valores del acumulador.
Manejo de Pila: PUSH, POP, DEL gestionan el contenido de la pila.
Métodos de Configuración y Ejecución:
reset(): Inicializa el estado de la CPU.
loadProgram(int[] program, Map<Integer, Integer> initialMemory): Carga un programa en la memoria y configura valores iniciales en la memoria.
setMemory(int address, int value), getMemory(int address), getStackTop(): Métodos auxiliares para manipular la memoria y la pila.
Método main():
Ejecuta ejemplos de programas simples para probar la funcionalidad de la CPU.
Documentación:
Agregar comentarios y documentación más detallada sobre cada instrucción y el flujo general de la CPU.
Testeo:
Implementar una suite de pruebas unitarias para verificar que cada instrucción se comporta como se espera.
Optimización:
Revisar si hay oportunidades para optimizar el manejo de memoria y pila, especialmente en operaciones de alto nivel.
Expansión:
Extender la CPU para soportar más instrucciones o características, considerando un diseño modular y extensible desde el principio y no monolítico como ahora.