ミジンコによるNandGame攻略
目次
NandGameとは
NandGameはCPUアーキテクチャーを学べるゲームです。自作CPUに興味を持っている方に向いています。
最初はリレーでNANDゲートを構築し、それをベースとして徐々に複雑なデジタル回路を構成していきます。マシン語やアセンブリ言語の実装を経て、最終的にプロセッサーまで構築します。
インストール不要で、ブラウザーでアクセスするだけ遊べます。アカウントの作成も不要です。組んだ回路のセーブデータはブラウザーが保持していますので、再度アクセスした際には途中から再開できます。
「From NAND to Tetris – Building a Modern Computer From First Principles」プロジェクトにインスパイアされて開発されたとのことです。
NandGameの特徴
- 完全無料。
- これが強い。
- ブラウザーでアクセスするだけ。
- アカウントの作成、ソフトウェアのインストールなし。
- オートセーブ。
- 明示的にセーブして、別の回路を組んでから、先の回路をロードするということがやりにくい(実質的にできない)。
- 別マシン(あるいは別ブラウザー)とセーブデータを共有しにくい。
- 英語。
- 実装したマシン語やアセンブリー言語を用いたプログラミングに関するステージはほとんどない。
- 仕様の説明がたまに雑、不親切。特に後半の課題に、この問題が当てはまる。
Turing Completeとの比較
似たゲームとしてTuring Completeがありますが、比較すると次のような違いがあります。
NandGame | Turing Complete | |
---|---|---|
価格 | 無料 | 有料 |
環境 | OSに依存しない | Windows、MacOS |
ゲーム性 | 中 | 高 |
セーブ機能 | オートセーブ | Steamクラウドにセーブされ、OS別で共有可 1つの課題に複数の回路のセーブできる。 |
カスタムコンポーネント機能 | あり | あり ※Labステージ以降で使える。 |
サンドボックス機能 | なし | あり ※独自の回路を組んで楽しんだり、シミュレーターとして活用したりできる。 |
ボリューム | 中 | 大 |
デジタル回路のステージ | リレーを用いてNANDゲートを構成するステージからスタート。 最終的にマルチタスクをサポートするプロセッサーを作る。 | NANDゲートからスタート。 最終的に2つのCPUを作る。 |
アセンブリー言語のステージ | マシン語やアセンブリー言語の実装ステージはあるが、プログラミングステージはあまりない。 | プログラミングステージも豊富。 |
個人的にはTuring Completeのほうが楽しく遊べました。
各レベルの攻略記事
NandGameではステージをレベル(Level)と表現しています。それに習って、当サイトでも「レベル」という呼称を使うことにします。
NandGameで用意されているレベルは、Hardware、Software、Optional Levelsの3部構成になっています。
カテゴリー内のステージを全クリアした時点で次のカテゴリーにアクセスできます。
例えば、最初のHardwareをクリアするとSoftwareが表示され、SoftwareをクリアするとOptinal Levelsが表示されます。
ここで解説する内容は、2023年12月時点のNandGameになります。
NandGameがバージョンアップされ、レベルの内容が新しくなっていたり、新レベルが追加されていたりしてします。
そのため、解説記事とギャップが出てくる可能性があります。
Hardwareカテゴリー
No. | グループ | レベル名 |
---|---|---|
1.1.1 | Logic Gates | Nand |
1.1.2 | Logic Gates | Invert |
1.1.3 | Logic Gates | And |
1.1.4 | Logic Gates | Or |
1.1.5 | Logic Gates | Xor |
1.2.1 | Arithmetics | Half Adder |
1.2.2 | Arithmetics | Full Adder |
1.2.3 | Arithmetics | Multi-bit Adder |
1.2.4 | Arithmetics | Increment |
1.2.5 | Arithmetics | Subtraction |
1.2.6 | Arithmetics | Equal to Zero |
1.2.7 | Arithmetics | Less than Zero |
1.3.1 | Switching | Selector |
1.3.2 | Switching | Switch |
1.4.1 | Arithmetic Logic Unit | Logic Unit |
1.4.2 | Arithmetic Logic Unit | Arithmetic Unit |
1.4.3 | Arithmetic Logic Unit | ALU |
1.4.4 | Arithmetic Logic Unit | Condition |
1.5.1 | Memory | Latch |
1.5.2 | Memory | Data Flip-Flop |
1.5.3 | Memory | Register |
1.5.4 | Memory | Counter |
1.5.5 | Memory | RAM |
1.6.1 | Processor | Combined Memory |
1.6.2 | Processor | Instruction |
1.6.3 | Processor | Control Unit |
1.6.4 | Processor | Computer |
1.6.5 | Processor | Input and Output |
Softwareカテゴリー
No. | グループ | レベル名 |
---|---|---|
2.1.1 | Low level | Machine code |
2.1.2 | Low level | Assembler Language |
2.1.3 | Low level | Assembler program |
2.1.4 | Low level | Escape Labyrinth |
2.1.5 | Low level | Display |
2.1.6 | Low level | Network |
2.2.1 | Stack machine | Init stack |
2.2.2 | Stack machine | Push D |
2.2.3 | Stack machine | Pop D |
2.2.4 | Stack machine | Pop A |
2.2.5 | Stack machine | Push Value |
2.2.6 | Stack machine | Add |
2.2.7 | Stack machine | Sub |
2.2.8 | Stack machine | Neg |
2.2.9 | Stack machine | And |
2.2.10 | Stack machine | Or |
2.3.1 | High-level language | Tokenize |
2.3.2 | High-level language | Grammar |
2.3.3 | High-level language | Code generation |
2.4.1 | Conditionals | Eq |
2.4.2 | Conditionals | Gt |
2.4.3 | Conditionals | Lt |
2.4.4 | Conditionals | Not |
2.4.5 | Conditionals | Goto |
2.4.6 | Conditionals | If-goto |
2.5.1 | Memory | Push Memory |
2.5.2 | Memory | Pop Memory |
2.5.3 | Memory | Push Static |
2.5.4 | Memory | Pop Static |
2.6.1 | Functions | Call |
2.6.2 | Functions | Function |
2.6.3 | Functions | Return |
2.6.4 | Functions | Push argument |
2.6.5 | Functions | Pop argument |
2.6.6 | Functions | Push local |
2.6.7 | Functions | Pop local |
Optional Levelsカテゴリー
No. | グループ | レベル名 |
---|---|---|
3.1.1 | Transistor level | Nand (CMOS) |
3.1.2 | Transistor level | Invert (CMOS) |
3.1.3 | Transistor level | Nor (CMOS) |
3.2.1 | Logic | Xnor |
3.2.2 | Logic | Left Shift |
3.2.3 | Logic | Logical Right Shift |
3.2.4 | Logic | Artithmetic Right Shift ※"Arithmetic"のスペルミス? |
Logic | Barrel Shift Left | |
3.3.1 | Arithmetics | Max |
3.3.2 | Arithmetics | Multiplication |
3.4.1 | Floating point | Unpack floating-point value |
3.4.2 | Floating point | Floating-point multiplication ※3.4.9と同一名なので注意。 |
3.4.3 | Floating point | Normalize overflow |
3.4.4 | Floating point | Verity exponent |
3.4.5 | Floating point | Align significands |
3.4.6 | Floating point | Add signed magnitude |
3.4.7 | Floating point | Normalize underflow |
3.4.8 | Floating point | Pack floating-point value |
3.4.9 | Floating point | Floating-point multiplication ※なぜか3.4.2と同一レベル名。 |
3.4.10 | Floating point | Floating-point addition |
3.5.1 | Multitasking | Timer Trigger |
3.5.2 | Multitasking | Mode controller |
3.5.3 | Multitasking | Register with backup |
3.5.4 | Multitasking | Program Counter |
3.5.5 | Multitasking | Register bank |
3.5.6 | Multitasking | General-purpose Memory |
3.5.7 | Multitasking | Virtual Memory |
3.5.8 | Multitasking | Control Unit |
3.5.9 | Multitasking | Processor |
その他の情報
異なるPC(あるいはブラウザー)間でセーブデータを共有する
知っている方がいればXのDMでお知らせください。