在经典的紧凑型 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 字长,先填充后执行)。核心逻辑:
-
状态跟踪:
- 维护全局
last_data_bus: u16,记录最近成功读 / 写数据(读时设备响应或内存值,写时 CPU 输出)。 - 地址命中检查:优先设备 / 内存映射,若 miss 则返回
last_data_bus,并模拟 DTACK 延迟(~150ns,参考 MC68000 时序图 S6/S8 周期)。
- 维护全局
-
时序参数:
参数 值 说明 DTACK 延迟 150-250ns 自动生成,覆盖全地址空间 预取队列深度 2 words 影响残留指令 opcode,如 6116 电压衰减模拟 无需(数字级) 直接复用 last_data,真实衰减 < 1 周期 RAM 配置阈值 1-4MB Plus/SE 影响地址地图,空区扩展 -
监控与回滚清单:
- 日志点:钩子空地址读,记录地址 /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。
-
伪码示例(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)