SRAMデータ読み取り/書き込み+MASKROMデータ読み取り装置

−回路図編−


装置の回路図

装置の回路図



1.はじめに

この装置の回路は上図のようになっています。MSX-BASIC起動時に通常使用できるRAMはプログラム領域を含めて32KB(8000h〜FFFFh)なので今回は半分の16KB(9000h〜CFFFh)を外部装置とのデータをやりとりするためのワークエリアとして使用することにしました。EPROMにはあらかじめ0番地と1番地にそれぞれデータ「41h」と「42h」,それ以外の番地には「00h」を書き込んでおきます。このEPROMのデータを起動時にMSXが認識することで,外部装置をアクセスすることができるようになります。EPROMは128Kビットあればいいのですが今回はモノがなかったので,1Mビット,32ピンのEPROMを使用しました。スーパーファミコンのカートリッジ内のSRAMやゲーム用ROM(MASKROM)に割り付けられている4000h〜7FFFh番地(16KB)の領域に対してアクセスし,MSXの9000h〜CFFFh番地とデータのやりとりができるようにしました。



2.SRAMデータのアクセス方法の説明

SRAMはカートリッジ内の電池により3V電源が供給された状態でないと,データが消えるのでSRAMそのものをカートリッジから抜き取ることはできません。スーパーファミコンから抜き取ったコネクタ(カートリッジ用スロット)にフラットケーブルなどで,装置から必要な信号を配線しておき,この状態でコネクタ上にカートリッジを刺すことにします。配線の注意点として,カートリッジ内のSRAMのCS*信号が何番ピンであるかは調べておく必要があります。これはゲームごとにCS*のピン番号が異なっていて,SRAMに5V電源を供給しない状態でCS*信号をLOWにするとデータがすべて消えてしまうためです。ゲームごとにCS*を選択できるようにジャンパスイッチを設けておくのがいいと思います。また,SRAMのデータをアクセスするときは,MASKROMは必ず抜いておきます。左側のLS139でアドレスバスのA14が0か1かを判断し,A14が1(4000h〜7FFFh)の番地をアクセスするときにSRAMのデータの読み書きができます。スーパーファミコン用のSRAMの容量は通常8KB以下なのでMSXのRAMに1回でデータを納めることが可能です。



3.MASKROMデータのアクセス方法の説明

MASKROMはSRAMのようにカートリッジをコネクタに刺した状態では配線ができないと思ったので,MASKROMを半田吸引機などを使って取り外しICソケット上に刺すことにしました。この方法だと,スーパーファミコン用以外のMASKROMも読むことが可能です。また,MASKROMのデータをアクセスするときは,SRAMアクセス用のカートリッジは必ず抜いておきます。左側のLS139でアドレスバスのA14が0か1かを判断し,A14が1(4000h〜7FFFh)の番地をアクセスするときにMASKROMのデータの読み取りができます。そして,MASKROMの容量は最大16Mビット(=2MB)とMSXのRAM領域の数十倍もあるのでデータを分けて読み取る必要があります。それを可能にするのがLS273です。EPROMと同番地の0番地にLS273のレジスタが割り当てられているのでこのレジスタにA20〜14のデータを書き込んでおくことで,上位のMASKROMのデータを読むことができます。例えばファイナルファンタジーVIのMASKROMは16Mビットと8Mビットの2個,計24Mビット(=3MB)で構成されています。本装置では1度に読めるデータが最大16KBであるため3MBを読むためには合計192回に分けてデータを読む必要があります。全てのデータを読み取った後,Windowsなどのパソコンにデータをコピーします。これらのファイルは最初の7バイトにMSX用のヘッダーを含んでいるので削除しておきます。そしてこのファイルを順番につなげて1つにし,最後にエミュレータに必要なヘッダーを挿入することでエミュレータ用のROMデータが完成します。



4.ピン配置について

この装置の回路を組む際に必要なピン配置を自分のわかる範囲で説明します。このデータは動作検証を行いながら自分で調べたものなので,当然のことながら完全なデータであるとはいえません。詳細についてはMSX2テクニカルハンドブック(アスキー出版局)や各社のSRAMやMASKROMのデータシートを参照してください。



MSXのスロットのピン配置 スーパーファミコンのカートリッジのピン配置
ピン番号 信号名 ピン番号 信号名
1 26 A13
2 27 A1
3 28 A0
4 SLTSL* 29 A3
5 30 A2
6 31 A5
7 32 A4
8 33 D1
9 34 D0
10 35 D3
11 36 D2
12 37 D5
13 WR* 38 D4
14 RD* 39 D7
15 40 D6
16 41 GND
17 A9 42
18 A15 43 GND
19 A11 44
20 A10 45 +5V
21 A7 46
22 A6 47 +5V
23 A12 48
24 A8 49
25 A14 50
ピン番号 信号名 ピン番号 信号名
5 GND 36 GND
6 A11 37 A12
7 A10 38
8 A9 39
9 A8 40 (注)
10 A7 41
11 A6 42
12 A5 43
13 A4 44
14 A3 45
15 A2 46
16 A1 47 (注)
17 A0 48
18 49 (注)
19 D0 50 D4
20 D1 51 D5
21 D2 52 D6
22 D3 53 D7
23 RD* 54 WR*
24 55
25 56
26 57
27 +5V 58 +5V


