SA‐1 BW‐RAM Openbus - absindx/SNES-TestRoms GitHub Wiki

SA-1 BW-RAM Openbus

この記事は独自調査による結果を基に執筆されています。未調査のケースや誤りが多分に含まれることに十分注意してください。

テストROMを作成中です。

概要

SA-1には「BW-RAM Openbus」とも呼ぶべきラッチレジスタが存在します。
※私が独自に呼んでいる仮の命名です。

未割当領域を読み込んだ際に、「BW-RAM Openbus」にラッチされている値が返ってきます。

主にSA-1 CPU側から読み・書きされますが、特定条件ではSNES CPUからも読み・書き可能です。

; SA-1 CPU

LDA.b #$AA
STA   $400000 ; BW-RAM Openbus <= $AA
LDX   $000800 ; (read unmapped region) X <= $AA ... NOTE: May vary. See below.

LDA.b #$BB
STA   $400000 ; BW-RAM Openbus <= $BB
LDX   $002000 ; (read unmapped region) X <= $BB

上記コード例では SA-1 メモリマップ上では未割当の領域 $000800 を読み込むと直前にBW-RAM領域へ書き込んだ値 $AA が、 同様に $002000 を読み込むと $BB がXレジスタに格納されます。
※事前の状態によっては1回目の $AA が返されないことがあります。詳細は後述。

領域

Write (ラッチ更新)

CPU Write address Note
SNES $00-3F:6000-7FFF
SNES $40-4F:0000-FFFF
SA-1 $00-3F:6000-7FFF
SA-1 $40-5F:0000-FFFF
SA-1 $60-7F:0000-FFFF 書き込んだ値 AND $0F ( $223F BBF.SEL42 = 0 )

上記の表のとおり、BW-RAMの領域へ書き込むと更新されます。
Bitmap領域では「書き込んだ値 AND $0F」されていることから、BW-RAMのアクセス用と推測されます。

Read

CPU Read address Note
SNES $00-3F:6000-7FFF BW-RAMなしボードのみ
SNES $40-4F:0000-FFFF BW-RAMなしボードのみ
SNES $80-BF:6000-7FFF BW-RAMなしボードのみ
SA-1 $00-3F:0800-23FF
SA-1 $00-3F:2400-3FFF I/Oレジスタ未割当アドレス
SA-1 $00-3F:6000-7FFF BW-RAMなしボードのみ
SA-1 $40-5F:0000-FFFF BW-RAMなしボードのみ
SA-1 $60-7F:0000-FFFF BW-RAMなしボードのみ, AND $0F ( $223F BBF.SEL42 = 0 )
SA-1 $80-BF:0800-23FF
SA-1 $80-BF:2400-3FFF I/Oレジスタ未割当アドレス
SA-1 $80-BF:6000-7FFF BW-RAMなしボードのみ

一部のI/Oレジスタは使用不可状態にするとBW-RAM Openbusを返します。

CPU Address Name Condition
SA-1 $2300 SFR (always)
SA-1 $230A MR5 $2250 MCNT.ACM = 0
SA-1 $230E VC (always)

BW-RAMなしボード

SHVC-1L0B-01 のように、BW-RAMが搭載されていないボードがあります。
このボードではSNES CPUからもBW-RAM Openbusが読み取り可能です。
(上記表の「BW-RAMなしボード」はこのボードを指します。)

ラッチレジスタの挙動

ラッチレジスタは16ビットと推測しています。
8bit * 2のFIFOキューのような動作をします。

1回目書き込みと2回目書き込みで異なるBW-RAM 実効アドレス に書き込むと、 BW-RAM Openbusは1回目の書き込み値を返します。

; SA-1 CPU

; * The exact internal operation is unknown.

LDA.b #$AA
STA   $400000 ; BW-RAM Openbus = (BW-RAM Openbus << 8) | value
              ;                = $xxAA
LDX   $000800 ; X              = BW-RAM Openbus >> 8
              ;                = $xx

LDA.b #$BB
STA   $400001 ; BW-RAM Openbus = (BW-RAM Openbus << 8) | value
              ;                = $AABB
LDX   $000800 ; X              = BW-RAM Openbus >> 8
              ;                = $BB

LDA.b #$CC
STA   $400002 ; BW-RAM Openbus = (BW-RAM Openbus << 8) | value
              ;                = $BBCC
LDX   $000800 ; X              = BW-RAM Openbus >> 8
              ;                = $CC

1回目書き込みと2回目書き込みで同じBW-RAM 実効アドレス に書き込むと、 BW-RAM Openbusは2回目の書き込み値を返します。
(詳細不明。2回書き込みがおこなわれている?どこかのバスに残った値を再度ラッチしている?)

; SA-1 CPU

; * The exact internal operation is unknown.

LDA.b #$AA
STA   $400000 ; BW-RAM Openbus = (value << 8) | value
              ;                = $AAAA
LDX   $000800 ; X              = BW-RAM Openbus >> 8
              ;                = $AA

LDA.b #$BB
STA   $400000 ; BW-RAM Openbus = (value << 8) | value
              ;                = $BBBB
LDX   $000800 ; X              = BW-RAM Openbus >> 8
              ;                = $BB

LDA.b #$CC
STA   $400000 ; BW-RAM Openbus = (value << 8) | value
              ;                = $CCCC
LDX   $000800 ; X              = BW-RAM Openbus >> 8
              ;                = $CC

BW-RAMなしボードも2つ目のコード例と同じように、書き込み後即時その値を返します。
(実質的な実効アドレスが同じため?)

TODO