mirror of
https://github.com/RPCS3/rpcs3.git
synced 2026-01-01 22:30:02 +01:00
36 lines
773 B
C++
36 lines
773 B
C++
#pragma once
|
|
#include "Emu/CPU/CPUDecoder.h"
|
|
#include "ARMv7Opcodes.h"
|
|
|
|
|
|
class ARMv7Decoder : public CPUDecoder
|
|
{
|
|
ARMv7Opcodes& m_op;
|
|
u8 m_last_instr_size;
|
|
|
|
public:
|
|
ARMv7Decoder(ARMv7Opcodes& op) : m_op(op)
|
|
{
|
|
}
|
|
|
|
virtual u8 DecodeMemory(const u32 address)
|
|
{
|
|
const u32 code0 = vm::psv::read16(address & ~1);
|
|
const u32 code1 = vm::psv::read16(address + 2 & ~1);
|
|
const u32 data = code0 << 16 | code1;
|
|
const u32 arg = address & 1 ? code1 << 16 | code0 : data;
|
|
|
|
for (auto& opcode : ARMv7_opcode_table)
|
|
{
|
|
if ((opcode.type < A1) == ((address & 1) == 0) && (arg & opcode.mask) == opcode.code)
|
|
{
|
|
(m_op.*opcode.func)(opcode.length == 2 ? code0 : arg, opcode.type);
|
|
return opcode.length;
|
|
}
|
|
}
|
|
|
|
m_op.UNK(data);
|
|
return address & 1 ? 4 : 2;
|
|
}
|
|
};
|