この章は、MSX マガジン 1990 年 11月号、1990 年 12月号の"MSX turbo R テクニカル・アナリシス"と、"PCM 限界ギリギリ活用法"の記事を再編したものである。 1.1 MSX turbo R のハードウェア  新開発の16ビットCPU"R800"を搭載したり、256キロバイトのメインRAMや、階層化ディレクトリーをサポートしたMSX-DOS2の標準搭載など、何とか話題の多いMSX turbo R。この注目のマシンのシステム構成はどうなっているのか、その概要を紹介する。 1.1.1 MSX turbo R の特徴はこれだ!  ・Z80に加え上位互換の高速CPU"R800"を搭載することで、平均4〜5倍、最大で10倍ほどのスピードを実現(対MSX2+比)  ・MSX-DOS1とともに、日本語MSX-DOS2と漢字ドライバーを搭載。MS-DOSコンパチブルな階層化ディレクトリーや、環境設定をサポート。  ・メモリーマッパーに対応した、256キロバイトのメインRAMを標準で搭載。さらにスロット構成も標準化した。  ・PCMの録音/再生機能を標準装備。従来はオプション装備となっていたMSX-MUSICも、標準装備されることになった。 1.1.2 MSX turbo R のシステム構成  MSX turbo R (以下 turbo R)のハードウェア構成は図1.1のとおり、従来のMSXと同じ"Z80"互換CPUと、新しく開発された"R800"CPUが含まれている。業界内の、"次のMSXはザイログ社のZ280か、日立のHD64180(どちらもZ80互換の高速CPU)が載るらしい"という噂に反して、何とアスキーがCPUを作ってしまったのだ。  これらのハードウェアの性能は、少し前の16ビット機に匹敵し、CPUの速さはV30(NECが開発した16ビットCPU)なみだ。また漢字変換辞書をROMに入れ、RAMとディスク容量を節約することは、MSXの伝統的な設計方針。最近のノート方パソコンの一部でも採用されている。turbo R のハードウェアを一言で評価すると、"みんなこれを目指してきた"といえるだろう。 【図1.1:MSX turbo R のシステム構成】 turbo R のハードウェア構成を、細かい制御信号線を省略し、簡単に表す。V9958の出力はビデオ信号、TC9769(Z80)につながる線はキーボードとジョイスティック、273の出力はプリンタポート、MIXの出力はオーディオ信号だ。  ハードウェア構成をもう少し詳しく説明していくと、まず、図中の"TC9769"は、型番から推定すると東芝製のCMOS-LSI(低消費電力のデジタルLSIの一種)。一般に"MSX-Engine"と呼ばれる、Z80互換CPUと、PSG音源などをふくむLSIらしい。以下、この本の中で"Z80"という表記が出てきた場合は、このチップを意味する。  その下のの"273"は、プリンターを制御するためのバスバッファー、"OPLL"はFM音源、"FDC"はフロッピーディスクコントローラーのことだ。また"SRAM"というのは、漢字辞書の学習結果を電源を切っても保存するためのメモリーだけれど、このSRAMと連文節変換辞書については、メーカーオプション機能となっています。  ところで、R800とメインRAMは、S1990をとおして、バス(図では長い縦線)につながっている。たとえば、R800がVDPを操作するときなどは、S1990が信号を中継し、さらに必要に応じてR800にウェイト信号を送って信号のタイミングをZ80の信号のタイミングに合わせる操作を行なう。逆に、Z80がメインRAMを使うときは、S1990とR800が信号を中継し、メモリーマッピングを処理するわけだ。  turbo R が、こうした複雑な構成になった理由は、すべて従来のハードウェアやソフトウェアとの互換性と保つため。よくここまでやったと思う。あっぱれ。  さてこのように、turbo R の部品点数は少ないけれど、その内部処理は非常に複雑なものへと変化を遂げた。さらに、S1990は160ピンのフラットパッケージで、普通の手作業によるハンダ付けは不可能だ。ハードウェアの高速化と小型化はありがたいけれど、古き良きワンボードマイコン時代の、工作技術が通用しなくなってしまった。しかし、MSXのカートリッジスロットは昔のままだから、これからもMSXはハードウェア入門の教材であり続けるだろう。 1.1.3 エレガントなCPUの切り替え  ビクターのMSX2マシン、HC-90とHC-95では、2種類のCPUをスイッチで切り替えて使っていた。ところがturbo R では、専用に開発されたLSI"S1990"がシステムを管理するので、電源が入ってプログラムが動いてる最中でも、CPUを切り替えてプログラムの実行を続けることができる。  このハードウェアのおかげで、従来のMSX用ソフトウェアはZ80モードで、turbo R 専用のソフトウェアは高速なR800モードで、自動的に実行させることが可能になった。また、ハードウェアの種類を調べて、従来のMSXならばZ80を、turbo R ならばR800を選ぶような、MSX2/ turbo R 兼用ソフトウェアも作ることができる。 1.1.4 何でも詰め込むMSX turbo R の ROM構成  turbo R には多くのROMが内臓されているはずだけれど、ふたを空けてみるとROMの数が意外に少ない。その理由が、S1990が持つメガROM制御機能だ。  MSX2+には、図1.2の上側のようなROMが内臓されている。メインROMとサブROMはべつべつのスロットに接続され、漢字ROMはI/Oポートに接続されるので、合計の容量にかかわらず、べつべつのROMである必要があるわけだ。しかし、32キロバイトのROMを4個使用するよりも、128キロバイトのROMを1個使うほうが、価格も安いし、基板の面積も消費電力も小さくできる。  そこで、turbo R では、図1.2の下側のように、1個512キロバイトのROMにメイン、サブ、OPLLドライバー、DOS、第1水準漢字、第2水準漢字のすべてを詰め込んでしまった。しかしCPUとROMの間に入っている、S1990のメガROM制御機能により、ソフトウェアからは、たとえば第1水準漢字ROMは、I/OポートのD8H番地とD9H蛮地に接続されているように見えるわけだ。  また、合計64キロバイトのDOSのROM(MSX-DOSが16キロバイト、MSX-DOS2が48キロバイト)は、スロット3-2の16キロバイトの空間に、4バンク切り替え方式で接続されている。 1.1.5 速さを調節するシステムタイマー  R800がV9958(画面表示を制御するLSI)を8マイクロ秒以内の間隔で使おうとすると、S1990に内臓されたVDPインターフェース回路が、自動的にR800にウェイトをかける。これにより、CPUの処理が速すぎるために、V9958が誤動作する心配はない。  しかし、ほかの周辺LSIには自動的なウェイト機能がないので、ソフトウェア自身がタイミング調整する必要がある。従来のソフトウェアの多くは、 EX (SP),HL EX (SP),HL または、 PUSH HL POP HL のような、時間がかかるけれども副作用のない命令をプログラムに埋め込んで、タイミングを調整していた。しかし、あとで説明するように、R800の命令実行時間は不確定なので、こうした方法でタイミングを取ることは不可能だ。そこでturbo R には、速さを調整するための"システムタイマー"が用意された。  これは3.911マイクロ秒ごとに値が増える16ビットのカウンターで、下位バイトはI/OポートのE6H番地に,上位バイトはE7H番地に接続されている。ただし、16ビットの値を読もうとして、その途中でカウンターの値が変わると都合が悪いので、下位バイトと上位バイトの、どうちらか一歩のみを使うよい。  リスト1.1は、Bレジスターの値×3.911マイクロ秒を待つプログラムの例だ。カウンターの下位バイトの代わりに、上位バイトの値を使うようにプログラムを書き換えれば、Bレジスターの値×1001.2マイクロ秒待つプログラムができる。 【リスト 1.1(TIMER.Z80)】 1.1.6 MSX turbo R の I/O ポート  turbo R の記者発表資料にはI/Oマップが含まれていなかったので、取材とハードウェアの解析によって得られた情報をMSX2+のI/Oマップに追加して、編集部が表1.1のI/Oマップを作った。"R"という注が付く項目が、turbo R に新しく追加された I/O ポートだ。  まず"D/Aコンバーター"とういのは、PCMの録音再生を、BIOSをとおさずに操作するための I/O ポート。あとで詳細を紹介しよう。"ポーズキー制御"は、ポーズキーによるプログラムの停止を禁止、許可するための I/O ポート。ディスクの入出力中にプログラムが中断され、ディスクが破壊されるような事態を防ぐために、用意されたようだ。  "漢字ROM拡張"は、24ドットの漢字ROMや、将来作られるかもしれないJIS第3水準漢字ROMに備えての、予約機能らしい。その下の"?"は、どの資料にも書かれていないのだけれど、I/Oポートを読み書きするとS1990の内部で何らかのハードウェアが動作さするようだ。turbo R のハードウェアを、工場で検査するためのI/Oポートではないだろうか。そして”システムタイマー"はすでに説明してとおりのものだ。  なお、これは表に書いていないのだけれど、turbo R の速さに対応するためにも、PSG、ジョイスティック、マウス、プリンター、キーボード、時計(バッテリーバックアップされたクロックIC)の操作には、BIOSを使うべきだ。  次に、MSX2+と共通の機能なのだけど、補足説明しておきたいのが"リセットステータス"。これは、ハードウェアのリセットと、メインROMの0番地へのジャンプによる再起動とお、区別するためのI/Oポートだ。具体的には、メインROMの174H番地をコールすると、このリセットステータスの値がAレジスターに読み出され、」17DH番地をコールすると、Aレジスターの値がリセットステータスに書き込まれる。たとえば、 CALL 17AH OR 80H CALL 17DH RST 0H という手順で、リセットステータスのビット7を1にしてから0番地にジャンプすると、MSXを確実に再起動できるわけだ。  ところで、なぜBIOSをとおさずにリセットステータスを使ってはいけないかというと、マシンによってリセットステータスのハードウェアの信号の論理が、逆になっているから。BIOSがその違いを補正しているというわけだ。  DOS2が標準装備された turbo R で、ますます重要な存在になっていたのが"メモリーマッパー"。やや複雑な手順で拡張BIOSを使い、操作する必要があるものだ。  最後に余談になるけれど、表1.1には、かつて実用化または試作されていたが、最近のMSXには搭載されていない機能もふくまれている。最近のMSXは当たり前のコンピューターになってしまい、カワリモノの周辺機が少なすぎると筆者は思うのだが、どうだろうか。 1.1.7 速さを生かすためのDRAMモード  メモリーにはそれぞれ、"アクセスタイム"と呼ばれる読み書きの最小時間間隔の制限がある。もしもCPUのスピードが速すぎた場合には、"ウェイト(待ち時間)"を入れてCPUの速さをメモリーに合わせる必要はあるわけだ。このアクセスタイムは品種によってことなり、高速に使えるメモリーほど高価になる。また一般的に、ROMよりもRAMのアクセスタイムが短い。  されR800の速さを活かすためには、プログラムがROMよりRAMに入っているほうがいい。そこでBIOS、BASIC、サブROM、漢字ドライバーの各ROMの内容を、DRAM(メインRAM)に転送して使う、"DRAMモード"が用意された。  これは、メインRAMの最後の64キロバイトをメモリーマッパーから切り離し、ROMの内容を転送してから書き込みを禁止し、CPUに接続するというもの。CPUからは、普通のROMが高速のROMに差し替えられたように見える。BASICで書かれたプログラムを実行させる場合など、BIOSとBASICインタープリターが入ったROMがひんぱんに使われている時間が比較的短い。そのためDRAMモードを使うより、余ったメモリーをRAMディスクなどに活用するほうが有利かもしれない。  また、ROMカートリッジのプログラムもRAMに転送すると高速に動くけど、turbo R ではこれまで以上にディスク版のソフトウェアが主流になっていくだろう。 1.1.8 R800の特徴はこれだ! ・Z80とオプションコンパチブル。だからZ80用のソフトウェアも、CPUのタイミングに依存する場合を除いて動作する。 ・CPUのクロック数は7.16メガヘルツ。しかもZ80に比べて命令あたりのクロック数が大幅に減少しているため、Z80に換算した場合は29メガヘルツに相当する(ただし、ノーウェイト時)。 ・16ビット×16ビット→32ビットの精度を持つ乗算命令をサポート。これにより、演算処理速度の大幅な向上が可能になった。 ・Z80では未定義だった、IX/IYレジスターの、上位/下位8ビットごとのアクセスを、正式に保障した。 1.1.9 R800のすべて  turbo R のCPUとして採用されたR800は、従来のZ80にソフトウェア上位互換の高速CPUだ。つまり、CPUが速すぎて困らない限り、Z80用に開発されたソフトウェアを、そのままR800で高速に実行することができる。  Z80に追加された機能としては、16ビットの乗算命令と、Z80では"裏技"とされていたIX/IYレジスターのバイトアクセスの命令。詳細については、本書の付録にR800のインストラックション表を掲載するので、そちらを参考にしてほしい。  従来のMSXクロック周波数は3.58メガヘルツで、turbo R のクロック周波数は7.16メガヘルツ。これだけ見ると、速度が2倍になっただけのように思えるけど、実際はそうじゃない。R800ではひとつの命令を実行するのひ必要なクロック数が減り、さらにRAMをアクセスするのにM1サイクルのウェイトが発生しないので、プログラムの実行速度はさらに速くなる。従来のZ80で、R800と同じ処理速度を達成するには、約29メガヘルツのクロック周波数になるというから、かなりのスピードアップがはかられたわけだ。 【表1.2:Z80とR800の動作速度を比較】  さて、命令の種類ごとに、Z80とR800の速さを比較してみた結果が表1.2。レジスター間のデータ転送(LD命令)と、加算の速さが10倍になることは、注目に値する。ただし、この表の値はR800がノーウェイトで動く場合の速さを測ったもの。実際にはウェイトによって速さが落ちる可能性もあるので、注意しよう。なお、ウェイトが発生する条件とその回避方法を、あとで詳しく説明する。  R800の内部構造は、図1.3のようになっている。R800では、外部データバスは8ビットなのだけど、CPU内部のデータバスは16ビット。だから16ビットの加算命令などは、1サイクル処理されるわけだ。  このハードウェア構成を見てみると、R800は8ビットCPUのZ80よりも、外部データバスが8ビットの16ビットCPU、たとえばインテル社の"8088"やモトローラ社の"MC68008"に近いといえそうだ。  なお、図1.3の上のほうに、"アドレス拡張機能(マッパー)"というものがあるけれど、これはR800をMSX以外に使うために用意されているものらしい。turbo R で使う場合は、R800ではなくS1990に組み込まれたスロット制御機構と、メモリーマッパーがシステムを制御することになる。  それで次に、"DRAMのページアクセス"を詳しく説明しよう。まず、これまでのZ80を使ったメモリーアクセスの方法を示したのが、図1.4の下側。アドレス上位バイト(row address)をDRAMへ送り、RAS(row address strobe)信号をLOWにし、アドレスの下位バイト(column address)をDRAMへと送ったあとで、CAS(column address strobe)信号をLOWにする。これで、メモリーのアドレスが指定されるわけだ。  一方、R800でのDRAMのページアクセスを示したのが、図1.4の上側。アドレスの上位バイトとRAS信号を固定したまま、アドレス下位バイトとCAS信号のみを変化させ、従来の方法の2倍の速さで、DRAMを使っている。このように。R800ではアドレスの上位バイトが変わらずに、連続してDRAMが使われているとき、自動的にページアクセスが行われる。  さて、R800に接続して使用するのが容易なDRAMの種類としては、256キロビット(32キロバイト)、1メガビット(128キロバイト)、4メガビット(512キロバイト)などがあげられる。メインRAM容量の最低値が、256キロバイトとさだめられた turbo R でも、1メガビットのDRAMがたった2個あれば、事足りてしまうわけだ。  1983年に開催された最初のMSXでは、16キロビットのDRAMを8個も使い、それでもメインRAM容量は16キロバイトに過ぎなかった。そのことを思うと、わずか2個のDRAMで256キロバイトものRAM容量を達成する、現在の技術力はすごい。MSXの機能は大きくなったけど、ハードウェアの大きさと消費電力は小さくなった。こうした、日本の最新の半導体技術の応用結果が、最近話題になっているノート型パソコンや、turbo R の登場といえるだろう。