あなた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以降の疑似リターンは他の疑似サブルーチンと共有しており、戻り先番号は全ての疑似サブルーチンで共通になっています。これによりプログラム量を減らすと同時に、メンテナンスの手間とバグの可能性を減らしています。