Easy CPU Maker -簡単 CPU 作成ツール
作成ツールツール自由部門 登録番号：２００１５

時代の時代の逆先端を逆先端を行け！！
メリット・デメリット
見栄えが良い処理速度が速い・扱えるデータ量が多い
内部構造が複雑で簡単には理解できない

最先端
最先端
Java, C#
3D
Windows Vista
64bit
GPU
PlayStation3
HD-DVD, Blue Ray

逆先端
アセンブラ
2D
MS-DOS
16bit
CPU
スーパーファミコン
フロッピーディスク

メリット・デメリット
懐かしい
処理速度が遅い・扱えるデータ量が少ない
内部構造が単純で理解し易い。

現代の流行であるデータベース・Web2.0・オブジェクト指向・Java・PHP・ネットワーク・3D などから離れ、現在ではすっかり忘れ去られた感のある CPU を簡単に作成できるツールを製作することが私たちの目的である。

なぜ、なぜ、今の時代に時代に CPU なのか？
なのか？
近年のコンピュータの発展には目ざましいものがある。
しかし、コンピュータが高機能になればなるほど、内部はブラックボックスと化し、コンピュータの頭脳である CPU を知らない人たちも増えてきている。
私達は、この状況に危機感を持った。
このままでは、「コンピュータに使われてしまう」。
この状況を改善するためには、昔に戻らなければならない。
すなわち、CPU をいじりながら、CPU を理解すること、それが現在の私達には必要になっているのである。
私達は、とても簡単な CPU を設計し、それを用いて学習することも考えた。
しかし、本当に CPU を理解するためには、「CPU を作ってしまう」ことが一番である。
一度 CPU を作ってみれば、CPU の単純さが良く分かるはずだ。
私達は、そのように考え、遂に「EasyEasy CPU Maker」の企画が出来上がったのである。
Maker

対象者
・高校生以上・CASL程度のCPUやアセンブリ言語の知識がある人
このソフトの対象者はできるだけ広くしたい。しかし、CPUの設計には、どうしてもCPUやアセンブリ言語の知識がある程度必要となる。
よって、C言語などのプログラミング言語やCPUを勉強したことのある人、もしくは高校生以上を対象に設定する。

このソフト
このソフトでソフトで何ができるか？
ができるか？
・個性的なオリジナルCPUの設計・アセンブリ言語やCPUの学習・シュミレータのないマイナーCPUの再現
簡単にCPUを設計できる。本物のCPUを設計する際とは違い、内部実装を考える必要がないため、アイデア次第で個性的なCPUを作ることができる。そして、設計したCPU情報を基にして、アセンブラ・仮想マシンを実行でき、自分で作成したアセンブラプログラムを読み込ませて自由に遊ぶことができる。
また、どうしたら処理が早くなるか、こんな設定にしたらどうなるかなど、色々実験することができる。
さらに、アセンブリ言語やCPUに触れるのだから、当然勉強にもなる。
このソフトで作った CPU は、２つとして存在しないため、シュミレータがない。自分しか知らない、そんな世界を再現することもできる。

EasyCPUMaker
Maker の内部構造
Easy
Easy CPU Maker は大きく分けて、３つのファイルに分かれている。
Easy CPU Maker……GUIMaker
で操作する仮想 CPU 設計ツール。（メインプログラム）
Virtual Assembler……Easy
CPU Maker によって定義された情報をもとにプログラムをアセンブルするツール。
Assembler
General Virtual Machine……EasyCPU Maker によって定義された情報をもとにマシン語プログラムを実行するツール。
Machine
３つのファイルが連携しあうことで、「CPU の設計」「アセンブラの作成」「プログラムの実行」という３つの大きなプロセスを実現しているのである。

１．EasyCPUMaker
Maker
Easy
このプログラムは「CPU の設計」を行う。
まず、ウィザード形式で CPU の重要部分の設計を行い、レジスタやメモリなどを定義しておく。その後、CPU の命令を定義し、それらの情報をファイルに保存する。
ここで保存したデータは「VirtualVirtual Assembler」や「GeneralAssembler
General Virtual Machine」にて使用される。
Machine
このプログラムは内部にて「VirtualVirtual Assembler」や「GeneralGeneral Virtual Machine」を呼び出し、アセンブラプログラムの実行環境にもなる。
Assembler
Machine２．Virtual Assembler
このプログラムは「Easy
Easy CPU Maker
Maker」にて定義された情報を基に、渡されたアセンブラファイルをアセンブルする。ある程度の汎用性はer犠牲になるが、CPU さえ定義してしまえばアセンブルができるので、自分でアセンブラを作るより、かなり楽になる。

３．General Virtual Machine
このプログラムは「VirtualVirtual Assembler」によってアセンブルされたマシン語プログラムを実行する。「Virtual
Virtual Assembler」を用いないでも、Assembler
Assembler
アセンブラを自作してしまえば実行させることもできる。「Easy
Easy CPU Maker」によって定義された命令は、一度中間言語に翻訳される。
Maker
そして、その命令が出てきたら、バーチャルマシンは命令に対応付けられた中間言語を実行する。これによって、一度定義さえしてしまえば、複雑な命令もバーチャルマシン上で実行できる。

