summaryrefslogblamecommitdiffstats
path: root/src/emu/opc.c
blob: 870a272c412d01b29c8d5348226a661364d0970c (plain) (tree)






























































                                                           
#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 },
	{ "BEQ", OPC_BEQ },
	{ "BNE", OPC_BNE },
	{ "BLT", OPC_BLT },
	{ "BGE", OPC_BGE },
	{ "BLE", OPC_BLE },
	{ "BGT", OPC_BGT },
	{ "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;
}