tsutsuiの作業記録置き場

NetBSDとかPC-6001とかの作業記録のうち、Twitterの140字では収まらない内容や記事としてまとめるべき内容をとりあえず置いてみる予定

PC-6001 拡張スロット DRAM制御用信号

前回 の続きで、初代 PC-6001 の拡張スロットの DRAM関連の信号について調査した内容をまとめようと思います。

前提知識

PC-6001 の内部回路の情報については公式の解説があるわけでもなく、 @Hashi6001 さんが主催されている PC-6001同人サークル「TinyProject」さんから発行されている「PC-Techknow6000 Vol.2 <回路図篇>」から読み取った内容にほぼ依存しています。


PC-Techknow6000 Vol.2 <回路図篇>
by Hashi6001
500円
PC-6001/6601シリーズの同人誌第7弾。FPGA版P6「PC-6001F」の作者であるえすび氏が、実機を解析する…
Ameroadで買う!
 

こんなエントリをわざわざ読んでみようと思うようなハード好き(?)な方は、今すぐコンビニで WebMoney を買って上記 ameroad のページ電子書籍版を購入しましょう!
WebMoney は 2000円からの購入なので、 3000円分買って PC6000NOTE の既刊 もあわせて一式購入するのがオススメ

特に初代 PC-6001 ではゲートアレイのようなカスタムロジックICが一切使われておらず、すべてが汎用ロジックを含む市販のICで構成されている(マスクROMのデータを除く)ので、デジタル回路の勉強にも良いと思います。

拡張コネクタ信号仕様

拡張コネクタというかROMスロットの信号線仕様についてはググるといろいろ出てきますが、前回の拡張RAM回路図のエントリを書かれていた(そして PC-Techknow6000 Vol.2 <回路図篇> の回路図を解析をされた方でもある)えすびさんのブログの「拡張コネクタ」のエントリにある表がまとまっていると思います。 .xls のファイルですが LibreOffice Calc でも普通に読めます。

DRAM関連信号

前回のエントリ で紹介した 回路図の記事 と上記の 拡張スロットの記事 の表とでは各信号の表記に揺れがありますが、ここでは拡張RAM回路図で使われている信号名(信号名先頭の "^" が負論理記号)を使用することにします。

拡張RAMの回路図で接続されているのは以下の4本です。

No 信号名 信号の意味 (「P6つくろうブログ」より)
1 ^RAS2 外付けDRAM用RAS出力
3 ^DRD2 外付けDRAM用リードイネーブル出力
5 ^WE 外付けDRAM用WE出力
10 ^EXCAS 外付けDRAM用CAS出力

DRAMアクセス方法

DDRうんぬんといった最近のDRAMのアクセス方法はいろいろと複雑だと思いますが、Z80世代のベーシック(?)なDRAMのアクセスは以下のような手順で行われます。

  1. アクセスするアドレスのビットのうち半分のアドレス (Raw Address) を DRAMのアドレス入力端子ピンにセットする
  2. DRAMの RAS入力端子ピンをアクティブ (=L) にする
  3. アクセスするアドレスのビットのうち残りの半分のアドレス (Column Address) を DRAMのアドレス入力端子ピンにセットする
  4. DRAMの CAS入力端子ピンをアクティブ (=L) にする

DRAMのアドレス入力ピンに入力するアドレスについて、 Raw Address と Column Address のどちらを入力するかを切り替える信号をマルチプレクス信号と呼び、たいてい MUX もしくは MPX と表記されます。

古いDRAMではリード時に信号を出力する DO 端子ピンとライト時に信号を入力する DI 端子ピンが独立しています。リードとライトとはそれぞれ以下のような動作だったはずです。
このへん記憶で書いているので間違っていたらすいません

  1. CASがアクティブになった時点で書き込み指示の WE 端子ピンがアクティブであれば、 DO にはデータは出力されず CAS がアクティブになった時点で DI 端子のデータが DRAM に書き込まれる
  2. CASがアクティブになった時点で書き込み指示の WE 端子ピンがアクティブでなければ DO に読み出されたデータが出力される
  3. CASがアクティブになった時点で WE がアクティブでない場合でも、CASがアクティブになった後に WE端子がアクティブになるとその時点の DI端子の値が DRAMに書き込まれる (これをリードモディファイライトと呼ぶ)

リードモディファイライト動作となる場合は、DI 端子と DO 端子について 74LS244 や 74LS541 のようなバッファを追加して DI 端子から出力されるリードデータがデータバス上で衝突しないようにしてやる必要があります。

