カテゴリー別アーカイブ: Raspberry Pi

8 ビットコンピュータ用シリアルサーバの構成

「シリアルサーバ」というのは今考えた言葉で、世間で通用する用語ではありません。どういう意味かというと、8 ビットレトロコンピュータに装備されている最低限の通信機能を利用して最近のハイエンドマイコンボード(Raspberry Pi、ESP32 等)ないし PC へ接続し、端末接続のみならず様々なサービス、例えばディスクエミュレーションやネットワーク機能などをレトロコンピュータに提供しようというアイディアです(注 1)。

レトロコンピュータ界隈ではこのアイディアに基づいて次のデバイスが発表されています。

レトロパソコンは数多く存在するのでこれ以外にも同様のデバイスがあるかもしれませんが、私が多少なりとも調べてみたことがあるのは上記二つだけです(注 2)。

ポイントは、レトロコンピュータ側は処理能力の限界上あまり複雑なプロトコルを喋れないということです。AppleTalk などの汎用ネットワークプロトコルは 16/32 ビットプロセッサの時代になってようやくサポートされました(注 3)。

そういう理由で、シリアルサーバでは接続相手のレトロコンピュータがなるべく少ないオーバーヘッドでサービス呼び出し処理を行えるように配慮されています。レトロコンピュータに搭載されている既存のモニタプログラムにはそのような機能がないので、専用のクライアントソフトウェア(ドライバ)を新たに書く必要があります。なお文字端末機能をシリアルサーバに載せる場合は基本的に 1 文字送受信を 1 パケットに対応させるため、元の回線速度の数分の 1 程度に遅くなることは避けられません。

***

と、ここまでさも全容を知っているかのように説明してきましたが、実のところ各システムの細部について十分理解できていません。そこで本稿では Apple2Pi のソースを読み、どのような構成になっているのかを調べていこうと思います。要は学習ノートです。あわよくば自分でも同様のサーバやクライアントプログラムを書こうという考えです。

Apple2Pi ソースコード

Apple2Pi ソースコードは Github で公開されています。docs ディレクトリに格納されているドキュメントを参照したところ、システム構成について簡単な説明がみつかりました。さしあたって次のソースコードが参考になりそうです。

  • src/a2pid.c: Raspberry Pi 上で実行されるデーモン(サーバプログラム)
  • src/a2lib.c、src/a2pidcmd.c、src/a2term.c: Linux 側から a2pid を利用するためのライブラリとクライアントプログラム群。
  • client/BUILD/a2pi.s: Apple II(ProDOS)側から a2pid を利用するための、シリアル回線経由のクライアントプログラム。マウス・ジョイスティックイベントをサポートしているため単純な文字入出力処理に比べると結構複雑になる。

注意することは、Apple2pi では Apple II の入出力ストリームを Linux のデバイスに接続するだけではなく、Apple II のキーボードとジョイスティックないしマウスを Linux の入力デバイスとして利用するという、いわば双方向のサービスが提供されている点です。今回想定している目的では後者の機能に深入りする必要がないので、興味のない部分はなるべく読み飛ばすようにします。

src/a2pid.c

