|
FM TOWNS用32kB FRAMメモリカードの回路図、PCBなどは↓
https://github.com/captainys/FM/tree/master/TOWNS/KiCAD/FRAMCard
Towns OSから32KB FRAMメモリカードにIPLを書き込むプログラムは↓
https://github.com/captainys/FM/tree/master/TOWNS/IPL/TOWNSOS
あるいは、他のPCMCIA搭載DOSマシンから直接イメージを書き込める人は↓のICMIMAGE.BINを書き込んでも可。
https://github.com/captainys/FM/tree/master/TOWNS/IPL/DISKIMG
FM TOWNS救済用ICメモリカードの製作プロジェクト。これまでに、FM TOWNS実機救済用IPLの成功によって、初代 model1/2、二代目2F、三代目20F、386SXモデルを除くFM TOWNSモデルは、内蔵CD-ROMドライブとフロッピーディスクドライブが両方故障してしまったという絶望的な状況であっても、その他が生きていれば、外付けSCSI CD-ROMドライブを接続することができれば本体無改造で起動する道が開けた。仮にフロッピーディスクドライブが生きているとしても、最近フロッピーディスクをフォーマットすること自体が難しくなってきていたが、Towns OSを起動することで本体からフォーマットできる。自分としてはFM TOWNS本体の動態保存にとって救済IPLは結構成功だと思ってる。
しかし、まだすべてのモデルを救済できるわけではない。386SXモデルの救済は起動の仕組みがまったく違うので不可能で起動FDを作ってCONFIG.SYSからYSSCSICD.SYSを組み込む以外の方法は無いが、それ以外の386DXモデルをなんとかしたい。その唯一の方法として考えられたのが、おそらくTOWNSユーザのうちほとんど誰もその存在すら気が付かなかったと思われるICメモリカードを利用する方法だった。このICメモリカードは、その後PCMCIAカードと呼ばれるようになるインターフェースで2000年前後のラップトップPCでは良く使ったインターフェースだった。TOWNSのインターフェースは同じコネクタだが、PCMCIAインターフェースのかなり初期の仕様しか満たしていないため、用途は限定される。しかし、なんとTOWNSはICメモリカードから起動することができた。エミュレータ津軽上では既にシステムROMはICメモリカードからIPLを読み込んで実行することまでは確認済みだった。
しかし、ICメモリカードは今はほとんど入手が不可能。実験することができなかったので、救済IPLのICメモリカード対応は見送っていた。なのだが、 FMTowns情報掲示板で、津軽ユーザでありかつ実機ユーザの方がICメモリカードを持っているとのこと。試しに救済IPLのICメモリカード版を作ってみたところ、起動に成功したとの報告があった。
だったら正式にICメモリカード用のIPLも作ろう、これによって初代(ただしSCSIカードが必要)、二代目、三代目モデルも救済できるのではないか。だとしても、既存のメモリカードに依存するのではそもそもSCSI CDドライブよりもICメモリカードの方が入手が難しい。バックアップバッテリー問題は残る。しかもIPLを書き込むためにTOWNSを起動しなくてはならない。鶏と卵だった。では、自作できないか?つい最近までPCMCIA用コネクタが見つからなかった。なんで見つからなかったのかさっぱりわからないのだが、一度見つけてしまったら普通に売ってることがわかった。
コネクタは手に入る。しかし、ではどういう回路にすればいいのか。そのヒントはFM TOWNS Discordから得ることができた。なんと当時NeoGeoが同じメモリカードを使っていたとのこと。そして、それをオープンソースで回路図を公開してくれている人がいた。NeoMemCard2。これを見ると、実に単純にアドレスバスとデータバスをRAMチップにつなぐだけのようだ。
しかし、この回路図を見て謎が発生。FM TOWNSのメモリマップを見ると、JEIDA4規格のカードは物理C2000000h、それ以前の起動可能なカードは物理C0000000hからにマップされるとある。エミュレータによる解析でシステムROMはJEIDA3エリアからIPLを読むことがわかっていた。ではどうやってJEIDA3、JEIDA4を判定しているのか? JEIDA3、JEIDA4を区別するピンはPCMCIAの規格を見た限り存在しない。それらしいプロトコルもわからない。また、ICメモリカードは16ビットのデータバスと26ビットのアドレスバスが出ている。各アドレスに16ビットのデータがあるのであれば、合計128MBの容量をサポートできる計算になる。あるいは、各アドレスに8ビットのデータが割り当てられていて、ふたつの連続するアドレスのデータを同時に読み書きできるのであれば合計64MBまでサポートできることになる。果たしてどちらなのか?
それは、ICメモリカードによる実機での起動テストをしてくれた津軽ユーザの方からの実験によってかなり明らかになった。実は、JEIDA4対応のTOWNSではJEIDA3/JEIDA4関係なくどっちも最初の16MBがC0000000h~に出ているらしい。津軽上でJEIDA4から起動できなかったのは、僕がJEIDA4カードはC2000000hにしか出ていないものと思って実装していたからで、実際はどっちでも可能のようだ。 また、アクセスはどうやら各アドレス8ビットで、しかも奇数アドレスからの読み込みには結構複雑なことをしているらしい。FM-R用にICメモリカードで発売された「アシストパック」という製品はどうやら奇数アドレスからの読み込みに対応していないらしく、偶数アドレスから2バイト単位で読み込む場合のみデータを読み取ることができたらしい。 FM TOWNSの場合、Disk BIOSを使ってICメモリカードを読み書きすることができるが、Disk BIOSは必ず偶数アドレスというか4バイト境界をまたがず32ビットで読み書きする。ということは、ICメモリカードとCPUの間になんらかのロジックが挟まっていることになる。奇数アドレスからの8ビットアクセスはそもそも8ビットデータバスしか持たないコンピュータ用のものとのことなのでFM TOWNSではおそらくその心配は無い。
ということで、SRAMを使った試作品を作ることにした。ということで、部品の発注だがSRAMなどはどうやら標準的なチップになっているのでいいとして、PCMCIAコネクタ。以前探したときはまったく見つからなかったのに、今探したらいくつか見つかる。日頃DigiKeyを使うので、このコネクタを発注した。
なのだが、発注した後で、データシートを見たら、基盤の厚さは0.4~0.5mm推奨。ん?下のイメージのカード幅が91ピクセルで2.7mm。ピン間隔は29ピクセルだから0.86mmぐらいあるのかと思ったのに。ちょっとこれひどくない?
日頃使ってるPCB作成サービスのOSH Parkでは、1.6mm, 0.8mm, 0.2mmのうちどれかしか選べない。0.2mmのは曲げられる基盤ということで、ハンダ付けしても大丈夫なことになっているが、ちょっと抵抗がある。というと、ピンを曲げるしかない。1.27mm間隔のピンがすべて平行なまま曲げるにはどうすればいいか?ふふん、(一応)機械工学博士の僕を甘く見てもらっては困る。と、コネクタに恐怖を与えながら、次の図のように、まず薄い銅板を使って片側のピンを外側に曲げる。ここまでは簡単。だけど、ピンの先が基盤に接してくれないとはんだ付けできないので、今度は直径1mmの針金をピンとピンの間に挟み、万力で平行に曲げる。
ということで、無事ピン間隔調整手術成功。多分成功したと思う。下の写真の左が手術後、右が手術前。こういう加工をすると心配なのは、ピンがちぎれてコネクタがスロットから出てこなくなったらどうする?ということだが、これはプロトタイプでPCMCIA延長カードの先につけるだけだからそういう心配はない。そもそも28-pin DIPのチップを乗せるからスロットに入らない。
ちなみに、こういうのは発注した後でもっといいやつが見つかるもので、mouserで逆差し防止のノッチ付きのやつ売ってた。一応、正式版(?)に備えてこのコネクタも発注したけど。
救済IPLの起動まで確認できるようにバックアップバッテリーまで加えた回路図その他は↓。現在、PCBを発注してできてくるのを待っている。
[プロトタイプ 1]OSHParkからPCB到着。そして、ソケットその他実装してみた。表面マウントというのは初めてだったんだけど、なんとかなるもんだね。
しかし、ICをソケットに刺そうと思ったらサイズ間違ってた!何も考えずにi8251と同じサイズにしてしまった!
仕方ないので、ブレッドボードにICを乗せて、線をつなぐことに。
そして、ショートなど無いことをテスタで確認して、我がTOWNS II MX本体に接続!電源を入れた!ひとまず煙は吹かなかった!
あらかじめ書いてあった物理メモリアドレスへの書き込みプログラムで、試しにAUTOEXEC.BATを書き込み、それを物理メモリアドレスからの読み込みプログラムでダンプしてみるものの、内容が崩れてしまう。どうも、最初の数バイトは読み込むのだが、12バイト目ぐらいから怪しくなって、途中から完全に意味のないデータになる。
しかし、C000000H~ダンプを取るとC000000CHぐらいまでは正しい値が見えるが、C0000010H~ダンプを撮ると、C000001CHぐらいまでは正しい値が見える。どうやら書き込みはできている。
苗床のような配線がノイズを拾ってしまうのだろうか?そうであれば、書き込みも失敗するのではないか?それとも、本質的にSRAMのスピードがついていっていないのか?そこで、試しに一度読み込むたびにウェイトを入れるコードを書いてダンプを取ったところ、正常に読み込むことができる。
スピードの問題だとすれば、TOWNSを「互換モード」に設定して速度を386DX 16MHz相当にスピードを落とせば読み込みに失敗しなくなるのではないか?といこうことで、試したところ、今度はウェイトを入れても入れなくてもほとんどのバイトの値が読み込むと変な値になる。しかし、書き込みはできているようだ。互換モードで書き込んで、「高速モード」に変更してウェイトつきで読み込むと正常な値が出てくる。
なお、リセットしても値は保存するようだった。リセット時に一瞬電源が切れて値が変わってしまうということは無いようだ。そうであれば、起動の実験にはバックアップバッテリーの実装は必要ない。
というところで、ふと失敗に備えて別のSRAMを買ってあったことを思い出す。そっちを見たら、幅広の28ピンDIPだった!これならソケットにはまる。ということで、ICを載せ替えて再度実験。
今度は書き込みも読み込みも正常なようだ。書き込みプログラムがバグっていて256バイトごとに3バイトの余計なデータを書き込んでいたけど、それは修正して、試しにAUTOEXEC.BATを書き込んで読み込むと、正しく書けて読めることがわかった。そこで、IC Memory Card用IPLを書き込んでI,C,Mキーを押しながらリセット。果たして起動するか?
結果、残念ながら起動しなかった。何故なのか?果たして本当に正しくバイナリは書き込めていたのか?そこで、物理メモリアドレスから読み込んで、書き込んだファイルの内容と比較するプログラムを書く。結果、やっぱり正しく書けていなかった。原因は不明だが、0を連続して書き込むとほぼ確実にどこかでビット6が反転して40Hが発生する。
今度は読み込みは大丈夫のようだ。書き込みさえ正常にできれば起動するのではないか?ならば、書き込むときにウェイトを入れてみてはどうか?と、思って書き込み時にウェイトを入れたところ、書き込み内容と比較結果が一致するようになった。今度は起動するか?
まだ起動しない。どうやらSYSTEM ROMから読み込んだときは内容が壊れてしまう。根本的にバイナリが壊れてしまう場合もあれば、最初、「IC MEMORY CARD BOOT」と出るべきところが、「IC MEMORY CAR@ BOKT」になったり、「IC MEIORY CARD BOOT」になったりする。どうも傾向として4N+2バイト目のビット3が1から0になってしまうことが多いようだ。
メモリチップの問題か?ということで、U1とU2を入れ替えてみる。データの壊れ方は変わったが、やっぱり壊れる。
一体どういうレベルで壊れているのか?それをテストするための専用IPLを書いて実験してみたところ、 傾向として2N+2バイト目のビット3が壊れることが多いようだが、そうとは限らない。ロジックアナライザを展開するスペースさえあれば何が起きてるかわかるのに!
ひとつひっかっていたのは、バッテリーバックアップのためのプルアップ抵抗だった。カードが本体から引き抜かれて、~CE1, ~CE2が結線無しになったとき、~CE1, ~CE2をHIにすることで、誤ってRAMの内容が変わってしまわないようにする。一般的にはプルアップ抵抗は4.7Kオーム、とどこかで読んだので、そのまま4.7Kオームの抵抗を選んだのだが、パナソニックのSRAMカードのデータシートを見ると20Kオームと出ている。
仮説としてプロアップ抵抗が小さすぎて、読み書き時に~CE1, ~CE2がはっきりゼロにならない、あるいは、ゼロに落ちにくいので連続読み書き時に失敗していたのではないか?という仮説を元に、プルアップ抵抗を試しに切ってみる。
結果、プルアップ抵抗があったときより状況悪化。しかし、妙なことに、ファイルを読みながら内容比較をするときだけは普通に読めるようだ。まったく比較に失敗しないのに、ダンプを取るとウェイトを入れようが入れまいがどこか壊れた値が出てくる。
プルアップ抵抗によって結果が変わることはわかった。はたして4.7Kオームの抵抗で正しいのか?
と、こういうとき、困ると何人か非常に頼りになる知り合いが何名かいる。今回も、聞いてみた。即座に帰ってきた答えは、電圧が突然ドロップしていないか確認した方がいい。とのこと。一応、SRAMチップのVccとGNDのピン間の電圧はテストコンディションで4.5Vと確認していた。ロジックアナライザが使えれば電圧の瞬間的ドロップをとらえられるのに、と、思ったが、うちのアパートは狭くて展開できない。アナライザはあるのに。しかし、確実に起動に失敗するということは起動中の電圧を見よう、と、思って、テスタをつなげたままリセットすると、なんと!リセットしてから起動までの間、電圧が3.6Vまで降下している!これは瞬間的に落ちるのではなく、テスタに継続的に出てきている値だから、平均が3.6V。これは低すぎる。
そこで、どうせテスト用のSRAMであってバッテリーバックアップは無くてもいいので、試しにD1をショートさせて直結。R1,R2のプルアップ抵抗は無し。D2もバッテリー用だから実装しない。という、ただの32KBのRAMモジュールにしたバージョンを作ってみた。そのSRAMにIC Memory Card用IPLを書き込んで、I,C,Mキーを押しながらリセットすると。。。。
大成功!!!!IC Memory Card用IPLからSCSI CDドライブのVisitorを起動できた!!!!
ダイオード、大体0.3Vの電圧だろうと思ってたけど、実のところどうなんだろう?適当に手元にあったBAW27を使ったのだが、たしか、赤外線エミッタの定電流回路で使ったときは、ひとつあたり0.3V落ちる仮定で、それに合うように抵抗を決めるんだったっけ。SRAMカードの場合、ICの消費電力に見合うかどうかだったか。えーと、SRAMのデータシートを見ると、消費電力は、ピークで150mA!?SRAMってそんなに電力食うんかい! ふたつだから300mA。BAW27のデータシートによると、IF=200mAで1000mV、IF=400mAで1250mV。ということは、1V~1.25Vの間か。それだと、4V切ることになるな。。。。それは、だめだ。
とにかく、これによって単純にTownsのPCMCIAインターフェースにSRAMをつなぐだけで読み書きできるということがわかった。問題はスピード。TOWNS起動用カードをFRAMで制作しようと思っているのだが、アクセススピードが早く無い。しかし、当時のPCMCIAメモリカードの仕様を見ると、結構アクセススピードが200nsとかいう遅いのが多いにもかかわらず、シンクロナイズのためのピンが出ていない。ということは、TOWNSは割と余裕を持って読み書きするはず。そうであればFRAMで対応できそうな気がする。とにかく、作ってみよう。
なお、下は実験に使ったPCMCIAエクステンダーにSRAMカード(成功した方)を装着した図。
ついに、PCB、部品その他すべて届く。前回はコネクタ以外は普通の貫通穴マウントだったが、今回は本体のメモリカードスロットに収納できるものを作るために、すべての部品が表面マウント。小さな抵抗、コンデンサ、ICなどをはんだ付けする必要があって、前回より難しい。
まだ指先がプルプル震えるほどの年では無いが、手元に焦点が合わない。幸運なことに、僕はまったく遠くを見る視力は衰えていない。が、だんだん近くが見えなくなってきた。眼科検診のとき、保険適用で無料だからというので老眼鏡をくれたのだが、いまいち合ってないというかかけても近くがそれほど見やすくならない。という状況で今回多用したのが、↓
ピンホールメガネ。理屈は簡単で、カメラのF値を高くして絞ることで被写界深度を深くする。理屈はわかるとはいえ、こんなので効果あるの?と半信半疑だったのだが、友達がいらないからというのでくれたピンホールメガネを使ってみたら、なんと、至近距離まで見える。被写界深度を上げるわけだから遠くのものも普通に見える。これ、老眼鏡を超えてない? ということで、新たな視力を手にした僕は、果敢に表面マウントに挑んだ!
始める前に、PCMCIAコネクタが1.6mm厚のPCBを想定していたが、今回FRAMチップを乗せても確実にスロットに入るように、0.8mm厚PCBを発注した。その分、ピンとピンの間を狭くする必要があった。ここで、期限切れのクレジットカードが役に立つ。ちょうどいい幅にカットして、上からギューと押してピンを平行に曲げることに成功。クレジットカードはそこそこ固くて割と簡単にカッターで切れるので、この用途には適していた。
次に部品のはんだ付け。まず、パッドに予備ハンダ。薄くしたいのだが、結構多めに盛り上がってしまった。
まあ、それは仕方ないので、ピンホールメガネを装備して、ICの対角ピンを仮止めする。
なんとかなるもんだね。その後他の小さな部品もはんだ付けして、仮止めも本止めにして、コネクタ。問題はどうやってコネクタをまっすぐハンダ付けするか。1.6mm厚のPCBがちょうど刺さるような幅に0.8mm厚のPCBを入れると当然隙間が空くから、まっすぐにならない。ここでも期限切れクレジットカードが活躍。なんと、期限切れクレジットカードはちょうど0.8mm厚だった!端を細く切って、コネクタのスロットの両端に差し込んで合計1.6mmにする。これによってPCBをコネクタに対してまっすぐ固定することができる。
完成!
GNDと+5Vが直結してないかテスタで確認して、まずはPCMCIAエクステンダ経由で本体の外に取り付けてみる。
そして、電源投入!
どうもLEDの選択を誤ったらしく、明るい!明るすぎる!LED発注した後でわかったんだけど、LED Lighting と LED Indication と二種類あったらしく、僕は何も考えずに Lighting (照明用) LEDを選んでしまったらしい!が、さすがLEDだけに熱くならないからまあいいや。
コマンドモードに降りて、前回作ってあったメモリ書き込みプログラムで書き込んだところ、大成功!IPLを書き込んで、起動にも成功!次に、電源をいったん切る。これで内容を忘れてしまったら意味が無いが、I,C,Mキーを押しながら電源投入。そして、メモリカードからの起動に成功!FRAMカードは完全に動作した!老眼対表面対決の勝負は老眼の勝利に終わった!
直後に画面写真撮らなかったもんだから、この画面は撮りなおしたやつ次に、本体内に収納した状態で起動してみた。明るい。
光が漏れてくるレベル光が漏れる問題はあるが、本体への収納にも成功。ちなみに、本体に収納して、さらにクレジットカードが入るだけの隙間があった。ということは、1.6mm厚のPCBでも大丈夫ということだ。
そして、最後のチェックはFM TOWNS 2Fにこのメモリカードが刺さるかということ。これも、収納できて起動に成功した。同様にクレジットカードが入るだけの隙間がある。
ただ、2枚試作したのだが、1枚は刺さらなかった。どうやってコネクタのピンをカバーしようかと思って、一枚は光硬化樹脂(↓のBONDIC)で固めてみたのだが、厚くなりすぎたらしい。どうやら下面の厚さには注意する必要があるようだ。
この成功は大きい。これまで、初代、二代目、三代目FM TOWNSは、SCSI CDドライブからの直接起動ができないので、フロッピーディスクドライブと内蔵CDドライブが両方故障してしまうと手も足も出なかったが、FRAMカードから起動することによって、ある程度のソフトウェアはFRAMカードのIPL経由で起動できることがわかった。(初代機はSCSIカードが必要)。まだディスクドライブなどが壊れてしまったFM TOWNSが残っていたら、捨てるのはちょっと待って欲しい。まだ起動してゲームを走らせることができるかもしれない。
Comments are welcome. Send E-Mail to: |