Apple II リモート開発環境:Apple II Pi のインストールと設定

Apple II Pi(David Schmenk 氏作)はその名の通り Apple II と Raspberry Pi を組み合わせたシステムで、次の各要素から構成されます。

  • Apple II Pi カード(簡易シリアル通信カード)
  • Raspberry Pi
  • a2pi(ProDOS 常駐ソフトウェア)
  • a2pid(Raspberry Pi OS サービス)と付随ツール群(a2term、a2mon など)

次の機能が提供されます。

  • ブロックデバイス仮想ドライブ x2
  • Apple II リモートコンソール
  • 簡易マシン語モニタ
  • Fuse ドライバによるファイル共有
  • ジョイスティック読出し

詳細は Apple II Pi 公式マニュアルに記載されています。

本稿では Apple II リモート開発環境の構築を目的として、Apple II Pi のインストールと設定を行う手順について説明します。

ハードウェア(Apple II Pi カード + Raspberry Pi)

Apple II Pi カードハードウェアの頒布は終了しているので、プロジェクトリポジトリで公開されている回路図をもとに自作します。次のいずれかの方法で作成できます。

  • Apple II 拡張カードユニバーサル基板上に手配線で作成する
  • Apple II 拡張カードプリント基板を設計する

私はどちらの方法も試しましたが、6551 ACIA + 74LS04 + 若干の CR というシンプルな構成なので作成はそれほど難しくありません。

オリジナル版 Apple II Pi カードは Raspberry Pi の電源を Apple II から取得する設計になっていますが、私の作った Apple II Pi カードでは GPIO コネクタの +5V ラインを Apple II 電源に接続しません。Raspberry Pi は世代を重ねるごとに消費電力が増えており、製造後数十年を経た Apple II の電源ユニットにとって負担となる恐れがあるためです。かわりに通常通り Raspberry Pi の micro USB 端子から電源を取るようにしています。

Raspberry Pi モデルの選択と接続方法

使用する Raspberry Pi モデルは 3B+、3A+ あたりが適切でしょう。VSCode Remote Development を使う場合、Zero W では処理が重くなるかもしれません。今回は 3A+ を使いました。

外部の PC からヘッドレスでアクセスするために Raspberry Pi の Wifi 接続を使用しますが、Apple IIe ケースのシールド加工が Wifi の電波をブロックしてしまうという問題があります。Apple IIe の上蓋を常時開けたまま運用すれば通信に支障はありませんが、上蓋を閉じて使用する場合は何らかの対策が必要になります。有線 LAN を使用する、USB 延長ケーブルの先に WiFi ドングルを接続する、Apple II Pi カードの代わりに Super Serial Card を使用するなどの方法が考えられます。

下の画像は自作 Apple II Pi カードと Raspberry Pi 3A+ を GPIO コネクタで接続し、Apple IIe のスロット 2 に挿した様子です。Raspberry Pi の電源ケーブルは外部の USB 電源ユニットに接続されています。電源ケーブルのコネクタは Apple II 基板との干渉を防ぐため直角形状のものを使用します。micro USB の直角コネクタは右向き、左向きの区別がありますがどちらでも取り回し可能です。

これ以外に、Raspberry Pi の記憶媒体として SD カードが必要になります。

Apple II Pi ソフトウェアのインストール

以上でハードウェアは揃ったので、ソフトウェアのインストールと設定を行います。

以下数節で次の作業を行います。

  • Raspberry Pi OS Lite のインストールとヘッドレス設定
  • ssh 公開鍵/秘密鍵の設定
  • Apple II Pi ソフトウェアのインストール
  • systemd 対応
  • 動作確認
  • 追加設定(a2pid のパッチ)

Raspberry Pi OS Lite のインストールとヘッドレス設定

最初に Raspberry Pi OS をインストール、設定します。以前の投稿で PiTrex をセットアップした際の手順と同様です。

  1. SD カードを Mac(あるいは Linux/Win PC)に接続します。
  2. Raspberry Pi Imager を Mac にインストールして実行します。
  3. Raspberry Pi Imager ウィンドウの「Operating System」をクリックして「Raspberry Pi OS (other)」を選択、さらに「Raspberry Pi OS Lite (32-bit)」を選択します。インストール先として SD カードを指定し、 Raspberry Pi OS Lite をインストールします。
  4. SD カードをいったんアンマウントしてから Mac に再接続します。カード内の boot パーティションがマウントされます。Mac の場合は /Volumes/boot ディレクトリにマウントされます。
  5. boot/wpa_supplicant.conf ファイルを新規作成してテキストエディタで編集し、Wifi 接続先のパラメータを指定します。詳細はこの記事にわかりやすく説明されています。
  6. 空の boot/ssh ファイルを作成します。

