1 #pragma once 2 #include <unordered_map> 3 #include "Parser/DirectivesParser.h" 4 #include "Parser/Tokenizer.h" 5 #include "CMipsInstruction.h" 6 #include "MipsMacros.h" 7 8 struct MipsRegisterDescriptor { 9 const wchar_t* name; 10 int num; 11 }; 12 13 class MipsParser 14 { 15 public: 16 std::unique_ptr<CAssemblerCommand> parseDirective(Parser& parser); 17 std::unique_ptr<CMipsInstruction> parseOpcode(Parser& parser); 18 std::unique_ptr<CAssemblerCommand> parseMacro(Parser& parser); 19 private: 20 bool parseRegisterNumber(Parser& parser, MipsRegisterValue& dest, int numValues); 21 bool parseRegisterTable(Parser& parser, MipsRegisterValue& dest, const MipsRegisterDescriptor* table, size_t count); 22 bool parseRegister(Parser& parser, MipsRegisterValue& dest); 23 bool parseFpuRegister(Parser& parser, MipsRegisterValue& dest); 24 bool parseFpuControlRegister(Parser& parser, MipsRegisterValue& dest); 25 bool parseCop0Register(Parser& parser, MipsRegisterValue& dest); 26 bool parsePs2Cop2Register(Parser& parser, MipsRegisterValue& dest); 27 bool parsePsxCop2DataRegister(Parser& parser, MipsRegisterValue& dest); 28 bool parsePsxCop2ControlRegister(Parser& parser, MipsRegisterValue& dest); 29 bool parseRspCop0Register(Parser& parser, MipsRegisterValue& dest); 30 bool parseRspVectorControlRegister(Parser& parser, MipsRegisterValue& dest); 31 bool parseRspVectorRegister(Parser& parser, MipsRegisterValue& dest); 32 bool parseRspBroadcastElement(Parser& parser, MipsRegisterValue& dest); 33 bool parseRspScalarElement(Parser& parser, MipsRegisterValue& dest); 34 bool parseRspOffsetElement(Parser& parser, MipsRegisterValue& dest); 35 bool parseVfpuRegister(Parser& parser, MipsRegisterValue& reg, int size); 36 bool parseVfpuControlRegister(Parser& parser, MipsRegisterValue& reg); 37 bool parseImmediate(Parser& parser, Expression& dest); 38 bool parseVcstParameter(Parser& parser, int& result); 39 bool parseVfpuVrot(Parser& parser, int& result, int size); 40 bool parseVfpuCondition(Parser& parser, int& result); 41 bool parseVpfxsParameter(Parser& parser, int& result); 42 bool parseVpfxdParameter(Parser& parser, int& result); 43 bool parseCop2BranchCondition(Parser& parser, int& result); 44 bool parseWb(Parser& parser); 45 46 bool decodeCop2BranchCondition(const std::wstring& text, size_t& pos, int& result); 47 bool decodeVfpuType(const std::wstring& name, size_t& pos, int& dest); 48 bool decodeOpcode(const std::wstring& name, const tMipsOpcode& opcode); 49 50 void setOmittedRegisters(const tMipsOpcode& opcode); 51 bool matchSymbol(Parser& parser, wchar_t symbol); 52 bool parseParameters(Parser& parser, const tMipsOpcode& opcode); 53 bool parseMacroParameters(Parser& parser, const MipsMacroDefinition& macro); 54 55 MipsRegisterData registers; 56 MipsImmediateData immediate; 57 MipsOpcodeData opcodeData; 58 bool hasFixedSecondaryImmediate; 59 }; 60 61 class MipsOpcodeFormatter 62 { 63 public: 64 const std::wstring& formatOpcode(const MipsOpcodeData& opData, const MipsRegisterData& regData, 65 const MipsImmediateData& immData); 66 private: 67 void handleOpcodeName(const MipsOpcodeData& opData); 68 void handleOpcodeParameters(const MipsOpcodeData& opData, const MipsRegisterData& regData, 69 const MipsImmediateData& immData); 70 void handleImmediate(MipsImmediateType type, unsigned int originalValue, unsigned int opcodeFlags); 71 72 std::wstring buffer; 73 }; 74