PCE CD-ROM2 内部 ADPCM 用 RAM 制御機能に対する考察

情報の精度

この文書はインターネット上で得られる情報を元に実装したものであり、実機からの分析情報ではありません. 情報の精度はよくありません. 詳しい仕様をご存じの方は是非教えてください.

はじめに

CD-ROM2 システムで一番複雑なのは ADPCM 用 RAM 制御であると思われる. CD-ROM2 に入っている ADPCM decoder は MSM5205 であるが、 MSM5205 には RAM 制御機能は一切なく, CD-ROM2 側で RAM を制御管理する.

制御内容はおおまかに下記である.

  • 6280 (CPU) からのデータ読み書き
  • CD-ROM コントローラからのデータ書込み
  • MSM5205 へのデータ送信

6280 からのレジスタ

制御レジスタは絶対アドレス 0x1ff800 から 0x1ff80f にあり、当機能に該当するもののみ記載する. レジスタのアドレスは一部 bit を decode していないので mirror がある. decode していない bit はおそらく bit9:4 だと思われる.
レジスタには read / write で別の意味を持つもの, write cycle が発生しただけで意味を持つものもあるので RAM と同じ感覚で考えてはいけない.

レジスタは address.rw.bit と表記し 0x1ff80d.w3:0 とある場合は絶対アドレス 0x1ff80d, write, bit0から3の4bitを意味する.

address 0x1ff800, 省略

address 0x1ff801, 省略

address 0x1ff802, 割り込み発生許可
w6   CD (seek?) ready interrupt mask (0:disable, 1:enable)
w5   CD (transfer?) done interrupt mask (dataの意味は同上)
w3   ADPCM play done interrupt mask (dataの意味は同上)
w2   ADPCM length register msb interrupt mask (dataの意味は同上)
read や他の bit は省略
bit4 は CD-G に使う割り込みらしいが現段階では省略

address 0x1ff803, CD,ADPCM 状態
r6   CD (seek?) ready status
r5   CD (transfer?) done status
r3   ADPCM play done status
r2   ADPCM length register msb == 0
address 0x1ff802 と同じ bit の並びになっている. 割り込み許可時に
この値が 0->1 になると 6280 へ IRQ2 を送信する.
bit4 は address 0x1ff802 と同じ

address 0x1ff804, 省略

address 0x1ff805, 省略

address 0x1ff806, 省略

address 0x1ff807, 省略

address 0x1ff808, ADPCM argument register (1/2)
w7:0  ADPCM argument bit7:0

address 0x1ff809, ADPCM argument register (2/2)
w7:0  ADPCM argument bit15:8

address 0x1ff80a, ADPCM RAM data port
r7:0  ADPCM RAM read data
w7:0  ADPCM RAM write data
アクセスするごとに RAM address は increment される.

address 0x1ff80b, CD-ROM data desitination register
w1    CD-ROM data desitination (0: 6280 data port, 1:ADPCM RAM)
w0    不明
詳細の考察は後述する.

address 0x1ff80c, ADPCM RAM controller status
r7    reading status (0:idle, 1:reading)
r6:4  不明
r3    playing status (0:idle, 1:playing)
r2    writing status (0:idle, 1:writing)
r1    不明
r0    playing status の反転値らしい
詳細の考察は後述する.

address 0x1ff80d, ADPCM RAM controller operation
w7    reset (0:idle, 1:reset)
w6    play (0:stop, 1:play)
w5    play endless?
w4    latch to length register
w3    latch to read or play address register
w2    6280 から read に関する address 制御らしい
w1    latch to write address register
w0    6280 から write に関する address 制御らしい
詳細の考察は後述する.

address 0x1ff80e, 省略

address 0x1ff80f, 省略

6280 から ADPCM 用の RAM へのアクセス

  • argument register を書込み, 目的別の address register へ latch する.
  • 0x1ff80c.r0 は address latching と書かれている文書もある.
  • 0x1ff80c.r7 と r2 はこの RAM が実際には DRAM であるため、DRAM への address の設定や refresh の都合で時間が一定ではないため存在すると思われる.
  • 0x1ff80d.w2 は 6280 から読み込むときに 1 に set する. これを設定した後 0x1ff80a.r を 2 度読み込んだ後(=空読み)、指定した address の data が読み取れるが何故そうなるのかが不明.
  • 0x1ff80d.w0 ではやはり書き込むときに 1 にset する, read と違い 1 度の書込みのあと、指定した address へ data を書き込めるがやはり理由は不明.