(注):スーパーファミコンのカートリッジの40,47,49番ピンは組み合わせによりCS*信号を生成するのですが,ゲームごとに異なっています。例えば
  • ドラゴンクエストV:40,49番の両方のピンがLOWのときCS*がLOWになる
  • ファイナルファンタジーV:40,47番の両方のピンがLOWのときCS*がLOWになる
  • ファイナルファンタジーVI:47番ピンがLOWのときCS*がLOWになる
使いたいゲームのカートリッジ内にあるSRAMのCS*信号(20番ピン)をどのようにすればLOWにできるか,基板上のパターンを逆にたどることで調べることができます。



EPROMのピン配置(128Kビット,28ピン)
ピン番号 信号名 ピン番号 信号名
1 +5V(VPP) 15 D3
2 A12 16 D4
3 A7 17 D5
4 A6 18 D6
5 A5 19 D7
6 A4 20 CS*
7 A3 21 A10
8 A2 22 OE*
9 A1 23 A11
10 A0 24 A9
11 D0 25 A8
12 D1 26 A13
13 D2 27 +5V(PGM*)
14 GND 28 +5V
MASKROMのピン配置(16Mビット,36ピン)
ピン番号 信号名 ピン番号 信号名
1 A20 19 D3
2 GND 20 D4
3 A19 21 D5
4 A16 22 D6
5 A15 23 D7
6 A12 24 CS*
7 A7 25 A10
8 A6 26 A18(注1)
9 A5 27 A11
10 A4 28 A9
11 A3 29 A8
12 A2 30 A13
13 A1 31 A14
14 A0 32 A17(注2)
15 D0 33 OE*
16 D1 34 +5V
17 D2 35 GND
18 GND 36 +5V
LS139のピン配置
ピン番号 信号名 ピン番号 信号名
1 G(1) 9 D3(2)
2 A(1) 10 D2(2)
3 B(1) 11 D1(2)
4 D0(1) 12 D0(2)
5 D1(1) 13 B(2)
6 D2(1) 14 A(2)
7 D3(1) 15 G(2)
8 GND 16 +5V
LS04のピン配置
ピン番号 信号名 ピン番号 信号名
1 IN(1) 8 OUT(4)
2 OUT(1) 9 IN(4)
3 IN(2) 10 OUT(5)
4 OUT(2) 11 IN(5)
5 IN(3) 12 OUT(6)
6 OUT(3) 13 IN(6)
7 GND 14 +5V
LS273のピン配置
ピン番号 信号名 ピン番号 信号名
1 CLR 11 CLK
2 Q1 12 Q5
3 D1 13 D5
4 D2 14 D6
5 Q2 15 Q6
6 Q3 16 Q7
7 D3 17 D7
8 D4 18 D8
9 Q4 19 Q8
10 GND 20 +5V


MASKROMはその容量によりピンの数が少ないものもあります。
  • 8Mビット以下・・・・・・32ピン(例:ファイナルファンタジーIV)
  • 1Mビット以下・・・・・・28ピン(例:ドラゴンクエストII)
32ピンのMASKROMの場合はICソケットの3〜34番ピン上に刺し,28ピンのMASKROMの場合は5〜32番ピン上に刺します。

(注1):28ピンのMASKROMの場合は,26番ピン(A18)がA16に置き換わっているので,A16を1にする場合はプログラム上,A18に1を書く(例:0000h番地に16を書く)必要があります。
(注2):28ピンのMASKROMの場合は,32番ピン(A17)に+5V電源を接続しなければなりません。 必要に応じて信号切り替え用のスイッチをつけておくのがいいかと思います。



5.プログラムについて

MSXのメインのRAM領域から外部装置のデータをアクセスするにはマシン語を使い,以下のような「インタースロットコール」という方法を使用します。外部装置のデータを読む場合は
  • Aレジスタにスロット番号(=2)例:「3E 02」
  • HLレジスタに読む番地(4000h〜7FFFh)例:「21 00 40」
を設定し,000Ch番地をコール「CD 0C 00」すると,Aレジスタに外部装置から読み取ったデータが転送されます。また,外部装置にデータを書き込む場合は
  • Aレジスタにスロット番号(=2)例:「3E 02」
  • HLレジスタに書く番地(4000h〜7FFFh,または0000h)例:「21 00 40」
  • Eレジスタに書くデータ(00h〜FFh)例:「1E 00」
を設定し,0014h番地をコール「CD 14 00」すると,Eレジスタのデータが外部装置に書き込まれます。以上のルーチンをループさせると,メインRAMと外部のRAM/MASKROM間で一括してデータのやりとりができます。MASKROMのデータを読み取る際には0000h番地に0,1,2,3,4・・・,127というふうに上位アドレスA20〜14のデータを書き込んでおくとMASKROMの全ての領域が読めるようになります。

注意点として,SRAMやMASKROMのデータをマシン語でアクセスする場合は連続的にアクセスするとデータが正しく読み書きできないので,アクセスの度に「06 20 10 FE」のようなウェイトを挿入しておくことが必要です。



シルゴンハーゲンのホームページ・MSX編へ
MSX編 トップへ戻る
シルゴンハーゲンのホームページ・メインへ
ホームページ トップへ戻る