SASIバス用CompactFlashアダプタ
当世ハードディスクのI/FはSATAかIDE(ATA)というのが常識。でも昔はそうではありませんでした。1984年頃から5年くらいの間、ハードディスクはSASIで接続するのが当たり前だったのです。
SASI(Sugart Assosiation System Interface)はその名の通りシュガートというHDDメーカーによって開発されたI/Fで、同社によってフロッピーI/Fを拡張する形でかつて開発されたST-506というHDDのI/Fが5Mbit/secという「高速」なものだったためにサポートするサードパーティーが少ないことを解決するため、「同期転送するST-506」を「ハンドシェーク転送するSASI」で経由するようにしたものです。
HDDが世に出てきたあたりの時期は標準と言えるI/FがなくST-506やST-412HP、ESDIなど乱立気味だったのですが、日本ではNECがPC-9801シリーズにSASIを採用したことでサードパーティーも追随し、標準となりました。
シャープのパソコンは初のHDDサポートモデルであるMZ-6500でST-506を採用したものの、X1turboとMZ-2500/2800、X68000ではPC-9801と同仕様のSASIを採用してエンドユーザの世界を広げてくれました。X1turboにはI/O誌が読者投稿としてI/Fが掲載されたりもしました。
…が。SASIの時代が過ぎてSCSI全盛となると、純正でSCSI
I/Fが用意されたX68000はともかくとして、X1turboとMZではなまじっかシステムレベルでサポートされていたがゆえにSCSIへの移行は余りに高いハードルとなってしまいました(まぁMZ-2800の場合はデバイスドライバの追加でSCSIボードを動かせる拡張性はあったのですけど)。今までそれをどうにかして乗り越える方法をずっと考えてきたのですが、ある時ふっと逆のアプローチがあることに気づいたのです。
その思いつきから完成までの道のりを、日記形式でレポートします。といってもどのページも日記みたいなんですけど、日記そのものはつけない主義ですし(続かないから)、今回はたまたまその期間が短かったためにだいたいの日付まで憶えていたのでこのような形になりました。まぁとくとご覧あれ。
2001年7月初頭・思いつく
ある日、私は知人から譲ってもらえることになった2台のMZ-2500に思いを馳せていました。というのも、そのうちの1台にはHDD I/F(MZ-1E30)がついているからです。8bitパソコンとしては数少ない「公式にHDDがサポートされたマシン」として、つながるものならつないで使いたい。でもなぁ、この期に及んで中古といえどもSASIのHDDを入手するのは難しいというより不可能に近い。手持ちにおそらくもう動かないドライブがある(X68000PROで使用していたもの。今は捨ててしまって手元にありません)けど、今度はベアドライブを入手するのが一苦労。うーん。
あれ?そういえばSASIってSCSIの元になった規格だよな。ということは逆に考えると、SASIというのはSCSIを簡単にしたものともいえる。SASIについてはトラ技スペシャルに解説があったよな。適当なストレージとしては、PCカードのTureIDEモードがいいかも。ただ普通のATAなPCカードよりも、CompactFlash(CF)の方がTureIDEモードについては確実性が高いらしい。そうか、適当なマイコンを使ってSASIを解釈し、ATAにアクセスすればMZやX1からはハードディスクにしか見えないはず。ATAのアクセスルーチンはちょっと前のInterface誌の特集にあったような気がする。おおお、もしかしたら思いっきり簡単に作れてしまうかもしれん。作れれば今年の夏コミOFFの隠し玉になる。では早速具体的にどうするか考えてみましょうか。
〜7月13日・仕様検討
SASIのバスフェーズやコマンドについてはトランジスタ技術SPECIAL No.27「ハードディスクとSCSI活用技術のすべて」に解説があります。SCSIの解説をする前提としてSASIの解説をしているわけですね。改めて見てみると、特にコマンドについては基本的なものは書いてありますがフォーマットとかは省略されています。おそらくここいらは機種依存なのでしょう。機種依存なのによくMZやX1,X68000でPC-9801用のHDDが使えたものだと感心することしきり。メーカーのエゴはこういうところで発揮するものではないという好例でしょう。それはともかく、わからないコマンドについてはそれが指定された時に端末かなんかに表示することにして、解説されているバス遷移と基本コマンドについて実装すればいいんですよね。
ATAアクセスルーチンについては、2000年7月号の特集「ATA(IDE)/ATAPIの徹底活用研究」に具体的な例がありました。もちろん特集中にレジスタの使い方とか詳しく説明してあるのですが、夏コミまで一ヶ月という段階ではいちいちそれを自分でコーディングしていく余裕はありません。CQ出版社のInterface誌のダウンロードのページに特集で紹介された「第6章 ATA/ATAPIデバイス制御プログラムの作成」のプログラムがありましたので、それを流用することにします。うまく使えるかな…。
肝心要のマイコンの選択。チップ単体を買って作るのは手間がかかりますので、市販のワンボードマイコンを買ってそれでSASIとATAを駆動するのが手っ取り早いでしょう。で、どれを選ぶか。
Z80派の私としてはもちろんZ80系で行くのが一番間違いが起こりにくくていいんですが、もしSASIとATAをパラレルポートでコントロールするならかなりのポート数を確保したいところです。ということでパラレルポートとしてはZ80PIO相当一個分しかないTMPZ80C015を使用する秋月のAKI-80は除外。「シリアル-LANアダプタ」で使用しているイエローソフトのKC16030使用「YK30-1」も開発環境は魅力的ですがちょっと高い(この系統のボードとしては格安なんですが)。PICとかじゃつらいでしょ、自分に経験もないし。というように考えに考えて辿りついたのが秋月のAKI-H8。フラッシュメモリとRAM内蔵で、最大78本のパラレルポートは魅力的ですし、ボードがひとつ3800円というのも安い。別売りですがCコンパイラもあります。AKI-H8は購入した人も多く、サーチエンジンで探せば結構ヒットしますから情報も多いでしょう。ということでAKI-H8に決定。
あとは具体的な実現方法ですねぇ。ハードとしてはおおよその構成が決まりましたが、SASIバスとATAドライブのH8との接続方法が問題です。
ATA、つまりCFですが、Interface誌の特集のある箇所にはCFならばデータバス幅を8bitにしても使える設定があるらしい記述がありました。ならばそれをアテにして配線を省略するという手も考えられます。が、どうも情報を集めてみたところでは8bitアクセスできないCFもあるとか。どれがそのCFかはわからない(データシートを公開しているメーカーは多くない)ので、確実な16bitアクセスとするしかないでしょうね。それにATAの制御線もパラレルポート経由というのも、結構面倒かもしれません。メモリに割り付けてI/Oデバイスとして扱うのがいいかもしれませんね。
SASIはもちろんパラレルポートで接続するのですけど、どのポートにどの信号をつなぐかも考えどころ。制御線とデータバスそれぞれ8本ずつあるのですが、制御線は向きはともかく全部が片方向の信号なのであまり気にしなくて良く、それより双方向のデータバスが問題です。通常SASIのデータバスのドライバICはLS642-1という双方向バッファを使うのですが、パラレルポートの外にそれがあるとなると、バッファの方向と出力制御を別の信号を用いてコントロールしなければならなくなります。いや、まぁ工夫次第ではなんとかなるでしょうが…。場合によってはパラレルポートをデータバスも含めて単方向で扱うことも考えないといけないかもしれません。
(この辺りはかなり迷いがありますが、実は使用CPUをH8/3048Fに決めたもののデータシートをまともに読んでなかったのです。それで使い方によっては矛盾する表現も混じっていたりします。)
7月14日・買い出し
日本橋へ買い出し。心臓部分は秋月のキットを利用しますが、その他は当然集めないといけません。買ったのはおおよそ次の通り。
蛇の目基板とは端子のピッチが微妙に異なるので変換基板みたいなのを調達したかったのですが、ありませんでした。
昔は欲しくてもなかなか手に入らなかったものですが…。まぁそれでも8回路タイプは売り切れで、4回路タイプを予備も含めていくつか買いました。ちなみに、ターミネーターというのは1本の信号に対して220Ωの抵抗でプルアップ、330Ωでプルダウンする回路のことで、SCSIターミネーター(SASIも同仕様)という「部品」はその組み合わせが複数回路入っているものを指します。スタイルもいろいろですが、SIPタイプが一番使いやすいですね。手に入らなかった時は220Ωと330ΩのSIPタイプ集合抵抗を重ねて同じ穴に入れたりしました。
CFはピッチも細かく端子のハンダ付けなんかも苦労しそうなので、ここはあっさり変換基板を選択。タイプ2対応なので、Microdriveなんかも接続できます。高いから選ばないけど。
回路図を描かないで部品購入というのも無謀っぽいのですが、それなりにメモ書きくらいはしてから買い出ししてますのでなんとかなります。でも重要なLS642-1がまたしても発見できない(昔I/O誌の記事を見ながらX1turbo用のHDD I/Fを作った時も手に入りませんでした)。LS642でまたごまかす?しばらくは動くと思うけどどうせまたすぐ壊れるぞ?…と店頭で悩むこと十数分。脇にあった売り物のTTL IC規格表なんかを見て決めたのが、ALS644を片方向にだけ使用するというもの。ALS642があれば解決だったんですけどそれもなかったんでね。
LS642とLS642-1の違いはドライブ能力。LS642はバスドライバとしては標準的な24mA駆動なのに対して、サフィックスが付くと48mA駆動になります。ALS642になると64mAになるので間に合うわけです。もっとも能力が高すぎてかえってストレスにならないか心配しますが…。
ALS644は双方向バッファではあるんですが片方が反転、もう片方が非反転というちょっと変わった組み合わせ。LS642がどちらも反転バッファなので、ALS644では反転部のみを使用し、単方向バッファとすることにしました。
SASIドライブ相当のものがあればいいので20MBくらいの容量が確保できれば十分なんですが、そろそろ大容量の波が押し寄せていて256MBなんかが普通に安くなりつつある時代。あるお店でどうにか32MBを買うことができました。まぁビット単価は高くなるはずですけど、ほとんど使わないんだからもったいないでしょ?
電源スイッチとか、基板とか、コネクタとか。
7月16日・発注
秋月にAKI-H8、Cコンパイラ、マザーボードを発注。この当時はFAXで注文することになっていました。
7月17日・到着を待つ
まぁさすがに翌日は来ないでしょ。
7月18日・まだ待つ
まぁもう一日はね。
7月19日・さらに待つ
そろそろだとは思うんだけど…。
7月20日・なんてこったい
あまりに来ないので確認してみると、なんと秋月の夏休みにぶつかっていました。そりゃ送って来ないわな。でもこの遅延は痛い…。
7月23日・AKI-H8到着
ようやく入手。キットなので有無をいわさず早速組み立て。
…なんかコンデンサが合わない…げげっ!間違えてつけてる…。RS232Cドライバのとかもあるからな…ちゃんとしたやつをつけ直すか…。
7月24日・買い足し
というわけで日本橋にまたはせ参じ。あと何だったか買い忘れもあったのでちょっと買って、速攻帰宅→組み立て再開。
マザーボードも組み立てて、サンプルプログラムがライタソフトから書き込めることを確認。電源の関係もあるんで、マザーボードは言わばROMライタになってもらいます。
7月25日・部品配置
大きさの問題もあるんで、あまり工夫の余地はありません。ピッチの違うアンフェノール50ピンの足をいかに基板に貫通させるかが一番の苦労?
電源インジケータとアクセスランプとしてLEDを載せました。並べた基板の間からちょっと顔を出すような配置にすべく、平たい形のがよかったんですけど、丸いのしか手持ちで見つからなかったので、やむなくヤスリでガリガリ削りました。
7月26日・電源配線
電源スイッチと、電源。全部5Vで動かすので素直に配線すればいいんですが、AKI-H8搭載のレギュレータ出力を使うと安定してそうな気がして、CFとかの電源をそちらからもらうことにしました。
7月27日・各信号の配線
H8のデータシートを見ながら、どのポートから配線するかはメモ書きで決めていたので、それに従い配線。CFはメモリ空間に配置させるためにいわゆる外バスを使用するモードとして、その端子から配線。SASIはハンドシェークなのでポートから。
7月28日・各信号の配線(その2)
続き。なかなか一日では終わらない。
7月29日・各信号の配線(その3)
さらに続き。部品配置がやや苦しいのと大急ぎで作っているので、ピン対ピンを直線的につないでしまいました。就職して以後はやってない配線方法なんですけどね。配線がクロスするのはしかたないか…。
7月30日・ハードのデバッグ
まずは単体でチェックできるCFのアクセスから。TrueIDEモードで接続しているので、ややこしい(と思われる)CFのPCカードとしてのコンフィグレーションを省略して、いきなりハードディスクとしてアクセスできます。アクセスルーチンは雑誌のサンプルプログラムをほぼそのまま頂き。とりあえず初期化まではできた?
7月31日・ハードのデバッグ(その2)
続いてセクタアクセスルーチンに。ソースを見てて何となく変な箇所があるのが気になっていたんですけど、やっぱりうまく動かなくて、その箇所を修正したらちゃんと動きました。なんだかなぁ。
8月1日・ハードのデバッグ(その3)とSASIの実装
セクタダンプルーチンとかで動作を確認して、どうやらCFのアクセスは問題なさそう。ということで今度はSASIに取りかかります。
上記の通りトラ技スペシャルにハンドシェークとかの情報はほとんど掲載されていたので、それに従って実装していきます。それと、MZ-2500のSASI
I/F付属のユーティリティディスクのフォーマットプログラムがBASICでハンドシェークとかフォーマットコマンドなんかを入出力するようにできていたので、これも参照しつつ。
8月2日・SASIデバッグ
実際の動作はX1turboを使用して。だってMZ-2500用のHDD I/Fがないんだもの(なぜユーティリティディスクがあるのか…は聞かないで)。BASICのDEVI$・DEVO$なんかを駆使しつつ、アクセスを確認していきます。ボードにはシリアルポートをつけておいたので、必要ならばデバッグメッセージを出力しつつ。
8月3日・SASIデバッグ(その2)
どんなデータが来たかとか、リッチにデバッグメッセージを出力させていたらX1turbo側でエラーが出るようです。どうもハンドシェークがタイムアウトしているみたいですね。必要な情報だけに絞り込まないといかんか…。
8月4日・SASIデバッグ(その3)
試行錯誤の末、X1turboで読み書き・ブートなどできるようになりました。とりあえずこれで完成?
できあがったモノ
ボードの全景です。上半分がSASIコネクタとAKI-H8、下半分がCFスロットという構成です。ケースとか何も想定してないんですが、ACアダプタのコネクタなんかはネジ止め式のものを使用しています。その根元にあるのが電源スイッチですね。 反対側にあるスイッチが、セクタ長を変更するためのスイッチです。MZ-2800で使用するためにセクタ長を1024バイトに変更する必要があったことから、設けました。スイッチ自体はH8のGPIO入力のひとつにつながっているだけで、モードはソフト的に取り込み、ハード的にどうこうすることはありません。 |
裏面。四隅の丸いのは足です。スペーサをつけて、さらにゴム製のクッションを貼り付けています。当時いいアイデアだなぁと思ったんですが、今となってはこのクッションがどこからの流用だったか思い出せない…。 |
AKI-H8とCFスロットボードを取り外したところ。AKI-H8の下にSASIバス関連のICが、CFスロットボードの下にATAバス関係で足らなかったロジックのICが配置されています。 LEDは左の緑色が電源ランプで、電源に直結しています。右の赤色がアクセスランプで、CFコネクタにある端子の信号をそのまま使って点灯させています。 |
CFを使ってはいるものの、FATファイルシステムなんかとは無縁の使い方です。SASIバスを通じてセクタ番号0番を指定したら、CFの第0セクタを使用するようにしています。ですから一度これで初期化したら、そのままではWindowsマシンなんかで読み書きできません。文献なんかでFATのことは調査できますから、いずれイメージファイルに対して読み書きするスタイルに変えたいところですけど、ちょっと時間がかかりそうなので先送りすることに。
半ば押しかけのようにトランジスタ技術誌編集部を訪れ、これを編集長に披露したところ大変気に入っていただけ、年明け1月号でメモリカードの特集をするからこれも記事にしてくれとの運びになりました。写真はその時、CQ出版社の社屋地下にある写真スタジオで撮影していただいたものです。
いざ、デモ
2001年夏のコミケオフ会にて、鮮烈デビュー。デモの様子はこちらでもどうぞ。…が、なんとMZでは起動せず。途中まで動くんですが、暴走しちゃうようです。X1turboと何が違うんだろう??そして研究のため、HDD I/Fボードを借りることに。
その後自宅にて再度挑戦し、MZ-2800でもやはり動作が不完全であることを確認。ブートできないんで、フロッピーから立ち上げてSASIドライブに対してファイルをコピーし、それをFCコマンドで比較してみたところ、たまにデータが抜けている現象があることがわかりました。しかしこれが、どこの場面(読み出しか、書き込みか)で発生しているかわかりません。CFの読み書きには問題なさそうなので、SASIバスのところだと思われるのですが…。
その後、私自身の身辺の問題でトラ技に記事を書く余裕が失われ、丁重にお断りいたしました。1年に1回くらい記事を書く「常連」になりたかったのですが、しかたありません。もっとも、この記事はやっぱりデバッグをやりきってからでないとまずいですよね。
それから、6年半
データのやりとりに関して動作をチェックするなら、デバッグメッセージを出力させるのでなく(詳細すぎたらまたタイムアウトしちゃうし)、ICEでデバッグするべきではないか。安いICEが出てきているがこのAKI-H8では使用できないんで、マイコンを変更しようか…トラ技にH8/Tinyボードが付録してきたからこれを使おうか…そろそろCFの時代じゃないな、小型化したいしSD/MMCとかに変えようか…などと悶々としつつ、たまに部品を買いつつ、でも特に作業をしないまま、何年も経ってしまいました。
ヤフオクにて、ある時、MZ用純正HDDのMZ-1F23が出品されました。なかなか出ないものなのでぜひ欲しかったのですが…落札できませんでした。ちゃんと動くかどうかもわかりませんし、自分ならケースだけ流用してCFカードをアクセスするようにしちゃうんじゃない?
そうか、別にMZ-1F23である必要はないじゃないですか。かつて作りかけたこのボードがちゃんと動けば、ケースなんてどうでもいいんですよ。むしろリムーバブルメディアを取り出しやすくするために行う加工の方が大変かと。
折しもオリゲー・フェスタ☆68が迫りつつある時期、自分のブースで展示しようと思っていたモノが頓挫しかかっていたので(失敗したわけでなく、単にモチベーションの問題だったんですが…)、その代わりになるんじゃないかということで、再挑戦してみることにしました。
問題だろうと思ったのは、本来LS642-1が使われるバスドライバにALS644を使っていること。ドライブ能力が高すぎるので、リンギングとかしてるんじゃないかと考えたのです。オシロがあるんだから見ればいいんですが、この場合見たい対象がMZの中なのと回路がハッキリしてないので、あたりをつけて加工してみたわけです。5Vロジックなので、48mA程度に抑えたかったら100Ωでもシリーズにつけておけばいいか、と思ってやってみたものの、全く動作せず。波形なまりの方の影響が強く出たか…?
加工を元に戻して何回かブートしてみるうちに、別の考えが浮かびました。ブート時に出る絵のパターンの崩れ方が、ほとんどいっしょなんです。これはCFの読み書きの問題なのではないか?例えば、FATエリアなどディスクとして特別な領域も含めておかまいなしに単純にセクタ単位で読み書きしているから、意図しないデータが読み出されてその結果化けてるように見えるのではないか、と…。
ならば、FATファイルシステムを実装して、イメージファイルに読み書きする方が安全です。昔難しいと敬遠していたFATも、使いやすいライブラリを提供してくれるサイトの出現で敷居が低くなりました。1chip MSXにMZ-700を実装する際にも使用しましたので、どんなものかはわかっています。すでにセクタ単位の読み書きはできているのですから、あとはライブラリを実装するだけじゃないですか!
というわけで、大急ぎでかつてのソフト開発環境を再構築したあと、ライブラリのファイルをコピーしてきて実装。エンディアンの問題とかでちょっと躓いたものの、概ねあっさりと実装完了。早速フォーマットとかしてみたんですが…どうも動きがおかしいのですよ。
フォーマットとは、以前は指定したセクタを0で埋めるような動きにしていたものを、今回は0データを追記していくみたいにしました。最初はディスク上にイメージファイル自体がありませんので電源投入直後に作成(create
open)し、フォーマットコマンドが与えられればそれだけ0の塊を追記します。どんどんファイルサイズが大きくなって、最後には約20MBの容量のファイルになるという具合ですが、最初の数セクタでコケているのです。
ライブラリの中で扱おうとしているデータとか変数とかセクタの内容とかを表示させていくと、ファイルが大きくなっていく途中で、突然FATエリアのついさっき確保した箇所が消えてしまうという現象が確認されたのです。消えるというのは正確でなくて、PCに持ってきてセクタダンプしてみるとちゃんとある(最後のセクタになっているので'FFFF'と書かれている)のに、ボードではそれが読めてない('0000')ということなんです。
どこが悪いのかなかなかわからなかったのですけど、大きなファイルを書き込んで別の場所をアクセスさせるようにしてみると、時々16ビット単位でデータが読めてない時があることがわかってきました。16ビットというのはCFのバス幅なんで、あるアクセスがコケているということなのでしょうか。
文献で確認してみると、アクセスサイクルが数百ns必要とのことで、ウェイトを目一杯入れたH8でも速すぎるということのようです。モードを変えればアクセススピードを上げられるのですが、設定コマンドを有効にすると動いてくれなくなります。足りないアクセススピードで入力する設定コマンドが悪さをしているんでしょうか…。
というわけで、結論としては、「マイコンでダイレクトにCFをアクセスすることはできない」ということになりました。文献でもCPLDやFPGAを介してアクセスしているものばかりですので、やっぱりそういうことなのでしょう。そう考えると記事にならなかったのは良かったのかもしれません。
ではここであきらめるか?次の手段に移るか?オリフェスまであと一週間。