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にあるサブルーチンを呼び出すCALL命令を用意した。
すでに設計図の作成を開始している。
今考えているのは、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
すでに設計図の作成を開始している。