TK-80

NEC製のトレーニングキットTK-80は有名なので説明の必要はないでしょう。で、終わったら話にならないので、少々写真を並べて解説を加えますか。
ただし、TK-80に関する技術情報が必要なら、2000年4月からはなんとキットに付属の主要なマニュアルが手に入るようになりました。株式会社アスキーから発行された『復活! TK-80』が、それです。TK-80のWindows用シミュレータをCD-ROM付き書籍の形態で販売みたいなものなのですが、そのCD-ROMの中に『uCOM-80トレーニング・キット TK-80ユーザーズ・マニアル』などがPDF化されて納められています。回路図も読めます。モニタのアセンブルリストも掲載されています。というわけで、『復活! TK-80』を書店で注文してでも購入することをおすすめします。ISBN4-7561-3401-7です。
では、私のTK-80について、見ていきましょう。

TK80 full image

この全体写真からわかるように、これはTK-80Eです。ただしCPUだけはなぜかセラミックパッケージになっていますが。
TK-80とTK-80Eの違いは

  1. uPD8080AD -> uPD8080AFC
  2. uPD8228D -> uPD8228C
  3. uPD454D -> uPD464C
  4. uPD5101E -> uPD2101AL-4
の4点です。予想外に売れてしまいロットを重ねるついでにコストダウンしたのですね。uPD8080ADは減算後の10進補正が可能なセラミックパッケージのCPUで、uPD8080AFCはそれができないIntelの8080A完全互換のプラスチックパッケージのCPU。uPD8228はセラミックパッケージからプラスチックパッケージへコストダウンして、uPD454Dも自分で書き換えて使用する人はほとんどいなかったためにEEPROMからマスクROMのプラスチックパッケージにしてコストダウン。uPD5101Eは微小電流でバッテリバックアップ可能なCMOSメモリだけれども高価だったのでパワーダウン時も電流がたくさん流れるn-MOSのuPD2101AL-4に切り替えて大幅にコストダウンと。そういえば、1976年の発売当時から1977年頃は、秋葉原の店頭でTK-80に使われているLSIを買い揃えると7万円を越えていたんですよ。それが基板やスイッチやモニタプログラムやマニュアルがついて88500円ですから、これは売れるかもしれないなぁ。発売後、1年足らずで18000台が売れたそうですが。あ、もちろんその後も売れ続けたのですよ。

TK-80 LED

LED表示部拡大。LEDもトランジスタもICもNEC製だね。正直いってNECがLEDを作っていたなんて、TK-80が発売されるまで知らなかった。SN713Aです。部品屋の店頭で普通に購入できるのはもっぱら東芝製だったから。左側がアドレス表示で右側がデータ表示にもっぱら使われます。このデータ用が4桁あるというのが特徴で、おかげでファンクションキーの使い方がすべて後置式に統一されていて便利でした。つまり、普通に16進キーを押していくとデータ表示部にそのまま表示されますが、その後でWRITE INCRキーを押すとメモリに書き込まれ、そうではなくADRS SETキーを押すとアドレス表示に転送されるという仕組みになっています。これは置数表示が4桁分あるからで、2桁しか用意されていないLKit-8やMEK6800DIIなどでは先にアドレス入力を予告する使い方になります。
これらのLEDはDMAによってメインメモリの一部アドレス(83F8H - 83FFH)をくり返し読み出してリフレッシュすることで表示しています。他のシングルボードコンピュータではソフトウェアスキャンが多かったのですが、このTK-80はソフトウェアの介入なしに表示し続けることができました。逆に表示を禁止するのは8255のポート操作で行えます(PC7をLにすると表示オフ)。
キーの拡大がこれです。

TK-80 Key

