65.9K
CodeProject 正在变化。 阅读更多。
Home

PCE/macplus,终极 68K Macintosh 模拟器

2023年5月7日

CPOL

15分钟阅读

viewsIcon

3560

终极 68K Macintosh 模拟器

我长期以来一直在寻找一款能够运行 System 7 及更早版本的、功能齐全的 68k Macintosh 模拟器,并支持声音和串行端口通信。Mini vMac 由于缺乏串行端口模拟而不符合我的要求。Basilisk II 尽管是一款非常强大的模拟器,支持以太网,但它并不官方支持 24 位寻址,因此无法运行 7.5.5 之前的 Mac 系统,至少在没有 MODE32 扩展的情况下是这样。

幸运的是,当我发现 PCE/macplus 时,情况发生了变化。这是一款高度可定制的模拟器,可以模拟从 Macintosh 128K/512K 到 Macintosh SE 的许多 68k 紧凑型 Macintosh 型号。我需要的串行模拟也得到了支持。本文将描述我与 PCE/macplus 的各种实验,并分享一些有趣的发现。

下载二进制文件

适用于各种 Macintosh 系统的 Windows 模拟器二进制文件以及源代码可以从 PCE 的 下载页面 下载。如果您有兴趣,在同一页面上,您还可以找到 PC XT、Atari、CP/M 和其他机器的模拟器。

在 Windows 上运行 PCE/macplus 应该很简单。只需解压 ZIP 文件,找到 run.bat 批处理脚本并执行它。运气好的话,您应该很快就能在模拟器屏幕上看到您最喜欢的 68k Macintosh 系统。但是,由于 PCE/macplus 的许多令人兴奋的功能(如通过串行端口的 PPP 模拟)在 Windows 上不受支持,因此我有时间,我决定花一些时间为我的首选 Linux 发行版 Ubuntu 编译 PCE/macplus,以便能够探索其全部功能。

从源代码编译 pce/macplus

首先,从同一个下载页面下载源代码并解压。之后,安装所需的 X11 和 SDL 开发库。

sudo apt-get install libx11-dev libx11-doc libxau-dev libxcb1-dev libxdmcp-dev 
x11proto-core-dev x11proto-input-dev x11proto-kb-dev xorg-sgml-doctools xtrans-dev
sudo apt-get install libsdl1.2-dev libsdl1.2debian

接下来,配置 PCE/macplus 以构建支持大多数可用功能。

./configure -with-x --with-sdl --enable-tun --enable-char-ppp --enable-char-tcp 
--enable-sound-oss --enable-char-slip --enable-char-pty --enable-char-posix 
--enable-char-termios

这部分需要一点解释。提供的选项启用了通过串行端口的 PPP 模拟(对于 Internet 访问是必需的,因为 PCE/macplus 不模拟以太网卡),并启用了使用 SDL(声音支持必需)和 X11 库(重要,否则模拟器运行时将没有视频输出)进行构建。最后,尽管 Open Sound System (OSS) 在 Ubuntu 16 中已被弃用,但我们还是使用 –enable-sound-oss 启用它,以防万一。

配置完成后,检查输出并确保已启用请求的模块(PPP、SDL 等)。

pce 20170208-df19414 is now configured:
CC:                      gcc -g -O2
LD:                      gcc

prefix:                  /usr/local

Emulators built:         atarist cpm80 ibmpc macplus rc759 sim405 sim6502 simarm sims32
Emulators not built:
ROMs built:
ROMs not built:          ibmpc macplus
Terminals built:         null x11 sdl
Terminals not built:
Char drivers built:      null stdio posix ppp pty slip tcp termios
Char drivers not built:  wincom
Sound drivers built:     null wav oss sdl
Sound drivers not built:
Enabled options:         tun
Disabled options:        readline

如果结果显示 SDL 或 X11 未构建,请检查您是否已安装必要的开发库。

最后一步是将模拟器安装到 /usr/local/bin/pce-macplus。这还将安装在配置过程中构建的其他模拟器(ataristcpm80ibmpc 等)。

make
sudo make install

一切完成后,在命令行中键入 pce-macplus,您应该会看到模拟器终端界面。

