;[NDP] - PSG Music Driver for MSX - Programmed by naruto2413

;=====================================
;コールエントリ／ワークエリア／テーブル
;（NDP.ASM と NDP_DRV.ASM が別途必要）
;=====================================

	JP	NDPINI
	JP	MSTART
	JP	MSTOP
	JP	INTRPT

	JP	U_ADR
	JP	U_OFF1
	JP	U_OFF2
	JP	U_OFF3
	JP	U_MV
	JP	U_MFO
	JP	U_MFI
	JP	U_SE

	JP	CH1OFF
	JP	CH2OFF
	JP	CH3OFF
	JP	MVSET
	JP	MFOSET
	JP	RDSTAT
	JP	RDENDT
	JP	RDLOOP
	JP	ADRSET
	JP	MPLAYF
	JP	SEPLAY
	JP	VSET

	JP	SYSVER
	JP	NDPOFF
	JP	SETHF

	JP	IMAIN

;------	ワークエリア

CH1WRK:	;リズムトラック
	DW	0	;0-1	演奏データ読み込みアドレス
	DB	0	;2	ノート番号
	DB	0	;3
	DB	0	;4	音長カウンタ
	DB	0	;5	次の1バイトも音長かどうか
	DB	0	;6	255ならリズム
	DB	0	;7	レガート
	DB	0	;8
	DB	0	;9
	DB	0	;10	チャンネル有効/無効
	DB	0	;11
	DB	0	;12	レガート遅延フラグ
	NOP		;13
	NOP		;14
	NOP		;15
	DW	0	;16 17	ソフトエンベロープポインタ
	NOP		;18
	NOP		;19
	NOP		;20
	NOP		;21
	NOP		;22
	NOP		;23
	NOP		;24
	NOP		;25
	NOP		;26
	NOP		;27
	NOP		;28
	NOP		;29
	NOP		;30
	NOP		;31
	DB	0	;32	リピートネスト数
RVOLW:	DS	26,0	;33-58	リズム26種類の音量
	NOP		;59
	NOP		;60

CH2WRK:	;通常トラック
	DW	0	;+0 1	演奏データ読み込みアドレス
	DB	0	;+2	ノート番号
	DB	0	;+3	設定音量 (0=v15, 1=V14, 2=V13 … 15=v0)
	DB	0	;+4	音長カウンタ
	DB	0	;+5	次の1バイトも音長かどうか
	DB	0	;+6	音色番号 (90〜9FHの場合はハードエンベ番号)
	DB	0	;+7	レガート
	DB	0	;+8	サスティン
	DB	0	;+9	Q(クオンタイズ)の値
	DB	0	;+10	チャンネル有効/無効 0=無効 1=有効 2=効果音発音中 3〜255=一時ミュート(フレーム数)
	DB	0	;+11	ピッチエンベ番号 (bit7=ピッチを戻す？ bit6=ピッチ更新する？ bit5=元音程からの相対値？)
	DB	0	;+12	レガート確認用フラグ（+7のレガート設定の値が1音あとに入る）
	DW	0	;+13 14	発音中の音程（レジスタ値）
	DB	0	;+15	発音中の音量
	DW	0	;+16 17	ソフトエンベロープポインタ / ハードエンベ音量半減カウンタ
	DB	0	;+18	ソフトエンベロープウェイトカウンタ
	DW	0	;+19 20	デチューン
	DW	0	;+21 22	ピッチエンベロープポインタ
	DB	0	;+23	ピッチエンベロープディレイカウンタ
	DB	0	;+24	リリース音量
	DB	0	;+25	リリースカウンタ設定値
	DB	0	;+26	リリースカウンタ
	DW	0	;+27 28	リリースディレイ用ピッチ
	DB	0	;+29	リリースディレイ用スイッチ兼指定フレーム数
	DB	0	;+30	リリース音量設定
	DB	0	;+31	キーオン時の音程レジスタ更新フラグ
	DB	0	;+32	リピートネスト数
	DB	0	;+33	ポルタメント加算値(小数)
	DB	0	;+34	ポルタメント加算値
	DW	0	;+35 36	ポルタメント用の現在音程 (13-14に向かって加減算)
	DB	0	;+37	ポルタメント設定値(小数)
	DB	0	;+38	ポルタメント設定値兼スイッチ (0=OFF)
	DB	0	;+39	ポルタメント単発フラグ
	DB	0	;+40	@Q(後ろを削るクオンタイズ)の値
	DB	0	;+41	キーオン直前のノート番号（リリースディレイ用）
	DB	0	;+42	音量インターバル設定値
	DB	0	;+43	ノートエンベ番号
	DW	0	;+44 45	ノートエンベロープポインタ
	DB	0	;+46	ノートエンベロープウェイトカウンタ
	DB	0	;+47	音量インターバルのカウンタ
	DB	0	;+48	音量インターバルの音量値
	DW	0	;+49 50	前回のデチューン値
	DB	0	;+51	リリースディレイ用カウンタ
	DB	0	;+52	ゲートタイム (Qから計算してキーオン時に設定)
	DB	0	;+53	リリースディレイスキップ用カウンタ
	DW	0	;+54 55	ピッチエンベ適用前の音程（レジスタ値）
	DB	0	;+56	音量インターバル到達値
	DB	0	;+57	固定ゲートタイム
	DB	0	;+58	パラメータの退避領域
	DB	0	;+59	リリースディレイ発動フラグ
	DB	0	;+60	*n（ミックスモード）の値
