flycast/core/hw/sh4/sh4_interpreter.h

70 lines
1.9 KiB
C

#pragma once
#include "types.h"
#include "sh4_if.h"
#undef sh4op
#define sh4op(str) void DYNACALL str (u32 op)
typedef void (DYNACALL OpCallFP) (u32 op);
enum OpcodeType
{
//basic
Normal = 0, // Heh , nothing special :P
ReadsPC = 1, // PC must be set upon calling it
WritesPC = 2, // It will write PC (branch)
Delayslot = 4, // Has a delayslot opcode , valid only when WritesPC is set
WritesSR = 8, // Writes to SR , and UpdateSR needs to be called
WritesFPSCR = 16, // Writes to FPSCR , and UpdateSR needs to be called
Invalid = 128, // Invalid
NO_FP = 256,
NO_GP = 512,
NO_SP = 1024,
UsesFPU = 2048, // Floating point op
FWritesFPSCR = UsesFPU | WritesFPSCR,
// Heh, not basic :P
ReadWritePC = ReadsPC|WritesPC, // Read and writes pc :P
WritesSRRWPC = WritesSR|ReadsPC|WritesPC,
// Branches (not delay slot):
Branch_dir = ReadWritePC, // Direct (eg , pc=r[xx]) -- this one is ReadWritePC b/c the delayslot may use pc ;)
Branch_rel = ReadWritePC, // Relative (rg pc+=10);
// Delay slot
Branch_dir_d = Delayslot|Branch_dir, // Direct (eg , pc=r[xx])
Branch_rel_d = Delayslot|Branch_rel, // Relative (rg pc+=10);
};
//interface
void Sh4_int_Run();
void Sh4_int_Stop();
void Sh4_int_Start();
void Sh4_int_Step();
void Sh4_int_Skip();
void Sh4_int_Reset(bool Manual);
void Sh4_int_Init();
void Sh4_int_Term();
bool Sh4_int_IsCpuRunning();
void sh4_int_RaiseExeption(u32 ExeptionCode,u32 VectorAddr);
u32 Sh4_int_GetRegister(Sh4RegType reg);
void Sh4_int_SetRegister(Sh4RegType reg,u32 regdata);
//Other things (mainly used by the cpu core
void ExecuteDelayslot();
void ExecuteDelayslot_RTE();
#define SH4_TIMESLICE (448) // at 112 Bangai-O doesn't start. 224 is ok
// at 448 Gundam Side Story hangs on Sega copyright screen, 224 ok, 672 ok(!)
extern "C" {
int UpdateSystem();
#ifndef _MSC_VER
__attribute__((used))
#endif
int UpdateSystem_INTC();
}