67 lines
1.7 KiB
C++
67 lines
1.7 KiB
C++
#pragma once
|
|
#include <ircolib/types.hpp>
|
|
#include <capstone/capstone.h>
|
|
#include <xbyak/xbyak.h>
|
|
#include <array>
|
|
|
|
namespace weee::core {
|
|
struct mem;
|
|
struct broadway {
|
|
broadway();
|
|
void set_pc(ircolib::u32);
|
|
void run(mem &);
|
|
|
|
private:
|
|
ircolib::u32 fetch(mem &);
|
|
void print_disasm(ircolib::u32);
|
|
void execute(ircolib::u32, mem &);
|
|
|
|
bool disasm_available = true;
|
|
ircolib::u32 pc = 0, lr = 0, ctr = 0, cr = 0, srr0;
|
|
union {
|
|
struct {
|
|
unsigned bytecount : 7;
|
|
unsigned : 22;
|
|
unsigned ca : 1;
|
|
unsigned ov : 1;
|
|
unsigned so : 1;
|
|
};
|
|
|
|
ircolib::u32 raw;
|
|
} xer;
|
|
|
|
// bat registers indexes
|
|
static constexpr std::size_t BAT_LOWER_OFFSET = 0;
|
|
static constexpr std::size_t BAT_UPPER_OFFSET = 8;
|
|
|
|
std::array<ircolib::u32, 16> ibat, dbat;
|
|
std::array<ircolib::u32, 32> gpr{};
|
|
// ircolib::u32 const_gpr_lookup{};
|
|
csh capstone;
|
|
// Xbyak::CodeGenerator code;
|
|
|
|
// instructions
|
|
void decode_special1(ircolib::u32, mem &);
|
|
void decode_special2(ircolib::u32, mem &);
|
|
|
|
void andi(ircolib::u32);
|
|
void add(ircolib::u32);
|
|
void addis(ircolib::u32);
|
|
void addi(ircolib::u32);
|
|
void ori(ircolib::u32);
|
|
void oris(ircolib::u32);
|
|
void bx(ircolib::u32);
|
|
void bcx(ircolib::u32);
|
|
void mftspr(bool, ircolib::u32);
|
|
void stw(ircolib::u32, mem &);
|
|
void stwu(ircolib::u32, mem &);
|
|
void sth(ircolib::u32, mem &);
|
|
void lwz(ircolib::u32, mem &);
|
|
void bclrx(ircolib::u32);
|
|
void cmpi(ircolib::u32);
|
|
void rlwinm(ircolib::u32);
|
|
void lwzu(ircolib::u32, mem &);
|
|
void rfi(ircolib::u32);
|
|
};
|
|
} // namespace weee::core
|