TK-80

高校1年生の夏に、親にTK-80Eを買ってもらいました。高校の3年間は、TK-80Eでマイコン回路の基礎とマシン語(機械語)にふける日々でした。結構徹夜もしてたと思います。

TK-80やTK-80Eの外観    TK-80回路図

TK-80とTK-80Eの違いについては、ここ「NEC TK-80」とか、ここ「TK-80 – Wikipedia」を参照いただくとわかるのですが。TK-80EはTK-80のコストダウン版です。

買ってもらったのは高校1年生でしたが、その存在を知ったのが中学3年の秋頃で、決定的に欲しくなったのは。中学校の図書室で、初歩のラジオか、ラジオの製作の特集記事を読んでからです。当時の私の認識としては、TK-80はワンボードマイコンだけど、大型コンピュータと同じ基本構造(つまりノイマン式)であり、個人でも所有できる本物のコンピュータ。と言うことで、とてもエキサイティングで刺激的な「物」でした。
当時にもしも、「ノイマン式が何か説明できる?」と言われても答えられなかったです。
中学3年の冬休みの時点で、コンピュータについて図書館で調べても、「コンピュータにはデジタルコンピュータとアナログコンピュータがある」等と書かれた書物をやっと読めただけの環境だったので、ノイマン式が何か?デジタルコンピュータが何か?アナログコンピュータが何か、その違いさえ理解できていませんでした。ですのでコンピュータという物の本質を、ほぼ何も知らないまま、期待と幻想だけが巨大化して私の心を捉えていました。

万能マシン:コンピュータは万能マシンである。中学の技術家庭科の授業で「テスター」の回路図と動作原理を習った時に「テスターは結構な万能マシンです」という事を読んだ気がします。テスターは一つのメータを電流計にも電圧計にもして使いますし、電圧電流とも、直流でも、交流でも、回路を切り替えて計測できます、その他、導通抵抗計測や、導通チェッカー(断線チェック)もできますし、高級機では電気容量(キャパシタ)を計測することも可能ですし、インダクタンス(コイル等の誘導係数)も計測できるすぐれものである。みたいな触れ込みだったのですが、マイクロコンピュータの万能度は、電気テスターの比ではないということで、ものすごくワクワクしたのですが、それが茨の道であるとかは微塵も考えず、マイクロコンピュータの応用の一つの可能性に向けた、最初の一歩さえ踏み出すスキルも知識もないのに、ただ、漠然と、その超絶的可能性に心を奪われていました。

TK-80に触れてみたいなと、お思いの方もおられると思います。今の時代はとてもラッキーです。JavaベースのTK-80エミュレータを、一般に公開しておられますので、その方のページから入っていけば、TK-80に触れることが可能です。

CPUの型番はIntel 8080A互換のCPUで、TK-80に搭載されたのは本家intel製8080Aでは出来ない、減算のBCD補正ができるタイプで、TK-80EはμPD8080AFCで減算補正が出来ないタイプだったかと思いますが詳しくは、ネット検索して調べてください。

