标签 retrocomputing, amiga, gcc, linux

作者:Daniel Kochmański,撰写于 2026-07-20

目录

  1. 先决条件
  2. 工具链
  3. 模拟器
  4. 安装
  5. 运行可执行文件
  6. 远程调试
  7. 总结
  8. 资源

出于偶然原因,我决定搭建一个 Amiga 开发环境。由于摸索过程并不顺畅,我记录了在 Linux 上编译第一个程序并在模拟器中运行的步骤。祝使用愉快!

先决条件

本文假设读者是熟练的 Linux 用户,能够从源代码构建软件并解决缺失的依赖。标准的构建工具足以开始。还需要基本的 shell 命令理解。关于如何构建工具链的更详细说明,请参阅:https://franke.ms/amiga/amiga-gcc.wiki

另一个比较棘手的要求是,要运行 AmigaOS,需要 ROM 镜像(固件)和 Workbench 磁盘(安装介质)。它们可以从合法来源购买,或从自有硬件中转储。或者也可以使用模拟器附带的 AROS ROM,但它与标准 Amiga 软件的兼容性较差。

工具链

要为 AmigaOS 构建程序,我们需要编译器。amiga-gcc 是一个常用的工具。起初我尝试使用默认(最经得起考验)的 GCC 分支,虽然生成的二进制文件可以运行,但在 m68k-amigaos-gdb 中加载二进制文件时会导致段错误。经过一番尝试后,我报告了 问题,工具链维护者 Stefan 'bebbo' Franke 友好地解释说该工具链现在生成 DWARF2 调试信息,并修复了在最终可执行文件中嵌入调试段的 bug。我最终选择了 GCC 的 amiga16.1 分支和 binutils 的 amiga-2.46 分支(包含上述修复)。

注意,make update 可能因连接错误而失败。如果发生这种情况,请重新运行直到所有内容下载完成。make updatemake all 可能需要一些时间——在我的机器上大约需要 1 小时。

export WORKSPACE=${HOME}/Workshop/AmigaOS
export TOOLCHAIN=${WORKSPACE}/amiga-gcc-toolchain
export PREFIX=${TOOLCHAIN}
mkdir -p ${WORKSPACE}
cd ${WORKSPACE}
git clone https://franke.ms/git/bebbo/amiga-gcc.git
pushd amiga-gcc
make branch branch=amiga16.1 mod=gcc
make branch branch=amiga-2.46 mod=binutils
make update
make all
# 检查编译器是否工作。SDL1.2 构建在我的主机上失败了,但这不是必需的。
${TOOLCHAIN}/bin/m68k-amigaos-gcc -v
popd

现在我们拥有可用的 AmigaOS 工具链。它支持几种不同的 runtime/libc 版本。未指定时,默认使用 newlib

export WORKSPACE=${HOME}/Workshop/AmigaOS
export TOOLCHAIN=${WORKSPACE}/amiga-gcc-toolchain
export PATH=${TOOLCHAIN}/bin:${PATH}
mkdir Shared
pushd Shared
cat > woosh.c <<EOF
#include <stdio.h>

void hi(void) {
  printf("jd was here \\\o/\n");
}

int main() {
  hi();
  return 0;
}
EOF
m68k-amigaos-gcc -g woosh.c -o woosh.out
file woosh.out
# woosh.out: AmigaOS loadseg()ble executable/binary
popd

恭喜!我们刚刚构建了第一个 AmigaOS 程序。file 命令在解析 AmigaOS 可执行文件时似乎有些问题,但二进制文件可以正常工作。

模拟器

现在如何运行这个文件?我们需要两样东西:

  • 模拟器
  • AmigaOS ROM

获取模拟器很简单。我选择了 Amiberry,因为它提供了良好的开发者体验——内置 bsdsocket.library、虚拟硬盘和共享目录,并且在 Linux 上运行良好。另一个不错的选择是 FS-UAE。两者都应该能很好地工作。它们有二进制发布版,我们也可以从源代码构建。我们将从 Flathub 安装 Amiberry:

flatpak install flathub com.blitterstudio.amiberry

获取 ROM 比较困难。如果你拥有原始硬件,可能已经有合法的转储。否则可以从 https://www.amigaforever.com/https://www.hyperion-entertainment.com/ 购买。假设你已经拥有 ROM,我们就可以启动模拟器并配置目标系统。

我们需要以下文件:

  • ROM 文件: kick.a1200.46.143
  • 软盘: Install314.adf、Workbench314.adf 等
