当サイトの一部ページには、アフィリエイト・アドセンス・アソシエイト・プロモーション広告を掲載しています。

Amazonのアソシエイトとして、Security Akademeiaは適格販売により収入を得ています。

広告配信等の詳細については、プライバシーポリシーページに掲載しています。

消費者庁が、2023年10月1日から施行する景品表示法の規制対象(通称:ステマ規制)にならないよう、配慮して記事を作成しています。もし問題のある表現がありましたら、問い合わせページよりご連絡ください。

参考:令和5年10月1日からステルスマーケティングは景品表示法違反となります。 | 消費者庁

Opcodes【Turing Complete編】

はじめに

いつもブログをご覧いただきありがとうございます。

FIRE生活中のIPUSIRONです😀

IPUSIRONのプロフィールを見る

Opcodesステージ

Opcodesステージのゴールは以下のオペコードをREGアーキテクチャーに追加することです。

直前のステージで作成したREGアーキテクチャーはオペコードがADD固定でしたが、ここから6種類のオペコードをサポートすることになります。

オペコードを識別するバイトデータオペコード
0ADD
1SUB
2AND
3OR
4NOT
5XOR
オペコード一覧

ただし、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:テストする

テストにパスすると、ステージクリアになります。