#undef VBAPI #include #include #include /////////////////////////////// Module Commands /////////////////////////////// // Create and initialize a new simulation EMSCRIPTEN_KEEPALIVE VB* Create() { VB *vb = malloc(sizeof (VB)); vbInit(vb); return vb; } // Delete all memory used by a simulation EMSCRIPTEN_KEEPALIVE void Delete(VB *vb) { free(vb->cart.ram); free(vb->cart.rom); free(vb); } // Proxy for free() EMSCRIPTEN_KEEPALIVE void Free(void *ptr) { free(ptr); } // Proxy for malloc() EMSCRIPTEN_KEEPALIVE void* Malloc(int size) { return malloc(size); } // Size in bytes of a pointer EMSCRIPTEN_KEEPALIVE int PointerSize() { return sizeof (void *); } ////////////////////////////// Debugger Commands ////////////////////////////// // Execute until the following instruction static uint32_t RunNextAddress; static int RunNextFetch(VB *vb, int fetch, VBAccess *access) { return access->address == RunNextAddress; } static int RunNextExecute(VB *vb, VBInstruction *inst) { RunNextAddress = inst->address + inst->size; vbSetCallback(vb, VB_ONEXECUTE, NULL); vbSetCallback(vb, VB_ONFETCH, &RunNextFetch); return 0; } EMSCRIPTEN_KEEPALIVE void RunNext(VB **vbs, int count) { uint32_t clocks = 20000000; // 1s vbSetCallback(vbs[0], VB_ONEXECUTE, &RunNextExecute); vbEmulateEx (vbs, count, &clocks); vbSetCallback(vbs[0], VB_ONEXECUTE, NULL); vbSetCallback(vbs[0], VB_ONFETCH , NULL); } // Execute the current instruction static int SingleStepBreak; static int SingleStepFetch(VB *vb, int fetch, VBAccess *access) { if (fetch != 0) return 0; if (SingleStepBreak == 1) return 1; SingleStepBreak = 1; return 0; } EMSCRIPTEN_KEEPALIVE void SingleStep(VB **vbs, int count) { uint32_t clocks = 20000000; // 1s SingleStepBreak = vbs[0]->cpu.stage == 0 ? 0 : 1; vbSetCallback(vbs[0], VB_ONFETCH, &SingleStepFetch); vbEmulateEx (vbs, count, &clocks); vbSetCallback(vbs[0], VB_ONEXECUTE, NULL); vbSetCallback(vbs[0], VB_ONFETCH , NULL); }