Mesen-SX/Core/GbAssembler.h
NovaSquirrel c0e249e993 Revert "Merge branch 'reformat_code'"
This reverts commit daf3b57e89, reversing
changes made to 7a6e0b7d77.
2021-03-10 11:13:28 -05:00

56 lines
No EOL
1.5 KiB
C++

#pragma once
#include "stdafx.h"
#include "IAssembler.h"
class LabelManager;
enum class ParamType
{
None,
Literal,
Byte,
Short,
Address,
HighAddress,
RelAddress,
StackOffset
};
struct ParamEntry
{
string Param;
ParamType Type;
};
struct OpCodeEntry
{
uint16_t OpCode;
int ParamCount;
ParamEntry Param1;
ParamEntry Param2;
};
class GbAssembler : public IAssembler
{
private:
unordered_map<string, vector<OpCodeEntry>> _opCodes;
shared_ptr<LabelManager> _labelManager;
void InitParamEntry(ParamEntry& entry, string param);
bool IsRegisterName(string op);
void InitAssembler();
int ReadValue(string operand, int min, int max, unordered_map<string, uint16_t>& localLabels, bool firstPass);
bool IsMatch(ParamEntry& entry, string operand, uint32_t address, unordered_map<string, uint16_t>& localLabels, bool firstPass);
void PushOp(uint16_t opCode, vector<int16_t>& output, uint32_t& address);
void PushByte(uint8_t operand, vector<int16_t>& output, uint32_t& address);
void PushWord(uint16_t operand, vector<int16_t>& output, uint32_t& address);
void ProcessOperand(ParamEntry& entry, string operand, vector<int16_t>& output, uint32_t& address, unordered_map<string, uint16_t>& localLabels, bool firstPass);
void RunPass(vector<int16_t>& output, string code, uint32_t address, int16_t* assembledCode, bool firstPass, unordered_map<string, uint16_t>& localLabels);
public:
GbAssembler(shared_ptr<LabelManager> labelManager);
virtual ~GbAssembler();
uint32_t AssembleCode(string code, uint32_t startAddress, int16_t* assembledCode);
};