CH3WRK: DS	WSIZE,0
CH4WRK: DS	WSIZE,0

SE1WRK:	DS	WSIZE*3,0

CH1RWK:
	DW	0	;0-1	リピート1開始アドレス
	DW	0	;2-3	リピート1終了アドレス
	DB	0	;4	リピート1回数
	DW	0	;5-6	リピート2開始アドレス
	DW	0	;7-8	リピート2終了アドレス
	DB	0	;9	リピート2回数
	DW	0	;10-11	リピート3開始アドレス
	DW	0	;12-13	リピート3終了アドレス
	DB	0	;14	リピート3回数
	DW	0	;15-16	リピート4開始アドレス
	DW	0	;17-18	リピート4終了アドレス
	DB	0	;19	リピート4回数
CH2RWK:	DS	RWSIZE,0
CH3RWK:	DS	RWSIZE,0
CH4RWK:	DS	RWSIZE,0

;->*************** MSTART 初期化時に0クリアする物

FFFLG:	DB	0	;早送りフラグ
ENDTR:	DB	0	;演奏データが終端まで達したトラックのビットが立つ (0000321RB) ※1ループでリセット
ENDTRW:	DB	0	;〃 ※1ループ後もリセットしない
ENDTRR:	DB	0	;〃 リセット時に書き戻す値 (曲開始時に未使用トラックのフラグを立てておいた値)
MCOUNT:	DB	0	;ループ回数
MVOL:	DB	0	;マスター音量 (この値を減算)
MFADE:	DB	0	;フェード設定 (0=フェードしない 1〜255=フェードカウント)
FCOUNT:	DB	0	;フェードカウンタ
LCOUNT:	DB	0	;フェードループカウンタ
SLWPRM:	DB	0	;スロー設定
SLWCNT:	DB	0	;スロー再生用カウンタ
NFREQW:	DB	0	;ノイズ周波数
VISPAN:	DB	0	;音量インターバル周期

RNON:	DB	0	;リズム発音中かどうか (0=発音しない 1=発音終了してピッチを戻す 2=発音中 3=1フレだけ通常トーン)
RSVOL:	DB	0	;リズムを鳴らす前の音量退避
RPITCH:	DW	0	;リズムを鳴らす前の音程退避

HENVSW:	DB	0	;ハードエンベ番号

CLREND:

;<-***************

RVWRK:	DB	0	;リズム音量反映用
RITRK:	DB	1	;割り込まれトラック (1=CH.C 2=CH.B 3=CH.A)
RVREG:	DB	10	;リズムトラックの音量レジスタ番号
RPREG:	DB	5	;リズムトラックの周波数レジスタ番号(上位)
RHENV:	DB	0	;リズム内でSコマンドが実行されていなければ0になる

OLDTH:	DS	5,0C9H	;旧タイマ割り込みフック
HKFLG:	DB	0	;フックにドライバを接続済みかどうか

STATS:	DB	0	;演奏状態 (0:停止 1:再生)

FINOUT:	DB	0	;0=フェードアウト 1=フェードイン

MIXNMH:	DB	1	;ハードエンベ使用時の*n（ミックスモード）の値

MIXWRK:	DB	10111000B	;10NNNTTT 0=ON/1=OFF
MIXWRS:	DB	10111000B	;効果音用ミックスワーク

HENVPW:	DW	1024	;ハードエンベ周期

SEMODE:	DB	0	;演奏モード (0:BGM 1:SE) ※割り込み内で設定
SEBAKT:	DS	CHNUM,0	;効果音に割り込まれる側のトラック有効フラグをここに退避
SEBAKR:	DB	0	;リズムのキーオフ時にSE終了時のレジスタリセットを走らせるかどうか
SECNT:	DB	0	;効果音のトラックカウンタ（鳴っている最中の効果音のトラック数）

VADTBL:	DS	32,0	;音量エンベアドレステーブル
RADTBL:	DS	64,0	;リズム音色アドレステーブル
PADTBL:	DS	32,0	;ピッチエンベアドレステーブル
NADTBL:	DS	32,0	;ノートエンベアドレステーブル

BGMADR:	DW	04000H	;曲データ先頭アドレス

;------	音程テーブル

PTABLE:
;		c     c+    d     d+    e     f     f+    g     g+    a     a+    b
	DW	0D5DH,0C9CH,0BE7H,0B3CH,0A9BH,0A02H,0973H,08EBH,086BH,07F2H,0780H,0714H	;O1
	DW	06AFH,064EH,05F4H,059EH,054EH,0501H,04BAH,0476H,0436H,03F9H,03C0H,038AH	;O2
	DW	0357H,0327H,02FAH,02CFH,02A7H,0281H,025DH,023BH,021BH,01FDH,01E0H,01C5H	;O3
O4C:	DW	01ACH,0194H,017DH,0168H,0153H,0140H,012EH,011DH,010DH,00FEH,00F0H,00E3H	;O4
	DW	00D6H,00CAH,00BEH,00B4H,00AAH,00A0H,0097H,008FH,0087H,007FH,0078H,0071H	;O5
	DW	006BH,0065H,005FH,005AH,0055H,0050H,004CH,0047H,0043H,0040H,003CH,0039H	;O6
	DW	0035H,0032H,0030H,002DH,002AH,0028H,0026H,0024H,0022H,0020H,001EH,001CH	;O7
	DW	001BH,0019H,0018H,0016H,0015H,0014H,0013H,0012H,0011H,0010H,000FH,000EH	;O8

