MZ-1E30
(MZ-2500/2800用HDD I/Fボード)

 MZ-2500とMZ-2800で使用できる、ハードディスクI/Fボードです。HDDの普及が本格化し始めた時期なのか、SASI規格が採用されています。SASIと言えばSCSIの前身となる規格で(シュガートが独自に作ったI/Fなのだから規格という言い方は違うんだけど)、PC-9801用としてあちこちのサードパーティーから外付けドライブが発売されたことから、程度の良い中古品が適価で入手できたこともあって、X1turboと共にちょっと贅沢な環境で使用していた人もいたんじゃないかと思います(I/Fが入手できたかはともかく)。

 かつてS-OSユーザーズクラブでは会員向けにパソコン通信ホスト局「S-OS NET 大阪」を運営していて、その構成がMZ-2500とHDDだったのでした。
 ちなみにその支局としてオープンさせた「S-OS NET 横浜」はホストパソコンとしてMZ-2800を使用していたものの、HDDは1993年当時ホットだったSPCボード(富士通・MB89352使用のSCSIホストアダプタ)経由SCSI HDDを接続していました。だって純正I/Fは入手できても高いし、実は特殊フォーマットが必要でPC-98用のが使えたかどうかわかりませんでしたからねぇ。

 ROMが搭載されていますが、これはMZ-2500用のIPL ROMです。MZ-2800で使用する時にはそばにあるジャンパをOFF側に差し換えます。IPLと言いますか、このROMは単に起動するだけじゃなくてIOCSにHDDへのアクセス機能を追加する働きも持っています。つまりX1turboとは違い、元々のMZ-2500にはHDDのアクセス機能はないんですね。後から追加できるってのはすごいと思える反面、X1turboより1年遅れて発売されたマシンなのだからそれぐらいデフォルトでサポートしててもよかったのにとも思ってしまいます。

 それと、HDD用IOCSの拡張はBASICでの使用を前提にしているため…というかBASICのことしか考えずに作られているため、P-CP/Mでも使えないとされています。そりゃまぁ階層化ディレクトリが使えないCP/Mで容量の大きすぎるディスクは決して使い勝手が良いとは言えませんけれど、フロッピーに比べれば格段にアクセス時間が短いのですから、サポートされてれば良かったのになぁと思ってしまうのです。

 バスコネクタ(カードエッジ)が50ピンサイズになっています。これはMZ-2800で追加された信号(DMAと割り込み)を使っているからなのですが、MZ-2500ではもちろん意味のない部分なので、従来の44ピンの信号でも動作します。動作はしますが、コネクタのサイズが広くなっていますからMZ-1500/800の本体スロットを除いて、他のMZの拡張スロットに装着することはできません。

 SASIバスコネクタがアンフェノールタイプの50ピンなので、こういうスロットカバーが付属します。標準的な開口部がD-Sub37ピンぐらいまでしか収容できないので、特別なカバーが必要になってしまうのですね。MZ-1E30専用の開口部が下段にしかないので、自然にスロットも下段がMZ-1E30専用ということになってしまいます。

 ところで、よく見たら上段のスロットのフタを留めておくためのネジが、下段のネジ穴と同じような場所についてますね。つまりこのフタを使えば下段も塞いでおくことができるということになるわけですが…それってMZ-1E30を装着していない状況ですよね…そもそもこのカバーを使う必要があるんでしょうか…それとも一部ユーザーは標準のカバーを持ってない可能性があるとか? いやHDDで運用するシステムの、I/Fだけ取り外される事態(しかも故障したとかではなくて外したままになる)は未来の可能性について考えすぎ・気を回しすぎじゃないかと…。
 私が持ってるマニュアルでは、MZ-1E30はMZ-2500のみのオプション製品ということになっていて、MZ-2800については何の記述もありません。MZ-1E30(と純正ドライブであるMZ-1F23)の発表は1987年3月ごろと思われ、MZ-2800の発表がそのもう少し後なので、ある時期までのマニュアルには未発表の製品のことは書けなかったのだろうと思います。とは言えわざわざMZ-2800に対応できないバージョンがあると混乱しますから、マニュアルに書いてなくても最初からMZ-2800対応のボードだったことは明らかです。

 こういう狭間の製品を見ると、ついつい邪推したくなっちゃうんですよね。MZ-2800の企画はいつだったのか、開発期間はどれぐらいだったのか…MZ-2500の拡張I/Oポートのバスコネクタ端子数が50なのはなぜなのか、MZ-2800で専用の信号が配置されるようになったのは偶然か…こういった狭間の製品から垣間見えることもあるんですが、それはまた別の機会に譲りましょう。

 ちなみに、「MZ-2500にHDDを接続するオプション」については、当時のパンフなど資料を当たってみると1986年5月ごろにテレシステムズがHD-25S-10/HD-25S-20というシステムを発売していますね。システムの深いところを利用しているわりには純正の方が後追いになっているというのが不思議なところですが、MZ-2500の開発にもテレシステムズが深く関わっていると思われますし、もしかするとMZ-1E30もMZ-2800対応(DMAとか)ついでにテレシステムズが開発したんじゃないかと思うんですが…。

 それはそれとして。
