あなたCPUなんか創ってどうするのかしら?! 第4章 第5節
~あんたCPUなんか創ってどうするのよ?! Vol.4~
2018/10/8
技術書典5 け39
第4章 第5節 キー入力疑似サブルーチン
| KDBIN: | ; キー入力 | |||||
| 080: | 7E | MOV | B | 0xE | ; 列1 (+-×÷) | |
| 081: | BE | MOV | [0xE] | B | ||
| 082: | 5E | MOV | B | [0xE] | ||
| 083: | 31 | ADD | B | 1 | ||
| 084: | EA | JNC | KBDIN1 | |||
| 085: | 09 | |||||
| 086: | 7D | MOV | B | 0xD | ; 列2 (=369) | |
| 087: | BE | MOV | [0xE] | B | ||
| 088: | 5E | MOV | B | [0xE] | ||
| 089: | 31 | ADD | B | 1 | ||
| 08A: | E2 | JNC | KBDIN2 | |||
| 08B: | 0B | |||||
| 08C: | 7B | MOV | B | 0xB | ; 列3 (C258) | |
| 08D: | BE | MOV | [0xE] | B | ||
| 08E: | 5E | MOV | B | [0xE] | ||
| 08F: | 31 | ADD | B | 1 | ||
| 090: | EA | JNC | KBDIN3 | |||
| 091: | 0C | |||||
| 092: | 77 | MOV | B | 7 | ; 列4 (0147) | |
| 093: | BE | MOV | [0xE] | B | ||
| 094: | 5E | MOV | B | [0xE] | ||
| 095: | 31 | ADD | B | 1 | ||
| 096: | E2 | JNC | KBDIN4 | |||
| 097: | 0E | |||||
| 098: | F0 | JMP | KBDIN | ; 入力無し | ||
| 099: | 08 | |||||
| KBDIN1: | ; 列1 (+-×÷) | |||||
| 09A: | 31 | ADD | B | 1 | ||
| 09B: | E0 | JNC | KDBIN11 | |||
| 09C: | 0A | |||||
| 09D: | 6A | MOV | A | 0xA | ; + | |
| 09E: | F8 | JMP | KBDINZ | |||
| 09F: | 0F | |||||
| KDBIN11: | ||||||
| 0A0: | 31 | ADD | B | 1 | ||
| 0A1: | E6 | JNC | KDBIN12 | |||
| 0A2: | 0A | |||||
| 0A3: | 6B | MOV | A | 0xB | ; – | |
| 0A4: | F8 | JMP | KBDINZ | |||
| 0A5: | 0F | |||||
| KDBIN12: | ||||||
| 0A6: | 32 | ADD | B | 2 | ||
| 0A7: | EC | JNC | KDBIN13 | |||
| 0A8: | 0A | |||||
| 0A9: | 6C | MOV | A | 0xC | ; × | |
| 0AA: | F8 | JMP | KBDINZ | |||
| 0AB: | 0F | |||||
| KDBIN13: | ||||||
| 0AC: | 34 | ADD | B | 4 | ||
| 0AD: | E0 | JNC | KBDIN | |||
| 0AE: | 08 | |||||
| 0AF: | 6D | MOV | A | 0xD | ; ÷ | |
| 0B0: | F8 | JMP | KBDINZ | |||
| 0B1: | 0F | |||||
| KBDIN2: | ; 列2 (=369) | |||||
| 0B2: | 31 | ADD | B | 1 | ||
| 0B3: | E8 | JNC | KDBIN21 | |||
| 0B4: | 0B | |||||
| 0B5: | 6E | MOV | A | 0xE | ; = | |
| 0B6: | F8 | JMP | KBDINZ | |||
| 0B7: | 0F | |||||
| KDBIN21: | ||||||
| 0B8: | 31 | ADD | B | 1 | ||
| 0B9: | EE | JNC | KDBIN22 | |||
| 0BA: | 0B | |||||
| 0BB: | 63 | MOV | A | 3 | ; 3 | |
| 0BC: | F8 | JMP | KBDINZ | |||
| 0BD: | 0F | |||||
| KDBIN22: | ||||||
| 0BE: | 32 | ADD | B | 2 | ||
| 0BF: | E4 | JNC | KDBIN23 | |||
| 0C0: | 0C | |||||
| 0C1: | 66 | MOV | A | 6 | ; 6 | |
| 0C2: | F8 | JMP | KBDINZ | |||
| 0C3: | 0F | |||||
| KDBIN23: | ||||||
| 0C4: | 34 | ADD | B | 4 | ||
| 0C5: | E0 | JNC | KBDIN | |||
| 0C6: | 08 | |||||
| 0C7: | 69 | MOV | A | 9 | ; 9 | |
| 0C8: | F8 | JMP | KBDINZ | |||
| 0C9: | 0F | |||||
| KBDIN3: | ; 列3 (C258) | |||||
| 0CA: | 31 | ADD | B | 1 | ||
| 0CB: | E0 | JNC | KDBIN31 | |||
| 0CC: | 0D | |||||
| 0CD: | 6F | MOV | A | 0xF | ; AC | |
| 0CE: | F8 | JMP | KBDINZ | |||
| 0CF: | 0F | |||||
| KDBIN31: | ||||||
| 0D0: | 31 | ADD | B | 1 | ||
| 0D1: | E6 | JNC | KDBIN32 | |||
| 0D2: | 0D | |||||
| 0D3: | 62 | MOV | A | 2 | ; 2 | |
| 0D4: | F8 | JMP | KBDINZ | |||
| 0D5: | 0F | |||||
| KDBIN32: | ||||||
| 0D6: | 32 | ADD | B | 2 | ||
| 0D7: | EC | JNC | KDBIN33 | |||
| 0D8: | 0D | |||||
| 0D9: | 65 | MOV | A | 5 | ; 5 | |
| 0DA: | F8 | JMP | KBDINZ | |||
| 0DB: | 0F | |||||
| KDBIN33: | ||||||
| 0DC: | 34 | ADD | B | 4 | ||
| 0DD: | E0 | JNC | KBDIN | |||
| 0DE: | 08 | |||||
| 0DF: | 68 | MOV | A | 8 | ; 8 | |
| 0E0: | F8 | JMP | KBDINZ | |||
| 0E1: | 0F | |||||
| KBDIN4: | ; 列4 (0147) | |||||
| 0E2: | 31 | ADD | B | 1 | ||
| 0E3: | E8 | JNC | KDBIN41 | |||
| 0E4: | 0E | |||||
| 0E5: | 60 | MOV | A | 0 | ; 0 | |
| 0E6: | F8 | JMP | KBDINZ | |||
| 0E7: | 0F | |||||
| KDBIN41: | ||||||
| 0E8: | 31 | ADD | B | 1 | ||
| 0E9: | EE | JNC | KDBIN42 | |||
| 0EA: | 0E | |||||
| 0EB: | 61 | MOV | A | 1 | ; 1 | |
| 0EC: | F8 | JMP | KBDINZ | |||
| 0ED: | 0F | |||||
| KDBIN42: | ||||||
| 0EE: | 32 | ADD | B | 2 | ||
| 0EF: | E4 | JNC | KDBIN43 | |||
| 0F0: | 0F | |||||
| 0F1: | 64 | MOV | A | 4 | ||
| 0F2: | F8 | JMP | KBDINZ | ; 4 | ||
| 0F3: | 0F | |||||
| KDBIN43: | ||||||
| 0F4: | 34 | ADD | B | 4 | ||
| 0F5: | E0 | JNC | KBDIN | |||
| 0F6: | 08 | |||||
| 0F7: | 67 | MOV | A | 7 | ; 7 | |
| KBDINZ: | ||||||
| 0F8: | 5E | MOV | B | [0xE] | ; 解放待ち | |
| 0F9: | 31 | ADD | B | 1 | ||
| 0FA: | E8 | JNC | KBDINZ | |||
| 0FB: | 0F | |||||
| RET: | ; 疑似RET | |||||
| 0FC: | 50 | MOV | B | [0] | ||
| 0FD: | 3F | SUB | B | 1 | ; 戻り先0 | |
| 0FE: | EF | JNC | SELECT | |||
| 0FF: | 00 | |||||
| 100: | 3F | SUB | B | 1 | ; 戻り先1 | |
| 101: | E3 | JNC | KBDTST2 | |||
| 102: | 13 | |||||
| 103: | 3F | SUB | B | 1 | ; 戻り先2 | |
| 104: | E7 | JNC | CALC1C | |||
| 105: | 19 | |||||
| 106: | 3F | SUB | B | 1 | ; 戻り先3 | |
| 107: | E2 | JNC | CALC2D | |||
| 108: | 22 | |||||
| 109: | 3F | SUB | B | 1 | ; 戻り先4 | |
| 10A: | E0 | JNC | CALC2L | |||
| 10B: | 2E | |||||
| 10C: | 3F | SUB | B | 1 | ; 戻り先5 | |
| 10D: | EA | JNC | MUL2B | |||
| 10E: | 32 | |||||
| 10F: | 3F | SUB | B | 1 | ; 戻り先6 | |
| 110: | E9 | JNC | DIV2F | |||
| 111: | 38 | |||||
| 112: | FB | JMP | START | ; エラー | ||
| 113: | 00 | ; 終了 | ||||
テンキーからの入力を行う疑似サブルーチンです。何かのキーが押されるまで待ち、押されたキーに対応する番号をAレジスタに格納して、呼び出し元に戻ります。
キーの配置とキー番号は以下の通りです。
| 列4 | 列3 | 列2 | 列1 | ||||||
|---|---|---|---|---|---|---|---|---|---|
| bit 3 | 7 | 7 | 8 | 8 | 9 | 9 | ÷ | 0xD | |
| bit 2 | 4 | 4 | 5 | 5 | 6 | 6 | × | 0xC | |
| bit 1 | 1 | 1 | 2 | 2 | 3 | 3 | – | 0xB | |
| bit 0 | 0 | 0 | AC | 0xF | = | 0xE | + | 0xA | |
数値キーはキートップに書かれた数値がそのままAレジスタに格納されるので、理解し易い上に処理もしやすいでしょう。その他のキーも分かり易いと思います。
疑似サブルーチンの仕組みは以下の通りです。
- RAMの0番地を疑似スタックに使用。KBDINを呼び出す前に、あらかじめ0番地に戻り先番号を格納しておく。
- KBDINの末尾(RET以降)は疑似リターン命令になっており、0番地をチェックして番号に応じたジャンプ先にジャンプする。
このような仕組みにより、あらかじめRET以降にジャンプ先を準備しておけば、疑似サブルーチンを実現できます。
このRET以降の疑似リターンは他の疑似サブルーチンと共有しており、戻り先番号は全ての疑似サブルーチンで共通になっています。これによりプログラム量を減らすと同時に、メンテナンスの手間とバグの可能性を減らしています。