summaryrefslogtreecommitdiffstats
path: root/src/emu/opc.c
blob: fa46b26ab01e98db652602b5b38e9764d677d7b7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <stdlib.h>
#include <string.h>

#include "opc.h"

typedef struct opc_mapping {
	const char *name;
	uint32_t opcode;
} opc_mapping_t;

opc_mapping_t opc_map[] = {
	{ "ADD", OPC_ADD },
	{ "SUB", OPC_SUB },
	{ "MUL", OPC_MUL },
	{ "DIV", OPC_DIV },
	{ "MOD", OPC_MOD },
	{ "SHL", OPC_SHL },
	{ "SHR", OPC_SHR },
	{ "AND", OPC_AND },
	{ "OR",  OPC_OR },
	{ "XOR", OPC_XOR },
	{ "NOR", OPC_NOR },
	{ "MOV", OPC_MOV },
	{ "LB",  OPC_LB },
	{ "LH",  OPC_LH },
	{ "LW",  OPC_LW },
	{ "SB",  OPC_SB },
	{ "SH",  OPC_SH },
	{ "SW",  OPC_SW },
	{ "CMP", OPC_CMP },
	{ "BEZ", OPC_BEZ },
	{ "EQ",  OPC_EQ },
	{ "NE",  OPC_NE },
	{ "LT",  OPC_LT },
	{ "GE",  OPC_GE },
	{ "LE",  OPC_LE },
	{ "GT",  OPC_GT },
	{ "J",   OPC_J },
	{ "JAL", OPC_JAL },
	{ "SYS", OPC_SYS },
	{ NULL,  0 }
};

uint32_t mnemonic2opc(const char *mnemonic)
{
	for (uint8_t i = 0; opc_map[i].name; i++) {
		if (strcmp(opc_map[i].name, mnemonic) == 0)
			return opc_map[i].opcode << 26;
	}

	return ~0;
}

const char *opc2mnemonic(uint32_t IR)
{
	uint32_t opcode = IR >> 26;

	for (uint8_t i = 0; opc_map[i].name; i++) {
		if (opc_map[i].opcode == opcode)
			return opc_map[i].name;
	}

	return NULL;
}