Skip to content

Commit 170da32

Browse files
committed
add, adc, sub, sbc, inc, dec
1 parent dfae289 commit 170da32

File tree

3 files changed

+50
-6
lines changed

3 files changed

+50
-6
lines changed

Archs/GB/CGameboyInstruction.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,38 @@ bool CGameboyInstruction::Validate(const ValidateState& state)
6666
Vars.WriteImmediate16 = true;
6767
}
6868

69+
// add <-> sub
70+
if ((Opcode.flags & (GB_ADD_IMMEDIATE | GB_SUB_IMMEDIATE)) && Vars.Immediate < 0)
71+
{
72+
// Change opcode
73+
Vars.Encoding ^= 0x10;
74+
Vars.Immediate = -Vars.Immediate;
75+
}
76+
if (Opcode.flags & GB_NEGATE_IMM)
77+
{
78+
Vars.Immediate = -Vars.Immediate;
79+
}
80+
// add a,1 -> inc a
81+
if ((Opcode.flags & GB_ADD_IMMEDIATE) && Vars.LeftParam.num == GB_REG8_A && Vars.Immediate == 1)
82+
{
83+
// Change opcode
84+
Vars.Encoding = 0x3C;
85+
Vars.Length = 1;
86+
Vars.LeftParam.num = 0;
87+
Vars.WriteImmediate8 = false;
88+
Vars.WriteImmediate16 = false;
89+
}
90+
// sub a,1 -> dec a
91+
if ((Opcode.flags & GB_SUB_IMMEDIATE) && Vars.LeftParam.num == GB_REG8_A && Vars.Immediate == 1)
92+
{
93+
// Change opcode
94+
Vars.Encoding = 0x3D;
95+
Vars.Length = 1;
96+
Vars.LeftParam.num = 0;
97+
Vars.WriteImmediate8 = false;
98+
Vars.WriteImmediate16 = false;
99+
}
100+
69101
// Special loads in range 0xFF00 - 0xFFFF
70102
if (Vars.RightParam.num == GB_REG8_A && Vars.Immediate >= 0xFF00)
71103
{

Archs/GB/GameboyOpcodes.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,25 @@ const tGameboyOpcode GameboyOpcodes[] = {
2828
{ L"ldd", 1, 0x3A, GB_PARAM_A, GB_PARAM_MEMHL, -1, -1, 0 },
2929
{ L"push", 1, 0xC5, GB_PARAM_REG16_AF, GB_PARAM_NONE, 4, -1, 0 },
3030
{ L"pop", 1, 0xC1, GB_PARAM_REG16_AF, GB_PARAM_NONE, 4, -1, 0 },
31-
// { L"add", 1, 0x00, GB_PARAM_NONE, GB_PARAM_NONE, -1, -1, 0 },
32-
// { L"adc", 1, 0x00, GB_PARAM_NONE, GB_PARAM_NONE, -1, -1, 0 },
33-
// { L"sub", 1, 0x00, GB_PARAM_NONE, GB_PARAM_NONE, -1, -1, 0 },
34-
// { L"sbc", 1, 0x00, GB_PARAM_NONE, GB_PARAM_NONE, -1, -1, 0 },
31+
{ L"add", 1, 0x09, GB_PARAM_HL, GB_PARAM_REG16_SP, -1, 4, 0 },
32+
{ L"add", 1, 0x80, GB_PARAM_A, GB_PARAM_REG8_MEMHL, -1, 0, 0 },
33+
{ L"add", 2, 0xC6, GB_PARAM_A, GB_PARAM_IMMEDIATE, -1, -1, GB_IMMEDIATE_U8 | GB_ADD_IMMEDIATE },
34+
{ L"add", 2, 0xE8, GB_PARAM_SP, GB_PARAM_IMMEDIATE, -1, -1, GB_IMMEDIATE_S8 },
35+
{ L"adc", 1, 0x88, GB_PARAM_A, GB_PARAM_REG8_MEMHL, -1, 0, 0 },
36+
{ L"adc", 2, 0xCE, GB_PARAM_A, GB_PARAM_IMMEDIATE, -1, -1, GB_IMMEDIATE_U8 | GB_ADD_IMMEDIATE },
37+
{ L"sub", 1, 0x90, GB_PARAM_A, GB_PARAM_REG8_MEMHL, -1, 0, 0 },
38+
{ L"sub", 2, 0xD6, GB_PARAM_A, GB_PARAM_IMMEDIATE, -1, -1, GB_IMMEDIATE_U8 | GB_SUB_IMMEDIATE },
39+
{ L"sub", 2, 0xE8, GB_PARAM_SP, GB_PARAM_IMMEDIATE, -1, -1, GB_IMMEDIATE_S8 | GB_NEGATE_IMM },
40+
{ L"sbc", 1, 0x98, GB_PARAM_A, GB_PARAM_REG8_MEMHL, -1, 0, 0 },
41+
{ L"sbc", 2, 0xDE, GB_PARAM_A, GB_PARAM_IMMEDIATE, -1, -1, GB_IMMEDIATE_U8 | GB_SUB_IMMEDIATE },
3542
// { L"and", 1, 0x00, GB_PARAM_NONE, GB_PARAM_NONE, -1, -1, 0 },
3643
// { L"xor", 1, 0x00, GB_PARAM_NONE, GB_PARAM_NONE, -1, -1, 0 },
3744
// { L"or", 1, 0x00, GB_PARAM_NONE, GB_PARAM_NONE, -1, -1, 0 },
3845
// { L"cp", 1, 0x00, GB_PARAM_NONE, GB_PARAM_NONE, -1, -1, 0 },
39-
// { L"inc", 1, 0x00, GB_PARAM_NONE, GB_PARAM_NONE, -1, -1, 0 },
40-
// { L"dec", 1, 0x00, GB_PARAM_NONE, GB_PARAM_NONE, -1, -1, 0 },
46+
{ L"inc", 1, 0x04, GB_PARAM_REG8_MEMHL, GB_PARAM_NONE, 3, -1, 0 },
47+
{ L"inc", 1, 0x03, GB_PARAM_REG16_SP, GB_PARAM_NONE, 4, -1, 0 },
48+
{ L"dec", 1, 0x05, GB_PARAM_REG8_MEMHL, GB_PARAM_NONE, 3, -1, 0 },
49+
{ L"dec", 1, 0x0B, GB_PARAM_REG16_SP, GB_PARAM_NONE, 4, -1, 0 },
4150
{ L"daa", 1, 0x27, GB_PARAM_NONE, GB_PARAM_NONE, -1, -1, 0 },
4251
{ L"cpl", 1, 0x2F, GB_PARAM_NONE, GB_PARAM_NONE, -1, -1, 0 },
4352
{ L"rlca", 1, 0x07, GB_PARAM_NONE, GB_PARAM_NONE, -1, -1, 0 },

Archs/GB/GameboyOpcodes.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@
4545
#define GB_IMMEDIATE_U16 0x00000008
4646
#define GB_STOP 0x00000010
4747
#define GB_LOAD_REG8_REG8 0x00000020
48+
#define GB_ADD_IMMEDIATE 0x00000040
49+
#define GB_SUB_IMMEDIATE 0x00000080
50+
#define GB_NEGATE_IMM 0x00000100
4851

4952
#define GB_REG_BIT(reg) (1 << reg)
5053

0 commit comments

Comments
 (0)