PC-8801 用拡張メモリボードの話


[基板写真]
写真のページはこちら


!!!注意事項!!!

こういうものを書く時の決まり文句ですが、 このページの内容については一切保証はできません。

…………


PC-8801用の拡張メモリの歴史

PC-8801用の拡張メモリは、古くはNECの純正のオプションである PC-8801-02N という型番の 128kバイトのものや、 I/Oデータから発売されていた 256kバイトのものがありました。 しかし、実際にまともに対応ソフトが出るようになったのは、 PC-8801MR に始まる 2HDドライブを搭載した Mシリーズに 標準で 128kバイトの拡張メモリがのるようになってからです。 また、 Mシリーズの登場に合わせて登場したマルチボードAにも 128k バイトのメモリが積まれていました。また、リバーコムからは ROMBO2 というマルチボードA 互換のボードが、 I/Oデータからも 1M/2Mバイトのボードが発売されました。


88 の拡張メモリのしくみ

88の CPUは Z80ですから 64kバイト以上のメモリは扱えません。 ですから 88の拡張メモリはいわゆるバンク切替えによって アクセスを行ないます。バンクの単位は 32kバイトで アドレスは 0000h〜7FFFh でアクセスされます。 このため BASICからは直接拡張メモリを利用することはできません。


拡張メモリに対応した市販ソフト

MR 登場以前は拡張メモリに対応したソフトはほとんど無かったと言って いいと思います。昔の I/Oデータの広告には対応ソフトとしていくつかの ワープロソフトなどが挙げられていましたが、実際に活用していた という人はほとんどいないのではないでしょうか。

MR 登場以後はちゃんと拡張メモリを使うソフトが出ましたが、 結局拡張メモリのないマシンとの互換性を保つために、 拡張メモリが必須であるソフトというのはほとんどなく、 拡張メモリがあるとやや性能向上がある、といったものばかりでした。

拡張メモリを使用するソフトを挙げると、 代表的なものとしては n88日本語BASICがありました。 これは拡張メモリが存在するとそこにシステムの一部のほかに 16ドットの半角のフォントがロードされて表示に 使われるようになるというものでした。 拡張メモリのないマシンでは通常の BASICのテキストフォントが 使われるようになっていて、 BASIC のフリーエリアの量も かなり異なりました。

また、日本ファルコムの「ドラゴンスレイヤー6(英雄伝説)」以降 (注:これは未確認です) のソフトも拡張メモリに対応していました。ファルコムの 88末期の ゲームについては特に拡張メモリ対応は明記されていませんでしたが、 いずれのゲームも拡張メモリをディスクキャッシュとして 使用するようになっていました。 2Dのドライブの容量を考えると これはかなり快適でありうまい利用方法だと思いましたが、 拡張メモリが使用されていることに気づいていないユーザーも かなりいたのではないでしょうか。


拡張メモリを使用するフリーなソフト

MR で拡張メモリが標準で搭載されるようになっても、 マニュアルには拡張メモリのアクセス方法については 全く記述がありませんでした。ですからユーザーが個人で 拡張メモリを利用するのは難しかったのですが、どこからか資料は 出回るものなのか、PCマガジン誌などには BASICで利用できる RAMディスクの記事などが掲載されていました。

キャリーラボの出していた「Carry-DOS(通称C-DOS)」では、 直接は拡張メモリを利用しませんが、その上で走るフリーのソフトには 拡張メモリを利用するものが多数ありました。例としては、 RAMディスク、キャッシュディスク、 60k 利用可能な CP/M エミュレータなどが存在しました。C-DOS を拡張する システムである「KeyStone-System」では、各プログラムの使用する 拡張メモリのバンク番号も管理できるようになっていました。 (注:88やC-DOSはしばらく触っていないので最近の事情は分かりません)


メモリボードを自作しよう!

私が拡張メモリボードの自作について考え始めたのは 高校2年のころです。当時私は PC-8801mkIISR を所有していて、 先に述べた C-DOS 上の JET-TERMINAL というソフトで アマチュア無線の RBBS にアクセスしていました。

