Tagged as retrocomputing, amiga, gcc, linux

Written on 2026-07-20 by Daniel Kochmański

Table of Contents

  1. Prerequisites
  2. Toolchain
  3. Emulator
  4. Installation
  5. Running executables
  6. Remote debugging
  7. Summary
  8. Resources

純粹心血來潮,我決定建立一個 Amiga 開發環境。由於整理出可行的步驟並不容易,因此我寫下了在 Linux 上如何編譯第一個程式並在模擬器中執行的說明。希望對大家有幫助!

Prerequisites

在本文中,我假設讀者是一位熟練的 Linux 使用者,能夠從原始碼建置軟體並找出缺少的依賴套件。標準的建置工具應該就足以開始。同時也預期讀者具備基本的 shell 指令知識。更多關於如何建置 toolchain 的詳細說明請參閱:https://franke.ms/amiga/amiga-gcc.wiki

另一個比較麻煩的需求是,要執行 AmigaOS,需要 ROM 映像檔(韌體)和 workbench 磁片(安裝媒體)。這些可以從合法來源購買,或是從自己擁有的硬體中 dump 出來。或者也可以使用模擬器內建的 AROS ROM,不過它與標準 Amiga 軟體的相容性較差。

Toolchain

要為 AmigaOS 建置程式,我們需要編譯器。一個常見的工具是 amiga-gcc。我一開始嘗試使用預設(最經典)的 GCC 分支,雖然產生的執行檔可以正常運作,但將二進位檔載入 m68k-amigaos-gdb 時卻發生 segmentation fault。經過多次嘗試後,我回報了 issue,toolchain 的維護者 Stefan 'bebbo' Franke 親切地解釋說,現在的 toolchain 會產生 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
# Check whether the compiler works. SDL1.2 build failed on my host, but it is
# not needed.
${TOOLCHAIN}/bin/m68k-amigaos-gcc -v
popd

現在我們已經擁有一個可運作的 AmigaOS toolchain。它支援幾種不同的 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 執行檔時有點小問題,但這個二進位檔確實可以正常運作。

Emulator

現在要如何執行這個檔案呢?我們需要兩樣東西:

  • 模擬器
  • AmigaOS ROM

取得模擬器相當簡單。我選擇了 Amiberry,因為它提供了良好的開發者體驗——內建 bsdsocket.library、虛擬硬碟和共享目錄,而且在 Linux 上運作良好。另一個不錯的選擇是 FS-UAE。兩者都應該可以正常運作。它們都有二進位版本,或者我們也可以從原始碼建置。我們將從 Flathub 安裝 Amiberry:

flatpak install flathub com.blitterstudio.amiberry

取得 ROM 比較困難。如果你擁有原始硬體,可能已經有合法的 dump。否則你可以從 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 expects .a1200 file extension (it doesn't recognize .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 Mode
  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

Installation

我在格式化硬碟時遇到一些問題。一般來說,當安裝程式開啟時,新磁碟應該會出現在初始目錄中,顯示為「DH0: …」。用左鍵點擊圖示,然後按住右鍵以顯示上方選單列。導覽至「Icons > FormatDisk」並格式化磁碟。

img

現在請按照安裝程式的步驟進行。有時我們需要「插入新的軟碟」。若要返回 Amiberry 選單,請按 F12,並將 DF0 中的軟碟映像檔替換為安裝程式建議的檔案。然後點擊「Resume」繼續。

img

做得好!我們已成功安裝 AmigaOS!現在可以移除軟碟並開機進入已安裝的系統。

Running executables

系統重新開機後,請前往安裝系統的磁碟機,選擇「System」和「Shell」。woosh.out 已經位於共享目錄中,該目錄會以「DH1」顯示,因為我們已將它作為第二個磁碟機加入(在「Hardfile」之後)。

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

太棒了!我們交叉編譯的二進位檔運作得非常順利!

img

Remote debugging

但故事還沒結束。軟體會出錯,而當軟體出錯時,我們需要除錯器。我們已經用 m68k-amigaos-gdb 建置了一個,但系統上沒有 GDB server。Stefan Franke(m68k-amigaos toolchain 的維護者)也維護了 bgdbserver,這是一個專為 Amiga 設計的移植版本。

在使用之前,我們需要安裝一個工具來解壓 lha 檔案。它可以從這裡取得:https://aminet.net/package/util/arc/lha。下載並將 lha.run 複製到 Shared/ 目錄,然後在 Amiga 中執行。lha.run 是一個自我解壓縮的檔案,會建立幾個檔案。我們需要的是 lha_68020。將它複製到 c:lha。請注意,c: 不是「Drive C」,而是「Commands directory」。

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

Summary

我們已成功建置並安裝 AmigaOS 的開發環境。我很想知道一位有動機的 Lisp 駭客可以用它做些什麼?

Resources

在設定這個環境時,我主要參考了以下資源: