CPUのスペック案2
2007年4月30日
モトローラ型で設計すると、手作りのCPUとしては現実的な構造になることが分かった。
メモリ空間は、1ワード8ビットでアドレス16ビットの、合計65536バイト。
レジスタはすべて8ビット:
A1レジスタ 演算用
A2レジスタ 演算用
B1レジスタ メモリアクセス用
B2レジスタ スタック用
Z レジスタ 各種代入・演算結果保持・ジャンプ用
IPレジスタ 実行位置
CSレジスタ 実行セグメント指定
DSレジスタ データセグメント指定
SSレジスタ スタックセグメント指定
フラグ(FLレジスタ)は、ゼロフラグ(Z)およびキャリーフラグ(C)の二つ。
クロック信号と各種イベントのタイミング:
ニーモニック表
複合命令として、c0 から ff までの64個を割り当てる。
複合命令はCPUが保持するROMに記述されたコードにより実行される。
この命令実行用の特殊なポインタ(BSR-ip; 10 bits)が、現在の実行位置を示す。
複合命令はnop命令で終了し、正規のipに制御が戻る。
一つの複合命令当たり、16 bytes。次の命令用の領域も用いれば、16 bytes を超えて記述することも出来る。
複合命令中では、ipおよびcsはポインタとして作用しないので、値の代入が可能。反面、ジャンプ命令は用いることが出来ない。
メモリ空間は、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