top of page
コンピュータの仕組み

 コンピュータのしくみ 

 コンピュータ 

 コンピュータは主に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の明るさを変えられます。寿命は短くなるようですが模型のモータも速さを変えることができます。

CPU

 ​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

 TK-80 ​

TK80本体

 ​この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と発信機コントローラ

​ CPU+発信機とコントローラ 

​ 2つの赤丸の中央に縦に配置された白いセラミックパッケージの40pin ICが8080Aです。

 8080Aは初期のCPUでシステムコントローラ(8228右の赤丸)が必要です。単純なクロックではないのでクロックジェネレータ(8224左の赤丸)を使います。写真のように配置されています。

ROMとRAM

 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

 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番号です。

7セグLED

 7EGLED(出力) 

​ ディスプレイは83F8hから83FFhに格納されている7SegデータをDMAで転送して8212でラッチしてLEDで表示しています。

​ 7Segデータにする元の数値データの保管場所は

83F4hが

83F5hが

83F6hが

83F7hが

アドレスの上位2桁

アドレスの下位2桁

データの上位2桁

データの下位2桁です。

PC-8001とMKⅡ

 PC-8001とMKⅡ 

​2017年1月8日

​ RAMやROMを増やしてBASICを載せて,入力のキーボードを付け,出力のスピーカーやディスプレイ出力を付け加えるとコンピュータらしくなります。

 PC-8001MKⅡですPC8001よりもICが多いのは当然です。いろいろなポートも付きました。TK-80と同じようなものですがICの数も多く機能も高いのに安いものは2000円位で手に入ってしまいます(送料込)。

 ケースの下部です。ここにシールドを付けて基盤を付けます。

 シールドを付けました。

 基板を取り付けました。中古ですのできれいにしないと虫がわいたら大変です。全て洗浄して乾燥させてからの仕事です。

 基板上部シールドと電源を取り付けました。昔のものは丁寧に頑丈に作られています。

 電源の中身と外観です。独立しているのでわかりやすくできています。

 拡張部のパーツを付けました、ボードを2枚拡張できます。

 写真が曲がってしまいましたが,キーボードを載せたところです。カバーをかければ出来上がりです。

TK80類似

ND8080

ND80Z3.5

​ 2016年8月現在手に入る,Z80または8080の動作がさせられる高機能なワンボードマイコンです。(中日電工

MYCPU8080

 MYCPU80 

​ 8080CPUをロジックICで作ってKIT販売しているMYCPU80。各レジスタやアドレス・データの動きが目に見える,とてもすばらしい作品です。まさにプログラムの動きが見えるのです。(中日電工)

ND8080

 ND8080 

​ 8080CPUを使った1ボードマイコンです。製造中止の(2016年8月現在)部品を使ってのKITです。早く注文しないとなくなります。(中日電工)

スーパAKI-80

 スーパーAKI-80

 スーパーAKI80,Z80​とPIOが3つ分付いているボード。IOがたくさんあります。(秋月電子)
 将来使ってみたい基板です。

 最近になってAKI80GOLDが再販売されたのでっそちらの方が小さくて手頃です。

TK-85
古いマイコン
​TK-80に似ている1ボードマイコン

​A4ファイルケースに入れてみました。

 TK-85は機能がある分大きくて電池を入れることはできませんでした。

TK-80コンパチ

Tk-80が大変よく売れたので各社がいろいろなボードを出しました。NECも負けじと高機能で安価なTK-85を作りました。

MP-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グループ 

グループ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

 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グループ 

​ 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グループ 

 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命令です。

bottom of page