macdev@macdev-VirtualBox:~/Documents/pce-20170208-df19414$ pce-macplus
pce-macplus version 20170208-df19414
Copyright (C) 2007-2012 Hampa Hug <hampa@hampa.ch>
SYSTEM:   model=mac-plus
*** RAM not found at 000000
CPU:      model=68000 speed=0
VIA:      addr=0xefe000 size=0x2000
SCC:      addr=0x800000 size=0x400000
RTC:      file=pram.dat realtime=1 start=<now> romdisk=0
KEYBOARD: model=1 international=0 keypad=keypad
IWM:      addr=0xd00000
TERM:     driver=null ESC=ESC aspect=4/3 min_size=512*384 scale=1 mouse=[1/1 1/1]
type 'h' for help

您现在可以键入 q 退出,因为在您可以使用此模拟器运行您最喜欢的 Mac 系统软件之前,还有一些其他步骤需要完成。

配置模拟器

与 Mini vMac 不同,Mini vMac 有一个用户界面供用户加载磁盘映像并配置速度或显示等各种其他选项,PCE/macplus 使用文本配置文件。作为开始,下载您喜欢的 Macintosh 机器的 PCE/macplus Windows 版本并解压。然后创建一个名为 run.sh 的文件,其中包含以下命令,将其放在同一个文件夹中并执行它。

pce-macplus -v -c mac-se.cfg -l pce.log -r

这里 mac-se.cfg 是要加载 (-c) 并运行 (-r) 在模拟器中的配置文件的名称,结果以详细模式 (-v) 写入日志文件 (-l)。然后您将看到两个窗口——一个是由模拟的 Macintosh 机器组成的,另一个显示各种日志消息。

Screenshot from 2017-03-25 15-12-54

有关可用选项的更多信息,请参阅此 带注释的示例配置文件

声音支持

支持各种声音输出方法:null(无声音)、OSS(使用 Open Sound System 将声音输出到 DSP 设备)和 SDL(Simple DirectMedia Layer)。还支持将声音输出录制到 WAV 文件。您可以通过在 config 文件 sound 部分指定 driver 字符串来配置输出方法。

sound {
......
#driver = "null"
#driver = "wav:wav=speaker.wav:lowpass=0:wavfilter=0"
#driver = "oss:dev=/dev/dsp:wav=speaker.wav:lowpass=0:wavfilter=0"
driver = "sdl:wav=speaker.wav:lowpass=0:wavfilter=0"
}

在我的实验中,SDL 工作最好,也是最可靠的方法。OSS 在 Ubuntu 16 上效果不佳,因为它已被弃用。它要么完全没有声音,要么在扬声器上播放失真的声音,可能是因为 /dev/dsp 的频率和比特率未正确配置。但是,无论使用哪种方法,PCE/macplus 模拟的 Macintosh 128K 在启动时都不会发出任何提示音——只听到一些静电噪音。

硬盘模拟

我在玩 PCE/macplus 时遇到一个有趣的问题。我使用 Linux dd 命令创建了一个 1000MB 的硬盘映像,通过 config 文件将其附加到机器上,并使用 Apple HD SC Setup 来初始化驱动器并创建分区。令人惊讶的是,尽管更改了各种选项,该工具只创建了一个 20MB 的分区,而将模拟硬盘的其余部分留为空闲。我在多个大型硬盘上(高达 2GB,包括模拟和实际硬盘)使用此工具没有出现任何问题。那这次出了什么问题?

经过大量调试,问题出在 PCE/macplus 忠实地尝试模拟原始 Apple 硬盘驱动器,甚至在配置文件中将 SEAGATEST225N 分别指定为供应商和产品字符串。

device {
   id      = 0
   drive   = 0x81

   vendor  = " SEAGATE"
   product = "          ST225N"
}

此配置模拟了当时许多紧凑型 Macintosh 随附的 Seagate ST225N 20MB 硬盘驱动器。虽然这在某种程度上是好的,因为模拟的硬盘驱动器会立即显示在 Apple HD SC Setup 中,而无需 补丁,但它也导致 Apple HD SC Setup 认为硬盘驱动器只有 20MB,并且只创建一个 20MB 的分区,甚至没有查询驱动器的实际大小。解决方案是更改供应商和产品名称(同时保持原始字符串长度),并使用 Apple HD SC Setup 的已修补版本来初始化驱动器。

