2008年10月28日 11:01
時には昔の話を
時に昔を振り返ることは、懐かしいし、今へのヒントが含まれていたりして興味深い。
フォトレポート:分解、「Apple IIc」--フロッピードライブ内蔵のコンパクト機:ニュース - CNET Japan から2008年10月28日に引用初代「Mac」と同時に発表された「Apple IIc」は、「Apple II」製品ラインにとって大きな飛躍を遂げた製品であった。主要な改善点の1つは、フロッピーディスクとメインCPUの統合で、Apple IIcは最も人気のあったApple IIの1つだ。
このレポートを見て、ノスタルジアに浸りつつ、コンパクトな中身に実はちょっと感動したりもしている。
この二つを並べるのに無理があるのは承知。しかし共通しているのは美しさかな。シンプルであることは美しい。
ふと思い返してみると、Z80(ザイログ)、MC6809(モトローラ)の8ビットCPUの大ヒット製品と、完成型がしのぎを削っている時代がありました。一世を風靡し、私自身もいじくり回していたのはZ80でした。最初に手にしたボードコンピュータに乗っていたのは8008(8080だったかもこの辺記憶曖昧)。ずいぶん古くからコンピュータをいじくっていたものです。
(ここから思い出話モードです)Z80というのは、NECのPC8001などで使われていました(正確には互換品)。このマシンコードを見たときに、何と豊富な演算機構・アドレス指定機構をもっているんだ!と感動しました。一時はニーモニックコードと16進コードを完全暗記して、ハンドアセンブルが可能だったこともあります。今では完璧忘れました。8ビットのアキュムレータ(演算器)と、16ビットのレジスタ。アドレス指定もレジスタに収めた数値を使ってアクセスする方法や、インデックスレジスタを使ってある種の相対アクセスが可能になる機構。いやぁこれはすごい。と感動しました。Z80は全部で64KBのメモリにアクセス可能でした。単位を見て下さい。KBです。會澤がボードコンピュータを動かしていた頃は、64KBなんてとうてい埋めることのできない広大なメモリ容量でした。保有はしていませんでしたが、PC8001は32KBのメモリを搭載していました。これは驚愕でしたね。いったいそんな大量のメモリを何に使うんだ?ところが、すぐに64KBのメモリが搭載され、バンク切り替えという特殊な方法で更にメモリ容量は拡充されていきました。この頃が會澤の第一期パソコン時代の終焉ですね。
メモリでいうと、当時のメモリ管理はCPU自らが行うのが常でした。MMU(メモリマネージメントユニット)が別途搭載されるのは後日です。Z80にもMMU擬きは搭載されていました。ボードコンピュータを設計するときに一番悩むのがメモリ絡みの「リフレッシュ」という動作でしたね。当時のメモリはDRAMと呼ばれ、一定の期間通電(正確には読み込み動作)してやらないと記憶されていたメモリが吹っ飛んでしまうという代物でした。Z80にはDRAMのリフレッシュを定期的に行わせるための信号が用意されており、今どの辺のアドレスをリフレッシュしているのか分かる読み取り専用(だったはず)のRレジスタが備わっていましたし、チップからパルスも出されていました。ところがこれが難敵。リフレッシュレート(読み込みをかけてやる周期)とDRAMのメモリアクセススピードがけっこうシビアになってしまい、自分が購入したメモリが遅すぎて異常を起こしている。ということに気がつくまでどれだけかかったか。Z80は命令実行の裏でこのリフレッシュをかける仕組みになっていたので、この裏時間内にメモリリフレッシュが終われば問題なかったのですね。ところが、メモリリフレッシュが終わる前にZ80の表の時間が始まってしまい、ある瞬間、Z80の命令が指定したアドレスと、リフレッシュアドレスが一致したときに誤動作する。起きるときもあるし、起きないときもある。リフレッシュとアドレスフェチが同時に行われるとまだ読み出し途中のデータがリセットされ、準備ができないままデータがレジスタに渡される。そうすると、本来そのアドレスにおさまっていたはずのデータが、消える・異なる。これは悩みましたねぇ。安いメモリチップを使った私がわるいんですけどね。
Z80に裏レジスタがあることを知ったのはずいぶんたってからで、これも衝撃でした。Z80はレジスタ(演算器)の数は多い方だと思っていたのですが、それでも不足しましたね。それが、裏レジスタがある。これはね、便利な反面、大変な混乱をもたらします。Z80の裏レジスタは、表と裏の演算ということができない仕組みになっている。表と裏をそっくり入れ替える。唯一例外的にアキュムレータは単独で入れ替えが可能。従って、裏レジスタをメモリアクセスを伴わない一時記憶として使用することがもっとも考えられる。手順は、
- 必要なデータをスタックにPUSH
- BC,DE,HLを裏に切り替え
- IXを介してデータをレジスタにロード(POPしてLD)
- BC,DE,HLを再び裏に切り替え
これで裏のレジスタにデータをロードできました。演算に供するときには、裏にしてアキュムレータと演算して、戻して、再び裏に戻す。めんどくさいですな。で、間違える。裏だか表だか分からなくなるんです。サブルーチンなどを使って分岐させる前や、サブルーチン内で裏表を間違えると大変なことになる。これもよくやりました。
もう一つ絶対今ならやらないことに、プログラムのイニシャルルーチンをデータ領域に作って、一度実行したらそのコードを上書きする形でデータ領域として使う。とか、スタックポイントをデータ領域に設定して、PUSHを使って一時的なプログラムをスタック上に展開する。展開が終わったら本来のスタックに戻して、先ほど作った一時利用用のプログラムに制御を移す(ジャンプする)。馬鹿ですねぇ。こんなわかりにくいコトして何になるんでしょう。メモリの節約だったんですけどね。トリッキーさを競っているようなところもあったように思います。
(長くなってきましたが)6809についてもちょっとだけ。このCPUは後発だったんですが、こちらのアーキテクチャはZ80を使っていたものからすれば絶句ものだったのを覚えています。シンプルかつ、強烈。このチップを8ビットに分類して良いのだろうか?と本当に思いましたね。まったくもってZ80とは異なる思想で作られたものなので、比較するのはおかしいのですが、相対ジャンプの融通の高さというか、自由度の高さは驚きでした。ほとんど機能が変わらない2つの8ビットアキュムレータと16ビットのレジスタ。更に、Z80では多く存在していたレジスタが少ない変わりにデータ用のスタックをもつことができるため、データをスタックにロードすることが大変簡単にでき、レジスタの少なさをカバーしていました。さっき少し話しましたが、MMUがファミリーとして用意されたのはこのチップが最初?Z80が64KBの壁を突破するためには、一定の領域を外部に用意したハード的な仕組みでそっくり入れ替える。という方法(バンク切り替え)で行われます。會澤は16KBぐらいの領域を2つ単純なフリップフロップ回路で切り替える基盤を用意して使ってみたことがあります。32KBの領域の最上位ビットをZ80の管理下から外してフリップフロップ回路でアドレスデータを保持する。通常最上位ビットは0。ところが、Z80からI/Oを通じてこのフリップフロップを動作させる命令を送る。すると、フリップフロップ回路が0→1に変わる。Z80には下位ビットしか接続していませんから、最上位ビットが変わると16KBの領域がそっくり切り替わることになります。こんなめんどくさい処理をソフトハードともに行わなければならなかったんですね。
ところが、6809に用意されたMMUは別チップで最大2MBのメモリを管理できたんです。これはですね。空前絶後です。当時愛読していたアスキーか、I/Oという雑誌にZ80用の1MBバンク切り替えメモリの作り方が載ったことがあります。その回路は會澤が作った1ビットのフリップフロップなどという代物ではなく、しかし原理的には同じバンク切り替え方式のメモリ回路でした。そして、少しして、6809+MMUを使った1MBメモリアクセス回路が紹介されたんですね。これがとんでもなかった。回路がシンプルなんです。CPUとMMUをつなぐ。MMUは1MBのメモリに直接アクセスできる仕組みと、DRAMリフレッシュの仕組みを専門に行い。CPUはメモリバンクの指定をするだけ。6809の場合は、バンク切り替えという概念ではなかったかもしれません。
Z80とは、まったく世界が違っていましたから乗り換えるわけにも行かず、指をくわえて眺めていた覚えがあります。
冒頭の「Apple IIc」はこの6809の流れをくむ65C02というチップを使っていました。当時はAPPLEなどという名前は聞き覚えませんでしたが、何か不思議な縁を感じます。
長文かつ乱文失礼いたしました。懐かしかったもので...
Posted by kaizawa | TrackBacks