Zurück zur Startseite

SAP-1-Zusammenbau in Turing Complete: Anleitung

Anleitung zum SAP-1-Zusammenbau in Turing Complete: Architektur, ROM-Mikrocode, Code-Generator. Für Entwickler — von NAND bis Assembler mit Beispielen.

Wie baut man Ben Eaters SAP-1 in Turing Complete zusammen
Advertisement 728x90

SAP-1 in Turing Complete bauen: Ein Schritt-für-Schritt-Leitfaden für Entwickler

Im Spiel Turing Complete baust du den SAP-1-Computer (Simple As Possible) zusammen – eine klassische 8-Bit-Architektur mit einem 4-Bit-Adressraum (16 Bytes Speicher). Es handelt sich um ein akkumulatorbasiertes Modell, bei dem alle Operationen den Akkumulator als Hauptregister nutzen. Das Spiel führt dich von grundlegenden Logikgaten bis zur vollständigen Architektur und Assembler-Programmen.

SAP-1 repliziert das Design von Ben Eater: zwei Register (Akkumulator und Hilfsregister), 16 Bytes Speicher. Spielbeschränkung – kein Speichern von Daten in Programmgrößen.

Hauptbestandteile des SAP-1

Die Architektur umfasst:

Google AdInline article slot
  • Instruktionsdekoder basierend auf einem ROM-Chip, um den Mikrocode zu vereinfachen.
  • Register: Akkumulator (A), Instruktion (IR), Speicher (RAM).
  • ALU: Addierer/Subtrahierer mit Z (Null)- und C (Carry)-Flags.
  • Controller: Mikrocode mit Signalen MI, RO, II, AI, AO und anderen.

Das Layout folgt dem Original von Ben Eater: Speicher links, ALU in der Mitte, Ausgang rechts.

Mikrocode-Implementierung

Der Instruktionsdekoder verwendet ROM mit einem Mikroprogramm. Zum Laden ins Spiel wird eine ROM-Datei generiert. Hier ist der C++-Code zur Erstellung des Mikrocode (berücksichtigt ZF/CF-Flags):

#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;
}

Kompilieren mit C++20 (gnu++20 in VS Code). Kopiere die .rom-Datei in den Benutzerordner des Spiels.

Google AdInline article slot

Prozessor-Befehle

| Code | Mnemonic | Description |

|-----|-----------|----------|

| 0000 | NOP | Keine Operation |

Google AdInline article slot

| 0001 | LDA | In A laden |

| 0010 | ADD | B addieren |

| 0011 | SUB | Subtrahieren |

| 0100 | STA | A speichern |

| 0101 | LDI | Sofort laden |

| 0110 | JMP | Unbedingter Sprung |

| 0111 | JC | Sprung bei Carry |

| 1000 | JZ | Sprung bei Null |

| 1110 | OUT | Ausgabe |

| 1111 | HLT | Anhalten |

Der Mikrocode erzeugt Signalsequenzen für jeden Taktzyklus.

SAP-1 in Sandbox installieren

  • Lade die Projekt-Dateien herunter.
  • Finde den Pfad in den Einstellungen: C:\Users\[User]\AppData\Roaming\Godot\app_userdata\Turing Complete.
  • Kopiere die .rom und Schaltpläne in den Benutzerordner.
  • Starte Sandbox und lade sap-1.

Teste es: Führe das Testprogramm aus (Mikado-Spiel aus Fort Boyard).

Montage-Probleme und Nuancen

  • Drehen von Elementen: Leertaste.
  • Auswählen: Shift.
  • In Architektur eintreten: Doppelklick.
  • Benutzerdefinierte Elemente: ein Eingang/Ausgang pro Tile, mindestens eine interne Komponente.

Das Spiel ist im Early Access: Die Kampagne bricht ab, aber Sandbox bietet volle Möglichkeiten.

Wichtige Punkte

  • SAP-1 ist eine Akkumulator-Architektur der 80er, die Speicher spart.
  • Mikrocode in ROM vereinfacht das Dekodieren (Alternative – reine Logik).
  • Beschränkung: 16 Bytes RAM ohne Daten im Programm.
  • Das Spiel lehrt alles von NAND bis Assembler.
  • ROM-Generierung via C++ für benutzerdefinierte Chips.

— Editorial Team

Advertisement 728x90

Weiterlesen