@ -0,0 +1,6 @@ | |||||
#ifndef PSXC_UTIL_H_ | |||||
#define PSXC_UTIL_H_ | |||||
void fatal(const char *fmt, ...); | |||||
#endif |
@ -1,17 +0,0 @@ | |||||
#include "cpu.h" | |||||
#include "insn.h" | |||||
static cpu_insn_handler primary_insn_handler[0x34] = {}; | |||||
static cpu_insn_handler secondary_insn_handler[0x34] = {}; | |||||
void cpu_execute_insn(cpu_t *cpu, uint32_t insn) { | |||||
const op_primary_t op = extract_primary_op(insn); | |||||
if (op == SPECIAL) { | |||||
const op_secondary_t op2 = extract_secondary_op(insn); | |||||
secondary_insn_handler[op2](cpu, insn); | |||||
return; | |||||
} | |||||
primary_insn_handler[op](cpu, insn); | |||||
} |
@ -0,0 +1,31 @@ | |||||
#include "insn.h" | |||||
#include "cpu.h" | |||||
#include "util.h" | |||||
#include <stddef.h> | |||||
#define TABLE_SIZE 0x34 | |||||
static cpu_insn_handler primary_insn_handler[TABLE_SIZE] = {NULL}; | |||||
static cpu_insn_handler secondary_insn_handler[TABLE_SIZE] = {NULL}; | |||||
void insn_execute(cpu_t *cpu, uint32_t insn) { | |||||
const op_primary_t op = extract_primary_op(insn); | |||||
if (op == SPECIAL) { | |||||
const op_secondary_t op2 = extract_secondary_op(insn); | |||||
if (op2 > TABLE_SIZE || secondary_insn_handler[op2] == NULL) { | |||||
fatal("unsupported instruction: insn=%08x, op=%02x, op2=%02x", insn, op, | |||||
op2); | |||||
} | |||||
secondary_insn_handler[op2](cpu, insn); | |||||
} | |||||
if (op > TABLE_SIZE || primary_insn_handler[op] == NULL) { | |||||
fatal("unsupported instruction: insn=%08x, op=%02x", insn, op); | |||||
} | |||||
primary_insn_handler[op](cpu, insn); | |||||
} |
@ -0,0 +1,15 @@ | |||||
#include "util.h" | |||||
#include <stdarg.h> | |||||
#include <stdio.h> | |||||
#include <stdlib.h> | |||||
void fatal(const char *fmt, ...) { | |||||
va_list args; | |||||
va_start(args, fmt); | |||||
vfprintf(stderr, fmt, args); | |||||
va_end(args); | |||||
exit(EXIT_FAILURE); | |||||
} |