mirror of https://github.com/nmlgc/ReC98.git
983 lines
43 KiB
Plaintext
983 lines
43 KiB
Plaintext
===============================================================================
|
||
|
||
PMD(PC98,88VA)をプログラムで制御する為のテクニカル情報
|
||
|
||
===============================================================================
|
||
常駐checkの方法
|
||
-------------------------------------------------------------------------------
|
||
int 60h(ver3.9f以降)のベクトルを読みだし、
|
||
そのアドレス+2,+3,+4に "PMD"の文字があれば常駐しているとみなします。
|
||
ver.4.6以降は、+5,+6にバージョン番号が入ります。(例:4.6a = 46H,"a")
|
||
|
||
===============================================================================
|
||
int 60hの使用方法
|
||
-------------------------------------------------------------------------------
|
||
PMDに用意されているサービスファンクションは、MS-DOSのint 21hと同様の
|
||
方法で、int 60hを使って利用する事が出来ます。
|
||
|
||
コマンド番号を AH レジスタに代入し、必要なレジスタに値をセットして
|
||
int 60h を実行すれば処理されます。
|
||
|
||
基本的にリターン値があるレジスタ以外は保存されますが、将来リターン値
|
||
に利用されるレジスタが追加変更される可能性もありますので、処理に
|
||
余裕がある時はなるべく破壊されたくないレジスタは保存した方が安全です。
|
||
|
||
また、ハードウエア割り込み中からこのサービスを利用する際には、int60h
|
||
割り込みや、FM音源割り込みサービス中である可能性があります。その場合で
|
||
重複処理が不可能な場合は、PMD内部公開ワーク内の INT60Hの実行ErrorFlagが
|
||
-1となって、何も行わずに処理から戻って来ますので、
|
||
常駐型TSRユーティリティを作成する方は注意して下さい。
|
||
|
||
再入が可能かどうかは、各ファンクション内に記載してあります。
|
||
open_work内の TimerAflag TimerBflag int60flag で処理中かどうかの
|
||
判定が可能ですから、処理可能かどうか調べてから呼び出すのも一つの
|
||
手でしょう。 (TimerA = TA、TimerB = TB、int60 = 60 と略してあります)
|
||
|
||
===============================================================================
|
||
int 60h ファンクション一覧
|
||
-------------------------------------------------------------------------------
|
||
バージョン毎の拡張に伴い、必要に応じて追加・削除・変更等なされて
|
||
きましたので、ファンクションの並びはかなりバラバラになっています。
|
||
|
||
目的のファンクションをここで探し、文字列検索で個別解説を参照すると
|
||
良いでしょう。
|
||
|
||
AH=00H 演奏開始
|
||
AH=01H 演奏停止
|
||
AH=02H フェードイン・アウト
|
||
AH=03H SSG効果音発音
|
||
AH=04H SSG効果音消音
|
||
AH=05H 小節番号取得
|
||
AH=06H 曲データバッファアドレス取得
|
||
AH=07H 音色データバッファアドレス取得
|
||
AH=08H 全体の音量取得
|
||
AH=09H 音源ドライバの種類とバージョンの取得
|
||
AH=0AH 内部ステータスの取得
|
||
AH=0BH FM効果音データ位置の取得
|
||
AH=0CH FM効果音発音
|
||
AH=0DH FM効果音消音
|
||
AH=0EH PCMテーブル位置取得
|
||
AH=0FH PCM効果音発音
|
||
AH=10H PMD内公開ワーク位置取得
|
||
AH=11H 発音中のFM効果音番号の取得
|
||
AH=12H 発音中のPCM効果音番号の取得
|
||
AH=13H TimerB ユーザ割り込み設定
|
||
AH=14H TimerA ユーザ割り込み設定
|
||
AH=15H 発音中のSSG効果音番号/優先順位取得
|
||
AH=16H ジョイスティック情報の取得
|
||
AH=17H PPSDRV対応状態取得
|
||
AH=18H PPSDRV対応状態設定
|
||
AH=19H 全体音量の設定
|
||
AH=1AH ポーズ設定
|
||
AH=1BH ポーズ設定解除
|
||
AH=1CH 指定小節まで高速早送り
|
||
AH=1DH メモ文字列アドレス取得
|
||
AH=1EH パートのマスク/マスク解除
|
||
AH=1FH TimerB ユーザ割り込み先の取得
|
||
AH=20H TimerA ユーザ割り込み先の取得
|
||
AH=21H 演奏中の曲のファイル名バッファ位置の取得
|
||
AH=22H 曲,音色,効果音データのサイズ確認
|
||
|
||
===============================================================================
|
||
ファンクションの個別解説
|
||
===============================================================================
|
||
AH=00H 演奏開始
|
||
-------------------------------------------------------------------------------
|
||
input 無し
|
||
output 無し
|
||
再入 60:× TA:○ TB:○
|
||
-------------------------------------------------------------------------------
|
||
曲データバッファに格納されている曲を演奏開始させます。
|
||
|
||
全体音量、パートマスク情報の一部等のパート毎のデータはほぼ初期化
|
||
されますので、必要に応じて、保存して演奏開始して復帰する等の処理を
|
||
行って下さい。
|
||
|
||
実際の演奏は、次にTimerB割り込みが掛かって来た時に始められますので、
|
||
割り込みを禁止(CLI)し、演奏開始後に全体音量やパートマスク等を設定して
|
||
割り込みを許可(STI)すれば、最初に一瞬ノイズが出るといった事も
|
||
ありません。
|
||
|
||
さらに、TA/TBが処理中であれば、次にTimerAが掛かって来た時に初めて
|
||
演奏開始されます。
|
||
(演奏を始めたかどうかは、open_workの music_flag で確認出来ます。)
|
||
|
||
===============================================================================
|
||
AH=01H 演奏停止
|
||
-------------------------------------------------------------------------------
|
||
input 無し
|
||
output 無し
|
||
再入 60:× TA:○ TB:○
|
||
-------------------------------------------------------------------------------
|
||
演奏中の曲を停止します。
|
||
|
||
TA/TBが処理中であれば、即時停止処理は行われません。次にTimerAが掛かって
|
||
来た時に初めて演奏停止されます。
|
||
(演奏を止めたかどうかは、open_workの music_flag で確認出来ます。)
|
||
|
||
===============================================================================
|
||
AH=02H フェードイン・アウト
|
||
-------------------------------------------------------------------------------
|
||
input AL :速度
|
||
output 無し
|
||
再入 60:○ TA:○ TB:○
|
||
-------------------------------------------------------------------------------
|
||
演奏中の曲をフェードイン・アウトします。
|
||
|
||
速度が 1~127の場合はフェードアウト、
|
||
-1~-128(128~255)の場合はフェードインされ、
|
||
それぞれ値が0から離れている程速くなります。
|
||
|
||
フェードアウト後は、PMDのオプション /F で、曲を停止するか音量0の
|
||
まま持続させるかを選択する事が出来ます。
|
||
(open_workのfadeout_flagをいじれば変更可能です。)
|
||
|
||
フェードインは、音量が最大になるまで持続されます。
|
||
|
||
フェードインさせる場合は、事前にファンクション19hまたはフェードアウトで
|
||
全体の音量を下げておく必要があります。
|
||
|
||
曲の頭からフェードインさせたいといった場合は、演奏開始直後に
|
||
ファンクション19hで全体の音量を下げ、フェードインを実行させて下さい。
|
||
|
||
===============================================================================
|
||
AH=03H SSG効果音発音
|
||
-------------------------------------------------------------------------------
|
||
input AL :効果音番号
|
||
output 無し
|
||
再入 60:× TA:× TB:○
|
||
-------------------------------------------------------------------------------
|
||
SSGの効果音を発音させます。
|
||
|
||
曲演奏中は、SSGの3チャネル目が一時的にマスクされて発音され、発音後に
|
||
自動的に元に戻ります。
|
||
|
||
SSG効果音については、仕様は公開していません。通常は、
|
||
0~10までは、PSGドラムデータ、それ以降はサンプル効果音が
|
||
デフォルトで入っています。
|
||
|
||
PDR/PPSDRVが常駐していれば、128番以降は 128-PPSDRVの音色番号 の音色が
|
||
発音されます。
|
||
|
||
===============================================================================
|
||
AH=04H SSG効果音消音
|
||
-------------------------------------------------------------------------------
|
||
input 無し
|
||
output 無し
|
||
再入 60:× TA:× TB:○
|
||
-------------------------------------------------------------------------------
|
||
発音中のSSG効果音を消します。持続性のある効果音を途中で止めたい場合に
|
||
使用します。
|
||
|
||
===============================================================================
|
||
AH=05H 小節番号取得
|
||
-------------------------------------------------------------------------------
|
||
input 無し
|
||
output AX :小節番号
|
||
再入 60:○ TA:○ TB:○
|
||
-------------------------------------------------------------------------------
|
||
現在何小節めを演奏中かを取得します。
|
||
|
||
ゲームのビジュアル等のタイミング合わせの為に用意されているもので、
|
||
曲データによっては、必ずしも音楽的に正確な小節を返す訳では
|
||
ありません。MMLを組む人が何も考えないで作れば、正確に値を返すのは
|
||
総て4/4拍子の曲だけになります。
|
||
|
||
===============================================================================
|
||
AH=06H 曲データバッファアドレス取得
|
||
-------------------------------------------------------------------------------
|
||
input 無し
|
||
output DS:DX :曲データバッファ先頭アドレス
|
||
再入 60:○ TA:○ TB:○
|
||
-------------------------------------------------------------------------------
|
||
曲データ(拡張子.M)を読み込む位置を返します。
|
||
|
||
PMDの /M オプションで確保したサイズは、
|
||
音色データ先頭アドレス(Func07h)-曲データ先頭アドレス
|
||
となります(Func22hで取得できます)が、
|
||
|
||
演奏時には実際は音色データバッファが使われる事は希(曲データ中に
|
||
音色データが存在しない場合のみ)ですので、実際は
|
||
効果音データ先頭アドレス(Func0bh)-曲データ先頭アドレス
|
||
分使って(読み込んで)も構いません。
|
||
|
||
===============================================================================
|
||
AH=07H 音色データバッファアドレス取得
|
||
-------------------------------------------------------------------------------
|
||
input 無し
|
||
output DS:DX :音色データバッファ先頭アドレス
|
||
再入 60:○ TA:○ TB:○
|
||
-------------------------------------------------------------------------------
|
||
音色データ(拡張子.FF)を読み込む位置を返します。
|
||
|
||
ゲーム等に組み込む場合は、殆ど使う事はありません。
|
||
付属ユーティリティでも唯一vset.comのみが使用しています。
|
||
|
||
===============================================================================
|
||
AH=08H 全体の音量取得
|
||
-------------------------------------------------------------------------------
|
||
input 無し
|
||
output AL :全体音量
|
||
再入 60:○ TA:○ TB:○
|
||
-------------------------------------------------------------------------------
|
||
フェードアウト等で利用される曲全体の音量を取得します。
|
||
|
||
0であれば最大、255であれば最小となります。
|
||
|
||
フェードアウトが終了すると255に、
|
||
フェードイン が終了すると0に それぞれなりますので、
|
||
終了待ちをする際に使用すると便利です。
|
||
|
||
また、ファンクション19hでこの値を設定する事も可能です。
|
||
|
||
===============================================================================
|
||
AH=09H 音源ドライバの種類とバージョンの取得
|
||
-------------------------------------------------------------------------------
|
||
input 無し
|
||
output AL :ドライバの種類
|
||
AH,DH :バージョン番号
|
||
DL :バージョン番号の後に付くキャラクタ
|
||
再入 60:○ TA:○ TB:○
|
||
-------------------------------------------------------------------------------
|
||
音源ドライバの種類、バージョンを取得する際に使用します。
|
||
返り値は次の通りです。(AHとDHは同じ値が返って来ます。)
|
||
|
||
AL 0 PMD.COM または PMDVA1.COM
|
||
1 PMDB2.COM または PMDVA.COM
|
||
2 PMD86.COM
|
||
3 PMDL.COM または PMDIBM.COM
|
||
4 PMDPPZ.COM
|
||
5 PMDPPZE.COM
|
||
-1 常駐しているが音源がない状態
|
||
|
||
AH,DH ver.4.6h であれば 46H
|
||
DL ver.4.6h であれば "h"
|
||
|
||
!注意! ver.4.1b以前は、このコマンドではバージョンの取得が出来ませんでした。
|
||
その場合は、ahにそのまま09Hが返ってくる事で判断して下さい。
|
||
ver.4.5e以前は、DXレジスタは変化せず、バージョン番号の後に付く
|
||
キャラクタは判定出来ません。事前にDXを0クリアする等で判断して下さい。
|
||
|
||
===============================================================================
|
||
AH=0AH 内部ステータスの取得
|
||
-------------------------------------------------------------------------------
|
||
input 無し
|
||
output AH :ステータス1
|
||
AL :ステータス2
|
||
再入 60:○ TA:○ TB:○
|
||
-------------------------------------------------------------------------------
|
||
PMD内部ステータスを取得します。この値はそれぞれ、
|
||
|
||
STATUS1: MMLの "~"コマンドによって指定された値。
|
||
STATUS2: 演奏開始して何ループ目か。
|
||
|
||
が入っています。曲データによって随時変化していきます。
|
||
|
||
===============================================================================
|
||
AH=0BH FM効果音データ位置の取得
|
||
-------------------------------------------------------------------------------
|
||
input 無し
|
||
output DS:DX :FM効果音データ先頭位置
|
||
再入 60:○ TA:○ TB:○
|
||
-------------------------------------------------------------------------------
|
||
FM効果音データ(.EFC)を読み込む位置を返します。
|
||
|
||
効果音データの読み込める最大サイズは、Func22hで確認して下さい。
|
||
|
||
===============================================================================
|
||
AH=0CH FM効果音発音
|
||
-------------------------------------------------------------------------------
|
||
input AL :FM効果音番号
|
||
output 無し
|
||
再入 60:× TA:× TB:×
|
||
-------------------------------------------------------------------------------
|
||
FM効果音を発音します。事前に効果音バッファに効果音データが
|
||
転送されている必要があります。
|
||
|
||
一時的に FM3チャネル(PMDB2/VA/86の場合は6チャネル)目が
|
||
マスクされて発音され、終了後自動的に元に戻ります。
|
||
|
||
===============================================================================
|
||
AH=0DH FM効果音消音
|
||
-------------------------------------------------------------------------------
|
||
input 無し
|
||
output 無し
|
||
再入 60:× TA:× TB:×
|
||
-------------------------------------------------------------------------------
|
||
発音中のFM効果音を消します。持続性のあるFM効果音を消したい場合に
|
||
使用します。
|
||
|
||
===============================================================================
|
||
AH=0EH PCMテーブル位置取得
|
||
-------------------------------------------------------------------------------
|
||
input 無し
|
||
output DS:DX :PCMテーブル先頭アドレス
|
||
再入 60:○ TA:○ TB:○
|
||
-------------------------------------------------------------------------------
|
||
PMDB2/VA/86の場合に有効で、PCMテーブル先頭位置を返します。
|
||
PCMテーブルは、以下のようになっています。
|
||
|
||
1) PMDB2/VAの場合
|
||
pcmends dw 26H ;次に定義するPCMの start addr.
|
||
pcmadrs dw 2*256 dup (0) ;@0~@255までの start/stop addr.
|
||
pcmfilename db 128 dup(0) ;最後に定義した .PPC filename
|
||
|
||
2) PMD86の場合
|
||
pcmst_ofs dw 0 ;PCMデータバッファ先頭アドレスのoffset
|
||
pcmst_seg dw 0 ;PCMデータバッファ先頭アドレスのsegment
|
||
pcmadrs db 6*256 dup (0) ;@0~@255までの start/end offset(24bit)
|
||
|
||
===============================================================================
|
||
AH=0FH PCM効果音発音
|
||
-------------------------------------------------------------------------------
|
||
input AL :PCM効果音(音色)番号
|
||
DX :周波数
|
||
CH :パン
|
||
CL :音量
|
||
output 無し
|
||
再入 60:× TA:○ TB:×
|
||
-------------------------------------------------------------------------------
|
||
PCM効果音を発音します。
|
||
|
||
曲演奏中は、一時的にPCMパートがマスクされて発音し、終了後自動的に
|
||
元に戻ります。
|
||
|
||
PMDB2/VA/PPZとPMD86では、指定値に違いがあります。
|
||
|
||
1) PMDB2/VA/PPZ
|
||
DX :DELTA-N値そのまま
|
||
CH :1~3
|
||
CL :0~255
|
||
|
||
2) PMD86
|
||
DX :0xxxyyyyzzzzzzzz
|
||
x=周波数 (0~7 , 各4.14/5.51/8.27/11.03/16.54/22.05/33.08/44.10KHz)
|
||
y=アドレス加算値整数部 (通常1)
|
||
z=アドレス加算値小数部 (通常0)
|
||
y,zで周波数の微調整が可能
|
||
CH: -128~+127
|
||
CL: 0~255、PMD86の /S オプションによって音量は変化
|
||
|
||
※ PMDPPZEでは、PCM効果音機能は使用できません。
|
||
|
||
===============================================================================
|
||
AH=10H PMD内公開ワーク位置取得
|
||
-------------------------------------------------------------------------------
|
||
input 無し
|
||
output DS:DX :公開ワーク先頭位置
|
||
再入 60:○ TA:○ TB:○
|
||
-------------------------------------------------------------------------------
|
||
PMD内公開ワークの先頭位置を返します。
|
||
|
||
ワークの内容は後述します。
|
||
|
||
===============================================================================
|
||
AH=11H 発音中のFM効果音番号の取得
|
||
-------------------------------------------------------------------------------
|
||
input 無し
|
||
output AL :FM効果音番号
|
||
再入 60:○ TA:○ TB:○
|
||
-------------------------------------------------------------------------------
|
||
現在何番のFM効果音が発音中かを調べる時に使用します。
|
||
発音されていない場合は 255 が返って来ます。
|
||
|
||
効果音に優先順位をつけたい場合に使用します。
|
||
|
||
===============================================================================
|
||
AH=12H 発音中のPCM効果音番号の取得
|
||
-------------------------------------------------------------------------------
|
||
input 無し
|
||
output AL :PCM効果音番号
|
||
再入 60:○ TA:○ TB:○
|
||
-------------------------------------------------------------------------------
|
||
現在何番のPCM効果音が発音中かを調べる時に使用します。
|
||
発音されていない場合は 255 が返って来ます。
|
||
|
||
===============================================================================
|
||
AH=13H TimerB ユーザ割り込み設定
|
||
-------------------------------------------------------------------------------
|
||
input DS:DX :割り込み処理アドレス
|
||
output 無し
|
||
再入 60:○ TA:○ TB:○
|
||
-------------------------------------------------------------------------------
|
||
曲演奏を司っている TimerB処理中に、ユーザが何等かの割り込みを
|
||
実行したい場合に、その先頭位置を指定します。
|
||
|
||
DS:DXに 0000:0000 を入れて実行すると、ユーザ割り込みを停止します。
|
||
|
||
ユーザ割り込み中では、ax bx cx dx si diは破壊しても構いませんが、
|
||
他のレジスタは保存して下さい。帰るコマンドは retf(iretではない)です。
|
||
|
||
2つ以上は設定出来ない為、既に使われている可能性がある場合は、
|
||
|
||
1) 割り込み設定前にファンクション1fhで使用状態を調べ、既に使用されていた
|
||
場合は、ユーザ割り込み中にそのアドレスをfar callするようにする。
|
||
2) 割り込み停止前にファンクション1fhで自分の割り込み処理アドレスを
|
||
差しているかどうかを調べ、そうでないなら割り込み停止しない。
|
||
|
||
等、通常の割り込みベクトルを共用する時と同様の処理が必要です。
|
||
|
||
===============================================================================
|
||
AH=14H TimerA ユーザ割り込み設定
|
||
-------------------------------------------------------------------------------
|
||
input DS:DX :割り込み処理アドレス
|
||
output 無し
|
||
再入 60:○ TA:○ TB:○
|
||
-------------------------------------------------------------------------------
|
||
効果音演奏/フェードアウト等を司っている TimerA処理中に、ユーザが
|
||
何等かの割り込みを実行したい場合に、その先頭位置を指定します。
|
||
|
||
DS:DXに 0000:0000 を入れて実行すると、ユーザ割り込みを停止します。
|
||
|
||
ユーザ割り込み中では、ax bx cx dx si diは破壊しても構いませんが、
|
||
他のレジスタは保存して下さい。帰るコマンドは retf(iretではない)です。
|
||
|
||
この割り込みは速度が一定で、ほぼノーマルディスプレイ時のVSync割り込みと
|
||
同じ速度に設定されています。
|
||
|
||
また、ファンクション13hにも書いた、共用の可能性には十分注意して
|
||
使用して下さい。現在の設定を調べるファンクションは20hです。
|
||
|
||
===============================================================================
|
||
AH=15H 発音中のSSG効果音番号/優先順位取得
|
||
-------------------------------------------------------------------------------
|
||
input 無し
|
||
output AH :SSG効果音番号
|
||
AL :優先順位
|
||
再入 60:○ TA:○ TB:○
|
||
-------------------------------------------------------------------------------
|
||
SSG効果音が発音されているかどうかを調べます。
|
||
発音されていない場合は、255 が返ってきます。
|
||
|
||
優先順位は大きい程高くなります。SSGドラムの場合は最低の0です。
|
||
|
||
===============================================================================
|
||
AH=16H ジョイスティック情報の取得
|
||
-------------------------------------------------------------------------------
|
||
input 無し
|
||
output AL :JoyStick1 STATUS
|
||
AH :JoyStick2 STATUS
|
||
再入 60:○ TA:○ TB:○
|
||
-------------------------------------------------------------------------------
|
||
ドライブしているFM音源ボードに接続されているジョイスティック状態を
|
||
調べます。
|
||
|
||
返って来るビットの状態は次の通りで、押されている場合はビットが立ちます。
|
||
××BA右左下上
|
||
|
||
===============================================================================
|
||
AH=17H PPSDRV対応状態取得
|
||
-------------------------------------------------------------------------------
|
||
input 無し
|
||
output AL :対応フラグ
|
||
再入 60:○ TA:○ TB:○
|
||
-------------------------------------------------------------------------------
|
||
ALが1なら対応中、そうでないなら対応中ではありません。
|
||
|
||
===============================================================================
|
||
AH=18H PPSDRV対応状態設定
|
||
-------------------------------------------------------------------------------
|
||
input AL :対応フラグ
|
||
output 無し
|
||
再入 60:× TA:× TB:×
|
||
-------------------------------------------------------------------------------
|
||
ALを1にして実行すれば、その時点からPPSDRVに対応を開始し、
|
||
0にして実行すると、その時点で対応を打ち切ります。
|
||
PMDのオプション /P と同じ働きをします。
|
||
|
||
同じ曲データで、場合によってPSGドラムとPPSDRVを使い分ける場合に
|
||
使用して下さい。
|
||
|
||
===============================================================================
|
||
AH=19H 全体音量の設定
|
||
-------------------------------------------------------------------------------
|
||
input AL :全体音量
|
||
output 無し
|
||
再入 60:○ TA:○ TB:○
|
||
-------------------------------------------------------------------------------
|
||
曲全体の音量を設定します。値が大きい程音量が小さくなります。
|
||
|
||
一時的に音量を下げたい時や、フェードインする直前に使用します。
|
||
|
||
===============================================================================
|
||
AH=1AH ポーズ設定
|
||
-------------------------------------------------------------------------------
|
||
input 無し
|
||
output 無し
|
||
再入 60:× TA:○ TB:×
|
||
-------------------------------------------------------------------------------
|
||
実行した時点で演奏中の曲を一時停止します。
|
||
|
||
===============================================================================
|
||
AH=1BH ポーズ設定解除
|
||
-------------------------------------------------------------------------------
|
||
input 無し
|
||
output 無し
|
||
再入 60:× TA:○ TB:×
|
||
-------------------------------------------------------------------------------
|
||
ポーズ状態を解除し、演奏を再開します。
|
||
ポーズ状態を取得したい場合は、公開ワークのポーズ中?flagを
|
||
読みだして下さい。
|
||
|
||
===============================================================================
|
||
AH=1CH 指定小節までスキップまたは巻き戻し
|
||
-------------------------------------------------------------------------------
|
||
input DX :小節番号
|
||
output AL :リターンフラグ
|
||
再入 60:× TA:× TB:×
|
||
-------------------------------------------------------------------------------
|
||
指定小節まで高速にスキップします。
|
||
|
||
指定した小節が、現在の小節番号を下回っていた場合は、
|
||
曲の先頭まで戻ってから指定小節までスキップします。(巻き戻し)
|
||
|
||
リターンフラグは以下の通りです。
|
||
0 正常終了
|
||
1 その小節まで曲データがなかった
|
||
2 曲が停止中
|
||
|
||
===============================================================================
|
||
AH=1DH メモ文字列アドレス取得
|
||
-------------------------------------------------------------------------------
|
||
input AL :メモ番号
|
||
output DS:DX :メモ文字列先頭位置
|
||
再入 60:○ TA:○ TB:○
|
||
-------------------------------------------------------------------------------
|
||
曲データ中に定義してあるメモ文字列のアドレスを取得します。
|
||
PCMデータのファイル名等もこのファンクションで取得します。
|
||
|
||
文字列のエンドマークは 00H です。
|
||
|
||
0000:0000が返って来た場合または、返ってきたアドレスの先頭が 00H で
|
||
あれば、その内容は定義されていません。
|
||
|
||
メモ番号と定義内容の対応は以下の通りです。
|
||
AL 定義
|
||
-2 #PPZFile(1,2共用。MMLに記述した文字列そのまま)
|
||
-1 #PPSFile
|
||
0 #PCMFile または #PPCFile
|
||
1 #Title
|
||
2 #Composer
|
||
3 #Arranger
|
||
4 #Memo(1個目)
|
||
5 #Memo(2個目)
|
||
:
|
||
:
|
||
|
||
===============================================================================
|
||
AH=1EH パートのマスク/マスク解除
|
||
-------------------------------------------------------------------------------
|
||
input AL :パート番号
|
||
output 無し
|
||
再入 60:× TA:× TB:×
|
||
-------------------------------------------------------------------------------
|
||
指定パートをマスクまたは解除します。
|
||
指定パート番号の対応は以下の通りで、80Hを加算する事によって
|
||
解除設定になります。
|
||
|
||
0 A
|
||
1 B
|
||
2 C
|
||
3 D (PMD.COMの場合 c2)
|
||
4 E (PMD.COMの場合 c3)
|
||
5 F (PMD.COMの場合 c4)
|
||
6 G
|
||
7 H
|
||
8 I
|
||
9 J
|
||
10 K
|
||
11 c2 (PMD.COMの場合 3 と同じ)
|
||
12 c3 (PMD.COMの場合 4 と同じ)
|
||
13 c4 (PMD.COMの場合 5 と同じ)
|
||
14 Rhythm音源全体 (PMD.COMでは無効)
|
||
15 FM効果音
|
||
16 PPZ1
|
||
17 PPZ2
|
||
18 PPZ3
|
||
19 PPZ4
|
||
20 PPZ5
|
||
21 PPZ6
|
||
22 PPZ7
|
||
23 PPZ8
|
||
|
||
===============================================================================
|
||
AH=1FH TimerB ユーザ割り込み先の取得
|
||
-------------------------------------------------------------------------------
|
||
input 無し
|
||
output DS:DX :TimerBユーザ割り込み先頭アドレス
|
||
再入 60:○ TA:○ TB:○
|
||
-------------------------------------------------------------------------------
|
||
TimerBのユーザ割り込みのアドレスを返します。
|
||
使用中でない場合は、0000:0000が返って来ます。
|
||
|
||
===============================================================================
|
||
AH=20H TimerA ユーザ割り込み先の取得
|
||
-------------------------------------------------------------------------------
|
||
input 無し
|
||
output DS:DX :TimerAユーザ割り込み先頭アドレス
|
||
再入 60:○ TA:○ TB:○
|
||
-------------------------------------------------------------------------------
|
||
TimerAのユーザ割り込みのアドレスを返します。
|
||
使用中でない場合は、0000:0000が返って来ます。
|
||
|
||
===============================================================================
|
||
AH=21H 演奏中の曲のファイル名バッファ位置の取得
|
||
-------------------------------------------------------------------------------
|
||
input 無し
|
||
output DS:DX :演奏中の曲のファイル名バッファ位置
|
||
再入 60:○ TA:○ TB:○
|
||
-------------------------------------------------------------------------------
|
||
13バイトの、演奏中の曲のファイル名を保存する内部バッファの
|
||
位置を返します。
|
||
|
||
プレイヤを作成する方は、新たに曲を読み込んだ場合、なるべくここに
|
||
ファイル名を書き込むようにして下さい。
|
||
|
||
パスは保存せず、例えば"SAMPLE.M"を演奏する場合は、
|
||
"SAMPLE.M",0
|
||
と書き込んで下さい。
|
||
|
||
直前に曲を再生したソフトウエアが、このワークに対応している場合は、
|
||
このファンクションで曲のファイル名を取得する事が出来ます。
|
||
|
||
ただし、対応していなかった場合など、必ずしも正しいファイル名が
|
||
書かれているとは限らない点に注意して下さい。
|
||
|
||
===============================================================================
|
||
AH=22H 曲,音色,効果音データのサイズ確認
|
||
-------------------------------------------------------------------------------
|
||
input 無し
|
||
output AL :曲 データバッファサイズ(KB)
|
||
AH :音色 データバッファサイズ(KB)
|
||
DL :効果音データバッファサイズ(KB)
|
||
再入 60:○ TA:○ TB:○
|
||
-------------------------------------------------------------------------------
|
||
各バッファサイズを返します。単位はKB。
|
||
|
||
これ以上の大きさのデータを読み込むと危険です。
|
||
|
||
例外として、音色データが付属している曲データは、
|
||
( 曲データバッファサイズ+音色データバッファサイズ )
|
||
分読んでしまっても構いません。
|
||
|
||
その際、当然ですがPMD内の音色データバッファは破壊されます。
|
||
が、曲データ中に音色がある場合は参照しないので問題ありません。
|
||
|
||
===============================================================================
|
||
|
||
AHにファンクションにない値を指定した場合は、公開ワークの、
|
||
INT60Hの実行ErrorFlagが-1になり、何もせず返ります。
|
||
|
||
===============================================================================
|
||
PMD内部公開ワークの内容
|
||
===============================================================================
|
||
|
||
ver.3.5から、ah=10h int60h で、内部ワークエリアの位置の取得が
|
||
可能になりました。
|
||
|
||
常駐ドライバによってチャンネル数が異なるため、多少の違いがあります
|
||
ので、ファンクション09h等で判断の上使用して下さい。
|
||
|
||
返されるds:dxをworkadrとし、そこから下記のようなデータが
|
||
書き込まれています。
|
||
|
||
===============================================================================
|
||
PMD.COMの場合
|
||
------------------------------------------------------------------------------
|
||
workadr+0 FM 1 のワークの先頭番地
|
||
workadr+2 FM 2 のワークの先頭番地
|
||
workadr+4 FM 3 のワークの先頭番地
|
||
workadr+6 FM 3bのワークの先頭番地
|
||
workadr+8 FM 3cのワークの先頭番地
|
||
workadr+10 FM 3dのワークの先頭番地
|
||
workadr+12 SSG1 のワークの先頭番地
|
||
workadr+14 SSG2 のワークの先頭番地
|
||
workadr+16 SSG3 のワークの先頭番地
|
||
workadr+18 (PCM のワークの先頭番地)*未使用
|
||
workadr+20 リズムchのワークの先頭番地
|
||
workadr+22 FM効果音のワークの先頭番地
|
||
workadr-2 その他全体のワークの先頭番地
|
||
|
||
===============================================================================
|
||
PMDB2/VA/86.COMの場合
|
||
------------------------------------------------------------------------------
|
||
workadr+0 FM 1のワークの先頭番地
|
||
workadr+2 FM 2のワークの先頭番地
|
||
workadr+4 FM 3のワークの先頭番地
|
||
workadr+6 FM 4のワークの先頭番地
|
||
workadr+8 FM 5のワークの先頭番地
|
||
workadr+10 FM 6のワークの先頭番地
|
||
workadr+12 SSG1のワークの先頭番地
|
||
workadr+14 SSG2のワークの先頭番地
|
||
workadr+16 SSG3のワークの先頭番地
|
||
workadr+18 PCM のワークの先頭番地
|
||
workadr+20 リズムchのワークの先頭番地
|
||
workadr+22 FM 3bのワークの先頭番地
|
||
workadr+24 FM 3cのワークの先頭番地
|
||
workadr+26 FM 3dのワークの先頭番地
|
||
workadr+28 FM効果音のワークの先頭番地
|
||
workadr-2 その他全体のワークの先頭番地
|
||
|
||
===============================================================================
|
||
PMDPPZ/PPZE.COMの場合
|
||
------------------------------------------------------------------------------
|
||
workadr+0 FM 1のワークの先頭番地
|
||
workadr+2 FM 2のワークの先頭番地
|
||
workadr+4 FM 3のワークの先頭番地
|
||
workadr+6 FM 4のワークの先頭番地
|
||
workadr+8 FM 5のワークの先頭番地
|
||
workadr+10 FM 6のワークの先頭番地
|
||
workadr+12 SSG1のワークの先頭番地
|
||
workadr+14 SSG2のワークの先頭番地
|
||
workadr+16 SSG3のワークの先頭番地
|
||
workadr+18 PCM のワークの先頭番地
|
||
workadr+20 リズムchのワークの先頭番地
|
||
workadr+22 FM 3bのワークの先頭番地
|
||
workadr+24 FM 3cのワークの先頭番地
|
||
workadr+26 FM 3dのワークの先頭番地
|
||
workadr+28 PPZ 1のワークの先頭番地
|
||
workadr+30 PPZ 2のワークの先頭番地
|
||
workadr+32 PPZ 3のワークの先頭番地
|
||
workadr+34 PPZ 4のワークの先頭番地
|
||
workadr+36 PPZ 5のワークの先頭番地
|
||
workadr+38 PPZ 6のワークの先頭番地
|
||
workadr+40 PPZ 7のワークの先頭番地
|
||
workadr+42 PPZ 8のワークの先頭番地
|
||
workadr+44 FM効果音のワークの先頭番地
|
||
workadr-2 その他全体のワークの先頭番地
|
||
|
||
===============================================================================
|
||
各パートのワーク内容
|
||
------------------------------------------------------------------------------
|
||
byte(s) 内容
|
||
2 演奏中のアドレス (曲データ先頭番地+1からのoffset)
|
||
2 演奏が終わった時の戻り先アドレス (同上)
|
||
1 現在発音中の音符の 残り Length 値
|
||
1 gatetime値。gatetime ≧ 残りLength が成立した時点で、Keyoff
|
||
2 演奏中の音程。音源によって値は変化する。
|
||
2 Detune ±値
|
||
2 LFO ±値
|
||
2 ポルタメントの±値(全体)
|
||
2 ポルタメントの±値(一回に変動する値)
|
||
2 ポルタメントの±値(余り。1ずつ減って行く)
|
||
1 Volume 値 (FM:0~127 SSG:0~15 PCM:0~255)
|
||
1 音階Shift値 (半音単位、符号付き8bit)
|
||
1 LFO DELAY 変動値
|
||
1 SPEED 変動値
|
||
1 STEP 変動値
|
||
1 TIME 変動値
|
||
1 DELAY 設定値
|
||
1 SPEED 設定値
|
||
1 STEP 設定値
|
||
1 TIME 設定値
|
||
1 LFOSwitch B0/tone B1/vol B2/同期 B3/portament 1でON
|
||
1 Volume PUSH 値 (Wコマンド等で、一時的に音量を変えた時の値 +1)
|
||
1 MD command depth 値
|
||
1 MD command speed 変動値
|
||
1 MD command speed 設定値
|
||
1 旧PSGエンベロープの状態 AL中=0 SR中=1 RR中=2 無し=3 新=-1
|
||
1 新PSGエンベロープの状態 AR中=1 DR中=2 SR中=3 RR中=4 無し=0
|
||
1 PSGエンベロープ 新AR 旧AL
|
||
1 新DR 旧AD
|
||
1 新SR 旧SR
|
||
1 新RR 旧RR
|
||
1 新SL
|
||
1 新AL
|
||
1 新AR 旧AL のカウンタ(変動値)
|
||
1 新DR のカウンタ(変動値)
|
||
1 新SR 旧SR のカウンタ(変動値)
|
||
1 新RR 旧RR のカウンタ(変動値)
|
||
1 新音量値(0~15) 旧音量値(-15~+15)
|
||
1 拡張フラグ B0:Detune B1:LFO1 B2:Envelope B5:LFO2 1で拡張
|
||
1 FM Panning + AMD + PMD / YM2608 0b4h~0b6hに出力する値と同じ
|
||
1 PSG の音色 [TONE/NOISE/MIX] YM2203/2608 07HにORする値と同じ
|
||
1 音色番号
|
||
1 ループしたら1 終了したら3
|
||
1 FM Carrier位置
|
||
1 SLOT 1 の TL値
|
||
1 SLOT 3 の TL値
|
||
1 SLOT 2 の TL値
|
||
1 SLOT 4 の TL値
|
||
1 FM slotmask値
|
||
1 FM 音色定義用maskdata値
|
||
1 LFOの波形 MWで指定する値と同じ
|
||
1 PartMask Bit0:INT60HのPart_Mask/1:効果音/6:mコマンド/7:早送り
|
||
1 bit0,2~7 / 0でkeyon 1でkeyoff中 , bit1 / 1でkeyoffさせない
|
||
1 音量LFOのマスクslot
|
||
1 qの値
|
||
1 Qの値
|
||
1 HardLFO delay 設定値
|
||
1 HardLFO delay 変動値
|
||
2 LFO2 ±値
|
||
1 LFO2 DELAY 変動値
|
||
1 SPEED 変動値
|
||
1 STEP 変動値
|
||
1 TIME 変動値
|
||
1 DELAY 設定値
|
||
1 SPEED 設定値
|
||
1 STEP 設定値
|
||
1 TIME 設定値
|
||
1 LFO2 MDB command depth 値
|
||
1 LFO2 MDB command speed 変動値
|
||
1 LFO2 MDB command speed 設定値
|
||
1 LFO2 の波形 MWBで指定する値と同じ
|
||
1 音量LFO2のマスクslot
|
||
1 LFO1 MDA Counter変動値
|
||
1 LFO1 MDA Counter設定値
|
||
1 LFO2 MDA Counter変動値
|
||
1 LFO2 MDA Counter設定値
|
||
1 演奏中の音階 オクターブ×16 + 音階(c~b=0~11),rest=255
|
||
1 Slot delay
|
||
1 Slot delay counter
|
||
1 Slot delay Mask
|
||
1 音色のalg/fb
|
||
1 新音階/休符データを処理したらinc
|
||
1 q 最低保証値
|
||
2 ppz8用fnum値上位
|
||
1 演奏中音階データ (転調処理前 / ?fh:rest)
|
||
1 マスター転調値
|
||
1 q ランダム範囲
|
||
1 予約
|
||
|
||
===============================================================================
|
||
その他全体のワーク内容
|
||
------------------------------------------------------------------------------
|
||
byte(s) 内容
|
||
2 曲データの先頭address+1
|
||
2 音色データの先頭address
|
||
2 FM効果音データの先頭address
|
||
2 FM音源 I/O port (表1)
|
||
2 FM音源 I/O port (表2)
|
||
2 FM音源 I/O port (裏1)
|
||
2 FM音源 I/O port (裏2)
|
||
2 Timer-B ユーザ割り込みフックアドレス offset ;同時に
|
||
2 Timer-B ユーザ割り込みフックアドレス address ;flagを
|
||
2 Timer-A ユーザ割り込みフックアドレス offset ;立てないと
|
||
2 Timer-A ユーザ割り込みフックアドレス address ;掛からない
|
||
2 曲データ中の音色データ先頭番地
|
||
2 R part offset table 先頭番地
|
||
2 R part 演奏中番地
|
||
1 Rhythm音源のマスク x8chポート/アドレス10hのbitに対応
|
||
1 FM音源ボードあり/なしflag
|
||
1 ESC/GRPH key Check flag
|
||
1 FM voldown 数値
|
||
1 PSG voldown 数値
|
||
1 PCM voldown 数値
|
||
1 RHYTHM voldown 数値
|
||
1 曲データに音色が含まれているかflag
|
||
1 OPM flag
|
||
1 status1
|
||
1 status2
|
||
1 tempo (TIMER-B)
|
||
1 Fadeout速度
|
||
1 Fadeout音量
|
||
1 tempo (TIMER-B) / 保存用
|
||
1 小節の長さ
|
||
1 最短音符カウンタ
|
||
1 TimerAカウンタ
|
||
1 PSG効果音発声on/off flag
|
||
1 PSG noise周波数
|
||
1 PSG noise周波数(最後に定義した数値)
|
||
1 発声中のFM効果音番号
|
||
1 FM効果音発声中flag
|
||
1 FM/INT60割り込み中に割り込みを禁止するかflag
|
||
1 PCM効果音発声中flag
|
||
2 PCM音色のstart値
|
||
2 PCM音色のstop値
|
||
1 発声中のPCM効果音番号
|
||
2 PCM効果音のstart値
|
||
2 PCM効果音のstop値
|
||
2 PCM効果音のdelta_n値
|
||
1 PCM効果音のpan
|
||
1 PCM効果音のvolume
|
||
1 リズム音源 shot flag
|
||
6 リズム音源 音量/パンデータ
|
||
1 リズムトータルレベル
|
||
2 SSGリズム shot flag
|
||
2 PSG Effecdataのaddress
|
||
2 PSG Effecdataの長さ
|
||
1 play flag
|
||
1 pause flag
|
||
1 Fadeout後 MSTOPするかどうかのフラグ
|
||
1 K/RpartでRhythm音源を鳴らすかflag
|
||
1 TimerB割り込み中?フラグ
|
||
1 TimerA割り込み中?フラグ
|
||
1 INT60H割り込み中?フラグ
|
||
1 INT60Hの実行ErrorFlag
|
||
1 ADPCM使用 許可フラグ (0で許可)
|
||
1 ESC +?? Key Code
|
||
1 GRPH+?? Key Code
|
||
1 常駐解除禁止フラグ
|
||
2 FM3 Slot Detune値 slot1
|
||
2 FM3 Slot Detune値 slot2
|
||
2 FM3 Slot Detune値 slot3
|
||
2 FM3 Slot Detune値 slot4
|
||
2 FM ADDRESS-DATA間 Loop $の回数
|
||
2 loop $ 1個の速度
|
||
1 早送り時のTimerB値
|
||
1 PCMアクセス中は1 そうでない時は0 (周辺アプリが設定)
|
||
1 TimerBの現在値(=ff_tempoならff中)
|
||
1 内部からfadeoutを実行した時1 mstart時0クリア
|
||
1 ADPCM定義の速度 0で高速 1で低速 (ADPCM定義アプリが参照)
|
||
1 PCM86逆相flag (1で逆相中)
|
||
1 PCM86の音量をSPBに合わせるか flag
|
||
2 小節カウンタ
|
||
1 FM音源割り込み中?フラグ
|
||
1 OPN-PORT 22H に最後に出力した値(hlfo)
|
||
1 Tempo (t値に換算したもの)
|
||
1 Tempo (同上/保存用)
|
||
1 GRPH+?? (rew) Key Code
|
||
1 ユーザ割り込みフック中かどうかのflag B0:TB B1:TA
|
||
1 SKIP状態のフラグ normal:0 前方SKIP中:1 後方SKIP中:2
|
||
1 FM voldown 数値 (保存用)
|
||
1 PSG voldown 数値 (保存用)
|
||
1 PCM voldown 数値 (保存用)
|
||
1 RHYTHM voldown 数値 (保存用)
|
||
1 PCM86の音量をSPBに合わせるか? (保存用)
|
||
1 mstartする時に1にするだけのflag
|
||
13 曲のFILE名バッファ
|
||
1 曲データバッファサイズ(KB)
|
||
1 音色データバッファサイズ(KB)
|
||
1 効果音データバッファサイズ(KB)
|
||
1 リズム音源 shot inc flag (BD)
|
||
1 リズム音源 shot inc flag (SD)
|
||
1 リズム音源 shot inc flag (CYM)
|
||
1 リズム音源 shot inc flag (HH)
|
||
1 リズム音源 shot inc flag (TOM)
|
||
1 リズム音源 shot inc flag (RIM)
|
||
1 リズム音源 dump inc flag (BD)
|
||
1 リズム音源 dump inc flag (SD)
|
||
1 リズム音源 dump inc flag (CYM)
|
||
1 リズム音源 dump inc flag (HH)
|
||
1 リズム音源 dump inc flag (TOM)
|
||
1 リズム音源 dump inc flag (RIM)
|
||
1 ch3 Mode
|
||
1 ch3 Mode(効果音発音時用push領域)
|
||
1 PPZ8 voldown 数値
|
||
1 PPZ8 voldown 数値 (保存用)
|
||
2 PPZ8call用 far call address
|
||
2 PPZ8call用 far call seg(値はPPZ8常駐checkを兼ねる,0で非常駐)
|
||
1 PMD86のPCM再生周波数
|
||
2 PMD86のPCM再生周波数table位置
|
||
1 PMDPPZEでADPCMエミュレート中か
|
||
|
||
===============================================================================
|
||
サンプルについて
|
||
------------------------------------------------------------------------------
|
||
PCM読み込み、ワークの使用などのサンプル(以前ここにishであったもの)は、
|
||
同梱のPCMLOAD.INCを直接参照してください。
|
||
|
||
===============================================================================
|
||
終わりに
|
||
------------------------------------------------------------------------------
|
||
|
||
ワークについては、今後、予告無く変更する場合がありますので、
|
||
ご了承下さい。
|
||
|
||
バージョンによってファンクションやワークに違いがありますが、
|
||
追加・変更・削除等の情報は UPDATE.DOC 内に記してあります。
|
||
|
||
===============================================================================
|
||
---- End of PMDDATA.DOC ----
|
||
===============================================================================
|
||
|