キースイッチはLEDと異なりソフトウェアでスキャンしています。キーのすぐ左にある8255のPA0 - PA7とPC4 - PC6を用いて8×3のキースイッチマトリクスをスキャンします。25個のキーがあるのに不思議に思われるかもしれませんが、右上のRESETスイッチは8224にそのまま配線されていてハードウェア的にリセット信号を発生しますから、プログラムから操作するのは24個のスイッチだけです。
標準の8255はキーボードやLED表示が切り離されていればすべてのポートが使えますが、普通はそんなことをしないので(本当に配線を切断するという意味なので)、プログラムから自由に使えるポートはPB0 - PB7とPC0 - PC3です。ただし、オプションのオーディオカセットインターフェースを使用する場合、PB0とPC0を使用しますから、実質10本のI/Oしかユーザが使えませんし、オーディオカセットインターフェースを切り離すスイッチでも付けない限りPB1 - PB7は入力専用になってしまいます。まぁ、勝手に何とかしろって言われてそうできる人が使うべきトレーニングキットですから、問題はないんですが。TK-80で鉄道模型をコントロールしようと20年来の夢を追っている方は拡張バスに別の8255を増設すべきでしょう。なお、標準の8255はデコードがいいかげんでイメージばかりになっていますが、モニタプログラムからはI/Oアドレス0F8Hから0FBHにあるとしてアクセスしています。

ファンクションキーの意味ですが、RETはブレークポイントなんかで中断したユーザプログラムの継続再開です。STORE DATAとLOAD DATAはオーディオカセットテープレコーダへの録音再生コマンドですが、TK-80にはオーディオカセットテープインターフェースは付属しません。そのためのプログラムだけはROMに内蔵されています。ですから、オーディオカセットを利用したい場合には、マニュアルに書いてある部品を別に購入して、自分で(主にキーボード左のフリーエリアに)配線しなくてはなりません。なに、ICを2個と十数本の抵抗コンデンサ類とダイオードだけの回路です。110 bpsのトーンバースト方式の記録は遅いのだけど、1 KByteのメモリだけなら2分程度だからね。
このTK-80Eにはカセットインターフェースが付けられていないんだけど、使ってなかったのかなぁTK-80単体では。TK-80BSには高速オーディオカセットテープインターフェースが付属していたので、それと最初から組み合わせて使うには不要でしたね。
ADRS SETは前述の通りアドレス設定コマンドで、その番地から次々とメモリの内容を確認する場合にはREAD INCRキーを押すだけですみますし、内容を変更したいと思えば16進数キーを押して変更したいデータを打ち込んでからWRITE INCRキーです。このWRITE INCRキーも押した後にアドレスが+1されてその番地の内容が表示されるので、次々と書き換える場合には、数字、数字、WRITE INCRというリズムを繰り返します。
READ DECRキーがあるというのも特徴で、READ INCRしすぎて見たいメモリを行きすぎたときに逆向きにアドレスを進めながらメモリ内容の確認ができました。便利なんだけど、他のワンボードコンピュータには付いてないのが多かったのよ。

TK-80 CPU zoom

これがCPU周辺。左端に切れていますが、左中央部の金属ケースが水晶発振子で18.432 MHz、それを9分周して2.048 MHzクロックで動作していました。左下部のスイッチはメモリのバッテリバックアップ用のスイッチとステップ実行用のスイッチ。
CPUの右にゲルマニウムダイオードが2個見えますが、わかりますか。CPUの金属ふたの少し右にD2というマーキングがあって、ガラスビーズのようなものが見えますが、それです。そのすぐ下にD1とマークされたダイオードがもう一個あります。これはクロック信号を整流して負電圧を発生する回路で、CPUのVBB (-5 V)電源に使われます。このため、TK-80自体の電源は+5 Vと+12 Vだけが必要で、-5 Vは不要です。ROMに負電源の不要なuPD454/uPD464を使用していることも大きいですね。CPUのVBBには実際にはほとんど電流が流れませんから、この程度の回路で発生する負電圧で充分に満たされます。実測してみると、-3.8 Vしかなかったのですが、まぁVBBは規格よりもずっと幅のある範囲で動作するからね、なんとかなってるんだろうな。
このTK-80EにはRWMがフル実装されていますね。このとき、RWMはアドレス8000Hから83FFHに配置されています(アドレスデコードが不完全でイメージがあるので拡張時注意)。購入時は8200Hから83FFHまでの512 Byteです。83C7Hから83FFHまではモニタプログラムなどの作業領域となっていますから、ユーザは使用できません。通常、83C6Hがスタックの底になります。アドレスデコードが不完全なので、TK-80BSを使用する際には、そのまま拡張バスコネクタにTK-80BSの基板を接続するわけにはいかず、TK-80の一部パターンカットとジャンパ配線を行う必要があります。もっとも、外部にメモリを増設する際には必ず必要となる作業ですが。
あ、そうそう、このTK-80E構成だと、メモリアクセスタイムが間に合うんで、uPD8080AFに入れられているメモリウェイト1サイクルを安全に取り除くことができます。2割以上速くなりますが、改造方法について知りたい方は連絡ください。え、私?このTK-80Eはとりあえず改造しませんよ。TK-80BSなんかをご使用で遅くていらいらしている方にお薦めします。って、新しいコンピュータを使っているか。そんなだと。

