PCエンジンのプログラミング(その3)Spriteを動かす

nicotakuya.hatenablog.com
前回の続きです。「HuC」を使って、PCエンジンのプログラミングをやってみたいと思います。
前回は変換ツールがPCXファイルしか対応してない&使いにくいというところで終わっていましたが、ついに変換ツールを自作してみました。
こちらで公開中です。

sites.google.com
このツールを使うと、BMPファイルから画像/パレットデータを抽出することができます。

f:id:nicotakuya:20201129020851p:plain
自作のスプライトエディタで画像をバイナリ化する

ツールの実行画面です。
ここでは例として、16x16ピクセルx64個のキャラクター画像を描いてみました。キャラクター1個あたりのデータ量は64ワードなので、64個で4096ワードのVRAMを消費します。

f:id:nicotakuya:20201129022034p:plain
メニューを拡大

変換時のメニューです。
binary 16colorのボタンがPCエンジン用です。
変換後、「pattern.bin」(パターン)と「palette.bin」(パレット)という2つのバイナリファイルが出力されます。
最初は「const char pattern[]={ データ、、、」みたく、テキストで出力したかったのですが、インクルードするとhucで謎のエラーが出てしまうので、バイナリにしました。

動作確認用のプログラムを作ってみました。以下の通りです。

/* sprite move by takuya matsubara*/
#include "huc.h"
#incbin(pattern,"pattern.bin");
#incbin(palette,"palette.bin");

#define CHRADDR   0x6F00
#define SPMAX 64

main()
{
    int num;
    char newx,newy;
    char x[SPMAX],y[SPMAX],x1[SPMAX],y1[SPMAX];

    load_vram(CHRADDR,pattern,64*64);
    init_satb();
    for(num=0; num<SPMAX; num++){
        spr_set(num);
        spr_pattern(CHRADDR+(64*num));
        spr_ctrl(SIZE_MAS|FLIP_MAS, SZ_16x16|NO_FLIP);
        spr_pal(0);
        spr_pri(1);
        x[num]=16+(num % 14)*16;
        y[num]=16+(num / 14)*16;
        x1[num]=(num % 7);
        y1[num]=(num % 5);
        if((x1[num]==0)&&(y1[num]==0))y1[num]=1;
    }
    vsync(1);
    set_sprpal(0, palette);

    while(1){
         vsync(1);
         for(num=0; num<SPMAX; num++){
             spr_set(num);
             newx = x[num]+x1[num];
             newy = y[num]+y1[num];
             if((newx<=8)||(newx>=248)) x1[num] *= -1;
             if((newy<=8)||(newy>=232)) y1[num] *= -1;
             spr_x(newx);
             spr_y(newy);
             x[num]=newx;
             y[num]=newy;
         }
         satb_update();
    }
}

パターン/パレットデータは「#incbin」マクロで組み込みます。
load_vram関数でVRAMに転送します。
パターンの転送先は適切なアドレスがよくわかりませんが、0x6F00番地にしてみました。0x7EFF番地までデータが格納されます。
これで、「#incspr」や「#incpal」を使わず、PCXファイルが不要になりました。
このソースをビルドして、ROMイメージ(pceファイル)を生成します。

f:id:nicotakuya:20201129020957p:plain
PCエンジンエミュレータの実行結果

PCエンジンエミュレータで実行した結果がこちらです。
64個のスプライトが画面をバウンドします。
エミュのせいかもしれませんが、全然処理落ちしてません。実機だとどうなるのか気になります。

続き
nicotakuya.hatenablog.com