## 在 Turing Complete 中构建 SAP-1:开发者分步指南
在游戏 Turing Complete 中,你需要组装 SAP-1 计算机(Simple As Possible)——一种经典的 8 位架构,带有 4 位地址空间(16 字节内存)。它是一种基于累加器的模型,所有操作都使用累加器作为主要寄存器。游戏让你从基本逻辑门逐步推进到完整架构和汇编程序。
SAP-1 复制了 Ben Eater 的设计:两个寄存器(累加器和辅助寄存器),16 字节内存。游戏限制——程序块中无法保存数据。
SAP-1 的主要组件
架构包括:
- 指令解码器 基于 ROM 芯片以简化微码。
- 寄存器:累加器 (A)、指令 (IR)、内存 (RAM)。
- ALU:加法器/减法器,带有 Z(零)和 C(进位)标志。
- 控制器:微码,带有 MI、RO、II、AI、AO 等信号。
布局遵循 Ben Eater 的原版:左侧内存,中央 ALU,右侧输出。
微码实现
指令解码器使用带有微程序的 ROM。为了加载到游戏中,生成 ROM 文件。下面是创建微码的 C++ 代码(考虑了 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;
}
使用 C++20 编译(VS Code 中的 gnu++20)。将 .rom 文件复制到游戏的用户文件夹。
处理器命令
| Code | Mnemonic | Description |
|-----|-----------|----------|
| 0000 | NOP | 无操作 |
| 0001 | LDA | 加载到 A |
| 0010 | ADD | 加 B |
| 0011 | SUB | 减 |
| 0100 | STA | 存储 A |
| 0101 | LDI | 立即加载 |
| 0110 | JMP | 无条件跳转 |
| 0111 | JC | 进位时跳转 |
| 1000 | JZ | 零时跳转 |
| 1110 | OUT | 输出 |
| 1111 | HLT | 停止 |
微码为每个时钟周期生成信号序列。
在 Sandbox 中安装 SAP-1
- 下载项目文件。
- 在设置中找到路径:
C:\Users\[User]\AppData\Roaming\Godot\app_userdata\Turing Complete。 - 将
.rom和原理图复制到用户文件夹。 - 启动 Sandbox 并加载
sap-1。
测试:运行测试程序(Fort Boyard 中的拔棒游戏)。
组装问题与细节
- 旋转元件:空格键。
- 选择:Shift。
- 进入架构:双击。
- 自定义元件:每个图块一个输入/输出,至少一个内部组件。
游戏处于早期访问阶段:战役中断,但 Sandbox 充满可能性。
要点
- SAP-1 是 80 年代的累加器架构,旨在节省内存。
- ROM 中的微码简化了解码(备选——纯逻辑)。
- 限制:16 字节 RAM,程序中无数据。
- 游戏从 NAND 到汇编教导一切。
- 通过 C++ 生成 ROM 用于自定义芯片。
— Editorial Team
暂无评论。