From fccb799a9c76fc432615ad65b4b3dc2cca994918 Mon Sep 17 00:00:00 2001 From: Guy Perfect Date: Thu, 30 Sep 2021 17:33:55 +0000 Subject: [PATCH] Tweaks from concurrent project --- core/cpu.c | 34 ++++++++++++++++++---------------- core/vb.c | 32 ++++++++++++++++++++++++++++++++ core/vb.h | 11 ++++++++++- makefile | 2 +- 4 files changed, 61 insertions(+), 18 deletions(-) diff --git a/core/cpu.c b/core/cpu.c index 37caad7..1410a43 100644 --- a/core/cpu.c +++ b/core/cpu.c @@ -202,7 +202,8 @@ static int cpuWrite(VB *emu, uint32_t address, int8_t type, int32_t value) { /* Using a breakpoint callback */ if (emu->onWrite != NULL) { - emu->cpu.access.value = value; + emu->cpu.access.address = address; + emu->cpu.access.value = value; if (emu->onWrite(emu, &emu->cpu.access)) return 1; } @@ -234,7 +235,7 @@ static int cpuBitSearch(VB *emu, int32_t bit, int32_t dir) { int32_t value; /* Alias of source word */ /* Read the source word */ - if (!emu->cpu.busWait) { + if (emu->cpu.busWait == 0) { /* Initialize state */ emu->cpu.program[30] &= 0xFFFFFFFC; @@ -600,7 +601,7 @@ static void cpuJump(VB *emu, VB_INSTRUCTION *inst, uint32_t address) { static int cpuLoad(VB *emu,VB_INSTRUCTION *inst,uint8_t type,uint32_t clocks) { /* Initiate the read */ - if (!emu->cpu.busWait) { + if (emu->cpu.busWait == 0) { /* Read the data unit from the bus */ if (cpuRead( @@ -688,7 +689,7 @@ static int cpuShiftRight(VB *emu, int32_t value, int bits, int arithmetic) { static int cpuStore(VB *emu,VB_INSTRUCTION *inst,uint8_t type,uint32_t clocks){ /* Initiate the write */ - if (!emu->cpu.busWait) { + if (emu->cpu.busWait == 0) { /* Read the data unit from the bus */ if (cpuWrite( @@ -1000,9 +1001,8 @@ static void cpuDIVU(VB *emu, VB_INSTRUCTION *inst) { } /* Halt */ -static void cpuHALT(VB *emu, VB_INSTRUCTION *inst) { +static void cpuHALT(VB *emu) { emu->cpu.state = CPU_HALTED; - inst->size = 0; /* emu->cpu.clocks = ? */ } @@ -1413,16 +1413,14 @@ static int cpuExecute(VB *emu) { return 0; } - /* Working variables */ - inst = &emu->cpu.inst; + /* Prepare state */ + emu->cpu.causeCode = 0; + inst = &emu->cpu.inst; /* Check for application break */ if (emu->onExecute != NULL && emu->onExecute(emu, inst)) return 1; - /* Update state */ - emu->cpu.causeCode = 0; - /* Processing by ID */ broke = 0; switch (inst->id) { @@ -1445,7 +1443,7 @@ static int cpuExecute(VB *emu) { case CPU_DIV : cpuDIV (emu, inst); break; case CPU_DIVF_S : cpuDIVF_S (emu, inst); break; case CPU_DIVU : cpuDIVU (emu, inst); break; - case CPU_HALT : cpuHALT (emu, inst); break; + case CPU_HALT : cpuHALT (emu ); break; case CPU_IN_B : broke = cpuIN_B (emu, inst); break; case CPU_IN_H : broke = cpuIN_H (emu, inst); break; case CPU_IN_W : broke = cpuIN_W (emu, inst); break; @@ -1513,7 +1511,7 @@ static int cpuExecute(VB *emu) { return 1; /* Post-instruction tasks */ - if (emu->cpu.causeCode == 0 && !emu->cpu.busWait) { + if (emu->cpu.causeCode == 0 && emu->cpu.busWait == 0) { /* Advance to next instruction */ if (emu->cpu.state != CPU_HALTED && !emu->cpu.substring) @@ -1531,7 +1529,7 @@ static int cpuExecute(VB *emu) { /* Switch to fetch mode */ else if (emu->cpu.state != CPU_HALTED && - !emu->cpu.busWait && !emu->cpu.substring) { + emu->cpu.busWait == 0 && !emu->cpu.substring) { emu->cpu.state = CPU_FETCH; } @@ -1642,7 +1640,7 @@ static int cpuFetch(VB *emu) { uint8_t opcode; /* 6-bit instruction opcode */ /* Need to read a data unit */ - if (!emu->cpu.busWait) { + if (emu->cpu.busWait == 0) { /* Read the data unit from the bus */ if (cpuReadFetch(emu, emu->cpu.pc + (emu->cpu.fetch << 1))) @@ -1741,6 +1739,9 @@ static void cpuReset(VB *emu) { /* Other state */ emu->cpu.busWait = 0; + emu->cpu.causeCode = 0; + emu->cpu.clocks = 0; + emu->cpu.fetch = 0; emu->cpu.state = CPU_FETCH; emu->cpu.substring = 0; for (x = 0; x < 5; x++) @@ -1775,6 +1776,7 @@ static uint32_t cpuUntil(VB *emu, uint32_t clocks) { emu->cpu.state == CPU_FATAL || ( emu->onException == NULL && emu->onExecute == NULL && + emu->onFetch == NULL && emu->onRead == NULL && emu->onWrite == NULL )) return clocks; @@ -1785,4 +1787,4 @@ static uint32_t cpuUntil(VB *emu, uint32_t clocks) { -#endif /* VBAPI */ +#endif /* WSAPI */ diff --git a/core/vb.c b/core/vb.c index d8eae4d..b93c54f 100644 --- a/core/vb.c +++ b/core/vb.c @@ -98,6 +98,22 @@ int vbEmulate(VB *emu1, VB *emu2, uint32_t *clocks) { return broke; } +/* Retrieve a current breakpoint callback */ +void* vbGetCallback(VB *emu, int type) { + /* -Wpedantic ignored for pointer conversion because no alternative */ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpedantic" + switch (type) { + case VB_ONEXCEPTION: return emu->onException; + case VB_ONEXECUTE : return emu->onExecute; + case VB_ONFETCH : return emu->onFetch; + case VB_ONREAD : return emu->onRead; + case VB_ONWRITE : return emu->onWrite; + } + #pragma GCC diagnostic pop + return NULL; +} + /* Retrieve the value of PC */ uint32_t vbGetProgramCounter(VB *emu, int type) { switch (type) { @@ -205,9 +221,25 @@ void vbReset(VB *emu) { emu->wram[x] = 0x00; } +/* Specify a breakpoint callback */ +void vbSetCallback(VB *emu, int type, void *callback) { + /* -Wpedantic ignored for pointer conversion because no alternative */ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpedantic" + switch (type) { + case VB_ONEXCEPTION: emu->onException=(VB_EXCEPTIONPROC)callback;break; + case VB_ONEXECUTE : emu->onExecute =(VB_EXECUTEPROC )callback;break; + case VB_ONFETCH : emu->onFetch =(VB_FETCHPROC )callback;break; + case VB_ONREAD : emu->onRead =(VB_READPROC )callback;break; + case VB_ONWRITE : emu->onWrite =(VB_WRITEPROC )callback;break; + } + #pragma GCC diagnostic pop +} + /* Specify a new value for PC */ uint32_t vbSetProgramCounter(VB *emu, uint32_t value) { value &= 0xFFFFFFFE; + emu->cpu.causeCode = 0; emu->cpu.fetch = 0; emu->cpu.pc = value; emu->cpu.state = CPU_FETCH; diff --git a/core/vb.h b/core/vb.h index abc6caa..8fffc77 100644 --- a/core/vb.h +++ b/core/vb.h @@ -42,6 +42,13 @@ extern "C" { #define VB_PC_FROM 1 #define VB_PC_TO 2 +/* Breakpoint callback types */ +#define VB_ONEXCEPTION 0 +#define VB_ONEXECUTE 1 +#define VB_ONFETCH 2 +#define VB_ONREAD 3 +#define VB_ONWRITE 4 + /*********************************** Types ***********************************/ @@ -146,7 +153,7 @@ struct VB { VB_ACCESS access; /* Memory access descriptor */ VB_INSTRUCTION inst; /* Instruction descriptor */ uint8_t irq[5]; /* Interrupt request lines */ - uint8_t busWait; /* Waiting on a memory access */ + uint8_t busWait; /* Memory access counter */ uint16_t causeCode; /* Exception cause code */ uint32_t clocks; /* Clocks until next action */ int16_t fetch; /* Index of fetch unit */ @@ -173,6 +180,7 @@ struct VB { VBAPI void vbConnect (VB *emu1, VB *emu2); VBAPI void vbDisconnect (VB *emu); VBAPI int vbEmulate (VB *emu1, VB *emu2, uint32_t *clocks); +VBAPI void* vbGetCallback (VB *emu, int type); VBAPI uint32_t vbGetProgramCounter (VB *emu, int type); VBAPI int32_t vbGetProgramRegister (VB *emu, int id); VBAPI void* vbGetROM (VB *emu, uint32_t *size); @@ -181,6 +189,7 @@ VBAPI uint32_t vbGetSystemRegister (VB *emu, int id); VBAPI void vbInit (VB *emu); VBAPI int32_t vbRead (VB *emu, uint32_t address, int type, int debug); VBAPI void vbReset (VB *emu); +VBAPI void vbSetCallback (VB *emu, int type, void *callback); VBAPI uint32_t vbSetProgramCounter (VB *emu, uint32_t value); VBAPI int32_t vbSetProgramRegister (VB *emu, int id, int32_t value); VBAPI int vbSetROM (VB *emu, void *rom, uint32_t size); diff --git a/makefile b/makefile index 2ec0470..3a30ed8 100644 --- a/makefile +++ b/makefile @@ -1,7 +1,7 @@ .PHONY: help help: @echo - @echo "Virtual Boy Emulator - September 20, 2021" + @echo "Virtual Boy Emulator - September 30, 2021" @echo @echo "Target build environment is any Debian with the following packages:" @echo " emscripten"