プログラムの互換性ということでは、減算命令の後に補正プログラムを書く必要があるCPUと、補正プログラムを書かなくても良いCPUが出回っているわけですから。プログラマはそういう事を念頭にプログラムを組まないと、どっちかで誤動作になりますよね。そういうことでCPUに、あなたは補正機能ありのCPUなの?とか聞ければいいのですが、当時のCPUにはそういう問い合わせ命令がなく、取り敢えず、ある値からある値を引き算して、結果の値が補正されているかを見て、自分のメモリ上の何処かに、今の動作環境は補正ありの環境だとか、補正なしの環境だとかを覚えておいて、それ以後、環境に合わせた減算ルーチンを選んで使うとか、ちょっと小細工をしたり。とか。です。ですが、そんなウンチク知らないよと言う場合は、「はまり」ますよね。他人が書いたプログラムを読みこなすにしても、なんで、整然と減算だけをしていないんだろう?とか、そもそも、冒頭に無意味にも見える引き算をしているのってなんでだろうとか、わざとややこしくして、プログラム行数を水増ししてるんじゃないかとか。思っちゃいますよね。本来単純に引き算するフローチャートを書くだけで済むなら判りやすのに、いろいろな事情による、諸々の処理が書かれているとか、書かないといけないとか。詳細フローチャートを書くと何がなんだかわかりづらくなる。だからといって、書かないと本来の処理を理解するには判りやすいけど、実際問題として実行する諸々の処理を隠蔽するようなことになる。こういうCPU型番の違いとかメーカによる違いとか微妙な差異は、プラットフォーム毎に存在しているのです。家計簿をマイコン化するだけのことに、エンジニアや、プログラマは プラットフォーム毎の事情に精通していないといけないのか?とか、言いたくなりますが、精通していないと何もプログラム書けないという時代が過去にありました。事情を吸収する仕組みとか隠蔽して、利用者に見せないことで使いやすくするという努力の結果が、Excelやワードや、いろいろなアプリケーションとして、花開いているので初心者でも購入したコンピュータで事務処理や、年賀状や写真加工が簡単に出来る時代の到来を迎えています。コンピュータ関連の職種だからと言って、中身をそんなに知らなくても、そこそこ行ける時代になりました。むしろ、内部の事など、そんなに気にしないで、どんどんアイデアを具現化していくほうが金になる時代です。その方向性で忙殺されると、内部に精通する余裕はなくなります。利益追求の体制作りにおいて、内部詳細の確認作業にどれくらい割り当てられるかですが、...。今の時代は国際化がインターネットで一気に進みましたので国際分業体制がどんどん進展しています。内部詳細等、利益に繋がりにくいが手間と時間と人数がかかる部分を人件費の安いところでやって、人件費の高いところではより利益率の高い部分をしようとか考えた場合、内部とか基礎とかは、海外に出す事になるのかもしれません。

昨今オープンソースが普及してきましたので、内部に精通したい場合、ソースコードをネット経由で入手すれば読むことが出来ます。そしてそれを適切にコンパイルすれば実行バイナリーも作れます。しかし同じものを製造するためには、適切にコンパイルする必要があります。適切にコンパイルするというのは、コンパイルオプションやターゲットプラットフォームの指定や様々な条件を整えるということです。これができなければ、配布される実行バイナリーと同じ生産物を得られませんから、コンパイル結果を比較したくても、比較材料を作れません。判定を出せないことになります。

また、コンパイルオプションの一つ一つがどう言うものなのかを知らないと、そのオプションが付いていて良いのかどうかを判断できません。つまり、コンパイラーの機能に精通する必要があるわけです。あるコンパイルオプションについて、いつも指定しているから、今回もつけたとか。何気なく付けることもあれば、今回その指定はまずいのだけど気づいていないとか。悪意により意図的にそのオプションを指定したのではなく、無知または勉強不足の場合。人の善悪と言う指標では、そのリスクを除去できない。ぶっちゃけて言えば人間性とかその人の心を読み取ったところで、根本的にはリスクの除去にさほど効果がない。ずいぶんと話題がそれてしまいました。ので話題をTK-80に戻します。

TK-80のCPUの命令体系を知る必要がありますが、ネットで次のところを開くと見ることが出来ます。

Intel 8080 instruction set

8080/Z80 Instruction Set

intel 8080 assembly programming manual – Altair 8800 Clone

Quick guide to 8080 instruction set – ClassicCMP

8080のWIKIのページに仕様とCPU内部構造の概略図が記載されてます。

そして、8080系CPUを搭載したKT-80のシステムアーキテクチャについては、冒頭のTK-80関連のページで見ていただくことができると思いますが、

TK-80を使いこなすには、モニタプログラムで使用するRWMのアドレスマップの知識が必要になります。http://www.st.rim.or.jp/~nkomatsu/evakit/TK80.htmlの下記の記述がある部分です。83C7〜83F3までがデバッグに役立つ情報で、83F4〜83FFまでの内容が8桁LEDへの表示で必要な情報になります。

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 セグメントデータバッファ

さて
簡単な計算をTK-80で、させる場合に次のようなやり方ができます。

命題:メモリーの8000番地の値と8001番地の値を足し算して8002番地に書き込む。