磁盘映像格式

对于支持的 Macintosh 型号,添加新的硬盘映像就像在配置文件中添加一个 disk 部分一样简单。

disk {
	drive    = 2
	type     = "auto"
	file     = "sample_apps.img"
	optional = 0
}

在我的测试中,HFS 分区映像和 HFS 整个硬盘映像都得到了支持。可以在 config 文件 sony 部分使用 insert_delay 选项来指示模拟器在启动后等待多长时间才能插入磁盘映像。如果您有多个磁盘映像,则需要此选项,因为一次性插入所有映像会使 Mac 感到困惑,并可能导致其中一些映像不显示,这在我实验中发生了几次。

不幸的是,与 Mini vMac 不同,似乎没有简单的机制可以在模拟器运行时插入或移除磁盘映像。唯一的方法是按住视频窗口中的 Ctrl-` 来暂停模拟器,然后在 PCE/macplus 终端窗口中键入 m emu.disk.insert <drive>:<fname>m emu.disk.eject <drive>。这种方法不仅用户不友好且违反直觉,而且在我尝试时从未正常工作。要么无法弹出磁盘,要么插入后需要重新启动才能显示。如果您需要安装需要插入/移除多个磁盘的软件,只需在启动模拟器之前在 config 文件中全部挂载——大多数安装程序都会知道如何在存在多个磁盘时自动弹出最后一个磁盘并继续下一个磁盘。

我遇到的另一个问题是磁盘映像文件的扩展名。在少数情况下,模拟器似乎使用文件扩展名来猜测映像类型。例如,当文件扩展名为“.img”时,同一个磁盘映像可以工作,但如果使用“.dsk”或“.image”则不再被识别。关于支持哪些类型的映像以及除“auto”之外还能接受哪些值作为磁盘类型,也没有明确的文档。

Macintosh 512K 和 HD20 INIT

当我在玩 Macintosh 512K 模拟器并尝试挂载 HFS 磁盘映像时,我注意到一些奇怪的事情。众所周知,Macintosh 512K(和 128K)只有 400K IWM 软盘驱动器,并且只支持原始 Macintosh 文件系统 (MFS)。虽然外部 800K 软盘驱动器可能工作,但内部软盘驱动器即使安装了内部 800K 驱动器也无法读取 800K 磁盘,除非 ROM 也已升级。为此,PCE/macplus 配置文件中有一个名为 cfg.sony 的选项,如果设置为 1,则启用对 800K Sony 软盘驱动器的支持。

cfg.sony = 1
rom {
	file    = "mac-plus.rom"
	size    = 128K
	address = 0x400000
}
if (cfg.sony) {
	rom {
		file    = "macplus-pcex.rom"
		address = 0xf80000
		size    = 256K
	}
}

如果 cfg.sony1,则会加载一个名为 macplus-pcex.rom 的扩展 ROM,从而启用对 800K 软盘驱动器的支持。否则,仅支持 400K IWM 软盘映像。除了玩 PCE/macplus 附带的 MacWrite 和 MacPaint IWM 示例映像之外,我不知道如何创建新的 IWM 映像。

启用 Sony 驱动器支持后,下一步是为 Macintosh 512K 启用 HFS 支持。这通常通过将 HD20 INIT 添加到 System 文件夹来完成,并且应该可以正常工作。但是,在我的情况下,我遇到了闪烁的“Welcome to Macintosh”屏幕和终端窗口中大量异常消息,重启后。

Screenshot from 2017-03-25 16-35-46

终端窗口连续显示“exception 0B (FXXX) IW=FFFF”,我只能关闭模拟器。是什么问题?

根本原因是 HD20 INIT 也包含 Sony 驱动器支持,这与 macplus-pcex ROM 文件冲突。要解决此问题,请使用 ResEdit 打开 Hard Disk 20 INIT 文件,选择 PTCH 资源,选择“.Sony”条目,然后选择 Edit > Clear 以删除 Sony 驱动器支持。

Screenshot from 2017-03-25 16-45-51

重启后,PCE/macplus 模拟的 Macintosh 512K 现在应该具有 HFS 支持,并且模拟的 HFS 磁盘映像应该可以在 Finder 中正确显示。

包含原始 HD20 启动磁盘映像以及已修改的(删除 Sony 驱动器的)磁盘映像的 ZIP 文件可以 在此处 下载。

通过串行端口的 PPP 模拟

我喜欢 PCE/macplus 的原因之一是它能够支持串行端口上的 PPP(以及 SLIP 和 TCP),从而允许从 System 6 和 7 机器访问 Internet。Mini vMac 无法做到这一点,因为它不模拟串行端口。为了测试这一点,我正在使用 Config PPP 2.0.1 和 MacPPP 2.0.6。MacTCP 应设置为使用 PPP 进行静态 IP 配置,而不是 LocalTalk。Config PPP 应指向调制解调器端口,尽管也可以使用打印机端口,只是您可能需要使用 Chooser 在该端口上禁用 AppleTalk。其余设置可以保持默认。

接下来,您需要在计算机上创建一个 TUN 接口,该接口将用于 PPP。以下脚本在以 root 身份运行时,将创建一个名为‘tun9′ 的 TUN 接口。

tunctl -t tun9
ifconfig tun9 192.168.1.244 up
route add -host 192.168.1.245 dev tun9
bash -c 'echo 1 &gt; /proc/sys/net/ipv4/conf/tun9/proxy_arp'
arp -Ds 192.168.0.253 enp1s0f0 pub

enp1s0f0 替换为您的以太网(或无线)接口名称,将 192.168.0.253 替换为您的 IP 地址。现在运行 ifconfig,您应该会看到 tun9 接口显示出来。

tun9 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:192.168.1.244 P-t-P:192.168.1.244 Mask:255.255.255.255
UP POINTOPOINT NOARP MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

修改配置文件以在调制解调器端口上启用 PPP。

serial {
port = 0
multichar = 1
driver = "ppp:if=tun9:host-ip=192.168.1.244:guest-ip=192.168.1.245"
}

如果设置了 multichar 参数,它将允许在没有传输延迟的情况下发送或接收指定数量的字符。这意味着,如果 multichar 设置为 2 并且串行端口配置为 19200bps,您可能拥有高达 2x19200bps = 38400bps 的串行传输速度。作为开始,将其设置为 1 以使用默认串行端口速度。驱动程序字符串中提供的客户机 IP 地址应与 MacTCP 静态 IP 配置匹配。

现在启动 PCE/macplus,并检查终端以确保 PPP 接口已设置并且没有错误。

SERIAL: port=0 multichar=1 driver=ppp:if=tun9:host-ip=192.168.1.244:guest-ip=192.168.1.245

系统启动后,在 Config PPP 中点击 Open。如果连接成功,将显示 PPP UP,并且点击 Stats 按钮将显示传输统计信息。

Screenshot from 2017-03-25 17-13-01

有了 PPP 连接,Fetch 现在可以正常工作,以 3KB/sec 的速度从 FTP 服务器下载文件。

Screenshot from 2017-03-25 17-15-19

您会注意到下载速度将略快于串行端口的最大理论速度。在此示例中,串行端口配置为 19200bps,但我们能够以 3163 字节/秒(几乎 28.8kbps,考虑到协议开销)的速度下载。这是由于模拟串行端口的效率。在具有相同配置的真实 Macintosh SE 上,我的下载速度只能达到 1.8-1.9KB/s。通过将 multichar 参数设置为一个合理的值(例如 5 或 10)来使下载速度更快。

如果模拟器在 TUN 接口上显示“无法打开驱动程序”,您可以尝试使用 openvpn 而不是 tunctl 来创建 TUN 接口。尝试以下操作。

sudo openvpn --mktun --dev tun9

如果您可以打开 PPP 会话,但似乎没有 Internet 访问,您可能需要在 Linux 主机上通过编辑 /etc/sysctl.conf 并设置 net.ipv4.ip_forward=1 来启用 IP 转发,然后运行 sudo sysctl -p 来更新系统设置。如果您仍然遇到问题,请尝试为主网络接口启用来自 TUN 接口的流量的 IP 伪装。

通过主机上的 PPPD 实现 Internet 访问

如果 PCE/macplus 的 PPP 模拟根本不起作用,您可以使用 tty0tt0 创建一对虚拟串行端口。

$ ./start_tty0tty.sh
(/dev/pts/13) <=> (/dev/pts/18)

并将模拟器配置为使用该对中的一个端口(/dev/pts/13)。

driver = "stdio:file=/dev/pts/13"

使用以下命令在主机上运行 PPPD 来指向另一个端口(/dev/pts/18)。您可能需要更改 IP 以匹配您的配置。

pppd debug nodetach defaultroute proxyarp local 
nocrtscts 192.168.1.244:192.168.1.245 /dev/pts/18 19200

请记住编辑 /etc/ppp/options 并添加(或取消注释)noauth 选项以禁用 PPP 身份验证,这只会引起问题。您还可以添加 passivepersist 选项,以便 PPPD 在几次连接尝试后不会轻易放弃。之后,点击 Config PPP 面板中的 Open 连接到 PPP 服务器,并快速运行上述 PPPD 启动脚本。应该会建立连接,并且模拟器内部应该可以访问 Internet。

需要注意的一点是,PPPD 请求应首先从模拟器触发(通过点击 Config PPP 中的 Open 按钮),然后快速在主机上启动 PPPD。如果顺序颠倒(先启动 PPPD),模拟的 Macintosh 将尝试发送数据包,这些数据包会被 PPPD 接收,但不会收到任何响应,连接最终会超时,并出现“Link Dead”错误。以下屏幕截图演示了此问题,其中生成了多个 LCP ConfReq 和 LCP ConfAck 消息。

Screenshot from 2017-03-25 17-39-27

我联系了 PCE/macplus 的作者,并被告知这可能是由于对串行端口行为的假设,而这些假设可能不适用于模拟的串行端口。例如,一个工具可能假设通过串行端口发送的任何数据都会立即在另一端接收到,这对于模拟端口可能不是真的(由于数据缓冲等),会导致奇怪的时序问题。无论原因是什么,我都未能解决这个问题。所以目前,如果您必须在主机上使用 PPPD,请记住首先从模拟器内部发起连接。

Macintosh Classic ROM 磁盘

Macintosh Classic 具有一个隐藏的 System 6.0.3 磁盘映像,可以通过在启动时按住 Command-Option-X-O 来启动。PCE/macplus 也模拟了这一点,通过在 config 文件中提供一个 rtc.romdisk 选项。如果设置为 1,机器将从 ROM 磁盘启动。

rtc {
# On startup the parameter RAM is loaded from this file. On
# shutdown it is written back.
file = "mac-classic-pram.dat"

realtime = 1

# Set the startup disk to the ROM disk. This only works with
# the Macintosh Classic ROM.
romdisk = 0
}

也可以使用 rtc.romdisk=1 从命令行指定从 ROM 磁盘启动。

pce-macplus -v -c mac-classic.cfg -l pce.log -I rtc.romdisk=1 -r

从 ROM 磁盘启动有一个小问题。选定的启动磁盘存储在 PRAM 中,即 PCE/macplus 模拟器中的 mac-classic-pram.dat 文件。一旦机器从软盘/硬盘启动,启动磁盘就会被记住并在下次启动时使用,即使指定了从 ROM 磁盘启动。根据作者的说法,这是因为代码不知道如何设置启动磁盘。一种解决方法是为每次启动删除 mac-classic-pram.dat 文件,以便机器可以正确地从 ROM 磁盘或从磁盘映像启动。这会导致多个系统设置(包括屏幕亮度)重置为默认值,并且屏幕在首次启动时会显得很暗。在我的测试中,即使删除 mac-classic-pram.data 后,从命令行设置 rtc.romdisk=1 有时仍然会从磁盘驱动器启动,如果 romdisk = 0 在配置文件中设置。这似乎是 PCE/macplus 的一个 bug。

结论

尽管存在局限性和一些小问题,我认为 PCE/macplus 是一款功能非常强大的模拟器。我目前正将其与 Retro68CodeLite 一起使用,以改进 Browsy,这是一个开源的最小 System 6 Web 浏览器。我希望 PCE/macplus 的作者能花些时间使模拟器对用户更友好,例如允许在模拟器运行时轻松插入/移除磁盘映像。当这种情况发生时,我认为 PCE/macplus 将比 Mini vMac 更受欢迎,Mini vMac 目前是 System 6 和 System 7 最知名的模拟器。

另请参阅

© . All rights reserved.