MZ-2800
Tweet
その少し前から、IBM PCの互換機がビジネスになってるんならNECの98の互換機だってビジネスとしてイケるんじゃないの…という話をちょこちょこ聞いていたんですけど、なかなか具体的な動きがなかったんですよね。海外では、汎用機というか、大型のコンピュータだともっと昔から互換機というものがまかり通っていたのと同じ感覚で、IBMの作ったパソコンの互換機を作ろう…という発想が出てきたんじゃないかと勝手に思ってたりするんですが、日本ではPC-9801というパソコンに対して、対抗して似てるけどちょっとだけ良いスペックのオリジナルマシンを作る…というのが主流、つまり新しい16bitパソコンなら市場も新しいから覇者になれる…という発想だったわけで。 汎用部品ばっかりだったIBM PCだからこそ互換機を作れた…と言うなら98だってGDC含め汎用部品ばかりなので互換機を作れたはずなんですよね。 というのはさておき、後にトムキャット/プロサイドも乗り出してくる98互換機市場の前哨とも言える1987年春に登場したのがこのMZ-2800。モデル名まで含めて言えばMZ-2861。ちょっと無理矢理っぽい。 |
個人的には、シャープが98互換機の発売を検討しているとかいうニュースを聞いた時、そして実際に発表された時「いやだなー」と思ったんですよ。それまで独自路線で頑張ってきた我らがシャープが、他人の褌で相撲を取るとかいうのは、なんだかもう落ちぶれたみたいな感じで。
ところが、雑誌のレビュー記事を読んでびっくり。98互換機どころかオリジナル設計のハードウェアで、スペック的にはむしろX68000対抗機で、じゃあ98互換てのは何だというとそれが「ソフトエミュレーション」なのだと。エプソンとNECが裁判までして揉める中、MZ-2800はNECから著作権を侵害していないというお墨付きまでもらっちゃう始末。
しかし今改めてMZ-2800を見てみると、どうしてこんなことしちゃったんだろうとか、もう少しなんとかならなかったのかとか、しみじみ不思議な感じがしてきます。98エミュレータに至っては「なぜ286でこれだけのことができてるの? 386じゃないのよ?」とか思って仕方ありません。
わからないなら面白がろうってことで、ひとまずここは、今わかってるだけのネタで遊んでしまいましょう。
目 次
MZ-2800には前面のスイッチで手軽に切り替え可能な2500モードがあり、データレコーダなど一部を除いて完全にコンパチなMZ-2500として使用することができます。拡張スロットも2500と同じサイズのボードが入れられる8bitスロットがありますので、シャープから発売されていた純正品を含めMZ-2500用の拡張ボードを使用することができます。ということはもちろん、自作ボードだって動くと思いますよね。
MZ-2500をメインに活動するサークル「星くずばこ」では、拡張スロットに装着するインテリジェントMIDIボードを開発していました。本体より速いCPU(HD64180/10MHz)と本体より多いRAM(512KB)で、本体の負荷なくBGMを演奏するだけじゃなくて、あわよくばアクセラレータボードとしても使うことを目論んでいました。
MZ-2500でのデバッグはとりあえず順調だったようなのですが、MZ-2800の2500モードで問題発生…! どういうわけか、データの書き込みができないのです。Z80と64180の間の通信はZ80B PIOを使っていたのですが、これを8255に変えてみるとちゃんと動くことから、PIOのところに問題があるらしいことはすぐわかったのですが…モード2割り込みを使いたいソフト担当がどうしても許してくれないという…。
いったい何が起こっていたんでしょうか? 「2500モードはMZ-2500とフルコンパチ」というのは幻想に過ぎなかったのでしょうか…!
それではまず、MZ-2500の方から見ていきましょう。注目してもらいたいのは、I/Oスロットに接続されるリードとライトの信号です。
まず上は、CPUから出力された信号がどうなっているかという話で、ALS244を経由しているだけで実質的にそのままの元の信号が、左の図にあるI/Oスロットに接続されていますね。 一応説明しておきますと、ALS244は信号の強化をしてくれるバッファで、CPUの制御信号は回路のあちこちに分配されることから、電流の取り合いになって減衰してしまわないために通されています。 |
次はMZ-2800の方。
なんでこんなことになってるんでしょうね? ひとつ言えることは、8bitスロットも80286からアクセスできるようにしてある、ということなんです。ここの*IOR/*IOWは16bitスロットの方にも行っていて、さらにはDMAからもアクセスできるようにされていたりもします。
実使用上という観点では、MZ-2500のスロットに、直接Z80のメモリ空間に割り付けられるようなメモリを持つボードを挿す必要がなくなっているので、I/Oアクセス時のみにリード・ライト信号が有効になっても不都合はありません。それと過去にはオプションだったインターフェースをほとんど標準装備としたMZ-2500としては、スロットに入れないといけないボードってかなり限られてくるんですよね。もちろんメーカー視点の話ですけど。
だからなのか、MZ-2500のI/Oスロットは2スロットありますがフラットケーブルで単純に接続された構造になっていて、スロット間でデイジーチェーンが構成されていません。IEIだけは入っていますがチェーンの末端になるしかなく、しかもそのIEIすらも2スロットともに並列につながっているので結局1枚しかデイジーチェーン割り込みを使うことができません。そりゃまぁモード0やモード1割り込みにすれば2枚いけますけど、MZ-2500でそれやります? ソフト担当が8255では許さないわけですよ。
さて、リード・ライト信号が*IORQとあらかじめ論理がとられていることをわざわざ紹介したのですから、問題の原因は当然そこにあると思いますよね。なんだと思います?
正解はPIOのリセットです。PIOはピン数の関係でリセット端子がなく、*RDと*IORQが"H"で*M1が2クロック以上"L"だとリセットがかかるようになっています。普通のZ80システムが動作している時は*M1が"L"の時は必ず*RDが"L"になるのでリセットされることはありません。リセット信号が有効になった時*M1も"L"になるようにしておけば、PIOを任意のタイミングでリセットできるわけです。
MZ-2500など6MHz以上のクロックでZ80を駆動するシステムではメモリの応答速度の都合で適宜ウェイトが入れられており、特にM1サイクル(OPコードをメモリから読み出すサイクルで、*M1が"L"になる)にウェイトを挿入するのは常套手段と言えます。ということは*M1が2クロックの時間"L"になってしまうわけですが、M1サイクルとはメモリ読み出しなので、*RDも同時に"L"になっておりリセット条件を満たすことはないのです。
しかし、MZ-2800の場合*RDはすでに*IORQとの論理がとられた*IORになっているので、メモリ読み出し状態を表すことはなく、M1サイクルにおいても"L"になりません。ということは*M1だけ"L"になってしまい、かつM1サイクルにてウェイトが挿入されていることから2クロック分の長さがあるはずなので、PIOのリセット条件を満たしてしまいます。
対策としては、*IORに*MREQとのANDをとって、メモリアクセス時には強制的にリード信号を有効にすることにしました。かなり強引な手法ですが、PIOも*IORQを受けてアクセスを判断しているので、誤動作することはありません。
しかし…よくこれで純正ボードに問題が発生しなかったものです…いや、GP-IBボード(MZ-8BIO4)はダメだったはずですね。もう古いボードだし、載ってるPIOはAバージョンだからサポート外か…いやAPPLICATION LIBRALYにはMZ-2500の2500モードで使えると書いてあるな…(さすがにMZ-2800が対象機種になっているAPPLICATION LIBRALYには書いてなかった)。
結局のところ、MZ-2800は98互換機ではなかったわけですが。しかし我々は諦めきれず、夢を見てしまうのです…。
どうにかならんのか、と。
そう思ってしまうのは、MS-DOSv3.1マシンだからだけではありません。Cバスとほぼコンパチの16bitスロットがあるからなのです。どれぐらいコンパチなのかと言うと…。
MZ-2800 | PC-9801 | MZ-2800 | PC-9801 | |||
---|---|---|---|---|---|---|
A1 | GND | GND | B1 | GND | GND | |
A2 | V1 | V1 | B2 | V1 | V1 | |
A3 | V2 | V2 | B3 | V2 | V2 | |
A4 | A0 | AB001 | B4 | D0 | DB001 | |
A5 | A1 | AB011 | B5 | D1 | DB011 | |
A6 | A2 | AB021 | B6 | D2 | DB021 | |
A7 | A3 | AB031 | B7 | D3 | DB031 | |
A8 | A4 | AB041 | B8 | D4 | DB041 | |
A9 | A5 | AB051 | B9 | D5 | DB051 | |
A10 | A6 | AB061 | B10 | D6 | DB061 | |
A11 | GND | GND | B11 | GND | GND | |
A12 | A7 | AB071 | B12 | D7 | DB071 | |
A13 | A8 | AB081 | B13 | D8 | DB081 | |
A14 | A9 | AB091 | B14 | D9 | DB091 | |
A15 | A10 | AB101 | B15 | D10 | DB101 | |
A16 | A11 | AB111 | B16 | D11 | DB111 | |
A17 | A12 | AB121 | B17 | D12 | DB121 | |
A18 | A13 | AB131 | B18 | D13 | DB131 | |
A19 | A14 | AB141 | B19 | D14 | DB141 | |
A20 | A15 | AB151 | B20 | D15 | DB151 | |
A21 | GND | GND | B21 | GND | GND | |
A22 | A16 | AB161 | B22 | +12V | +12V | |
A23 | A17 | AB171 | B23 | +12V | +12V | |
A24 | A18 | AB181 | B24 | NC | IR31 | |
A25 | A19 | AB191 | B25 | NC | IR51 | |
A26 | A20 | AB201 | B26 | IR11 | IR61 | |
A27 | A21 | AB211 | B27 | N1 | IR91 | |
A28 | A22 | AB221 | B28 | IR12 | IR101 | |
A29 | A23 | AB231 | B29 | IR13 | IR121 | |
A30 | INT | INT0 | B30 | IR14 | IR131 | |
A31 | GND | GND | B31 | GND | GND | |
A32 | EXNMI | IOCHK0 | B32 | -12V | -12V | |
A33 | IOR | IOR0 | B33 | -12V | -12V | |
A34 | IOW | IOW0 | B34 | SYSRES | RESET0 | |
A35 | MRD | MRC0 | B35 | N2 | DACK00 | |
A36 | MWR | MWC0 | B36 | DACK3 | DACK30 | |
A37 | INTA | INTA0 | B37 | N3 | DRQ00 | |
A38 | EXRDY | NOWAIT0 | B38 | DRQ3 | DRQ30 | |
A39 | ALE | SALE1 | B39 | NC | WORD0 | |
A40 | NC | MACS0 | B40 | EXHRQ | EXHRQ10 | |
A41 | GND | GND | B41 | GND | GND | |
A42 | DMAE | CPUENB10 | B42 | EXHAK | EXHLA10 | |
A43 | DACK2 | RFSH0 | B43 | ITC | DMATC0 | |
A44 | BHE | BHE0 | B44 | NMIO | NMI0 | |
A45 | EXWAIT | IORDY1 | B45 | MWE | MWE0 | |
A46 | CLK8M | SCLK1 | B46 | NC | EXHLA20 | |
A47 | NC | S18CLK1 | B47 | NC | EXHRQ20 | |
A48 | POWER | POWER0 | B48 | SBRQ | SBUSRQ1 | |
A49 | +5V | +5V | B49 | +5V | +5V | |
A50 | +5V | +5V | B50 | +5V | +5V |
どうです、このソックリ具合。PC-88VAにもCバススロットはありますが、こちらはメーカーも違うのですよ。PC-98時代後期の、工業用98互換機でもありません。多少違う端子もありますけど、例えばピンク色のは「名前は全然違うけど、よくよく考えたら意味が反転してるだけで同じ信号」だし、水色のは「厳密に同じ名前ではないけれど機能は同じ信号」とか、つまり仕様上は問題ないわけです。
問題になるのは黄色の欄で、ここには信号が割り当てられていません。使用頻度の少ない信号もありますけど、その他に割り込みとDMAの信号もあるんですよね。DMAはチャンネル3しか使えませんし、割り込みの本数も減っています。
とは言え…違いはその程度です。ハード的には、そこさえ気をつければPC-98用のボードがMZ-2800で使えるということですよ。純正・サードパーティー問わずほとんど何にもサポートされなかったあれやこれやのボードが、もしかしたら使えるかもしれない…!
…まぁそんなに簡単に動かせるんなら、当時の雑誌でも記事として取り上げられたりしますよね。Cバススロットがあるだけで98互換機とは言ってない・OSさえも互換品のPC-88VAには98用のEMSメモリなどを使うための記事があったりするのですから、もし可能なら誰かがとっくに試しているはずです。今までなかったということは、それが成功しなかったということではないですか?
いったいどんな壁が行く手を阻んだのでしょうか…?
●I/Oアドレス
多数のレトロPCエミュレータ制作で有名な武田さんが、MZ-2800エミュレータを制作する時にまとめた解析資料があります。使用されているI/Oアドレスもリストされていて、省略されているのもありますがあらかたそこで確認することができます。
ここは比較ということで、PICとDMAについてMZ-2800とPC-9801がどう違うのか見てみましょう。
MZ-2800 | PC-9801 | ||
---|---|---|---|
PIC (8259A) |
#0 | 80h, 81h | 0000h, 0002h |
#1 | 82h, 83h | 0008h, 000Ah | |
DMA (8237/upD71071) |
70h〜7fh | 0001h, 0003h, 0005h, 0007h, 0009h, 000Bh, 000Dh, 000Fh, 0011h, 0013h, 0015h, 0017h, 0019h, 001Bh, 001Dh, 001Fh |
98の方は、8bitごとにPICとDMAが偶数アドレス・奇数アドレスで交互に割り当てられてるとか、なんでこうなってるのかサッパリですが、とにかく28と98で全く違うアドレスになっています。
それだけじゃないんです。MZ-2800のアドレスの数値、8bit値として書いてあるのは意味があるんです。実は…アドレスが8bitでしかデコードされてないんです…!
そう、「80h」というのは0080hのことではないんです。0180hでも、F080hでも、上位8bitには関係なく1個めの8259Aが応答してしまうんです。敢えて書けば、xx80hという書き方になるようなデコードなんです。およそ16bitらしからぬ設計…なんでこんなことに?!
ひとつ考えられるのは、MZ-2800はコンセプトとして「16bit化したMZ-2500」であり、80286動作時でも極力MZ-2500の回路を使う方針で設計されている、ということです。MZ-2800で使用されている周辺LSIには次のようなものがあるのですが…。
MZ-2800 | MZ-2500 | |
---|---|---|
FDC | MB8876 | MB8876 |
キーボード | LH0081B | LH0081B |
シリアル・マウス | LH0084B | LH0084B |
FM音源 | YM2203 | YM2203 |
I/O制御 | (8255) | 8255 |
カウンタ・タイマ | (8253) | 8253 |
システムコントローラ | SC65013G-185 | ─ |
複合コントローラ(8255+8253+8259) | MN12861 | ─ |
割り込みコントローラ | 8259 | ─ |
DMA | uPD71071G | ─ |
I/Oコントロール | SC61H06B44 | ─ |
ディスク・ジョイスティック周辺 | SC65005-052 | ─ |
プリンタ周辺 | SC65005-053 | ─ |
8bitメモリコントローラ | SC17G014-0005 | TC17G014-0005 |
8bit I/Oコントローラ | SC-61K228F | SC-61K228F |
グラフィック演算コントローラ | SC65040G-084 (2個) | SC65040-084 |
グラフィック表示コントローラ | SC65022-109 | ─ |
文字コントローラ | SC65040G-085 | SC65040-085 |
文字周辺 | SC61H25B30F | ─ |
グラフィックシフトレジスタ | SC65012-G161 | ─ |
キーコントローラ | LZ91A56 | LZ91A21 |
キーコントローラ(キーボード側) | LZ91A55 | LZ91A17 |
2500モードがあるのだから、MZ-2500と同じカスタムLSIが使われていても不思議はない…と思うところなのですが、実は2800モードでも多くが生かされているようで、例えばFM音源やFDCなどMZ-2500で使用していてMZ-2800になっても使い続けるLSIに対するアドレスデコードは相変わらず8bit I/Oコントローラがやっており、当然ながらこのコントローラにはアドレスバスが下位8bit分しか接続されておらず、上位8bitのデコード値次第で動作を無効化できるような手段もなく…。
そういった流れで、MZ-2500から引き継いだI/Oデバイスは下位8bitのみのアドレスでデコードすることになり、80286マシンでありながらなぜか8bitマシンのような構成になってしまったのでしょう。カスタムLSIを小変更するコスト(設計は少しで済んでも、検証は省略できない)はかけられなかったのでしょうかね…。
MZ-2800になって手が入った部分についてはもう少し多い本数のアドレス線でデコードしてたりしますが、それでも10bit分しかありません。デコードされない部分はイメージになっちゃいますから、I/Oボードに割り当てるアドレスの選択には慎重にならざるを得ないでしょう…。
●共有メモリ
一部のCバスボードでは、BIOS ROMやデータ転送用の共有RAMが搭載されているものがあります。もちろんこれらのメモリは98のメインメモリに割り付けられるものです。
ところでさきの武田さんの解析資料には簡単なメモリマップも書いてあるのですが、おわかりになります? メモリ空間に空きがないのですよ。もちろん原因はメインRAMの容量を768KBにしたこと、それに640×400ドット表示時に65536色表示ができるような、巨大なグラフィックRAMを搭載したことです。これらのRAMに、98ではいろいろ隙間ができていたものが全部埋められてしまったみたいな感じになってるんですね。
80286の、最初の1MBを超えたところ(プロテクトモード)に割り付けられてアクセスできるようなRAMならば、シャープ純正RAMボードと同様の構造になるかと思いますので可能性はありますけど…。
少なくとも、I/Oボードでの共有メモリとしての割り付けはできないと考えるべきでしょう。
●割り込みとDMA
MZ-2800はCバスで定義されている割り込み信号の一部が未使用となっていました。どのように使えるのか、例によって対応表を作ってみました。
MZ-2800 | PC-9801 | ||||||
---|---|---|---|---|---|---|---|
端子 | 信号 | ベクタ | IRQ | 信号 | ベクタ | IRQ | 表記 |
B24 | ─ | ─ | ─ | IR31 | 0Bh | IRQ3 | INT0 |
B25 | ─ | ─ | ─ | IR51 | 0Dh | IRQ5 | INT1 |
B26 | IR11 | 4Bh | IRQ11 | IR61 | 0Eh | IRQ6 | INT2 |
B27 | ─ | ─ | ─ | IR91 | 11h | IRQ9 | INT3 |
B28 | IR12 | 4Ch | IRQ12 | IR101 | 12h | IRQ10 | INT4 |
B29 | IR13 | 4Dh | IRQ13 | IR121 | 14h | IRQ12 | INT5 |
B30 | IR14 | 4Eh | IRQ14 | IR131 | 15h | IRQ13 | INT6 |
98の方の、表記というのはよくボードのマニュアルで掲載されていたりする割り込み番号です。青くしてあるのが多くのボードでよくある選択可能な割り込みです。
こうしてみると、ボードで選択可能な割り込みのうちMZ-2800でそのまま接続できるのはINT2とINT5しかありませんね。しかも、8bitスロットにIR11が接続されていますので、そちらで使ってしまうとIR13=INT5しか残ってないことになってしまいます。16bitスロットに割り込みを使用する複数のボードを挿したいと思ったら、どうしたらいいんでしょうか…。
そして、ベクタの値も違いますね。INT5が発生したら呼び出されるアドレスがINT14hではなくINT4Dhに格納されるよう、ドライバや制御ソフトを書き換える必要があるというわけです。
DMAの方も比較してみましょうか。
MZ-2800 | PC-9801 | ||
---|---|---|---|
端子 | チャンネル | 信号 | 信号 |
B37 | 0 | ─ | DRQ00 |
B35 | ─ | DACK00 | |
B38 | 3 | DRQ3 | DRQ30 |
B36 | DACK3 | DACK30 |
16bitスロットで使えるのはチャンネル3だけです。MZ-2800でもチャンネル0は使えるのですが、8bitスロットの方に接続されていますので、Cバスボードではチャンネル3のみということになります。
そしてもちろん、割り込みコントローラもDMAコントローラも、PC-9801とは違うI/Oアドレスに配置されていますので、直接デバイスを操作するプログラムではその部分の書き換えが必要になります。幸いにして8259Aやコンパチ品、uPD71071といったPC-9801と互換性のあるLSIが使われていますので、修正はアドレス部に限定されるのではないかと思うのですが…。
ここまで解析できたところでいざチャレンジ。全国一千万のMZ-2800ユーザー(そんなにいないしそんなに製造してない)待望の、LANボードを動かしてみましょう。
MS-DOSのバージョン3というのは、MS-NETWORKS(msnではない)によるLAN環境をサポートしたというのが謳い文句のひとつとなっていまして、まぁLANマネージャなどネットワークドライバ/プロトコルスタックが別途必要なのでサポートの意味もちょっと違うんですが、それを横に置いても「やっぱりLANがつながるといいよね…」とか思うわけですよ。
Cバス互換スロットがあるというだけでほとんど何もわかっていなかった昔から、動かせたりしないかな…と98用LANボードを入手してみたりしたんですが…最初に入手したPC-9867(B4680インターフェースボードEC、要は10Base-5ボード)はメモリにマップされるタイプのボードで、マニュアルを見て要件を確認してから資料にあたってみると、上記の通り使い物にならず…。懲りずにその後もいくつかボードを入手したんですが、メモリを使わないタイプのものも他の条件が合わず…。
その一方で、以前から「可能性があるのではないか」と目されてきたボードがありました。それがメルコ(現・バッファロー)のLGY-98です。このボードはNE2000互換ボードであり、I/Oと割り込みしかリソースを必要としません。ただMZ-2800側の仕様が不明だったこともあって、将来に期待して入手はしたもののチャレンジはしてない、という人が何人もいたようです。
LGY-98のI/Oリソースは次のように設定が可能で…。
00D0h〜00DFh, 10D0h〜10DFh, 20D0h〜20DFh, 30D0h〜30DFh,
40D0h〜40DFh, 50D0h〜50DFh, 60D0h〜60DFh, 70D0h〜70DFh
INT0, INT1, INT2, INT5
割り込みの方の説明はもういいですね。I/Oアドレスの方は、考慮しなければいけないのは下位8bitの値でした。アドレスにもよりますが内部I/Oデバイスについて上位8bitがデコードされていないので、下位8bitの部分だけでバッティングを避けるようにしないといけないわけです。LGY-98は8種類のアドレスの設定が選択できますが、いずれも上位8bitの違いだけで、下位8bitは全部同じ値になっています。98用のボードによくあるパターンですね。
MZ-2800でのI/Oアドレス0D0h〜0DFhというと、0D0h〜0D7hは空いてますが、0D8h〜0DFhはFDCとその関連ポートのアドレスとして使われています。う〜ん、ボードの設定変更が意味をなさないとなると、こりゃやっぱり使えないってことか…?
…などとTwitterでつぶやいていたら「アドレスのA7だけ反転するといいのでは?」との示唆をいただきました。そりゃそうですよね、それなら改造も楽そうです。
ただ、LGY-98にはもう一つ問題がありました。それはアドレスや割り込みの設定はソフトによって行われるというものです。もちろんそれは98用のユーティリティソフトなので、MZ-2800で動かすことはできません。私は98シリーズを家に置かないことを信条としているので、ユーティリティを動かすことができないわけです。これから入手するとなるとほぼ間違いなく中古品になるはずですが、ボードの設定は旧ユーザーのそれぞれの事情で異なっていると思われ、偶然都合のいい設定のものを入手できない限り使えないってことになりかねません。
できれば、DIPスイッチであるとか、ショートピンなんかで設定できてほしい…LGY-98シリーズには何機種かあるようですがDIPスイッチ式は見当たりませんし、前モデルであるらしいEGY-98から既に同様のソフト設定式のようです。それでもなんとか、同じ仕様でスイッチ式のボードはないものか…。
…そんな都合のよいもの、ありました。ジャパンマクニクス(現マクニカ)のNE2098シリーズです。
NE2098シリーズには三種類あるようですが、入手したのは10Base-TコネクタのあるNE2098TPです。これはLinux/98にてLGY-98と同じドライバでサポートされているように、設定さえ終えれば全く同じに使うことができます。マニュアルは入手できませんでしたが、それよりもさらに正確とされる設定情報を公開してくれているところがありましたので、何も困ることはありません。
スイッチ式であることに加えてもうひとつこのボードの良いところは、使用するCバスの信号が一通りバッファICを経由していることです。SOPではありますが改造することを考えるとこの上なく有り難い。LGY-98では狭ピッチQFPのバスコントローラLSIに直接接続されていますから、果たしてどれだけ確実に改造できるか現物なしには判断できなかったので…。
過渡期の製品だからなのか、外付け電源端子がありますが少なくとも10Base-Tで使う限りはパソコン本体の電源で賄えるようです(電源についてのショートピン設定もある)。
LGY-98やその互換品を選択するのはソフトの方の理由もあるのですが、それは追々に説明します。
●LANボードの改造
ということで、早速改造してみます。
アドレスバスの改造は、A7信号がLS244を通っているのをLS240に変更するというものです。LS240の実装に利用したU15は本当の意味での空きランドではなく、機能を削除したあおりで搭載されなかっただけの部品なので、利用できるのは電源だけになります。反転したA7信号は元のU1のところに戻してもいいんですが、それよりROMと思しき空きランドの端子パターンを使うのが楽ちんですね。
割り込みの改造は絶対に必要というものではないんですが、上で説明したように8bitスロットに挿したボードでも割り込みを使うことを考えると16bitスロット側はINT5しか選択の余地がありませんので、もう1枚割り込みを使うCバス用ボードを挿せるようにするために施しています。
そのためには別の割り込み信号の端子がCバスコネクタにないとダメなんですが、どういうわけかINT6に相当する端子がパターンとして存在していて、部品を足せば割り込みを出力できるような回路になっていました。今回は手持ちがなかったのでINT0の出力をINT6に振り向ける改造を施しています。
割り込みの改造は、今回のように都合良くカードエッジの端子がある方が珍しいと思われますし、むしろMZ-2800のスロットを改造した方がいいかもしれませんね。MZでNCになってる端子から、ボードで使っていない端子に配線してやれば、INT0やINT1を使えるようになるはずです。
全体として、改造を丁寧に取り除けば元の状態に復旧できるような改造としました。動かせなかった時の保険みたいなものですけどね…。
●パケットドライバ
さて、ハードができたらこれでLANがつながる…わけではありません。ドライバとプロトコルスタックが必要です。それもMZ-2800用に作られたものが…なぜって、それはLANボードからの割り込み信号を受ける割り込みコントローラのアドレスや割り込みベクトルの値が違うからです…というのをさっき説明しましたよね。さらにはボードのI/Oアドレスも変更しましたから、それに対応させないといけません。
そういう時に具合が良いのが、PC-88VA/9801用TCP/IPプロトコルスタック「TEEN」です。TEENはパケットドライバに対応したプロトコルスタックなのですが、そのパケットドライバも「TEEN で DOS のネットワーク」というページでソースが入手可能です。その対応機種にLGY-98があるので、リソースの件も含めて、MZ-2800で使うのに見込みがあるんじゃないかというのも選択の理由だったりするのです。
ちなみに、バッファローが今でも配布しているLGY-98用ドライバ&ユーティリティに含まれるパケットドライバは、I/Oアドレスも割り込み番号もコマンドラインで直に与える形式(というか、TEEN用に作られたものと同じ雛形を使っている)なので、LGY-98のアドレス設定を前提としておらず、改造後のボードでも都合が良さそうなんですが、残念ながらMZ-2800内部の割り込み系が98とは違うのですからそのままでは使えません。
さてそのソースの修正。元のソースに従う形でも良かったのですが、MZ-2800にはMZ-2500から引き継ぐかのようにIOCSというものがあって(実際にはMZ-5500/6500のIOCSが概念的に近いかも)、ハードを便利に使えるかもしれない有用なファンクションが整備されています。もし割り込み関連で何かファンクションがあったらそれを使うのもいいかもしれません。
MZ-2800にはいわゆる「活用研究」みたいな本が出版されなかったので、IOCSに関する一般向けの情報は雑誌のMZ-2800そのもののレビュー記事ぐらいしかありません。その記事もAHレジスタに機能番号を入れてINT 51hを実行すれば使えることと大ざっぱな機能番号の説明しか書いてなかったのですが、その中の「特殊デバイス制御コマンド(A0h〜A5h)」ってのが怪しそうだということでMZ-2800エミュレータのデバッガで追いかけてみると…。
…あった。ありましたよ。直感は正しかった。
INT 51h | ||||
AH=A4h | ||||
入力 | 出力 | |||
DL (共通) |
0 … IR11 1 … IR12 2 … IR13 3 … IR14 |
|||
AL | 0 … 割り込み禁止&ISR登録解除 | ES | 登録されていたISRのセグメントアドレス | |
AX | 登録されていたISRのオフセットアドレス | |||
1 … ISR登録 ES … 登録するISRのセグメントアドレス DI … 登録するISRのオフセットアドレス |
ES | 前のISRのセグメントアドレス | ||
AX | 前のISRのオフセットアドレス | |||
2 … 割り込み禁止 | ||||
3 … 割り込み許可 | ||||
4 … 割り込みステータス | AL | 割り込みステータス |
つまり、IR11〜IR14の割り込みは8259Aの発行する割り込みのベクタ(4Bh〜4Eh)の所に飛び先を書くのではなく、このファンクションを使って登録するのがMZ-2800流ということになるんでしょうね。割り込みが入るとそれぞれの入り口がIOCS内にあって、そこから改めて登録されたISR(割り込みサービスルーチン)をFARコールするという仕組みです。
8259Aは割り込み受付後、ISRにてEOI(割り込み終了)を書き込まれることで受け付け状態を解除するのですが、それもIOCSで代わりにやってくれます。ユーザーのISRはIOCSから間接的に呼び出されることから、IRETではなくRETFで戻ります。
割り込みの他は、CPU判定や機種判定ルーチンがある部分を少しいじって、妙な判定結果が出ないようにしておきました。他はほぼいじっていません。
起動してみると、こんなふうになります。
少なくともI/Oアドレスとレジスタの並びがちゃんと合ってれば、イーサネットアドレス(MACアドレス)が正しく表示されます(本体スロットに挿入する前にメモっておいてね)。
パケットドライバのダウンロードはこちらからどうぞ。
●TCP/IPプロトコルスタックTEEN
TEENの方も各機種共通にはなっていなくて、プロトコルスタック内で時間を計測するのにタイマ割り込みを使用しているのですが、この方式が機種ごとに微妙に違っているために、プログラムもそれぞれ用に分かれることになっています。
そしてもちろん、MZ-2800は既存の機種とタイマの方式が異なるために、やはりソースの修正が必要です。98用TEENではRTC割り込みを使うものもあるのですが、MZ-2800ではRTCから割り込み信号として出ているものはありませんので、タイマ割り込みの発生源には8253を使うことになります。
MZ-2800の8253のクロック入力は次のようになっていまして、
チャンネル1の入力に入っているチャンネル0の出力というのは、チャンネル0のカウント値が32で設定されるので、おおよそ1kHz(1024us周期)となります。TEENでは1msまたは10ms周期のタイマ割り込みを使うことになっていますので、今回はチャンネル1にカウント値10を設定して10ms周期としました。この周期がプロトコルスタックで使われる計測時間の単位になるので、例えばpingで表示される往復時間も10msになってしまうのですが、1ms周期にしたくともチャンネル1にカウント値として1を設定するとカウントが止まってしまうので…。
1ms周期を使おうと思うとチャンネル0かチャンネル2ということになるのですが、チャンネル2は音楽演奏の時に使われるなど他のプログラムが設定を変えてしまう可能性があり、チャンネル0はシステムで使用されていることからその利用は慎重にならざるを得ません。しかしまぁ、この単位時間が10msになったところで、一部の表示時間や制御時間が大ざっぱになるだけですし、一番大事なのはデータが転送されることですから、あまり気にしないことにします。
ところで、タイマ割り込みにもIOCSルーチンがあったりしませんか? …ええ、あるんですよ。
INT 51h | ||||
AH=A0h | ||||
入力 | 出力 | |||
DL (共通) |
0 … チャンネル#1 1 … チャンネル#2 |
|||
AL | 0 … 割り込み禁止 | |||
1 … ISR登録&カウント値設定&割り込み許可 CX … カウント値(下11bitのみ有効) ES … 登録するISRのセグメントアドレス DI … 登録するISRのオフセットアドレス |
||||
2 … 設定値確認 | CX | カウント値 | ||
ES | 登録されているISRのセグメントアドレス | |||
AX | 登録されているISRのオフセットアドレス |
システムで使われているチャンネル0に対しては設定できません。8253は動作モード2で設定されます。8253/8254を使うTEENではモード3でカウントされるのですが、OUT端子から出てくる波形が周期毎のパルスかだいたい50%のデューティ比のものかの違いだけで、エッジ入力モードになっている8259Aにしてみれば同じ事です。
ユーザーISRは上の外部割り込みと同じくIOCSから間接的に呼び出される(FARコール)ので、終わりはRETFとなります。
後は機種判定絡みをいじって、まぁIOCS使ってるのだからMZ-2800専用になるのである程度ショートカットしたりとかしました。機種コードは未定義のところから$0Cというのを設定しています(中では起動時のメッセージ以外、特に使っていません)。
もう一つ、TEENのAPI入り口となるソフト割り込みについて、$70とするのが標準的なのですがMZ-2800のブートROM(IOCS)がベクタを40h〜6Fhまでしか初期化してくれず、MS-DOSもそれ以上のベクタはノータッチのようで、例えば一度TEENを常駐させた状態でリセットボタンを押して再起動させた後、再びTEENを起動すると常駐していた痕跡が消えてないのでうまく動きません。MZ-2800の標準は$6Fにしましょうかね? TEEN.DEFの該当箇所に書いておいてください。
起動するとこんな感じ…ってあっさりしたものですけど。
pingもftpも動きますよ〜。これでファイル転送も楽になります。
個人的にTEENの気に入ってるところは、簡易Sambaクライアント「ESESMBC」というプログラムがあることです。コマンドラインにいちいちユーザ名・パスワード・ホスト名を書かないといけない煩雑さはありますが、DOSコマンドのようにファイル転送ができるのは魅力的なのですよね。ここまで動いているのだし、DOS3.1なんだからネットワーク・リダイレクタもあるし、ネットワークドライブにならないものかな…。
TEENのダウンロードはこちらからどうぞ。
●他のボードではどうか?
元ネタとも言えるLGY-98では、同様の改造を施せば原理上は動かせるはずです。ただ、リソースの設定に別のI/Oポートを使っているようで、アドレスバスを改造してしまうとユーティリティからボードが見えなくなってしまいます。そのため、必要な設定を行ってから改造するか、スイッチを設けてアドレスバスを改造しない状態に戻せるようにするかの配慮をしないといけません。
それ以外にもLGY-98は部品点数が大幅に削減されたせいで加工が難しそうだったんですけど、一部(あるいは全部?)のボードに作業しやすい改造ポイントが見いだされたことで状況は好転しました。その内容はSugaさんによる動作報告を参照してください。NE2098よりもLGY-98の方が中古市場の流通数も多いでしょうから、こちらの目処が立ったのは良いニュースですね。
もっと他のボードではどうでしょうか? パケットドライバのAPIは明確に規定されているため、パケットドライバさえ動いてしまえば今回改造したTEENがそのまま使えます。つまりパケットドライバをMZ-2800に対応させることが可能かどうか…ということに尽きるわけです。
PC-88VAユーザーの有志は、一部の98用LANボード用パケットドライバにパッチを当てることでそのボードを88VAで使えるようにしています。ただそれは98と88VAの設計の一部が似ているから最小限で済むのであって、もっと差のあるMZ-2800にはその手は使えないでしょう。そうするとソースが欲しくなりますね…。
PC-98用の他のNE2000互換ボードはLinux/98やFreeBSD/pc98でも多数サポートされているわけですから、理屈として使える可能性は高いはずです。FreeBSD/pc98のedドライバは、微妙に実装方法が異なるそれぞれのボードに対する振る舞いを設定に従って切り替えてますので、そのソースを読んで仕組みが把握できたらそのようにパケットドライバを書き換えることで動かせそうな気がしてきます。パケットドライバはもともとCrynwr Softwareという会社が作ったもので、ソースも入手することができます。あとはチャレンジあるのみ? 挑戦者求む…!
もうひとつ、互換性のお話。MZ-2500にはカンガルーポケットにあるスイッチにより、MZ-80BやMZ-2000にコンパチなモードに切り替えることができました。GRAMやFD・プリンタ・RS232Cの各I/Fを搭載したフルスペック仕様の MZ-80BやMZ-2000が使えるわけです。
MZ-80B/2000モードには別の方法で切り替えることもできます。スイッチを2500モードにしたまま、「X」キーを押しながらリセット(つまりIPLスタート)するとMZ-80Bモードに、「Z」キーを押しながらだとMZ-2000モードになります。この際、CPUのクロックは6MHzのままになるので、本来の80Bや2000の1.5倍速く動くことになります(テープのタイミングとかも速くなる)。
ではその機能、MZ-2800の2500モードではどうなるでしょうか。もちろんカタログでは、80Bモードや2000モードが存在するなどと書かれてはいません。しかし…やってみるとこうなるのですよ。
これはMZ-2500用のハイドライドIIを起動させてみた動画です。ハイドライドIIは、MZ-2500用と言っても2000モードで動かすことになっているゲームソフトでして、じゃあなんで2500用なのと言うとメディアが3.5インチフロッピーだからなんだと…。2500用なんだったら、せめてBGMはFM音源で鳴らしてほしいと思いますよね…。それはともかく、今回のような検証にはピッタリのソフトだというわけです。
いろいろ注目するポイントがありますが、まず最初のIPLメッセージ。フロッピーを挿入せずに起動しているのでエラーが表示されているわけですが、この文字列、2000モードで使われる8ドットフォントですよね。ハード的には、少なくともこの瞬間は適切にCGROMを切り替えていると言えそうです。
そして起動すると、グラフィック画面が緑しか表示していない…。ただBGMは(6MHz動作なので音程が狂ってますが)鳴っていますし、オープニングとして次々切り替わる画面もそれなりに表示されています。
つまり表示系はなんだかおかしいですが、プログラムとしては一応動いているんですよ。おかしい表示系も解像度は正しいわけですし、なにかこう…必要なものがちょっと欠けちゃったみたいな、見えてないだけで2000モードはちゃんとあるような雰囲気がある気がするのです。
動画タイトルに「その1」とあるのは、MZ-80Bモードで動く、フロッピーからIPL起動してグラフィックを使ったソフトを使った第2弾を予定していたからで、ただ肝心のソフトがない(そもそもIPL起動のディスク版ゲームとかが少ない)ので動画が撮れないために何年も「その2」が制作できないでいます…。
まだ直感レベルの理解ですが、表示を補ってやればちゃんと使えるような気がするんですよね…例えば拙作「MZ-1500バージョンアップアダプタ」のように、書き込みだけ受け付ける表示回路をFPGAとかで作ってしまうとか、です。ただ単に表示が正しくないだけで、内部ではちゃんとバンクが切り替わってたり、I/Oが操作されているならば…。
上でも触れたように、MZ-2800には活用研究などのアーキテクチャ解説本が発行されなかったので、紙媒体での最も詳細な技術解説は発売当時の雑誌のレビュー記事ということになります。月刊I/O・1987年6月号は回路図も掲載されたとても力の入ったものでしたが、月刊Oh!MZ・1987年6月号にも多少の技術情報が掲載されています。おそらく同じタイミングで、サービスマニュアルぐらいの資料がそれぞれの編集部に送られてきたのでしょう。
そのOh!MZ誌の記事には、「ブート可能なデバイス」というI/O誌にも書かれていなかった一覧があります。せっかくなのでここに書き出してみましょう。
デバイス | ブート時のデバイス名 | |
---|---|---|
フロッピードライブ #0 | (内蔵:標準装備) | A |
フロッピードライブ #1 | (内蔵:標準装備) | B |
ハードディスク #0 | (外設:オプション) | C |
ハードディスク #1 | (外設:オプション) | D |
フロッピードライブ #2 | (外設:オプション) | K |
ROMディスク | (内蔵:オプション) | R |
表の上が最も高い優先順位のデバイスとなります。ハードディスクから起動できるようになっていても、本体FDDにDOS起動ディスクを入れておけばそこからブートするということですね。「ブート時のデバイス名」とは優先順位を飛ばして直接的に起動したいデバイスを指定するためのもので、本体FDDにどんなディスクを入れていてもCキーを押しながらリセットしたらFDDは無視してHDD#0から起動しようとします。
本体添付のマニュアル(MS-DOSTMV3.1マニュアル)に書かれているのは最初の3行だけ。確かに、HDDを接続しないで外付けFDDにだけシステムディスクを入れておくとそこから起動しますから、ちゃんと製品にも実装されている機能だと言えます。つまり、4行目から下は言わば裏技みたいなものですね。
カタログだと物理的に接続できないように読み取れる2台目のHDDからの起動(もちろんマニュアルにも記述がない)というのも興味深いですが、やはり注目すべきはROMディスクですね。MZ-2800にROMディスクというのは製品としてカタログには存在しませんし、マニュアルにも何も書かれていません。
Oh!MZ誌の記事の方にも詳細は不明とのことだったのですが、もしROMから起動させられるのならIOCSがサポートしないデバイス…例えばSCSIからのブートなど、PC-9801やIBM PC/ATなどでは当たり前にある「拡張ボード上のROMのプログラムを実行して初期化する」機構に多少近いことが可能になるわけで、なんとか解き明かしたいところです。
ということでエミュレータのデバッガでいろいろ観察してみたところ…発見しました(お手軽だなぁ〜…)。結論から先に言えば、ROMディスクとはプロテクトメモリ空間である0xf00000〜に割り当てられたROMのことでした。
MZ-2800は、リアルモードのメモリアドレス0x80000〜0xbffffをバンク切り替え(メモリウィンドウ)して、プロテクトメモリの任意のエリアを割り当てて読み書きすることができます。RAMディスクもプロテクトメモリ空間に実装されますが、メモリウィンドウを通してアクセスすることでプロテクトモードへの移行を不要にしています。
メモリウィンドウレジスタの中身はこんな感じになってます。
アドレス $8C | |
7 | 無効 |
6 | 無効 |
5 | WA23 |
4 | WA22 |
3 | WA21 |
2 | WA20 |
1 | WA19 |
0 | WA18 |
RAMディスク用メモリということになっているMZ-1R35とMZ-1R36は合わせて2MB、3スロット装着できるので計6MB。割り当てられるのは0x200000〜0x7fffffなのでメモリウィンドウレジスタのbit5はRAMディスクだけ考えた場合には不要ですが…リセット後の動きを見てみると、プロテクトメモリのチェックのため0x04〜0x38まで4つおきの数値をセットした後、ここに0x3cをセットしているではないですか。0x3cというと、メモリアドレスは0xf00000。そしてその後の処理というと、
となっており…。0xebはjmp short、0xe9はjmp nearで、実は起動可能なフロッピーのトラック0・セクタ0の先頭も同じ…さらに言えば、システムディスクの起動も7000:0000にIPLを読み込んで先頭をコールしているらしい…となれば、これはROMディスクなるもののIPLを読み込んで実行しようとしている…?
ならば、0xf00000に起動フロッピーのベタイメージを貼り付けたらそこからブートするとか? とは言うもののボードを作って試すのはかなり面倒…ということで、エミュレータを改造して試すことにしました。幸いにして改造箇所は容易に見つけられましたので、ささっと作って動かしてみたのがこちら。
「起動できてへんやんけ〜!」と思うなかれ。確かにDOSが立ち上がってはいないのですが、表示されている"Bootstrap Loader
Version 1.0A" "システムファイルが読み込めません." "本体をリセットしてください."というメッセージは、ROMエリアに貼り付けたフロッピーのIPLに含まれているものです。 FD1に起動可能なフロッピーイメージをセットしておいて、リセット直後からRキーを押すとフロッピーからブートせずこの表示になります。上記の表の通り、確かにこれはROMディスクを起動しようとした痕跡というわけなのです。 さすがに、MZ-2500のROMディスクのように単純にフロッピーのイメージを貼り付けるだけでは起動しないようです。FD1にイメージをセットしておけばIPLが起動する時にそちらに処理が移るかとも予想したのですが、そうでもありませんでした。呼び出し前に用意される情報がフロッピーのIPLとしては不足しているんでしょうね。おそらく、ROMディスク用のIPLというものが必要なんでしょう。 |
起動の優先順位は固定で、最も低い順位にROMディスクがあるということは、やっぱり拡張ボードにBIOS ROMを載せてAPIを提供するような他メーカー製品とは想定した使い方が違うということなんでしょうね。
MZ-1E32のページで紹介したこの謎ボード、空いているソケットって何用なんだろうと思ってたんですが、もしかしたらROMディスクかもしれませんね(まだ調べていない)。 |
ある一時期、仕事の都合で横浜に行くことになったのですが、ちょうどタイミング良くトラ技の後ろの広告に掲載されていた中古のMZ-2800の価格が落ちたこともあり、ならばS-OSユーザーズクラブが運営していたBBS「S-OSネット大阪」の支局を作るのって面白そうだなと思ったのが、入手のキッカケでした。
わかってはいましたが、購入して届いたのは本体とキーボードのみの商品で、さすがにそれだけではどうしようもないのでシャープのサービスにマニュアルとシステムディスクを補修部品として注文してみました。発売から6年くらい、製造終了からしても数年くらいだったからか、マニュアルは98エミュレータ以外が揃い、システムディスクはコピーをもらえました。2万数千円程かかりましたかね?
なお98エミュレータのマニュアルは、後日本物を見る機会に恵まれまして、なんとそれはBNN刊「MZ-2800コンプリートガイドブック」の98エミュレータ解説部分とだいたい同じでした。
BBSの開局にあたっては、S-OSUCの森さんにBBSのソフトをBASIC-M28に移植してもらいました。HDD運用が基本なので、当時流行していたSPCボード(ダイナブックや98ノートにSCSIでHDDなどを接続するI/F。共立電子の基板を流用した)を98用SASI I/Fに強引に載せたボードを作りました。
しかしこれに大ハマリ…どうにもバスが化けるのか、エラーが頻発するんですよね。どうしたものかとほとほと困っていたところに、入会して間もないサンデーネットで知り合ったユーザーさんにお世話になってようやく解決しました。原因はGND不足…エンジニアの端くれとして情けない…。
開局したBBS「S-OSネット横浜」は、5年ほど運用した後私が横浜を離れたことで閉局しました。当時ご利用いただいたみなさん、ありがとうございました。電波新聞社の「BBS電話帳」にも掲載してもらったせいか、秀丸エディタに始まるシェアウェアブームに乗ったらしい何者かが98用のDOSで動くツールみたいなのが入ったフロッピーをいきなり送りつけてきて、まぁダウンロードできるよう登録しろとかいうことだったんでしょうが、98でもDOSでもないBBSには無用のものだったんで、有り難くDOS用(1.44MB)にフォーマットさせていただいたのも良い思い出です。普通さ、依頼する手紙とか、テキストファイルとか入れないかな。無言でさも当然のように(当然こちらも、アップロードできない時はメディアを送れとか言うわけがない)フロッピーを送りつけられたっていい気がするわけないでしょうよ…。