开发者生态
morning
ZX Spectrum 的图形桌面
摘要
A graphical desktop for the ZX Spectrum 48K, written in Z80 assembly. Overlapping windows with a z order and focus, pull down menus, a heap, an event queue, a storage layer with swappable backends, di...
the
and
that
with
48K
machine
from
one
was
bar
2026-09-20
1 阅读
约6分钟阅读
graemep
字号:
ZX Spectrum 48K 的图形桌面,用 Z80 汇编语言编写。具有 z 顺序和焦点的重叠窗口、下拉菜单、堆、事件队列、具有可交换后端的存储层、对话、控件、记事本、时钟、日历、两窗格文件管理器以及实际更改内容的设置面板。这一切都适合 1982 年的机器上的 48K,并且可以在单个 69,888 T 状态框架内拖动窗口。它在真实的东西上运行,而不仅仅是模拟器。早在八十年代,我就想要一台 Atari ST,但买不起。我真正想要的是 GEM:桌面、窗口、始终存在的菜单栏、机器是一个地方而不是提示的感觉。我有一个 Spectrum,我花了很长时间想知道你可以用它做多少事情。我开始写一些内容,但从未完成。就这样,完成了。它不是 GEM 的端口,也不会假装是。当你将它与 3.5 MHz Z80、48K RAM、具有属性冲突的一位显示器以及在绘制时从 CPU 窃取周期的视频芯片相比时,这个想法就变成了这个想法。很多答案比问题更有趣,而且几乎所有答案都来自测量机器而不是推理机器。这是一个有趣的项目,也是一种热爱的劳动,之所以写这么长,是因为测量结果很有用。如果你要在这个硬件上构建一些东西,下面的数字会让我花费很多晚上的时间。他们是你的。窗口重叠、z 排序、可移动、可调整大小、带有标题栏、关闭框和手柄。对焦位于 z 顺序的前面,因此抬起和对焦是一个动作。菜单 带有下拉、保存和点击测试的永久菜单栏。输入 Kempston 鼠标、Kempston 操纵杆和完整键盘矩阵,在三个表中重复解码。所有这一切都以事件的形式到来。事件 十六槽环。主循环不包含特定于窗口的代码。存储 六个向量背后的后端注册表。 RAM、磁带(通过真正的 ROM 加载程序)以及作为 RAM 磁盘的 128K 备用存储体。 esxDOS 有一个保留的 ID。内存 具有所有者字节(8,112 字节)的真实堆,分配大小适合其窗口的窗口缓冲区。应用程序 具有初始化、事件和绘制的描述符,以及换入和换出的每个实例状态。记事本、时钟、日历、指挥官、关于。持久性设置使用魔术字节和版本写入存储,并在启动时读回。屏幕截图: 两个窗口,按 z 顺序 记事本,带有 Sinclair 风格的移位报告光标 两个窗格命令器,在设备上而不是目录上 时钟和日历 工具链是本地的并且很小:pasmo 0.5.5,从源代码构建到 tools/ 中。 ./build.sh 将 src/zxdesk.asm 汇编为 build/zxdesk.tap ./run.sh 构建并加载到机器 MACHINE=128 ./run.sh 在 128K 上同样如此,并将设置放回 esxDOS 也在这里运行,在具有 64MB 卡映像的模拟 DivMMC 上。 tools/ 不在存储库中,因为 pasmo、模拟器和 esxDOS ROM 不是我可以重新分发的,因此您需要自己从 esxDOS 版本和 DivMMC 卡映像构建映像。一旦存在,启动tools/esxdos/esxdos.szx并且esxDOS已经驻留;机器 > NMI 为您提供文件浏览器。构建标志,全部通过 --equ 传递:DEMO=1 ./build.sh 自拖动构建,用于使用 DEMO 进行可重复捕获 NOWAIT=1,在没有光束调度程序 SCRIPT=1 的情况下进行相同的拖动 SCRIPT=1 ./build.sh 从合成输入 MOUSETEST=1 ./build.sh 驱动桌面 原始 Kempston 鼠标诊断 build.sh 必须显式传递 --name,因为 pasmo 从输出路径中获取磁带头名称,否则会完全按照写入方式获取将 build/zxde 放入标题中。如果代码已经增长到缓冲区,它也会拒绝构建磁带,因为否则溢出是无声的:第一个窗口抓取会覆盖程序,几秒钟后机器会进入 BASIC,并出现不相关的错误。在 Fuse 下拖动窗口需要空格键,而不是鼠标按钮。适用于 macOS 1.9.2 的 Fuse 在按住按钮时停止提供 Kempston 鼠标移动,因此指针会在开始拖动时冻结,并且窗口永远不会跟随。指向标题栏,按住空格键,移动,释放。鼠标对于其他一切都很好,并且按钮本身注册正确;停止的只是运动。这是模拟器,而不是桌面,我是如何证明 MOUSETEST=1 的:它每次读取一次鼠标端口,端口和屏幕之间没有任何东西,并且当按下按钮时计数器仍然保持静止。 ReadInput 中的 RiBtn 是 SPACE 发挥作用的原因,它的存在使得桌面可以在根本没有鼠标的计算机上使用。真正的 Kempston 鼠标可以正常拖动。 SCRIPT=1 是值得了解的。它通过合成输入事件列表而不是鼠标驱动桌面,因此交互(打开菜单、选择一个项目、将窗口拖动到另一个项目上、在字段中键入、保存)每次都以相同的方式运行
这篇文章对您有帮助吗?
订阅66必读
每日精选科技资讯,直达你的邮箱