Yet Another SEGA GAME GEAR Emulator その5

COLECOVISIONが起動するのは混乱する、とご指摘頂いたので無効にしてみました。COLECOVISIONは将来まじめに取り組むこととします。

f:id:tanam:20140518101955p:image:w360

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