mirror of https://github.com/mgba-emu/mgba.git
Implement memory decoding
This commit is contained in:
parent
f32155526b
commit
39e1a85ffc
|
@ -29,7 +29,7 @@
|
||||||
DEFINE_THUMB_DECODER(NAME, MNEMONIC, \
|
DEFINE_THUMB_DECODER(NAME, MNEMONIC, \
|
||||||
info->op1.reg = opcode & 0x0007; \
|
info->op1.reg = opcode & 0x0007; \
|
||||||
info->memory.baseReg = (opcode >> 3) & 0x0007; \
|
info->memory.baseReg = (opcode >> 3) & 0x0007; \
|
||||||
info->memory.offset.shifterReg = IMMEDIATE << 2; \
|
info->memory.offset.immediate = IMMEDIATE << 2; \
|
||||||
info->operandFormat = ARM_OPERAND_REGISTER_1 | \
|
info->operandFormat = ARM_OPERAND_REGISTER_1 | \
|
||||||
ARM_OPERAND_AFFECTED_1 | \
|
ARM_OPERAND_AFFECTED_1 | \
|
||||||
ARM_OPERAND_MEMORY_2; \
|
ARM_OPERAND_MEMORY_2; \
|
||||||
|
@ -333,7 +333,7 @@ static int _decodeRegisterList(int list, char* buffer, int blen) {
|
||||||
if (blen <= 0) {
|
if (blen <= 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int total = 1;
|
int total = 0;
|
||||||
strncpy(buffer, "{", blen);
|
strncpy(buffer, "{", blen);
|
||||||
ADVANCE(1);
|
ADVANCE(1);
|
||||||
int i;
|
int i;
|
||||||
|
@ -381,8 +381,52 @@ static int _decodeRegisterList(int list, char* buffer, int blen) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _decodeMemory(struct ARMMemoryAccess memory, char* buffer, int blen) {
|
static int _decodeMemory(struct ARMMemoryAccess memory, char* buffer, int blen) {
|
||||||
// TODO
|
if (blen <= 0) {
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
int total = 0;
|
||||||
|
strncpy(buffer, "[", blen);
|
||||||
|
ADVANCE(1);
|
||||||
|
int written;
|
||||||
|
if (memory.format & ARM_MEMORY_REGISTER_BASE) {
|
||||||
|
written = _decodeRegister(memory.baseReg, buffer, blen);
|
||||||
|
ADVANCE(written);
|
||||||
|
if (memory.format & (ARM_MEMORY_REGISTER_OFFSET | ARM_MEMORY_IMMEDIATE_OFFSET) && !(memory.format & ARM_MEMORY_POST_INCREMENT)) {
|
||||||
|
strncpy(buffer, ", ", blen);
|
||||||
|
ADVANCE(2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (memory.format & ARM_MEMORY_POST_INCREMENT) {
|
||||||
|
strncpy(buffer, "], ", blen);
|
||||||
|
ADVANCE(3);
|
||||||
|
}
|
||||||
|
if (memory.format & ARM_MEMORY_IMMEDIATE_OFFSET) {
|
||||||
|
if (memory.format & ARM_MEMORY_OFFSET_SUBTRACT) {
|
||||||
|
written = snprintf(buffer, blen, "#-%i", memory.offset.immediate);
|
||||||
|
ADVANCE(written);
|
||||||
|
} else {
|
||||||
|
written = snprintf(buffer, blen, "#%i", memory.offset.immediate);
|
||||||
|
ADVANCE(written);
|
||||||
|
}
|
||||||
|
} else if (memory.format & ARM_MEMORY_REGISTER_OFFSET) {
|
||||||
|
if (memory.format & ARM_MEMORY_OFFSET_SUBTRACT) {
|
||||||
|
strncpy(buffer, "-", blen);
|
||||||
|
ADVANCE(1);
|
||||||
|
}
|
||||||
|
written = _decodeRegister(memory.offset.reg, buffer, blen);
|
||||||
|
ADVANCE(written);
|
||||||
|
}
|
||||||
|
// TODO: shifted registers
|
||||||
|
|
||||||
|
if (!(memory.format & ARM_MEMORY_POST_INCREMENT)) {
|
||||||
|
strncpy(buffer, "]", blen);
|
||||||
|
ADVANCE(1);
|
||||||
|
}
|
||||||
|
if (memory.format & ARM_MEMORY_PRE_INCREMENT) {
|
||||||
|
strncpy(buffer, "!", blen);
|
||||||
|
ADVANCE(1);
|
||||||
|
}
|
||||||
|
return total;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char* _thumbMnemonicStrings[] = {
|
static const char* _thumbMnemonicStrings[] = {
|
||||||
|
|
|
@ -43,7 +43,8 @@ enum ARMMemoryFormat {
|
||||||
ARM_MEMORY_REGISTER_OFFSET = 0x0004,
|
ARM_MEMORY_REGISTER_OFFSET = 0x0004,
|
||||||
ARM_MEMORY_SHIFTED_OFFSET = 0x0008,
|
ARM_MEMORY_SHIFTED_OFFSET = 0x0008,
|
||||||
ARM_MEMORY_PRE_INCREMENT = 0x0010,
|
ARM_MEMORY_PRE_INCREMENT = 0x0010,
|
||||||
ARM_MEMORY_POST_INCREMENT = 0x0020
|
ARM_MEMORY_POST_INCREMENT = 0x0020,
|
||||||
|
ARM_MEMORY_OFFSET_SUBTRACT = 0x0040
|
||||||
};
|
};
|
||||||
|
|
||||||
union ARMOperand {
|
union ARMOperand {
|
||||||
|
|
Loading…
Reference in New Issue