この世のCPUを食べ尽くすのだ! 第4章 第1節
~あんたCPUなんか創ってどうするのよ?! Vol.3~
2018/10/8
技術書典5 け39
第4章 第1節 プログラム解説
| TD4EX3 | 1KHz | |||||
| INIT: | ||||||
| 000: | 70 | MOV | B | 0 | ||
| 001: | 9E | OUT | B | [0xE] | ||
| 002: | 9F | OUT | B | [0xF] | ||
| 003: | 71 | MOV | B | 1 | ||
| 004: | 9F | OUT | B | [0xF] | ||
| 005: | 72 | MOV | B | |||
| 006: | 9F | OUT | B | [0xF] | ||
| START: | ||||||
| 007: | 2E | IN | A | [0xE] | ||
| 008: | 01 | ADD | A | 1 | ||
| 009: | ED | JNC | DEMOE | |||
| 00A: | 00 | |||||
| 00B: | F7 | JMP | START | |||
| 00C: | 00 | |||||
| DEMOE: | ||||||
| 00D: | 01 | ADD | A | 1 | ||
| 00E: | E0 | JNC | DEMOD | |||
| 00F: | 03 | |||||
| ; | ||||||
| ; 2桁カウンタ | ||||||
| ; | ||||||
| 010: | 70 | MOV | B | 0 | ;10の位 | |
| 011: | 92 | OUT | B | [2] | ||
| 012: | 76 | MOV | B | 6 | ;10回 | |
| LOOPE1: | ||||||
| 013: | 93 | OUT | B | [3] | ||
| 014: | 70 | MOV | B | 0 | ;1の位 | |
| 015: | 90 | OUT | B | [0] | ||
| 016: | 76 | MOV | B | 6 | ;10回 | |
| LOOPE2: | ||||||
| 017: | 91 | OUT | B | [1] | ||
| 018: | 60 | IN | B | [0] | ||
| 019: | 9E | OUT | B | [0xE] | ||
| 01A: | 51 | ADD | B | 1 | ||
| 01B: | 90 | OUT | B | [0] | ||
| 01C: | 70 | MOV | B | 0 | ||
| 01D: | 9F | OUT | B | [0xF] | ||
| 01E: | 62 | IN | B | [2] | ||
| 01F: | 9E | OUT | B | [0xE] | ||
| 020: | 71 | MOV | B | 1 | ||
| 021: | 9F | OUT | B | [0xF] | ||
| 022: | 61 | IN | B | [1] | ||
| 023: | 51 | ADD | B | 1 | ||
| 024: | E7 | JNC | LOOPE2 | |||
| 025: | 01 | |||||
| 026: | 62 | IN | B | [2] | ||
| 027: | 51 | ADD | B | 1 | ||
| 028: | 92 | OUT | B | [2] | ||
| 029: | 63 | IN | B | [3] | ||
| 02A: | 51 | ADD | B | 1 | ||
| 02B: | E3 | JNC | LOOPE1 | |||
| 02C: | 01 | |||||
| 02D: | F0 | JMP | INIT | |||
| 02E: | 00 | |||||
I/OポートにRAMを追加したためIN命令とOUT命令のオペランドにアドレス指定が追加されています。例えばRAMの0番地にデータを書き込む場合は以下のように記述します。
OUT B, [0]各括弧がアドレス指定を表します。E番地にあるテンキーから入力する場合は以下のように記述します。
IN A, [0xE]C言語と同様に16進数は0x表記にします。
サンプルプログラムを見ると分かるように、OUT命令の使用率が高いです。これはRAMへの書き込みとI/Oポートへの出力をOUT命令が行っているためですが、LED出力時の効率の悪さも一因です。
TD4EX3のI/OユニットはI/Oポートの削減のために、まずLEDへの表示データをE番地に出力し、次に表示したい桁をF番地に出力する方式を採用しています。そのため1桁出力するたびに2回のOUT命令を必要とします。
電卓作成時に可能であれば、もっと簡単にアクセスできる回路に修正したいところです。
なお第2章で述べたようにTD4EX3のOUT命令はOUT B命令しかありません。そのためAレジスタの利用機会が無くなってしまいました。これも電卓作成時には改善し OUT A に相当する命令を搭載する予定です。
理想を言えばイミディエイトデータを直接出力できる OUT Im 命令が欲しいところですが、これは諦めるしかありません。