CPU

6 bit CPU

2007年7月27日

ばかげた 1 bit CPU を考えていて気が付いたのは、6ビットCPUが結構シンプルに設計できそうなこと。先日のクロック周りの回路の設計から来る考察をくわえて、さらにシンプルなCPUが出来そうな気配。

今考えているのは、6ビットのレジスタとして、

a: アキュムレータ
b: メモリ指定用レジスタ
ds: データセグメント
ip: インデックスポインタ(プログラムカウンタ)
cs: コードセグメント
sp: スタックポインタ

の6つを用意。アドレス空間は、12ビットのアドレスラインで4096ワード(3072ビット)。簡単なプログラムなら、これくらいの要領があればおそらく十分。このあたり、4ビットではなくて6ビットにしたのが味噌で、2ワードのアドレスラインで必要最小限と思われるメモリ領域にアクセスできる。4ビットなら、3ワード必要だろう。74174という6ビットのフリップフロップがあるのも、良い。1つのセグメントが64ワードだから、そこそこの大きさのプログラムがここに収まる。4ビットの考え方だと16ワードで、小さなプログラムしかかけない。ジャンプ命令の仕様で難が出る。

スタックセグメントは、6502に習って省略した。従って、スタック領域は64ワードのみ。フラグは、例によってキャリーとゼロの2つだけである。

ニーモニック表
/* 000-007 */
nop (a<->a)
a<->b
a<->ds
a<->f
a<->sp
???
a=[b]
[b]=a

/* 010-017 */
a=a&[b]
a++ (a=a+1)
a=a+[b]+c
rol a (a=a+a+c)
a=a|[b]
a-- (a=a-1)
a=a-[b]-c
a=a!

/* 020-027 */
push a
push b
push ds
push f
sp--
call 000xx
call 0xx
call 0xxxx

/* 030-037 */
pop a
pop b
pop ds
pop f
sp++
ret
jmp 0xx
jmp 0xxxx

/* 040-047 */
z=0
c=0
z=1
c=1
???
b=0xx
a=0xx
???

/* 050-057 */
if nz
if nc
if z
if c
???
???
???
???

/* 060-077 */
reserved

複合命令という概念は廃止し、代わりにセグメント000にあるサブルーチンを呼び出すCALL命令を用意した。
Sub routines
** ror a
rol a
rol a
rol a
rol a
rol a
ret

** b++
a<->b
a++
a<->b
a<->ds
if c
a++
a<->ds
ret

** b--
a<->b
a--
a<->b
a<->ds
if c
a--
a<->ds
ret

** a<->[b]
push a
a=[b]
push a
sp++
pop a
[b]=a
sp--
sp--
pop a
sp++

** a=[[sp+1]:[sp+2]++]
push f
push b
push ds
sp++
sp++
sp++
sp++
sp++
pop ds
pop b
a=[b]
a<->b
a++
a<->b
a<->ds
if c
a++
a<->ds
push b
push ds
sp--
sp--
sp--
sp--
sp--
pop ds
pop b
pop f
ret

すでに設計図の作成を開始している。

コメント

コメントはありません

コメント送信