4.2 事前準備
あらかじめSEドライバおよびSEデータ(SEテーブル)を任意のRAMへ配置し、SE発声機能が利用できる状態にしておきます。その後、関連パラメータを書き換えます。
CALL SESET(<SEテーブルの開始アドレス>)
CALL POKE(&H4300+195,<1文字表示毎に待つ1/60秒単位のウエイト(0~255)>)
SEテーブルはRAMのページ0を推奨します。DMシステム2はページ0の3000h~3FFFhの4KiBが空きエリアとなっていますので、こちらを積極的にご利用ください。
1文字表示フックの書き換え
インフォメーションエリアに存在する「1文字表示フック(HKKPUT, 4300h+196)」の3バイトを以下のように書き換えます。Z80アセンブルリストは以下の通りです。
HKKPUT EQU 4300H+196 ;43C4h
ORG HKKPUT
C3 73 43 JP 4300H+115 ;4373h: unused information area (max 13 bytes)
HKKPUTの書き換えにより、1文字表示するたびに後述の処理ルーチンへ遷移します。フックを書き換えるBASICリストは以下の通りです。
CALL POKES(&H4300+196,"テsC") :'HKKPUT
SE発声処理ルーチンの追加
インフォメーションエリア内の未使用予約エリア(4300h+115)から12バイトを以下のように書き換えます。Z80アセンブルリストは以下の通りです。
SEON EQU 4067H ;DM-SYSTEM2 sound effects API [in] A, HL
SEADD EQU 4300H+26 ;431Ah: sound effects table address
KJSE EQU 4300H+199 ;43C7h: sound effects No.
ORG 4300H+115 ;4373h: unused information area (max 13 bytes)
3A C7 43 LD A,(KJSE) ;A <- sound effects No.
B7 OR A ;check 0 or other
C8 RET Z ;if A=0 then return (SE off mode)
2A 1A 43 LD HL,(SEADD) ;HL <- sound effects table address
CD 67 40 CALL SEON ;call sound effects API
C9 RET ;this routine end
この処理ルーチンの追加により、1文字表示するたびにSEが発声する準備が整います(まだ鳴りません)。処理ルーチンを追加するBASICリストは以下の通りです。
CALL POKES(&H4300+115,":ヌCキネ*"+CHR$(26)+"Cヘg@ノ") :'routine
4.3 機能の発動
1文字表示ごとのSE発声機能を発動させるには、インフォメーションエリアに存在する「効果音番号(KJSE, 4300h+199)」へ0以外の効果音番号を代入してから、日本語表示を行います。
CALL POKE(&H4300+199,<1文字表示毎に鳴らすSE番号(1~255)>)
CALL KPUT("こんにちは!")
KJSEに0を代入すると無音(SE発声しない)となります。
※ CALL KINIT(漢字表示機能の初期化)でbit5(処理単位設定)に1に設定した「装飾単位」モードではSEが発声できません。
4.4 機能の一時停止と終了
1文字表示ごとのSE発声機能を一時中断する場合はフックの1バイト目を C9h に書き換えてください(再利用は C3h)。機能の利用を終了する場合はデフォルト値(C9h C9h C9h)で原状回復してください。
CALL POKE(&H4300+196,&HC9) ← 一時中断
CALL POKE(&H4300+196,&HC3) ← 一時中断からの再利用
CALL POKES(&H4300+196,"ノノノ") ← 機能停止(HKKPUTの原状回復)