这是万圣节前的最后一个 Maker Monday,我们还没准备好服装,所以这次我们打算跟随 The Raspberry Pi Guide to Retro Gaming 的这篇教程,把我们的树莓派伪装成经典的 8 位 Apple II 电脑。
Apple II 不是第一台个人电脑或家用电脑,但它是 1977 年问世的标志性“三巨头”电脑之一:Apple II、Commodore PET 和 TRS-80。Apple II 的游戏性能不如当时其他一些 8 位系统,但它在设计时就考虑到了游戏。在设计 Apple II 时,Steve Wozniak 从他在 Atari 工作期间参与 Breakout 街机游戏的工作中获得了灵感。这就是为什么 Apple II 有彩色图形、支持 paddle 控制器,甚至还有音频。

Apple II 的音频相当有限:任何比蜂鸣声更复杂的声音都相当消耗 CPU。附加音频板(如 Mockingboard)变得流行,并得到了许多游戏开发者的支持。
Apple II 包含一个仅支持整数数值数据类型的 BASIC 语言版本:通过避开浮点数,Wozniak 的 Integer BASIC(顾名思义)处理数字的速度极快。这使得它不太适合某些编程任务,但对视频游戏来说非常棒。Integer BASIC 被提供在 Apple II 的系统 ROM 镜像中,而功能更完整的 BASIC——Applesoft BASIC——最初以盒式磁带形式提供(不过从 Apple II Plus 开始,它会被固化到系统 ROM 中)。
要在树莓派上模拟 Apple II,我们使用 LinApple 模拟器。它是 AppleWin 模拟器的一个分支,后者最初由 Mike O’Brien 创建。David Baucum(maxolasersquad)和其他几位贡献者让它能在 Linux 上运行。你可能还想看看 audetto 的 AppleWin 模拟器分支。因为 audetto 的分支会定期与原始 AppleWin GitHub 仓库同步,所以它能更紧密地跟踪 AppleWin 的功能。
LinApple 可以模拟 Apple II 声卡,例如 Mockingboard(在配置文件中默认启用)。LinApple 无法通过 Raspberry Pi OS 的 apt 仓库获取,所以你需要自己编译它。幸运的是,这很容易做到。首先,打开一个终端窗口。你将在这里安装依赖项、下载源代码、编译并安装它。
在终端窗口中,运行以下命令来更新操作系统软件包,并安装编译 LinApple 所需的依赖项。运行使用 sudo 的命令时,系统可能会提示你输入密码。
$ sudo apt update $ sudo apt -y full-upgrade $ sudo apt -y install git g++ cmake libzip-dev libsdl3-dev libsdl3-image-dev libcurl4-openssl-dev zlib1g-dev imagemagick
现在你可以克隆模拟器仓库了。如果你不想把源代码检出到主目录的根目录下,可以在克隆之前创建一个目录并进入该目录。例如,mkdir ~/src 会在你的主目录下创建一个 src 目录,cd ~/src 会进入该目录。你可以使用以下命令克隆仓库:
$ git clone https://github.com/linappleii/linapple.git
克隆完成后,cd 进入 linapple 文件夹并构建项目:
$ cd linapple $ cmake -B build -DBUILD_TESTING=OFF $ cmake --build build -j4
第一个 cmake 命令准备源代码,第二个命令编译它。-j4 参数告诉 cmake 使用最多四个 CPU 核心。成功编译后,使用以下命令将其安装到 /usr/local 文件夹下:
$ sudo cmake --install build
现在你可以在任何终端窗口中使用命令 linapple 运行模拟器。但在那之前,让我们自定义一些选项。首先,将默认配置文件和示例磁盘映像复制到你的主目录。在将文件复制到其中之前,你需要创建几个目录:
$ mkdir -p ~/.config/linapple/ $ cp /usr/local/etc/linapple/linapple.conf ~/.config/linapple/ $ mkdir -p ~/.linapple/disks/ $ cp /usr/local/share/linapple/Master.dsk ~/.linapple/disks/
接下来,使用你喜欢的编辑器编辑配置文件,例如使用 nano ~/.config/linapple/linapple.conf,并进行以下更改:
找到内容为 Joystick 0 = 2 的条目,将 2 改为 4。这让你可以使用鼠标作为摇杆,你可能会喜欢或讨厌它(在文章后面的 Brickout 中试一试!)。配置文件描述了你可以选择的其他选项。
找到 Screen factor = 1.0 条目,将 1.0 改为 2.5。这会使模拟器窗口稍微大一些。
保存配置文件并退出编辑器。如果你使用的是 nano 编辑器,按 CTRL+X,回答 Y 表示是,然后按 ENTER 确认文件名。让我们测试 LinApple 并确保一切正常。在终端窗口中,运行以下命令:
$ linapple --autoboot --d1 ~/.linapple/disks/Master.dsk
LinApple 应该会打开并显示如图 1 所示的屏幕。如果你发现模拟器接管了鼠标控制,按 F1 释放它(这会显示帮助屏幕,但你可以再次按 F1 将其关闭)。你可以使用 F6 键切换全屏模式。

