static MDFN_COLD bool Load(const uint8* romdata, int32 romlength) { const uint64 fp_size = romlength; if (fp_size > 1024 * 1024 * 8) // 4MiB maximum ROM size, 2* to be a little tolerant of garbage. return false; //throw MDFN_Error(0, _("NGP/NGPC ROM image is too large.")); ngpc_rom.length = fp_size; ngpc_rom.data = (uint8*)alloc_plain(ngpc_rom.length); memcpy(ngpc_rom.data, romdata, romlength); rom_loaded(); //if (!FLASH_LoadNV()) // return false; //MDFNMP_Init(1024, 1024 * 1024 * 16 / 1024); NGPGfx = new NGPGFX_CLASS(); //MDFNGameInfo->fps = (uint32)((uint64)6144000 * 65536 * 256 / 515 / 198); // 3072000 * 2 * 10000 / 515 / 198 MDFNNGPCSOUND_Init(); //MDFNMP_AddRAM(16384, 0x4000, CPUExRAM); SetFRM(); // Set up fast read memory mapping bios_install(); //main_timeaccum = 0; z80_runtime = 0; reset(); MDFNNGPC_SetSoundRate(44100); return true; }
static void Emulate(EmulateSpecStruct *espec) { bool MeowMeow = 0; espec->DisplayRect.x = 0; espec->DisplayRect.y = 0; espec->DisplayRect.w = 160; espec->DisplayRect.h = 152; if(espec->VideoFormatChanged) NGPGfx->set_pixel_format(espec->surface->format); if(espec->SoundFormatChanged) MDFNNGPC_SetSoundRate(espec->SoundRate); NGPJoyLatch = *chee; storeB(0x6F82, *chee); MDFNMP_ApplyPeriodicCheats(); ngpc_soundTS = 0; NGPFrameSkip = espec->skip; do { #if 0 int32 timetime; if(main_timeaccum == 0) { main_timeaccum = TLCS900h_interpret(); if(main_timeaccum > 255) { main_timeaccum = 255; printf("%d\n", main_timeaccum); } } timetime = std::min<int32>(main_timeaccum, 24); main_timeaccum -= timetime; #else #if 0 uint32 old_pc = pc; { uint32 xix = gpr[0]; uint32 xiz = gpr[2]; printf("%08x %08x --- %s\n", xix, xiz, TLCS900h_disassemble()); } pc = old_pc; #endif int32 timetime = (uint8)TLCS900h_interpret(); // This is sooo not right, but it's replicating the old behavior(which is necessary // now since I've fixed the TLCS900h core and other places not to truncate cycle counts // internally to 8-bits). Switch to the #if 0'd block of code once we fix cycle counts in the // TLCS900h core(they're all sorts of messed up), and investigate if certain long // instructions are interruptable(by interrupts) and later resumable, RE Rockman Battle // & Fighters voice sample playback. #endif //if(timetime > 255) // printf("%d\n", timetime); // Note: Don't call updateTimers with a time/tick/cycle/whatever count greater than 255. MeowMeow |= updateTimers(espec->surface, timetime); z80_runtime += timetime; while(z80_runtime > 0) { int z80rantime = Z80_RunOP(); if(z80rantime < 0) // Z80 inactive, so take up all run time! { z80_runtime = 0; break; } z80_runtime -= z80rantime << 1; } } while(!MeowMeow); espec->MasterCycles = ngpc_soundTS; espec->SoundBufSize = MDFNNGPCSOUND_Flush(espec->SoundBuf, espec->SoundBufMaxSize); }