CPU

Jeans & Development 電子ブロック工房 三日坊主 フロントページ

1 bit CPU [CPU]

2007年7月18日

1 bit のアキュムレータでも、CPU として機能する設計が出来そうだ。これを採用するかどうかは分からないけれど、とりあえずメモ。

1 bit registers and flags: a0, a1, z, c
6 bit registers: b, ip, cs, ip', cs', dp, ds, sp

レジスタは、1ビットのアキュムレータが、a0 と a1 の2つ。フラグは例によって、キャリーとゼロの2つ。メモリ読み書き用の b レジスタが6ビットである。メモリ空間は、1ワードが6ビットで、アドレスラインが12ビット。4096ワードで、これは24kビットの3kバイトに相当する。

6ビットのbレジスタは機能として、インクリメント・デクリメント・右ローテート及びメモリへの読み書きだけなので、アキュムレータとは言いがたい。

1ビットの a0, a1レジスタには、加算・減算・ビット演算機能を持たせた。演算は、a0, a1 レジスタ経由で、1ビットずつ行う。

インデックスポインタ(ip)、データポインタ(dp)、スタックポインタ(sp)は6ビットである。インデックスポインタとデータポインタはそれぞれ、コードセグメント(cs)、データセグメント(ds)と共に用いる。スタックのセグメントは固定の仕様。64ワードのスタック領域が使えるので、十分だろう。dpとspは、インクリメント・デクリメントの両方が、ip はインクリメントが出来る。

ip と cs には、もう一つのペア(ip', cs')があり、ジャンプ命令やユーザー定義命令の際に、ip と cs のコピーがこれらのレジスタに渡される。インクリメントが可能で、メモリ内容をbレジスタに渡すことが可能。

なお、ゼロフラグは、インクリメント・デクリメントのときのみ影響を受ける仕様。

ニーモニックの052-056と060-077の部分はユーザ定義命令で、ジャンプ命令などもここに含まれている。アドレスの00020-00277の部分に、これら用のプログラムを書き込む。00300-00377の部分も、ユーザ定義命令のサブルーチンとして使用予定なので、実際にプログラムが書き込めるのは00400-00677 の部分だけである(容量が足りないか?)。00700-00777にはRAMを持たせて、データの保持及びスタック領域に用いる。

4 bit CPU [CPU]

2007年7月16日

少し思うところあって、4ビットのCPUの設計を検討することにする。理由は、

1)当然ながら8ビットから4ビットに落とすことによって、回路を約半分の大きさに出来ること。
2)ローテート命令をCPUに持たせることにより、加算・減算ルーチンが容易に組めることに気が付いたこと(6502 ではシフト命令がなくて、ローテート命令だけがあることを知った)。

仕様としては4ビットだが、複合命令として8ビットの加算・減算に対応しており、それほどはプログラミングが煩雑にならない様子。ただし、当然ながら、8ビットから4ビットに変更することで、スピードは落ちるはず。

思い切って1ビットのCPUというのも考えたが、この場合はメモリへの読み書きに難が出る。1ビットCPUの設計がうまく出来れば、トランジスタコンピューターの完成も近くなりそうだけれど。

ニーモニック表を更新 [CPU]

2007年6月24日

ニーモニック表を更新した。主な変更点:

1)複合命令を追加・更新した。
2)sub a2,a2 を廃止し、ここに mov x,[ip++] という、複合命令用の命令を割り当てた。これにより、複合命令を用いて、マルチバイトの命令を実行することが可能になった(mov a1,XXh など)。

メモリアクセス機能を追加 [CPU]

2007年6月23日

ニーモニック表を更新。

1)[b1], [b2] へのアクセスだけでは無理がありそうなので、[b1+1], [b1+2], [b1+3], [b2-1], [b2-2], [b2-3] へも、x レジスタから読み書きできるようにした。従来の mov x,[b1] は、mov xl, [b1]l へと変更したので、selector 周りのコードも少しすっきりした。

2)push b2, push ss を廃止し、代わりに push x, push f とした。

他に、気のついたところ:

1)cmp 命令が欲しい。
2)sub a2,a2 は不要なので、ここに何かの命令を割り当てられそう(sub a1,a1 は、x レジスタの値をゼロにするのに有用)。
3)ローテート命令を複合命令として実装すれば、便利。
4)シフト命令は、shr a1 と shl a2 の二つにし、shr a2 と shl a1 は複合命令を用いて記述するようにするかもしれない。
5)複合命令用に、inc cs:ip, dec cs:ip があれば、便利かもしれない。

