Minecraftの本格的なプロセッサ:どのように動作するのか、どのようにプログラムするのか、何のために使うのか?

Minecraftのサンドボックスでは、あらゆることができることを誰もが知っているでしょう。 Minecaftでは、さまざまなデジタル回路とプロセッサが長い間作成されてきました。 しかし、私が書いているプロセッサは実際にはユニークです! その名前はDjCPU8です。







なぜユニークなのですか? 多くの理由で。 順番に行きましょう:



1)スピード。 これはこれまでのところ、Minecraftでこのレベルの最速のプロセッサです。 1つの命令には約1秒かかります。

2)メモリの量。 RAMはすでに256バイトです。 このようなメモリ容量を持つ他のコンピューターは知りません。

3)計算能力。 42の指示。 算術、論理、スタック、入力/出力、レジスタなどで動作します。

4)アセンブラー。 他のプロセッサでは、プログラムをバイナリ形式で入力する必要があります。 ただし、DjCPU8では、テキストで入力できます。

5)シンプル。 他のコンピューターと簡単かつ快適に作業することは不可能です。

6)アプリケーションの幅。 I / Oポートはどこでも作成できます。







DjCPU8プロセッサの仕様:

1)ビット深度-8ビット。

2)フォンノイマンアーキテクチャ。

3)RAM 256バイト。

4)時計なし。 平均操作時間は1秒です。

5)データスタック-9バイト。

6)2つの汎用レジスタ(RON)。

7)42の指示。

8)エラーシステム。

9)1つのユーザー入力。

10)16個の出力ポート。

11)アセンブラー。



プロセッサの解剖学

この図は、プロセッサー内の機能ブロックを異なる色で示しています。







-RAM

-制御装置(UU)

-RAMリーダー/ライター

-命令の読み取り、そのデコード、および必要なレジスタのゼロ化のための信号供給デバイス。

-出力ポートへの出力

-物理的に実装されたアセンブラー

-スタック

-エラー検出システム

-さまざまなコンピューティングおよび変換ユニット。



そして、いくつかの小さなブロックがあります。



彼はどのように働いていますか



あなたを退屈させないために、このサブタイトルは非常に短くなります。



DjCPU8のアーキテクチャはFonneimannであるため、命令とデータが同じメモリにあることは明らかです。 プロセッサを起動すると、すべてのレジスタとスタックが完全にリセットされます。 次に、信号供給デバイス(青色で強調表示)が信号を送信して、RAMからデータを読み取ります。 結果の数値は命令として解釈されます。 この番号は制御ユニット(黄色)に送られ、そこで命令が実行されます。



loadステートメントを例に取りましょう。 この命令は、メモリから数値を読み取り、それをレジスタAに格納します。したがって、最初にメモリから数値3を読み取り、数値3を制御ユニットに供給します。 UUはこの番号をデコードし、これがロード命令であることを理解します。 次に、UEは指定された一連のアクションの実行を開始します。 最初に、プログラムカウンターのレジスタの値が1増加します。次に、2番目の数値が読み取られ、アドレスとして解釈されます。 アドレスが4であると仮定します。その後、UEは3回目の読み取り信号を送信します。 番号はセル4から取得されます。この番号はレジスタAに配置されます。次の命令を読み取るための信号が与えられます。 すべて、指示は完了しました。 想像してみてください。1秒でプロセッサがメモリに3回アクセスすることに成功しました。



複雑な指示があり、簡単な指示があります。 命令が単純であればあるほど、命令はより速く実行されます。 ただし、平均速度は約1 Hzです。



それをプログラムする方法は?



すべての指示を説明する小さなラベルは次のとおりです。

0 停止 -CPU停止

1 load RAM-RAMから数値を読み取り、Aに配置します

2 loadC const-特定のconst番号をAに入れます

3 ストア RAM-AをRAMに保存します

4 rand -A(0..255)の乱数を生成します

5 RAMの追加-RAMから値Aに値を追加します

6 サブ RAM-RAMから値Aから値が減算されます

7 mult RAM-AにRAMの値を乗算します

