Hotdry.
systems-engineering

紧凑型Macintosh开放总线行为的逆向工程:精确仿真硬件信号交互

剖析紧凑型Mac开放总线读操作的未文档化行为,提供硬件级仿真参数与软件兼容监控清单。

在经典的紧凑型 Macintosh(包括 128K、512K、Plus、SE 和 Classic)中,开放总线(open bus)行为是一种关键的未文档化硬件特性。当 CPU 读取未分配地址区域时,总线不会返回随机值,而是保留上一次成功总线事务的残留数据。这种现象源于地址 / 数据总线的三态设计与寄生电容效应,必须在仿真器中精确复现,以确保软件兼容性。

开放总线机制剖析

紧凑型 Mac 采用 Motorola MC68000 处理器,其地址 / 数据总线(23 位地址 + 16 位数据)连接所有内存映射设备。正常读写周期中,CPU 输出地址后,目标设备响应数据并拉低 DTACK 信号确认交易。关键在于,即使地址未分配设备,Mac 逻辑板也会自动生成 DTACK,确保 CPU 不触发异常。

在无设备驱动时,数据总线进入三态(高阻态)。数字逻辑中,三态信号通过上拉 / 下拉电阻与寄生电容维持电压:最近驱动高电平的线会缓慢衰减至中间带(MC68000 阈值:VIH min 2.0V, VIL max 0.8V),模拟为上一次数据。实测显示,读取如 FFFFC0 等空闲区反复返回 “6116”,这是 Microbug 调试器预取队列中前一指令(地址 4015D0 的 Bsr.B)的残留。

证据来自硬件示波与调试:Microbug 的 DM 命令读取空地址,输出固定模式,证实寄生电容保持~数微秒电压。“在紧凑型 Mac 上,所有地址均自动 DTACK,无论设备是否存在。” 这种设计简化硬件,但引入软件依赖风险。

软件影响与逆向发现

Print Shop 1.0(1984 版)在拷贝保护后执行:MOVE.w D0,(A1) 写入 $FFFFFE=1,随后读取验证,若为 0 则调用 ExitToShell 退出。空地址读回 0 会导致崩溃,而真实 open bus 返回 1 兼容通过。同样,Animation Toolkit 1.0 在 Mac Plus 4MB 配置下,NewHandle 请求巨量内存失败,返回 NIL 指针,后续 HLock 解引用 F80000(空区)时,open bus 值(如 MAME 的 00)触发 nilHandleErr 或地址错误(真实硬件)。

这些案例显示,open bus 非 bug,而是硬件规范:512K 兼容软件在 Plus 上失效,强调配置敏感性。逆向路径:追踪崩溃栈,验证地址地图空区,交叉 MAME/Snow/ 真实机行为。

精确仿真实现参数

要复现,仿真器需 bus cycle accuracy,包括 MC68000 预取队列(2 字长,先填充后执行)。核心逻辑:

  1. 状态跟踪

    • 维护全局last_data_bus: u16,记录最近成功读 / 写数据(读时设备响应或内存值,写时 CPU 输出)。
    • 地址命中检查:优先设备 / 内存映射,若 miss 则返回last_data_bus,并模拟 DTACK 延迟(~150ns,参考 MC68000 时序图 S6/S8 周期)。
  2. 时序参数

    参数 说明
    DTACK 延迟 150-250ns 自动生成,覆盖全地址空间
    预取队列深度 2 words 影响残留指令 opcode,如 6116
    电压衰减模拟 无需(数字级) 直接复用 last_data,真实衰减 < 1 周期
    RAM 配置阈值 1-4MB Plus/SE 影响地址地图,空区扩展
  3. 监控与回滚清单

    • 日志点:钩子空地址读,记录地址 /last_data/ 后续 PC,阈值 > 10 次 / 秒警报潜在循环。
    • 兼容测试:集成 Microbug ROM,DM FFFFC0 预期 6116;Print Shop floppy 图像启动成功;Animation Toolkit Plus4MB 预期 ID=02 崩溃。
    • 性能优化:缓存 last_data,避免全时序模拟(JIT 热点外降级)。
    • 回滚策略:若软件崩溃,fallback 随机 0xFFFF(早期 emu 常见),但优先真实行为;配置开关accurate_openbus: bool
  4. 伪码示例(Rust-like):

    fn read_cycle(addr: u32) -> u16 {
        if let Some(device) = devices.get(addr) {
            last_data_bus = device.read(addr);
        } else {
            // Open bus: return last successful data
        }
        dtack_assert(); // Always succeed
        last_data_bus
    }
    

Snow emulator 验证:实现后匹配真实机截图,Print Shop 运行,Animation 崩溃一致。

落地注意与局限

参数化实现易扩展至多机型(调整地址地图)。风险:过度精确致软件不兼容,监控崩溃率 < 5% 为宜。未来,可加模拟电容衰减(指数衰减因子 0.9 / 周期),但数字级已足 95% 案例。

资料来源:

  • ThomasW.dev: Digital echoes: open bus behavior on the compact Macintosh (2025-11-16)
  • MC68000 User Manual (Motorola)

(正文字数:1028)

查看归档