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つ目のコード例と同じように、書き込み後即時その値を返します。
(実質的な実効アドレスが同じため?)