8 div RAM-AをRAMの値で除算します

9 および RAM-ビット演算「AND」:RAMからのAおよび値

10 または RAM-ビットごとのOR演算:AおよびRAMからの値

11 not-ビット演算「NO」A

12 2x -Aを2で割る

13 x / 2 -Aに2を掛ける

14 RAMの比較 -F = A-RAM

15 ジャンプA-アドレスがAにあるセルへの無条件ジャンプ

16 del RAM-RAMのセルをクリアします

17 say-チャットに値Aを表示します

18 A-R1 -AからR1への転送

19 A-R2 -AからR2への転送

20 R1-A -R1からAへの転送

21 R2-A -R2からAへの転送

22 inc -Aを1増やす

12月23日-Aを1減らす

24 プッシュ -数値をAからスタックに移動します

25 pop-スタックからAに数値を移動します

26 pushC const-スタックにconstをポップします(Aはconstと等しくなります)

27 in -CPUは一時停止し、Aの読み取りポートから数値を読み取ります

28 out -Aからポートへの番号の転送

29 setPort const-ポート値をconstに設定

30 印刷 -ポート0に番号を送信します

31 ジャンプ const-constセルへの無条件ジャンプ

A constの場合 32 ジャンプ -A> 0の場合はconstセルに移動し、そうでない場合は次のセルに移動します

33 F constの場合ジャンプ -F≠0の場合、セルconstに移動し、そうでない場合は次のセルに移動

34 ジャンプFでない場合-F = 0の場合、constセルに移動し、そうでない場合は次のセルに移動します

35 storeR1 -Aの値をメモリのR1にあるアドレスに格納します

36 storeR2 -Aの値をメモリのR2にあるアドレスに格納します

37 loadR1 -AのアドレスR1に値をロードします

38 loadR2 -AのアドレスR2に値をロードする

39 incR1 -R1の値を増やします

40 decR1 -R1の値を減らします

41 incR2 -R2を増加

42 decR2 -R2の値を減らします




プログラム例:

loadC

123

言う





指示について。 それらには2つのタイプがあります-パラメーターありとパラメーターなし。 パラメータは、命令の次のセルにある必要があります。 たとえば、loadCはパラメータを持つ命令です。 次の123は、loadCの単なるパラメーターです。 loadCは何をしますか? この命令は数値を受け取り、レジスタAに格納します。したがって、プロセッサは数値123をロードしました。次に何をしますか? そして、彼はこの番号で何でもできます! たとえば、チャットで番号を表示します。 sayコマンドはまさにそれを行います。



次に、パラメーターについて説明します。 また、constとRAMの2つのタイプがあります。 constパラメーターは特定の数値です。 loadCコマンドには、特定の番号が必要です。 また、RAMパラメーターは既に興味深いものです。 これは単なる数字ではなく、数字を取得する必要がある場所の住所です。 だから:

ロード

123

言う

前のプログラムとは異なり、このプログラムはまったく異なる方法で動作します! ロード命令には、別のタイプのパラメーター-RAMがあります。 したがって、番号123はすでにアドレスです。 どうなるの? プロセッサは、数値123に満足する代わりに、メモリにクロールし、123で数値を取得します。 しかし、私たちはそこで何も書いていないので、彼はゼロになります。 このプログラムを実行すると、レジスタAはゼロになります。 いいですか



あなたは私のガイドからもっと学ぶでしょう。

そして、さらに便利なタブレットがあります。



なぜこのプロセッサを作成したのですか?

多くの人がこの質問をしていることに気付きました。 そして、彼らはそれを補完しさえします-「それはお金を稼ぐ方が良いでしょう」。



答えは簡単です-それは私に喜びを与えます。 PvPshitがDotaにあり、誰かがドローし、誰かがプログラムし、プロセッサを作成しているという事実に誰かが面白がっています。



これに加えて、プロセッサの作成中に、実際のプロセッサが実際にどのように機能するかを理解しました。



最後に、ビデオレビューをご紹介します。







よろしくお願いします!



All Articles