昔憧れていた似非RAMディスクを作製しました。出来上がるまでに色々あったのでメモがてら記載しておこうと思います。
Table of Contents
似非RAMディスクとは?
似非職人工房の辻川さんが考案されたもので、メガロムゲームのROMをSRAMに置き換え、Disk BIOSにパッチを当てたものをSRAMに書き込むことで、Ramdiskのように使えるようにしたものです。
メガロムコントローラによって最大容量は変わりますが、最大1MBのSRAMを搭載できるようです。MSXで使えるフロッピーディスクが 2DD 720KBなので、それ以上の容量を高速アクセスできるのは魅力的です。
個人的に似非RAMディスクで一番すごいと思っているのは、Disk BIOSに独自にパッチを当てて、FDDアクセスをSRAMアクセスに完全に置き換えているところです。BASICからもMSX-DOSからも全てのディスクアクセスが問題なく行えるように、ソース非公開のDisk BIOSを改造するのは至難の業だと思います。すごい人がいるものですね。
似非RAMディスクを作るねらい
私が持っているFS-A1にはFDDがついていません。なのでPCとデータのやり取りをする手段が一切なく、PCに残っている過去のMSXのソフトを動かしたり、今後PCで開発したソフトを実機で動かすことができない状態です。
そこで似非RAMディスクを作製し、先日作ったROMカートリッジリーダ/ライタを使って似非RAMディスクにROMイメージを書くことでPCとMSX間でファイルのやり取りができないかと考えています。
ちょっと話は飛ぶのですが、(MSX界では世界的に有名な)konamimanさんがMSX-DOS2互換のOS、Nextor を開発・公開されています。そして、(MSXの改造で有名な)にがさんがこの Nextor にパッチを当てて似非RAMディスク用のイメージを作成する NextorPatcher を公開されています。
NextorPatcherでは、あらかじめROMイメージにファイルを組み込むことができます。この機能を使えば、PCのファイルをMSXに受け渡すことができそうです。これがまずやりたいことです。
MSX→PC側はSRAMイメージからファイルを取り出すための開発が必要になりますが、PC→MSX側の受け渡しさえできれば技術的なハードルはめちゃくちゃ下がります。
ということで似非RAMディスクを作ってなんとかPCからMSXにファイルを受け渡すことが目的です。
情報収集
似非職人工房のHPはまだ残っていますが、辻川さんが当時のパソコン通信 Niftyserve に投稿されたデータ等はHPで公開されていません。
サイバラさんがこれらNiftyserveに投稿された情報を集めて似非職人工房・非公認出張所にて公開してくださっています。
似非RAMディスクの作成に必要な1次情報はこちらです。
これらをHTML化して読みやすくしたものがれふてぃさんによって公開されています。
256KB用、1024KB用だけでなく、似非SCCの作り方などもHTML化されており、こちらも参考になります。
またGigamix Onlineにてゲームタイトルとメガロムコントローラの種類をまとめたデータベースが公開されています。私もお世話になっており、このデータを参考に似非RAMディスクが作成できそうなゲームを買い集めていました。
肌感覚ですが、ヤフオクで安く手に入るメガロムゲームには、ASC2が使われていることが多い感じがします。ASC1タイプは結構レアかもしれません。
似非RAMディスクの仕組み
似非RAMディスクの回路図と製作記事の説明を読むと以下のような仕様になっていることがわかりました。れふてぃさんの記事だけでなく、似非RAM製作の原典にしか書かれていないこともありますので、一通り目を通すことをオススメします。
- メガコンを8kバンクモードを使う
- セグメント#128〜255は #0〜127 と同じものが読み出せる
- セグメント#0〜127はReadOnly、セグメント#128〜255は書き込み可能
図にしたものを以下に示します。
セグメントを前半の0〜127, 後半の128〜255に分け、Readはどちらもできますが、Writeは後半128個にのみ可能になっています。
セグメント#0 と #128 は同じSRAMアドレスを指しており、#128に書き込むと#0のデータも書き換わります。
8bitあるセグメントアドレスの最上位ビット7bit目がWrite信号になっているイメージですね。
ASC2タイプのメガロムコントローラで似非RAMディスクを作る
前項の情報は全てASC1タイプのメガロムコントローラ(LZ93A13)での作り方であり、応用すればASC2などでも作れますよとは書かれているものの、ASC2, 3, 4 での具体的な作り方の情報を見つけることができませんでした。
私が持っているメガロムゲームはASC2(M60002-0125SP)ばかりのため、ASC1用の回路をASC2用に変更する必要があります。
eram_mk.lzh に入っている ERAM-CI.SR7 を変換した画像がこちらです。辻川さん作の似非RAMディスクの回路図です。
128KB SRAMを2つ使う回路になっています。メガコンの/WE80を使っていることがわかります。
つぎに、メガロム解析資料からASC1とASC2を見比べてみます。
LZ93A13
アスキータイプ1(ASC1) 32ピンDIP
+-------__-------+
1|B4 VDD|32 Bn (O):拡張メモリアドレス
2|B3 B5|31 (MA13-MA19になる:8kBモード)
3|B2 B6|30 (MA14-MA20になる:16kBモード)
4|B1 /SLTSL|29
5|B0 /RD|28 /OE.xx-yy:バンクxx-yyへの
6|/WE.80-FF /WR|27 (O) Output Enable
7|/OE.80-FF /RESET|26 /WE.80-FF:バンク80-FFhへの
8|/OE.00-7F SEL|25 (O) Write Enable
9|/OE.40-7F D7|24 (/OE,/WEは/SLTSLがアクティブで
10|/OE.00-3F D6|23 ない時にはアクティブにはならない)
11|A11 D5|22
12|A12 D4|21 SEL (I):Lで16kBモード,Hで8kBモードになる
13|A13 D3|20
14|A14 D2|19
15|A15 D1|18
16|GND D0|17
+----------------+
M60002
アスキータイプ2(ASC2) 42ピンシュリンクパッケージ
+-------__-------+
1|B7 VDD|42 Bn (O):拡張メモリアドレス
2|B6 NC|41 (MA13-MA20になる:8kBモード)
3|B5 /OE|40 (MA14-MA21になる:16kBモード)
4|B4 /SLTSL|39
5|B3 /WAIT|38 /OE (O):全てのバンクへの
6|B2 /M1|37 Output Enable
7|B1 /RD|36 /OEn (O):指定バンクへの
8|B0 /WR|35 Output Enable
9|/OE0 /RESET|34 (/OE類は/SLTSL,/RDがアクティブで
10|/OE1 S2|33 ない時にはアクティブにはならない)
11|/OE2 S1|32
12|/OE3 S0|31 Sn (I):/OEnの範囲設定(後述)
13|D7 /PRE|30
14|D6 /WTE|29 SEL (I):Lで16kBモード,Hで8kBモードになる
15|D0 SEL|28
16|D5 A15|27 /WTE (I):Lでメモリーリードサイクルに1ウェイト入れる
17|D1 A11|26 Hでウェイトを付加しなくなる
18|D4 A12|25
19|D2 A13|24 /PRE (I):Lで/OEnを予測?詳細は不明
20|D3 A14|23 通常はHで使用する
21|GND CLOCK|22
+----------------+
MCTR-ASC.TXTより引用
ASC2のメガコンにはセグメント0x80以降に対する書き込み信号が出力されていません。ASC3, 4も同様です。/WE80 は ASC1 固有の信号のようですので ASC2,3,4ではこの信号を生成する必要があります。
試行錯誤した末にたどり着いた回路がこちら。余っているLS139の1回路分を使ってデコーダを構成しました。
セグメント0x80以降を示すB7がHighで且つ、書き込みの/WRがLowになったときにアサートされるようにしています。
注意点としては、0x6000-0x7FFFのBank1のページを0x80以降に設定してはいけない点です。メガロムコントローラへの指示がそのままSRAMにも書き込まれてしまいます。(こんな指定は普通しないと思いますが)
他の ASC1 と ASC2 の差として、ASC2 は S0-2 端子が増えていますが、こちらはどの設定でも問題ありません。/OE0〜/OE3を使うことはないため、改造前カートリッジの回路の設定のままでOKです。
SEL信号だけは必ず8Kバンクに切り替える必要があります。似非RAMディスクは8Kバンクである必要があるためです。ゲームの種類によっては16Kバンクのものがあるので、必ずチェックしましょう。
回路図全体はこちらです。(パスコンは除いてます)
赤字部分が改造する必要がある部分です。参考までに1MbitROMのピンアサインも載せています。DIPタイプのHM628512であれば大半のピンは差し替えるだけでOKであることがわかります。
HM628512は1個でも2個でも大丈夫です。
麻雀悟空をベースに改造
以下の記事で分解した麻雀悟空がASC2タイプのメガロムゲームだったので、これを似非RAMディスクに改造することにしました。
写真の右側にバッテリバックアップの電池とそのための回路があります。ちゃんと解析すればそのまま流用できそうですが、今回似非RAMディスク作成が初めてということもあり、欲を出さずに、これらの部品は全て取り外しました。
ROMはもちろん、SRAMも不要ですので取り外します。また、ちょうど都合よく74LS139と同じピン数の 74LS138 が載っているので、取り外して74LS139に載せ替えることにしました。
で、改造後の写真がこちら
SRAMのHM628512はSOPタイプのものを買ったので、ROMの位置に秋月のSOP32→DIP32変換基板を設置しました。SRAMは取り除き、74LS138は74LS139に換装しています。元々電池があった場所に電気二重層コンデンサを配置してみました。
74LS139をそのまま載せられたおかげで見た目にもスッキリしています。DIPタイプのHM628512だったらもっとスマートに載せられそうですね。この基板だと改造しやすくてオススメです。
今回はHM628512BLFPを使ったのですが、あわよくば2階建ての亀の子にして1MBにようと思っていたのですが、ケースに収まらないので512kBで断念しました。変換基板の厚みもあるため、変換基板+SRAM1枚でPDIP1個分くらいの高さになってしまうようです。より薄型のHM628512BLTTを使っていれば、2階建てでもケースに収まるかもしれないです。
HM628512は日本では購入が難しかったり高価ですが、AliExpressで安価に入手が可能です。私が購入したのは↓です。私が買った時点では1つ101円でした。安いですね。ちなみに複数の型番がタイトルに入っていますが、届いたのはBLFP-7でした。
(2024/7/12 09:39時点)
薄型のHM628512BLTTも見つけました。こちらも5個で525円なので1MBの似非RAMディスクを作るならこちらが良いかもしれません。
(2024/7/12 09:39時点)
DIPタイプはSOPタイプよりちょっと高くて1個300円くらいしますね。あと個人的なイメージですが、AliExpressの場合DIPタイプは再利用品の可能性があるので、新品が良い方はSOPを選んだほうが良いかもしれません。
(2024/7/12 09:39時点)
Amazonのリンクも貼っておきます。DIPタイプは高いのですが1個400円以上しますね。SOP32でも大きく変わりません。送料考えてもAliExpressの安さが際立ちます。
ウラ面はこんな感じです。変換基板に配線するにはオモテ面を通す必要があるので、配線の大半はオモテ面で、ウラ面は74LS139用の配線が主です。
これだけみるとキレイにできているのですが、ちょっと落とし穴がありまして・・
SOP32→DIP32の変換基板のパッドとピンの幅が合っていません!なんならDIP用のアニュラリングに達してますので、そもそも628512はDIP幅に合わないんですね。
なのでSOJパッケージのようにピンを内側に優しく曲げ直してはんだ付けしました。
ラジオペンチでゆっくり曲げたつもりだったのですが、1本折れてしまいました・・。変換基板にはんだ付けする際にハンダメッキ線で修復してなんとかなりましたが、曲げるときは細心の注意が必要ですね。
動作チェック
自作のカートリッジReader/Writerを使って動作確認をしていきます。
まずは 8k バンクになっているのか確認してみました。0x4000, 0x6000, 0x8000, 0xa000 で同じデータ(セグメント#0)が読み出せることを確認します。
>>> cart.memShow(0x4000,0x20)
4000: c7 5f 7f f5 41 2f 3c 3a 30 7b 78 fe 91 78 9e 70 |._..A/<:0{x..x.p|
4010: 19 47 a5 a5 05 4e ef 23 2f cc eb 1d 4d 38 02 fe |.G...N.#/...M8..|
>>> cart.memShow(0x6000,0x20)
6000: c7 5f 7f f5 41 2f 3c 3a 30 7b 78 fe 91 78 9e 70 |._..A/<:0{x..x.p|
6010: 19 47 a5 a5 05 4e ef 23 2f cc eb 1d 4d 38 02 fe |.G...N.#/...M8..|
>>> cart.memShow(0x8000,0x20)
8000: c7 5f 7f f5 41 2f 3c 3a 30 7b 78 fe 91 78 9e 70 |._..A/<:0{x..x.p|
8010: 19 47 a5 a5 05 4e ef 23 2f cc eb 1d 4d 38 02 fe |.G...N.#/...M8..|
>>> cart.memShow(0xa000,0x20)
a000: c7 5f 7f f5 41 2f 3c 3a 30 7b 78 fe 91 78 9e 70 |._..A/<:0{x..x.p|
a010: 19 47 a5 a5 05 4e ef 23 2f cc eb 1d 4d 38 02 fe |.G...N.#/...M8..|
初期セグメントはどのバンクも0なので同じ値が読めていますね。8kバンク動作になっていそうです。
つづいて、Bank 1 にセグメント#1を選択してダンプしてみます。
>>> cart.memWrite(0x6800,0x1)
>>> cart.memShow(0x6000,0x20)
6000: 77 fc 4d 82 48 ac 6a 51 a2 0f 82 2e d6 cd 9a 43 |w.M.H.jQ.......C|
6010: 3d 52 f1 40 28 f9 58 bc ef fa 9d 30 bc 6c f4 7f |=R.@(.X....0.l..|
データが切り替わりました。
書き込みをテストしてみましょう。セグメント#0に書いてみます。0x4000に0x00と0xffを書き込んでみました。
>>> cart.memWrite(0x6000,0x0)
>>> cart.memShow(0x4000,0x10)
4000: c7 5f 7f f5 41 2f 3c 3a 30 7b 78 fe 91 78 9e 70 |._..A/<:0{x..x.p|
>>> cart.memWrite(0x4000,0x0)
>>> cart.memShow(0x4000,0x10)
4000: c7 5f 7f f5 41 2f 3c 3a 30 7b 78 fe 91 78 9e 70 |._..A/<:0{x..x.p|
>>> cart.memWrite(0x4000,0xff)
>>> cart.memShow(0x4000,0x10)
4000: c7 5f 7f f5 41 2f 3c 3a 30 7b 78 fe 91 78 9e 70 |._..A/<:0{x..x.p|
読み出しても値が変わりません。ROM化されていそうです。
続いてセグメント#128に書いてみます。
>>> cart.memWrite(0x6000,0x80)
>>> cart.memShow(0x4000,0x10)
4000: c7 5f 7f f5 41 2f 3c 3a 30 7b 78 fe 91 78 9e 70 |._..A/<:0{x..x.p|
>>> cart.memWrite(0x4000,0xff)
>>> cart.memShow(0x4000,0x10)
4000: ff 5f 7f f5 41 2f 3c 3a 30 7b 78 fe 91 78 9e 70 |._..A/<:0{x..x.p|
読み出すとセグメント#0と同じデータであることがわかります。0xffを書き込むと値が変化しています。セグメント#128以降に切り替えることで書き込み可能になっていることがわかります。
基本的な動作は確認できたのでメモリテストプログラムを組んでチェックしてみたところ、全セグメント読み書きできることが確認できました。
次回に続く
長くなってきたのでこの記事ではHWの作成までにします。次回は似非RAMディスクにイメージをインストールしてRAMディスクとして使うまでを書こうと思います。