それは突然の出来事でした。Hashi さんのページで発表された、BELUGA mkII というゲーム。Windows 用なのに、画面は P6 そのものの 4 色グラフィック!作者はなんと、T.Matsushima 氏!言わずと知れた、伝説のプログラマー。
私にとっても、T.Matsushima 氏のタイニーゼビウス、タイニーゼビウス mkII は、とても思い出深いゲームです。当時、P6 ユーザーで持っていない人は殆どいなかったのでは?
そんな、憧れの T.Matsushima 氏が、今度は P6 でゲームを作られていると言います。これは期待しないわけには行きません!56K バイトの膨大なプログラムを、カセットでピーガーッとロードするのも風流ですが、現代人には、ちとキツいか(笑)?
それで、カセットポンのロムカートリッジで遊べる様にしてみましょう、というお話があり、私も少し協力出来ないかな、と思った次第であります。いやー、ワクワクするなぁ(笑)。
間違いのあるまま突っ走るといけないので、ここに私の進捗を書いて行く事にします。皆さんのご教授、よろしくお願いいたします。
しばらく研究しておりましたシルクスクリーン印刷によるプリント基板を、ベルーガに適用してみました。 ようやく、ベルーガの基板程度の微細さのパターンが実現出来る様になったのです。 これまで基板にコストがかかりすぎていたのですが、これで少し楽になりました。
それから、ケースの型が壊れてしまったので、作り直しました。形状が今までと異なっています。
まず、木で元になる型を作ります。ROM の頭が出っ張っているので、ケースの端を出っ張らせてあります。
木型をもとに、反転型を作ります。木型を適当な箱に入れて、シリコンゴムを流し入れて作ります。
手前は、テスト用に流してみた樹脂です。
反転型に樹脂を流し入れて成形します。ウレタン樹脂に発泡防止剤を入れてあります。
中型を抜くために、樹脂を切り、ROM 穴を開けます。理由は後述。
プラ版で背表紙を作ってボンドで貼り、表面を整えて塗装して出来上がり。 このように ROM を上から差し込む事により、同時に基板も固定される仕組みです。
裏はこんな感じ&ラベルを貼ったところ。
一体成形ではありませんが、それでも木製のケースよりは遥かに強度があります。
この期に及んで、両面プリント基板に挑戦しました。 授業料が少々かかりましたが、ようやく一枚出来ました。 ノウハウは沢山ありすぎて書けません。
見た目は奇麗です。 ガラスエポキシであること、端子部を一体化したことで、 強度はかなり増しています。 前よりずっと壊れにくいと思います。 限界までコンパクションして、少し小型になっています。
動かすのは相変わらず大変です。 IC を外したり付けたり、かなり試行錯誤しました。 バグは全て、パターンのミクロのブリッジ&切れでした。 手作りなので完璧は不可能です。
コストアップは 700 円ほど(基板の失敗率を考慮して)、安くはないです。 でも、広く P6 の ROM カートリッジとして使用できると思います。
回路を変更しました。
http://www7b.biglobe.ne.jp/~tulip-house/digital/BELUGA/
6000-7FFF の RAM1 の部分のライトプロテクトを出来るようにしました。これは、mkII 以降で使用時に、内部 RAM と独立して RAM1 を使える様にするためです。SD カードリーダの将来の拡張のためのハード変更です。
ところが。。。
これまでのカートリッジ8個を、パターンカット&配線でリワークしたのですが、これが死ぬ程大変でした。そして、この8個の欠点が明らかになりました。
最初の7個は、プリント基板の裏面を 0.55 mm の固めの銅線で配線してあるのですが、プリント基板のパターンが細かいため、いじっているとパターンが切れてランドが浮いてしまうのです。しかもこの欠陥は、見た目ではほとんどわからないので、発見するのが大変なのです。。。突然動かなくなって、原因がわからなくて途方に暮れてしまう事がかなりの頻度であったのです。
オークション用の1個は、0.28 mm の柔らかい銅線を2本パラにして配線してあるのですが、配線が楽なだけではなく、このようなランド浮きが起こりにくいという長所があることがわかりました。残念なのは、カートリッジの端子への配線だけ固い銅線を使ってあることです。正規品は全て 0.28 mm の銅線で行く事にします。
最初の7個は関係者用のカートリッジですが、もし ROM の抜き差しをして色々応用しようと言う方は、できれば正規品を買って下さい。正規品の方が遥かに壊れにくくなりそうです。
ベルーガのカートリッジの HP を作りました。まだ公式には非公開です。
markn さんの Joystick-SD カードアダプタのブートローダを ROM に忍ばせる事になりました。
ただ今、markn さんが頑張って作ってくれています。
http://www7b.biglobe.ne.jp/~tulip-house/digital/BELUGA/
暖かくなってきましたね。皆さん、いかがお過ごしでしょうか?
私は、ようやく冬眠から覚め、体が少しずつ動く様になりました。
さて、進捗ですが、カートリッジのハードは7台出来ています。
そのうち、出来の悪い一台はワタクシ用なので、6台ですか。
ただ、プログラムの方がまだ fix していないので、テスト用以外の ROM は焼いていません。
それから、Beluga のためだけではないのですが、USB 接続で手軽に各種 ROM を焼ける ROM ライタを作りました。
これは西田ラヂオから発売予定です(ちゃっかり宣伝)。
元気になってきたので、ようやく作業再開!
今日はプリント基板を4枚作りました。一枚毎に、上手くなります。
最初の頃は修正だらけの基板でしたが、今は修正が少なくなりました。
それでもゼロにするのはなかなか難しいのです。
修正だらけの基板に当たった方は、ごめんなさい(笑)。
ケースは木製です。細い木を繋ぎあわせてあるので、あまり美しくありません。色はアイボリーです。
横のネジを外すと、基板を取り出せます。ROM の差し替えができます。
塗装はあまり美しくないけど、手作りなのでこのくらいでご勘弁を。。。
余暇のほとんどをベルーガにつぎ込んでいます、ワタクシ。。。
さて、カートリッジ版の試作バイナリに、T.Matsushima さんが嬉しい仕掛けをしてくれました。NISHIDA RADIO PRESENTS MEGA-SYSTEM6000 だって!ありがとう、T.Matsushima さん!
ソフトの検証は ゆみたろ さんに任せた、と思ってハンダ付けしてたら火傷しました。。。ソフトもちゃんと見ろという事?というわけで、ソフトを少し見てみました。
キャラ化けの原因は、テープ版とカートリッジ版では、キャラの格納アドレスが違うからだと思います。z80vdp60 の set_rom_cg12 / cg1 / cg2 内で、SET 6,D; RES 5,D を追加して補正してやると化けなくなります。
タイトルの (C) も化けるのですが、同じ理由です。z80ma60 の call set_rom_cg2 を、LD B,8 の後に移動すると直ります。
set_rom_32 内のメモリ設定は、LD A,71H のままで OK です。
あと、画面の左右の端にゴミが残ります。これはよくわからなかったです。z80eshot の check_eshot_maphit の CP 2 を CP 4 にしたりすると、左端だけ直ります。。。
ところでワタクシは Mac ユーザなので、再ビルド環境が無いんです(涙)。隙間を探してコードを詰め込んで実験してました(笑)。
今日はハードの方でも進捗がありました。実は mkII では、RAM は全て本体内のものを使おうと思っていたのですが、何と、本体内の RAM は 16 キロバイト単位でしかアサインできないのです。。。つまり、4000-5FFF が ROM で、6000-7FFF が RAM、というわけにはいかないのです。仕方なくハードを少し改造し、mkII では、6000 - 7FFF だけをカートリッジの SRAM にすることにしました。SRAM の OE に、DRD と RD の or が入っていますが、これを DRD と CS3 の or にします。そしてスイッチを取っ払ってショートさせてしまいます。これで、スイッチ切り替えなしで、初代機と mkII 以降で共用できるのです。つまり、mkII では、RAS and EXCAS は、(外部RAMを使わないならば)常にインアクティブです。そして CS3 は、対応する外部 ROM のリード時のみにアクティブになります。この信号は、ゆみたろさんに調べて頂いたように、アドレスデコード結果とメモリリード信号から作られていますから、これを SRAM の OE に突っ込めば、内部のメモリとぶつかる心配をしなくてもいいのです。mkII では、DRD も常にインアクティブです。そして、6000 - 7FFF に書き込みをすると、常に SRAM に書かれます。同時に内部 RAM にも書かれるでしょう。
mkII でもカセットポン出来ました!ただ、のり さんもおっしゃっているように、動きがギクシャクします。初代機は結構滑らかに動くのですが。。。
まずは、試作第二号から。結局、技術的な問題やコスト面を考え、片面プリント基板でやることにしました。真ん中の小さいチップが 256K ビットの SRAM、上の大きいチップがメガロム (1M ビット) です。
焼いたデータは、T.Matsushima さんの ROM 版のデータを殆どそのまま使っています。一点だけ修正しています。最初のプログラム転送時 (LDIR) に割り込みを禁止しました。
そして、いよいよ起動!う、動いたっ!でも、キャラがバケバケだ。。。
ゲームは普通にできるようです!スクリーン4も OK。
気になった点は、やや音が歪むことでしょうか?エミュでは、奇麗に鳴っているのですが。
キャラ化けは、暫定的にメガロムに対応したエミュ (Cocoa iP6) でも、同じ様に発生します。
また、SRAM をオフにしても、mkII では動かないようです。
ソースを少し見ているのですが、キャラ化けの原因がよくわかりません。プログラムが高度すぎて(笑)。。。 エミュ開発者の方で、メガロム対応されるかたは、原因究明にご協力頂けると嬉しいです。
それから、全然関係ない話ですが、スーファミ本体を開けられる特殊なドライバーをお持ちの方、お貸し頂ければ嬉しいです。SRAM をスーファミから取るので(笑)。また、フラットパッケージの 256K の SRAM をお持ちの方、お譲り頂けると有り難いです。ジャンクでも何でも構いません。
第一号試作しました(キタナクてすみません)。とりあえず、簡単なテストでは正しく動いているようです。
最終的な回路は、以下の様になりました。簡単な仕様も書いてあります。各エミュレータ作者さんは参考にしてください。T.Matsushima さんがエミュでテスト出来るように対応して頂けると嬉しいです。
今回のプリント基板は、西田ラヂオ的には限界に近い(笑)微細さなので、心配していましたが、なんとか上手く出来そうです。ケースは、木の薄い板とプラスチック版で作ろうと思っています。以前作った、ROM / RAM カートリッジの短い版のようになるはずです↓。ラベルは天丸さんですか???
最後に、皆さんにお願いです。ご存知の方も多いと思いますが、僕は精神の病気を持っているので、突然何もできなくなり、3日ぐらい寝込んだりすることもあります。そのため、納期や期日を守れないことが多いですが、何卒、ご理解下さるよう、お願いいたします。
ゆみたろさんから、重要な事柄をご指摘頂きました。ありがとうございます!
【CS3はREAD時のみ有効】
なるほど〜。そうか、仕方ないので、アドレスをデコードし、SRAM のチップイネーブルを作りました。そうすると mkII 以降で信号がぶつかるので、mkII 以降ではジャンパー線を変更する事にしました。
【CASは内部RAMと外部RAMで共用している】
ゆみたろさんのご指摘どおりに、RAS と CAS の AND (負論理)を使う様にしました。
その他、SRAM の OE を、DRD と RD の OR(負論理)に訂正しました。
ゲート数削減のため、IO ポートアドレスのデコーダ 74LS139 をシリアルに接続しました。
これで、SRAM、メガ ROM の他に、TTL が 5 個になりました。基板のサイズは 75mm x 100 mm になんとか収めてますが、手作り基板にしてはかなり細かいパターンになってしまいました。露光を完璧にしなければならないでしょう。
ゆみたろさん、ありがとうございました。
以下が、T.Matsushima 氏の要求仕様です。
0000h-2000h basic rom only 確か初代機はここにバンクが無い?
2000h-4000h basic rom only 同上
-----------------------------
4000h-6000h extend bank rom 8K×6バンクあれば全部乗ります。
6000h-8000h extend ram ここがRAMである事が必須。ここがキツイ。
8000h-a000h extend ram 拡張RAM16KB
a000h-c000h extend ram 同上
-----------------------------
c000h-e000h main ram 内蔵RAM16KB
e000h-ffffh main ram 同上
要は、PC-6006 同様の 16KB の RAM に加え、8KB (4000-5FFF) の ROM1 をバンク切替で 6 ページ用意、 さらに 8KB の ROM2 の空間 (6000-7FFF) を RAM にせよ、との事です。
正攻法で行けば、16KB の RAM は DRAM で、8KB の RAM は SRAM で、となるのでしょうが、二つの RAM を載せるのは、ちょいと無駄のような気がします。
P6 では、外付けのメモリは DRAM を使う様に設計されています。でもこれを SRAM で出来れば都合が良いです。早速、P6 に SRAM を繋ぐ実験をしたら、あっさり繋がりますね(笑)。
アドレスをデコードしてチップイネーブル信号を作るのが本当ですが、そうすると mkII にカートリッジを突っ込んだ時に、本体内蔵 RAM と信号がぶつかってしまいます。幸い、DRAM 用の RAS / CAS 信号が、教科書通りの信号のようなので、これをそのままチップイネーブルにしても動作するようです。 RAS は DRAM リフレッシュでもアクティブになるので CAS を使いましたが、どちらでも問題なく動作しました。アドレスデコード回路も不要です。
というわけで、回路を考えてみました。 さて、正しく動くのでしょうか?