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