ぼくのかんがえたさいきょうのCPU 〜 命令表

FPGAをさわってたら、なんかパイプラインとかキャッシュとか複合命令を考えなければCPUつくるのはそんなに難しくないなーと思い始めて、いろいろぽわわ〜んとなって仕事が手につかないので、とりあえず命令表をまとめてみた。
DE0のFPGA内蔵RAMを前提にするので、メモリ空間が32KBくらいしか取れないので、Z80/8080をベースにした。
PUSH/POPやCALL/RETなど、スタックを使う命令も、実質2命令になるので実装がめんどくさそうなのではずした。あと、「ADD A,(HL)」みたいな、読み込みつつ計算するものは、メモり読み込みのタイミングがずれて作りにくいので、はずした。
代わりに、VWレジスタという、メモリ値やスタックの値を退避するためのレジスタを用意して、それぞれの処理を分解した。ついでに、掛け算・割り算の命令を追加した。


ようするに、CISCだったのをRISCに分解した。


これで実装できれば、かなり強力な、おもちゃの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 LD VW,(SP) JP (HL) OUT HL,(BC) IN A,(BC) LD HL,VW LD VW,HL XOR n DIV A,D
F0 LD (SP),VW LD SP,HL IN (BC),HL EI DIV BC,DE MOD BC,DE CP n DIV A,E


※追記2013/1/22 C4/D4とE8/F8がどちらもLD VW,(SP)/LD (SP),VW だったので、E8/F8は16ビット減算命令SUB HL,BC/SUB HL,DEを割り当てることにします