4 bit CPU
2007年7月16日
少し思うところあって、4ビットのCPUの設計を検討することにする。理由は、
1)当然ながら8ビットから4ビットに落とすことによって、回路を約半分の大きさに出来ること。
2)ローテート命令をCPUに持たせることにより、加算・減算ルーチンが容易に組めることに気が付いたこと(6502 ではシフト命令がなくて、ローテート命令だけがあることを知った)。
仕様としては4ビットだが、複合命令として8ビットの加算・減算に対応しており、それほどはプログラミングが煩雑にならない様子。ただし、当然ながら、8ビットから4ビットに変更することで、スピードは落ちるはず。
思い切って1ビットのCPUというのも考えたが、この場合はメモリへの読み書きに難が出る。1ビットCPUの設計がうまく出来れば、トランジスタコンピューターの完成も近くなりそうだけれど。
今回設計のCPUは、4ビットのレジスタが4つ(a, b, x, y)。1ワード8ビットで、64kワードの設計。インデックスポインタ(ip)、スタックポインタ(sp)、コードセグメント(cs)、スタックセグメント(ss)は8ビット。スタック領域は256バイトとする(ここも、6502 を参考にした)。複合領域に、e0h-ffh を割り当てた(うち、f6h-ffh は、割り込み用)。なお、ニーモニックは昔ながらの英字3文字にこだわらず、C 様の表記にする。
1)当然ながら8ビットから4ビットに落とすことによって、回路を約半分の大きさに出来ること。
2)ローテート命令をCPUに持たせることにより、加算・減算ルーチンが容易に組めることに気が付いたこと(6502 ではシフト命令がなくて、ローテート命令だけがあることを知った)。
仕様としては4ビットだが、複合命令として8ビットの加算・減算に対応しており、それほどはプログラミングが煩雑にならない様子。ただし、当然ながら、8ビットから4ビットに変更することで、スピードは落ちるはず。
思い切って1ビットのCPUというのも考えたが、この場合はメモリへの読み書きに難が出る。1ビットCPUの設計がうまく出来れば、トランジスタコンピューターの完成も近くなりそうだけれど。
今回設計のCPUは、4ビットのレジスタが4つ(a, b, x, y)。1ワード8ビットで、64kワードの設計。インデックスポインタ(ip)、スタックポインタ(sp)、コードセグメント(cs)、スタックセグメント(ss)は8ビット。スタック領域は256バイトとする(ここも、6502 を参考にした)。複合領域に、e0h-ffh を割り当てた(うち、f6h-ffh は、割り込み用)。なお、ニーモニックは昔ながらの英字3文字にこだわらず、C 様の表記にする。
***00h- a=0h a=1h a=2h a=3h a=4h a=5h a=6h a=7h a=8h a=9h a=ah a=bh a=ch a=dh a=eh a=fh ***10h- b=0h b=1h b=2h b=3h b=4h b=5h b=6h b=7h b=8h b=9h b=ah b=bh b=ch b=dh b=eh b=fh ***20h- x=0h x=1h x=2h x=3h x=4h x=5h x=6h x=7h x=8h x=9h x=ah x=bh x=ch x=dh x=eh x=fh ***30h- y=0h y=1h y=2h y=3h y=4h y=5h y=6h y=7h y=8h y=9h y=ah y=bh y=ch y=dh y=eh y=fh ***40h- reserved (a=a) a=b a=x a=y b=a reserved (b=b) b=x b=y x=a x=b reserved (x=x) x=y y=a y=b y=x reserved (y=y) ***50h- reserved (ab=ab) ab=xy ab=ip ab=sp xy=ab reserved (xy=xy) xy=ip xy=sp ip=ab ip=xy reserved (ip=ip) ip=sp sp=ab sp=xy sp=ip reserved (sp=sp) ***60h- push af push ab push ax push ay push ba push bf push bx push by push xa push xb push xf push xy push ya push yb push yx push yf ***70h- pop af pop ab pop ax pop ay pop ba pop bf pop bx pop by pop xa pop xb pop xf pop xy pop ya pop yb pop yx pop yf ***80h- ab=[ds:ab] ab=[ds:xy] ab=ds nop xy=[ds:ab] xy=[ds:xy] xy=ds reserved (xy=ss) [ds:ab]=ab [ds:xy]=ab ds=ab reserved (ss=ab) [ds:ab]=xy [ds:xy]=xy ds=xy ss=xy ***90h- z=0 z=1 c=0 c=1 if nz if z if nc if c ab=[cs:ip] xy=[cs:ip] xy=cs cs=xy cs:ip++ ss=xy sp++ sp-- ***a0h- rol a (a=a+a+c) a=a+b+c reserved (a=b+a+c) a=b+b+c b=a+a+c b=a+b+c reserved (b=b+a+c) rol b (b=b+b+c) a=a-a-c a=a-b-c a=b-a-c reserved (a=b-b-c) b=a-a-c b=a-b-c b=b-a-c reserved (b=b-b-c) ***b0h- a++ b++ x++ y++ a-- b-- x-- y-- a=a&b a=a|b a=a^b a=!a b=a&b b=a|b b=a^b b=!b *** There are 32 command complexes *** *** Total 212 bytes now *** *** 5 commands remaining to create *** ***e0h- ror a (4 bytes) a=a+a+c a=a+a+c a=a+a+c nop ror b (4 bytes) b=b+b+c b=b+b+c b=b+b+c nop ab++ (4 bytes) a++ if c b++ geteral_return ab-- (4 bytes) a-- if c b-- general_return xy++ (8 bytes) push ab ab=xy a++ if c b++ xy=ab pop ab general_return xy-- (8 bytes) push ab ab=xy a-- if c b-- xy=ab pop ab general_return ab=ab&xy (10 bytes) push xy push by b=x a=a&b x=a pop ba b=a&b a=x pop xy genneral_return ab=ab|xy (10 bytes) push xy push by b=x a=a|b x=a pop ba b=a|b a=x pop xy genneral_return ab=ab+xy (12 bytes) push xy push ab b=x c=0 a=a+b+c x=a pop ab a=y b=a+b+c a=x pop xy genneral_return ab=ab-xy (16 bytes) push xy push ab b=x c=0 a=a-b-c x=a pop ab a=y b=a-b-c a=x pop xy genneral_return if nz nop a=!a a=!a nop ***f0h- jmp +xxh (25 bytes) push af push ab push xy xy=[cs:ip] cs:ip++ ab=ip push by b=x c=0 a=a+b+c x=a pop ba a=a+b+c y=a ip=xy xy=cs if c x++ if c y++ cs=xy pop xy pop ab pop af nop jmp -xxh (25 bytes) push af push ab push xy xy=[cs:ip] cs:ip++ ab=ip push by b=x c=0 a=a-b-c x=a pop ba a=a-b-c y=a ip=xy xy=cs if c x-- if c y-- cs=xy pop xy pop ab pop af nop skip 2 (3 bytes) cs:ip++ cs:ip++ nop call xxxxh (12 bytes) push xy push xy push xy sp++ sp++ sp++ xy=ip push xy xy=cs push xy sp-- pop xy jmp xxxxh (10 bytes) push ab push xy ab=[cs:ip] cs:ip++ xy=[cs:ip] cs=xy ip=ab pop xy pop ab nop ret (13 bytes) push xy sp++ pop xy cs=xy pop xy ip=xy sp-- sp-- sp-- pop xy sp++ sp++ nop *** interrupt handling *** ***f6h- int 0 - int 7 (24 bytes) push ab a=0h - a=7h label1 label1 (13 bytes) push bf push xy xy=ip push ip xy=cs push xy x=0h - x=fh y=0h - y=fh cs=xy x=0h - x=fh y=0h - y=fh ip=xy nop iret (7 bytes) pop xy cs=xy pop xy ip=xy pop bf pop ab nop
コメント
Nike Air Max (2019年5月28日 16:47:41)
Aike Air Max 270 http://www.nikeairmax720.us/
Off White http://www.off-white.us.org/
Christian Louboutin http://www.louboutinredbottomshoes.us/
Salvatore http://www.ferragamo.in.net/
New Balance Women http://www.newbalanceshoes.us/
Fjallraven Kanken http://www.fjallravenkanken.us.com/
Vans Old Skool Canada http://www.vanscanada.ca/
Birkenstock Canada http://www.birkenstockcanadasandals.ca/
あって
Off White http://www.off-white.us.org/
Christian Louboutin http://www.louboutinredbottomshoes.us/
Salvatore http://www.ferragamo.in.net/
New Balance Women http://www.newbalanceshoes.us/
Fjallraven Kanken http://www.fjallravenkanken.us.com/
Vans Old Skool Canada http://www.vanscanada.ca/
Birkenstock Canada http://www.birkenstockcanadasandals.ca/
あって