ある日、とある環境でMZ-1E30を使おうとして、なんだかSASIバス信号が化けてるようで、故障なのか確認するためにも回路がどうなってるかわからないと手も足も出ないことから、回路図を描いてみました。

 マニュアルにも詳しいレジスタの解説はなかったので(そりゃそうよね)、回路図から読み取ってみましょう。まずはROMディスクの方から。

アドレス $A8
  Write Read
アドレスバス
(A15〜A8)
7 無効 無効
6
5
4
3 0
2 0
1 無効
0
データバス 7 無効 無効
6 ROMの上位アドレス
(A14〜A8)
5
4
3
2
1
0
アドレス $A9
  Write Read
アドレスバス
(A15〜A8)
7 無効 ROMの下位アドレス
(A7〜A0)
6
5
4
3
2
1
0
データバス 7 無効 ROMデータ
6
5
4
3
2
1
0

 MZ-2500のROMディスクはEMMの要領と同じくポート0xA8でROMの上位アドレスをセットし、ポート0xA9からデータを読み出します(EMMでの書き込み機能がないということ)。注意が必要なのは、上位アドレスセットの際Bレジスタのビット3と2も記憶されて、この値がデコードに取り込まれているというところです。両ビット共'0'でないとROMにアクセスできません。

 これなんなんでしょうね? 回路の雰囲気からするとポートアドレスは同じでもこの信号の取り込み方で最大4つのROMディスクを並列接続可能なようにしてあるようですが、この設定を変えることでブート可能なROMをサーチするとか、"ROM1:"とかのファイルディスクリプタでアクセスしたら設定を変えるとかしてないようですので、企画倒れだったのかな…。まぁIOCSだけ変更すれば実現は可能ですので、カスタム対応とかあったのかもしれませんけれど…。

 次にSASIのホスト部分。

アドレス $A4
  Write Read
7 コマンド/データ  ステータス/メッセージ/
データ
6
5
4
3
2
1
0
アドレス $A5
  Write Read
7   -REQ状態(1=リクエスト)
6   -ACK状態(1=出力中)
5 -SEL出力(1=出力) -BSY状態(1=ビジー)
4   -MSG状態(1=メッセージ)
3 -RST出力(1=出力) -C/D状態(0=データ, 1=コマンド)
2   -I/O状態(0=出力, 1=入力)
1 DMAイネーブル(1=許可)  
0 割り込みイネーブル(1=許可) 割り込み状態(1=発生中)

 ポート0xA5のビット1と0はMZ-2800用の機能のオン・オフや状態確認に使われるもので、MZ-2500ではこれらのビットは常に'0'をセットするようにしておきます。割り込みとはZ80の割り込み信号ではなく80286方面への専用割り込みライン"IRHD"のことですね。

 SASIの制御線は一通りその状態をレジスタから読み取ることができますが、制御出力のうち-ACKだけはレジスタにありません。これはコマンドまたはデータをポート0xA4を通して読み書きすると、自動的に-ACKが出力されるからですね。データポートの入出力の際はどうせ必ず-ACKを出すわけですから、これを自動化しているI/Fは多かったと思われます。

 SASIの各フェーズの実行を、レジスタの操作に注目して考えてみると…。

