2022年05月17日

SRのFM音源のタイマを使う

  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 を設定して終了しています。




posted by えすび at 15:46| Comment(0) | P6解析:音声周り | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。