FM音源(YM2203)を使用する時の話です。
SRにはFM音源のYM2203が搭載されています。YM2203 には、一定間隔を数える、2つのタイマA/B があります。
PC-88などでは、タイマが満了すると、割り込み信号をアクティブにして、CPUに知らせてくれるのですが、mk2SR/66SR では、この割り込み信号が接続されておらず、残念なことになっています。
なので、タイマA/B は全く使えないと思っていたのですが、工夫次第でほぼ同程度の事ができます(既知かもしれませんが)。
やり方は以下の通りです。
・ポート0xA3 を読み出す。
このポートは、YM2203のステータスレジスタで、読み出される以下の通り。
b7:busy時、"1"
b1:タイマBオーバーフロー時、"1"
b0:タイマAオーバーフロー時、"1"
このポート0xA3 を、P6のタイマ割り込みで一定間隔で読み出せば、疑似タイマ割り込みが出来ます。
実際のプログラムでは、以下のような実装になるかと思います。
(タイマ割り込みなので、他のものが多いです)
;
; タイマ割り込み
; (1/1200秒割込み)
;
INTTIMER:
push af
ld a,(TIMERCNT)
inc a
and $0f
ld (TIMERCNT),a
jr nz,.next1
ld a,$06
call SETSUBCPU ; ゲームキー呼び出し
.next1:
ld a,(KEYCNT)
inc a
and $ff
ld (KEYCNT),a
jr nz,.next2
xor a
ld (KEYDATA),a ; タイマ満了時、キーバッファクリア
.next2:
;
; 1/600秒割り込み処理
;
ld a,(TIMERON)
or a
jr z,.next3
ld a,(TIMCNT600)
inc a
and $01
ld (TIMCNT600),a
call z,$8d84 ; 1/600秒割り込み
.next3:
ld a,(BGMON)
or a
jr z,.end
; YM-2203 TIMER割り込み
;
ld a,($8a14) ; 割り込みレベル
cp $05
jr c,.end
in a,($a3)
and $03
call nz,$9120 ; サウンド割り込み
.end:
pop af
ei
ret
TIMERCNT:
db $00
TIMCNT600:
db $00
最後の方のサウンド割り込みが、それになります。
タイマA/Bのいずれかが満了していれば、下位2ビットが00以外なので、$9120 を CALL します。
通常、BGMを鳴らすルーチンが長いことが多いので、割り込みルーチンに入ると、フラグを立てて、割り込みを解除する事が多いです。
上記の場合、$9120 からのルーチンでは、最初に、($8a14) に、$02 を設定して、ei をしています。
BGMのルーチンの終了時に、($8a14) に、$05 を設定して終了しています。