Opcodes【Turing Complete編】
はじめに
いつもブログをご覧いただきありがとうございます。
コーストFIRE中のIPUSIRONです😀
Opcodesステージ
Opcodesステージのゴールは以下のオペコードをREGアーキテクチャーに追加することです。
直前のステージで作成したREGアーキテクチャーはオペコードがADD固定でしたが、ここから6種類のオペコードをサポートすることになります。
オペコードを識別するバイトデータ | オペコード |
---|---|
0 | ADD |
1 | SUB |
2 | AND |
3 | OR |
4 | NOT |
5 | XOR |
ただし、NOTについては、第2引数は無視するものとします。第1引数を反転させて、その結果を(4番目のバイトデータで指定する)送信先に送ります。
Opcodesステージを解く
1:REGアーキテクチャーの回路を開く
キャンバスには昔作ったCPUの回路が表示されているかもしれません。
そうであれば、直前のWre Spaghettiステージで作成したREGアーキテクチャーの回路を呼び出します。
ここでは、Equalコンポーネントを使った回路をベースにします。
2:回路の設計方針を検討する
オペコードを識別するバイトデータはProgramコンポーネントのOutput 1ピンから送出されてきます。現状まだ未実装で何もつながっていません。Output 1ピン以降を作成するのが本ステージの目的になります。
すでにADDの処理だけは実装されていますが、これに沿う形で縦にオペコードの処理を実現するコアとなるコンポーネントを並べます。
・ADD⇒従来通り。
・SUB⇒減算器がないので、加算器(Addコンポーネント)を使う。加算器で減算を実現するには、補数の概念を使う。
具体的にいうと、減数は2番目のバイトデータ、被減数は3番目のバイトデータになるので、AddコンポーネントのInput 2ピンの直前にNEG回路を置きます。
※NOT回路ではなくNEG回路を置くことに注意してください。
・AND⇒8 Bit ANDコンポーネントを使うだけ。
・OR⇒8 Bit ORコンポーネントを使うだけ。
・NOT⇒8 Bit NOTコンポーネントを使うだけ。
・XOR⇒8 Bit XORコンポーネントを使うだけ。
基本的な仕組みは、左側のワイヤリングと同様です。
第1引数と第2引数に対して、サポートした全演算をしておきます。1バイト目で指定されたオペコードに対応するバイトデータを見て、流すべき計算結果を確定し、そのワイヤーのスイッチをONにして流すようにします。
3:回路を実装する
以上を踏まえて回路を組むと次のようになります。
4:テストする
テストにパスすると、ステージクリアになります。