lib8001
PC-8001実機を使っていた当時、ゼビウスのようなゲームを作りかけたんですが、ドット単位のBGスクロールだけ作って遅すぎて無理と諦めたことがあります。
今ならエミュレータでクロックを上げれば速度の問題は解消できるので、作ってみたくなりました。
若ければN-BASICとアセンブラで書くかもしれませんが、もう無理です。
そこでSDCCでクロス開発することにしました。
#当時コンパイラなんて夢の環境だったなぁ
せっかくなのでN-BASICのROMなしで、ベアメタルプログラミングで行きます。64kBフルに使えるし。
さらに、汎用性の高い部分をライブラリとして分離し、その上でゲームを構築します。
ライブラリの機能は以下の通りです。
画面制御 40/80桁 20/25行 モノクロ/カラー
文字表示
アトリビュート操作
カーソル表示
テキスト/セミグラフィックによる点、線分、矩形、矩形塗りつぶし、円描画
文字入力
RTC操作
さらにゲーム用に以下の機能があります。
ダブルバッファVRAM
整数の三角関数、平方根
擬似スプライト(アニメーション、当たり判定)
BEEPまたはSN76489AによるMML演奏
標準のPC-8001にSN76489Aなんて乗っていませんでしたが、私は独自仕様の拡張ユニットを作り、実機につないで使っていたので、それを再現しています。
独自拡張部分はCocoa8001で利用できます。
Cocoa8001にはタイムプロファイラ機能があり、そのためのアドレス一覧出力もできます。
本ライブラリの他に、SDCCのライブラリprintf(),rand()なども使えます。
https://github.com/kwhr0/lib8001
sdccバージョン3.7以上3.8〜4.1と4.4以上でビルドできます。
(2023/05/14更新)
sdccバージョン4.2以上では(--sdcccall 0を付加しても)正常に動作しません。
(2024/02/04更新)
sdccバージョン4.4以上に対応しました。
バージョン3.7〜4.1も引き続き使用できますが、
バージョン4.2と4.3はコンパイラのバグのため正しく動作しません(報告して修正してもらいました)。
#3626 Necessary cases are deleted in switch
(2024/10/27更新)
新しいsdccで書いているうちにブロック先頭以外で変数定義をするようになり、バージョン3.7ではコンパイルできないことが判明しました。
現時点で使用可能なバージョンを3.8〜4.1と4.4に訂正します。
ついでなので、sdccについて、どこまで古いホストでビルドできるか調べたところ、Mavericks(10.9)でした。
4.4はビルドできませんでしたが、4.1は大丈夫でしたので、手順のメモを残します。
ビルド準備:
MacPortsをインストールし、boostをインストールします。
$ sudo port install boost
MacPortsはHomebrewと違い、古いホストにも対応していてありがたいです。
MacPortsを使えばsdccもインストールできるのですが、現時点で対応しているバージョンが4.2なので使えません。
以下のZ80用コンフィグスクリプト(cnf_sdcc.sh)をダウンロードし、パスを通しておきます。
https://github.com/kwhr0/sdcc-config-script
ビルド:
$ cd sdcc
$ export CXX="c++ -I/opt/local/include"
$ cnf_sdcc.sh
$ make
$ sudo make install
とします。
xevious8001
lib8001上でPC-8001用ゼビウスを作りました。
https://github.com/kwhr0/xevious8001
ビルド済みのインテルヘキサも用意しました。
https://github.com/kwhr0/xevious8001/releases
macにCocoa8001をダウンロードし、上記ファイルを開けば遊べます。
N-BASICのROMもフォントファイルも必要ないので、ぜひ遊んでみてください。
https://github.com/kwhr0/Cocoa8001/releases
PS4のコントローラが使えます。
なお、Cocoa8001のクロック設定は両方20MHz(以上)にしてください。