うろ覚えですが、Z80の場合は CPUから WR の信号が出るタイミングが遅いので、PC-6001 に限らず PC-8801 でもリードモディファイライト動作前提の回路になっていたと思います。

MPX信号による Rawアドレスと Columnアドレスの切り替えについては、 74LS157 等の 2入力1出力の汎用ロジックで切り替える回路が一般的です。このへんの配線が自作する場合に大変なんですよね……

リフレッシュ動作

過去のDRAMは内部の記憶素子であるコンデンサを定期的に再充電する必要がありました。この操作はリフレッシュと呼ばれ、 Rawアドレスをセットした状態で RAS をアクティブにすることで Raw アドレス単位で再充電が行われます。

Z80はこの DRAMリフレッシュ用の機能を内蔵していて、 M1サイクルの後半でアドレスバスにリフレッシュ用のアドレスを出力した上で ^RFSH ピンがアクティブになる動作だったと思います。なので、 ^RFSH 出力を DRAMの RAS に OR で出力されるように接続すればそのままリフレッシュ可能な動作になったはずです。 ちゃんと裏を取っていない話ばかりですいません

DRAM信号とリードライト動作

SRAMの場合は CS, OE, WE の3本でアクセスおよびリード・ライトが制御されますが、 DRAMの場合は上記のように以下の5本の信号が必要になります。

  • RAS
  • CAS
  • WE
  • (リードモディファイライト動作時の) リードバッファ制御信号
  • RASとCASを切り替える MPX信号

SRAMの場合は各端子がそのまま動作指令になりますが、DRAMの場合は単純ではありません。各信号の状態の組み合わせでどのような動作をするか、ということをざっとまとめると以下のようになります。

  • RASも CASもアクティブにならない場合:
     ⇒何も行われない
  • RASのみがアクティブになって CASがアクティブにならない場合:
     ⇒リフレッシュ動作のみが行われる
  • RASがアクティブにならず CASのみがアクティブになる場合:
     ⇒何も行われない
  • RASと CASとがいずれもアクティブになった場合:
     ⇒DO からリードデータが出力され、 WEがアクティブであれば DI の入力がライトされる

RASと CASとがいずれもアクティブになった場合であっても、リードバッファ制御信号がアクティブにならない場合は、結果としてデータバス上には何も信号は出力されないことになります。

まとめると、ロジック的には以下のようになります。

  • リード時は RAS, CAS, リードバッファ制御信号を(適切なタイミングで)すべてアクティブにする
  • ライト時は RAS, CAS, WE を(適切なタイミングで)すべてアクティブにする

これら 3つの信号の AND のロジックをどう生成して組み合わせるかは回路設計者の裁量であること、また、 RASにはリフレッシュ用の信号を加算する必要があること、さらに、 PC-6001では VDGによる VRAM アクセスもあることから、実際の回路はもっとややこしいことになります。

MPX信号

DRAM関連信号」の項で上げた拡張スロットのDRAM制御信号と「DRAM信号とリードライト動作」とを比べると、初代 PC-6001 の拡張スロット信号では MPX信号が出ていません。一方、 PC-6001mkII および PC-6601 以降の拡張スロットでは、初代PC-6001 で 16MHz が出力されていた端子が MPX信号として割り当てられていています。このあたりの変更の経緯はもはや当時の NECの中の人にしかわかりませんが、DRAM回路構成からするとある程度の推測は可能です。

MPX信号自体はアドレス入力ピンの信号を RAS用から CAS用に切り替えるための信号です。なので、実態としては CASの信号と一体として扱うことができ、MPX信号に対して 74157 等のアドレス切り替えロジックICの動作応答時間だけ立ち下がりを遅らせたものを CAS信号とする構成が一般的です。

この前提を元に PC-6001 の回路図を読んでいくと、以下のような構成になっていました。

初代PC-6001の MPX信号と CAS信号

拡張RAMの回路図等では ^EXCAS と書かれている拡張スロット10番の信号ですが、回路図上ではこの信号は RAS/CAS切り替えの 74157 の A/B 切り替え端子に入力されています。(Techknow6000 vol.2 Page 18 of 95 「PC-6001 ROM/DRAM」参照。 Page 19 of 95 の「PC-6006 拡張ROM/RAMカートリッジ」も同様)

CAS信号はどうなっているかというと、その RAS/CAS 切り替えをする 74157 の一部を使い、A/B の切り替えによる出力そのものを使って立ち上がりを遅らせて生成しているようです。これだと MPXによるアドレス出力切り替えと CASのアクティブ出力が同時になるので、タイミング的に大丈夫なのかという心配はありますが……。

