COLECOVISIONが起動するのは混乱する、とご指摘頂いたので無効にしてみました。COLECOVISIONは将来まじめに取り組むこととします。
winmain.cpp
#if defined(_GAMEGEAR) #ifdef _COLECOVISION _T("Supported Files (*.rom;*.bin;*.gg;*.col)\0*.rom;*.bin;*.gg;*.col\0All Files (*.*)\0*.*\0\0"), #else _T("Supported Files (*.rom;*.bin;*.gg)\0*.rom;*.bin;*.gg\0All Files (*.*)\0*.*\0\0"), #endif _T("Game Cartridge"), #elif defined(_MASTERSYSTEM)
gamegear.cpp
// ---------------------------------------------------------------------------- // initialize // ---------------------------------------------------------------------------- VM::VM(EMU* parent_emu) : emu(parent_emu) { // create devices first_device = last_device = NULL; dummy = new DEVICE(this, emu); // must be 1st device event = new EVENT(this, emu); // must be 2nd device drec = new DATAREC(this, emu); sio = new I8251(this, emu); pio_k = new I8255(this, emu); pio_f = new I8255(this, emu); io = new IO(this, emu); psg = new SN76489AN(this, emu); vdp = new _315_5124(this, emu); fdc = new UPD765A(this, emu); cpu = new Z80(this, emu); key = new KEYBOARD(this, emu); memory = new MEMORY(this, emu); system = new SYSTEM(this, emu); // set contexts event->set_context_cpu(cpu); event->set_context_sound(psg); drec->set_context_out(pio_k, SIG_I8255_PORT_B, 0x80); pio_k->set_context_port_c(key, SIG_KEYBOARD_COLUMN, 0x07, 0); pio_k->set_context_port_c(drec, SIG_DATAREC_REMOTE, 0x08, 0); pio_k->set_context_port_c(drec, SIG_DATAREC_OUT, 0x10, 0); pio_f->set_context_port_c(fdc, SIG_UPD765A_MOTOR_NEG, 2, 0); pio_f->set_context_port_c(fdc, SIG_UPD765A_TC, 4, 0); pio_f->set_context_port_c(fdc, SIG_UPD765A_RESET, 8, 0); pio_f->set_context_port_c(memory, SIG_MEMORY_SEL, 0x40, 0); fdc->set_context_irq(pio_f, SIG_I8255_PORT_A, 1); fdc->set_context_index(pio_f, SIG_I8255_PORT_A, 4); key->set_context_cpu(cpu); key->set_context_pio(pio_k); system->set_context_key(key); vdp->set_context_psg(psg); vdp->set_context_key(key); /// vdp->set_context_cpu(cpu); // cpu bus cpu->set_context_mem(memory); cpu->set_context_io(io); cpu->set_context_intr(system); // i/o bus io->set_iomap_range_rw(0x00, 0x06, system); // GG START io->set_iomap_single_w(0x80, system); // COL TENKEY io->set_iomap_single_w(0xc0, system); // COL JOYPAD io->set_iomap_range_rw(0xfc, 0xfe, system); // COL JOYPAD io->set_iomap_range_rw(0xff, 0xff, psg); // COL PSG io->set_iomap_range_rw(0x7e, 0x7f, vdp); // SG VDP io->set_iomap_range_rw(0xbe, 0xbf, vdp); // SG VDP io->set_iomap_range_rw(0xdc, 0xdf, pio_k); // SG KEY io->set_iomap_range_rw(0xe0, 0xe3, fdc); // SG FDD io->set_iomap_range_rw(0xe4, 0xe7, pio_f); // SG FDD io->set_iomap_range_rw(0xe8, 0xe9, sio); // SG SERIAL // initialize all devices for(DEVICE* device = first_device; device; device = device->next_device) { device->initialize(); } #ifdef _COLECOVISION // BIOS memory->bios(); #endif for(int i = 0; i < 4; i++) { fdc->set_drive_type(i, DRIVE_TYPE_2D); } } (省略) void VM::open_cart(int drv, _TCHAR* file_path) { if(drv == 0) { memory->open_cart(file_path); #ifdef _COLECOVISION if (strstr(file_path, ".col") || strstr(file_path, ".COL")) { vdp->set_console(0x00); vdp->set_context_irq(cpu, SIG_CPU_NMI, 1); memory->bios(); } else #endif { vdp->set_context_irq(cpu, SIG_CPU_IRQ, 1); if (strstr(file_path, ".gg") || strstr(file_path, ".GG")) vdp->set_console(0x40); else vdp->set_console(0x20); } reset(); } }
memory.cpp
void MEMORY::open_cart(_TCHAR* file_path) { FILEIO* fio = new FILEIO(); if(fio->Fopen(file_path, FILEIO_READ_BINARY)) { fio->Fseek(0, FILEIO_SEEK_END); size=fio->Ftell(); pages = (size / 0x4000); fio->Fseek(0, FILEIO_SEEK_SET); if (cart) free(cart); cart=(uint8 *)malloc(size); fio->Fread(cart, size, 1); fio->Fclose(); delete fio; inserted = true; } else { delete fio; return; } #ifdef _COLECOVISION if (strstr(file_path, ".col") || strstr(file_path, ".COL")) { /* $0000-$1FFF mapped to internal ROM (8K) */ cpu_readmap[0] = ram; cpu_writemap[0] = ram; /* $2000-$5FFF mapped to expansion */ cpu_readmap[1] = rdmy; cpu_readmap[2] = rdmy; /* $6000-$7FFF mapped to RAM (1K mirrored) */ cpu_readmap[3] = ram + 0x6000; /* $8000-$FFFF mapped to Cartridge ROM (max. 32K) */ cpu_readmap[4] = cart; if (size>0x2000) cpu_readmap[5] = cart + 0x2000; else cpu_readmap[5] = rdmy; if (size>0x4000) cpu_readmap[6] = cart + 0x4000; else cpu_readmap[6] = rdmy; if (size>0x6000) cpu_readmap[7] = cart + 0x6000; else cpu_readmap[7] = rdmy; } else #endif { // set memory map cpu_readmap[0] = cart; if (size>0x2000) cpu_readmap[1] = cart + 0x2000; else cpu_readmap[1] = rdmy; if (size>0x4000) cpu_readmap[2] = cart + 0x4000; else cpu_readmap[2] = rdmy; if (size>0x6000) cpu_readmap[3] = cart + 0x6000; else cpu_readmap[3] = rdmy; if (size>0x8000) cpu_readmap[4] = cart + 0x8000; else cpu_readmap[4] = ram + 0x8000; if (size>0xA000) cpu_readmap[5] = cart + 0xA000; else cpu_readmap[5] = ram + 0xA000; cpu_readmap[6] = ram + 0xC000; cpu_readmap[7] = ram + 0xE000; } if (strstr(file_path, "SMS.ROM")) { cart[0x77]=0; cart[0x79]=0; } cpu_writemap[0] = ram; cpu_writemap[1] = ram + 0x2000; cpu_writemap[2] = ram + 0x4000; cpu_writemap[3] = ram + 0x6000; cpu_writemap[4] = ram + 0x8000; cpu_writemap[5] = ram + 0xA000; cpu_writemap[6] = ram + 0xC000; cpu_writemap[7] = ram + 0xE000; fcr[0] = 0x00; fcr[1] = 0x00; fcr[2] = 0x01; fcr[3] = 0x00; }
また、オリジナルのeSC-3000でFD1/CMTを利用すれば良いため、こちらも無効にしてみました。
gamegear.rc
// // Menu // IDR_MENU1 MENU DISCARDABLE BEGIN POPUP "Control" BEGIN MENUITEM "Reset", ID_RESET MENUITEM SEPARATOR MENUITEM "CPU x1", ID_CPU_POWER0 MENUITEM "CPU x2", ID_CPU_POWER1 MENUITEM "CPU x4", ID_CPU_POWER2 MENUITEM "CPU x8", ID_CPU_POWER3 MENUITEM "CPU x16", ID_CPU_POWER4 MENUITEM SEPARATOR MENUITEM "Paste", ID_AUTOKEY_START MENUITEM "Stop", ID_AUTOKEY_STOP MENUITEM SEPARATOR MENUITEM "Exit", ID_EXIT END POPUP "Cart" BEGIN MENUITEM "Insert", ID_OPEN_CART1 MENUITEM "Eject", ID_CLOSE_CART1 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_CART1 END #ifdef _COLECOVISION POPUP "FD1" BEGIN MENUITEM "Insert", ID_OPEN_FD1 MENUITEM "Eject", ID_CLOSE_FD1 MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_FD1 END POPUP "CMT" BEGIN MENUITEM "Play", ID_PLAY_TAPE MENUITEM "Rec", ID_REC_TAPE MENUITEM "Eject", ID_CLOSE_TAPE MENUITEM SEPARATOR MENUITEM "Waveform Shaper", ID_USE_WAVE_SHAPER MENUITEM SEPARATOR MENUITEM "Recent", ID_RECENT_TAPE END #endif POPUP "Screen" BEGIN MENUITEM "Rec 60fps", ID_SCREEN_REC60 MENUITEM "Rec 30fps", ID_SCREEN_REC30 MENUITEM "Rec 15fps", ID_SCREEN_REC15 MENUITEM "Stop", ID_SCREEN_STOP MENUITEM "Capture", ID_SCREEN_CAPTURE MENUITEM SEPARATOR MENUITEM "Window x1", ID_SCREEN_WINDOW1 MENUITEM "Window x2", ID_SCREEN_WINDOW2 MENUITEM "Window x3", ID_SCREEN_WINDOW3 MENUITEM "Window x4", ID_SCREEN_WINDOW4 MENUITEM "Window x5", ID_SCREEN_WINDOW5 MENUITEM "Window x6", ID_SCREEN_WINDOW6 MENUITEM "Window x7", ID_SCREEN_WINDOW7 MENUITEM "Window x8", ID_SCREEN_WINDOW8 MENUITEM "Fullscreen 1", ID_SCREEN_FULLSCREEN1 MENUITEM "Fullscreen 2", ID_SCREEN_FULLSCREEN2 MENUITEM "Fullscreen 3", ID_SCREEN_FULLSCREEN3 MENUITEM "Fullscreen 4", ID_SCREEN_FULLSCREEN4 MENUITEM "Fullscreen 5", ID_SCREEN_FULLSCREEN5 MENUITEM "Fullscreen 6", ID_SCREEN_FULLSCREEN6 MENUITEM "Fullscreen 7", ID_SCREEN_FULLSCREEN7 MENUITEM "Fullscreen 8", ID_SCREEN_FULLSCREEN8 MENUITEM "Fullscreen 9", ID_SCREEN_FULLSCREEN9 MENUITEM "Fullscreen 10", ID_SCREEN_FULLSCREEN10 MENUITEM "Fullscreen 11", ID_SCREEN_FULLSCREEN11 MENUITEM "Fullscreen 12", ID_SCREEN_FULLSCREEN12 MENUITEM "Fullscreen 13", ID_SCREEN_FULLSCREEN13 MENUITEM "Fullscreen 14", ID_SCREEN_FULLSCREEN14 MENUITEM "Fullscreen 15", ID_SCREEN_FULLSCREEN15 MENUITEM "Fullscreen 16", ID_SCREEN_FULLSCREEN16 MENUITEM "Fullscreen 17", ID_SCREEN_FULLSCREEN17 MENUITEM "Fullscreen 18", ID_SCREEN_FULLSCREEN18 MENUITEM "Fullscreen 19", ID_SCREEN_FULLSCREEN19 MENUITEM "Fullscreen 20", ID_SCREEN_FULLSCREEN20 MENUITEM "Fullscreen 21", ID_SCREEN_FULLSCREEN21 MENUITEM "Fullscreen 22", ID_SCREEN_FULLSCREEN22 MENUITEM "Fullscreen 23", ID_SCREEN_FULLSCREEN23 MENUITEM "Fullscreen 24", ID_SCREEN_FULLSCREEN24 MENUITEM "Fullscreen 25", ID_SCREEN_FULLSCREEN25 MENUITEM "Fullscreen 26", ID_SCREEN_FULLSCREEN26 MENUITEM "Fullscreen 27", ID_SCREEN_FULLSCREEN27 MENUITEM "Fullscreen 28", ID_SCREEN_FULLSCREEN28 MENUITEM "Fullscreen 29", ID_SCREEN_FULLSCREEN29 MENUITEM "Fullscreen 30", ID_SCREEN_FULLSCREEN30 MENUITEM "Fullscreen 31", ID_SCREEN_FULLSCREEN31 MENUITEM "Fullscreen 32", ID_SCREEN_FULLSCREEN32 MENUITEM SEPARATOR MENUITEM "Use Direct3D9", ID_SCREEN_USE_D3D9 MENUITEM "Wait Vsync", ID_SCREEN_WAIT_VSYNC MENUITEM "Stretch Screen", ID_SCREEN_STRETCH END POPUP "Sound" BEGIN MENUITEM "Rec", ID_SOUND_REC MENUITEM "Stop", ID_SOUND_STOP MENUITEM SEPARATOR MENUITEM "2000Hz", ID_SOUND_FREQ0 MENUITEM "4000Hz", ID_SOUND_FREQ1 MENUITEM "8000Hz", ID_SOUND_FREQ2 MENUITEM "11025Hz", ID_SOUND_FREQ3 MENUITEM "22050Hz", ID_SOUND_FREQ4 MENUITEM "44100Hz", ID_SOUND_FREQ5 MENUITEM "48000Hz", ID_SOUND_FREQ6 MENUITEM "96000Hz", ID_SOUND_FREQ7 MENUITEM SEPARATOR MENUITEM "50msec", ID_SOUND_LATE0 MENUITEM "100msec", ID_SOUND_LATE1 MENUITEM "200msec", ID_SOUND_LATE2 MENUITEM "300msec", ID_SOUND_LATE3 MENUITEM "400msec", ID_SOUND_LATE4 END END
resource.h
// SEGA GAME GEAR #ifdef _GAMEGEAR #define MENU_POS_CONTROL 0 #define MENU_POS_CART1 1 #ifdef _COLECOVISION #define MENU_POS_FD1 2 #define MENU_POS_TAPE 3 #define MENU_POS_SCREEN 4 #define MENU_POS_SOUND 5 #else #define MENU_POS_SCREEN 2 #define MENU_POS_SOUND 3 #endif #endif