トレーニングキットということで、ROMに納められたモニタプログラムも公開されています。当時の同種のマイクロコンピュータキットは原則としてみんな公開していましたね。やはりプログラムの勉強は他人が作成した(ある程度の規模の)プログラムをじっくり読むのが一番ということで、ちょうど適切なプログラム例がモニタプログラムだったわけです。TK-80に限らず、7セグメントLEDとキースイッチで操作するコンピュータキットの場合、マイクロコンピュータの技術者が必ず学ぶべきキースイッチのソフトウェアスキャンによる入力とか、LEDの表示法とか、ポインタやインデックスレジスタを用いた表引きやデータ操作なんかが、みんなモニタプログラムに含まれていましたから。キャッシュレジスタとか自動販売機の制御とか、あるいはビデオレコーダの制御なんかにも、これらのルーチンは必ず使われますので、有用だったわけです。

モニタプログラムで使用されているRWMのアドレスマップを以下に示します。

83C7  モニタスタックエリア
83D1  RST 2ジャンプアドレス
83D4  RST 3ジャンプアドレス
83D7  RST 4ジャンプアドレス
83DA  RST 5ジャンプアドレス
83DD  RST 6ジャンプアドレス
83E0  PC(LO) ステップ動作時のレジスタセーブエリア
83E1  PC(HI)   (以下83EBまで)
83E2  SP(LO)
83E3  SP(HI)
83E4  L
83E5  H
83E6  E
83E7  D
83E8  C
83E9  B
83EA  F
83EB  A
83EC  データレジスタ
83EE  アドレスレジスタ
83F0  ブレークアドレスレジスタ
83F2  ブレークカウンタ
83F3  キーインプットフラグ
83F4  ディスプレイレジスタ
83F8  セグメントデータバッファ
83C7Hから83D0Hまでがモニタ内部で使用されるスタック領域です。ユーザプログラムをRUNコマンドで実行されるときにはスタックポインタには83C7Hが入っていて、83C6Hからユーザスタックとして使われます。
83D1Hから83DFHまではRSTジャンプテーブルで、それぞれのRST命令が実行されたときに、このアドレスにジャンプします。ここにJMP XX命令を書き込んでおけば、ユーザが自由にRST呼び出しで実行されるルーチンを定義できます。なお、ここにないRST命令はリセットやステップ実行のためにモニタプログラムが使用しています。
83E0Hから83EBHまではレジスタセーブエリアで、ステップやブレークポイント動作でユーザプログラムを中断した際のレジスタの内容が保存されます。この領域を調べれば、その時点のレジスタの内容がわかりますし、書き換えれば書き換えた値をレジスタ入れてユーザプログラムを継続実行させられます。キー一発で調べるというわけにはいきませんし原始的な方法ですが、とにかく機械語のプログラムのデバッグには必要な機能です。
これと関連するものとして、83F0Hからの3 Byteの内容がブレークポイント動作に使われます。82F2Hの1 Byteがブレークカウンタで、この内容が0ならSTEP/AUTOスイッチがSTEP側のときにRUNされるとステップ実行が行われます。0以外の値になっていると、83F0Hと83F1Hのブレークアドレスレジスタの中に指定されたアドレスの命令がブレークカウンタ回実行されるまでプログラムを実行し、ブレーク回数に達したら実行を中断します。このときブレークカウンタは0になっています。こうして、ブレーク実行が可能になります。なお、このブレーク動作はユーザプログラムの1命令実行ごとにモニタプログラムが介入して実現していますから、時間的な正確さが失われることは忘れてはいけません。
83ECHからの2 Byteのデータレジスタはモニタプログラムがデータ表示のLEDに表示する内容が納められます。同様に83EEHのアドレスレジスタはモニタプログラムがアドレス表示LEDに表示する内容が納められます。また、モニタの操作対象となっているメモリアドレスを示すポインタと解釈することもできます。
キーインプットフラグはキー入力のチャタリング除去用のワークエリアです。
83F4Hからの4 ByteからなるディスプレイレジスタはLEDに表示する数値データが納められます。データレジスタやアドレスレジスタと同じ意味合いのものですが、データレジスタやアドレスレジスタがモニタプログラムのワークエリア的な意味合いがあるのに対し、このディスプレイレジスタはセグメントデータ変換ルーチンが使用する表示用バッファデータ専用という位置付けになっています。83F4Hの内容が左端から2桁分、83F7Hが右端から2桁分といった対応になっています。
83F8Hから83FFHまでの8 ByteはハードウェアによってLED表示に使われるビットデータが納められています。83F8Hがもっとも左側のLED、83FFHが右端のLEDに対応します。それぞれビットがLEDの各セグメントに対応し、1となっているビットに対応するセグメントが点灯します。この領域をユーザプログラムで書き換えれば、数字以外の任意の表示パターンをLEDに表示させることができます。ビットとセグメントの対応表を次に示します。
D0-a,  D1-b,  D2-c,  D3-d,  D4-e,  D5-f,  D6-g,  D7-dp
このaからgまでは7セグメントLEDの各セグメントに一般的に割り当てられる記号で、7セグメントの一番上にある水平のセグメントがa、そこから時計回りにb, c, d, e, fとなって、中央の水平セグメントがgになります。dpは小数点です。ですから、1の形に表示させたければ06Hというデータを書き込みます。水平になっている3本のセグメントだけ光らせるなら、49Hというデータを書き込みます。

