给一台 1982 年出厂、内存只有 48KB、CPU 主频仅 3.5 MHz 的 ZX Spectrum 塞进一个带下拉菜单和重叠窗口的图形桌面,听起来像是某种脱离实际的复古狂想。

开发者 mindbox77 近日开源的 ZX Desk 打破了这个刻板印象。整个系统完全使用 Z80 汇编语言写成,不仅实现了层叠窗口、焦点切换与 16 槽事件环,还开辟出 8,112 字节的微型动态堆,内置了记事本、双栏文件管理器和时钟日历。更关键的是,作者把窗口拖动的核心开销压到了 59,858 个 T 状态(T-states),成功赶在单帧 69,888 T 状态的中断周期前完成渲染,在原装物理硬件上跑出了约 50 Hz 的平滑拖动。

但这并不是一个现代意义上的通用操作系统。剥离掉表面光环后,它更像是一场关于硬件极限边界与汇编优化的外科手术式实验。

单帧算力攻防:69,888 周期预算分配 48K 物理中断周期(帧预算) 69,888 T 窗口拖动实测开销(离屏窄条修补) 59,858 T (约 50 Hz) 完整重绘初始开销(非拖拽态) 71,274 ~ 73,099 T (超出一帧)

严酷物理铁幕下的周期博弈

在上世纪八十年代,搭载 GEM 图形界面的 Atari ST 售价高昂,大部分家庭只能守着廉价的 ZX Spectrum。在 48K 裸机上搞重叠窗口此前一直被视为天方夜谭:不仅因为总内存捉襟见肘,更因为其臭名昭著的硬件约束——3.5 MHz 的 Z80 没有图层概念,屏幕具有 8x8 像素属性冲突(Attribute Clash),且 ULA 视频芯片在向屏幕扫描绘图时会抢占总线,强行偷走 CPU 执行周期。

以往复古社区的图形方案往往选择向上妥协。例如功能完备的 SymbOS 要求至少 128KB 甚至 1MB 内存的扩展平台(如 ZX Spectrum Next),而搭载抢占式内核的 Workbench +3e 也需要后期的硬件启动器。要在最原始的 48K 裸机上维持 WIMP(窗口、图标、菜单、指针)交互,唯一的方法就是把每一个指令的机器周期算到极致。

ZX Desk 在内存映射上做出了泾渭分明的划分:在 $DF50-$FEFF 开辟出一段 8,112 字节的堆,并为每个块打上拥有者标记,专门给动态尺寸的窗口分配图形缓冲。为了绕过 ULA 内存争用的惩罚,整个架构把高频代码全塞进了无争用区域,并在关键的填充与重绘之间划下了铁律。

决定算力上限的往往不是天马行空的抽象架构,而是对时钟晶振的精准度量。
工程真相:系统层级与能力边界 实现的极致特性 • 单帧 59,858 T 状态极速拖拽 • 8,112 字节微型动态内存堆 • 16 槽事件环与六向量存储抽象 • 栈操作全程开放中断防丢帧 无法逾越的简陋边界 • 无动态加载器(全静态编译) • 缺失抢占调度与进程内存隔离 • 记事本无剪贴板、撤销与换行 • 后台窗口停止更新(时钟冻结)

50Hz 拖拽背后的障眼法与妥协

作者打出的 50 Hz 单帧拖拽并不是全屏重绘的奇迹,而是一套极其精巧的局部修补术。

在原始测算中,完整重绘一个包含标题与正文文本的初始窗口,开销高达 71,274 至 73,099 T-states,光是 27 个字符的字体渲染就吃掉了一半以上的周期。如果每次鼠标位移都触发整窗重绘,帧率瞬间就会跌破一帧的容忍阈值。真正能跑到 59,858 个 T 状态的,仅仅是基于离屏缓冲、脏矩形与窄条修补(narrow-strip restoration)的微调移动路径。

更耐人寻味的是中断处理上的艰难取舍。为了追求极致的内存擦写速度,Z80 开发者通常会使用基于栈指针(SP)的清屏技巧,但这往往需要全程关中断(DI)。而 ZX Spectrum 的物理硬件只把中断信号拉低 32 个 T 状态,若在此期间屏蔽中断,中断信号就会彻底丢失而非顺延。ZX Desk 为了防止按键与时钟彻底罢工,宁愿放弃部分基于栈的清屏速度,选择在填充全程保持中断开启,以容忍时序瑕疵的代价保全系统的整体稳定。

  • 结论.极端受限环境下的流畅交互,从来不是无脑拉高吞吐,而是主动把非核心运算剔除出主刷新路径。

桌面框架还是操作系统

在技术定性上,将 ZX Desk 称为 GUI 操作系统多少有些溢美。更审慎的定义应当是:一个高度集成的紧凑型图形桌面环境与单体框架

缺乏内存保护机制,应用越界后整机崩溃回退到底层解释器
缺乏内存保护机制,应用越界后整机崩溃回退到底层解释器

它缺乏现代操作系统赖以立足的核心支柱:没有可执行文件加载机制,所有组件全由汇编静态链接打包;没有抢占式多任务与保护模式,任何一个应用越界就能导致整机崩溃回退到 BASIC;后台应用也并不具备真正的并发活性,被遮挡的时钟窗口会直接冻结。此外,内置的应用极为简陋,记事本不支持文本选区、剪贴板、撤销,甚至不支持自动换行。

硬件差异也成了检验代码的严酷试金石。在真实 48K 和 128K 物理机调试中,作者排查出了光标在屏幕上半区莫名消失的光栅时序缺陷,而这个时序 Bug 在主流的 Fuse 和 ZEsarUX 模拟器里从未暴露过;而在 macOS 环境下的 Fuse 1.9.2 中,长按鼠标按键又会莫名掐断位移数据,逼得作者必须额外映射空格键来辅助拖拽。

  • 风险.该项目截至目前仅有单一提交且关闭了反馈通道,存储抽象层对 esxDOS 的适配也主要基于 DivMMC 模拟镜像,缺乏社区在各种 Revision 物理机上的独立复测数据。

与其说它提供了一套可以投入日常使用的微型桌面,倒不如说它留下了一份极具参考价值的裸机测量手册。它用一万多行严丝合缝的汇编指令证明:即使退回四十年前那片算力贫瘠的焦土,只要把测量做透,老架构依然能挤出令人惊叹的秩序感。