88の 640×400 のモノクロのグラフィックモードで 80×25 の日本語を表示させ、「みゅいんみゅいん」という 眠くなるスクロールに耐えながら使っていたのですが、 一番の問題は漢字変換の遅さでした。今思えば 2Dのディスクの 250kバイト強の辞書に多くを求めるのが間違いなのですが、 RBBS の書き込みの中の RAMディスクを使っている人の 話を聞いていたらどうしてもその速さを体感したくなったのです。

手っ取り早い方法としては Mシリーズを買うとか マルチボードを 買うという手段はあったわけですが、当時の私にはそんな金は ありませんでした。そこで自作を考えたわけですが、そのためには 拡張メモリのソフトウェアおよびハードウェア上の仕様を知ることが 必要でした。


88の拡張メモリの仕様は?

そんな折、ある時自分の部屋の本棚を整理していたら、PC-8001の 拡張用ユニットである PC-8012 のマニュアルなんてものが出てきました。 なんでこんなものを持っていたかというと、これは 88SR を買った時に 親戚にもらったまま忘れていたもので、他にも PC-8011 とか PC-8031-2W とか PC-8097 とかのマニュアルもありました。

これらを見てみると、「拡張スロットを利用したボードの例」が いろいろとあり、その中に“ROMKILL”信号を利用したものがありました。 「おお、これを使えば拡張メモリも作れそうじゃん」と思った私は さらに資料を集め始め、秀和システムから出ていた解析本にある PC-8801の全回路図やカタログ等のマルチボードAやI/Oデータの 1Mのボードの 写真(^_^;)を参考にしたり、拡張メモリを使うプログラムを 載せている本を買い漁って逆アセンブルしたり、実際にメモリボードを 使っている人に RBBS上でI/Oポートの動作を確かめてもらったりと、 受験勉強もそっちのけで回路の設計に取り掛かりました。


拡張メモリの仕様 : [ソフトウェア編]

ソフト側から見た拡張メモリの操作法についてはわりとすぐに わかりました。使用する I/O ポートは 0E2h と 0E3h であり、 0E2h でリード/ライトの制御、 0E3h でバンク番号の指定を 行ないます。詳しい仕様は以下の通りです。



なお、いずれのポートの値もリードすることは可能ですが、 0E2h のリードについてはビットが反転したものになります。また、 マルチボードAなど一部のものについては、ポートにライトを行なった直後に リードを行なう場合には、結構なウェイトをはさむ必要が あるようです。ボードの存在チェック等のルーチンで利用する場合には 注意が必要です。また、 8000h 番地以降のメモリアクセスでは これらのポートの値は影響しません。


拡張メモリの仕様 : [ハードウェア編]

さて、以上のようにソフトウェア上の仕様については 大体明らかになったわけですが、実際にハードウェアを 設計しようということになると、以上のことだけでは わからないことがいくつもあります。実際に回路を設計し始めてから 出てきた問題点としては以下のようなことがありました。