初代 PC-6001 では上記の構成なので、実態としてはこの信号については MPX と呼ぶほうが適切という気がします。実際、ASCIIから刊行されていた「みんながこれで燃えた! PC-8001PC-6001 永久保存版」の中に再録されている月刊ASCII 1982年4月号の PC-6001 LOAD TEST の記事中にある「拡張メモリコネクタ接続図」では 10番ピンについて「MPX」と記載されています。

PC-6001mkII の MPX信号と CAS信号

mkII では拡張スロットに MPX信号と EXCAS信号の両方が出ていますが、回路図からすると以下のような構成になっています。

  • MPX信号はカスタムロジックICの「メモリコントローラ」から出力されている
    (Techknow6000 vol.2 Page 35 of 95 「PC-6001mkII メモリコントローラ/I/Oコントローラ」参照)
  • CAS信号は 16MHzクロックを使用して MPX信号を 4MHzクロックの 1/4 遅らせたもの
    (Techknow6000 vol.2 Page 30 of 95 「PC-6001mkII 画面制御 (CRTコントローラ)」参照)

初代ではフルディスクリートで組まれていた RAS2 や DRD2 の信号についても mkII では上記の「メモリコントローラ」から出力されており、かつ、この「メモリコントローラ」には DI/DO 分離のバッファも内蔵されているようなので、全体的にDRAM関連のタイミング制御がこのチップに集約されてアクセスタイミングについても最適化されたように見えます。

拡張スロットに出力される DRAM信号の非互換性については、実質RAMをのせる必要があるのは初代 PC-6001 のメモリ増設用の PC-6006 だけであること、かつ、新設された MPX信号のタイミングが従来の EXCAS信号よりも早ければ問題にはならない、という判断だったと思われます。

初代PC-6001DRAM信号のアドレスデコード状態

次に、初代PC-6001 の拡張スロットに出ている各DRAMの制御信号線が各メモリアドレスのアクセスに対してどう変化するのかを見てみます。このへんからは Techknow6000 vol.2 の内容べったりなので回路図を横に置きながらご覧ください

RAS信号

拡張スロット用の nRAS2 および内蔵DRAM用の nDR_RAS とも、 Techknow6000 vol.2 17 of 95 の「PC-6001 DRAM制御」にあります。フルディスクリートなのでごちゃごちゃしていますが、いずれも Z80 CPUアクセス・VDGアクセス・リフレッシュ の 3つの条件の OR で生成されています。

Z80 CPUアクセスの場合(=nMREQ がアクティブの場合)は、A15=H, A14=L の場合(つまりアドレス 8000h〜BFFFh のアクセス)は拡張スロット用の nRAS2 が、A15=H, A14=H の場合(つまりアドレス C000h〜FFFFh のアクセス)は内蔵DRAM用の nDR_RAS がアクティブになるようです。

VDGアクセスの場合は、I/Oポート B0h のビット2 が 1 の場合(=VRAMアドレスが 8000h または A000h の場合)は拡張スロット用の nRAS2 が、 0 の場合(=VRAMアドレスが C000h または E000h の場合)は内蔵DRAM用の nDR_RAS がアクティブになるように読めます。

「VDGアクセスの場合」の判定については Techknow6000 vol.2 15 of 95 の「PC-6001 14MHzタイミング生成」で VDG用に生成されている nVRAS を使用しています (「14MHzタイミング生成」の回路については Page 6 of 95 の概要説明も参照)。

「I/Oポート B0h の値」については Techknow6000 vol.2 12 of 95 の「PC-6001 16MHzタイミング生成/リセット生成/2msタイマ/割り込み生成/RS-232C用コネクタ」のページの右側真ん中あたりにある 74LS75 でラッチされていて、 VRAMSW2 がビット2 の値になります。

リフレッシュの場合は A14, A15 とは無関係に両方の RAS信号がアクティブになります。

ポイントとしては、
「RAS信号については CPUアクセス、VDGアクセス、いずれの場合も 8000h〜BFFFh および C000h〜FFFFh のアドレスについてデコードされた結果が含まれる」
ということになるかと思います。

CAS信号

nEXCASという信号名であるものの実態としては前述のように MPX信号ですが、これも Techknow6000 vol.2 17 of 95 の「PC-6001 DRAM制御」にあり、以下のようになっています。

CPUアクセスについては前述の RAS信号の CPUアクセス用の信号の拡張スロット用および内蔵DRAM用の2つの信号の ORを取ったものの立ち下がりを遅らせたもののようです。

