めざせ4004! IC24個で電卓用CPUを作ってみた: Chapter 2 RAM容量拡大の方針
TD4EX4のRAM容量を拡大するにあたり、まずベースとなるTD4EX4の仕様をおさらいしましょう。表2に命令コードを示します。
【※注】 前作でのMOV命令の表記が分かりにくかったのでLD命令とST命令に変更しました。
| 命令 | 1バイト目 | 2バイト目 | キャリー フラグ |
説明 | |
|---|---|---|---|---|---|
| bit 7~4 | bit 3~0 | ||||
| ADD A, [Adr] | 0000 | Adr | (無し) | ※1 | 指定アドレスのRAMの値をAレジスタに加算 |
| ADD B, [Adr] | 0001 | Adr | ※1 | 指定アドレスのRAMの値をBレジスタに加算 | |
| ADD A, Im | 0010 | Im | ※1 | 定数(Im)をAレジスタに加算 | |
| ADD B, Im | 0011 | Im | ※1 | 定数(Im)をBレジスタに加算 | |
| LD A, [Adr] | 0100 | Adr | - | 指定アドレスのRAMの値をAレジスタに格納 | |
| LD B, [Adr] | 0101 | Adr | - | 指定アドレスのRAMの値をBレジスタに格納 | |
| LD A, Im | 0110 | Im | - | 定数(Im)をAレジスタに格納 | |
| LD B, Im | 0111 | Im | - | 定数(Im)をBレジスタに格納 | |
| SUB A, [Adr] | 1000 | Adr | ※2 | 指定アドレスのRAMの値をAレジスタから減算 | |
| SUB B, [Adr] | 1001 | Adr | ※2 | 指定アドレスのRAMの値をBレジスタから減算 | |
| ST [Adr], A | 1010 | Adr | - | Aレジスタの値を指定アドレスのRAMに格納 | |
| ST [Adr], B | 1011 | Adr | - | Bレジスタの値を指定アドレスのRAMに格納 | |
| JNC Im | 1110 | ROM Adr | - | キャリーがゼロなら指定アドレス(Im)にジャンプ | |
| JMP Im | 1111 | ROM Adr | - | 指定アドレス(Im)にジャンプ | |
TD4EX4は最大16語のRAMをサポートしているので、RAMのアドレス指定は4ビットで行います。表2ではこれを [Adr] と表記しており、実際のアドレスは命令1バイト目の下位4ビットで指定します。RAMの容量を256語に拡大するためには、このアドレス指定のビット数を8ビットに増やす必要がありますが、命令の1バイト目にはそのようなスペースはありませんので、必然的に2バイト命令にする事になります。
表2を見るとRAMへのアクセスを行う命令は8個あります。つまり14個ある命令のうち 半分以上を占めています。これを2バイト命令にすると、元から2バイト命令だったジャンプ命令2個も含めて計10個が2バイト命令となり、残りの4個が1バイト命令となります。 ここまで2バイト命令が増えてしまうと、いっそのこと可変長命令を止めて、全ての命令を2バイト化した方が良いでしょう。コード効率は悪化しますが、命令長の判定回路を省略できますので、使用IC数を減らせる筈です。