以上の問題点については、資料の PC-8801 初代の回路図を眺めたり、 RBBS で各種ボードを所有している方たちから情報を頂いたり、 どうしてもわからないものについては適当に決めたりして;-p 設計を進めてしまいました。以下実際どうしたかの説明ですが、 詳しくはこのページの最後に書いた 実物の回路図 の説明のところを見て下さい。


  1. 複数のボードを差した時の I/Oポートの読み出し方法は?
  2. 0E2h, 0E3h の各 I/O ポートについては各ボード上に ラッチを配置すれば、ライトはそのまま各ボードに対して 行なわれます。しかしリードについては複数のボードから 同時に拡張バス上にデータが出力されてしまうと まずいことになります。

    そこで最初に考えたのは、各ボードに 0E2h, 0E3h の 入力を許可/禁止するジャンパを設け、複数のボードを 装着した場合はそのうちの一つだけをリードを可能にする という方法でした。

    しかしその後いろいろ調べたところ、 PC-8801-02N では I/O ポート 0E2h からの読み込みを禁止するジャンパは あるもののその他のボードではその類の設定はなく、 また PC-8801MHでは存在しないバンク番号を 0E3h に出力すると 0E2h, 0E3h からの入力ができなくなる、ということが判明しました。 このことから、 0E2h, 0E3h からの入力は、 0E3h で選択されたバンク番号のメモリが搭載されているボードが データを出力するという仕様になっているという結論に達し、 設計もそのように行ないました。 これならばユーザがいちいちジャンパ設定を考える必要もなく、 また、どのバンクにメモリが存在するかのチェックも行なえるため、 合理的な仕様であるといえます。ただし、実際の製品では 新旧のボードを同時に使ったりすると うまく読み出せないこともあるようです。

  3. 1Mバイトのボードのバンク番号の配置は?
  4. これについては実際に 1M のボードを所有している方から 情報を頂きました。それによればバンクの配置はジャンパによって 4種のうちから選ぶことができ、それぞれ

    設定1: 00-07h, 10-17h, 20-27h, 30-37h
    設定2: 08-0Fh, 18-1Fh, 28-2Fh, 38-3Fh
    設定3: 40-47h, 50-57h, 60-67h, 70-77h
    設定4: 48-4Fh, 58-5Fh, 68-6Fh, 78-7Fh

    となっているということでした。つまり基本的には 下位 4ビットが 0〜7 となる場合と 8〜F となる場合にわけられる ということです。

  5. 128kバイトのボードと 1Mバイトのボードは共存可能か?
  6. 128kバイトのボードは、 0E3h に出力するバンク番号は 下位 4ビットのみ有効であるので最大で 4枚まで搭載できる ということになります。一方 1Mバイトのボードはバンク番号は 8ビットとも有効であるので 128kバイトのボードと 1Mバイトの ボードはバンク番号の下位 4ビットが重なる位置には 配置できないことになります。

    詳しい説明は 実物の回路図 のところに書いてあるのでそちらを見てもらうこととして、 上に書いたように 1Mバイトのボードは下位 4ビットが 8-Fh に 位置するところに配置できるため、 128kバイトのボードを 0-3h および 4-7h のところに配置すれば共存できることになります。 つまり、 128kバイトのボードは 2枚までなら 1Mバイトのボードと 共存できます。これなら Mシリーズのようにバンク番号を 変更できないものがあっても 1Mバイトのボードが使えます。

    (あまり関係ない話ですが、ファルコムのゲームは バンク番号 0〜7 までしか存在チェックをしないので、 Mシリーズに 1Mバイトのボードを載せても 1Mのほうは 全く使ってくれません。ちょっと悲しい)

  7. 拡張スロット上の ROMKILL 信号の仕様は?
  8. 実際の設計で一番問題となったのがこの ROMKILL 信号の 仕様です。この信号線をどうかすれば本体内の メモリアクセスが禁止されるようだということはわかるのですが、 実際にどうするとどうなるかということについては 皆目見当がつきませんでした。まあ、実際の製品として 拡張メモリは出ているわけですからどうにかすればできるという ことは確かなのですが、やはり一番悩んだのはここです。

    PC-8012 のマニュアルには ROMKILL 信号については 「この信号をアクティブにすると本体内の ROM の アクセスが禁止されます」とありました。PC-8001 ならば これでいいわけですが、 88 の場合には本体内のアドレス 0-7FFFh には BASIC の ROM 以外に裏 RAM が存在します。 さらには 4th-ROM なんてものも存在します。こいつらは ROMKILL 信号によってどうなるかということが第一の 問題でした。

    さらに、拡張メモリの仕様ではリード/ライトどちらかのみを 拡張メモリに行なうということもできなければならないため、 ROMKILL 信号をいつアクティブにするか、という問題もありました。

    結局 ROMKILL 信号の働きについては初代 88 の回路図と 一月近くにらめっこした結果、 ROMKILL 信号がアクティブになると 0-7FFFh にある本体内のすべてのメモリについてアクセスは できなくなるという結論に達し、それに基づいて設計を行ないました。

    ROMKILL 信号をアクティブにするタイミングについては、 どう考えても本体から RD および WR 信号が出てきてから でないとボード上のメモリがアクセスされるかどうか 判定できないので、 MEMR および MEMW がアクティブになってから ROMKILL 信号をアクティブにすることにしました。 これだと本当に本体内のメモリ対する ROMKILL 信号が間に合うのか 疑問でしたが、それ以外に考えられなかったので そのように設計しました。

    実際にどうしたかについては 実物の回路図 のところに書いてあるのでそちらを見てください。

  9. D-RAMを使う場合の制御信号の利用方法は?
  10. 一般に、メモリシステムを構築する場合には 「簡単に作るならば S-RAM」を使い、 「安く大容量を得るならば D-RAM」を使うと良いと 言われます。で、自作の目的を考えるならば当然「安くて大容量」の D-RAM を選択したくなるわけですが、最初に拡張メモリの設計を 行なった時には D-RAM の設計以前に今までに挙げたような 設計上の問題があったためそこまで手が回らず、はじめは 当時出回りはじめていた 1Mビット(128kバイト)の S-RAM を 用いた回路を設計しました。

    ところが、そのようにかなり安直に仕様を決定して製作した S-RAM のボードは割とあっさりと動作したため、 調子づいてこんどは D-RAM を使って大容量のものを 作ろうということを考えたわけです。

    D-RAM を使用する場合は S-RAM の場合と比べて、

    • アドレスを 2回に分けて与えるための回路および信号が必要
    • リフレッシュが必要

    という問題があります。実際に設計を決めるまでには 各資料や回路図をかなり読み漁ったのですが、 結局どうしたかについては 実物の回路図 のところの説明を見て下さい。

    簡単にいうと RAS については拡張バス上の RAS0, RAS1 信号の OR をとったものを、アドレス切替えについては拡張バス上の MUX 信号を、 CAS については MUX 信号をディレイラインで 20ns 遅らせたものを使用しました。
    リフレッシュについては、トランジスタ技術誌に載っていた 記事を参考に、拡張バス上の RFSH 信号を用いて CAS before RAS による自動リフレッシュを行なうこととしました。