まず、この命題に対するニーモニックというかアセンブラを書く。
下記のようになります。
8080 Mnemonic     Z80 Mnemonic      Machine Code    Operation
LXI H,word        LD HL,word        21 word         HL <- word
MOV A,M           LD A,(HL)         7E              A <- (HL)
INX H             INC HL            23              HL <- HL + 1
ADD M             ADD A,(HL)        86              A <- A + (HL)
INX H             INC HL            23              HL <- HL + 1
MOV M,A           LD (HL),A         77              (HL) <- A

そして、その意味を解説しますと下記のようになります。
(1)HLレジスタに値0x8000を読み込む。
LXI     H,word    LD    HL,word     21              word HL <- word

(2)演算レジスタACCに、HLレジスタで示されたアドレス(8000番地)からその値をロードする。
MOV  A,M          LD    A,(HL)      7E              A <- (HL)

(3)HLレジスタをインクリメント(+1加算)する。つまり、8000を8001にする。
INX  H       INC HL            23              HL <- HL + 1

(4)演算レジスタACCに、HLレジスタで示されたメモリ番地(8001番地)に格納されている値を加算する。
ADD M             ADD A,(HL)        86              A <- A + (HL)

(5)HLレジスタをインクリメント(+1加算)する。つまり、8001を8002にする。
INX  H       INC HL            23              HL <- HL + 1

(6)演算レジスタACCの値をHLレジスタで示されたメモリ番地(8002番地)に格納する。
MOV M,A           LD (HL),A         77              (HL) <- A

さて、これで骨格が出来ました。21,7E,23,86,23,77がマシン語の骨格になります。

でも、もう少し手直しが必要です。それは、(1)のマシン語の21を見ますと(LXI     H,word )と記載していますので、LXIに対応するマシン語が1バイトあり、さらにはwordですから、。1バイトは8ビットで、wordは16ビットで2バイトなので、さらに2バイト必要だという意味になりまして、合計3バイトになります。ちなみに、Intel 8080 instruction set を参照していただくと、マシン語の21の説明は、表の上から3行目の(2x)左から2列目の(x1)の交差する升目に記載されています。その枠に記載されている内容は

LXI H,d16
3    10

となっています。
ニーモニックが、「LXI」で、Hとは、対象レジスタが「HL」で、d16とはデータが16ビットつまり2バイト、2行目の3とは、バイト数で3バイト命令、10とは実行ステート数が10ステートつまり約10クロックでこなす命令であると言う意味です。今回作ったプログラムの残りの部分「7E,34,86,34,77」を見ますと、これは全部1バイトと命令です。そのため

「21,7E,34,86,34,77」は、

「21,○,○,7E,23,86,23,77」になります。

今回命題に指定されているメモリアドレスは8000番地なので8000番地を○○に埋め込むことになりますが。intel系CPUはlittleindeanタイプのCPUなので、8000を扱うのに、下位8bitが先に、上位8bitはあとから指定する事になり、00,80を埋め込むことになります。従いまして、

「21,00,80,7E,23,86,23,77」になります。

プログラム格納先については、指定されていませんので、TK-80で一般的にプログラム格納をする0x8200番地から、作成したプログラムを格納する場合。次のようになります。

8200  21 00 80
8203  7E
8204  23
8205  86
8206  23
8207  77
8208  76    ※0x76と言う命令は「HALT」つまり停止と言う命令です。

 

何処かの何方かが、おっしゃっていたのですが「TVをご存知ですか?と質問をしたら、ほぼ全員が知っていると答える。同じくコンピュータをごぞんじですか?と質問をすると、ほぼ全員が知っていると答える。中にはバカにするなと怒る人も居る。だけど、TVの内部構造をつぶさに知る人はほとんど出会えないし、コンピュータについても同じく、その内部構造について、つぶさに知る人に出会えない。」つまり、名称と概念と操作は理解していても、その中身について知らない。

TVは動画ですが、実は静止画の連続表示です。では1秒間になんコマの絵を見ているか答えなさい?

白黒テレビと言うが、実は黒と白の中間階調のグレーの階調表現であり、2色表現ではない。

