プログラミング
A/UX 1.1を90年代のようにインストールする
Installing A/UX 1.1 like it's the 90s (thomasw.dev)
要約
筆者は、ヴィンテージMacintoshエミュレーター「Snow」上でAppleのUNIXであるA/UX 1.1のインストールに成功しました。このプロセスでは、初期のMacintoshハードウェアの要件を満たすためにエミュレーターに機能を追加し、34枚のフロッピーディスクイメージからOSをインストールしました。インストール中に発生したADBキーボードとSCSIコントローラーに関する2つのバグを修正し、最終的にA/UX 1.1を安定稼働させることができました。
全文翻訳
最近、ヴィンテージMacintoshエミュレーターであるSnow上で、A/UXが起動し安定して動作することに成功しました。A/UXは、68kベースのMacシリーズで動作したAppleのUNIXバージョンでした。プロセス分離を実現するためにメモリ管理ユニット(MMU)が必要で、これはオリジナルの68020ベースのMacintosh IIのオプションである68851 PMMU、または68030および68040ベースのマシンに統合されたMMUのいずれかでした。また、FPUも必要だったため、Macintosh IIシリーズや後のQuadraのようなハイエンドマシンでしか動作せず、LCは対象外でした。A/UX Penelopeは、A/UXの互換性情報に関する良いリソースです。Infinite Macでは、ブラウザ上でSnowがエミュレートするMacintosh IIx上でA/UX 3.1.1を試すことができます。
最近、Tinker Differentで話していたDominic Sharp氏の協力により、新しくアーカイブされたA/UX 1.1のインストールメディアセットを入手し、触れる機会がありました。Dominic氏はこのセットを入手し、公にアーカイブしたいと考えていましたが、ディスクの状態については確信が持てなかったとのことです。A/UX 1.1のソフトウェアが公にアーカイブされている例は私の知る限りありません。最も近いのは1.1.1のプリインストールイメージですが、当時はSnow上でまだ動作しませんでした。Dominic氏は、私が試してSnowを修正できるように、セットを共有することに同意してくれました。このセットは、すべて800K GCRの34枚のフロッピーイメージで構成されています。これらは生のフラックスイメージとして提供され、まずApplesauceを使用して変換しました。
まず、適切なエミュレートされたハードウェアが利用可能である必要がありました。Snowは必要なマシン、CPU、FPU、PMMUをエミュレートしますが、エミュレートしていたのはMacintosh Display Card 8-24のみでした。これはA/UX 1.xがサポートしているか確信が持てませんでした。A/UX 1.xは特にビデオハードウェアにうるさいです。A/UX Penelopeによると、Macintosh IIビデオカード(「Toby」)はネイティブでサポートされているため、まずSnowにこのカードを追加オプションとして実装しました。そして、インストールの作業に取り掛かる時間となりました。A/UXには、非常にUNIXらしい素敵なバインダーが付属しており、OSとインストールプロセスがそれほど簡単ではないため、間違いなく必要でした。幸い、これはBitsaversにアーカイブされています。デジタルバインダーを手に、インストールを進めました。
インストールを開始するために、「System setup and README」ディスクから始めます。ディスクをパーティション分割し、次に直感に反することをしなければなりません:MacパーティションにSystem 6をインストールします。これは、A/UXの起動プロセスを開始するMacアプリケーション、SASH(A/UXスタンドアロンシェル)があるためです。この「プリブート環境」は、A/UXカーネルの起動や、いくつかのディスクおよびリカバリ操作を可能にします。パーティショニングは、おなじみのHD SC Setupを通じて行われ、かなり簡単です。付属のHD SC Setupには、A/UX用のテンプレートレイアウトが含まれています。そして、かなり素のSystem 6をインストールし、その後、「SASH and utilities」ディスクの内容を新しいインストールにコピーします。これで、ついにA/UXに入り込む時間です。これは、「Floppy Launch」ディスクから起動することで行われます。このディスクはSASHを自動起動し、A/UXカーネルを起動し、次に「Floppy Root」ディスクを要求します。これがインストールのパート1を開始し、A/UXパーティションをフォーマットしてブートストラップシステムをコピーします。この時点で、無効なADB Talk 2の実装によりモディファイヤキーがスタックしてしまうSnowのバグを修正する必要がありました。興味深いことに、これは初めての問題です。A/UX 3.xでも以前は問題ありませんでした。
```diff
--- a/core/src/mac/adb/keyboard.rs
+++ b/core/src/mac/adb/keyboard.rs
@@ -140,29 +146,34 @@ impl AdbDevice for AdbKeyboard {
response
}
2 => AdbDeviceResponse::from_iter(
- AdbKeyboardReg2::default()
+ // The key/modifier bits of register 2 are ACTIVE LOW
+ AdbKeyboardReg2(0xFFFF)
// LED state bits (0..2) are host-controlled and active-high
.with_led_numlock(self.keystate[SC_NUMLOCK as usize])
.with_led_capslock(self.capslock)
.with_led_scrolllock(self.keystate[SC_SCROLLOCK as usize])
-.with_numlock(self.keystate[SC_NUMLOCK as usize])
-.with_capslock(self.capslock)
-.with_scrolllock(self.keystate[SC_SCROLLOCK as usize])
-.with_cmd(self.keystate[SC_COMMAND as usize])
+.with_numlock(!self.keystate[SC_NUMLOCK as usize])
+.with_capslock(!self.capslock)
+.with_scrolllock(!self.keystate[SC_SCROLLOCK as usize])
+.with_cmd(!self.keystate[SC_COMMAND as usize])
.with_control(
- self.keystate[SC_LCTRL as usize] || self.keystate[SC_RCTRL as usize],
+ !(self.keystate[SC_LCTRL as usize] || self.keystate[SC_RCTRL as usize]),
)
.with_option(
- self.keystate[SC_LOPTION as usize] || self.keystate[SC_ROPTION as usize],
+ !(self.keystate[SC_LOPTION as usize] || self.keystate[SC_ROPTION as usize]),
)
-.with_delete(self.keystate[SC_DELETE as usize])
+.with_shift(
+ !(self.keystate[SC_LSHIFT as usize] || self.keystate[SC_RSHIFT as usize]),
+ )
+.with_delete(!self.keystate[SC_DELETE as usize])
.to_be_bytes(),
),
3 => AdbDeviceResponse::from_iter(
AdbReg3::default()
.with_exceptional(true)
.with_srq(true)
-.with_address(Self::INITIAL_ADDRESS)
-.with_handler_id(2) // Apple Extended Keyboard M0115
+.with_address(self.address)
+.with_handler_id(self.handler_id)
.to_be_bytes(),
),
_ => {
```
その後、ハードディスクにリブートしてSASHとA/UXを実際に起動し、インストールのパート2を行います。ここで別のSnowのバグに遭遇しました。NCR 5390の「DMA end」ビットを待ってカーネル起動がフリーズしました。これもまた、以前は問題ありませんでした。新しいA/UXバージョンでもです。
```diff
--- a/core/src/mac/scsi/controller.rs
+++ b/core/src/mac/scsi/controller.rs
@@ -771,10 +771,13 @@ impl BusMember<Address> for ScsiController {
NcrReadReg::BSR => Some( self.reg_bsr
.with_dma_req(self.get_drq())
-.with_dma_end(!matches(
- self.busphase,
- ScsiBusPhase::DataIn | ScsiBusPhase::DataOut,
- ))
+.with_dma_end(
+ self.reg_mr.dma_mode()
+ && !matches(
+ self.busphase,
+ ScsiBusPhase::DataIn | ScsiBusPhase::DataOut,
+ ),
+ )
.with_phase_match(self.phase_match())
.0,
),
```
パート2では、実際のOSが含まれる26枚もの「Installation disks」を処理します。想像できるように、これにはかなりの時間がかかりました。テープドライブがあれば、代わりにテープからのインストールを選択でき、フロッピーの入れ替えの手間を省くことができました。Dominic氏もこの歴史的な遺物をコレクションに持っています。このテープがいつかアーカイブされれば、SnowにエミュレートされたApple 40SCテープドライブを追加して、テープからのインストールを可能にするつもりです。26枚のディスクの後、再びリブートすると、ハードドライブ上のSASHによって起動される最終的なA/UXインストールがようやく表示されます。その後は、お祝いにピークのUNIXゲームを楽しむ時間となりました。Snowがこのインストールの全行程を乗り越え、A/UX 1.xがスムーズに動作するようになったことを嬉しく思います。A/UX 1.xにはグラフィカルインターフェースがあるのか疑問に思うかもしれません。A/UX 3.xのインターフェースはかなり洗練されており、「mac32」エミュレーションレイヤーを通じてMacintoshアプリケーションを実行することさえできます(A/UX 3.xでMystを実行しました)し、X11アプリケーションもサポートしています。マルチユーザーモード(init 2経由)に入ると、Toolboxアプリケーションと呼ばれるグラフィカルアプリケーションを実行できることがわかりました(これはMacintosh ROMのGUI「Toolbox」を指しています)が、利用可能なアプリケーションは3つだけです。ディスクを共有してくれたDominic氏に改めて感謝します。これらのディスクは最終的に公開アーカイブされる予定です。