コンピュータのしくみ
コンピュータ
コンピュータは主にCPU,RAM,ROM,IOでできています。
CPU
CPUはコンピュータの中心・心臓部です。計算をしたり,比べて判断をしたりするところです。高速に読み書きできるレジスタを持っています。
bitは計算する桁数を表します。8桁の電卓より16桁の電卓の方が計算能力が高いということです。今はARMの32bit演算やパソコンの64bit演算があります。
MHzは周波数を表しています1MHzは1秒間に100万回そろばん玉を弾けるということに似ています。(実際には4回とか7回で一つの計算をします。)
RAM
ホワイトボードのようなもので,書いたり消したり書き換えたりすることができる装置です。その容量を示しています。
TK-80では高価なRAMは500bytesしか搭載されていませんでした。
2KByteならば1000文字分書けます。ノート1,2ページ分です。学校の黒板1枚分くらいですね。
最近のパソコンは1G~64Gバイトで,とてつもない容量です。
ラズベリーパイでは1Gから8Gのものがあります。
ROM
本の様に読む専用のメモリです。TK-80では768bytes搭載されていました。
マイコンではフラッシュROMといって1万回から100万回書き替えができるそうです。Arduinoの64Kならば64000bit32000文字の本ということです。1ページ2000文字ならば16ページになります。少しの容量ですが,小中学校の劇の台本位でしょう。
ARMでは512KBですので128ページ分です。ちょっとした本になります。
ハードディスクやSSD,SDカードもその代用になります。
IO(PIO)
インプット(I),アウトプット(O)(入力,出力)
ペリフェラルIO(PIO)とも言います。
PIN数が多いほどたくさんの機械を制御できます。出力はON,OFF,入力はデジタルとアナログが有ります。アナログ入力は電圧の大きさを知ることができます。
IOは0か1しかわからないのですがADやPWMを使っていろいろな表現をします。
アナログtoデジタル,電圧の大きさをデジタル数で表すことです。8bitならば256段階,10bitならば1024段階に分けることができます。0度から100度ならば0.1°まで表現できます。
DA変換は逆の動作です。
AD
PWM
一定時間内のパルスの数とパルスの形で出力機械を制御することができます。LEDの明るさを変えられます。寿命は短くなるようですが模型のモータも速さを変えることができます。
8080CPU
8080はレジスタがはっきりしているのでプログラムがわかりやすい(個人の感想です)のです。
最近のマイコンは(とはいってももう20年の歴史があるようですが)レジスタやスタックポインタの説明なしに,いきなりプログラムになってしまうのでちんぷんかんぷんになってしまうような気がします。メモリが全てレジスタになってしまうのはいいような悪いような,よくわかりません。
ALレジスタは計算するための記憶装置です。
BとCは8bitレジスタと2つ合わせた16bitレジスタとして使います
DとEは8bitレジスタと2つ合わせた16bitレジスタとして使います
HLは2つ合わせた16bitの相対アドレス用にも使います。
スタックの16bitのアドレス用に使います。
実行する16bitのアドレス用に使います。
8080Aのレジスタ
Aレジスタはアキュムレータといって特別なレジスタです。演算や命令を実行し記憶する中心となるところです。隣にあるフラグは計算や処理の時の状態を示すところです。(0になりましたよ,マイナスですよ,次の桁に繰り上がりますよ,などです)。
B・C,D・E,H・Lは8bitのメモリですがCPUの中にあるのでAレジスタとの演算を高速で行えます。それぞれペアで16bitのメモリとして演算や処理を行えるようにもなっています。
8bitは256個の数を扱うことができます。これを番地として使うと256個の家を選ぶことができるのですが,少し少ないですね。1棟のマンション程度の住人でしょうか?
16bitでは65,536個の家を識別できます。小さな市くらいの人口です。まあまあの仕事をやってくれそうですね。(2020.5.15加筆)
スタックポインタはサブルーチンへの分岐などの時にレジスタを退避するためのアドレスを記憶しておく16bitのメモリです。
プログラムカウンタは今どの処理をしているかを指し示す16bitのメモリです。
その他にもCPU内部ではいろいろな処理や記憶がなされています。
Z80は8080Aの機能を引き継ぎ,より使いやすく高機能にしたCPUです。A・F・B・C・D・E・H・Lのレジスタを2組持っていて,ちょっとしたサブのプログラムを実行するときスタックを使わずに,レジスタ群を入れ替えて実行することができます。その他にIX・IYという16bitのメモリアクセス用のレジスタを持っています。16bitの演算もできるので高速になります。5V単一電源でアドレス・データや信号線の配置もすっきりしていてDIYにも向いています。
Z80を使ってマイコンを自作した人も多いと思います。(私もいくつか作りました)。
TK-80
この5つの石が白く輝く姿,あこがれでした。
1976年6月3日に発売されました。8月という記事もあります。
この,緑とオレンジのキーボードは見るだけでわくわくします。
・・・2018/3/12今気づいたんですが,これってジャイアンツカラー?・・・
古い友達です。
発売当時秋葉原のラジオ会館7FのBIT INでアセンブラ等使わずにマシン語で,16進数そのものをキーボードに打ち込んでいました。
1985年当時,中古ですがBS付きで手に入れました(7万円だったと思います)。インベーダーゲームを入力したり,音を付けたり,潜水艦ゲームも作りました。でも数年で電源が壊れてしまい,その後ROM,RAMが無くなり廃物になってしまいました。
1ボードマイコンという言葉はTK-80から始まったのです(米ではAPPLE基板)。
1ボードマイコンという言葉はTK-80から始まったのです(米ではAPPLE基板)。
TK80(1976年8月発売)を代表とする,8080Aを使った1ボードマイコンは,他に何も使わずにプログラムを書いて試すことができます。16進キーボード+ファンクションキーとLEDディスプレイを持っていて,製作後すぐにプログラムやコンピュータの仕組みを学習することができます。
ROM756BYTES,RAM512BYTESでした。
TK-80が世にでる前,その当時は大学に一台コンピュータがあって入出力にパンチカードやテレタイプのようなものを使っていました(パンチカードを輪ゴムで止めたサブルーチン集を持ち歩いていました)。
このような入出力装置はとても高価なものだったので,大学にも数台しかなく,申し込んで時間いくらで借りていました。コンピュータを動かしてもらうにも料金が必要でした。
そんな時代に,個人でも使える,このワンボードマイコンは魅力的なものだったのです。
今では個人の持てるパソコンでも昔の大型コンピュータを超えています。すごい時代です。
CPU+発信機とコントローラ
2つの赤丸の中央に縦に配置された白いセラミックパッケージの40pin ICが8080Aです。
8080Aは初期のCPUでシステムコントローラ(8228右の赤丸)が必要です。単純なクロックではないのでクロックジェネレータ(8224左の赤丸)を使います。写真のように配置されています。
ROMとRAM
メモリはROMとRAMがあります。ROMは読み込み専用(Read Only Memory)です。RAMは読み書きできる(Random Access Memory)メモリーです。
CPUはROMもRAMも関係なくアクセスします。ROM,RAMはメモリ側の構造の違いです。16bit(16本)のアドレスで64KBを指定できます。0x0000から0xFFFFまで(0番地から65535番地まで)65536個です。
全て読み書きできる方が便利なようですが電源を切るごとにデータが消えてしまっては直ぐに動作させることができません。読み書きできてしかも消えないメモリもありますがコストパフォーマンスが良くありません。
発売された当時はメモリが高価でしたので,基板上には少量しか搭載されていませんでした。
ROMは756BYTES(基板上にはあと256BYTES増設できるようになっています)。0000h番地から02FFh
RAMは512BYTES(基板上にあと512BYTES増設できるようになっています)。8200hから83FFh 512個の8bitメモリです。一つ一つ数えることができる数です。それでプログラムができるのです。
このROMとRAMは高級でROMはEEPROM(電気的に消去・書き換えができます),RAMは電池でバックアップ(電源を切っても内容が消えません)できるようになっています。ただし,自分で電池などを付けて配線しなくてはなりません。後に販売された,廉価版のTK80Eはできません。
8255入出力(IO)
入出力マイコンと人間のかけ橋です。マイコンの中で何が行われていても直接わかりません。マイコンに何か伝えようとしても何か道具がなければできません。何かを入力したり出力したりするものを入出力装置,IOといいます。I/O(Input,Outputの略)と書くこともあります。
8255はとても使いやすいIOです。
マイコンと結ぶのは8bitのデータ線8本とA0,A1の2本のアドレス線,!WR,!RD,!CSの計13本です。(!は反転0の時アクティブ)
アドレス線2本はポートA,B,Cとコントロールポートを選択します。IOのアドレスは8bitなので255のポートを選択できますが,下2桁はA0,A1ですので残りは6bitになります。64個の8255をつなぐことができます。!CSで選択します。
コントロールポートにデータを入力することで,A,B,Cポートの入出力を設定します。Cポートは4bitX2に分けてA,Bポートと協働したりbitごとにコントロールしたりもできます。
TK80のキーボードはPAの8bitとPCの3bitを使って制御されています。(自作のZ80ワンボードマイコンはPBポートとCポート3bitでLEDの表示をさせていました。)
設定後は直接ポートを指定して入力,出力することができます。
ポートのアドレスは8bitで指定されますので255個のポートを制御することができるのですが,全てのアドレスがデコードされているわけではないので,イメージができます。
(指定されている番地以外のアドレスでも反応するということです。)
アドレスはA0とA1の2に入力しかないので4つのポートを扱うことになります。CPUから見ると,PAはF8h,PBはF9h,PCはFAh,コントロールポートはFBhになっています。
TK-80のモニターの0番地から始まるプログラムでは8255A動作モードを出力する命令になっています。3E92D3FB,
3E Aレジスタに次の数字92を入れなさい。
↑
92---
D3 次のアドレスにAレジスタの内容を出力
↓
FB←------------
92をFB(コントロール)に出力することになります。
8255のコントロールへの信号は上位3bitはモード切替で100bだとABCポートの入出力制御モードでbit0がCポート下位4bitの入出力1が入力0が出力,bit1がBポート,bit2は0固定bit3がCポート上位,bit4がAポートの入出力を指定します。
92hなのでA、Bポートは入力Cポートは上位,下位共に出力に指定していることになります。Cポートの下位はBポートと組み合わせて,上位はAポートと組み合わせて使うようにできています。
25キーボード(入力)
キーボードは3X8の24キーとRESETキーで25個のプッシュSWからなっています。ResetキーはそのままReset端子につなげています。その他のキーは0から8,9からF,コマンドキーに分けて8255AのCポート3端子に接続し,他端はAポートの8端子にデータとして入力されます。形は5X5になります。
各キーとIOポートとの接続です。
Reset 1,2
直接8224のResetに接続にします。
PA0 0 8 RUN 11
PA1 1 9 RET 10
PA2 2 A Adress Set 12
PA3 3 B Read Dec 9
PA4 4 C Write Inc 5
PA5 5 D Read Inc 4
PA6 6 E Tape Stor 7
PA7 7 F Tape Load 6
13 8 3
PC4 PC5 PC6
後ろの数字はキーボドがプリント基板になっているコネクタのPIN番号です。
7EGLED(出力)
ディスプレイは83F8hから83FFhに格納されている7SegデータをDMAで転送して8212でラッチしてLEDで表示しています。
7Segデータにする元の数値データの保管場所は
83F4hが
83F5hが
83F6hが
83F7hが
アドレスの上位2桁
アドレスの下位2桁
データの上位2桁
データの下位2桁です。
PC-8001とMKⅡ
2017年1月8日
RAMやROMを増やしてBASICを載せて,入力のキーボードを付け,出力のスピーカーやディスプレイ出力を付け加えるとコンピュータらしくなります。
PC-8001MKⅡですPC8001よりもICが多いのは当然です。いろいろなポートも付きました。TK-80と同じようなものですがICの数も多く機能も高いのに安いものは2000円位で手に入ってしまいます(送料込)。
ケースの下部です。ここにシールドを付けて基盤を付けます。
シールドを付けました。
基板を取り付けました。中古ですのできれいにしないと虫がわいたら大変です。全て洗浄して乾燥させてからの仕事です。
基板上部シールドと電源を取り付けました。昔のものは丁寧に頑丈に作られています。
電源の中身と外観です。独立しているのでわかりやすくできています。
拡張部のパーツを付けました、ボードを2枚拡張できます。
写真が曲がってしまいましたが,キーボードを載せたところです。カバーをかければ出来上がりです。
ND8080
2016年8月現在手に入る,Z80または8080の動作がさせられる高機能なワンボードマイコンです。(中日電工)
MYCPU80
8080CPUをロジックICで作ってKIT販売しているMYCPU80。各レジスタやアドレス・データの動きが目に見える,とてもすばらしい作品です。まさにプログラムの動きが見えるのです。(中日電工)
ND8080
8080CPUを使った1ボードマイコンです。製造中止の(2016年8月現在)部品を使ってのKITです。早く注文しないとなくなります。(中日電工)
スーパーAKI-80
スーパーAKI80,Z80とPIOが3つ分付いているボード。IOがたくさんあります。(秋月電子)
将来使ってみたい基板です。
最近になってAKI80GOLDが再販売されたのでっそちらの方が小さくて手頃です。
古いマイコン
TK-80に似ている1ボードマイコン
A4ファイルケースに入れてみました。
TK-85は機能がある分大きくて電池を入れることはできませんでした。
TK-80コンパチ
Tk-80が大変よく売れたので各社がいろいろなボードを出しました。NECも負けじと高機能で安価なTK-85を作りました。
マイテックから発売された1ボードマイコン,いろいろな品番があり,後発なだけあって機能が優れているものもあります。
左上に見えるのは単三電池4本です。モバイルマイコンにしてみました。
8080命令セット
マイコンの内部の操作にマイクロ命令が使われています。レジスタやメモリを選択したり,演算をしたり,入出力の操作をします。
8080命令セット
8080の命令セットは
16×16-(4+4+3+1+1)=243個あります。
Aレジスタを中心に8個の8bitレジスタと2個の16bitレジスタが有りますレジスタというのはメモリの一種なのですがCPU内にあって演算や転送が高速でできます。
命令はこのレジスタを上手に使います。大きく分けて4つのブロックがあります。
もう一度各レジスタを頭に入れましょう。
ALレジスタは計算するための記憶装置です。
BとCは8bitレジスタと2つ合わせた16bitレジスタとして使います
DとEは8bitレジスタと2つ合わせた16bitレジスタとして使います
HLは2つ合わせた16bitの相対アドレス用にも使います。
スタックの16bitのアドレス用に使います。
実行する16bitのアドレス用に使います。
命令のグループ
8080の命令は8bitでできています。
7654 3210
XXXX XXXX
このように上4桁と下4桁に分けると理解しやすくなります。
更に上位2bitが00と01と02,03の各グループに分かれています。
00はインクリメント,デクリメントローテート関連の命令が多くあります。
01はレジスタ間転送命令がほとんどです。
10は演算関係の命令が多くあります。
11はジャンプやサブルーチンに関する命令が多くあります。
00グループ
主にレジスタに数字を入れたり,1を足したり(INR・INX)引いたり(DCR・DCX)します。簡単なたしざんや,bitのローテーションもあります。
00グループは0Xh,1Xh,2Xh,3Xhの命令です。Xには0h~Fhの16進数が入ります。
インテル/ザイログ
Xには0~Fの16進数が入ります。
主にレジスタの操作に関する命令です。
00hはNOP(ノーオペレーション)何もしない。
10h,20h,30hは命令が有りません。
01hはLXI rr,nnの命令です。LD rr,nn
16bitレジスタに側値を入力します。
01h= LXI B,B3B2 11h= LXI D,B3B2
21h= LXI H,B3B2 31h= LXI SP,B3B2
02hはSTAX rrの命令です。LD (rr),A
16bitレジスタの示すメモリにAの内容を転送
02h= STAX(BC) 12h= STAX(DE)
22h= STAX(HL) 32H= STAX(SP)
03hはINX rrの命令です。INC rr
16bitレジスタのインクリメントを行います。
03h= INX BC 13h= INX DE
23h= INX HL 33h= INX SP
04hはINR rの命令です。INC r
8bitレジスタのインクリメントを行います。
04h= INR B 14h= INR D
24h= INR H 34h= INR M
05hはDCR rの命令です。DEC r
8bitレジスタのデクリメントを行います。
05h= DCR B 15h= DCR D
25h= DCR H 35h= DCR M
06hはMVI r,mの命令です。LD r,n
8bitレジスタに即値をロードします。
06h= MVI B 16h= MVI D
26h= MVI H 36h= MVI M
07hはローテートの命令です。RLC
8bitレジスタをローテートします。
07h= RLC Fc←A 17h= RAL A
27h= DAA 37h= STC
AをBCDにする c(キャリー)をセット
X8hは命令が有りません
09hはDAD rrの命令です。ADD HL,rr
16ビットレジスタの内容をHLレジスタに加算します。
09h= DAD B 19h= DAD D
29h= DAD H 39h= DAD SP
0AhはLDAXの命令です。LD A(rr)
16bitレジスタで示されるメモリの内容をAレジスタにロードします。
0Ah= LDAX B 1Ah= LDAX D
2Ah= LHLD (B3B2) 3Ah= LDA,(B3B2)
0BhはDCX rrの命令です。DEC rr
16bitレジスタのデクリメントを行います。
0Bh= DCX B 1Bh= DCX D
2Bh= DCX H 3Bh= DCX SP
0ChはINR rの命令です。INC r
04hと対です。
8bitレジスタのインクリメントを行います。
0Ch= INR C 1Ch= INR E
2Ch= INR L 3Ch= INR A
0DhはDCR rの命令です。DEC r
05hと対です。
8bitレジスタのデクリメントを行います。
0Dh= DCR C 1Dh= DCR E
2Dh= DCR L 3Dh= DCR A
0EhはMVI r,mの命令です。LD r,n
8bitレジスタに即値をロードします。
0Eh= MVI C 1Eh= MVI E
2Eh= MVI L 3Eh= MVI A
0Fhはローテートの命令です。RRC
8bitレジスタをローテートします。
0Fh= RRC Fc→A 1Fh= RRL A
2Fh= CMA 3Fh= CMC
A反転 c(キャリー)反転
01グループ
このグループはレジスタ間のデータの移動が主です。
一つだけHLT命令があります。何もしないという命令です。
01グループは4Xh,5Xh,6Xh,7Xhの命令です。Xには0h~Fhの16進数が入ります。
インテル/ザイログ
主にレジスタの転送に関する命令です。
76hはHLT(停止)命令です。HALT例外
その他はレジスタ転送です。
ソースレジスタからターゲットレジスタへデータが転送されます。ソースレジスタの値は変化しません。
ソース
X0,X8はBレジスタ
X1,X9はCレジスタ
X2,XAはDレジスタ
X3,XBはEレジスタ
04,XCはHレジスタ
X5,XDはLレジスタ
X6,XEはMレジスタ
X7,XFはAレジスタ
X0~X7 X8~XF
4XはターゲットでBレジスタ,Cレジスタです。
5XはターゲットでDレジスタ,Eレジスタです。
6XはターゲットでHレジスタ,Lレジスタです。
7XはターゲットでMレジスタ,Aレジスタです。
10グループ
10グループは演算に関する命令が多く集中しています。
X0は0~7,X8は8~Fの16進数が入ります。
8X0hはADD,8X8はADC ADD,ADC
9X0hはSUB ,9X8はSBB SUB,SBC
AX0hはANA,AX8はXRA AND,XOR
BX0hはORA,BX8はCMP OR,CPL
Xは8~Bまでの16進数が入ります。
X0,X8はBレジスタ,X1,X9はCレジスタ
X2,XAはDレジスタ,X3,XBはEレジスタ
X4,XCはHレジスタ,X5,XDはLレジスタ
X6,XEはM(メモリ),X7,XFはAレジスタ
とAレジスタとの演算をAレジスタに格納します。フラグにも影響します。
11グループ
11グループはジャンプやサブルーチンに関する命令が多く集中しています。
X0hとX8hがペアになっている命令もあります。
条件付きリターン命令
C0hはRNZ(リターンzF!=0)zフラグが0でなければリターン
C8hはRZ(リターンzF=0)zフラグが0ならばリターン
D0hはRNC(リターンcF!=0)cフラグが0でなければリターン
D8hはRC(リターンcF!=0)cフラグが0ならばリターン
E0hはRP0(リターンpF=0)pフラグが無ければリターン
E8hはRPE(リターンpF!=0)pフラグが有ればリターン
F0hはRP(リターンsF!=0)sフラグが無ければリターン
F8hはRM(リターンsF!=0)sフラグが有ればリターン
条件付きジャンプ命令
C2hはJNZ B3B2,CAhはJZ B3B2
D2hはJNC B3B2,DAhはJC B3B2
E2hはJP0 B3B2,EAhはJPE B3B2
F2hはJP B3B2,FAhはJM B3B2
条件付きサブルーチンコール命令
C4hはCNZ B3B2,CChはCZ B3B2
D4hはCNC B3B2,DChはCC B3B2
E4hはCP0 B3B2,EChはCPE B3B2
F4hはCP B3B2,FChはCM B3B2
演算命令
C6hは命令なし,CEhは命令なし
D6hはSUI B2,DEhはSBI B2
A-B2 A-B2-c
E6hはANI B2,EEhはXRI B2
A&B2 A xor B2
F6hはORI B2,FEhはCPI B2
A or B2 A-B2 f
リスタート命令
C7hはRST0,CFhはRST1
D7hはRST2,DFhはRST3
E7hはRST4,EFhはRST5
F7hはRST6,FFhはRST7
X0hとX5hがペアになっている命令もあります。
レジスタ退避・復帰命令
C1hはPOP B,C5hはPUSH B
D1hはPOP D,D5hはPUSH D
E1hはPOP H,E5hはPUSH H
F1hはPOP PSW,F5hはPUSH PSW
X3hとXBh部分的に関係性が有ります。
C2hはJMP B3B2,CBhは命令なしです。
D2hはOUT B2,DBhはIN B2
E2hはXTHL HL⇔(SP)
EBhはXCHG DE⇔HL
F2hはDI割込み禁止,FBhはEI割込み許可
単独で存在する命令もあります。
CDh B3B2はCALL命令です。