★ セレクションフェーズ
  1. ポート0xA5・ビット5が'0'であることを確認 (バスフリーフェーズである)
  2. ポート0A4に1(ターゲットID=0)を出力
  3. ポート0xA5に0x20を出力 (-SELを有効にする)
  4. ポート0xA5・ビット5が'1'になるまで待つ
  5. ポート0A5に0を出力 (-SELの出力を終了する)
★ コマンドフェーズ
  1. ポート0xA5の、ビット6が'0'であり(何も出力中ではない)、かつビット7が'1'である(-REQを受け取っている)ことを確認
  2. ポート0xA5・ビット3が'0'だったり、ポート0xA5・ビット2が'1'だったりするとコマンド待ちではないので終了
  3. コマンドを出力し、1に戻る。6バイト分繰り返す
★ データ転送フェーズ
  1. ポート0xA5の、ビット6が'0'であり(何も出力中ではない)、かつビット7が'1'である(-REQを受け取っている)ことを確認
  2. ポート0xA5・ビット3が'1'だったりするとデータ転送ではないので終了
  3. データ出力時はポート0xA5・ビット2が'0'であることを確認してポート0xA4にデータ書き込み、データ入力時はポート0xA5・ビット2が'1'であることを確認してポート0xA4からデータ読み出し
  4. データの長さ分を1〜3まで繰り返す
★ ステータスフェーズ
  1. ポート0xA5の、ビット6が'0'であり(何も出力中ではない)、かつビット7が'1'である(-REQを受け取っている)ことを確認
  2. ポート0xA5の、ビット4が'1'だったり(この場合メッセージフェーズ)、ビット3や2が'0'だったりするとステータス転送ではないので終了
  3. ポート0xA4からステータス読み出し
★ メッセージフェーズ
  1. ポート0xA5の、ビット6が'0'であり(何も出力中ではない)、かつビット7が'1'である(-REQを受け取っている)ことを確認
  2. ポート0xA5の、ビット4が'0'だったり(この場合ステータスフェーズ)、ビット3や2が'0'だったりするとメッセージ転送ではないので終了
  3. ポート0xA4からメッセージ読み出し

