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