Hotdry.
systems-engineering

42年前Visi On x86 GUI的SDK重建:DOS扩展器与PMODE/W兼容工具链

逆向恢复失落SDK,支持homebrew应用开发,集成DOS扩展器实现内存扩展与现代兼容,提供构建参数与仿真清单。

Visi On 是 1983 年 VisiCorp 推出的 IBM PC 首个图形用户界面操作系统,标志着 x86 平台 GUI 时代的开端。它运行于 MS-DOS 2.0 之上,需要 512KB RAM、5MB 硬盘、Mouse Systems 兼容鼠标和 CGA 640x200 单色模式。尽管创新性强,如多窗口、沙漏光标和在线帮助,但高硬件门槛和缓慢性能导致商业失败,SDK 从未公开发布,无第三方应用存世。

如今,42 年后,~nkali 在 SourceHut 上发起 vision-sdk 项目,通过逆向工程重建 Visi On SDK 工具链。该项目不仅解密安装包、逆向 VisiMachine 虚拟机,还开发 homebrew 测试应用,支持从零创建窗口、菜单、位图图形、字体加载、按钮和事件处理。关键里程碑包括:生成链接器脚本、补丁使 Visi On 在 Bochs/QEMU 中引导,以及模拟鼠标事件。

项目核心是复原构建流程:单一 Makefile 编译 C 代码,自动生成安装脚本、mini-FS 文件系统,并打包成 FAT 软盘镜像。应用可跨段调用函数,加载额外内存段,实现完整 OS 交互。例如,测试应用展示位图窗口、菜单响应和按钮点击,demo 视频可见于仓库。

为应对 Visi On 对 PC/AT IRQ 重定向问题及内存限制,重建 SDK 集成 DOS 扩展器兼容,特别是 PMODE/W。这款经典 DOS 扩展器(Charles Dye 开发)允许实模式 DOS 下运行保护模式代码,支持 DPMI 标准,扩展至 4GB 内存。兼容策略包括:

  1. 内存管理参数

    • EMS/XMS 模拟:使用 PMODE/W 的 UMB 链,提供上万页扩展内存,避免 Visi On 虚拟内存崩溃。
    • 段加载阈值:限制单段≤64KB,跨段调用用 “Magic” 指针(far call via thunk)。
    • HIMEM.SYS + EMM386 兼容:配置EMM386 NOEMS禁用冲突 EMS,启用 VCPI/DPMI 主机。
  2. 仿真环境清单

    组件 配置参数 目的
    Bochs cpu: count=1, model=286, ipb=offmegs:1024floppya: 1_2 visi.img 模拟 8086/286,避免 AT IRQ
    QEMU -cpu 486 -m 1G -drive file=visi.img,format=raw,if=floppy 快速测试,启用 PMODE/W
    PMODE/W PMODEW /D=1 /I=2048 DPMI 主机,初始堆 2048 页
    DOS MS-DOS 2.11 + HIMEM.SYS 原生 FS 支持

构建步骤(Linux 主机):

  1. 克隆git.sr.ht/~nkali/vision-sdkvision-homebrew-test-app
  2. make clean all:编译→链接(自定义 LDF 文件)→打包 FS→生成 FAT 镜像。
  3. 挂载镜像:mount -o loop visi.img /mnt验证.app 文件。
  4. 引导仿真器,安装应用:OS 菜单→安装→选择软盘。
  5. 测试:启动 app,验证事件循环(轮询 MENU/BTN 事件)。

风险与回滚:

  • IRQ 冲突:回滚到纯 8086 仿真,阈值irq_revector=off
  • 段溢出:监控SEGMEM fullness >90%,动态卸载字体。
  • 兼容性:优先 PMODE/W v9.13+,备选 CWSDPMI。

此工具链不止复古趣味,还启发现代 GUI 逆向,如 X11/Wayland 协议解析。未来可扩展游戏开发,利用位图加速和自定义字体。

资料来源: [1] https://git.sr.ht/~nkali/vision-sdk “Reverse engineering effort to build Visi On applications.” [2] https://en.wikipedia.org/wiki/Visi_On “Visi On was the first GUI for IBM PC.”

查看归档