VDGアクセスについては RAS同様に Techknow6000 vol.2 15 of 95 の「14MHzタイミング生成」で VDG用に生成されている nVCAS を使用しています。

ポイントとしては、
「RAS とは違い EXCAS には 8000h〜BFFFh or C000h〜FFFFh のアドレスデコード結果は含まれておらず拡張スロット用と内蔵用とで共通の信号になっている」
というところです。

リードバッファ制御信号

拡張スロット用としては nDRD2、内蔵DRAM用としては nDR_OE という名称ですが、これらも Techknow6000 vol.2 17 of 95 の「PC-6001 DRAM制御」にあり、以下のようになっています。

CPUアクセスについては nMEMRD信号(Z80 の nMREQ と nRD の AND)がアクティブ、かつ A15=H (8000h〜FFFFh のアクセス)の場合に、A14=L (8000h〜BFFFh のアクセス)であれば拡張スロット用の nDRD2 が、A14=H (C000h〜FFFFh のアクセス)であれば内蔵DRAM用の nDR_OE がアクティブになります。

VDGアクセスについては、 Z80のバス開放要求の応答である BUSAK を条件にして、 RASと同様に I/Oポート B0h ビット2 の値である VRAMSW2 の値に応じて 1 の場合(=VRAMアドレスが 8000h または A000h の場合)は拡張スロット用の nDRD2 が、 0 の場合(=VRAMアドレスが C000h または E000h の場合)は内蔵DRAM用の nDR_OE がアクティブになるようです。

PC-6001の場合、 CPUに対して BUSRQ のバス開放要求を出すDMAデバイスは VDGだけなので、 BUSAKアクティブ イコール VDGアクセス という扱いのようです。

いずれの場合もバッファの制御のみであるので、 DRAMの信号タイミングとは無関係に「バスにデータが出力可能な状態かどうか」という条件とアドレスの値のみで信号を出力しています。

ポイントとしては
「リードバッファ制御信号についても RAS信号同様 8000h〜BFFFh および C000h〜FFFFh のアドレスについてデコードされた結果が含まれる」
ということになるかと思います。

WE信号

WE信号についてはこれまでの信号とは打って変わって Techknow6000 vol.2 8 of 95 の「PC-6001 メインCPU/拡張コネクタ」にあります。

RAMに対して書き込みを行うのはCPUのみ(VDGのアクセス画面表示のための読み出しのみ)であるため、 WE信号は nMEMWR信号 (Z80 の MREQ と WR の AND) がアクティブ、かつ BUSAK (≒VDGアクセス) がインアクティブのときにアクティブになります。

ポイントとしては
「WE信号にはアドレスデコード情報が一切含まれない」
つまり、極端な話 0000h〜7FFFh の ROM領域に対する書き込み命令を実行したときにもアクティブになる、というところかと思います。

VDGアクセス時のアドレス信号

「拡張RAM回路におけるDRAM制御信号線」という本題とは直接関係ありませんが、 iP6 for Windows のページ 以下にある「PC-6001用の32KByte ROMカードを作ってみる」のページにおいて、「8000h〜BFFFhに配置したフラッシュメモリをVRAMアドレスに指定しても正しく表示されない」という問題が書かれているのを見て VDGアクセス時のアドレスバス出力がどうなっているのかも調べてみました。

結論から書くと、
「VDGの VRAMアクセス時は A15, A14 とも何も出力されていない」
つまりハイインピーダンス状態になっているようです。

「そんなんでいいのか」という感じですが、いろいろ見てみると以下のとおりで「初代PC-6001の標準構成であれば問題にはならない」ということになるようです。

  • A0〜A12 (= 0000h〜1FFFh)の 8KB分については VDG自身が出力する
    Techknow6000 vol.2 14 of 95 「PC-6001 画面制御 (VDG)」参照
  • A13 については VDGアクセス時 I/O ポート B0h ビット1 の値である VRAMSW1 が出力される
    Techknow6000 vol.2 8 of 95 「PC-6001 メインCPU/拡張コネクタ」の左下アドレスバスバッファ参照
  • A14 については RAS信号およびリードバッファ制御信号生成において I/O ポート B0h ビット2 の値である VRAMSW2 を参照しており、メモリIC側に A14 が存在しない限りは必要ない
  • A15 については VDGは A15=H のメモリアクセスしかしないため、メモリIC側に A15 が存在しない限りは必要ない

「アドレスバスをプルアップ抵抗も無いハインピーダンス状態で放置してよいのか」という点についても、PC-6001はすべて C-MOSではないバイポーラTTLロジックなので(結果として)問題にならない、ということのようです。

