CPU

1 bit 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を持たせて、データの保持及びスタック領域に用いる。

ニーモニック表(8進法表記)
/* 000-007 */
a0=0
a0=1
a1=0
a1=1
z=0
z=1
c=0
c=1

/* 010-017 */
a0=!a0
a0=a0+a1+c
a0=a0-a1-c
a0=a0&a1
a0=a0|a1
rol b
b++
b--

/* 020-027 */
b<->dp
b<->ip
b<->ds
b<->cs
ip'++
b=[ip']
[dp]=b
b=[dp]

/* 030-037 */
a0<->c
a0<->a1
a1<->c
nop
if nc
if c
if nz
if z

/* 040-047 */
pop b
pop a0
pop a1
pop a0a1
pop f
pop a0f
pop a1f
pop a0a1f

/* 050-057 */
push b
sp--
jmp 0xx
ret
call 0xxxx
cs:ip<->cs
jmp 0xxxx
push a0a1f

/* 060-077 */
user defined commands


ジャンプ命令・及びユーザ定義命令案
00000:
nop
c=1
rol b
c=1
rol b
c=1
rol b
c=1
rol b
c=1
rol b
rol b
b<->sp
jmp 00400

00020:
'jmp 0xx':
push b
b=[ip']
b<->ip'
pop b
cs:ip<->cs':ip'
nop
nop

00030:
'ret': 
b<->ip'
pop b
b<->cs'
pop b
b<->ip'
cs:ip<->cs':ip'
nop
nop

00040:
'call 0xxxx':
push f
b<->ip'
b++
push f
b++
push b
b<->ip'
b<->cs'
if c
b++
pop f
if c
b++
push b
b<->cs'
pop f

00060:
'jmp 0xxxx':
push f
push b
b=[ip']
ip'++
push b
b=[ip']
b<->cs'
pop b
b<->ip'
pop b
pop f
cs:ip<->cs':ip'
nop
nop
nop
nop



00100: user-defined commands
00200: user-defined commands

00100:
'b=0xx':
push f
b=[ip']
ip'++
pop f
cs:ip<->cs':ip'
nop
nop
nop

00110:
'ror b':
rol b
rol b
rol b
rol b
rol b
cs:ip<->cs':ip'
nop
nop

00120:
'dp++':
b<->dp
b++
b<->dp
b<->ds
if c
b++
b<->ds
cs:ip<->cs':ip'

00130:
'dp--':
b<->dp
b++
b<->dp
b<->ds
if c
b++
b<->ds
cs:ip<->cs':ip'

00140:
'[dp]++'
push b
b=[dp]
b++
pop b
cs:ip<->cs':ip'
00145:
jmp 00300


00150:
'[dp]--'
push b
b=[dp]
b--
pop b
cs:ip<->cs':ip'
00155:
jmp 00300

00160:
'[dp]=[dp]+b':
b<->ip'
push b
b<->ip'
b<->cs'
push cs'
b<->cs'
jmp 045


00170:
'[dp]=[dp]-b':
b<->ip'
push b
b<->ip'
b<->cs'
push cs'
b<->cs'
jmp 055

00200:
'b<->[dp]':
push b
b=[dp]
pop b
[dp]=b
cs:ip<->cs':ip'
nop
nop
nop

00210:
'skip 2':
ip'++
ip'++
cs:ip<->cs':ip'
nop
nop
nop
nop
nop

00220:
'ror b,[dp]'
a1<->c
a0<->c
ror b
a0<->c
b<->[dp]
ror b
b<->[dp]
cs:ip<->cs':ip'
// a0>>b>>a0, a1>>[dp]>>c>>a1 //



00300: sub-routine for user-defined commands

00300: //[dp]=[dp]+b
ror b,[dp]
a0=a0+a1+c
ror b,[dp]
a0=a0+a1+c
ror b,[dp]
a0=a0+a1+c
ror b,[dp]
a0=a0+a1+c
ror b,[dp]
a0=a0+a1+c
ror b,[dp]
a0=a0+a1+c
ror b,[dp]
a1<->c
ret

00317: //[dp]=[dp]-b
ror b,[dp]
a0=a0-a1-c
ror b,[dp]
a0=a0-a1-c
ror b,[dp]
a0=a0-a1-c
ror b,[dp]
a0=a0-a1-c
ror b,[dp]
a0=a0-a1-c
ror b,[dp]
a0=a0-a1-c
ror b,[dp]
a1<->c
ret

00336:

00400: program start address

コメント

コメントはありません

コメント送信