MCS-41

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系のマイクロコンピュータが使われて、メインのプロセッサは簡単なプロトコルでキーの状態を取得できるようになっています。

関連するチップをまとめて写真撮影しました。
8741, 8042, 8742
上の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を元に開発されていたと思われます。
8041 family
アンペール社のパルスモータコントローラ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をプログラムしたものではないかと推論されます。

Return to IC Collection.