mkdir -p Amiberry/{ROMs,Floppies}
# Amiberry 期望 .a1200 文件扩展名(它不识别 .46.143)
cp Nero/ROMs/kick.a1200.46.143 Amiberry/ROMs/kick.a1200
cp Nero/Floppies/*.adf Amiberry/Floppies
flatpak run com.blitterstudio.amiberry

现在导航到“Paths”选项卡,将它们配置为指向我们刚创建的“Amiberry”目录。提示创建子目录时确认。然后点击“Rescan Paths”按钮,返回“Quickstart”选项卡。

img

Amiga 硬件有几种不同的变体,具有不同的硬件配置和 M68K CPU 运行变体。RAM 分为“chip memory”(可由自定义芯片直接访问的内存,包括图形、音频和 DMA)和“fast memory”(通用 RAM)。前者通常为 1-2 MB,后者通常可扩展到约 4 MB 的 Fast RAM。这已经足够了!我们将选择 Amiga 1200,因为它具有 AGA(Amiga Advanced Graphics Architecture)芯片组和 4 MB Fast RAM 扩展配置。

  • 型号: Amiga 1200
  • 配置: 4 MB Fast RAM 扩展配置
  • 模拟驱动器(DF0): Install314.adf

安装过程中,需要将软盘替换为安装程序请求的文件。模拟驱动器 DF0 代表软盘驱动器。要在虚拟机运行时返回配置菜单,请按 F12。

img

然后导航到“ROM”选项卡,将 kick.a1200 ROM 选为“Main ROM File”。接着进入“Expansions”选项卡并启用 bsdsocket.library。稍后运行 bgdbserver 时我们需要 TCP/IP 连接。

最后添加一个虚拟硬盘和一个共享目录:

  1. 导航到“Hard drives/CD”选项卡
  2. 选择“Create Hardfile”:: 1024MB,启用 RDB 模式
  3. 选择“Add Hardfile”并选择新创建的文件
  4. 选择“Add Directory”

这些驱动器在 Amiga 中将分别显示为 DH0 和 DH1。RDB 是 Amiga 的原生分区表格式(类似于 PC 中的 MBR,但更丰富)。必须启用此模式才能让 Amiga 识别磁盘。

img

值得保存配置。转到“Configurations”选项卡并保存文件。从现在开始,我们可以通过以下命令启动 AmigaOS:

flatpak run com.blitterstudio.amiberry -f amigaos.uae

安装

我在格式化硬盘时遇到了一些问题。通常,当安装程序打开时,新磁盘应在初始目录中显示为“DH0: …”。用左指针按钮单击图标,然后按住右指针按钮以显示顶部菜单栏。导航到“Icons > FormatDisk”并格式化磁盘。

img

现在按照安装程序的步骤操作。有时我们需要“插入新软盘”。要返回 Amiberry 菜单,请按 F12 并将 DF0 中的软盘镜像替换为安装程序建议的镜像。然后点击“Resume”继续。

img

做得好,我们已成功安装 AmigaOS!现在我们可以移除软盘并启动已安装的系统。

运行可执行文件

系统重启后,进入我们安装系统的驱动器,选择“System”和“Shell”。二进制文件 woosh.out 已经在共享目录中,该目录作为第二个驱动器(在“Hardfile”之后)添加,因此显示为“DH1”。

3.Main:> dh1:
3.DH1:> dir
  woosh.out
3.DH1:> woosh.out
jd was here \o/
3.DH1:>

太棒了,我们交叉编译的二进制文件运行完美!

img

远程调试

但这还不是全部。软件会出错,而当软件出错时,我们需要调试器。我们已经用 m68k-amigaos-gdb 构建了一个,但系统上没有 GDB 服务器。Stefan Franke(m68k-amigaos 工具链的维护者)还维护着 bgdbserver,一个专为 Amiga 设计的移植版本。

在使用之前,我们需要安装一个工具来解压 lha 存档。它可以在这里找到:https://aminet.net/package/util/arc/lha。下载并将 lha.run 文件复制到 Shared/ 目录,然后在 Amiga 中运行。lha.run 是一个自解压存档,会创建几个文件。我们需要的是 lha_68020 文件。将其复制到 c:lha。注意,c: 不是“Drive C”,而是“命令目录”。

3.DH1:> lha.run
...
3.DH1:> copy lha_68020 c:lha

img

现在我们可以删除提取的文件,并从 https://aminet.net/dev/debug/bgdbserver.lha 下载 bgdbserver.lha。将存档放入 Shared/ 目录并解压。

3.DH1:> lha x bgdbserver.lha
3.DH1:> copy bgdbserver/bgdbserver c:

现在,我们终于可以以调试模式启动应用程序:

    3.DH1:> bgdbserver :4444 woosh.out

img

太好了!现在我们可以调试我们的雄心勃勃的程序。在 Linux 主机上,用同一个二进制文件运行 GDB:

export WORKSPACE=${HOME}/Workshop/AmigaOS
export TOOLCHAIN=${WORKSPACE}/amiga-gcc-toolchain
export PATH=${TOOLCHAIN}/bin:${PATH}
m68k-amigaos-gdb
(gdb) file woosh.out
(gdb) target remote localhost:4444
(gdb) continue

如果遇到“Connection refused”错误,请确保 Amiberry 配置中已启用 bsdsocket.library(如前所述)。

img

下一步是让 AmigaOS 更美观,但这超出了本教程的范围。我参考了以下指南,它详细介绍了该主题: https://lyonsden.net/installing-amiga-os-3-1-4-part-5-finishing-touches/

img

总结

我们已成功构建并安装了 AmigaOS 的开发环境。我想知道一个有动力的 Lisp 黑客能用它做什么?

资源

在配置此设置时,我主要从以下资源中学习: