HC-20がとりあえず現状復帰しました。RAMは16kByteのままです。
わずか2kByteのSRAMを8つも搭載して16kByteというのはあまりに不細工ですし,HC-20は最大32kByteのRAMをサポートしていますから,できる事ならRAMくらいフル実装してあげたいところです。幸い手持ちにMB84256という256kbitのSRAMが大量にあります。
こうした動機から,修理の初期段階で工場出荷時のSRAMを全部基板から取り去り,256kbitのSRAM1つに換装して,大失敗をしたわけですが,その後もこの話はちょっと手間取っていました。
この手の非同期SRAMというのは,CSというチップ全体をONにする端子と,OEというデータの出力を制御する端子,そしてWEという書き込みを制御する端子の3つで制御します。
CSはチップ全体ですので素早く反応出来ません。通常,SRAMをランク分けするアクセスタイムという数字は,この速さを示しています。
OEはCSの速度よりずっと速く動きますが,あくまで出力を出すか出さないかという端子に過ぎませんから,SRAM全体の電源を切る行為に相当するスタンバイモードへは遷移できませんし,WEよりも優先度は下になります。
WEは書き込みの端子ですが,先にCSをEnableにしてからWEをEnableにするWEコントロールドライトと,先にWEをEnableにしてからCSをEnableにするCSコントロールドライトがあります。
どちらも同じように思うかも知れませんが,書き込み動作が行われるのがWEなのかCSなのかという大きな違いがあり,WEの役割が前者は書き込みのトリガ,後者がバスの方向を切り替えるスイッチという点で,考え方を変える必要があります。
一方,HC-20で使われているSRAMは,ちょっと違っています。OEがなく,CSがCE1とCE2の2つになっています。この2つはANDであり,両方の端子がEnableにならないとSRAMがONになりません。(えと,CSかCEかはメーカーによって違うだけで,ほぼ同じ意味で使われています。私個人はCEだとややこしいので,インテル風にCSと言うようにしています。)
ここで,それぞれの真理値表を書いておきますね。CSとOEを持つSRAMはMB84256,CE1とCE2を持つSRAMはHC-20で使われているuPD449という古いSRAMとします。
MB84256
CS OE WE 状態
H X X Stand-by
L H H Hi-Z
L L H Read
L X L Write
uPD449
CE1 CE2 WE 状態
X H X Stand-by
H X X Stand-by
L L H Read
L L L Write
見ての通り,大きな違いはSRAMが選択されても出力を出さない状態の有無と,書き込み時にCSさえEnableなら書けてしまうかCE1もCE2もEnableでないと書けないかという,そういう違いです。
考え方として,CSとOEを持つSRAMのわかりやすいところは,
(1)アドレス確定
(2)チップ選択
(3)動作指定(Read or Write)
という具合に,時間軸できれいに整理出来るのですね。私はこれに馴染んでいる人ですが,どちらかというと80系はこれかなーと思います。
一方CE1とCE2のあるケースだと,
(1)アドレス確定
(2)動作指定(Read or Write)
(3)チップ選択(CE1とCE2同時)
となりますので,結果は同じとはいえ,なんか気持ち悪いです。(2)と(3)が同時だったりするので,どうもしっくりきません。
さて,通常,SRAMを換装する場合のセオリーは,CSがアドレスデコーダからの出力に接続,OEはRD,WEはWEに繋ぎます。
で,80系だと,メモリ空間とI/O空間が分かれているので,それがメモリ対象ならMERQが,IO対象ならIORQが,それぞれ同時に動きます。そこでメモリのRDとWEについてはMREQと,IOのRDとWEについてはIORQと,それぞれANDを取ってやるのです。
この接続は,アドレスの確定,チップの選択,動作指定という流れに綺麗に従っており,80系のバスタイミングにそれなりに合致します。(といいますか,非同期SRAMの動作として,極めて自然だと思います。)
同じ考え方で,HC-20のSRAMを,MB84256に換装することにしたわけですが,この試みは失敗に終わるわけです。
まず,アドレスデコーダです。HC-20のSRAM空間は,0100hから7FFFhまでです。0100hなんてCP/Mっぽくて笑ってしまいますが,CPUの内蔵RAMとI/O空間ですので,ここはSRAMの空間ではないという,それだけの意味です。
80系のCPUと違い,68系のCPUはRESET解除後,プログラムカウンタを0にして起動せず,FFFEhとFFFFhに書かれた値をプログラムカウンタにロードして起動します。リセットベクタを可変出来ることはメリットのようで,私は別に大した利点に見えないのですが,こういう事情もあって,HC-20では80系マシンと違い,RAMを前半32kByte,ROMを後半32kByteに配置してあります。
HC-20の回路図によると,8つのSRAMのアドレスデコーダは定番の74138(実際にはTC40H138)を使っています。そして,このデコード出力は,0000hから00FFhまでをデコードしたIOCS信号とリセット信号によっても制御されています。このデコーダの出力はSRAMの18ピン,CE2に繋がります。
1チップで32kByteを実現するMB84256のアドレスデコーダを作るためには,A15が0,リセットが1,そしてIOCSが0の時にEnableになるような回路を作ればよいのです。私は手持ちの関係で74LV00を使って,このデコーダを作りました。デコーダの出力は,前述のセオリー通りCSに繋ぎます。
続いて,OEはオリジナルのSRAMの20ピン,CE1に繋がっていた信号を繋ぎます。これは結局6800系に特徴的なEクロック(の反転)です。HC-20の場合,Eクロックの反転と,SLEEPの時にLowになる信号のANDを取ってあり,SLEEP中にはSRAMへのアクセスが起こらないようになっています。消費電力の低減にも役だっています。
そうそう,SLEEPというのは,別に電源を切ったときのことを言っているわけではなく,なにも処理を行っていないときに動作を停止して,消費電流を半減させる仕組みです。キーの入力などの割り込みで通常モードにさっと復帰します。これを1982年当時にやってるんですね,すごいです。
WEはそのまま元のSRAMのWE,データバスとアドレスバスもそのまま繋ぎます。
ところが,すでに何度も書いているように,動きませんでした。画面にゴミが出まくって,暴走します。
配線間違いやら勘違いでもしたかなと,深く考えずにCSとOEを入れ替えてみると,なんとまあさくっと動いてしまいました。これが一昨日の話です。
「動いたんだから成功だ!これでいこう!Ok!好了!」
とビールを飲み始めるも,なぜかおいしくありません。釈然としないのです。
何度も書きましたとおり,CSにはアドレスデコーダからの出力を繋げていました。しかしこれでは動かず,アドレスデコーダの出力をOEにつなぎ,EクロックをCSに繋いで動くというのは,どう考えても納得いかないわけです。
まずは動かないはずの配線で,なぜ動くのかを考えます。
まず,HC-20で使われているuPD449のCE1とCE2はANDされた端子であり,どちらかが優先されることはなく,機能も全く同じです。ゆえに,uPD449のCE1とCE2と入れ替えても動くはずです。
では,CSにEクロックが入った場合を考えます。Eクロックはバスサイクルを示すすべての基準信号ですが,Highの時にリードかライトが起こります。CSがEクロックで制御されSRAMがONになるのですから,これはOKですね。
これに引き続き,OEにアドレスデコード信号が入った場合です。アドレスのデコード出力が入ると,データが出力されます。他のアドレスのメモリからはデータが出ませんので,バスの衝突は起こりません。従ってリードは成立します。
最後にWEです。WEはOEに優先しますから,EクロックがHighでWEがEnableだと,書き込みが起こります。これだと他のアドレスを持つ別のデバイスへの書き込みでもSRAMに書き込みが起こってしまうので,本当だったら暴走するはずです。
しかし,HC-20の場合,外部のデバイスはなんとSRAMしかありません。RTCもあるにはありますが,RTCであるMC146818へは,純正の68系ファミリらしく,専用の方法でアクセスされているので,SRAMと同じ非同期のバスにぶら下がっている書き込み可能なデバイスは,他にはないのです。
よって,WEがEnableになるのは,SRAMへの書き込みだけとなります。SRAMが複数チップにあると暴走しますが,今回は1チップですから,暴走もしないわけです。
うーん,動いているには違いないのですが,やっぱりおかしいです。
試しに,ほぼすべてといっていいRAM空間を,55hとAAhで埋め尽くすテストを行いましたがエラーはなし。クロック600kHzのマシンなら,タイミングは多少ダルでも動いてしまうのでしょう。
ですが,モニタからROMのアドレスであるE000hに書き込みを行うと,SRAMの6000hにおかしな値が書き込まれました。アドレスのデコードが行われずに書き込みが行われるのですから,ROMの出力とCPUの出力が衝突し,これがWEで書き込まれたのでしょう。
実際にROMへの書き込みは通常起きませんから,このままでも実用上は問題ないのかも知れません。しかし,データの衝突も起きていますし,もし拡張スロットにデバイスを追加するようなことがあったら,完全に破綻します。それに,たまたま動いているだけの話ですから,ダメなものはダメというところでしょう。
では,逆の見方をして,なぜ動くはずの回路で動いてくれないのでしょうか。CSにアドレスデコード出力,OEにはEクロックの場合を考えてみます。
68系のタイミングチャート見ていると,WEに繋がっているR/W信号は,バスサイクルの先頭で確定し,終了までその状態が維持されます。アドレスも同じで,従ってアドレスデコード信号も,1サイクルの間動きません。
OEはEクロックですので,バスサイクルの真ん中辺で変化します。データが有効なところでHighになります。
バスに乗っているデータは,このEクロックがHighになったところで有効になるわけですから,書き込みはこのタイミングで行われなければならないのに,EクロックがLowのところでもWEがEnableになっています。もし,WEコントロールドライトであったとしたら,正しいデータは書き込まれません。
ここで改めて考えてみると,元のSRAMはCE1とCE2を持っていました。CE1とCE2はANDされて,MB842156でいうところのCSに内部で繋がっています。
ということは,アドレスデコード信号とEクロックのANDを取って,CSに入れているのと同じことです。一方,MB84256でいうOEは常にEnableになっていると考えられます。
ということは,HC-20の書き込みは,先にWEを確定し,CSをトリガにするCSコントロールドライトであるということです。いやー,今さらなにを,という感じです。
しかし,私が動くはずだといっている回路では,WEが先に確定し,次にCSが確定するべきなのに,CSに繋がっているのはアドレスデコード信号ですから,WEと同時にEnableになります。ここではデータがバスに乗っていませんから,正しい値が書き込めるはずもなく,そりゃ暴走するわけです。
ゆえに,OEとCSを入れ替えてEクロックをCSに入れれば,CSコントロールドライトでめでたく書き込みが成立するわけで,動くはずのない回路で動くことの説明もつきました。
なら,対策は簡単。
uPD449のCE1とCE2と同じように,アドレスデコード信号とEクロックのANDを取ってMB84256のCSに入れて,OEはGNDに落とせばよいのです。
幸い,MB84256の真理値表を見ると,OEの優先度は最低で,スタンバイも書き込みも,OEの状態は無視されます。有効になるのはWEがDisableで,CSがEnableのときだけですから,ずっとGNDに落としておいても問題なさそうです。
なお,CE1とCE2という具合に,CEを2つ持つSRAMには厳密に言うと2種類あります。SRAMの基本形はCSとOE,そしてWEであることを前提にすると,OEをGNDに落としCE1とCE2が本当にANDされてCSに入るというもの,例えばuPD449やHM6118などがこれに該当します。
これに対し,OEにはCE2が,CSにはCE1とCE2がANDされて繋がっているものもあります。TC5116やHM6117がこれに該当しますが,CE1だけがEnableになっても動作せず,CE2もEnableにならないと動かない点では前者と同じですし,CE2すなわちOEだけがEnableになっても動作しないことも同じです。
ただ,前者と違って,CE1とCE2は全く同じではなく,CE2はOEにのみ繋がっていますからCE2の動作速度はOEと同じで,高速に動作します。CE1があらかじめEnableになっていれば,CE2で出力を制御できる訳で,OEの高速性を犠牲にしない合理的な方法と言えます。
今回問題になっていることは,EクロックがOEに繋がっているがゆえにライトの時に無視されることであり,この回路が期待するCE1とCE2が共にEnableになることで行われるCSコントロールドライトに失敗することにあります。
ですので,TC5516でもHM6117でもuPD449でも,どれでも今回の場合は問題ないという事になります。平たく言えば,細かいタイミングではなく,真理値表が問題だということですね。いやー,中学生以来の疑問,TC5516とHM6116の使い分けがやっと分かった気がします。まだまだ未熟者です・・・
では試してみましょう。ANDを取るといっても負論理ですので,ORゲートが1つ必要です。手持ちにHC32が2つ入ったTC7W32がありますので,これを使います。
それで,結果なのですが・・・ダメです。動きません。画面にゴミが出ておわりです。
これだけ考えてダメということは,かなり凹むところなのですが,OEをGNDに常時落としてあるところが引っかかっていて,OEをEクロックの反転(つまり元のCE1)に繋ぐと,あっさり動き出しました。
メモリチェックも通り,ROMへの書き込みでもRAMが破壊されません。
なんでだろう。
OEをGNDに落とすと,CSがEnableになると無条件にデータが出力されるわけですが,CSはアドレスデコード信号とEクロックのANDを取ってあるので,結局EクロックがHighの間しかデータは出てきません。
OEをEクロックの反転に繋いでやったことと,見た目にはなにも変わらないはずなのに,片方は動かず,もう片方は問題なく動いています。不思議です。
書き込みもスタンバイも非選択も,OEの状態は無関係です。読み出しの時だけLowでなければならないと決まっているだけですから,OEを常時GNDにすることで問題はないはずなのです。繰り返しますが,OEをEクロックの反転とANDしたって,CSにはEクロックが織り込み済みなわけですから,同じことのはずなのです。
理論的には手詰まりになり,今も動かなかった原因,動いている原因を考えているのですが,どっかでバスの衝突が起きているということくらいしか思いつきません。
部屋が散らかり放題散らかっていることと,疲れていることを理由に,論理的裏付けはなくとも,そのまま話を進めることにします。
バッテリと直結で安定化されていないVLとVCの2つの電源は,DC-DCコンバータで昇圧,安定化します。VBとVCおよびVLに繋がったパターンをカットし,この間にHT7750を使ったDC-DCコンバータを挟み込む感じです。
で,電池は結局エネループを4本使うことにしました。そうすると電池の収納場所が問題なのですが,いろいろ触っている内に名案が閃きました。
マイクロカセットやROMカートリッジが格納される場所は,私のHC-20は中身が空っぽのダミーカートリッジがついています。ここに単3のエネループを4本入れると,ちょうどの大きさです。
ここから逆流防止用のショットキーダイオードを通し,VBに繋ぎます。順方向電圧だけ下がってDC-DCに入りますが,DC-DCの出力は問題なく5Vで安定化されます。後述しますが,電圧検出はVBで行います。
一方,ACアダプタからは,7805で5Vに安定化してVBに突っ込みます。幸い逆流防止用のダイオードは最初から基板についているので,これをそのまま流用します。
ところが,電圧検出器の設定電圧が,下が4.49V,上が4.89Vでヒステリシスを持つようになっており,普通のシリコンダイオードを通った後の電圧が4.4Vあたりまで下がると,もう動作しなくなってしまうのです。
実はこの話,電池の場合も深刻です。Ni-MHの下限電圧である1.1Vまで使い切ると,トータル4.4Vです。ここまでは動いて欲しいのですが,ショットキーダイオードを通して0.3Vも下がってしまうと,満充電の電池でもわずかな時間しか駆動できそうにありません。
そこで,ヒステリシスを持たせないようにR51を削除,また検出電圧を4.0Vあたりまで下げるため,R5に2.2kΩを直列に追加しました。
さらに,7805のCOM端子にダイオードを入れてかさ上げします。0.6Vくらい上がるかと思ったのですが,逆流防止用ダイオードの後で,最終的に5.3Vくらいになっていました。これがそのままあちこちに加わりますが,一応動作電圧範囲内なのでよしとしましょう。
これで,エネループでも対応になりましたし,9Vくらいの非安定化タイプのACアダプタでも問題なく動作するようになりました。あやまって高い電圧のACアダプタを差し込んでも壊れることはありませんし,バッテリも使い切ることができます。
もともと入っていた電池は4.8Vで1100mAhのNi-Cd電池です。ということは5280mWhです。これがエネループになると,4.8Vで1800mAhですので,ざっと1.64倍に増えました。
消費電流は,動作時27mA,スリープ時12mA,そして電源OFF時に400uAという結果です。改造前は電源OFF時が600uAと大きかったのですが,RAMの数が減った分少なくなり,DC-DCが増えた分増えて,このくらいの値になったのではないかと思います。
で,動作電流は,27mAと12mAで変動します。平均すると約20mAですね。この状態で1100mAhの電池を使い切ると,ざっと55時間。メーカーの公称値が50時間ですので,まあこんなものでしょう。
これが今回のエネループになると,実に90時間も動作することになります。随分とグレードアップしたものです。
また,電源OFFの時の電流が0.4mAですので,4500時間。約187日ですので,半年くらいは持つ計算ですけど,半年というのはちょっと短いなあという印象です。1年くらい持って欲しいです。
実は,検討の途中で一度電源OFF時のバックアップ電流を測定したことがあり,この時は40uAと一桁少ないものでした。なぜ今回増えたのか,ちょっとわからない(もしかすると見間違いかもしれない)ので,とりあえず現実を受け入れようと思います。
ここまでの作業を切った貼ったで切り抜けて,なんとか動くところまで持っていきました。肝心要の理論的裏付けがまだですので,これで終わったわけではありませんけども,一応形になり,動かすことが出来るようになりました。
動いて見ると,実に他愛もないコンピュータなのです。当時は小さく,軽いものだったかも知れませんが,私が今使っているMacBookAirと比べると,パワーも大きさも軽さももはや桁違いと言ってもよいくらいです。
ただ,机の上に並べられた2つのモバイルマシンをつくづく眺めてみると,全てのノートパソコンは,このHC-20から始まったということを実感します。世界初のノートパソコン,それがHC-20です。
HC-20には,完全CMOS構成,RAMのバッテリバックアップ,電源ONですぐ起動,そして演算やキーの操作が行われていないときには消費電力を半減させるステートがあるという,現在のパソコンの原理を先取りする仕組みがあります。
形の上で,ノートPCの元祖と言うだけではなく,技術的な仕組みやそれをやろうとする動機となる,いわばモバイルとはこうあるべきという設計思想という点で,HC-20は始祖であると,私は思いました。