Callback symbols, VIP read/write
This commit is contained in:
+41
-10
@@ -212,8 +212,8 @@ static const uint8_t OPDEFS_FLOATENDO[] = {
|
||||
#ifndef VB_DIRECT_EXCEPTION
|
||||
#define VB_ON_EXCEPTION sim->onException
|
||||
#else
|
||||
extern int vbxOnException(VB *, uint16_t *);
|
||||
#define VB_ON_EXCEPTION sim->onException
|
||||
extern int VB_DIRECT_EXCEPTION(VB *, uint16_t *);
|
||||
#define VB_ON_EXCEPTION VB_DIRECT_EXCEPTION
|
||||
#endif
|
||||
static int cpuOnException(VB *sim, uint16_t *cause) {
|
||||
return sim->onException != NULL && VB_ON_EXCEPTION(sim, cause);
|
||||
@@ -224,8 +224,8 @@ static int cpuOnException(VB *sim, uint16_t *cause) {
|
||||
#ifndef VB_DIRECT_EXECUTE
|
||||
#define VB_ON_EXECUTE sim->onExecute
|
||||
#else
|
||||
extern int vbxOnExecute(VB *, uint32_t, const uint16_t *, int);
|
||||
#define VB_ON_EXECUTE vbxOnExecute
|
||||
extern int VB_DIRECT_EXECUTE(VB *, uint32_t, const uint16_t *, int);
|
||||
#define VB_ON_EXECUTE VB_DIRECT_EXECUTE
|
||||
#endif
|
||||
static int cpuOnExecute(VB *sim) {
|
||||
return
|
||||
@@ -239,8 +239,8 @@ static int cpuOnExecute(VB *sim) {
|
||||
#ifndef VB_DIRECT_READ
|
||||
#define VB_ON_READ sim->onRead
|
||||
#else
|
||||
extern int vbxOnRead(VB *, uint32_t, int, int32_t *, uint32_t *);
|
||||
#define VB_ON_READ vbxOnRead
|
||||
extern int VB_DIRECT_READ(VB *, uint32_t, int, int32_t *, uint32_t *);
|
||||
#define VB_ON_READ VB_DIRECT_READ
|
||||
#endif
|
||||
static int cpuRead(VB *sim, uint32_t address, int type, int32_t *value) {
|
||||
uint32_t cycles = 4; /* TODO: Research this */
|
||||
@@ -264,8 +264,8 @@ static int cpuRead(VB *sim, uint32_t address, int type, int32_t *value) {
|
||||
#ifndef VB_DIRECT_FETCH
|
||||
#define VB_ON_FETCH sim->onFetch
|
||||
#else
|
||||
extern int vbxOnFetch(VB *, int, uint32_t, int32_t *, uint32_t *);
|
||||
#define VB_ON_FETCH vbxOnFetch
|
||||
extern int VB_DIRECT_FETCH(VB *, int, uint32_t, int32_t *, uint32_t *);
|
||||
#define VB_ON_FETCH VB_DIRECT_FETCH
|
||||
#endif
|
||||
static int cpuReadFetch(VB *sim, int fetch, uint32_t address, int32_t *value) {
|
||||
uint32_t cycles = 0;
|
||||
@@ -289,8 +289,8 @@ static int cpuReadFetch(VB *sim, int fetch, uint32_t address, int32_t *value) {
|
||||
#ifndef VB_DIRECT_WRITE
|
||||
#define VB_ON_WRITE sim->onWrite
|
||||
#else
|
||||
extern int vbxOnWrite(VB *, uint32_t, int, int32_t *, uint32_t *, int *);
|
||||
#define VB_ON_WRITE vbxOnWrite
|
||||
extern int VB_DIRECT_WRITE(VB *,uint32_t,int,int32_t *,uint32_t *,int *);
|
||||
#define VB_ON_WRITE VB_DIRECT_WRITE
|
||||
#endif
|
||||
static int cpuWrite(VB *sim, uint32_t address, int type, int32_t value) {
|
||||
int cancel = 0;
|
||||
@@ -1792,6 +1792,37 @@ static int cpuEmulate(VB *sim, uint32_t clocks) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Simulate a hardware reset */
|
||||
static void cpuReset(VB *sim) {
|
||||
uint32_t x; /* Iterator */
|
||||
|
||||
/* Normal */
|
||||
sim->cpu.exception = 0;
|
||||
sim->cpu.halt = 0;
|
||||
sim->cpu.irq = 0;
|
||||
sim->cpu.pc = 0xFFFFFFF0;
|
||||
cpuSetSystemRegister(sim, VB_ECR, 0x0000FFF0, 1);
|
||||
cpuSetSystemRegister(sim, VB_PSW, 0x00008000, 1);
|
||||
|
||||
/* Extra (the hardware does not do this) */
|
||||
sim->cpu.adtre = 0x00000000;
|
||||
sim->cpu.eipc = 0x00000000;
|
||||
sim->cpu.eipsw = 0x00000000;
|
||||
sim->cpu.fepc = 0x00000000;
|
||||
sim->cpu.fepsw = 0x00000000;
|
||||
sim->cpu.sr29 = 0x00000000;
|
||||
sim->cpu.sr31 = 0x00000000;
|
||||
cpuSetSystemRegister(sim, VB_CHCW, 0x00000000, 1);
|
||||
for (x = 0; x < 32; x++)
|
||||
sim->cpu.program[x] = 0x00000000;
|
||||
|
||||
/* Other */
|
||||
sim->cpu.clocks = 0;
|
||||
sim->cpu.nextPC = 0xFFFFFFF0;
|
||||
sim->cpu.operation = CPU_FETCH;
|
||||
sim->cpu.step = 0;
|
||||
}
|
||||
|
||||
/* Determine how many clocks are guaranteed to process */
|
||||
static uint32_t cpuUntil(VB *sim, uint32_t clocks) {
|
||||
return sim->cpu.halt || sim->cpu.clocks > clocks ?
|
||||
|
||||
Reference in New Issue
Block a user