Construyendo SAP-1 en Turing Complete: Guía paso a paso para desarrolladores
En el juego Turing Complete, ensamblas la computadora SAP-1 (Simple As Possible) —una arquitectura clásica de 8 bits con un espacio de direcciones de 4 bits (16 bytes de memoria). Es un modelo basado en acumulador donde todas las operaciones usan el acumulador como registro principal. El juego te permite avanzar desde puertas lógicas básicas hasta la arquitectura completa y programas en ensamblador.
SAP-1 replica el diseño de Ben Eater: dos registros (acumulador y auxiliar), 16 bytes de memoria. Limitación del juego —no se guardan datos en los bloques de programa.
Componentes principales de SAP-1
La arquitectura incluye:
- Decodificador de instrucciones basado en un chip ROM para simplificar el microcódigo.
- Registros: acumulador (A), instrucción (IR), memoria (RAM).
- ALU: sumador/restador con banderas Z (cero) y C (acarreo).
- Controlador: microcódigo con señales MI, RO, II, AI, AO, y otras.
El diseño sigue el original de Ben Eater: memoria a la izquierda, ALU en el centro, salida a la derecha.
Implementación del microcódigo
El decodificador de instrucciones usa ROM con un microprograma. Para cargarlo en el juego, se genera un archivo ROM. Aquí está el código en C++ para crear el microcódigo (tiene en cuenta las banderas ZF/CF):
#include <windows.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <format>
#include <filesystem>
#define HLT 0b1000000000000000
// ... (ostalnye #define how in originale)
uint16_t ucode_TEMP[16][8] = {
{MI|CO, RO|II|CE, 0, 0, 0, 0, 0, 0}, // NOP
// ... (full array)
};
uint16_t ucode[4][16][8];
void initUCode() {
memcpy(ucode[FLAGGS_Z0C0], ucode_TEMP, sizeof(ucode_TEMP));
// Adaptatsiya for flagov JC/JZ
}
int main() {
initUCode();
std::ofstream fout("2929467240861350664.rom", std::ios::binary);
fout.write((char*)&ucode, sizeof(ucode));
fout.close();
return 0;
}
Compila con C++20 (gnu++20 en VS Code). Copia el archivo .rom a la carpeta de usuario del juego.
Comandos del procesador
| Code | Mnemonic | Description |
|-----|-----------|----------|
| 0000 | NOP | Sin operación |
| 0001 | LDA | Cargar en A |
| 0010 | ADD | Sumar B |
| 0011 | SUB | Restar |
| 0100 | STA | Almacenar A |
| 0101 | LDI | Cargar inmediato |
| 0110 | JMP | Salto incondicional |
| 0111 | JC | Salto si acarreo |
| 1000 | JZ | Salto si cero |
| 1110 | OUT | Salida |
| 1111 | HLT | Parada |
El microcódigo genera secuencias de señales para cada ciclo de reloj.
Instalando SAP-1 en Sandbox
- Descarga los archivos del proyecto.
- Encuentra la ruta en los ajustes:
C:\Users\[User]\AppData\Roaming\Godot\app_userdata\Turing Complete. - Copia el
.romy los esquemáticos a la carpeta de usuario. - Inicia Sandbox y carga
sap-1.
Pruébalo: ejecuta el programa de prueba (juego de palillos del Fort Boyard).
Problemas y matices en el ensamblaje
- Elementos giratorios: barra espaciadora.
- Seleccionar: Shift.
- Entrar en arquitectura: doble clic.
- Elementos personalizados: una entrada/salida por baldosa, al menos un componente interno.
El juego está en acceso anticipado: la campaña se interrumpe, pero Sandbox está lleno de posibilidades.
Puntos clave
- SAP-1 es una arquitectura de acumulador de los 80 diseñada para ahorrar memoria.
- Microcódigo en ROM simplifica la decodificación (alternativa —lógica pura).
- Limitación: 16 bytes de RAM sin datos en el programa.
- El juego enseña todo desde NAND hasta ensamblador.
- Generación de ROM vía C++ para chips personalizados.
— Editorial Team
Aún no hay comentarios.