CPU

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 様の表記にする。

***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/
あって

コメント送信