以下は工事中です…

だいたい書こうと思ってたことは書いたつもりですが、 別のことを思い出したらまた書き足します。
このほかにも上でちょっと書いた S-RAM のボードの回路図とか、 SR用に作った第2水準漢字ROMボードの回路図とかも思い出せば書けますが、 欲しい人なんていませんよね。


PC-8801用 1Mバイト拡張メモリボード回路図

昔実際に作ったボードの回路図です。手書きしたものが 残っていたのでせっかくだから載せました。
gif file(30,999bytes)
こういう手書きの図を勝手に tgif 形式にしてくれる 賢いソフトってないもんですかね。

以下簡単な説明。


と、ここまで書いたところで家で昔の C-DOS のフロッピーを 漁ったところ、昔書いた資料が出てきました。せっかくですから 載せときます。上に書いたのと重複しているところもありますが 気にしないで下さい。
#いや〜、 PMarc とかで圧縮してあったので 展開するのに苦労しました ;-)

以下は自作の際には直接関係ありませんが一応載せときます。


おまけ : PC-8801MH のちょっとした秘密

PC-8801FH/MH 以降の機種ではディップスイッチによる 設定がなくなり、「PCキーを押しながらリセット」をすることで EEPROM に各種設定を保存するようになっています。 で、そのためのプログラムの入った ROM がどこかに存在するはずですが、 このセットアップ用の ROM および EEPROM をアクセスするための I/O ポートは一度本体が立ち上がってしまうとアクセスできなくなります。

以下はこのセットアップ用の ROM を解析した結果です。ちなみに セットアップには I/O ポート 11〜15h および 6Eh, 6Fh が関係するようですが、 ブート後は利用できないので意味なしです。


[BACK] Homeに戻る
質問等は以下までどうぞ。
tsutsui@ceres.dti.ne.jp