あなたCPUなんか創ってどうするのかしら?! 第4章 第4節
~あんたCPUなんか創ってどうするのよ?! Vol.4~
2018/10/8
技術書典5 け39
第4章 第4節 ラーメンタイマー
| RAMEN: | ; ラーメン | |||||
| 040: | 60 | MOV | A | 0 | ; 3分LOOP | |
| 041: | A1 | MOV | [1] | A | ||
| RAMEN1: | ||||||
| 042: | 60 | MOV | A | 0 | ; 1分LOOP | |
| 043: | A2 | MOV | [2] | A | ||
| RAMEN2: | ||||||
| 044: | 60 | MOV | A | 0 | ; 10秒LOOP | |
| 045: | A3 | MOV | [3] | A | ||
| RAMEN3: | ||||||
| 046: | 68 | MOV | A | 8 | ; 1秒LOOP | |
| RAMEN4: | ||||||
| 047: | A4 | MOV | [4] | A | ; 秒を保存 | |
| 048: | AE | MOV | [0xE] | A | ; ハイフン | |
| 049: | 72 | MOV | B | 2 | ||
| 04A: | BF | MOV | [0xF] | B | ||
| 04B: | 42 | MOV | A | [2] | ; 10秒表示 | |
| 04C: | AE | MOV | [0xE] | A | ||
| 04D: | 70 | MOV | B | 0 | ||
| 04E: | BF | MOV | [0xF] | B | ||
| 04F: | 41 | MOV | A | [1] | ; 分表示 | |
| 050: | AE | MOV | [0xE] | A | ||
| 051: | 71 | MOV | B | 1 | ||
| 052: | BF | MOV | [0xF] | B | ||
| 053: | 66 | MOV | A | 6 | ; 0.5秒LOOP | |
| 054: | 7F | MOV | B | 0xF | ||
| RAMEN5: | ||||||
| 055: | 31 | ADD | B | 1 | ||
| 056: | E5 | JNC | RAMEN5 | |||
| 057: | 05 | |||||
| 058: | 21 | ADD | A | 1 | ||
| 059: | E5 | JNC | RAMEN5 | ; 0.5秒END | ||
| 05A: | 05 | |||||
| 05B: | 44 | MOV | A | [4] | ; 点滅 | |
| 05C: | 28 | ADD | A | 8 | ||
| 05D: | E1 | JNC | RAMEN6 | |||
| 05E: | 06 | |||||
| 05F: | F7 | JMP | RAMEN4 | ; 1秒END | ||
| 060: | 04 | |||||
| RAMEN6: | ||||||
| 061: | 43 | MOV | A | [3] | ||
| 062: | 21 | ADD | A | 1 | ||
| 063: | A3 | MOV | [3] | A | ; 10秒分岐 | |
| 064: | 26 | SUB | A | 10 | ||
| 065: | E6 | JNC | RAMEN3 | ; 10秒END | ||
| 066: | 04 | |||||
| 067: | 42 | MOV | A | [2] | ||
| 068: | 21 | ADD | A | 1 | ||
| 069: | A2 | MOV | [2] | A | ; 60秒分岐 | |
| 06A: | 2A | SUB | A | 6 | ||
| 06B: | E4 | JNC | RAMEN2 | ; 1分END | ||
| 06C: | 04 | |||||
| 06D: | 41 | MOV | A | [1] | ||
| 06E: | 21 | ADD | A | 1 | ||
| 06F: | A1 | MOV | [1] | A | ; 3分LOOP | |
| 070: | 2D | SUB | A | 3 | ||
| 071: | E2 | JNC | RAMEN1 | |||
| 072: | 04 | |||||
| 073: | 60 | MOV | A | 0 | ; ハイフン消 | |
| 074: | AE | MOV | [0xE] | A | ||
| 075: | 72 | MOV | B | 2 | ||
| 076: | BF | MOV | [0xF] | B | ||
| 077: | AF | MOV | [0xF] | A | ; 10秒 | |
| 078: | 63 | MOV | A | 3 | ; 1分 | |
| 079: | AE | MOV | [0xE] | A | ||
| 07A: | 71 | MOV | B | 1 | ||
| 07B: | BF | MOV | [0xF] | B | ||
| 07C: | FB | JMP | START | ; 終了 | ||
| 07D: | 00 | |||||
3分間の時間を計測するタイマーです。
テンキーの1を押した状態で電源ONもしくはリセットで起動します。
TD4EX4にはタイマー機能は無いため、CPUをループさせることで時間を計測しています。そのため正確な時間は計ることが出来ず、おおむね3分のタイマーになっています。
もし正確なタイマーが必要になった場合は、CPUでカウントするのではなく、I/Oポートにタイマー機能を追加するべきですね。
このプログラムにはイミディエイトデータによる減算命令が存在しますが、これは2の補数による加算命令のエイリアスです。
例えば以下の命令は
SUB A, 1 ; A-1
以下の命令に置き換えられます。
ADD A, 0xF ; A+0xF
詳しくは第1章第8節をご覧ください。