本サウンドドライバーは、6502用C言語/アセンブリ言語開発環境のオブジェクトライブラリ`*.lib'として開発しています。
ユーザーアプリケーションからは、ライブラリ中の関数を呼ぶことにより、本サウンドドライバーを制御することが可能です。
ドライバー本体からは、cc65の付属のNES用ライブラリ`nes.lib'内の関数を一切呼び出しておらず、
また、C言語用のランタイム領域にもアクセスしておりません。
従い、アセンブリ言語のみで開発されたアプリケーションでも使用する事が可能です。
また、別の開発環境で記述されたコードから呼び出しても動作するとは思いますが、
その際は、ライブラリのフォーマットが、cc65のものと互換性を持っている必要があります。
本音源ドライバーは、6502の"Zeropage"領域(メモリ空間0x0000〜0x00FF)をいくらか使用します。
(使用する量は、対応する拡張音源の種類によって異なります。)
従いまして、別途リンカー用の config ファイルを作成し、 -none オプションでビルドして下さい。
これは、 -nes オプションでは、C言語のランタイムが使う分のサイズしか、 zeropage のセグメント設定をしていないためです。
そのため、 -nes オプションを使用すると、音源ドライバ用の Zeropage を確保できず、ビルドに失敗します。
"nes.lib"内のコードは、configファイルのセグメント設定と関係無しに、
Zeropageを絶対アドレス(つまり、番地を直接指定)で読み書きしている領域があります。
そのため、configファイルのセグメントの設定次第では、nes.libがアクセスする領域とバッティングします。
リンカー用の config ファイルの作成に際しては、
cc65に付属のドキュメント及び、"nes.inc"及び、"nes.lib"のソースファイルを良く参照してください。
以下に記載のライブラリ関数について、関数呼出規約は全てcc65の __fastcall__
となります。
return value | Function name | Contents |
---|---|---|
void | nsd_main(void) | Driver main routine. Please call by one V-blank. |
void | nsd_init(void) | Initraize the driver. |
void | nsd_set_dpcm(nsd_dpcm* dpcm) | Set the dpcm information. 未実装 |
void | nsd_play_bgm(void *bgm) | Start the BGM. |
void | nsd_stop_bgm(void) | Stop the BGM. |
void | nsd_play_se(void *se) | Start the SE. 未実装 |
void | nsd_stop_se(void) | Stop the SE. 未実装 |
関数の一番右の引数はレジスターで渡されます。
cc65では、一番右の引数以外は、ソフトウェアスタック(zeropage内の変数spによりC言語で制御される)に格納されますが、
本サウンドドライバーではライブラリ関数の引数は必ず1つ以内とし、ソフトウェアスタックの使用を避けております。
これにより、cc65に付属のランタイムライブラリ`nes.lib'をリンクしないでも、動作する設計となっています。
戻り値はレジスターに格納されます。
戻り値がない場合は、レジスターの値は不定となります。
yレジスターの値は常に不定です。
アセンブリ言語から呼び出す場合は、シンボル名にアンダーバー('_')を追加して下さい。
たとえば、アセンブリ言語からnsd_main(void)
を呼び出す場合は、jsr _nsd_main
と記述します。