となりますでしょうか。なおMZ-2800ではDMAが使用できますので(チャンネル0)、転送直前にDMAを設定してポート0xA5に0x02を書き込めばDMAにて転送してくれるものと思われます。もちろんMZ-2800でも上記の方法(PIO転送)を使用してかまわないはずです。

 ところで、不思議なことが二つ。

 以前から所有してたのに今さら気づいたことがありまして…カードエッジコネクタの近辺、妙なスルーホールとか穴とかあるじゃないか、これは見覚えあるぞ…ということでMZ-1E32(右)と並べてみました。

 ふむ、拡張I/Oポートなしで固定するためのものと思しき穴と、メインボードと直結するためのコネクタを取り付けるスルーホールということで良さそうです。でもMZ-1E30の方のコネクタがないのはどういうこと…?

 マニュアル(上)を見てもボードの絵に二つ並ぶ穴がありますから、最初からあったんでしょうけど、固定金具があるわけでなし、コネクタがないのですから利用もできないわけで…もちろんマニュアルにそれ以上の記述はありません。

 ひとつ推測できるとしたら、いわゆるカスタム対応というやつで、システムで納入するセットに拡張スロットにはこれ1枚しか装着する必要がない場合、MILコネクタを後付けしたものをあらかじめ組み付けていた…というところでしょうか。スロットを使わず固定すると下段の位置にならざるを得ませんから、専用スロットカバーが下段スロットを前提とした構造になってるのもうなづけるような気がしますね。

 もうひとつの不思議は、Z80バス部分にて*INT端子がMILコネクタの*INTのところにだけ配線されていて、ボードの他の所ではまったく使われていません。回路図がそうなっているのは実物のボードの配線に従ったからなのですが、カードエッジコネクタの信号のうち使用していないものはコンタクトパターンを設けないという設計方針と思われるのに、*INTだけそこから外れているのが気になります。もしかしてですよ、設計当初は、Z80にも割り込みを使えるようにしようと考えたものの、なんらかの理由でやめちゃった…とかだったりしないのでしょうか。

 まぁ、SASIと言えどFDに比べればずっと速いですし、割り込みを待つ間できる処理の量はたいしたことないかもですね…それよりDMAの方が必要だった…それゆえのMZ-2800でのサポートだったのでしょうが…。

 手元には二つのバージョンのMZ-1E30があります。その違いは終端抵抗の電源にダイオードが追加されたのと、コンデンサ追加です。古い方の基板も改修されて新しいものに追随済みになっています(私が描いた回路図には反映済み)。追加されたコンデンサは裏面にハンダ付けされていて、新版の方でもまだ裏面にひとつありますから、もう一つ新しいバージョンがあるのかな…。

RaSCSIを接続する

 Raspberry PiのGPIOに適切な信号を割り当てて、バッファ基板経由または直接、パソコンのSCSI端子に接続すると仮想のHDDやCD-ROMが実機から扱える「RaSCSI」。元々がGIMONSさんが拡張するX68kシリーズエミュレータ「XM6 TypeG」の派生プロダクトという生い立ちゆえか、SASI HDDをエミュレートする機能もあります。

 ならばMZ-1E30を装着したMZ-2500/2800でも使えるんじゃないかと試してみたのですが、ちょっと一工夫必要でした。将来のバージョンに取り込まれるかもしれませんが、ひとまずここで修正箇所を紹介しておきます。なお使用しているバージョンは1.34です。

MZ-2500の場合

 MZ-1E30ではコマンドやデータをデータレジスタに書き込むと自動的に-ACKが出力されます。この時、データの信号レベルの変化が遅くて-ACKの変化が追い越してしまい、RaSCSIは-ACKの状態を確認した後なのに未確定状態のデータを取り込むことになってしまう現象が発生します。特にコマンドの1バイト目にて顕著で、直前のセレクションフェーズで出力されたID(0x01)の値を引きずるためDB0ビットが化けた状態が比較的長時間存在します。当時の回路の特性なら問題にならなかったのでしょうが、高速化された現代のテクノロジにかかれば、Raspberry Pi程度のプロセッサでもソフト処理にもかかわらずDB0ビットがまだ化けてる状態で取り込んでしまうほど速い…ということのようなのです。
 対策としては、-ACKが有効になったことを確認した後ウェイトを入れます。
gpiobus.cpp (972行目付近)
// ACKアサート待ち loop = 30000000;
do {
    Aquire();
    loop--;
} while (!(signals & (1 << PIN_ACK)) &&
        !(signals & (1 << PIN_RST)) && loop > 0);
usleep(1); // 追加

// データ取得
*buf = GetDAT(); 
 なおカーネルドライバにも同様の変更を試してみたのですが、うまく動作しませんでした。なので今のところはカーネルドライバをロードしないで使用して下さい。まぁZ80BのPIO転送だからもともとそんなに速くありませんし、カーネルドライバを使わなくてもそれほど遅いとは思わないような気もしますしね…。

MZ-2800の場合

 MZ-2500の場合と同じです。
 MZ-2800ではセクタサイズが1024バイトのHDDを使用することになっています。純正のMZ-1F23には切り替えスイッチがついていますがRaSCSIにあるわけではないですから、そのままでは使えません。
 そこでセクタの大きさが定義されている箇所を変更し、1024バイト/セクタとして動作するようにします。