カラーTVは天然色というけど、TVは総天然色を表現しているのではなく、たまたま、人間の目がRGB+αの感度を持っていたため、センサーと伝送と表示に、RGB+αのチャネルを設けるだけで、人間の目には総天然色に見えているだけ。そもそも、人間の目が拾えない情報をセンサー時点でというか、基本設計時点で除外しているので、記録という点では、対象物の光学的特性を全部記録するには、人間の目が感じられない部分の情報をそもそも、拾って居ないという、大きな弱点がある。

輝度回路、クロマキー、輝線回帰周波数、垂直同期、水平同期、CRTタイプにはピント調節が必要だけどLED等フラットパネル系はピント調節そのものがない。カラーTV内部には積分回路や微分回路が入っているが、これはアナログコンピュータに似たアプローチだ。

等々、ズブの素人の人は知らない確率が高い部分が、確実に存在しています。

そして、そういう現象は、コンピュータにも当てはまるのです。

コンピュータ関連の本質の部分というか、内部うんちくでは

判断とは、比較である。

比較とは引き算である。

プログラムとは手続きである。

引き算は補数の足し算である。

等と、述べたところで、それがどうしたと返されてしまう。

1個のCPUで何十個ものアプリケーションやサービス等のプログラムを同時に動かしているが、これは正確なタスクスイッチとタスクスケジュールが出来ているからこそでできるのであり、間違いやすく忘れやすい人間の特性の対局の特性である。

CPUの時間感覚では、HDDやFDDへのアクセスは気が遠くなるほどの時間がかかる。

TK-80は、動作クロックが2.048MHzであり、1命令の実行に必要なクロックが7Tから8Tだったかもしれないので、大雑把に10Tとした場合、1秒間に2048000÷10=204,800命令実行する事になるので、トレース解析する場合、1秒間の出来事を解析するにはおおよそ20万ステップを解析しないといけない。

昨今のCPUクロックは2GHz前後が一般的であり、その点だけを見ると、千倍の解析量をこなす必要がある事になるが、最近のCPUは1クロックで1命令処理できるのが常であり、8080の様に1命令に10クロックも使わないから、処理ステップ数は1万倍ということになり、最近のCPUの1コア分の処理を1秒間記録してトレース解析する場合20万の1万倍のデータを追いかける事になる。

スケール感、見積もり、について、仮にプログラムの挙動を記録に残す場合、1コアについて1秒間の記録をとった場合のデータ量がどの程度の規模になるのか?。と言うことと、手作業で徹夜でできるレベルなのか?とか、支援システムや解析ツールを用いずにできるような事柄なのか?とか、利用活用する支援システムや解析ツールそのものの挙動が嘘ではない事を確認する事について、どう言うアプローチで望めば、その支援ツールや解析ツールの信頼性を確認できるんだろうか?とか。

多分、素人的には、普段、あまり、考えもしない部分について、ズブの素人さんは思い付きもしない。というか、一般的にマシン語レベルで、ITやコンピュータ関連の諸々を見つめる事をする人が少ない。

最近クラウドとか、言葉が氾濫しています。クラウドを構成する無数のコンピュータについて思いを馳せれば、ベアメタル型のレンタルサーバー、というのは、本物のコンピュータそのものを貸し出すと形態で、ベアメタル型じゃないタイプというと、仮想マシンです。つまり仮想マシンは、高性能なコンピュータ上に複数のコンピュータをエミュレーションしていたり、または、複数のコンピュータで1台のコンピュータを構成していたりします。

巨大なものを正確無比にうごかすには、きちんとした品質の基で、設計構築されなければ行けないが、基本構造のマシン語レベルでの品質確認が結構厳しそう。という問題点に気付ける

か、どうかです。

気付くための基礎的知識を身に付けるには、自分でマシン語を組み倒してみる事。そして、経験値を増やして、その経験値を参考に、コンピュータの品質確保について考える。と言う事が必要になって来ると思われます。

だから、限定的な知識を元にした判断や考察は、トータルとしての検討・検証がなされていない可能性が伺われます。そして、自分が知らない部分の内部構造について、明るくない。つまりブラックボックス化して考えていることになります。

そして、それが何につながるかと言うと、自分自身での検証が不可能な部分の集合体になっているということです。