この世のCPUを食べ尽くすのだ! 第4章 第3節

~あんたCPUなんか創ってどうするのよ?! Vol.3~

2018/10/8
技術書典5 け39

第4章 第3節 テンキー入力のデモ

      ;
      ;キー入力のデモ
      ;
    DEMOC:  
090: 7F   MOV B 0xF ;消灯
091: 91   OUT B [1] ;1桁目
092: 92   OUT B [2] ;2桁目
093: 9E   OUT B [0xE]  
094: 70   MOV B 0  
095: 9F   OUT B [0xF]  
096: 71   MOV B 1  
097: 9F   OUT B [0xF]  
098: 90   OUT B [0] ;戻り先番号
    LOOPC1:  
099: F0   JMP KDBIN ;入力→A
09A: 10  
      ;
      ;キー表示
      ;
    LABELC2:  
09B: 61   IN B [1] ;左へシフト
09C: 92   OUT B [2]  
09D: 9E   OUT B [0xE]  
09E: 71   MOV B 1  
09F: 9F   OUT B [0xF]  
0A0: 40   MOV B A ;入力値
0A1: 91   OUT B [1]  
0A2: 9E   OUT B [0xE]  
0A3: 70   MOV B 0  
0A4: 9F   MOV B [0xF]  
0A5: F9   JMP LOOPC1  
0A6: 09  
      ;
      ;キー入力サブルーチン
      ;
    KDBIN:  
100: 7E   MOV B 0xE  
101: 9E   OUT B [0xE]  
102: 6E   IN B [0xE]  
103: 51   ADD B 1  
104: EA   JNC KBDIN1 ;列1(右端)
105: 11  
106: 7D   MOV B 0xD  
107: 9E   OUT B [0xE]  
108: 6E   IN B [0xE]  
109: 51   ADD B 1  
10A: E2   JNC KBDIN2 ;列2(中央右)
10B: 13  
10C: 7B   MOV B 0xB  
10D: 9E   OUT B [0xE]  
10E: 6E   IN B [0xE]  
10F: 51   ADD B 1  
110: EA   JNC KBDIN3 ;列3(中央左)
111: 14  
112: 77   MOV B 7  
113: 9E   OUT B [0xE]  
114: 6E   IN B [0xE]  
115: 51   ADD B 1  
116: E2   JNC KBDIN4 ;列4(左端)
117: 16  
118: F0   JMP KBDIN  
119: 10  
    KBDIN1:   ;列1(+-×÷)
11A: 51   ADD B 1  
11B: E0   JNC KDBIN11  
11C: 12  
11D: 3A   MOV A 0xA  
11E: F8   JMP KBDINZ  
11F: 17  
    KDBIN11:  
120: 51   ADD B 1  
121: E6   JNC KDBIN12  
122: 12  
123: 3B   MOV A 0xB  
124: F8   JMP KBDINZ  
125: 17  
    KDBIN12:  
126: 52   ADD B 2  
127: EC   JNC KDBIN13  
128: 12  
129: 3C   MOV A 0xC  
12A: F8   JMP KBDINZ  
12B: 17  
    KDBIN13:  
12C: 54   ADD B 4  
12D: E0   JNC KBDIN  
12E: 10  
12F: 3D   MOV A 0xD  
130: F8   JMP KBDINZ  
131: 17  
    KBDIN2:   ;列2(=369)
132: 51   ADD B 1  
133: E8   JNC KDBIN21  
134: 13  
135: 3E   MOV A 0xE  
136: F8   JMP KBDINZ  
137: 17  
    KDBIN21:  
138: 51   ADD B 1  
139: EE   JNC KDBIN22  
13A: 13  
13B: 33   MOV A 3  
13C: F8   JMP KBDINZ  
13D: 17  
    KDBIN22:  
13E: 52   ADD B 2  
13F: E4   JNC KDBIN23  
140: 14  
141: 36   MOV A 6  
142: F8   JMP KBDINZ  
143: 17  
    KDBIN23:  
144: 54   ADD B 4  
145: E0   JNC KBDIN  
146: 10  
147: 39   MOV A 9  
148: F8   JMP KBDINZ  
149: 17  
    KBDIN3:   ;列3(AC258)
14A: 51   ADD B 1  
14B: E0   JNC KDBIN31  
14C: 15  
14D: 3F   MOV A 0xF  
14E: F8   JMP KBDINZ  
14F: 17  
    KDBIN31:  
150: 51   ADD B 1  
151: E6   JNC KDBIN32  
152: 15  
153: 32   MOV A 2  
154: F8   JMP KBDINZ  
155: 17  
    KDBIN32:  
156: 52   ADD B 2  
157: EC   JNC KDBIN33  
158: 15  
159: 35   MOV A 5  
15A: F8   JMP KBDINZ  
15B: 17  
    KDBIN33:  
15C: 54   ADD B 4  
15D: E0   JNC KBDIN  
15E: 10  
15F: 38   MOV A 8  
160: F8   JMP KBDINZ  
161: 17  
    KBDIN4:   ;列4(0147)
162: 51   ADD B 1  
163: E8   JNC KDBIN41  
164: 16  
165: 30   MOV A 0  
166: F8   JMP KBDINZ  
167: 17  
    KDBIN41:  
168: 51   ADD B 1  
169: EE   JNC KDBIN42  
16A: 16  
16B: 31   MOV A 1  
16C: F8   JMP KBDINZ  
16D: 17  
    KDBIN42:  
16E: 52   ADD B 2  
16F: E4   JNC KDBIN43  
170: 17  
171: 34   MOV A 4  
172: F8   JMP KBDINZ  
173: 17  
    KDBIN43:  
174: 54   ADD B 4  
175: E0   JNC KBDIN  
176: 10  
177: 37   MOV A 7  
    KBDINZ:  
178: 6E   IN B [0xE] ;キーを離す
179: 51   ADD B 1 ;まで待つ
17A: E8   JNC KBDINZ  
17B: 17  
17C: 60   IN B [0] ; 戻り先番号
17D: 9E   ADD B 0xE  
17E: EB   JNC LABELC2  
17F: 09  
180: F0   JMP INIT  
181: 00  

電卓のような入力ができることを示すデモンストレーションです。

テンキーの数字ボタンを押すと、その数字を7セグメントLEDの最下桁に表示します。それまで最下桁に表示されていた数字は中央桁に移動します。(つまり左へシフトする。)中央桁に表示されていた数値は表示されなくなります。

7セグメントLEDの駆動用に74HC4511を使用しているため、0~9の数字以外は表示できません。

プログラムでは ×÷AC のキーを押すと16進数のA~Fが入力されるように作ってありますが、残念ながら表示はされません。これらは実際の電卓プログラムの作成時に利用する予定です。

もう一つ補足。

キー入力のプログラムはKDBINというラベルから開始していますが、これは疑似サブルーチンになっています。

TD4のアーキテクチャではサブルーチンは作れないのですが、このサンプルプログラムではRAMの0番地に戻り先番号を指定することによって、キー入力が完了した時に複数の場所にジャンプできるようになっています。これにより、あらかじめ戻り先を決めさえすれば、プログラムの任意の場所からKDBINを呼び出してサブルーチンのように使うことができます。

現在のサンプルプログラムでは戻り先は1番しか使っていないので、1番以外の場合はリセット状態に戻るように作ってあります。