6280 からの ADPCM 用 RAM の読み込みはかなり重要. RAM が少ない SUPER ではない CD-ROM2 ソフトで ADPCM の再生の目的ではなく RAM 容量を増やすために使われる. SUPER CD-ROM2 ソフトでもビジュアルシーンで通常の RAM を使い切った場合に CD-DA を停めずにデータをよんでいるなど、テクニックが多い.

CD-ROM 読み込みから ADPCM 用 RAM への書込み

通常は下記の手順で行なわれる.

  • READ(6) コマンド発行
  • COMMAND REQ -> COMMAND ACK -> DATA IN REQ
  • DATA IN REQ 受付後 0x1ff80b.w1 = 1 にする
  • ADPCM RAM controller から ADPCM RAM へ書込み
  • DATA IN REQ -> STATUS REQ

0x1ff80b.w1 = 1 のタイミングは BIOS では上記になっているが、BIOS を使わない場合は READ(6) 発行時点で 1 になっている場合もありそれでも ADPCM 用 RAM へ書き込まれる. このタイミングに設定している理由は不明.

ADPCM 再生中にも書込みが可能. ソフトでは再生と書込みの address 範囲が一致しないようにしている. 一致した場合の動作は現時点では不明.

ADPCM 用 RAM の address はおそらく 0x1ff80b.w1 = 1 の時点で argument register から latch すると思われる. このため 0x1ff80d.w1 = 1 は設定しなくても良い. また 0x1ff80b.w1:0, 0x1ff80d.w1:0 はこのために bit の並びを揃えているようなので, 詳細不明の w0 も同じ意味を持つと予想される.

ADPCM の再生 (追記の必要のない短い時間)

  • ADPCM 用 RAM に MSM5205 へ渡すデータを書き込む
  • length register と read or play address register を設定する
  • ADPCM play done interrupt を許可する
  • address 0x1ff80d.w = 0x60 を書き込んで再生開始
  • 再生終了後 IRQ2 が発生するので、発生原因が ADPCM play done の場合は address 0x1ff80d.w = 0 を書き込んで停止

再生開始は w6=1, w5=1, w2=0 となる. w5 は length register == 0 でも再生を停めないのか address register 0xffff -> 0x0000 を許可するという意味を持つと思われるが基本的に 1 に設定するらしい. w2 は空読みがいらない理由の根拠らしい.

ADPCM の再生 (追記が必要な長い時間)

  • ADPCM 用 RAM に MSM5205 へ渡すデータを書き込む
  • length register と read or play address register と write address register を設定する
  • ADPCM play done interrupt と ADPCM length register msb interrupt mask を許可する
  • address 0x1ff80d.w = 0x60 を書き込んで再生開始
  • 再生途中に IRQ2 が発生するので, ADPCM length register msb interrupt の場合は READ(6) を発行する
    • READ(6) 発行後, SCSI status を DATA_IN_ACK にした時点で 0x1ff803.r6 の割り込みを発生させること,この割り込みの後に 0x1ff80b.w1 = 1 となり、追記の初期化が完了する.
    • ADPCM 用 RAM への書込みが終わった時点で 0x1ff803.r5 の割り込みを発生すると,追記の処理の終了となり、次の追記の処理を受け付ける.
  • これ以上の追記を望まない場合は ADPCM play done interrupt のみ許可する
  • 再生終了後 IRQ2 が発生するので、発生原因が ADPCM play done の場合は address 0x1ff80d.w = 0 を書き込んで停止

追記処理は前述の処理をすべて応用するので、実装できていなかった.

ADPCM 用 RAM controller について重要なレジスタ(変数)は下記の動作をすると思われる.

  • length register
    • 16bit のレジスタ
    • read cycle の場合 -= 1
    • write cycle の場合 += 1
    • bit15:0 == 0x0000, bit15 == 0 で各 status, interrupt に反映
  • write address register
    • 16bit のレジスタ
    • 6280 からの write の場合は 0x1ff80d.w1 を利用し latch する
    • CD-ROM から直接 write する場合は 0x1ff80b.w1 を利用し latch する、再生中は latch しないらしい(?)
  • read or play address register
    • 16bit のレジスタ
    • read cycle に使用 (6280 からの read, MSM5205 の再生で更新)

追記処理中は address 0x1ff80d は停止以外の目的で書込みをしないのでこう解釈している. length register は overflow (0xffff->0x0000), underflow (0x0000->0xffff) が起きないらしいが、 address register は overflow が起きるため追記に利用できる.