PC-6001用の32KByte ROMカードを作ってみる」のページのように「VDGアクセス時にもメモリICの A14,A15 にアドレスを入力してやる必要がある場合」は、以下のように処置してやる必要があると思われます。

  • nMREQがインアクティブかつ nRDR2 がアクティブの場合は拡張スロット側に対する VDGアクセスと判断して A15=H, A14=L を出力する回路を追加する
  • (安直に使用するフラッシュROMが C-MOS入力と仮定して)100k〜1MΩ程度で A15をプルアップ、A14をプルダウンしておく

DRAM制御信号と拡張RAM回路動作

オリジナルの拡張RAM回路の場合

前回のエントリ で書いたように、SRAMを使った拡張RAMの回路は以下のようになっています。

  • OE (Output Enable) および WE (Write Enable) は ^DRD2 および ^WE と直結
  • CS (Chip Select) は ^RAS2 と ^EXCAS の AND

SRAMの制御信号は以下の仕様です。

  • CSと OEがともにアクティブの時に読み出し動作
  • CSと WEがともにアクティブの時に書き込み動作

DRAM制御信号について再掲すると以下の仕様です。

  • ^DRD2: 8000h〜BFFFh の CPU および VDG の読み出し時にアクティブ
  • ^WE: すべての CPU のメモリ書き込みでアクティブ
  • ^RAS2: 8000h〜BFFFh の CPU および VDG のアクセス時、およびリフレッシュ時にアクティブ
  • ^EXCAS: 8000h〜FFFFh の CPU および VDG のアクセス時にアクティブ

^RAS2 と ^EXCAS の ANDを取ると
「8000h〜BFFFh の CPU および VDG のアクセス時にアクティブ」
となるので、意図通り動くことになります。 ^DRD2についてはアドレスデコードが重複していて冗長ですが

EXCASのみをCSに接続した場合

前回のエントリ で少し触れましたが、最初は RAS と CAS の ANDという構成に(特に根拠なく)疑問を持ってしまい、 ^EXCAS のみを CS に接続する回路で作成していました。

この仕様で作成して動かしてみると、BASIC自体は RAMを認識して正常に動作しているように見えました。

しかし、32KBアプリのテストということで Tiny野郎さんのドルアーガの塔デモを動かしてみるとテープの読み込み後にリセットしてしまいました。

ほかに 32KB専用アプリはないかということで ONION softwareさんのページ にあった「サイバービレッジ」を試してみると、こちらも正常に動きません。

さすがにこれは何かがおかしい、ということで当時は以下のように検証していました。

結論としてはこのときの推測通りで、 CS に ^EXCAS のみを接続した場合は以下の動作をしてしまうことになります。

  • リードについては ^DRD2 に 8000h〜BFFFh のアドレスデコード条件が含まれるため正常動作する
  • ライトについては ^WE がすべての書き込みでアクティブになる、かつ ^EXCASも 8000h〜FFFFh のすべてのアクセスでアクティブになるので、 C000h〜FFFFhに対する書き込みで 8000h〜BFFFh に対しての書き込みも実行されてしまう

というわけで、いったん ^EXCAS と CSとを直結で作ってしまったあとで 74HCT139 による ^RAS2 および有効無効スイッチ追加の改修を行ったのでした。

このあとの工作が 前回のエントリ でツイート貼り付けしているロジックICの2階建て工作になります。

余談

Techknow6000 vol.2 (の書籍版)を BEEPさんの通販 で入手したのは増設RAM改造の改修が終わったあとで、「実績のあるレシピを勝手な思い込みで変えるな」という教訓を得たのでした……。当時はまだ電子書籍版の販売がなかったのでした

まとめ

いつものごとく、自己満足モード炸裂で書きたかったこと・調べたかったことをすべて書いてしまったのでやたらと長くなってしまいましたが、自分自身でもいろいろ気になっていた部分をちゃんと調べてはっきりさせることができ、すっきりしました。

むりやりまとめると以下のような感じでしょうか。

  • プログラムと同じで、ハードウェアも回路図から設計者の意図を読み解く必要がある
  • 思い込みで回路上の信号動作を決めつけてはいけない
  • わりと危ういバランスの上で動いている回路も多い
  • フルディスクリートの大規模回路は読んで解析するのも楽しい そんなのはお前だけだと言われそう

イマドキのハードウェアではカスタムチップばかりの回路になってしまい、こういう解析をする機会もすっかり無くなってしまいました。この記事が いわゆる初期のパソコンにおける DRAMその他の動作がどんな感じだったのか、という参考になれば幸いです。