エントリー

PC-E500のメモリが1Mbyteに迫る勢い

  • 2008/10/24 19:21
  • カテゴリー:make:

 PC-E500関連の資料を眺めていて思ったのですが,S1:というエリアとS2:というエリアにそれぞれ256kByteのメモリを搭載したことで,もうメモリを追加する方法はない,と思い込んでいた私は,どうも間違っていたようです。

 もちろん,バンクメモリという荒技や,NANDフラッシュを内蔵するという方法で大きなメモリを搭載する方法は知っていましたが,これらはいずれもアマチュアが考えついた独自の方法であり,デバイスドライバがなければアクセスできません。

 私個人は,そこまでやってしまうことはオリジナルシステムを無視したように感じてしまい,どうも美学に反するように感じてしまうので,そうした方法を使ってまでメモリを増やそうとは思いません。

 PC-E500に搭載されたSC62015という8ビットCPUは,後にPIザウルスにも搭載された高性能なCPUです。先日も書きましたが,ユーザーが我慢できないコンピュータの弱点は処理速度よりもメモリの小ささだと思っていまして,PC-E500シリーズがマニアに指示された理由は,やはりこのメモリを搭載できる力に長けていたことにあると考えています。

 SC62015は,アキュムレータや汎用レジスタが8ビットなので8ビットCPUの範疇に入れてよいと思うのですが,スタックポインタやインデックスレジスタは20ビットの長さがあります。そのくせプログラムカウンタは16ビットだったりするので,なにやらアクの強さを感じますね。

 プログラムカウンタは確かに16ビットですが,4ビットのセグメントレジスタも持っていて,この2つで20ビットのアドレッシングを可能にしています。ただし,プログラムカウンタがオーバーフローしてもセグメントレジスタはインクリメントされないので,その点では8086なんかと同じように,64kByteの壁が存在しています。

 そんな話はよいとして,このCPUはとにかくアドレスを20ビット生成する力があるということですから,最大1MByteのメモリをアクセス可能なわけです。もともと32kByteしかRAMを持たないPC-E500にとって,1MByteというのは無限に広がる荒野に近いといえます。

 8ビットCPUでも64kByte以上のメモリをアクセスできるCPUは多いのですが,残念なことに多くはアドレスを生成するレジスタが16ビットだったりするので,実際に使ってみると非常に面倒な制約がついてしまうのです。SC62015についても,セグメントの境界による制約がないわけではありませんが,少なくともコードではなくデータについてはリニアアドレスと見て良いだけの自由度があります。

 もう1つ,20ビットのアドレスが生成できるからといって,CPUの信号線としてアドレスバスを20本も出しておく事は,普通はない話です。半導体の価格は,一般にチップ面積だといわれていますが,それは高価な半導体の場合のお話で,安い半導体の場合,チップそのものよりもパッケージの価格が大きく見えるようになることも多いのです。

 そしてそのパッケージの価格は,ピンの数と関係があります。使わないピンは出さないでおいて,ピンの数を減らした方が安くて小さいICになることは言うまでもないでしょう。

 SC62015の場合,アドレスバスが18本外に出ています。256kByteのメモリまでをサポートしているわけですね。上位の2ビットのアドレスは外には出てこないので,一見すると1Mbyteのメモリはサポートされないように思うのですが,実は上位のアドレスをデコードしたチップセレクト信号を8本出してあります。

 そうなんですよね。確かに20本のアドレスバスを全部外に出しておいてくれれば,どんなアドレスにも好きなサイズのメモリを繋ぐことが出来るのですが,一方でそのメモリチップを割り当てたアドレスの範囲でアサートされるチップセレクト信号を作ること(これをアドレスデコードといいます)は,メモリのサイズが大きくなればなるほど規模も大きくなり,煩わしいのです。

 そこで汎用性の低い組み込み向けのCPUではアドレスデコードを済ませたチップセレクト信号をアドレスバスの代わりに出しておくことが一般的です。気の利いたCPUでは,デコードするアドレスをレジスタで可変出来るようになっていて,これはこれでなかなか便利なのですが,弱点がないわけではなく,プログラムが走り出して,レジスタの設定が終わるまで外のメモリにアクセスが出来ません。

 SC62015の場合,チップイネーブルのアドレスデコードは固定されているため,言い換えると8本出ているチップセレクトにデコードされたアドレスが,即メモリマップになるというわけですね。

 これによると,

