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

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

2019/4/14
技術書典6
池袋サンシャインシティ 文化会館ビル2F 展示ホールD「う11」

第2章 第4節 プログラムカウンタへの書き込みの制御

TD4EX4のジャンプ命令はTD4EX2と全く同じです。他の信号との兼ね合いもあるため回路は多少異なりますが、仕様は全く同じです。

簡単に説明すると、最大4KBのROMをサポートするためにジャンプ命令を2バイト命令化しています。この2バイト命令の制御にはフリップフロップである74HC74を使用していますが、これは元々TD4に存在していたICです。TDHC74には2個のフリップフロップが内蔵されていますがTD4ではキャリーフラグにしか使っていないため、片方が残っています。それを2バイト命令の制御に使うわけです。

このジャンプ命令用のフリップフロップは通常は1になっているのですが、ジャンプ命令の1バイト目を読み込むと0になり、その間は命令の実行を延期するようになっています。

この状態は命令の2バイト目を読み込むまで続き、フリップフロップが1に戻ると同時に命令実行が再開され、ジャンプ命令が実行されます。

実際にジャンプを行うかどうかは命令によって異なります。JMP命令の場合は常にジャンプしますが、JNC命令の場合にはキャリーフラグが0の場合だけジャンプします。

ジャンプする場合には命令の1バイト目のbit0~3をプログラムカウンタのbit0~3に読み込み、同時に命令の2バイト目全体をプログラムカウンタのbit4~11に読み込みます。図7に示すように、命令の1バイト目と2バイト目ではプログラムカウンタに到達するまでの経路が異なりますが、プログラムカウンタへの書き込みは命令の2バイト目を読み込んだ時点で同時に行います。

図7 プログラムカウンタへの書き込みデータの流れ
図7 プログラムカウンタへの書き込みデータの流れ

前出のジャンプ命令用フリップフロップは図7では省略していますが、このフロップフロップは命令デコーダーからのジャンプ命令信号を受け取り、図中の各ICの制御を行っています。論理式を数式7に示します。

数式7 ジャンプ命令の各種制御信号
フロップフロップのD入力 = NOT (bit7 AND bit6 AND bit5)
命令ラッチのLE入力 = フリップフロップのQ出力
プログラムカウンタのLD入力 = NOT((bit4 OR CARRY) ANDフリップフロップのQ出力)

この数式で重要なのは命令デコーダーとプログラムカウンタが直接接続されていない点です。

ジャンプ命令の判別は命令の上位3ビットが全て1かどうかで行います。ジャンプ命令を読み込むと、命令デコーダーはフリップフロップのD入力を0にしますが、この信号はプログラムカウンタには接続されていません。

では、プログラムカウンタがどこに接続されているのかと言うと、フリップフロップの出力に接続されています。D入力が0になったことでフリップフロップのQ出力も0になりますが、この状態の間はジャンプ命令の実行が延期されるようになっており、その間に命令の2バイト目を読み込みます。

Q出力は次のクロックで1に戻りますが、この時点でジャンプ命令が実行されます。

なお、JNC命令ではキャリーが0の時にしかジャンプを行いませんが、これはCARRYの反転信号であるCARRYと命令コードのbit4とのORを取ることで実現しています。これはTD4と同じです。