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