この世の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 命令が欲しいところですが、これは諦めるしかありません。