MCS-48のような組み込み専用マイクロコンピュータが充分に安価になってくると、条件によっては複雑なシステムや装置の制御のために1台のコンピュータを組み込むのではなく、複数のコンピュータを強調動作させた方が適切なことも出てきました。
たとえば、モータや多数のソレノイドを細かい時間間隔で制御しながら、それと並行して一定時間は短い時間間隔でA/D変換して多数のデータを取り込み、その後に演算を行って表示を行うような、複雑な計測器を考えてみましょう。高速のCPUと多重割り込みを駆使し、モータ制御やソレノイド制御を行いながらA/D変換もコンカレントに実行するシステムを設計することも可能でしょう。あるいはA/D変換だけはDMAでCPUを介さずに行えるようにして、CPU側にかけるコストを低減することも可能かもしれません。しかし、別の手として、モータの制御だけを行うマイクロコンピュータ、多数のソレノイドのタイミング制御を行うマイクロコンピュータ、A/D変換を行って内部バッファにため込むマイクロコンピュータ、そしてユーザインターフェースや演算とそれらのマイクロコンピュータに指令を出す役目のマイクロコンピュータといった具合に役割を分担させることも可能になってきます。おっと、この場合だと、指令役のコンピュータが動作中に暇になるから、A/D変換の役割を担わせて合計3台のマイクロコンピュータを使った方が効率的かな。なんせ、MCS-48クラスのマイクロコンピュータは1000円を切りますから、うまく使えば1台の高性能マイクロコンピュータシステムより分散型のほうが安くなります。おまけに問題を切り分けやすくなりますから、たとえば数名でファームウェア開発を行う場合にも面倒が減るかもしれません。
そんなこんなで、他のコンピュータシステムのスレーブとして使える組み込み用マイクロコンピュータの需要というのは結構存在します。
すると、マイクロプロセッサとスレーブ側のマイクロコンピュータのインターフェースが問題になります。シリアル通信なども考えられますが、複数のスレーブを使う際などメインのコンピュータ側にI/Oポートをいくつも用意しなくてはならないなんて面倒です。そこでいっそのこと、メインのプロセッサ側からは単なるバスに接続されたI/Oポートに見えるような、スレーブ・マスタインターフェースを持った組み込み専用マイクロコンピュータが開発されました。それがMCS-41の8041系マイクロコンピュータです。
他の具体例を考えると、パーソナルコンピュータなんかのキーボードインターフェースなんかがそうですね。多数のキーのダイナミックスキャンをメインのプロセッサが行っては効率が悪いですから、専用のマイクロコンピュータに割り当てて、スキャンした結果だけメインプロセッサが取得するという形です。もっとも、ノート型を別にして現在主流のパーソナルコンピュータでは、キーボードと本体が分離して、細い線でキーボードとシリアル通信を行う関係上、キーボード側にはMCS-48系などのマイクロコンピュータが搭載されてたりします。ただ、従来のAT互換機などでは、そのキーボードからの通信を受ける部分にMCS-41系のマイクロコンピュータが使われて、メインのプロセッサは簡単なプロトコルでキーの状態を取得できるようになっています。
関連するチップをまとめて写真撮影しました。
上のuPD8741AはNEC製の紫外線消去型。中央のが実際のAT互換機に使われていたキーボードBIOSチップですが、しっかりとIntel製の8042AHと表示されていますね。下はIntel製の8742です。これは丸田様より寄付していただきました。
なお中央の8042AHは、486時代のVLバスが付与される前のマザーボードで使われていたものです。PhoenixBIOSですね。シールが2枚貼られていますが、1枚は本来のBIOS ROM用の証紙です。なんか、ROMに貼るスペースがないのでまとめてこちらに貼られていたような。
内部アーキテクチャなどはほとんど8048と共通です。MCS-48との違いを、まずピン配置から見ていきましょう。なお、手元の資料の都合で、以下の記述は8041A/8741Aのデータによるものです。
TEST0 1 40 VCC XTAL1 2 39 TEST1 XTAL2 3 38 P27/DACK* RESET* 4 37 P26/DRQ SS* 5 36 P25/IBF* CS* 6# 35 P24/OBF EA 7 34 P17 RD* 8 33 P16 A0 9# 32 P15 WR* 10 31 P14 SYNC 11 30 P13 D0 12 29 P12 D1 13 28 P11 D2 14 27 P10 D3 15 26 VDD D4 16 25 PROG D5 17 24 P23 D6 18 23 P22 D7 19 22 P21 VSS 20 21 P20
8048などと端子の名称からして異なってしまったものには#をピン番号のところに付けています。しかし、このほかにもP24 - P27の機能追加やD0 - D7の役割およびRD*, WR*信号の入出力方向が変化しています。
マスタ側のマイクロプロセッサからは、データバスバッファ(DBB)レジスタというレジスタを読み書きできるとともに、そのDBBレジスタが空かどうかを調べるステータスレジスタも読み出せるようになっています。そのためにMCS-48のバスポート(DB0 - DB7)が廃止され、マスタとのインターフェース用データ信号(D0 - D7)に変更されています。この結果、MCS-48と異なり、外部にメモリを増設することは不可能になってしまいました。当然、MCS-48で外部メモリとのインターフェースであったRD*, WR*, PSEN, ALE信号は役割をかえています。
RD*とWR*は名称は同一ですが、MCS-48では出力信号であったのに対して、MCS-41ではマスタプロセッサから与えられる入力信号となっています。プログラムメモリ拡張用のPSEN信号はDBBレジスタとステータスレジスタを切り替えるアドレス信号A0に変更されています。ALE信号はSYNC信号に変更されていますが、実際は外部メモリのアドレスラッチタイミングという意味が失われたための名称変更に過ぎません。マシンサイクルごとに出力されるのは同じで、シングルステップなどのためにMCS-48と同様に利用できます。
6番ピンのCS*信号はMCS-48では割り込み用の信号でしたが、MCS-41ではマスタ側からのチップ選択信号に変更されています。
ポート1やポート2の下位4 bitの役割は変更ありません。PROG信号とP20 - P23に8243を接続してポート拡張することも可能です。
ただ、ポート2の上位4 bitに新しい役割が付与されています。リセット時はMCS-48と同様にI/Oポートとして使用できますが、命令によって役割を変更して、マスタプロセッサ側への割り込み信号やDMA制御信号として利用できるようになっています。
プロセッサ機能の詳細はまた後で。
ところで、マイクロ秒単位の正確なタイミングで外部とやりとりするわけではなくて、せいぜい百マイクロ秒単位のタイミングで外部装置を制御する周辺LSIなら、新規にLSIの回路設計を行わずに8041をプログラムすることで実装できそうです。その方が、LSI製造時にマスクROMのパターン以外は同一の8041を大量一括生産できますから、目的のLSI規模が8041より小規模だったとしても、多品種少量生産を行うよりコストダウンにつながります。しかも、専用LSIを開発するにはLSI開発製造能力のある大企業でないと困難ですが、8041のプログラム開発なら比較的小規模の企業でも取り組めます。そんなわけで、次のようなLSIも8041を元に開発されていたと思われます。
アンペール社のパルスモータコントローラPPMC-101にIntel社のキーボード表示コントローラ8278、およびNEC社のドットプリンタコントローラであるuPD781とuPD782。これらは久我様よりいただきました。
これらのLSIがなぜ8041を元にしたものと判断したかといえば、ピン配置やメインのCPUとコマンドやデータをやりとりするレジスタ構成が手がかりになります。なにしろ、内部のROMに書き込むプログラムによって動作は変更できますが、ハードウェア面は変更ができませんから。もちろん、それとは別に、開発直後の量産立ち上がり時期なんかでは、特にLSI製造メーカ以外の企業がマスクROM書き込みを発注した場合など、LSI製造メーカの都合で本来の8041の型番がパッケージに表記されていて、わかることもあります。上の写真のPPMC-101をよく見ると、その型番の後ろにD8041というマーキングが読み取れますね。
さて、上記4種類のICのピン配置と8041のピン配置を比較のため、表にしてみました。
ピン番号 | 8041 | PPMC-101 | 8278 | uPD781 | uPD782 |
1 | TEST0 | NC1 | RL | RL | RIN* |
2 | XTAL1 | X1 | X1 | X1 | X1 |
3 | XTAL2 | X2 | X2 | X2 | X2 |
4 | RESET* | RESET* | RESET* | RESET* | RESET* |
5 | SS* | NC1 | NC | VCC3 | VCC3 |
6 | CS* | CS* | CS* | CS* | CS* |
7 | EA | GND | GND | VSS2 | VSS2 |
8 | RD* | RD* | RD* | RD* | RD* |
9 | A0 | A0 | A0 | C/D* | C/D* |
10 | WR* | WR* | WR* | WR* | WR* |
11 | SYNC | SYNC | SYNC | OPEN1 | NC |
12 | D0 | D0 | D0 | D0 | D0 |
13 | D1 | D1 | D1 | D1 | D1 |
14 | D2 | D2 | D2 | D2 | D2 |
15 | D3 | D3 | D3 | D3 | D3 |
16 | D4 | D4 | D4 | D4 | D4 |
17 | D5 | D5 | D5 | D5 | D5 |
18 | D6 | D6 | D6 | D6 | D6 |
19 | D7 | D7 | D7 | D7 | D7 |
20 | VSS | GND | GND | VSS1 | VSS1 |
25 | PROG | NC2 | NC | OPEN2 | NC |
26 | VDD | VCC | VDD | VCC2 | VCC2 |
40 | VCC | VCC | VCC | VCC1 | VCC1 |
他のI/Oポートは各チップで必要に応じて使われていますから、1 - 20番ピンと25, 26, 40番ピンだけ表にしてみました。かなり似ていることがわかると思います。
TEST0は入力ポートのようなものですから、各チップで使われなかったり、何かしらの状態入力に使われたりしています。RLという略語が8278とuPD781で使われていますが、これは別の意味の略語で、8278はキー入力のリターンライン、uPD781は左リセットの意味です。
2, 3番ピンは水晶発振回路用の端子で、4番ピンはリセット信号と、各LSIで共通の端子です。
5番ピンはシングルステップ入力ですから、どのLSIもプルアップないしVCCに直接接続するようにして、シングルステップ機能を使えなくしています。
7番ピンも同様にGNDに直接接続するようにして、機能を使わないようにしています。
6, 8, 9, 10, 12 - 20, 26, 40番ピンは完全に共通です。9番ピンの表記が8041, PPMC-101, 8278ではA0、uPD781とuPD782はC/D*となっていますが、後者はコマンドレジスタ選択/データレジスタ選択の略で、A0と同じことです。
11番ピンのSYNC出力は実際にはシングルステップのタイミングを制御する以外にはほとんど利用目的のない出力端子で、そのため、一応SYNCと表記しているものや、必ずオープンにするように記法を変えているものもありますが、結局はオープンにして使用することになります。
25番ピンはI/O拡張用のPROG出力信号ですが、どのLSIも使用していませんから、オープンで使用することになっています。
このように、8041のプログラマブルでない信号のピン配置が共通になっていることから、これらのLSIは8041をプログラムしたものではないかと推論されます。