一个原生 SwiftUI Apple II 系列模拟器工程,以 Apple IIc 为重点,并覆盖 Apple II+ 与 Apple IIe 的常用启动配置;它采用硬件总线模型,而非“运行 BASIC 的终端”。
Apple II Emulator 是一个为 macOS 打造的原生 Apple II 系列模拟器。它的目标不是把经典软件包装成一个终端,而是以可读、可验证的硬件模型重现 6502、内存映射、视频软开关、Disk II 与一位扬声器的协作方式,并按软件需要选择 Apple II+、IIe 或 IIc ROM。
项目使用 Swift、SwiftUI、AppKit、Foundation 和 AVFoundation 构建,不依赖第三方框架。界面保留了 Apple II 时代的显示器与塑料机箱质感,同时将 ROM、磁盘映像、游戏库和输入控制保持在可直接操作的 macOS 应用中。当前重点是可靠启动和运行经典软件;部分外设与受保护磁盘格式仍在持续完善。
- 65C02 核心(包含 IIc 固件所用的 65C02 指令、十进制算术、JMP 间接寻址页尾缺陷);
- IIc 主/辅助 RAM、80STORE、ALTZP、80 列、双高分辨率和 ROM 银行切换;
- 键盘锁存器、扬声器软开关、40/80 列文字、Lo-Res、Hi-Res、Double Hi-Res 画面;
- 应用内置 Apple IIc ROM 00、03、04、FF,以及仅用于输入排查的诊断 ROM;
- 集成双驱动器 IWM/Disk II,支持 DOS 顺序
.dsk/.do、13 扇区.d13、ProDOS 顺序.po、.nib与 5¼ 英寸.2mg/.2img映像;.2mg/.2img与 WOZINFO的写保护标记会传递到 IWM 写保护感测;WOZ 1.x/2.x 保留 quarter-track 映射,支持 BITS 与 FLUX 轨道读取、弱位近似、每驱动器独立的 MC3470 读放大器增益 HLE,以及带 CRC 的 WOZ 2 导出; - IIc 内置双 6551 ACIA:端口 1(打印机,
$C098-$C09B)和端口 2(调制解调器,$C0A8-$C0AB)具备双级发送缓冲、收发/溢出/帧错/校验错状态与按字长、校验、停止位计算的 CPU 周期时序,并可从“串口”菜单连接到用户选择的 macOS/dev/cu.*设备;设备拔出或主机 I/O 失败时会关闭失效连接,供随后重新连接; - Apple II+/IIe 的 Mockingboard:slot 4/5 的双 6522 VIA 和双 AY-3-8913(
$C0C0-$C0CF/$C0D0-$C0DF)实现 PSG 寄存器总线、定时器 IRQ 与在模拟线程上按 6502 周期合成的音频;Phasor Native 的 Device Select($C0n5)会将两个 VIA 扩展为四颗 AY-3-8913,以双倍 AY 时钟保持双声道的周期同步混音,并覆盖 AY2 锁存地址镜像至 AY1、双芯片读数据 OR 合并的 GAL 行为;Echo+ 的镜像$C4xx页映射至第二颗 VIA 及其 AY 对;原生$C4xx卡页还译码两颗 SSI-263 的五个属性寄存器、A/R 请求线与直连 IRQ(Mockingboard 兼容模式则接至 VIA CA1),其 HLE 音频遵循 CPU 周期、寄存器属性和五级低通声道;Apple IIc 保留 slot 4 的内置鼠标接口,不会映射此卡; - IIc 内置鼠标接口:slot 4 的 6821 PIA(
$C0C0-$C0C3)握手协议、位置/按键、夹紧范围与移动/VBL 中断;显示区域的鼠标移动会馈入该硬件; - 主板磁带输入/输出(
$C060/$C020)与 Apple II+ 四路 annunciator($C058-$C05F)软开关; - 内置游戏库按标题首字母分组,并提供 Apple Writer、WordPerfect、VisiCalc、Copy II Plus 与 Apple Pascal 等独立“软件”启动项;
- 菜单栏提供“ROM”“磁盘”“游戏”“软件”和“串口”:可选择内置 ROM、按需打开已验证的用户 ROM 映像,或独立装入磁盘映像。
- “调试”菜单可显示实时 CPU 寄存器、周期和 Disk II 状态;暂停后“单步执行”仍走完整的 CPU 总线周期,不会跳过 I/O 软开关。该菜单也提供会话内的“快速保存状态”(Command-Shift-K)和“快速恢复状态”(Command-Shift-L):快照包含 CPU、主/辅 RAM、软开关、Disk II、SmartPort、Mockingboard、串口、鼠标和磁带的模拟硬件状态;恢复时会丢弃旧执行批次并按快照中的 ACIA 线路格式重新配置已连接的 macOS 串口。快速状态仅驻留内存,关闭应用后不会保留。
- ROM 菜单可额外打开用户有权使用的 ROM 映像:Apple II/II+ 12 KB,或 Apple IIc 16 KB / 32 KB;加载后会按映像类型切换机器并重置。
- 不依赖第三方库,可直接用 Xcode 打开
Package.swift。
cd AppleIIEmulator
swift run若要构建带图标的本地 App,请运行 make package-app,然后打开 build/AppleIIEmulator.app。首次启动默认使用内置 Apple II+ Autostart ROM,显示经典 APPLE ][ 开机画面;默认不插入磁盘。通过“游戏”菜单选择游戏会自动装入驱动器 1 并重新启动。测试启动盘仅保留在“磁盘”菜单中,用于验证 ROM、IWM、GCR 解码和 $0801 引导链。点一下屏幕即可输入;若要验证键盘回显,可在“ROM”菜单选择“内置诊断 ROM”。
第三方 .dsk / .do(DOS 顺序)、.d13(13 扇区)、.po(ProDOS 顺序)、.nib、5¼ 英寸 .2mg/.2img 或 WOZ 1.x/2.x 位流映像可通过“磁盘”菜单独立装入驱动器 1 或 2;之后按 Command-R 重置即可由该 ROM 启动。SmartPort 硬盘是独立的 slot 7 设备,可从“磁盘”菜单装入 512 字节块的 .po/.hdv/.img/.2mg/.2img 映像;在 Apple II+/IIe 上,“从 SmartPort 硬盘启动”会进入 $C700 卡 ROM,由该 ROM 将 ProDOS block 0 读入 $0800 后执行。WOZ 会遵从其 INFO 写保护位;对可写 BITS 映像,IWM 写入保留在当前磁表面中。WOZ 2.1 的 FLUX 间隔以 125 ns tick 读取,并由驱动器上的数字锁相环恢复为控制器位单元;首次写入 FLUX 磁道会将该磁道恢复为 BITS 工作表面,导出时再将修改的位单元重新量化为 FLUX,未修改的 FLUX 磁道仍按原始间隔保留。“磁盘 → 将驱动器 N 另存为 .woz…”会导出带 CRC、保留有效 BITS/FLUX 轨道与 quarter-track 映射的 WOZ 2 文件,且始终要求选择新路径,不会改写原始镜像;未修改磁表面时会保留 META、WRIT 和兼容的非磁表面扩展块,修改后会丢弃描述旧 BITS 校验的 WRIT。.nib 导出仍适用于标准 35 磁道 NIB 流。请只使用你有权使用的磁盘映像。
随 App 发布的游戏映像位于 Sources/AppleIIEmulator/Resources/Games/,构建时会打包进应用资源。可在窗口的 GAME 菜单或菜单栏“游戏”中选择“已下载游戏”,再按首字母选择游戏;它会装入驱动器 1,并以 Apple IIe 游戏兼容模式启动。发布后的 App 只枚举自身资源包,不依赖工作区的 Downloads 目录;“从已下载游戏库打开…”仍保留,供选择后来新增但尚未打包的本地映像。“最近玩过”会同时记录内置游戏和用户装入的一到两张启动磁盘,按最近顺序保留 8 项并去重;若磁盘文件后来移动或删除,重新打开该项时会自动移除失效记录。
“软件”菜单将内置生产力软件按其所需的 IIe ROM 与磁盘布局启动。Apple Pascal 1.3 会将启动盘和工具盘分别装入两个驱动器;WordPerfect 1.1 使用独立的持久化工作盘,避免覆盖随 App 发布的原始映像。
当前版本以启动和执行为目标。Apple IIc 的两个 6551 ACIA 可从“串口”菜单连接到用户选择的 macOS /dev/cu.* 设备;主机 I/O 在独立队列上运行,收发字节仍经 ACIA 寄存器和 6502 周期时序进入模拟器,字长、奇偶校验、停止位和波特率也会同步到 macOS termios,并以 macOS PTY 端到端回归覆盖主机收发、设备 EOF/错误断开与重连安全。另有显式授权才会运行的实体回环验收:设置 APPLEII_REAL_SERIAL_PATH 后,它以 9600 8N1 发送四字节固定探针并要求原样回显。标准 macOS termios 未提供 3600-baud 档,选择该 ACIA 档位时会明确报错,不会以错误速率通信。Mockingboard 目前覆盖双 VIA/双 PSG 的常用音乐路径、Timer 1/2 IRQ 与 CPU/T2 时钟的 VIA 移位寄存器;Phasor 已覆盖四 AY 的 Native Device Select 和混音,以及 SSI-263 的属性寄存器、周期驱动 A/R/IRQ 握手和 HLE 音频。该 HLE 按公开音素码表区分停顿、元音/共鸣、爆破和擦音的激励源,并按公开寄存器和五级滤波结构建模;因缺少可验证的内部音素 ROM 数据,它不是对原芯片波形的逐样本复刻。清理过的 WOZ 弱区按 MC3470 的四位延迟窗口处理;长时间无跃迁会提高每个驱动器独立、可快照的确定性 HLE 增益,逐步提升背景假脉冲的概率。FLUX 使用以磁道为单位的数字锁相恢复,写入后会重新量化为 125 ns tick FLUX 间隔。实盘可校准的逐元件模拟读放大器仍待实现。因此它不是逐周期、全外设覆盖的 Apple IIc 保真模拟器。
