td4
TD4は、書籍「CPUの創りかた」で題材となっているCPUである。
TD4は、4ビットの入力ポート1個と、4ビットの出力ポート1個を持つ。
TD4は、以下のレジスタを持つ。
MikeAssemblerでは、以下の命令をサポートしている。
命令およびレジスタ名の大文字・小文字は区別しない。
Imは、4ビットの即値である。
通常の式による表現に加え、0101のように0/1を4個並べた2進数での表現が可能である。
即値は、機械語のmmmmの部分に反映される。
| 命令 | 機械語 (ビット列) | 動作 | 実行後のC (フラグ) |
|---|---|---|---|
ADD A, Im | 0000 mmmm | A ← A + Im | キャリー |
ADD B, Im | 0101 mmmm | B ← B + Im | キャリー |
MOV A, Im | 0011 mmmm | A ← Im | 0 |
MOV B, Im | 0111 mmmm | B ← Im | 0 |
MOV A, B | 0001 0000 | A ← B | 0 |
MOV B, A | 0100 0000 | B ← A | 0 |
IN A | 0010 0000 | A ← 入力ポート | 0 |
IN B | 0110 0000 | B ← 入力ポート | 0 |
OUT Im | 1011 mmmm | 出力ポート ← Im | 0 |
OUT B | 1001 0000 | 出力ポート ← B | 0 |
JMP Im | 1111 mmmm | PC ← Im | 0 |
JNC Im | 1110 mmmm | if (C == 0) PC ← Im | 0 |
JNC命令は必ず加算命令(ADD)の直後に実行しなければならないとされているが、MikeAssemblerではチェックを行わない。
なお、レジスタAの値を出力ポートに出力する命令は、TD4では定義されていない。
MOV命令の第2オペランド、およびOUT命令の第1オペランドにおけるa、A、b、Bは、レジスタとして扱われる。
(OUT A 命令は定義されていないため、エラーになる)
これらの場所でこれらを識別子として用いたい場合は、+bなどのようにすると良い。