ニーモニック表 [CPU]

2007年6月17日

ニーモニック表を少し書き換えた。まず、Zレジスタという名前がZeroフラグと似ていて紛らわしいので、Xレジスタとした。また、一部順序を変えて、回路がより簡潔になるようにした。

CPUのスペック案2 [CPU]

2007年4月30日

 モトローラ型で設計すると、手作りのCPUとしては現実的な構造になることが分かった。

メモリ空間は、1ワード8ビットでアドレス16ビットの、合計65536バイト。

レジスタはすべて8ビット:

A1レジスタ 演算用
A2レジスタ 演算用
B1レジスタ メモリアクセス用
B2レジスタ スタック用
Z レジスタ 各種代入・演算結果保持・ジャンプ用
IPレジスタ 実行位置
CSレジスタ 実行セグメント指定
DSレジスタ データセグメント指定
SSレジスタ スタックセグメント指定

フラグ(FLレジスタ)は、ゼロフラグ(Z)およびキャリーフラグ(C)の二つ。

クロック信号と各種イベントのタイミング:
clock 1   clock 2   events
-----------------------------------------------------------------
   0         0      decrement b2 register (for push)
                    prepare environment for reading command
   1         0      read command from memory
   0         1      prepare environment for command
                    increment IP
                    increment b2 register (for pop)
   1         1      do the command
注)clock2が0の時はCS:IPがアドレスラインに、1の時はDS:B1もしくはSS:B2がアドレスラインに接続される。

ニーモニック表 案2 [CPU]

2007年4月28日

代入命令について、すべてZレジスタを介するようにしてみた。

ニーモニック表 [CPU]

2007年4月27日

演算命令
INC A
DEC A
INC B
DEC B
INC C
DEC C
COMP A,D
ADD A,D (結果は、Zレジスタに入る)
NOT A (結果は、Zレジスタに入る)
NOT D (結果は、Zレジスタに入る)
AND A,D (結果は、Zレジスタに入る)
OR A,D (結果は、Zレジスタに入る)
SHL A (上位ビットにCF2を使いシフト。下位ビットはCF1へ)
SHR A (下位ビットにCF2を使いシフト。上位ビットはCF1へ)

ジャンプ命令
JMP (ジャンプ先は、Jレジスタの値)
JZ (ジャンプ先は、Jレジスタの値)
JNZ (ジャンプ先は、Jレジスタの値)
JC (ジャンプ先は、Jレジスタの値)
JNC (ジャンプ先は、Jレジスタの値)
LOOP(ジャンプ先は、Jレジスタの値)
JMPF(MOV CS,Z 及び MOV IP,J)

CPUのスペック案 [CPU]

2007年4月27日

レジスタは8ビット、メモリ空間の1ワードは4ビットの変則型にしようと思う。メモリ空間は、16ビットのアドレス指定で64Kワード(32Kビット)。CS・DSを用いたセグメント指定により、256ワードごとに空間を分割して使用する。

Aレジスタ(8ビット) - 演算用
 上位4ビット:AHレジスタ
 下位4ビット:ALレジスタ

Bレジスタ(8ビット) - メモリアドレス指定用
 上位4ビット:BHレジスタ
 下位4ビット:BLレジスタ

Cレジスタ(8ビット) - カウンタ
 上位4ビット:CHレジスタ
 下位4ビット:CLレジスタ

Dレジスタ(8ビット) - 演算補助
 上位4ビット:DHレジスタ
 下位4ビット:DLレジスタ

Jレジスタ(8ビット) - ジャンプ先指定

Zレジスタ(8ビット) - 代入および演算結果格納
 上位4ビット:ZHレジスタ
 下位4ビット:ZLレジスタ

Fレジスタ(4ビット) - フラグ格納用
 CF1(キャリーフラグ)
 CF2(シフト・ローテート用フラグ)???
 ゼロフラグはない(Zレジスタがゼロフラグを兼ねる)
 サインフラグはない(Zレジスタ上位1ビットがサインフラグを兼ねる)

IP(8ビット) - 命令実行位置

CS(8ビット) - コードセグメント

DS(8ビット) - データセグメント

最初の設計では、インテル型にしてみた。スタックの実装は、とりあえず先送りにする。
   後の記事>>