CPU

CPUのスペック案2

2007年4月30日

 モトローラ型で設計すると、手作りのCPUとしては現実的な構造になることが分かった。

メモリ空間は、1ワード8ビットでアドレス16ビットの、合計65536バイト。

レジスタはすべて8ビット:

A1レジスタ 演算用
A2レジスタ 演算用
B1レジスタ メモリアクセス用
B2レジスタ スタック用
Z レジスタ 各種代入・演算結果保持・ジャンプ用
IPレジスタ 実行位置
CSレジスタ 実行セグメント指定
DSレジスタ データセグメント指定
SSレジスタ スタックセグメント指定

フラグ(FLレジスタ)は、ゼロフラグ(Z)およびキャリーフラグ(C)の二つ。

クロック信号と各種イベントのタイミング:
clock 1   clock 2   events
-----------------------------------------------------------------
   0         0      decrement b2 register (for push)
                    prepare environment for reading command
   1         0      read command from memory
   0         1      prepare environment for command
                    increment IP
                    increment b2 register (for pop)
   1         1      do the command
注)clock2が0の時はCS:IPがアドレスラインに、1の時はDS:B1もしくはSS:B2がアドレスラインに接続される。

ニーモニック表
00 mov z,a1
01 mov z,b1
02 mov z,b2
03 mov z,ip
04 mov z,a2
05 mov z,ds
06 mov z,ss
07 mov z,cs
08 mov a1,z
09 mov b1,z
0a mov b2,z
0b mov ip,z (jmp)
0c mov a2,z
0d mov ds,z
0e mov ss,z
0f mov cs,z

10 push a1
11 push b1
12 push b2
13 push ip
14 push a2
15 push ds
16 push ss
17 push cs
18 pop a1
19 pop b1
1a pop b2
1b pop ip (ret)
1c pop a2
1d pop ds
1e pop ss
1f pop cs

20 mov zl,a1l
21 mov zl,b1l
22 mov zl,b2l
23 mov zl,fl
24 mov zl,a2l
25 mov z,[b1]
26 mov z,[b2]
27 mov zl,zh
28 mov a1l,zl
29 mov b1l,zl
2a mov b2l,zl
2b mov fl,zl
2c mov a2l,zl
2d mov [b1],z
2e mov [b2],z
2f mov zh,zl

30 if z
31 if nz
32 if c
33 if nc

40 add a1,a1
41 add a1,a2
42 add a1,[b1]
43 add a1,[b2]
44 nop
45 add a2,a2
46 add a2,[b1]
47 add a2,[b2]
48 sub a1,a1
49 sub a1,a2
4a sub a1,[b1]
4b sub a1,[b2]
4c sub a2,a1
4d sub a2,a2
4e sub a2,[b1]
4f sub a2,[b2]

50 inc a1
51 inc a2
52 inc b1 (inc ds:b1)
53 inc b2 (inc ss:b2)
54 shl a1
55 shl a2
56 nor a1,a2
57 inc z
58 dec a1
59 dec a2
5a dec b1 (dec ds:b1)
5b dec b2 (dec ss:b2)
5c shr a1
5d shr a2
5e nand a1,a2
5f dec z

60 mov zl,0h
61 mov zl,1h
62 mov zl,2h
63 mov zl,3h
64 mov zl,4h
65 mov zl,5h
66 mov zl,6h
67 mov zl,7h
68 mov zl,8h
69 mov zl,9h
6a mov zl,ah
6b mov zl,bh
6c mov zl,ch
6d mov zl,dh
6e mov zl,eh
6f mov zl,fh

70 mov zh,0h
71 mov zh,1h
72 mov zh,2h
73 mov zh,3h
74 mov zh,4h
75 mov zh,5h
76 mov zh,6h
77 mov zh,7h
78 mov zh,8h
79 mov zh,9h
7a mov zh,ah
7b mov zh,bh
7c mov zh,ch
7d mov zh,dh
7e mov zh,eh
7f mov zh,fh
これで最低限の機能は有しているはず。

複合命令として、c0 から ff までの64個を割り当てる。
複合命令はCPUが保持するROMに記述されたコードにより実行される。
この命令実行用の特殊なポインタ(BSR-ip; 10 bits)が、現在の実行位置を示す。
複合命令はnop命令で終了し、正規のipに制御が戻る。
一つの複合命令当たり、16 bytes。次の命令用の領域も用いれば、16 bytes を超えて記述することも出来る。
複合命令中では、ipおよびcsはポインタとして作用しないので、値の代入が可能。反面、ジャンプ命令は用いることが出来ない。
--- c0 call ---
セグメント内呼び出し。zレジスタが示すアドレスを呼び出す。
push ip
mov ip,z
nop

--- c1 ret far ---
pop ip
pop cs
nop

--- c2 call far ---
セグメント間呼び出し。zレジスタが示すセグメントのアドレス0を呼び出す。
push cs
push ip
mov cs,z
mov zh,0h
mov zl,0h
mov ip,z
nop

--- c3 jmp far ---
セグメント間ジャンプ。zレジスタが示すセグメントのアドレス0に移動する。
mov cs,z
mov zl,0h
mov zh,0h
mov ip,z
nop

--- c4 loop ---
スタックに保存されている値を1減らし、
0でないならばZレジスタの示すアドレスにジャンプ
mov [b2],z
inc b2
mov z,[b2]
dec z
mov [b2],z
if z
nop
dec b2
mov z,[b2]
mov ip,z
nop

---c5 jmp ip+z ---
セグメントを無視した、相対ジャンプ
push a1
mov [b2],z
mov z,ip
mov a1,z
add a1,[b2]
mov ip,z
pop a1
if nc
nop
mov z,cs
inc z
mov cs,z
nop

---c6 jmp ip-z ---
セグメントを無視した、相対ジャンプ
push a1
mov [b2],z
mov z,ip
mov a1,z
sub a1,[b2]
mov ip,z
pop a1
if nc
nop
mov z,cs
dec z
mov cs,z
nop

---c7 ret far+1---
『ret far』 と同じだが、1バイト先のアドレスにリターン。『push cs』『push ip』
の後に『jmp ip+z』を呼び出した時のリターン命令に相当。
pop cs
pop ip
mov [b2],z
mov z,ip
inc z
mov ip,z
mov z,[b2]
if nz
nop
mov z,cs
inc z
mov cs,z
mov z,[b2]
nop

--- c8 add a1,z ---
push a2
mov a2,z
add a1,a2
pop a2
nop

--- c9 sub a1,z ---
push a2
mov a2,z
sub a1,z
pop a2
nop

--- ca not a1 ---
push a2
mov zh,0fh
mov zl,0fh
mov a2,z
nand a1,a2
pop a2
nop

--- cb and a1,a2 ---
push a2
nand a1,a2
mov a1,z
mov zh,0fh
mov zl,0fh
mov a2,z
nand a1,a2
pop a2
nop

--- cc or a1,a2 ---
push a2
nor a1,a2
mov a1,z
mov zh,0fh
mov zl,0fh
mov a2,z
nand a1,a2
pop a2
nop

--- cd xor a1,a2 ---
--- ce n/a ---
push a1
push a2
mov zh,0h
mov zl,0h
mov a2,z
nor a1,a2
mov a1,z
pop a2
nand a1,a2
dec b2
mov [b2],z
mov zh,0h
mov zl,0h
mov a1,z
nop a1,a2
mov a2,z
inc b2
pop a1
nand a1,a2
mov a1,z
dec b2
dec b2
mov z,[b2]
mov a2,z
nand a1,a2
pop a2
pop a1
nop

コメント

コメントはありません

コメント送信