/******************************************* Restart emulation when loading a new game ********************************************/ void reloadrom(void) { /* Cartridge "Hot Swap" support (make sure system has already been inited once and use cartridges) */ if ((config.hot_swap == 3) && ((system_hw != SYSTEM_MCD) || scd.cartridge.boot)) { /* Only initialize cartridge hardware */ if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) { /* 16-bit cartridge */ md_cart_init(); md_cart_reset(1); } else { /* 8-bit cartridge */ sms_cart_init(); sms_cart_reset(); } } /* Disc Swap support (automatically enabled if CD tray is open) */ else if ((system_hw != SYSTEM_MCD) || (cdd.status != CD_OPEN)) { /* Initialize audio emulation */ interlaced = 0; audio_init(SAMPLERATE_48KHZ, get_framerate()); /* Switch virtual system on */ system_init(); system_reset(); /* Allow hot swap */ config.hot_swap |= 2; } /* Auto-Load Backup RAM */ slot_autoload(0,config.s_device); /* Auto-Load State */ slot_autoload(config.s_default,config.s_device); /* Load Cheat file */ CheatLoad(); }
void gen_init(void) { int i; /* initialize 68k */ m68k_set_cpu_type(M68K_CPU_TYPE_68000); m68k_init(); /* initialize Z80 */ z80_init(0,z80_irq_callback); /* initialize 68k memory map */ /* $000000-$7FFFFF is affected to cartridge area (see md_cart.c) */ for (i=0x80; i<0x100; i++) { /* $800000-$FFFFFF is affected to WRAM (see VDP DMA) */ m68k_memory_map[i].base = work_ram; m68k_memory_map[i].read8 = NULL; m68k_memory_map[i].read16 = NULL; m68k_memory_map[i].write8 = NULL; m68k_memory_map[i].write16 = NULL; zbank_memory_map[i].read = NULL; zbank_memory_map[i].write = NULL; } /* initialize 68k memory handlers */ for (i=0x80; i<0xe0; i++) { /* $800000-$DFFFFF : illegal area by default */ m68k_memory_map[i].read8 = m68k_lockup_r_8; m68k_memory_map[i].read16 = m68k_lockup_r_16; m68k_memory_map[i].write8 = m68k_lockup_w_8; m68k_memory_map[i].write16 = m68k_lockup_w_16; zbank_memory_map[i].read = zbank_lockup_r; zbank_memory_map[i].write = zbank_lockup_w; } /* $A10000-$A1FFFF : I/O & Control registers */ m68k_memory_map[0xa1].read8 = ctrl_io_read_byte; m68k_memory_map[0xa1].read16 = ctrl_io_read_word; m68k_memory_map[0xa1].write8 = ctrl_io_write_byte; m68k_memory_map[0xa1].write16 = ctrl_io_write_word; zbank_memory_map[0xa1].read = zbank_read_ctrl_io; zbank_memory_map[0xa1].write = zbank_write_ctrl_io; /* $C0xxxx, $C8xxxx, $D0xxxx, $D8xxxx : VDP ports */ for (i=0xc0; i<0xe0; i+=8) { m68k_memory_map[i].read8 = vdp_read_byte; m68k_memory_map[i].read16 = vdp_read_word; m68k_memory_map[i].write8 = vdp_write_byte; m68k_memory_map[i].write16 = vdp_write_word; zbank_memory_map[i].read = zbank_read_vdp; zbank_memory_map[i].write = zbank_write_vdp; } /* MS COMPATIBILITY mode */ if (system_hw == SYSTEM_PBC) { /* initialize Z80 read handler */ /* NB: memory map & write handler are defined by cartridge hardware */ z80_readmem = z80_sms_memory_r; /* initialize Z80 ports handlers */ z80_writeport = z80_sms_port_w; z80_readport = z80_sms_port_r; /* initialize MS cartridge hardware */ sms_cart_init(); } else { /* PICO hardware */ if (system_hw == SYSTEM_PICO) { /* additional registers mapped to $800000-$80FFFF */ m68k_memory_map[0x80].read8 = pico_read_byte; m68k_memory_map[0x80].read16 = pico_read_word; m68k_memory_map[0x80].write8 = m68k_unused_8_w; m68k_memory_map[0x80].write16 = m68k_unused_16_w; /* there is no I/O area (Notaz) */ m68k_memory_map[0xa1].read8 = m68k_read_bus_8; m68k_memory_map[0xa1].read16 = m68k_read_bus_16; m68k_memory_map[0xa1].write8 = m68k_unused_8_w; m68k_memory_map[0xa1].write16 = m68k_unused_16_w; /* page registers */ pico_current = 0x00; pico_page[0] = 0x00; pico_page[1] = 0x01; pico_page[2] = 0x03; pico_page[3] = 0x07; pico_page[4] = 0x0F; pico_page[5] = 0x1F; pico_page[6] = 0x3F; } /* initialize Z80 memory map */ /* $0000-$3FFF is mapped to Z80 RAM (8K mirrored) */ /* $4000-$FFFF is mapped to hardware but Z80.PC should never point there */ for (i=0; i<64; i++) { z80_readmap[i] = &zram[(i & 7) << 10]; } /* initialize Z80 memory handlers */ z80_writemem = z80_md_memory_w; z80_readmem = z80_md_memory_r; /* initialize Z80 port handlers */ z80_writeport = z80_unused_port_w; z80_readport = z80_unused_port_r; /* initialize MD cartridge hardware */ md_cart_init(); } }
int Application::loadROM(const char* filename) { LOGD("NDK:LoadingRom: %s", filename); if (_romLoaded) { // TODO: close genesis // save sram saveSRam(_sramDir); _romLoaded = false; } /* load ROM file */ if (!load_rom((char*)filename)) { LOGD("Error loading rom!"); return NATIVE_ERROR; } // store current rom strcpy(_currentRom, filename); // controllers options config.gun_cursor[0] = 1; config.gun_cursor[1] = 1; config.invert_mouse = 0; config.s_device = 0; LOGD("GenesisPlus Hardware: %d", system_hw); if (system_hw == SYSTEM_MEGADRIVE || system_hw == SYSTEM_GENESIS) { Input.setButtonVisibility(BUTTON_INDEX_C, true); Input.setButtonVisibility(BUTTON_INDEX_X, true); Input.setButtonVisibility(BUTTON_INDEX_Y, true); Input.setButtonVisibility(BUTTON_INDEX_Z, true); input.system[0] = SYSTEM_MD_GAMEPAD; input.system[1] = SYSTEM_MD_GAMEPAD; config.input[0].padtype = DEVICE_PAD6B; } else if (system_hw == SYSTEM_PBC) { Input.setButtonVisibility(BUTTON_INDEX_C, false); Input.setButtonVisibility(BUTTON_INDEX_X, false); Input.setButtonVisibility(BUTTON_INDEX_Y, false); Input.setButtonVisibility(BUTTON_INDEX_Z, false); input.system[0] = SYSTEM_MS_GAMEPAD; input.system[1] = SYSTEM_MS_GAMEPAD; config.input[0].padtype = DEVICE_PAD2B; } input_init(); // hot-swap previous & current cartridge bool hotswap = config.hot_swap && cart.romsize; //cart.romsize = size; if(hotswap) { if (system_hw == SYSTEM_PBC) { sms_cart_init(); sms_cart_reset(); } else { md_cart_init(); md_cart_reset(1); } } else { // initialize audio emulation audio_init(_sampleRate, vdp_pal ? 50.0 : 60.0); // system power ON system_init(); system_reset(); } // sram loadSRam(_currentRom); // mark video updated bitmap.viewport.changed |= 1; /* load Cheats */ //CheatLoad(); _ssize = 0; _romLoaded = true; return NATIVE_OK; }