disk.cpp (2407行目付近)
// セクタサイズとブロック数
disk.size = 10; // 8->10 に変更
disk.blocks = (DWORD)(size >> 10); // 8->10 に変更
 セクタサイズをチェックしている箇所に、1024バイトになる条件を追加します。
disk.cpp (107, 165, 299, 370, 409, 441, 1001行目付近。チェックしている変数にはsize, dt.size, disk.sizeの3種類がある)
ASSERT((dt.size == 8) || (dt.size == 9) || (dt.size == 10) || (dt.size == 11)); // "== 10"の条件を追加

 ソースを変更したらRaspberry Piにてmakeすれば、後の使い方はX68k用のSASI HDDとして接続する場合と同じです。他のホストマシンと接続する際に間違えて使用しないよう気をつけてください。

 MZ-2500/MZ-2800で使用できるHDDのサイズは20MBです。RaSCSIではSASI HDDの容量をマウント時にチェックしており、20MBの場合20748288バイトでないとエラーになってしまいます。ところがMZ-1F23はMZ-1E30のマニュアルによると22437888バイトあることになっているので、このサイズに忠実なHDDイメージではそのまま使用することができません。その場合は2395行目付近にあるイメージサイズの比較値を適切に変更する必要があります。

 しかしながら、以下の理由によりソースを修正せず、ドキュメントの通りXM6 TypeGのディスクイメージ作成機能を用いて作った20MBのファイルでも、MZで使用する分には問題は発生しないようです。

 HDDの全容量・22437888バイトのうち、最後の1655808バイト分はヘッドのシッピングゾーン+余裕分として使用を除外されています。SASI時代のHDDは電源断時にヘッドがディスクよりも外に退避するような機能がなく、ディスク上にヘッドがある状態で電源が落とされるため、ディスクの回転で発生する風圧がなくなってヘッドがディスク盤面に着地してしまうことになっていました。ヘッドと盤面が接触すると盤面に傷がついてしまいかねないので、敢えて一部のエリアを非データ領域=シッピングゾーンという扱いにして電源断直前にあらかじめそこにヘッドを移動するようにしたわけです。おかげで酷使されたHDDはモーター起動トルクが減ってきてるのにヘッドが接触して抵抗になり、ディスクが回転しなくなるトラブルが多発することになったわけですが…(ドライブ全体をディスクの回転方向に回るようちょっと力をかけてあげると回り出す、通称「押し掛け」なるテクニックも生まれたりしてますが)。

 ヘッドのシッピングはSASIにシッピングコマンドなんてものがあるのではなく、シッピングゾーンへシークすることで実現しているようなのですが、RaSCSIはシークコマンドにてシーク先のブロックアドレスを受け付けておらず、シーク本来の動作をしていません(いわゆるSSDみたいなもんなんだから当たり前だ)。もちろんシッピング自体やる意味がありませんね。

 そしてシッピングゾーンを除いた20782080バイトがユーティリティによるフォーマットの対象になる領域で、末尾の33792バイトはRaSCSIでサポートする容量から溢れてしまいますが、フォーマットコマンドもまた指定されたブロックアドレスを捨てていますのでイメージファイルをアクセスすることはなく、エラーになりません。

 さらに、20504320バイトを超える部分はデータの読み書きに使われないため、RaSCSIでサポートする容量を超えてアクセスされることがなく、結果としてMZ-1F23の容量と違っていてもXM6 TypeGで作ったディスクイメージをそのまま使って問題ないということになっているのです。XM6 TypeGを使わない場合は、Raspberry Piのddコマンドで20748288バイトのファイルを作ってください。

 以上の変更点その他の情報について、手元での確認に留まっていることもありますので、無保証にてご活用ください。

所蔵品一覧に戻る