デコーダのコードを書きながら、実装がめんどうなところなどを修正していきました。
|
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 |