CE0 80000h - BFFFFh 256kByte 内蔵RAM(S1:)
CE1 40000h - 7FFFFh 256kByte RAMカード(S2:)
CE2 C0000h - FFFFFh 256kByte 内蔵ROM(S3:)
CE3 20000h - 3FFFFh 128kByte 未使用
CE4 0C000h - 0FFFFh 16kByte  未使用
CE5               LCDコントローラ
CE6 10000h - 1FFFFh 64kByte  ROMカード
CE7 BC000h - BFFFFh 16kByte  システム

 ということで,実は1Mbyte全部のエリアをアクセス出来るようにはなっていません。

 アドレスバスは18本しか出ていませんから,チップセレクト1つあたりに接続できるメモリは最大256kByteまでとなります。すでにCE2は256kByteのROMが接続済みですので,内蔵RAMとRAMカードのエリアをそれぞれ256kByteにした合計512kByteが,PC-E500の限界だと私は思っていたわけです。他のアドレスにRAMをただ繋いでも,システムレベルでサポートされなければ使い道がありませんからね。

 ところが,CE3にしてもCE6にしても,別にGPIOを併用したバンク切り替えで作り出されたアドレスとは違って,CPU自身が生成するアドレスであるところがミソでして,ここにRAMを繋ぐと,確かにシステムレベルでのサポートはなくても,CPUからは特別な工夫無しに自由にアクセス出来る事には違いないのです。

 もし,内蔵ROMのアドレスに割り当てられているS3エリアを,CE3に増設したRAMのアドレスに割り当てることが出来れば,CE3のRAMが直ちにシステムレベルでのサポート対象となりますね。(あ,ここでいうシステムレベルというのは,PC-E500のIOCSが持つファイルシステムでアクセスが可能になる,という意味でして,S3でROMがアクセス出来なくなっても,そもそもその必要性が薄いため支障がないのです。)

 それで調べて見ると,この割り当てというのは,IOCSのワークエリアの5バイトに,開始アドレスとサイズの2つを書き込むことで行われているらしく,要するにここをCE3のアドレスにしてやれば,めでたくS3エリアをRAMにすることが出来そうです。

 そこで先程のメモリマップを眺めてみますと,CE3の128kByteとCE6の64kByteが連続したエリアとして合計192kByteを割り当てることも可能です。

 ただ,256kByteで1チップのRAMなどを使うわけにはいかない(チップセレクトを2本使わないといけませんからね)ので,どうしたって2チップが必要になります。

 ここまで考えて,思いついたのは先日秋月電子で買っておいた1MbitのSRAMです。こんな事もあるかと買っておいたのですが,CE3に繋がる分はいいとして,CE6に繋がる分は半分余らせてしまうことになります。

 もったいないと思いましたが,よく考えると1つ100円です。100円をけちるのに256KbitのSRAMを2つ使うようにアドレスデコーダを組む手間や,あるいは256KbitのSRAMを1つだけ使って32kByte足りないままで使うよりは,ずっとお得と考えて,1MbitのSRAMを2つ使う事に決めました。

 回路図をささっとかいて,PC-E500を分解します。

 私のPC-E500は,S1やS2エリアのSRAMに,2Mbit品というちょっと変わったものを手持ちの関係で使っています。実は3.3V品なのですが,ダイオードで電圧を落としてごまかしてつかっています。(やばいんですけどね,こういうことをするのは。)

 ですからトータル512kByteになっているPC-E500としては配線数も少なく,またSRAM自身もTSOPという小型パッケージですので,スペースは十分にあると思っていたのですが,今回の1MbitのSRAMは通常のSOPです。分厚い上に大きいので場所がありません。

 そこで,RAMカードを入れる部分をこわして,ここに配置することにしました。どうせカードをはめ込めば暴走するわけですし,これでいいです。

 しかし,SOPのSRAMは分厚いです。1つあたり2.7mmほどあるので,重ねると5.5mm程にもなります。やはり少し削って,高さを抑えないといけないと判断し,ベルトサンダーを持ち出して削りました。

 あまり削りすぎると壊れるので慎重に削っていきますが,結局2つで5mm弱程度にしました。見た目には随分薄くなったように見えるのですが,シャーペンの芯1本文くらいしか薄くなってないのかと思うと,結構がっかりです。

 配線をどこから確保するかも悩んだのですが,元のRAMが付いていたランドはすでに2MbitのSRAMへの配線で使われていて,ここを使うのはトラブルの原因になるように思いました。そこで,RAMカードのコネクタを潰して,ここから信号を取り出すことにしました。どうせカードは使えないのですし,別にいいです。

 後は40本程度の配線を根気よく繰り返すだけです。私は単純作業が好きな人ですので,こういう配線は全然苦になりません。時間の経つのも忘れてしまうほど没頭できます。もしかすると,写経なんかもやってみたらどっぷりはまるかも知れないです。

 配線が終わってテスターでひと通りの確認をして電源を入れると,問題なく起動はします。追加したアドレスに値を書いて読み出すと同じ値になっているので,まずは動作しているようです。

 S3のアドレスをワークエリアを書き換えてみると,ちゃんとS3として増設したRAMが読み書きできます。一応動いていそうです。

 でも心配なので,増設したエリア全域を,AAhと55hで埋め尽くし,正しく読み出せるかを行ってみましたが,エラーも出ずにすんなり終了。もう大丈夫でしょうね。

 これで,私のPC-E500は,256+256+192の704kByteのRAMを実装したポケコンになりました。おお,往年のPC-9801を越えましたよ。(FM-RやPC-100,ハイレゾの98には勝てないのですが)

 これに内蔵ROMの256kByteを加えると,実に960kByteとなり,SC62015の限界である1Mbyteも目前というところまできます。調べて見るとさらにCE4まで使ってしまう人までいるようですが,私はもうそこまではやる気はしません。

 で,これだけメモリを増やしてどうするのか,とお思いでしょうが,日本語化するとメモリがたくさん必要なので,とてもありがたいのです。日本語フォントが50kByteちょっと,変換辞書が70kByteちょっとですので,合計ですでに130kByteほど。これにユーティリティ類やゲーム数本,ヘルプファイルをいれておくと,あっという間に256kByteなんか使い切ってしまいます。

 S1エリアはメインメモリですから,ここをストレージにするのはあまりにもったいないです。そこでS2にファイルのたぐいを集めるのですが,私の場合残り2kByte程まで使い切っていたのです。そこに192kByteも増えるのですから,これはもう盆と正月が一度に来たくらいありがたい話です。

 設定をすませ,広いメモリ空間をゆるゆると漂う感覚は,いつ味わってもいいものです。

 仮想メモリという「偽物」を当たり前の存在にしたモダンなOSに,飼い慣らされて牙を抜かれた現代人は,目の前にあるアドレス以外は信じない,という原始の我々が一様に備えていた野生の感覚を取り戻し,あの時のように星を頼りに粗末な小舟で果敢にこぎ出すことの喜びを,もう一度知ることが出来るのでしょうか。
 

ページ移動

ユーティリティ

2020年05月

- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 - - - - - -

検索

エントリー検索フォーム
キーワード

ユーザー

新着画像

新着エントリー

過去ログ

Feed