この世の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番以外の場合はリセット状態に戻るように作ってあります。