这里有一个你可以尝试运行的小型 BASIC 程序。你可以将其输入模拟器,也可以在 GitHub 仓库的 ch03/AppleIIBasicPrograms.dsk 文件中找到该程序。要使用磁盘映像,请使用 linapple --autoboot --d1 AppleIIBasicPrograms.dsk 启动模拟器,在 ] 提示符下输入 LOAD BLOCKMOVE 并按 ENTER,然后输入 RUN(并按 ENTER)。
10 HGR 20 X = 140: Y = 80: D = 3: REM INITIALISE 30 HCOLOR = 3: GOSUB 1000: REM DRAW CUBE 40 REM WAIT FOR AND READ KEYPRESS 50 K = PEEK (- 16384): IF K < 128 THEN 40 60 REM CLEAR STROBE 70 POKE - 16368, 0: K$ = CHR$ (K - 128) 80 HCOLOR = 0: GOSUB 1000: REM ERASE CUBE 90 IF K$ = "W" THEN Y = Y - D 100 IF K$ = "S" THEN Y = Y + D 110 IF K$ = "A" THEN X = X - D 120 IF K$ = "D" THEN X = X + D 130 IF X < 0 THEN X = 0 140 IF X > 272 THEN X = 272 150 IF Y < 0 THEN Y = 0 160 IF Y > 184 THEN Y = 184 170 GOTO 30 : REM BACK TO TOP OF LOOP 1000 REM DRAW CUBE IN CURRENT HCOLOR 1010 HPLOT X, Y TO X + 8, Y TO X + 8, Y + 8 TO X, Y + 8 TO X, Y 1020 RETURN
这将在屏幕上绘制一个小方块。使用 W、A、S 和 D 键在屏幕上移动它。该程序相当简单。它首先定义起始 X 和 Y 位置,以及方块每次应移动的像素数(变量 D)。之后,它将绘制颜色设置为 3,并调用子程序绘制方块。然后程序等待按键,当有按键时,它清除键盘选通信号,这是一个指示何时读取了按键的硬件。
之后,程序将整数按键值(K)转换为包含所输入字符的字符串(K$)。然后,它更新 X 和 Y 位置,确保方块没有跑出屏幕,并返回到循环顶部(第 30 行)。

输入程序后,输入 RUN 并按 ENTER。尝试使用 WASD 键移动方块,完成后按 CTRL+C 退出程序。图 2 显示了程序运行情况。注意垂直线和水平线颜色不同,并且垂直线在移动时会改变颜色。这是由于 Apple II 图形的工作方式:Apple II 只生成单色显示信号,但它使用一些信号技巧来生成颜色伪影。游戏程序员可以操纵这些伪影来创建他们想要的颜色组合。
运行图形程序后,模拟器屏幕的图形模式部分下方只有一个小文本区域。你可以输入 TEXT 命令并按 ENTER 返回纯文本模式。你还会发现这些命令很有帮助:
LIST — 列出当前 BASIC 程序的所有行。
RUN — 运行当前程序。
NEW — 清除当前程序并让你重新开始。
CATALOG — 列出磁盘映像上的所有文件。
SAVE NAME — 将当前 BASIC 程序保存为你指定的文件名。
LOAD NAME — 加载指定文件名的程序。
CTRL+C — 使用此组合键停止正在运行的 BASIC 程序。
除 CATALOG 外,这些命令仅适用于 BASIC 程序。许多游戏是二进制可执行文件,不包含 BASIC 源代码。
你可以在 Lee Fastenau 的短程序集中找到一些有趣的键入式程序。Lee 的程序刻意写得紧凑,因为大多数设计为在一两行代码内输入。所以,请慢慢输入!
转载声明:本文为转载整理,原文版权归原作者及原站点所有。
原文来源:Raspberry Pi Blog
原创地址:https://www.raspberrypi.com/news/emulate-apple-ii-on-raspberry-pi/
原文作者:Brian Jepson;如有侵权,请联系管理员删除。