ぼくのかんがえたさいきょうのCPU 〜 仕様確定

デコーダのコードを書きながら、実装がめんどうなところなどを修正していきました。

0(0000) 1(0001) 2(0010) 3(0011) 4(0100) 5(0101) 6(0110) 7(0111)
0 NOP LD BC,n'n LD (BC),A INC BC INC B DEC B LD B,n RLCA
10 HALT LD DE,n'n LD (DE),A INC DE INC D DEC D LD D,n RLA
20 JR NZ,e LD HL,n'n LD (n'n),HL INC HL INC H DEC H LD H,n LD A,(HL)
30 JR NC,e LD SP,n'n LD (n'n),A INC SP INC V DEC V LD (HL),n SCF
40 LD B,B LD B,C LD B,D LD B,E LD B,H LD B,L LD B,(HL) LD B,A
50 LD D,B LD D,C LD D,D LD D,E LD D,H LD D,L LD D,(HL) LD D,A
60 LD H,B LD H,C LD H,D LD H,E LD H,H LD H,L LD H,(HL) LD H,A
70 LD (HL),B LD (HL),C LD (HL),D LD (HL),E LD (HL),H LD (HL),L LD (HL),V LD (HL),A
80 ADD A,B ADD A,C ADD A,D ADD A,E ADD A,H ADD A,L ADD A,V ADD A,A
90 SUB B SUB C SUB D SUB E SUB H SUB L SUB V SUB A
A0 AND B AND C AND D AND E AND H AND L AND V AND A
B0 OR B OR C OR D OR E OR H OR L OR V OR A
C0 LD (HL),BC LD (SP),BC JP NZ,n'n JP n'n LD VW,(SP) LD BC,(SP) ADD A,n MUL A,B
D0 LD (HL),DE LD (SP), DE JP NC,n'n OUT (n),A LD (SP),VW LD DE,(SP) SUB n MUL A,C
E0 LD BC,(HL) LD (SP), HL INCW HL OUT(BC),A DECW HL LD HL,(SP) AND n MUL A,D
F0 LD DE,(HL) LD (SP), AF INCW SP DI DECW SP LD AF,(SP) OR n MUL A,E
8(1000) 9(1001) A(1010) B(1011) C(1100) D(1101) E(1110) F(1111)
00 LD V,A ADD HL,BC LD A,(BC) DEC BC INC C DEC C LD C,n RRCA
10 JR e ADD HL,DE LD A,(DE) DEC DE INC E DEC E LD E,n RRA
20 JR Z,e ADD HL,HL LD HL,(n'n) DEC HL INC L DEC L LD L,n CPL
30 JR C,n'n ADD HL,SP LD A,(n'n) DEC SP INC A DEC A LD A,n CCF
40 LD C,B LD C,C LD C,D LD C,E LD C,H LD C,L LD C,(HL) LD C,A
50 LD E,B LD E,C LD E,D LD E,E LD E,H LD E,L LD E,(HL) LD E,A
60 LD L,B LD L,C LD L,D LD L,E LD L,H LD L,L LD L,(HL) LD L,A
70 LD A,B LD A,C LD A,D LD A,E LD A,H LD A,L LD A,V LD A,A
80 ADC A,B ADC A,C ADC A,D ADC A,E ADC A,H ADC A,L ADC A,V ADC A,A
90 SBC A,B SBC A,C SBC A,D SBC A,E SBC A,H SBC A,L SBC A,V SBC A,A
A0 XOR B XOR C XOR D XOR E XOR H XOR L XOR V XOR A
B0 CP B CP C CP D CP E CP H CP L CP V CP A
C0 JP Z,(VW) JP(VW) JP Z,n'n LD V,(HL) LD BC,VW LD VW,BC ADC A,n DIV A,B
D0 JP C,(VW) MUL BC,DE JP C,n'n IN A,(n) LD DE,VW LD VW,DE SBC A,n DIV A,C
E0 SUB HL,BC JP (HL) OUT (BC),HL IN A,(BC) LD HL,VW LD VW,HL XOR n DIV A,D
F0 SUB HL,DE LD SP,HL IN HL,(BC) EI DIV BC,DE MOD BC,DE CP n DIV A,E


ただ、Z80/8080とかけはなれたコード体系にするなら、もっと変えてしまってもよかったかなと思います。
たとえば、LD A,(HL)と LD A,Vを入れ替えれば、分岐がひとつ減らせます。


デコード結果は次のようなデータを持つようにしました。|*4bit|*1bit|*2bit|*3bit|*16bit|*16bit|*4bit|

操作 8/16bit オペランドバイト数 条件(フラグ) パラメータ1 パラメータ2 出力レジスタ


命令、つまり演算器は次のようなものになりました。

操作 引数 元命令
0 store 2 LD
1 load 1 LD
2 in 1 IN
3 out 1 OUT
4 move 2 LD, JP, JR, NOP, HALT, DI, EI
5 jr 1 JR
6 rla 1 RLA, RLCA
7 rra 1 RRA, RRCA
8 add 3 ADD, ADC, INC, INCW
9 sub 3 SUB, SBC, DEC, DECW, CP
10 and 2 AND
11 xor 2 XOR, CCF, CPL
12 or 2 OR, SCF
13 mul 2 MUL
14 div 2 DIV
15 mod 2 MOD


条件は、JP命令の順番にあわせました。

条件
0 なし
1 NZ
2 Z
3 NC
4 C


レジスタにPCなどを加えています。

16bitレジスタ
0 BC
1 DE
2 HL
3 SP
4 AF
5 VW
6 PC
7 II
8bitレジスタ
0 B
1 C
2 D
3 E
4 H
5 L
6 SPh
7 SPl
8 A
9 F(b6がZ, b0がCY)
10 V
11 W
12 PCh
13 PCl
14 I(割り込み許可)
15 None