以上を完了したら SD カードを Mac からアンマウントして Raspberry Pi にセットします。この時点では Raspberry Pi を Apple II Pi カードに接続せず、単独で電源投入します。Wifi + ssh 経由でログインしたらデフォルトユーザ pi のパスワード変更、新規ユーザの追加、raspi-config を使った追加設定(ホスト名変更など)を好みに応じて行います。

SSH 公開鍵/秘密鍵の設定

Mac やその他 PC から Raspberry Pi へ ssh パスフレーズ接続できるように公開鍵/秘密鍵を設定します。Mac での手順はこの記事で詳細に説明されています。Mac 以外の環境での設定方法も検索すれば多く見つかります。パスフレーズは空にせず適切な複雑度の文字列を設定します。

以降の接続を容易にするために、Mac の ~/.ssh/config に以下の要領でエントリを追加します。

Host rpi
        HostName raspberrypi.local
        User pi
        Port 22
        IdentityFile ~/.ssh/rpi

HostName(Raspberry Pi マシンのホスト名)と IdentityFile(秘密鍵ファイル名)は現状に合わせて変更します。

以後は ‘ssh rpi’ とタイプしてパスフレーズを入力するだけで Raspberry Pi に ssh 接続できます。パスフレーズと ssh config 設定は後で VSCode Remote Development へ接続する際にも使用します。

Apple II Pi ソフトウェアのインストール

Apple II Pi 公式マニュアルの記述通り、次の 2 行のコマンドを実行して Apple II Pi ソフトウェアをインストールします。

wget schmenk.is-a-geek.com/tarfiles/a2pi_armhf.deb
sudo dpkg -i a2pi_armhf.deb

インストール後 Raspberry Pi を再起動します。

/usr/share/a2pi/A2PI-1.6.PO ファイルを使って Apple II の起動ディスクを作成します。

またインストールしたソフトウェアとは別に、公式リポジトリからソースコードを Raspberry Pi にクローンしておきます(その前に git コマンドを インストールします)。

sudo apt-get install git
git clone https://github.com/dschmenk/apple2pi.git

systemd 対応

Raspbian / Raspberry Pi OS は systemd 以前と移行後でシステム起動時のサービス設定手順が変わっています。2021 年時点で、上記の方法でダウンロードできる Apple II Pi インストールパッケージ(タイムスタンプ 2017 年 8 月の a2pi_armhf.deb)は systemd に対応しているようですが、念のため設定を再確認します。

まず、Raspberry Pi の UART0(GPIO14, GPIO15)を Apple II Pi との通信専用にするため UART0 の login: セッションを無効にします。

  1. sudo raspi-config コマンドを起動し「3 Interface Options」→「F6 Serial Port」を選択
  2. 「Would you like a login shell to be accessible over serial?」に対して「No」を選択
  3. 「Would you like the serial port hardware to be enabled?」に対して「Yes」を選択
  4. raspi-config の終了時に再起動を求められるのでそれに従います。

次に、/lib/systemd/system/a2pi.service ファイルがインストールされていることを確認します。a2pi.service ファイルが存在し、以下の内容になっていることを確認します。

[Unit]
Description=Apple II Pi Daemon
After=network.target

[Service]
Type=idle
Environment="HOME=/root"
EnvironmentFile=-/etc/default/a2pi
ExecStart=/sbin/a2pid $A2PID_OPTS
Restart=on-failure

注:タイムスタンプ 2017 年 8 月の a2pi_armhf.deb を使ってインストールした場合、このファイルに問題はないようです。

注 2(2023/04):Raspberry Pi OS(32bit, 2.21.2023, Kernel 5.15)では上記の a2pi.service ファイルでは起動せず、EnvironmentFile 行の ‘-‘ を削除すると a2pid が正常に動作する場合があります。ただしサービスがすべて展開されるかどうかは未確認です。

このファイルにより、Raspberry Pi 起動時に a2pid が自動的に起動します。

ここまでの設定を終えた Raspberry Pi は Apple II Pi に接続しないで長時間(1 日程度)放置すると a2pid からのシステムログでファイルシステムが溢れるため、不要な期間はシャットダウンしておく必要があります。この問題への対策は後述します。

動作確認

以上で必須のソフトウェア設定は終わったので Apple II Pi を起動して動作を確認します。

  1. Apple II Pi カードと Raspberry Pi の GPIO ピンを接続します。ピン位置がずれないよう注意します。
  2. Raspberry Pi の USB micro 端子に電源ケーブルを接続します。
  3. Apple II Pi カードを Apple IIe のスロット 2 に挿します。他のスロットも使用できますがその場合は以降の説明中のスロット番号を適宜読み替えます。
  4. Raspberry Pi の電源ケーブルを電源に接続します。Raspberry Pi の起動が始まります。
  5. /usr/share/a2pi/A2PI-1.6.PO ファイルから作成したディスクで Apple IIe を起動します。

Apple II 起動ビープ音の後 Apple II 画面に接続待機メッセージが表示されます。初回接続時のみ Apple II Pi のスロット番号の入力を求められます(スロット番号 2 を入力)。その後 Apple II Pi の接続に成功するともう一度ビープ音がなります。

