NSDL(NES Sound Driver Library)

サウンドドライバー(nsd.lib)

本サウンドドライバーは、6502用C言語/アセンブリ言語開発環境のオブジェクトライブラリ`*.lib'として開発しています。
ユーザーアプリケーションからは、ライブラリ中の関数を呼ぶことにより、本サウンドドライバーを制御することが可能です。

ドライバー本体からは、cc65の付属のNES用ライブラリ`nes.lib'内の関数を一切呼び出しておらず、 また、C言語用のランタイム領域にもアクセスしておりません。
従い、アセンブリ言語のみで開発されたアプリケーションでも使用する事が可能です。
また、別の開発環境で記述されたコードから呼び出しても動作するとは思いますが、 その際は、ライブラリのフォーマットが、cc65のものと互換性を持っている必要があります。

cc65のC言語でアプリケーションを開発する場合の注意

本音源ドライバーは、6502の"Zeropage"領域(メモリ空間0x0000〜0x00FF)をいくらか使用します。
(使用する量は、対応する拡張音源の種類によって異なります。)
従いまして、別途リンカー用の config ファイルを作成し、 -none オプションでビルドして下さい。

これは、 -nes オプションでは、C言語のランタイムが使う分のサイズしか、 zeropage のセグメント設定をしていないためです。
そのため、 -nes オプションを使用すると、音源ドライバ用の Zeropage を確保できず、ビルドに失敗します。

cc65付属のNES用ライブラリ"nes.lib"を使用する場合の注意

"nes.lib"内のコードは、configファイルのセグメント設定と関係無しに、 Zeropageを絶対アドレス(つまり、番地を直接指定)で読み書きしている領域があります。
そのため、configファイルのセグメントの設定次第では、nes.libがアクセスする領域とバッティングします。
リンカー用の config ファイルの作成に際しては、 cc65に付属のドキュメント及び、"nes.inc"及び、"nes.lib"のソースファイルを良く参照してください。

関数リファレンス(Function reference)

以下に記載のライブラリ関数について、関数呼出規約は全て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. 未実装

関数呼出規約 __fastcall__ について(About the calling conversion __fastcall__ )

引数(Inputs)

関数の一番右の引数はレジスターで渡されます。

1 byte value
a register
2 byte value
a (LSB) and x (MSB) register

cc65では、一番右の引数以外は、ソフトウェアスタック(zeropage内の変数spによりC言語で制御される)に格納されますが、 本サウンドドライバーではライブラリ関数の引数は必ず1つ以内とし、ソフトウェアスタックの使用を避けております。
これにより、cc65に付属のランタイムライブラリ`nes.lib'をリンクしないでも、動作する設計となっています。

戻り値(Outputs)

戻り値はレジスターに格納されます。
戻り値がない場合は、レジスターの値は不定となります。
yレジスターの値は常に不定です。

1 byte value
a register
2 byte value
a (LSB) and x (MSB) register

関数のシンボル名(Function symbol name)

アセンブリ言語から呼び出す場合は、シンボル名にアンダーバー('_')を追加して下さい。
たとえば、アセンブリ言語からnsd_main(void)を呼び出す場合は、jsr _nsd_mainと記述します。