あなたCPUなんか創ってどうするのかしら?! 第4章 第5節

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

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

第4章 第5節 キー入力疑似サブルーチン

  KDBIN:   ; キー入力
080:7EMOVB0xE; 列1 (+-×÷)
081:BEMOV[0xE]B
082:5EMOVB[0xE]
083:31ADDB1
084:EAJNCKBDIN1
085:09
086:7DMOVB0xD; 列2 (=369)
087:BEMOV[0xE]B
088:5EMOVB[0xE]
089:31ADDB1
08A:E2JNCKBDIN2
08B:0B
08C:7BMOVB0xB; 列3 (C258)
08D:BEMOV[0xE]B
08E:5EMOVB[0xE]
08F:31ADDB1
090:EAJNCKBDIN3
091:0C
092:77MOVB7; 列4 (0147)
093:BEMOV[0xE]B
094:5EMOVB[0xE]
095:31ADDB1
096:E2JNCKBDIN4
097:0E
098:F0JMPKBDIN ; 入力無し
099:08
  KBDIN1:   ; 列1 (+-×÷)
09A:31ADDB1
09B:E0JNCKDBIN11
09C:0A
09D:6AMOVA0xA; +
09E:F8JMPKBDINZ
09F:0F
  KDBIN11:
0A0:31ADDB1
0A1:E6JNCKDBIN12
0A2:0A
0A3:6BMOVA0xB; –
0A4:F8JMPKBDINZ
0A5:0F
  KDBIN12:
0A6:32ADDB2
0A7:ECJNCKDBIN13
0A8:0A
0A9:6CMOVA0xC; ×
0AA:F8JMPKBDINZ
0AB:0F
  KDBIN13:
0AC:34ADDB4
0AD:E0JNCKBDIN
0AE:08
0AF:6DMOVA0xD; ÷
0B0:F8JMPKBDINZ
0B1:0F
  KBDIN2:   ; 列2 (=369)
0B2:31ADDB1
0B3:E8JNCKDBIN21
0B4:0B
0B5:6EMOVA0xE; =
0B6:F8JMPKBDINZ
0B7:0F
  KDBIN21:
0B8:31ADDB1
0B9:EEJNCKDBIN22
0BA:0B
0BB:63MOVA3; 3
0BC:F8JMPKBDINZ
0BD:0F
  KDBIN22:
0BE:32ADDB2
0BF:E4JNCKDBIN23
0C0:0C
0C1:66MOVA6; 6
0C2:F8JMPKBDINZ
0C3:0F
  KDBIN23:
0C4:34ADDB4
0C5:E0JNCKBDIN
0C6:08
0C7:69MOVA9; 9
0C8:F8JMPKBDINZ
0C9:0F
  KBDIN3:   ; 列3 (C258)
0CA:31ADDB1
0CB:E0JNCKDBIN31
0CC:0D
0CD:6FMOVA0xF; AC
0CE:F8JMPKBDINZ
0CF:0F
  KDBIN31:
0D0:31ADDB1
0D1:E6JNCKDBIN32
0D2:0D
0D3:62MOVA2; 2
0D4:F8JMPKBDINZ
0D5:0F
  KDBIN32:
0D6:32ADDB2
0D7:ECJNCKDBIN33
0D8:0D
0D9:65MOVA5; 5
0DA:F8JMPKBDINZ
0DB:0F
  KDBIN33:
0DC:34ADDB4
0DD:E0JNCKBDIN
0DE:08
0DF:68MOVA8; 8
0E0:F8JMPKBDINZ
0E1:0F
  KBDIN4:   ; 列4 (0147)
0E2:31ADDB1
0E3:E8JNCKDBIN41
0E4:0E
0E5:60MOVA0; 0
0E6:F8JMPKBDINZ
0E7:0F
  KDBIN41:
0E8:31ADDB1
0E9:EEJNCKDBIN42
0EA:0E
0EB:61MOVA1; 1
0EC:F8JMPKBDINZ
0ED:0F
  KDBIN42:
0EE:32ADDB2
0EF:E4JNCKDBIN43
0F0:0F
0F1:64MOVA4
0F2:F8JMPKBDINZ; 4
0F3:0F
  KDBIN43:
0F4:34ADDB4
0F5:E0JNCKBDIN
0F6:08
0F7:67MOVA7; 7
  KBDINZ:
0F8:5EMOVB[0xE]; 解放待ち
0F9:31ADDB1
0FA:E8JNCKBDINZ
0FB:0F
  RET:   ; 疑似RET
0FC:50MOVB[0]
0FD:3FSUBB1; 戻り先0
0FE:EFJNCSELECT
0FF:00
100:3FSUBB1; 戻り先1
101:E3JNCKBDTST2
102:13
103:3FSUBB1; 戻り先2
104:E7JNCCALC1C
105:19
106:3FSUBB1; 戻り先3
107:E2JNCCALC2D
108:22
109:3FSUBB1; 戻り先4
10A:E0JNCCALC2L
10B:2E
10C:3FSUBB1; 戻り先5
10D:EAJNCMUL2B
10E:32
10F:3FSUBB1; 戻り先6
110:E9JNCDIV2F
111:38
112:FBJMPSTART ; エラー
113:00 ; 終了

テンキーからの入力を行う疑似サブルーチンです。何かのキーが押されるまで待ち、押されたキーに対応する番号をAレジスタに格納して、呼び出し元に戻ります。

キーの配置とキー番号は以下の通りです。

 列4列3列2列1
bit 3778899÷0xD
bit 2445566×0xC
bit 11122330xB
bit 000AC0xF=0xE+0xA

数値キーはキートップに書かれた数値がそのままAレジスタに格納されるので、理解し易い上に処理もしやすいでしょう。その他のキーも分かり易いと思います。

疑似サブルーチンの仕組みは以下の通りです。

  1. RAMの0番地を疑似スタックに使用。KBDINを呼び出す前に、あらかじめ0番地に戻り先番号を格納しておく。
  2. KBDINの末尾(RET以降)は疑似リターン命令になっており、0番地をチェックして番号に応じたジャンプ先にジャンプする。

このような仕組みにより、あらかじめRET以降にジャンプ先を準備しておけば、疑似サブルーチンを実現できます。

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