Apple II 画面に下の画像の内容が表示されれば接続完了です。

この時点で Apple II のキーボードを叩いても画面には反映されません。一方、Mac や PC から Raspberry Pi に ssh ログインしたターミナル画面で a2term コマンドを起動すると Apple II コンソールに接続されます。この状態で ProDOS や AppleSoft Basic のコマンドが入力できます。下図のように a2term セッションを開始して ‘CATALOG,S2,D1’ コマンドの応答が得られれば、Apple II Pi の基本的な動作を確認したことになります。

※ エミュレータではなく Apple II 実機とのセッションです

トラブルシューティング

具体的な解決法は提供できませんが、問題を特定するためのヒントをいくつか説明します。

  • Apple II 電源投入後、起動が正常に進めば Apple II ビープが 2 回鳴ってから上掲 Apple II 画面のメッセージが表示されます。2 つ目のビープが鳴らない場合は Apple II Pi への接続に失敗しています。画面左上のプログレスインジケータ(回転する棒)がいつまでも表示されていることもあります。
  • 起動と接続のシーケンスが正常に完了しない場合は、Raspberry Pi の /var/log/syslog および /var/log/daemon.log から ‘a2pi’ を含む行を抽出、確認します。
  • これらのログファイルに ‘a2pid: Unknown Event’ というメッセージが複数並んでいる場合は 2 つの可能性があります。
    1. Rasberry Pi がシリアル回線(UART0)にログインセッションを送信している
    2. Apple II Pi カードが正常に動作していない、あるいは Apple II の電源が落ちている

‘Unknown Event’ メッセージが多発する問題が発生する場合は、「systemd 対応」の節で説明した方法で UART0 の login: セッションを止めます。Apple II 電源オフ時に ‘Unknown Event’ メッセージが多発するのは既知の問題で、次節で対策を説明します。

a2pid.c へのパッチ

Apple II の電源をオフにした状態で Apple II Pi ソフトウェアをインストールした Raspberry Pi だけをオンにしていると syslog に ‘Unknown Event’ というメッセージが繰り返し書き込まれます。放置すると約 1 日で 32GB の SD カードを溢れさせてしまい以後の動作に支障をきたします。

もともとの Apple II Pi 設計では Raspberry Pi の電源を Apple II から取っていたので、Raspberry Pi の電源だけがオンになる状況は極めてまれでした。本稿では Apple II 電源ユニット保護の観点から Raspberry Pi を別電源に接続しているので、問題の状況が起きやすくなっています。今後の投稿で触れる予定ですが、VSCode でプログラミングする際はあえて Apple II の電源を落としたまま Raspberry Pi 上でコーディングを続けるということも考えられます。

そこでこの ‘Unknown Event’ メッセージを抑制するために、a2pid のソースコードにパッチを当てます。以下の手順を実施します。

  1. まだ行っていなければ Raspberry Pi 上に Apple II Pi ソースコードリポジトリをクローンします。
    git clone https://github.com/dschmenk/apple2pi.git
  2. ソースファイルディレクトリに移動します。
    cd apple2pi/src
  3. この gist(公式 Apple II Pi リポジトリとは無関係の私製のもの)の内容を ‘a2pid.c.patch’ ファイルに保存します。
    cat > a2pid.c.patch
    (コピー内容をペーストして ctrl-D でファイルを閉じる)
  4. パッチを a2pid.c に適用します。
    cp a2pid.c a2pid.c.bak
    patch < a2pid.c.patch
  5. 新しい a2pid をコンパイル、インストールします。
    make a2pid
    chmod a+x a2pid
    sudo cp a2pid /sbin/

注意:

  • 手順が煩雑に感じられる場合はパッチを当てる必要はないでしょう。このパッチを当てない場合は、Raspberry Pi 単体で電源オンにする機会を極力減らします。
  • 将来の Apple II Pi リリースで a2pid.c ソースコードに変更があった場合、このパッチは通用しなくなります。

まとめ

以上の手順で Apple II Pi が動くようになります。ただし、これはあくまで PC/Mac から Apple II プログラミングを行うという目的に合わせた必要最低限の設定手順です。

作者 David Schmenk 氏の YouTube デモを観ると、Apple II Pi には次のような用途もあるようです。

  • Apple IIe のキーボードとジョイスティック(またはマウス)を使用して Raspberry Pi OS デスクトップや Apple IIGS エミュレータ gsport を操作する
  • Fuse ドライバ経由で Raspberry Pi 上のファイルを Apple II 上にコピーする

今後 Apple II Pi ハードウェアの新バージョンも予定されているようです。作者 YouTube チャンネルの 2021 年 4 月の動画で新バージョンのプロトタイプについて触れられています。更新情報は Facebook ページに投稿されています。

次の投稿では VSCode Remote Development を Mac から実行する手順を説明します。

参考

コメントを残す