Exemplo n.º 1
0
void _z80_init(void)
{
#ifdef CPUZ80_CZ80_CORE
	Cz80_Init(&neocd_cz80_struc);
	Cz80_Set_Fetch(&neocd_cz80_struc,0x0000,0xFFFF,(u32)((void *)&mame_z80mem));
	Cz80_Set_ReadB(&neocd_cz80_struc,&cpu_readmem8);
	Cz80_Set_WriteB(&neocd_cz80_struc,&cpu_writemem8);
#if CZ80_USE_WORD_HANDLER
	Cz80_Set_ReadW(&neocd_cz80_struc,&cpu_readmem16);
	Cz80_Set_WriteW(&neocd_cz80_struc,&cpu_writemem16);
#endif
	Cz80_Set_INPort(&neocd_cz80_struc,(CZ80_READ *)&mame_z80_readport16);
	Cz80_Set_OUTPort(&neocd_cz80_struc,(CZ80_WRITE *)&mame_z80_writeport16);
	Cz80_Set_IRQ_Callback(&neocd_cz80_struc,cpu_z80_irq_callback);
	Cz80_Reset(&neocd_cz80_struc);
	//Cz80_Exec(&neocd_cz80_struc,100000);
#endif
#ifdef CPUZ80_MAMEZ80_CORE
	z80_init();
	/*
	z80map1 = mame_z80mem + 0x8000;
	z80map2 = mame_z80mem + 0xc000;
	z80map3 = mame_z80mem + 0xe000;
	z80map4 = mame_z80mem + 0xf000;
	z80_bank[0]=0x8000;
	z80_bank[1]=0xc000;
	z80_bank[2]=0xe000;
	z80_bank[3]=0xf000;
	*/
	z80_reset(NULL);
	//z80_set_irq_callback(cpu_z80_irq_callback);
#endif
}
Exemplo n.º 2
0
int cps1_driver_init(void)
{
	m68000_init();

	z80_init();
	z80_bank = -1;

	if (machine_driver_type == MACHINE_qsound)
	{
		EEPROM_init(&qsound_eeprom_interface);
		cps1_nvram_read_write(0);
	}
	else if (machine_driver_type == MACHINE_wofhfh)
	{
		EEPROM_init(&qsound_eeprom_interface);
		cps1_nvram_read_write(0);
	}
	else if (machine_driver_type == MACHINE_pang3)
	{
		EEPROM_init(&pang3_eeprom_interface);
		cps1_nvram_read_write(0);
	}

	return 1;
}
Exemplo n.º 3
0
void neogeo_driver_init(void)
{
	memcpy(neogeo_game_vectors, memory_region_cpu1, 0x80);

	neogeo_vectors[0] = memory_region_user1;
	neogeo_vectors[1] = neogeo_game_vectors;

	m68k_second_bank = 0xffffffff;
	z80_bank[0] = 0xffffffff;
	z80_bank[1] = 0xffffffff;
	z80_bank[2] = 0xffffffff;
	z80_bank[3] = 0xffffffff;

	if (memory_length_cpu1 > 0x100000)
		neogeo_set_cpu1_second_bank(0x100000);
	else
		neogeo_set_cpu1_second_bank(0x000000);

	neogeo_set_cpu2_bank(0, 0x8000);
	neogeo_set_cpu2_bank(1, 0xc000);
	neogeo_set_cpu2_bank(2, 0xe000);
	neogeo_set_cpu2_bank(3, 0xf000);

	m68000_init();
	z80_init();
}
Exemplo n.º 4
0
void gen_init (void)
{
	int i;

	/* initialize CPUs */
	m68k_set_cpu_type (M68K_CPU_TYPE_68000);
	m68k_init();
	z80_init(0,0,0,z80_irq_callback);

	/* default 68000 mapping */
	for (i=16; i<24; i++)
	{
		m68k_readmap_8[i]	= ILLEGAL;
		m68k_readmap_16[i]	= ILLEGAL;
		m68k_writemap_8[i]	= ILLEGAL;
		m68k_writemap_16[i]	= ILLEGAL;
	}

	/* Z80, I/O, CONTROL */
	m68k_readmap_8[20]		= SYSTEM_IO;
	m68k_readmap_16[20]		= SYSTEM_IO;
	m68k_writemap_8[20]		= SYSTEM_IO;
	m68k_writemap_16[20]	= SYSTEM_IO;

  /* SEGA PICO */
  if (system_hw == SYSTEM_PICO)
  {
    m68k_readmap_8[16]	  = PICO_HW;
		m68k_readmap_16[16]	  = PICO_HW;
		m68k_writemap_8[16]	  = PICO_HW;
		m68k_writemap_16[16]	= PICO_HW;

		/* Notaz: there is no IO CONTROL area (Z80/YM2612/IO) */
    m68k_readmap_8[20]	  = UNUSED;
		m68k_readmap_16[20]	  = UNUSED;
		m68k_writemap_8[20]	  = UNUSED;
		m68k_writemap_16[20]  = UNUSED;
  }

	/* VDP */
	for (i=24; i<28; i++)
	{
		m68k_readmap_8[i]	= VDP;
		m68k_readmap_16[i]	= VDP;
		m68k_writemap_8[i]	= VDP;
		m68k_writemap_16[i]	= VDP;
	}

	/* WRAM */
	for (i=28; i<32; i++)
	{
		m68k_readmap_8[i]	= WRAM;
		m68k_readmap_16[i]	= WRAM;
		m68k_writemap_8[i]	= WRAM;
		m68k_writemap_16[i]	= WRAM;
	}
}
Exemplo n.º 5
0
void Z80_reset(void)
{
	Z80Enabled = 0;

	z80_writebyte = NGP_z80_writebyte;
	z80_readbyte = NGP_z80_readbyte;
	z80_writeport = NGP_z80_writeport;
	z80_readport = NGP_z80_readport;

	z80_init();
	z80_reset();
}
Exemplo n.º 6
0
void neogeo_driver_init(void)
{
    if (neogeo_boot_bios)
        memcpy(neogeo_game_vectors, memory_region_user1, 0x100);

    memcpy(memory_region_cpu1, memory_region_user1, 0x100);
    neogeo_vectors[0] = memory_region_user1;
    neogeo_vectors[1] = neogeo_game_vectors;

    memset(memory_region_hctrl, 0, sizeof(memory_region_hctrl));
    z80_cdda_offset = 0;

    m68000_init();
    z80_init();
}
Exemplo n.º 7
0
void m1snd_addz80(long clock, void *handlers)
{
	char *z80cctx;
	int cpunum;

	z80cctx = malloc(4*1024);
	cpunum = timer_add_cpu(CPU_Z80C, clock, z80_execute, z80_getcycles, z80_yield, z80_getctx, z80_setctx, z80cctx);

	memory_register_cpu(cpunum, 8, M1_CPU_LE);

//	printf("adding Z80 #%d\n", cpunum);

	z80_init();
	z80_reset(NULL);
	z80_set_irq_callback(z80_irq_callback);
	z80_vector = 0xff;

	z80_getctx(z80cctx);
}
Exemplo n.º 8
0
static void system_init(bool overseas, bool PAL, bool overseas_reported, bool PAL_reported)
{
    gen_running = 1;

    z80_init();
    z80_readbyte = MD_Z80_ReadByte;
    z80_writebyte = MD_Z80_WriteByte;
    z80_readport = MD_Z80_ReadPort;
    z80_writeport = MD_Z80_WritePort;

    gen_init();
    MDIO_Init(overseas, PAL, overseas_reported, PAL_reported);
    MainVDP.SetSettings(PAL, PAL_reported, MDFN_GetSettingB("md.correct_aspect"));

#ifdef WANT_DEBUGGER
    MDDBG_Init();
#endif

}
Exemplo n.º 9
0
int sms_z80_init(void) {
    cpuz80 = (CrabZ80_t *)malloc(sizeof(CrabZ80_t));

    if(cpuz80 == NULL) {
        fprintf(stderr, "Out of memory while initializing Z80 in debug mode\n");
        return -1;
    }

    /* Initialize CrabZ80 */
    CrabZ80_init(cpuz80);
    CrabZ80_reset(cpuz80);

    CrabZ80_set_memwrite(cpuz80, sms_debug_memwrite);
    CrabZ80_set_memread(cpuz80, sms_debug_memread);
    CrabZ80_set_portwrite(cpuz80, sms_debug_portwrite);
    CrabZ80_set_portread(cpuz80, sms_debug_portread);

    z80_init();
    z80_reset();

    return 0;
}
Exemplo n.º 10
0
void cps2_driver_init(void)
{
	if (memory_length_user1)
	{
		m68000_init();
		m68000_set_encrypted_range(0, memory_length_user1 - 1, memory_region_user1);
	}
	else
	{
		m68000_init();
	}

	z80_init();
	z80_bank = -1;

	EEPROM_init();
	cps2_nvram_read_write(0);

        //SFA3 patch
	if (!strcmp(driver->name, "sfa3"))
		EEPROM_write_data(0x75, 0x04);
}
Exemplo n.º 11
0
void cpu_z80_init(void)
{
    //  init_mamez80_mem();
    z80_init();

    /* bank initalisation */
    /*
    z80map1 = memory.sm1 + 0x8000;
    z80map2 = memory.sm1 + 0xc000;
    z80map3 = memory.sm1 + 0xe000;
    z80map4 = memory.sm1 + 0xf000;

    z80_bank[0]=0x8000;
    z80_bank[1]=0xc000;
    z80_bank[2]=0xe000;
    z80_bank[3]=0xf000;
    */
    //memcpy(mame_z80mem, memory.sm1, 0xf800);
    z80_reset(NULL);
    //set_irq_callback(mame_z80_irq_callback);
    //z80_init_save_state();
}
Exemplo n.º 12
0
int
main( int argc, char **argv )
{
  FILE *f;

  progname = argv[0];

  if( argc < 2 ) {
    fprintf( stderr, "Usage: %s <testsfile>\n", progname );
    return 1;
  }

  testsfile = argv[1];

  if( init_dummies() ) return 1;

  /* Initialise the tables used by the Z80 core */
  z80_init();

  f = fopen( testsfile, "r" );
  if( !f ) {
    fprintf( stderr, "%s: couldn't open tests file `%s': %s\n", progname,
	     testsfile, strerror( errno ) );
    return 1;
  }

  while( run_test( f ) ) {
    /* Do nothing */
  }

  if( fclose( f ) ) {
    fprintf( stderr, "%s: couldn't close `%s': %s\n", progname, testsfile,
	     strerror( errno ) );
    return 1;
  }

  return 0;
}
Exemplo n.º 13
0
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();
  }
}
Exemplo n.º 14
0
/*-------------------------------------------------------------------------

	Do all one time initializations.

---------------------------------------------------------------------------*/
void neogeo_initialize ( void )
{
	neogeo_audio_track = NULL;

	/* Create and register the watchdog timer */
	timer_create ( &neogeo_watchdog_timer, neogeo_watchdog_callback );
	timer_register ( &neogeo_watchdog_timer );

	/* Create and register the drawline timer. */
	timer_create ( &neogeo_drawline_timer, neogeo_drawline_callback );
	timer_register ( &neogeo_drawline_timer );

	/* Create and register the screen timer. */
	timer_create ( &neogeo_screen_timer, neogeo_screen_callback );
	timer_register ( &neogeo_screen_timer );

	/* Create and register the VBL timer */
	timer_create ( &neogeo_VBL_timer, neogeo_VBL_callback );
	timer_register ( &neogeo_VBL_timer );

	/* Create and register the HBL timer */
	timer_create ( &neogeo_HIRQ_timer, neogeo_HIRQ_callback );
	timer_register ( &neogeo_HIRQ_timer );

	/* Create and register the CDROM IRQ1 Timer */
	timer_create ( &neogeo_cdrom_irq1_timer, neogeo_cdrom_irq1_callback );
	timer_register ( &neogeo_cdrom_irq1_timer );

	/* Create and register the CDROM IRQ2 Timer */
	timer_create ( &neogeo_cdrom_irq2_timer, neogeo_cdrom_irq2_callback );
	timer_register ( &neogeo_cdrom_irq2_timer );

	/* Create and register the timer for audio commands */
	timer_create ( &neogeo_audio_command_timer, neogeo_audio_command_timer_callback );
	timer_register ( &neogeo_audio_command_timer );

	/* Create and register the YM2610 timers */
	timer_create ( &neogeo_ym2610_timer_a, neogeo_ym2610_timer_callback );
	timer_set_data ( &neogeo_ym2610_timer_a, 0 );
	timer_register ( &neogeo_ym2610_timer_a );

	timer_create ( &neogeo_ym2610_timer_b, neogeo_ym2610_timer_callback );
	timer_set_data ( &neogeo_ym2610_timer_b, 1 );
	timer_register ( &neogeo_ym2610_timer_b );

	/* Initialize the memory lookup table */
	memory_init_lookup();

	/* Initialize the 68000 emulation core */
	m68k_set_cpu_type ( M68K_CPU_TYPE_68000 );
	m68k_init();

	/* Inizialize the z80 core */
	z80_init ( 0, Z80_CLOCK, NULL, neogeo_z80_irq_callback );

	/* Initialize the YM2610 */
	YM2610Init ( 8000000, neogeo_audio_frequency, neogeo_PCM_RAM, 0x100000, YM2610TimerHandler, YM2610IrqHandler );

	/* Patch protection check 1 (Disc recognition) */
	m68k_debug_write_memory_16 ( 0xC0D280, 0x4E71 );

	/* Patch protection check 2 ("Now loading" screen) */
	m68k_debug_write_memory_16 ( 0xC0EB82, 0x4E71 );

	/* CD-Loading "speed hack" ^.^ */
	m68k_debug_write_memory_32 ( 0xC0E764, 0x4E722000 );
	m68k_debug_write_memory_16 ( 0xC0E768, 0x4E71 );

	/* Reset all internal register and variables to a known state */
	neogeo_cold_reset();

	/* Test if the underlying OS has accurate sleep() */
	neogeo_test_delay_accurate();
}
Exemplo n.º 15
0
int32 qsf_start(uint8 *buffer, uint32 length)
{
	uint8 *file, *lib_decoded, *lib_raw_file;
	uint64 file_len, lib_len, lib_raw_length;
	corlett_t *lib;

	z80_init();

	Z80ROM = malloc(512*1024);
	QSamples = malloc(8*1024*1024);

	skey1 = skey2 = 0;
	akey = 0;
	xkey = 0;
	cur_bank = 0;

	memset(RAM, 0, 0x1000);
	memset(RAM2, 0, 0x1000);
		
	// Decode the current QSF
	if (corlett_decode(buffer, length, &file, &file_len, &c) != AO_SUCCESS)
	{
		return AO_FAIL;
	}

	// Get the library file
	if (c->lib[0] != 0)
	{
		uint64 tmp_length;
	
		#if DEBUG_LOADER	
		printf("Loading library: %s\n", c->lib);
		#endif
		if (ao_get_lib(c->lib, &lib_raw_file, &tmp_length) != AO_SUCCESS)
		{
			return AO_FAIL;
		}
		lib_raw_length = tmp_length;
		
		if (corlett_decode(lib_raw_file, lib_raw_length, &lib_decoded, &lib_len, &lib) != AO_SUCCESS)
		{
			free(lib_raw_file);
			return AO_FAIL;
		}
				
		// Free up raw file
		free(lib_raw_file);

		// use the contents
		qsf_walktags(lib_decoded, lib_decoded+lib_len);
		
		// Dispose the corlett structure for the lib - we don't use it
		free(lib);
	}

	// now patch the file into RAM OVER the libraries
	qsf_walktags(file, file+file_len);

	free(file);

	if ((skey1 != 0) && (skey2 != 0))
	{
		#if DEBUG_LOADER
		printf("Decoding Kabuki: skey1 %08x skey2 %08x akey %04x xkey %02x\n", skey1, skey2, akey, xkey);
		#endif

		uses_kabuki = 1;
		cps1_decode((unsigned char *)Z80ROM, skey1, skey2, akey, xkey);
	}

	// set qsfby tag
	strcpy(qsfby, "n/a");
	if (c)
	{
		int i;
		for (i = 0; i < MAX_UNKNOWN_TAGS; i++)
		{
			if (!strcasecmp(c->tag_name[i], "qsfby"))
			{
				strcpy(qsfby, c->tag_data[i]);
			}
		}
	}

	z80_reset(NULL);
	z80_set_irq_callback(qsf_irq_cb);
	qsintf.sample_rom = QSamples;
	qsound_sh_start(&qsintf);

	return AO_SUCCESS;
}
Exemplo n.º 16
0
void *qsf_start(const char *path, uint8 *buffer, uint32 length)
{
    qsf_synth_t *s = malloc (sizeof (qsf_synth_t));
    memset (s, 0, sizeof (qsf_synth_t));

	uint8 *file = NULL, *lib_decoded = NULL, *lib_raw_file = NULL;
	uint64 file_len, lib_len, lib_raw_length;
	corlett_t *lib;

	s->z80 = z80_init();
	s->z80->userdata = s;

	s->Z80ROM = malloc(512*1024);
	s->QSamples = malloc(8*1024*1024);

	s->skey1 = s->skey2 = 0;
	s->akey = 0;
	s->xkey = 0;
	s->cur_bank = 0;

	// Decode the current QSF
	if (corlett_decode(buffer, length, &file, &file_len, &s->c) != AO_SUCCESS)
	{
		return AO_FAIL;
	}

	// Get the library file
	if (s->c->lib[0] != 0)
	{
		uint64 tmp_length;
	
        char libpath[PATH_MAX];
        ao_getlibpath (path, s->c->lib, libpath, sizeof (libpath));

#if DEBUG_LOADER	
        printf("Loading library: %s\n", libpath);
#endif
        if (ao_get_lib(libpath, &lib_raw_file, &tmp_length) != AO_SUCCESS)
        {
            free (file);
            qsf_stop (s);
            return NULL;
		}
		lib_raw_length = tmp_length;
		
		if (corlett_decode(lib_raw_file, lib_raw_length, &lib_decoded, &lib_len, &lib) != AO_SUCCESS)
		{
			free(lib_raw_file);
            free (file);
            qsf_stop (s);
            return NULL;
		}
				
		// Free up raw file
		free(lib_raw_file);

		// use the contents
		qsf_walktags(s, lib_decoded, lib_decoded+lib_len);
		
		// Dispose the corlett structure for the lib - we don't use it
		free(lib);
		if (lib_decoded) {
            free (lib_decoded);
            lib_decoded = NULL;
        }
	}

	// now patch the file into RAM OVER the libraries
	qsf_walktags(s, file, file+file_len);

	free(file);

	if ((s->skey1 != 0) && (s->skey2 != 0))
	{
		#if DEBUG_LOADER
		printf("Decoding Kabuki: skey1 %08x skey2 %08x akey %04x xkey %02x\n", skey1, skey2, akey, xkey);
		#endif

		s->uses_kabuki = 1;
		cps1_decode((unsigned char *)s->Z80ROM, s->skey1, s->skey2, s->akey, s->xkey);
	}

	// set qsfby tag
	strcpy(s->qsfby, "n/a");
	if (s->c)
	{
		int i;
		for (i = 0; i < MAX_UNKNOWN_TAGS; i++)
		{
			if (!strcasecmp(s->c->tag_name[i], "qsfby"))
			{
				strcpy(s->qsfby, s->c->tag_data[i]);
			}
		}
	}

	memcpy (s->initRAM, s->RAM, 0x1000);
	memcpy (s->initRAM2, s->RAM2, 0x1000);

    if (s->z80) {
        z80_reset(s->z80, NULL);
        z80_set_irq_callback(s->z80, qsf_irq_cb);
    }
	qsintf.sample_rom = s->QSamples;
	s->qs = qsound_sh_start(&qsintf);
	s->samples_to_next_tick = samples_per_tick;

	return s;
}
Exemplo n.º 17
0
void gen_init(void)
{
    int i;

    /* initialize CPUs */
    m68k_set_cpu_type(M68K_CPU_TYPE_68000);
    m68k_init();
    z80_init(0,z80_irq_callback);

    /* initialize 68k mapped memory */
    /* $000000-$7fffff is affected to cartridge area (see cart_hw.c) */
    /* $800000-$ffffff is affected to WRAM (see VDP DMA) */
    for (i=0x80; i<0x100; i++)
    {
        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++)
    {
        /* illegal area */
        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;
    }

    /* Z80 bus (bank access) */
    zbank_memory_map[0xa0].read   = zbank_lockup_r;
    zbank_memory_map[0xa0].write  = zbank_lockup_w;

    /* 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;

    /* VDP (initially locked on models with TMSS) */
    if (!(config.tmss & 1))
    {
        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;
        }
    }

    /* SEGA PICO */
    if (system_hw == SYSTEM_PICO)
    {
        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;
    }
}
Exemplo n.º 18
0
void init() {
    z80_init(&z80);
    mem_init(&mem);
}
Exemplo n.º 19
0
void gameboy_init()
{
    /* init global values */
    // global_init();

    /* init z80 */
    z80_init();

    /* init cycles syncronizer */
    cycles_init();

    /* init input */
    input_init();

    /* init timer */
    timer_init();

    /* init serial */
    serial_init();

    /* init sound (this will start audio thread) */
    sound_init();

    /* reset GPU counters */
    gpu_reset();

    /* reset to default values */
    mmu_write_no_cyc(0xFF05, 0x00);
    mmu_write_no_cyc(0xFF06, 0x00);
    mmu_write_no_cyc(0xFF07, 0x00);
    mmu_write_no_cyc(0xFF10, 0x80);
    mmu_write_no_cyc(0xFF11, 0xBF);
    mmu_write_no_cyc(0xFF12, 0xF3);
    mmu_write_no_cyc(0xFF14, 0xBF);
    mmu_write_no_cyc(0xFF16, 0x3F);
    mmu_write_no_cyc(0xFF17, 0x00);
    mmu_write_no_cyc(0xFF19, 0xBF);
    mmu_write_no_cyc(0xFF1A, 0x7F);
    mmu_write_no_cyc(0xFF1B, 0xFF);
    mmu_write_no_cyc(0xFF1C, 0x9F);
    mmu_write_no_cyc(0xFF1E, 0xBF);
    mmu_write_no_cyc(0xFF20, 0xFF);
    mmu_write_no_cyc(0xFF21, 0x00);
    mmu_write_no_cyc(0xFF22, 0x00);
    mmu_write_no_cyc(0xFF23, 0xBF);
    mmu_write_no_cyc(0xFF24, 0x77);
    mmu_write_no_cyc(0xFF25, 0xF3);
    mmu_write_no_cyc(0xFF26, 0xF1);
    mmu_write_no_cyc(0xFF40, 0x91);
    mmu_write_no_cyc(0xFF41, 0x80);
    mmu_write_no_cyc(0xFF42, 0x00);
    mmu_write_no_cyc(0xFF43, 0x00);
    mmu_write_no_cyc(0xFF44, 0x00);
    mmu_write_no_cyc(0xFF45, 0x00);
    mmu_write_no_cyc(0xFF47, 0xFC);
    mmu_write_no_cyc(0xFF48, 0xFF);
    mmu_write_no_cyc(0xFF49, 0xFF);
    mmu_write_no_cyc(0xFF4A, 0x00);
    mmu_write_no_cyc(0xFF4B, 0x00);
    mmu_write_no_cyc(0xFF98, 0xDC);
    mmu_write_no_cyc(0xFFFF, 0x00);
    mmu_write_no_cyc(0xC000, 0x08);
    mmu_write_no_cyc(0xFFFE, 0x69);

    if (global_cgb)
        state.a = 0x11;
    else
        state.a = 0x00;

    state.b = 0x00;
    state.c = 0x13;
    state.d = 0x00;
    state.e = 0xd8;
    state.h = 0x01;
    state.l = 0x4d;
    state.pc = 0x0100;
    state.sp = 0xFFFE;
    *state.f = 0xB0;

    /* init semaphore for pauses */
    sem_init(&gameboy_sem, 0, 0);

    /* mark as inited */
    gameboy_inited = 1;

    return;
}