getting to my first branch now
This commit is contained in:
+5
-3
@@ -1,4 +1,4 @@
|
||||
#include <broadway.hpp>
|
||||
#include <broadway/utils.hpp>
|
||||
#include <mem.hpp>
|
||||
#include <print>
|
||||
#include <ircolib/log.hpp>
|
||||
@@ -29,11 +29,13 @@ ircolib::u32 broadway::fetch(mem &mem) {
|
||||
}
|
||||
|
||||
void broadway::execute(ircolib::u32 instr, mem &mem) {
|
||||
ircolib::u8 primary = (instr >> 26) & 0x3f;
|
||||
switch (primary) {
|
||||
switch (utils::primary(instr)) {
|
||||
case 15: // addis rd, ra, simm
|
||||
addis(instr);
|
||||
break;
|
||||
case 24: // ori ra, rs, uimm
|
||||
ori(instr);
|
||||
break;
|
||||
default:
|
||||
std::println("broadway::execute unimplemented instruction 0x{:08X} / 0b{:032b}", instr, instr);
|
||||
std::println("disassembly:");
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
#include <ircolib/types.hpp>
|
||||
#include <capstone/capstone.h>
|
||||
#include <xbyak/xbyak.h>
|
||||
#include <array>
|
||||
|
||||
namespace weee::core {
|
||||
@@ -18,9 +19,12 @@ struct broadway {
|
||||
bool disasm_available = true;
|
||||
ircolib::u32 pc = 0;
|
||||
std::array<ircolib::u32, 32> gpr{};
|
||||
// ircolib::u32 const_gpr_lookup{};
|
||||
csh capstone;
|
||||
// Xbyak::CodeGenerator code;
|
||||
|
||||
// instructions
|
||||
void addis(ircolib::u32);
|
||||
void ori(ircolib::u32);
|
||||
};
|
||||
} // namespace weee::core
|
||||
|
||||
@@ -1,7 +1,14 @@
|
||||
#include <broadway.hpp>
|
||||
#include <broadway/utils.hpp>
|
||||
|
||||
namespace weee::core {
|
||||
void broadway::addis(ircolib::u32 instr) {
|
||||
|
||||
if (utils::RA(instr) == 0) { // lis
|
||||
gpr[utils::RD(instr)] = ircolib::s32(utils::SIMM(instr)) << 16;
|
||||
return;
|
||||
}
|
||||
|
||||
gpr[utils::RD(instr)] = gpr[utils::RA(instr)] + (ircolib::s32(utils::SIMM(instr)) << 16);
|
||||
}
|
||||
|
||||
void broadway::ori(ircolib::u32 instr) { gpr[utils::RA(instr)] = gpr[utils::RS(instr)] | utils::UIMM(instr); }
|
||||
} // namespace weee::core
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
#pragma once
|
||||
#include <broadway.hpp>
|
||||
|
||||
namespace weee::core::utils {
|
||||
static inline ircolib::u8 primary(ircolib::u32 instr) { return (instr >> 26) & 0x3f; }
|
||||
static inline ircolib::u8 RD(ircolib::u32 instr) { return (instr >> 21) & 0x1f; }
|
||||
static inline ircolib::u8 RS(ircolib::u32 instr) { return RD(instr); }
|
||||
static inline ircolib::u8 RA(ircolib::u32 instr) { return (instr >> 16) & 0x1f; }
|
||||
static inline ircolib::u16 UIMM(ircolib::u32 instr) { return instr & 0xffff; }
|
||||
static inline ircolib::s16 SIMM(ircolib::u32 instr) { return UIMM(instr); }
|
||||
} // namespace weee::core::utils
|
||||
Reference in New Issue
Block a user