突然ですが、PCエンジン用のプログラムを自作してみたいと思います。関連する知識が全くない状態からのスタートです。
まず最初にCC65が開発に使えるのでは、と思っていたのですが、CC65のドキュメントを読んでも使い方が良くわかりません、、、。付属のドキュメントには「Some useful resources on PCE coding:」というリンクを貼られていたのですが、その中の一つがこちら。
↓
「HuC」というPCエンジン用のCコンパイラがありました。これを使ってみます。CC65とは無関係ですね。開発は2005年で終わっています。バージョンが一杯ありますが、「huc-3.21-win.zip」をダウンロードしてみました。windows版ですが、DOS版との違いがわかりません。
ZIPファイルを展開して、「huc-3.21-win」フォルダをCドライブの最上位ディレクトリに置いてみました。これでインストールは完了です。
binフォルダ内のEXEファイルは実行しようとすると「WindowsによってPCが保護されました」と出てしまうので、事前に解除しないといけません。
どうプログラムしたらいいのか、よくわからないので、docフォルダのドキュメントを読むと、「PONGが参考になる」という感じの一文を発見。そこで検索すると、次のページがヒットしました。
↓
こっちのHuC(huc_dos_142.zip)はタイムスタンプが2000年で、バージョンが5年ほど古いです。DEMOSフォルダにサンプルプログラムとして「PONG」と「SCROLL」が付属しています。これらのソースだけ頂くことにします。ソースの中に拡張子が「PCX」というファイルありますが、これはBG&スプライト用の画像ファイルです。
ビルド用のバッチファイルを作ります。「PCE_INCLUDE」はHuCに指定するヘッダファイルのパスです。
「SRCFILE」はコンパイルしたいソースのファイル名。出力するROMイメージのファイル名と兼用です。
「huc」はCコンパイラ。「pceas」はアセンブラです。hucはCをアセンブラに変換するだけなので、pceasを使ってアセンブルを行います。
、、、と思ったのですが、hucからpceasを呼び出すのが正しかったようなので、上記のように修正しました。pceasを実行する記述を無くして、binまでのパスを設定しています。この場合、pceasの実行中にpauseのメッセージが表示されてしまうので、nulでメッセージを消しています。もしエラーが出ないならpauseは不要です。
バッチファイルを実行すると、PONGをリビルドします。そのままだとファイルが見つからないというエラーが出るので、ソースをちょっと直します。
#include "../huc.h"
↓
#include "huc.h"
こんな感じです。
あと、PCXファイルが見つからないというエラーが2件出るので、ファイル名を直します。
「RACKETLE.PCX」→「RACKETLEFT.PCX」
「RACKETRI.PCX」→「RACKETRIGHT.PCX」
こんな感じです。逆にソースのファイル名を直してもいいです。
うまくビルドできたら、ROMイメージの「PONG.PCE」が生成されます。
PONG.PCEをPCエンジンのエミュレータで実行した様子。
なぜかスコア表示がおかしくなってしまいました。原因は不明です。そのうち直したいと思います。
先ほどのバッチファイルを修正して、「SCROLL」もリビルドして、実行してみました。こっちは問題なく動きました。
現時点ではエミュレータで動かしていますが、そのうちPCエンジンの実機でも動かしてみたいです。
(追記2020/11/29)
PONGのスコア表示がおかしくなる問題ですが、「load_sprites」を使わないで「load_vram」に変更すると直りました。
こんな感じに修正します。
load_vramの書式は(VRAMアドレス ,int型配列変数 ,転送ワード数)です。
#incsprの変換後のソースを見ると、画像データの合間になぜか「dw.0」が追加されていて、これがデータの頭出しの誤差を作ってしまってました。load_spritesを使うと誤差を含んだままVRAMに転送してしまうのですが、load_vramなら誤差を取り除いて転送することができます。
あと、#incspr関連の記述はソースの最後に配置されていますが、これだとコンパイル時に変数の未定義エラーが出てしまいます。いままでエラーが出なかったのが不思議ですが、、、。#incspr関連はmain関数より上に配置しましょう。
正常にスコアが表示している様子です。
続き