シリアルサーバのサービスを提供するコードです。とりあえず main() から読んで概要を把握します。と思ったらファイルの半分超、約 550 行が main() 内のコードでした。くじけず読んでいくと次のような流れがわかります。

  • ポート 6551 で TCP ソケットをオープン(#653-)
  • Apple II に接続されたシリアル回線もソケット管理に含める(#676)
  • Apple II とサーバのコンソール入出力、ブロックデータ転送、仮想ディスクファイルの読み書き、IIe/IIc のマウスイベントなどの情報を通信する(#682-)

いったんソケットがオープンされると a2pid は TCP ソケットのクライアントおよびシリアル回線を監視し(#691 select())、パケットを受信するとコマンドを解釈して適切な応答を返すか関連するクライアントに転送します。a2pid プログラムの実行中はこのパケット処理ループから脱出しません。

なおソケット通信でやり取りされるデータはパケットと称されますが、パケット管理のためのフィールドは必要最低限に抑えられています。Apple II シリアル回線上での通信の場合パケット長は最小 3 バイトで、1 バイト目は必ずコマンド値です。主要なコマンドについて、将来流用できそうなものを中心として以下のように読んでいきます。

a. afd(Apple II シリアル回線)でやり取りされるコマンド

  • 0x80 sync:Apple II からの同期チェック。Apple II への応答(ack)は 0x81。
  • 0x82 a2d keybd:Apple II から送られるキーボードイベント。2 バイト目がモディファイアコード、3 バイト目がキーコード。
  • (マウス関連は割愛)
  • 0x90 ack read bytes, 0x92 ack write bytes: Apple II と a2pid 間のバイナリデータ転送
  • 0x96 send input char:Apple II へキーボード入力文字を送信する。Apple II からの ack コマンドは 0x97
  • 0x98 get output char:Apple II から文字出力を受信して印字担当クライアントへ転送する。
  • 0xa0、0xa2 drive 1/2 status call:ドライブ 1、ドライブ 2 のステータスを Apple II へ送信する。
  • 0xa4、0xa6 dirve 1/2 read call:ドライブ 1、ドライブ 2 の指定ブロックを読み出して Apple II へブロック転送(512 バイト)する。その後結果コード 1 バイトを Apple II へ送信する。
  • 0xa8、0xaa drive 1/2 write call:Apple II からのブロック転送(512 バイト)をドライブ 1、ドライブ 2 の指定ブロック位置へ書き込む。その後結果コード 1 バイトを Apple II へ送り返す。

b. srvfd(Linux TCP ソケット)でやり取りされるコマンド

Linux 上のクライアントプログラムと通信します。TCP ソケットなので a2pid が走っているマシンとは別のマシンでもクライアントを実行できます。

  • 0x90 read bytes:Apple II のメモリ内容を読み出す。addreq() を用いて転送リクエストをキューに追加する。
  • 0x92 write bytes:Apple II へデータを書き込む。addreq() を用いて転送リクエストをキューに追加する。
  • 0x94, 0x9a call:指定されたアドレスの Apple II ルーチンを実行する
  • 0x96 send input char:Apple II のキーボード入力へ 1 文字送る
  • 0x98 get output char:Apple II の 1 文字印字を取得する
  • 0xc0 reconnect vdrvs:仮想ドライブを再起動する(仮想ドライブファイルのクローズと再オープン)
  • 0xc2 disconnect vdrvs:仮想ドライブを閉じる
  • 0xff close:クライアントをクローズする

***

a2pid.c には仮想ドライブファイル読み書きのためのインターフェイス(vdrvopen(), vdrvclose(), vdrvread(), vdrvwrite() 等)が用意されています。ここは少し詳しく関数単位で見ていきます。

int vdrvopen(char *path)

Apple2Pi の仮想ドライブ 1/2 をオープンします。仮想ドライブのディスクイメージファイル名は “A2VD1.PO” および “A2VD2.PO” で固定ですが、これらのファイルがあるディレクトリパスは引数 path で指定できます。双方のファイルのオープンに失敗すると 0 を返し、それ以外の場合は 0 以外の値を返します。

void vdrvclose(void)

Apple2Pi の仮想ドライブ 1/2 をクローズします。

int vdrvtime(int afd)

ProDOS 形式の日付時刻データ(4 バイト)をファイルディスクリプタ afd に書き込みます。現在使用されていません。

int vdrvstat(int afd, int drive)

ドライブ drive に割り当てられているディスクイメージファイルのブロック数(=ファイルサイズ/512、2 バイト値)をファイルディスクリプタ afd へ書き出します。

int vdrvread(int afd, int drive, int block)

仮想ドライブ drive に対応するディスクイメージファイルのブロック番号 block の位置から 512 バイト(ProDOS 1 ブロック分のデータ)を読み出して、ファイルディスクリプタ afd へ書き出します。成功すると 0、失敗すると 0x27 を返します。

int vdrvwrite(int afd, int drive, int block)

ファイルディスクリプタ afd から 512 バイト(ProDOS 1 ブロック分のデータ)を読み取り、仮想ドライブ drive のブロック番号 block へ書き込みます。 完了後 fsync() で Linux ファイルシステムへの書き込みを確定します。成功すると 0 を返します。ファイルシステムへの書き込みに失敗すると 0x27 を、それ以外の失敗では 0x28 を返します。

***

Apple2Pi には vdrv* 系の読み書きインターフェイスとは別に Linux ファイルシステムから ProDOS ボリュームを操作するための fusea2pi.c も含まれますが、この部分は今回は読みません。

a2pid.c 以外のソースは簡単に眺めるだけに止めます。

src/a2lib.c

Linux クライアントから a2pid への接続と通信を扱うライブラリです。ソケットのオープン/クローズ、データブロック送受信、Apple II 内ルーチン(ProDOS システムコール等)の呼び出しが行なえます。

src/a2term.c

Linux コンソールを Apple II の入出力に接続するためのプログラムです。以下のコマンドを送受信します。

  • 0x96 を送信: Apple II へのキーボード入力送信。
  • 0x98 を受信:Apple II からの印字リクエスト。MSBをマスクする、改行文字を変更するなどの変換を行ってから Linux 端末上に表示する。
  • 0x9E を受信:キーボード入力を Apple II が受信したことの確認応答。a2term から送信した文字と一致しなかった場合はエラーとみなし、再同期はせずそのまま a2term 終了。

src/a2setvd, src/a2pidcmd.c

a2pidcmd は a2pid 経由で Apple II シリアル回線へ任意のコマンドパケットを送信し、応答として返される ack 値を受信します。なお Apple II が受け取った 1 バイト(かならず偶数値)のコマンドに対して返す ack 値は、コマンド値+1(奇数値)となります。

a2setvd は仮想ドライブにディスクイメージファイルを割り当てるスクリプトです。a2picmd を経由して a2pid へコマンド 0xc0(マウント)、0xc2(アンマウント)を送ります。アンマウント→イメージファイルを再リンク→マウントの順に実行することで指定のファイルを割り当てます。

利用する機能

以上、Apple2Pi のコードをかなり恣意的に拾い読みしてきました。ピックアップした内容を押さえることで次の処理が可能になります。

  1. シリアル回線を経由した文字の送受信
  2. シリアル回線を経由したディスクイメージファイルへのブロック単位の読み書き

つまり単一のシリアル回線を利用してコンソールとディスクエミュレータの 2 つの機能を実行できます。今後この機能を実装していきます。

注:

  1. 1980 年代の ASCII 誌で「Planet」という汎用パソコン間ネットワークのシステムが紹介されていました。京大 KMC のプロジェクトだったと思います。シリアル回線経由かどうかはわかりません。
  2. 2023 年 6 月時点で Raspberry Pi Pico ベースの 8 ビットサーバといえるシステムが複数発表されています。Raspberry Pi Pico には高速 PIO 機能があり、レトロマシンとの接続は必ずしもシリアルに限定する必要はありません。PIO は 1〜4 MHz クロックの 8 ビットシステムバスに接続するのにぴったりだな、と考えていたら RP2040 データシートそのものに用途例として “8080 and 6800 parallel bus” と書いてありました。
  3. 実際のところ Apple IIe 用の AppleTalk アダプタが発売されていたようです(参考)。また 1990 年代に入ってから Ethernet カードなども発売されていました。

Apple II リモート開発環境:VSCode Remote Development

前回の投稿で Apple II Pi をセットアップし、Apple II 実機と Raspberry Pi の間の橋渡しができました。最後に以下の作業を行って開発環境を整備します。

  1. Raspberry Pi に各種開発ツールをインストールする
  2. Mac から Raspberry Pi へ VSCode Remote Development 接続を行う
  3. サンプルコードのダウンロードと実行

これにより、普段使用している Mac デスクトップ環境で Apple II ソフトウェアの開発が行なえます。

Raspberry Pi 上の開発環境設定

開発ツールとして git、CC65、AppleCommander を Raspberry Pi にインストールします。

git 環境の整備

インストール

sudo apt-get install git

git ユーザ名の設定と github への ssh 接続

基本的な流れは Mac/Win 上での設定と同じです。

CC65 のインストールと設定

CC65 は 6502 用 C クロスコンパイラ・クロスアセンブラです。Apple II 用のメモリマップが使用できます。パッケージをインストールすることも可能ですが、ここではソースからビルドします。

git clone https://github.com/cc65/cc65.git
cd cc65; make
sudo make install

インストール先は次のとおりです。

コマンド:       /usr/local/bin/*65
ライブラリ等:/usr/local/share/cc65/

ビルドツールとして CMake, Ninja をインストールします。

sudo apt-get install cmake ninja-build

CMake と Ninja の CC65 向け設定として cc65-toolchain-example を利用します。後述するサンプルリポジトリに組み込むのでここではインストールしません。

AppleCommander

AppleCommander は Apple II 用ディスクイメージ操作ツールです。CC65 で作成したバイナリを Apple II ディスクイメージに書き込むために使用します。

AppleCommander のインストール手順は次のとおりです。

  1. AppleCommander リリースページから最新の ‘AppleCommander-ac-1.x.y.jar’ ファイルをダウンロードします。
  2. 次の要領でインストールします。
sudo apt-get install openjdk-11-jdk
sudo cp AppleCommander-ac-1.6.0.jar /usr/local/bin
cd /usr/local/bin; sudo ln -s ./AppleCommander-ac-1.6.0.jar ./ac.jar
sudo vi ./ac.sh
[以下の内容を入力]
#!/bin/sh
java -jar /usr/local/bin/ac.jar $*
[:wq で vi 終了]
sudo chmod 755 ./ac.sh

コマンドラインツール ‘ac.sh’ が使用できるようになります。

VSCode Remote Development のセットアップ

以上の作業により必要なツールを Raspberry Pi 上にインストールしました。しかしこの Raspberry Pi は基本的に ssh 接続の文字端末からしかアクセスできないので、開発環境として使うには若干非効率です。VNC 接続を設定して Raspberry Pi デスクトップを使用してもいいのですが、ここでは VSCode Remote Development を利用することにします。この方法だと普段使用している Mac/PC の操作性そのままで作業が行えて快適です。

以下の手順で Mac から VSCode Remote Development が使用できるようになります。PC でも基本的な流れは同様です。なお、Mac から Raspberry Pi への ssh パスフレーズ接続は前回の投稿で説明した手順で設定済みであるものとします。

下記の操作はすべて Mac 上で行います。

  1. Mac 上の VSCode はインストール済みであるとします。
  2. VSCode 機能拡張 ‘Remote Development’(ベンダー:Microsoft)をインストールします。
  3. VSCode 画面の左端ナビゲーションバーに追加された ‘Remote Explorer’ アイコンをクリックします。
  4. Remote Explorer パネルが表示されます。前回の投稿で設定した ~/.ssh/config ファイル内のエントリが ‘ssh targets’ の下にリストされています。
  5. 登録済みエントリの一つ ‘rpi’ にカーソルを乗せ、右に表示される +🗂 をクリックします。
  6. config ファイルの設定に従って Raspberry Pi への接続が開始されます。最初に ssh パスフレーズの入力が求められます。その後 VS Code Remote Development のダウンロードが始まります。初回接続時はダウンロードにしばらく時間がかかります。
  7. ダウンロードが終了すると VSCode の新規ウィンドウが開きます。左下に ‘SSH rpi’ と表示され、このウィンドウが Raspberry Pi 上の Remote Development 画面であることが示されます。

Remote Development 参考記事

Remote Development 画面では次のいずれかの方法で開発を開始できます。

  • シェルコンソールを開いて新規ディレクトリを作り、その中で ‘git init’ を実行する
  • シェルコンソールで ‘git clone’ を実行してプロジェクトを取得する

いずれの場合も VSCode Remote Development ウィンドウ上でプロジェクトディレクトリを開いてコーディングを始めます。

リモート開発環境の構成

以上で Apple II リモート開発環境がひと通り設定できました。開発環境の構成は下図のとおりです(前々回投稿の図を再掲)。

サンプルコードのダウンロードと実行

この環境で動くサンプルコードを 2 種類作りました。

これらのリポジトリはビルド設定用に cc65-toolchain-example をサブモジュールとして含みます。 git clone コマンドでリポジトリをクローンした後、リポジトリ内で次のコマンドを実行してサブモジュールをロードします。

git submodule update -i

2 つのリポジトリのディレクトリ構造は共通です。トップディレクトリにある runall.sh を実行すると、3 個のソースディレクトリ(Applesoft Basic、C、アセンブリ)について以下の処理を繰り返します。

  • 各 src ディレクトリの build.sh を実行して以下を処理
    • C とアセンブラについては CMake + Ninja でビルド実行
    • Basic、C、アセンブラそれぞれのプログラムを含むディスクイメージを作成
  • ディスクイメージをマウント
  • Apple II コンソールからプログラム実行コマンド(RUN、BRUN)を送出

今後はこのサンプルリポジトリをテンプレートとして使用する予定です。

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 から実行する手順を説明します。

参考

Apple II リモート開発環境の構築

Apple II の開発環境といっても、昨今では実機を使わずにクロスアセンブラとエミュレータを使ってモダン OS 上で作業することが多いようです。しかし下記のような自作ハードウェア(拡張カード)の対応ソフトウェアを開発する場合は、エミュレータ上で完結するわけにはいきません。

基本的にはモダン OS(Win/Mac/Linux)上でコーディングを進めつつ、ビルド毎にバイナリを Apple II 実機に送って実行、テストを繰り返す作業が必要です。モダン OS と Apple II 実機を往復する一連の操作がスムーズに行えるハイブリッドな環境が求められますが、この際に役立つツールが Apple II Pi(David Schmenk 氏作)です。

Apple II Pi は Apple II と Raspberry Pi をシリアル回線で接続して双方の機能を融合するシステムで、シリアルインターフェイスまわりのハードウェアと Apple II / Raspberry Pi 双方のソフトウェアで構成されます。ハイブリッドな Apple II 開発環境の構築という観点からは、Apple II Pi 仮想ストレージを使ったファイルのやり取りが中心的な機能となります。また Apple II コンソールを Linux 端末から操作する機能(a2term)も便利です。

この投稿では Apple II Pi を中心にして VSCode エディタなども利用し、モダン OS(ここでは Mac を使用)から Raspberry Pi と Apple II を操作することで Apple II のリモート開発環境を構築する方法を検討します。なおターゲットの実機には Apple IIe / ProDOS を使用します。

リモート開発環境の基本構成

開発環境の全体構成を下図に示します。

Raspberry Pi の構成

上図に示したように多くのツールが Raspberry Pi 上に配置されます。主なツールについて以下に説明します。

Apple II Pi は シリアル通信カード、Apple IIe 側の a2pi ソフトウェア、Raspberry Pi 側の a2pid ソフトウェアおよび個別のコマンドツールから構成され、2 つのシステムを連携するいくつかのサービスを提供します。

Apple II Pi が提供する最も重要なサービスが仮想ドライブです。Raspberry Pi 上に保存されるディスクイメージファイルに基づき、Apple IIe から見ると Apple II Pi カードが刺さっているスロットに 2 つのブロックデバイスが現れます。

a2term も a2pid が提供するサービス(を利用したアプリケーション)です。a2term は Raspberry Pi 上で実行される通信ソフトウェアですが、接続先は Apple IIe の ProDOS コンソールであり ProDOS や Applesoft Basic のセッションが Raspberry Pi 端末上で利用できます。

CC65/CA65 は 6502 用 C コンパイラ / アセンブラです。開発は主にこれらの言語を使って行います。なお Applesoft Basic も開発用言語として使用できます。

AppleCommander ツールは仮想ドライブボリュームの実体である Raspberry Pi 上の *.po ディスクイメージファイルに対して、Basic プログラムや CC65/CA65 で作成した Apple II 実行ファイルを読み書きするために使います。

Apple IIe の構成

Apple IIe は Apple II Pi 専用の ProDOS ディスク A2PI-1.7.PO から起動します。このディスクは通常通り S6, D1 から読み込んで ProDOS を起動しますが、その際に a2pi ソフトウェアを ProDOS システムに常駐させます。

a2pi ソフトウェアは Apple II Pi カードのシリアル通信を管理すると同時に、Apple II Pi カードが刺さっているカードスロット(例えばスロット #2)上で D1、D2 の 2 つの仮想フロッピードライブをエミュレートします。またコンソールやジョイスティックの状態もシリアル通信経由で Raspberry Pi へ送ります。

PC(Win/Mac/Linux)の構成

Mac(または他の適当な Win/Linux PC)は必須ではありませんが、Raspberry Pi との間を SSH 接続して VSCode Remote Development を実行することにより PC のデスクトップ環境で Apple II プログラミングが行なえます。a2term を VSCode Remote Development 内の端末パネルで起動すれば、Apple II ProDOS コンソールを PC 画面上に持ってくることもできます。Mac 上の VSCode からプロジェクトを編集、実行している様子が本稿冒頭の画面です。

リモート開発環境での操作

プログラムの作成・実行の手順はおおむね次のようになります。各手順は Raspberry Pi に対する操作です。

  1. C(CC65)、アセンブラ(CA65)、Applesoft Basic を使って Apple II プログラムを記述します。Basic プログラムはテキストファイルとして記述できます。
  2. CC65/CA65 ソースコードを Apple II 用実行バイナリファイルにコンパイル(アセンブル)します。バイナリファイルは Raspberry Pi のファイルシステム上に保存されます。
  3. AppleCommander ツールを使ってバイナリファイルを *.po ディスクイメージに書き込みます。Basic ソーステキストファイルを Basic トークン形式に変換して書き込むことも可能です。
  4. 作成した *.po ディスクイメージファイルを a2pid の仮想ドライブとしてマウントします。作成したプログラムが Apple IIe からアクセスできるようになります。
  5. a2term を使って Apple IIe 上で RUN ないし BRUN コマンドを実行します。

サンプルプログラムの実行

上記の操作手順をみれば想像がつくと思いますが、Makefile やシェルスクリプトなどを組み合わせれば一連の過程をほぼ完全に自動化できます。ターゲット環境の選択(実機か、エミュレータか)など複雑な操作を行おうとすると多少工夫が必要になりますが、少なくともビルドと実行を繰り返す作業は比較的容易に自動化、省力化できます。次の動画では 3 種類の言語による HelloWorld プログラムをビルドし、Apple IIe 実機に送って実行する操作を Makefile とシェルスクリプトを使って自動化しています。

本稿では個々のツールの設定詳細に触れませんでした。今後個別に検討しようと思います。

光速船 Vectrex(3)PiTrex プログラミングのデバッグ

引き続き Raspberry Pi を使った PiTrex プログラムの作成方法について検討します。今回はベアメタル環境でデバッグプリントを表示する方法を調べました。

ベアメタル環境でのエラー

前回の投稿で、ベアメタル版 hello.img をインストールする際に次の手順が含まれていました。

2. /boot/settings ディレクトリを作成します。
sudo mkdir /boot/settings

/boot/settings ディレクトリはベアメタル版バイナリの実行に必須ですが、Makefile では作成されないため手動で作成する必要があります [注]。当初私はこれに気づかなかったため、/boot/settgings ディレクトリがない状態で hello.img プログラムを起動して Vectrex 画面に次のようなエラーメッセージを出していました。

このエラーメッセージは十分な情報を与えてくれないので原因を絞り込めません。さらに悪いことに、この画面でプログラムが停止してしまいます。ベアメタル環境では OS に戻ってあれこれ調べるというわけにもいかず、電源を切る以外にできることはありません。

ひとまず SD カードを PC に接続して /boot/config.txt の設定をベアメタル環境から OS 起動環境に戻しました。Raspberry Pi OS を起動して pitrex リポジトリ全体で文字列 “NO DIRECTORY” を検索したところ、pitrex/vectrex/osWrapper.c に次の記述が見つかりました。

問題のエラーはカレントディレクトリの変更中に発生していることがわかります。行番号 398 の
v_error("NO DIRECTORY");
が Vectrex 画面にエラーメッセージを表示しているようです。その上の行(行番号 397)に
printf("NO %s directory found...!\r\n", _dir);
という記述があります。これはいわゆるデバッグプリントで、移動先ディレクトリ名を表示しています。このデバッグプリントを読んで問題となるディレクトリ名を確定したいところですが、残念ながら printf() 関数は Vectrex 画面へは出力されません。printf() の出力は標準出力、つまり Raspberry Pi のコンソールに対する出力になりますが、ベアメタル環境では ssh 端末や HDMI モニタは使えません。OS が走っていないので、特に配慮しなければ Wifi もディスプレイコントローラも初期化されないためです。

シリアルコンソールの追加

実はベアメタル環境でもシリアルインターフェイスだけは初期化されており、printf() 出力は Raspberry Pi Zero W の GPIO UART ピンに出ます。詳細は PiTrex baremetal の作者 Malban 氏の blog で説明されています。UART ピンの設定は
GPIO Header pin8 : TX
GPIO Header pin10 : RX
GPIO Header pin 9 : Gnd
となっており、printf() の内容は RX ピンにシリアル信号として出力されます。

これらの GPIO ピンに USB シリアル変換モジュールを繋げば PC 上の端末ソフトウェアで printf() 関数によるデバッグ出力を確認できます。USB シリアル変換モジュールは Raspberry Pi GPIO 対応のもの、つまり 3.3V レベルのシリアル接続ができるモジュールを選択します。以下のように接続します。
GPIO pin8 (TX) : USB Serial RX
GPIO pin10 (RX) : USB Serial TX
GPIO pin9 Gnd : USB Serial Gnd

RX と TX はクロス接続します。これはコンピュータ同士をシリアル接続する際の要点です。実態は次の写真のような感じになります。

Raspberry PI GPIO シリアルピンの接続
Vectrex/Pitrex に接続したところ

USB ケーブルの他方の端は PC の USB 端子に接続します。

Malban 氏の blog によるとシリアルコンソールの通信速度は 115200 bps ですので、これに準じて PC のシリアル通信ソフトを設定、起動します。例えば Mac の場合はターミナルウィンドウで次のコマンドを実行します。

screen /dev/tty.usbserial-00000000 115200

usbserial-00000000” の部分は使用する USB シリアル変換モジュールによって異なります。

デバッグプリントの確認

以上でデバッグプリントを PC で受信する準備が整ったので、再度 hello.img をベアメタル環境で起動します。Vectrex の電源を入れると前掲のエラー画面で停止しますが、同時に Mac 上のターミナルウィンドウに次の内容が出力されます。

メッセージ中の次の行
NO settings directory found...!
が、前述の pitrex/vectrex/osWrapper.c ファイル内の printf() 関数によるデバッグプリントです。つまり失敗した移動先ディレクトリの名前が ‘settings’ であることがわかります。

残念ながらディレクトリのフルパスはここでは表示されません。しかし実行元プログラムである hello.img は /boot/ ディレクトリにありますから、プログラム実行中に作業ディレクトリを移動していなければ期待されるフルパスは /boot/settings です。

Vectrex の電源を切り、Raspberry Pi Zero W から SD カードを抜き出して PC にセットします。boot ディレクトリがマウントされるので、その中に settings ディレクトリを作成します。

SD カードを Raspberry Pi Zero W に戻して Vectrex の電源を入れると、hello.img プログラムが正しく実行されるようになりました。

同じ hello_world プロジェクトを Raspberry Pi OS 環境でビルドした場合は hello_world ディレクトリに hello バイナリが作成されます。hello_world/settings ディレクトリはリポジトリ内に最初から用意されているので、hello バイナリを実行しても ”NO DIRECTORY” エラーは発生しません。つまり settings ディレクトリの欠落はベアメタル環境特有の問題であるため、シリアルコンソールを接続してベアメタル環境でデバッグプリントを確認しない限り見つけるのは困難だったと思われます。

注:あとから調べたところ pitrex-config.sh を実行すると /boot/settings ディレクトリが作成されるようです。

光速船 Vectrex: PiTrex のセットアップ

光速船 Vectrex は 1982 年発売の家庭用ゲーム機です。ベクタスキャン方式の内蔵モノクロモニタが最大の特徴でした。

日本では 1983 年発売、定価は 5 万円超で同時代の他機種と比べると随分高価だったという印象です。本機に関しては内蔵モニタのコストを差し引いて比較するべきかもしれませんが、まあしかし当時の為替相場は 1 ドル 240 円前後でしたから輸入モデルはいずれも高めの価格設定でした。光速船は業務用としての展開も考えられており、タイマ式コイン装置(時間が来ると問答無用でゲーム終了になる)が追加できるようになっていました。おもちゃ屋の店頭で 15 分 50 円程度で遊んだ記憶があります。

Vectrex はプロセッサとして 1.5MHz 68A09 を使用しており、6522 VIA と D/A コンバータを介してベクタスキャンモニタの X/Y スイープと輝度値 Z を制御する比較的シンプルなシステム構成です。CPU 自体が定期的に画面を再描画する必要があり、処理速度とメモリ容量の制限もあって画面オブジェクトの描画には直線が多用されます。ベクタスキャンの性質上、線が密集している領域は他の部分と比べて輝度が若干上がって見えます。

これらはソフトウェア作成上の制約ではありますが、ベクタスキャン画像に独特のタッチが加わる効果もあります。こういった性質を熟知した長年のユーザの中には独自にプログラムを書く方々もいて、近年に至っても新作ゲームやデモが公開されています。

* * *

Vectrex のカートリッジスロットに Raspberry Pi Zero W を接続するボードが PiTrex です。ベクタスキャンモニタのほか、コントローラやサウンドなど本体内の I/O デバイスすべてが Raspberry Pi から直接制御できます。Vectrex のカートリッジスロットには CPU バスが直接出ているので、HALT ピンをアサートして本体の 6809 を止めてしまい(6809 とバスは Hi-Z で切り離される)Raspberry Pi の GPIO 信号をバスに接続してシステム全体を乗っ取る仕組みだそうです。Vectrex ではモニタ制御回路含めほぼすべての I/O が 6522 VIA に接続されているので、Raspberry Pi の主な処理は 6522 の制御です。

今回 PiTrex 開発元が組み立て済み基板を生産販売するということで、販売サイトの説明に従ってメールアドレスを登録しました。しばらくすると「5/14 に次のバッチの頒布を開始するよ」というメールが送られてきたので指定の時刻にサイトへアクセスして 1 個注文しました。受付開始から数時間内に品切れになったようで、数はそれほど出ていないのでしょう。当面はこのペースで生産・頒布されると思われます。

注文後 10 日ほどでオーストラリアから PiTrex 基板が送られてきました。Vectrex 本体は、数年前に入手して保守点検ののちしまいこんであったものを出しました。この他に Raspberry Pi Zero W とピンヘッダ、SD カードが必要です。

本投稿の残りでは PiTrex の組み立てと接続の様子を説明します。また、PiTrex 説明書で推奨されている PiTrex baremetal ソフトウェアをインストールしてみます。

1. PiTrex の組み立てと接続

PiTrex キットには PiTrex 本体基板(部品はんだ付け済み)と レターサイズ 1 枚の説明書が含まれています。これ以外に次のものが必要です。

  • RaspBerry Pi Zero W
  • Zero W GPIO 用ピンヘッダ(20×2)
  • SD メモリカード

まず Raspberry Pi Zero W に GPIO 用ピンヘッダをはんだ付けします。部品面にピンを立てる方向で取り付けます。最初からピンヘッダが装着されている Raspberry Pi Zero WH を使うという方法もあります。

PiTrex 基板の部品面を確認し、電源供給用のジャンパブロックは接続したままにしておきます。こうすると Vectrex 本体から Raspberry Pi へ電源が供給されます。PiTrex 基板上の 5V 電源ジャック(付いてないモデルもある)は使用しません。ただし Vectrex の電源供給能力は限られているので、この場合 Raspberry Pi に外部デバイス(キーボード、USB ハブ、外部ストレージなど)は繋がずヘッドレスで使用します。

Raspberry Pi と PiTrex 基板を接続します。2 つの基板の部品面が向かい合う形になります。ピンヘッダとコネクタがずれていないことを確認します。

次に Vectrex 本体のカートリッジスロットへ PiTrex を接続します。Raspberry Pi Zero 基板が上、PiTrex 基板が下になる方向で挿入します。

この時点では Raspberry Pi に SD カードを挿入していないので、電源を入れても何も起きません。

2. Pitrex baremetal の実行

PiTrex の使用環境は大きく分けて 2 種類あります。

  1. Raspberry Pi の SD カードから直接 PiTrex プログラムを実行する(ベアメタル環境)
  2. Raspberry Pi の SD カードに Raspberry Pi OS をインストールし、OS 上で各種 PiTrex プログラムを起動する(Raspberry Pi OS 環境)

このうちベアメタル環境で実行するプログラムとして現在最も充実しているのは Vide Malban 氏による PiTrex baremetal です。カートリッジやエミュレータのイメージの起動もサポートされています。

以下、PiTrex baremetal のインストールを実際に行った結果をもとに手順を説明します。といっても詳しい手順は配布元ページに説明されているので、ここでは後々 Raspberry Pi OS 環境を使用することも考慮した方法についてまとめます。

  1. SD カードのフォーマットを行います。今回は Raspberry Pi OS 環境と併用することを考慮し、Raspberry Pi Imager を使ってフォーマットと OS のインストールを行います。インストールする OS として Raspberry Pi OS Lite を指定します。
  2. SD カードを PC(macOS/Win/Linux)に再セットします。boot ボリュームがマウントされます。この時点で、boot ボリューム内の全ファイルをバックアップしておきます。
  3. PiTrex baremetal 配布元ページから SD_Drive_<日付>.zip をダウンロードします(ページ内の緑のボタンをクリック)。zip を展開して得られる内容を boot ボリュームにコピーします。
  4. boot ディレクトリに含まれる boot/config.txt の内容を確認します。このファイルには以下の行が含まれており、Raspberry Pi 起動時に自動的に pitrex.img が起動します。
    kernel=pitrex.img
  5. SD カードを PC からアンマウントし、Raspberry Pi にセットします。

PiTrex と Raspberri Pi Zero W を前項の説明通り Vectrex にセットし、Vectrex の電源を入れると PiTrex baremetal ソフトウェアが立ち上がります。

カートリッジ bin イメージを追加しなくても起動画面、Movies デモ、オリジナルゲーム等で PiTrex の性能を確認できます。特に起動画面(下の動画参照)の 3D ロゴアニメーションは高速かつスムーズな動きで、Raspberry Pi の GPIO による制御がオリジナルの 68A09 MPU の処理速度を凌駕していることがわかります。

PiTrex baremetal には結構深いメニュー階層があり、Vectrex コントローラのジョイスティックでナビゲートできます。Movies カテゴリから “Bad Apple” が選べますが再生してみると描画の座標ずれがやや目立ちます。キャラクターやリンゴ、ナイフ等がアウトライン描画でスムーズに動くのですが、描画が細かい、つまりアウトラインを構成する線分の数が多いせいか始点と終点が常にずれており一筆書きが閉じません。このずれを調節するための設定があるようなのですが、具体的にどのパラメータを動かせばいいのかよくわかりません。Github リポジトリ Readme の “Known Issues” の項に「ベアメタルでは Calibrate プログラムが動かない」と書いてあるので、現状では調節が効かないのかもしれません。

また Movies と Music カテゴリのデモはいずれも音声出力レベルが極端に低いようです。ボリュームつまみを最大にしてかろうじて聞き取れるレベルなのですが、これは他の方の動画を見ても同様だったので機能仕様上の問題かと思われます。

* * *

以上で、とりあえず PiTrex 添付マニュアルでできるところまで進めました。この先は次の 2 通りの方向が考えられます。

  1. カートリッジやエミュレータのイメージファイルをインストール、設定して実行する
  2. Raspberry Pi 上のプログラミング環境を利用して Vectrex を制御する

エミュレータ方面の作業はアーケード機、特にベクタスキャン機の知識が必要とされるようで私にはちょっと歯が立ちません。次回は 2. のプログラミング環境について探ろうと思います。

参考