德州仪器于 1979 年推出的 TI-99/4A 家用电脑,在固件设计层面展现出一种超前的分层架构思维。这款机器以 TMS9900 16 位微处理器为核心,通过 8KB 控制台 ROM 与 GROM(Graphic Read-Only Memory)系统的组合,构建了一套完整的硬件抽象层,使得 BASIC 解释器与应用程序得以在无需直接操作硬件寄存器的情况下运行。这种设计理念在当时的家用电脑领域相当罕见,其工程参数与内存映射策略至今仍具有参考价值。
TMS9900 与内存空间的基础约束
TMS9900 是德州仪器推出的首款商用 16 位微处理器,采用 15 位地址总线设计,可寻址 32KB(准确说是 32K 字,即 64KB 字节空间)。然而,德州仪器为降低硬件成本,在控制台中采用了 8 位数据总线复用方案,导致实际可用的内存空间大幅缩减。控制台本体仅包含 8KB ROM 与 256 字节 RAM,两者均以 16 位方式访问。这种极度受限的资源配置,迫使固件设计团队必须采用精细的内存管理策略。
更关键的问题在于,TMS9900 的内存空间需要同时承载系统固件、视频处理器内存、声音芯片寄存器以及 GROM 访问接口。德州仪器的解决方案是将这些外设统一映射到特定的地址区间,通过内存映射 I/O(Memory-Mapped I/O)方式实现 CPU 与外设的通信。这种设计虽然在当时增加了固件复杂度,却为后续的设备扩展奠定了可预测的地址空间框架。
GROM 系统与 GPL 解释器的双重角色
TI-99/4A 固件架构中最具创新性的设计是 GROM(Graphic Read-Only Memory)系统。与传统 ROM 不同,GROM 采用 8 位串行接口,通过特定的地址寄存器进行读写操作,本质上是一种早期的内存映射只读存储设备。控制台配备的三片 GROM 芯片存储了 GPL(Graphic Programming Language)解释器,这是一套介于机器码与高级语言之间的解释型指令集。
GPL 解释器的存在使得 TI-BASIC 程序得以在无需完整编译的情况下执行。当用户输入 BASIC 命令时,解释器逐行读取存储在 VDP 内存中的程序代码,将其转换为 GPL 指令,再由 GPL 解释器翻译为 TMS9900 可执行的机器操作。这种三层执行架构虽然牺牲了执行效率,却极大地简化了 BASIC 程序的存储与分发 —— 程序以紧凑的字节码形式存储,占用空间远小于纯文本源码。
从工程角度看,GROM 的访问需要通过特定的地址寄存器进行控制。读操作使用 >9800(数据寄存器)与 >9802(地址寄存器),写操作则对应 >9C00 与 >9C02。固件在初始化阶段会将 GPL 解释器的入口地址加载至这些寄存器,此后所有对 GROM 的访问都通过这一接口进行。这种设计将串行存储设备的复杂性封装在固件层,上层应用程序完全无需关心 GROM 的物理访问细节。
内存布局与地址空间的工程划分
TI-99/4A 的 32K 地址空间被严格划分为多个功能区块,每个区块都有明确的用途与访问权限。地址 >0000 至 >1FFF 区间为控制台 ROM,存储中断向量、XOP(eXecute Operation)向量、GPL 解释器主体以及浮点运算例程。>4000 区间为 DSR ROM(Device Service Routine),包含磁盘控制器、RS232 等外设的服务程序,由 CRU 位配置选择激活。>6000 至 >7FFF 区间映射 cartridge 端口,支持最多 12KB ROM 与通过页面切换实现的额外 4KB 空间。
地址 >8000 至 >9FFF 区间是内存映射 I/O 的核心区域,集合了所有外设的寄存器映射。>8300 至 >83FF 区间为 256 字节的 scratchpad RAM,用于存储临时变量与堆栈数据。>8400 映射声音芯片(TI SN76477 或其变体),>8800 至 >8FFF 映射视频显示处理器(VDP)的数据与状态寄存器,>9000 至 >97FF 映射语音合成芯片(TMS5200),>9800 至 >9FFF 则完全用于 GROM/GRAM 访问。
值得注意的是,VDP 拥有独立的 16KB 视频 RAM,不在 CPU 地址空间之内。BASIC 程序在无内存扩展的情况下实际存储于 VDP 内存空间,CPU 通过 >8800 与 >8C02 地址访问这一区域。这种设计在当时颇为前卫 ——CPU 负责逻辑运算与程序流程控制,VDP 独立处理图形渲染,两者通过寄存器映射形成松耦合的协作关系。
固件参数与监控机制的可操作细节
理解 TI-99/4A 固件的工程实现,需要关注几个关键参数与监控点。控制台 ROM 的 8KB 空间包含完整的系统初始化例程,入口地址位于复位向量处,固件在上电后首先执行自检程序,验证 RAM 完整性并初始化 VDP。256 字节 scratchpad RAM 的使用受到严格限制 —— 固件将其划分为多个功能区,分别用于中断向量表暂存、键盘缓冲区以及系统标志位存储。
设备服务例程(DSR)的激活机制基于 CRU(Communications Register Unit)位控制。CRU 是 TMS9900 特有的外设控制接口,通过位操作指令快速设置外设状态。当程序访问磁盘驱动器或串口设备时,固件会根据当前 CRU 配置判断应调用哪个 DSR 模块,从而实现设备驱动的动态加载。这一机制在当时的家用电脑中相当先进,预演了现代操作系统的设备驱动模型。
cartridge 空间的页面切换是另一个值得关注的工程细节。>6000 至 >6FFF 区间固定映射 cartridge 基础 ROM,而 >7000 至 >7FFF 区间可通过固件切换以访问 cartridge 的其他 4KB 分页。这种设计允许开发者在 12KB 总容量限制内实现更复杂的程序结构,同时保持与现有 cartridge 的向后兼容。固件通过写入特定的页面寄存器控制切换时机,应用程序只需遵循固件提供的 API 接口即可完成分页操作,无需直接操作硬件。
固件设计的遗产与现代工程启示
TI-99/4A 的固件架构虽然在资源受限的时代背景下被迫采用诸多取巧方案,但其分层设计思路与现代工程实践高度契合。GPL 解释器的抽象层概念、内存映射 I/O 的设备统一管理、设备服务例程的动态加载机制 —— 这些设计在十余年后的 PC/AT 架构与早期 Windows 系统中以更复杂的形式得到延续。理解 TI-99/4A 的固件实现,有助于把握嵌入式系统设计的本质约束与应对策略。
对于当代硬件工程师而言,TI-99/4A 的案例提供了几个可迁移的经验。首先,资源受限不应成为放弃架构设计的借口 —— 固件团队在 8KB ROM 限制内仍实现了完整的硬件抽象层。其次,解释型中间层的引入虽然增加了解析开销,却能显著降低应用程序的开发复杂度与硬件耦合度。最后,统一的地址空间规划是系统可扩展性的基础 ——TI-99/4A 的 cartridge 扩展机制之所以能够稳定工作,正得益于清晰的地址布局与分页策略。
参考资料
- University of Geneva, "The TI-99/4A Internal Architecture"(https://www.unige.ch/medecine/nouspikel/ti99/architec.htm)
- AtariAge Forums, "TI-99/4A Memory Map"(https://forums.atariage.com/blogs/entry/12631-ti-994a-memory-map)