CPU の作成例：
作成例：
この様な CPU を作ってみることにする。

CPU 名「easy」
easy」

CPU の構成
レジスタはアキュムレータ１個。ＮＯＰ、ＨＬＴ以外の命令は全て２バイトであり、各命令はＯＰコード１バイト、オペランド１バイトで構成される。

ＯＰコード
ＯＰコード０１２３４５

ニーモニックＮＯＰ
ＬＤ
ＳＴ
ＡＤＤ
ＳＵＢ
ＳＨＬ

オペランド

６

ＳＨＲ

数字

７８
９１０
１１
１２

ＪＭＰ
ＪＺ
ＪＮＺ
ＪＭＩ
ＪＰ
ＣＭＰ

アドレス
アドレス
アドレス
アドレス
アドレス
アドレス

１３

ＨＬＴ

アドレス
アドレス
アドレス
アドレス
アドレス
数字

説明
何もしない
レジスタ←
レジスタ←メモリのメモリの内容
メモリのメモリの内容←
内容←レジスタ
レジスタ←
レジスタ←レジスタ＋レジスタ＋メモリのメモリの内容
レジスタ←
レジスタ←レジスタ－レジスタ－メモリのメモリの内容
レジスタのレジスタの内容を内容を指定しただけ指定しただけ左しただけ左シフトする
シフトする
ただし、ただし、数字＜＝数字＜＝８＜＝８である
ＳＨＬのＳＨＬの右シフト版シフト版。
ＳＨＬとＳＨＬとＳＨＲはＳＨＲは単純な単純な論理シフト論理シフトであるシフトである。
である。
指定した指定したアドレス
したアドレスにアドレスにジャンプする
ジャンプするゼロフラグがゼロフラグが立ったときジャンプったときジャンプゼロフラグがゼロフラグが立たないときジャンプたないときジャンプ
サインフラグがサインフラグが立ったときジャンプったときジャンプ
サインフラグがサインフラグが立たないときジャンプたないときジャンプ
アドレスのアドレスの内容と内容とレジスタをレジスタを比較して比較してフラグをフラグをセット実行停止

フラグレジスタのフラグレジスタの定義
７６５

４

３

２

１
Ｓ０Ｚ

０ビット目：ゼロフラグ
１ビット目：サインフラグ

アセンブラのアセンブラの書式：
書式：
ラベル：
ラベル：

命令

オペランド

CPU の仕様が決まったら、「EasyEasy CPU Maker」を用いて、CPU の定義を行う。
Maker
１．CPU 名の決定

この場合は“easy”とする。

２．レジスタのレジスタの定義

この場合は汎用レジスタ１個のみを定義する。

３．メモリ長
メモリ長の定義

今回は８ビットしか使えないので、８ビットとする。

４．ＯＰコード．ＯＰコード長
コード長の定義

今回は簡単にするため８ビットとする。

５．アセンブラ定義
アセンブラ定義

今回は省略する。

つぎに、つぎに、命令の命令の定義を定義を行う。
今回は種類が多いので省略するが、一つだけ定義例を示す。

例：LD
ld reg, &1// これはレジスタ
これはレジスタにレジスタに第一オペランドアドレス
第一オペランドアドレスのオペランドアドレスの内容を内容を// 代入することを代入することを意味することを意味する意味する。
する。

このように、一つの命令は複数の基本命令からなり、この基本命令を実行していくことで VM は動作をしている。「EasyEasy CPU Maker」内部では、このように命令
Makerを基本命令の列で管理しているが、ソフトでは、GUI 上で分かりやすく編集が可能になっている。
CPU と命令の定義が終わったら、アセンブラプログラムを「VirtualVirtual Assembler」に渡し、アセンブルする。
Assembler

アセンブラプログラム例
アセンブラプログラム例：
アドレス
０２４
６８
１０
１２
１４
１６１７
１８
１９２０

ＬＯＯＰ：

ＯＮＥ
Ｎ
ＳＵＭ
ＺＥＲＯ

ＬＤ Ｎ
ＡＤＤ ＳＵＭ
ＳＴ ＳＵＭＬＤ Ｎ
ＳＵＢ ＯＮＥＳＴ Ｎ
ＣＭＰ ＺＥＲＯＪＮＺ ＬＯＯＰＨＬＴ
ＤＣ １ＤＳ １（１０）１０）
ＤＳ １（０）ＤＣ ０

アセンブル後アセンブル後：01 12 03 13 02 13 01 12 04 11 02
12 0C 14 09 00 0D 01 0A 00 00

後は、アセンブル後のマシン語プログラムを「GeneralGeneral Virtual Machine」で実行すれば良い。
Machine
このプログラムの場合、実行すると１９番地の変数ＳＵＭが５５（０ｘ３７）になっているはずである。

実行環境
Windows 98/NT/2000/XP

開発環境
Microsoft Visual C++ 6.0
Microsoft Visual C++ .Net 2003
Microsoft Visual C++ 2005