以上のワークエリアの知識とこれから説明するモニタプログラム内のサブルーチンの知識を組み合わせれば、昔風のTK-80の小アプリケーションを作成することができるでしょう。

アドレス01A1H  アドレス・データレジスタ表示
このサブルーチンを呼び出すと、アドレスレジスタとデータレジスタに納められたデータをディスプレイレジスタに転送し、さらにセグメントデータ変換ルーチンを呼び出すことによって、LEDに表示します。
このルーチンは全レジスタを破壊します。

アドレス01C0H  セグメントデータ変換
ディスプレイレジスタの内容をセグメントデータに変換してセグメントデータバッファに書き込みます。この結果、セグメントデータバッファの内容がハードウェアによって自動的に表示されます。数値データを16進数としてLEDに表示したい場合には便利なルーチンです。
このルーチンは全レジスタを破壊します。

アドレス0216H  キー入力(入力があるまで待つ)
キースキャンを行ってキーコードを返します。何かキーが押されるまで待ち、それに対応したキーコードをAレジスタに入れて返します。キーコードは次のようになっています。左がキートップの文字、右がキーコードです。

0-00, 1-01, 2-02, 3-03, 4-04, 5-05, 6-06, 7-07
8-08, 9-09, A-0A, B-0B, C-0C, D-0D, E-0E, F-0F
RET-11, RUN-10, STORE DATA-16, LOAD DATA-17
ADRS SET-12, READ INCR-14, READ DECR-13, WRITE INCR-15
このルーチンはA, F, B, D, Eレジスタを破壊します。

アドレス0223H  キー入力(入力がなくてもただちに戻る)
キースキャンを行ってキーコードを返します。ただし、呼び出されたときにキーが押されていない場合は待たずにAレジスタに0FFHを入れて返します。キーが押されていれば対応するキーコード(上と同じ)をAに入れて返します。リアルタイムのゲーム用の入力なんかに使えますね。
このルーチンはA, F, B, D, Eレジスタを破壊します。

アドレス02DDH  4.5112 msタイマ
このルーチンを呼び出すと、4.5112 ms後に戻ります。時間待ちに使ってください。
このルーチンはD, Eレジスタを破壊します。

アドレス02EAH  9.0171 msタイマ
待ち時間が異なる他は02DDHのルーチンと同一。

アドレス02EFH  27.176 msタイマ
待ち時間が異なる他は02DDHのルーチンと同一。

これだけわかれば、当時あったような小さなゲームを作成できると思います。ひとついかがですか。

Return to IC Collection.