# かんたんなCPUをNeosVRでつくったおはなし このHackMDは[Neosアドベントカレンダー2021](https://adventar.org/calendars/6249) の6日目の記事です。 昨日はtanossyさんの[私的Neosの楽しみ方](https://www.tanossy.com/%E7%A7%81%E7%9A%84neos-vr%E3%81%AE%E6%A5%BD%E3%81%97%E3%81%BF%E6%96%B9/)でした。 ## どうして > 今の時間は12月6日の午後23時です。 https://twitter.com/ciel_kka_vr/status/1467858755098660864 書くことが思いつかなかったので、20時ぐらいから死ぬ気で作りました。 ## つくったもの CPUとは言っていますが、3分タイマーぐらいしか作れないです。 パブリックフォルダのリンク `neosrec:///G-BinaryComputing/R-e7a452f7-23ee-42d7-81c6-048fcb8267ca` ![](https://i.imgur.com/q5yUplD.jpg) ## しくみ CPUがやってる事なんて結構単純です。 1. 命令を読み取る 2. 命令通り実行する 3. 1に戻る これだけです。単純ですね。 個別にパーツを紹介します。 ### ROM これはプログラムを保存するためのメモリROM(Read Only Memory)です。 ここに上から順番に命令を書いていきます。マルチプレクサを使用して、行数を選択して命令を1行ずつ取り出せるようにしています。 左側のStringが命令、右側のIntが必要であれば使われる引数(即値)です。 ![](https://i.imgur.com/eaBZ835.jpg) ### プログラムカウンタ これは`1. 命令を読み取る`ために重要なパーツです。CPUの命令デコーダに対してどの命令をROMから読みだして伝えるために、読みだす行を記憶しておくパーツです。 基本的に命令は上から順番に実行されるので、一定時間おきに行数カウントに1を足します。これに加えて、繰り返し命令を伝えたい時のために、行数カウントを割り込みで変更することができる機能も付けてあります。 ![](https://i.imgur.com/w9sfV5v.jpg) ### 命令デコーダ 命令デコーダは、プログラムカウンタでROMから読みだされた命令を読み取って、どのロジックを動作させるかを判別するパーツです。Ifがたくさん並んでいる通り、命令にあったInPulseを作成します。 ![](https://i.imgur.com/4d6V1BP.jpg) ### レジスタ レジスタは、CPUが使う変数です。ここに、計算するためのデータを入れます。 例えば、タイマーを作る際は1つのレジスタはカウントように使われます。 今回は3つのレジスタ(A,B,C)を用意しました。 ### 命令の実装 命令の実装は、命令デコーダからInPulseが来たら、何かをするロジックを書けばOKです。 足し算ならレジスタを読みだして、書き込むというロジックを書きます。 ![](https://i.imgur.com/qWpT4RT.jpg) 今回は超シンプルな命令しかありませんが、例えば - 音を再生する - オブジェクトをスポーンする - GETリクエストをしてレジスタに結果を入れる などを命令デコーダに加えて実装すれば、簡単に命令を増やすことができます。 ## (だいたい)15秒タイマー こんな感じで、JMPを繰り返しに使うことで、タイマーを作ることができました。 https://youtu.be/0KJyJnL9maQ