コード例 #1
0
ファイル: genesis.c プロジェクト: auntieNeo/genplus-gx
void gen_softreset(int state)
{
    if (state)
    {
        /* Halt 68k */
        m68k_pulse_halt();

        /* Z80 bus is released & Z80 is reseted */
        zstate = 0;
        m68k_memory_map[0xa0].read8   = m68k_read_bus_8;
        m68k_memory_map[0xa0].read16  = m68k_read_bus_16;
        m68k_memory_map[0xa0].write8  = m68k_unused_8_w;
        m68k_memory_map[0xa0].write16 = m68k_unused_16_w;

        /* Assume default bank is $000000-$007FFF */
        zbank = 0;

        /* Reset YM2612 */
        fm_reset(0);
    }
    else
    {
        /* Reset Cartridge Hardware */
        cart_hw_reset(0);

        /* 68k & Z80 could restart anywhere in VDP frame (Bonkers, Eternal Champions, X-Men 2) */
        mcycles_68k = mcycles_z80 = (uint32)((MCYCLES_PER_LINE * lines_per_frame) * ((double)rand() / (double)RAND_MAX));

        /* Reset 68k, Z80 & YM2612 */
        m68k_pulse_reset();
        z80_reset();
        fm_reset(0);
    }
}
コード例 #2
0
ファイル: genesis.c プロジェクト: auntieNeo/genplus-gx
void gen_hardreset(void)
{
    /* Clear RAM */
    memset (work_ram, 0x00, sizeof (work_ram));
    memset (zram, 0x00, sizeof (zram));

    /* TMSS + OS ROM support */
    memset(tmss, 0x00, sizeof(tmss));
    if (config.tmss == 3)
    {
        m68k_memory_map[0].base = bios_rom;
    }

    /* 68k & Z80 could restart anywhere in VDP frame (Bonkers, Eternal Champions, X-Men 2) */
    mcycles_68k = mcycles_z80 = (uint32)((MCYCLES_PER_LINE * lines_per_frame) * ((double)rand() / (double)RAND_MAX));

    /* Z80 bus is released & Z80 is stopped */
    zstate = 0;
    m68k_memory_map[0xa0].read8   = m68k_read_bus_8;
    m68k_memory_map[0xa0].read16  = m68k_read_bus_16;
    m68k_memory_map[0xa0].write8  = m68k_unused_8_w;
    m68k_memory_map[0xa0].write16 = m68k_unused_16_w;

    /* Assume default bank is $000000-$007FFF */
    zbank = 0;

    /* Reset 68k & Z80 */
    m68k_pulse_reset();
    z80_reset();
}
コード例 #3
0
ファイル: cpu68k.c プロジェクト: joshdekock/jim-ps2ware
inline void M68K_Reset(void)
{
#ifdef CPU68K_USE_MUSASHI
    m68k_pulse_reset();
#endif

#ifdef CPU68K_USE_C68K
    C68k_Reset(&C68K);
#endif
}
コード例 #4
0
ファイル: cpuintrf.c プロジェクト: dreiss/M1-Android
// add a 68k cpu
void m1snd_add68k(long clock, void *handlers)
{
	rw68k = handlers;

	// $$$HACK: if this isn't called, model 1/2 games choke (IRQs don't get through)
	// if called up after Taito m68k-based games.
	m68k_init();

	timer_add_cpu(CPU_MC68000, clock, m68k_execute, m68k_cycles_run, m68k_end_timeslice, dummy_getctx, dummy_setctx, NULL);

	m68k_set_cpu_type(M68K_CPU_TYPE_68000);
	m68k_pulse_reset();
}
コード例 #5
0
ファイル: genesis.c プロジェクト: AliSayed/MoSync
void gen_reset (unsigned int hard_reset)
{
	if (hard_reset)
	{
		/* Clear RAM */
		memset (work_ram, 0, sizeof (work_ram));
		memset (zram, 0, sizeof (zram));

		/* Reset ROM mapping */
    if (config.bios_enabled == 3)
    {
      rom_readmap[0] = &bios_rom[0];
      rom_size = 0x800;
    }
    else
    {
      rom_readmap[0] = &cart_rom[0];
      rom_size = genromsize;
    }

		uint8 i;
    for (i=1; i<8; i++) rom_readmap[i] = &cart_rom[i << 19];
	}

	gen_running = 1;
	zreset = 0;		/* Z80 is reset */
	zbusreq = 0;	/* Z80 has control of the Z bus */
	zbusack = 1;	/* Z80 is busy using the Z bus */
	zbank = 0;		/* Assume default bank is 000000-007FFF */
	zirq = 0;		/* No interrupts occuring */
	resetline = -1;

	/* Reset CPUs */
	m68k_pulse_reset ();
	z80_reset ();
	_YM2612_Reset();	

#ifdef NGC
  /* register SOFTRESET */
  SYS_SetResetCallback(set_softreset);
#endif

}
コード例 #6
0
ファイル: sek.c プロジェクト: alban-rochel/pixbox-picodrive
// Reset the 68000:
PICO_INTERNAL int SekReset(void)
{
  if (Pico.rom==NULL) return 1;

#ifdef EMU_C68K
  CycloneReset(&PicoCpuCM68k);
#endif
#ifdef EMU_M68K
  m68k_set_context(&PicoCpuMM68k); // if we ever reset m68k, we always need it's context to be set
  m68ki_cpu.sp[0]=0;
  m68k_set_irq(0);
  m68k_pulse_reset();
  REG_USP = 0; // ?
#endif
#ifdef EMU_F68K
  {
    g_m68kcontext = &PicoCpuFM68k;
    fm68k_reset();
  }
#endif

  return 0;
}
コード例 #7
0
ファイル: cpu68k.c プロジェクト: joshdekock/jim-ps2ware
inline void M68K_Init(void)
{
#ifdef CPU68K_USE_MUSASHI
    // MUSASHI
    m68k_set_cpu_type(M68K_CPU_TYPE_68000);
    m68k_pulse_reset();
#endif

#ifdef CPU68K_USE_C68K
    // C68K
    C68k_Init(&C68K, NULL);

    C68k_Set_ReadB(&C68K, m68k_read_memory_8);
    C68k_Set_ReadW(&C68K, m68k_read_memory_16);

    C68k_Set_WriteB(&C68K, m68k_write_memory_8);
    C68k_Set_WriteW(&C68K, m68k_write_memory_16);
    
    C68k_Set_Fetch(&C68K, 0x000000, 0x1FFFFF, (u32) neogeo_prg_memory);
    C68k_Set_Fetch(&C68K, 0xC00000, 0xC7FFFF, (u32) neogeo_rom_memory);
    
    C68k_Reset(&C68K);
#endif
}
コード例 #8
0
ファイル: genesis.c プロジェクト: XClouded/xielei
void gen_reset(int hard_reset)
{
  /* System Reset */
  if (hard_reset)
  {
    /* clear RAM */
    memset (work_ram, 0x00, sizeof (work_ram));
    memset (zram, 0x00, sizeof (zram));

  }
  else
  {
    /* reset YM2612 (on hard reset, this is done by sound_reset) */
    fm_reset(0);
  }

  /* 68k & Z80 could restart anywhere in VDP frame (Bonkers, Eternal Champions, X-Men 2) */
  mcycles_68k = mcycles_z80 = (uint32)((MCYCLES_PER_LINE * lines_per_frame) * ((double)rand() / (double)RAND_MAX));
  //mcycles_68k = mcycles_z80 = 0;

  if (system_hw == SYSTEM_PBC)
  {
    /* reset MS cartridge hardware */
    sms_cart_reset();

    /* Z80 is running */
    zstate = 1;

    /* 68k is halted */
    m68k_pulse_halt();
  }
  else
  {
    /* reset MD cartridge hardware */
    md_cart_reset(hard_reset);

    /* Z80 bus is released & Z80 is reseted */
    m68k_memory_map[0xa0].read8   = m68k_read_bus_8;
    m68k_memory_map[0xa0].read16  = m68k_read_bus_16;
    m68k_memory_map[0xa0].write8  = m68k_unused_8_w;
    m68k_memory_map[0xa0].write16 = m68k_unused_16_w;
    zstate = 0;

    /* assume default bank is $000000-$007FFF */
    zbank = 0;  

    /* TMSS & OS ROM support */
    if (config.tmss & 1)
    {
      /* clear TMSS register */
      memset(tmss, 0x00, sizeof(tmss));

      /* VDP access is locked by default */
      int i;
      for (i=0xc0; i<0xe0; i+=8)
      {
        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;
      }

      /* OS ROM is mapped at $000000-$0007FF */
      if (config.tmss & 2)
      {
        m68k_memory_map[0].base = bios_rom;
      }
    }

    /* reset 68k */
    m68k_pulse_reset();
  }

  /* reset Z80 */
  z80_reset();
}
コード例 #9
0
ファイル: neogeo.c プロジェクト: fabrice-martinez/neocd
/*-------------------------------------------------------------------------

	Reset all internal register and variables to a known state.

---------------------------------------------------------------------------*/
void neogeo_cold_reset ( void )
{
	neogeo_show_debugger = 0;

	if ( neogeo_debugger_enabled )
		neogeo_set_runmode ( NEOGEO_RUN_TRACE );
	else
		neogeo_set_runmode ( NEOGEO_RUN_NORMAL );

	if ( neogeo_audio_track )
	{
		Mix_FreeMusic ( neogeo_audio_track );
		neogeo_audio_track = NULL;
	}

	/* Reset the elapsed time */
	neogeo_elapsed_time = ( double ) 0;

	/* Wipe clean all RAM */
	SDL_memset ( neogeo_RAM, 0, sizeof ( neogeo_RAM ) );
	SDL_memset ( neogeo_palette_RAM, 0, sizeof ( neogeo_palette_RAM ) );
	SDL_memset ( neogeo_video_RAM, 0, sizeof ( neogeo_video_RAM ) );
	SDL_memset ( neogeo_SPR_RAM, 0, sizeof ( neogeo_SPR_RAM ) );
	SDL_memset ( neogeo_FIX_RAM, 0, sizeof ( neogeo_FIX_RAM ) );
	SDL_memset ( neogeo_z80_RAM, 0, sizeof ( neogeo_z80_RAM ) );
	SDL_memset ( neogeo_PCM_RAM, 0, sizeof ( neogeo_PCM_RAM ) );

	/* Set fix usage map to all transparent */
	SDL_memset ( neogeo_FIX_usage, 0, sizeof( neogeo_FIX_usage ) );

	/* CD Unit stuff init */
	SDL_memset ( &neogeo_memory_latch[0], 0, sizeof ( neogeo_memory_latch ) );
	neogeo_memory_latch_counter = 0;
	neogeo_spr_bank_select = 0;
	neogeo_pcm_bank_select = 0;
	neogeo_video_enable = 1;
	neogeo_spr_disable = 0;
	neogeo_fix_disable = 0;

	/* Video Hardware init */
	neogeo_palette_bank = 0;
	neogeo_videoram_offset = 0;
	neogeo_videoram_modulo = 0;
	neogeo_videoram_data = 0;
	neogeo_auto_animation_speed = 0;
	neogeo_auto_animation_disabled = 0;
	neogeo_auto_animation_counter = 0;
	neogeo_auto_animation_frame_counter = 0;
	neogeo_HIRQ_control = 0;
	neogeo_HIRQ_register = 0;
	neogeo_screen_position = 0;

	/* Clear all pending interrupts */
	neogeo_HIRQ_pending = 0;
	neogeo_VBL_irq_pending = 0;
	neogeo_cdrom_irq1_pending = 0;
	neogeo_cdrom_irq2_pending = 0;
	neogeo_cdrom_irq_mask = 0;

	/* Controllers */
	neogeo_joystick_select = 0;
	neogeo_controller1 = 0xFF;
	neogeo_controller2 = 0xFF;
	neogeo_controller3 = 0x0F;

	/* DMA */
	SDL_memset ( &neogeo_dma_config[0], 0, sizeof ( Uint16 ) * 9 );
	neogeo_dma_source = 0;
	neogeo_dma_destination = 0;
	neogeo_dma_pattern = 0;
	neogeo_dma_length = 0;

	/* CDROM */
	neogeo_cdrom_response_pointer = 9;
	neogeo_cdrom_command_pointer = 0;
	neogeo_cdrom_data_strobe = 0;
	SDL_memset ( &neogeo_cdrom_response[0], 0, sizeof ( Uint8 ) * 5 );
	SDL_memset ( &neogeo_cdrom_command[0], 0, sizeof ( Uint8 ) * 5 );
	neogeo_cdrom_register_select = 0;
	neogeo_cdrom_register_pointer = 0;
	neogeo_cdrom_stop();

	/* ROM Vectors enabled at boot time*/
	memory_regions[MEMORY_VECTORS_INDEX].Handlers = &neogeo_ROM_handlers;

	/* Double Dragon Fix */
	if ( Fix_DoubleDragon )
		m68k_memcpy ( 0xC00000, 0x110004, 0x800 );

	/* Initialize all timers */
	timer_arm ( &neogeo_watchdog_timer, M68K_TO_REF ( WATCHDOG_TIMER_DELAY ) );
	timer_arm ( &neogeo_drawline_timer, PIXEL_TO_REF ( NEOGEO_HS_START ) );
	timer_arm ( &neogeo_screen_timer, PIXEL_TO_REF ( NEOGEO_SCREEN_WIDTH * NEOGEO_SCREEN_HEIGHT ) );
	timer_arm ( &neogeo_VBL_timer, PIXEL_TO_REF ( NEOGEO_SCREEN_WIDTH * NEOGEO_VBLANK_LINE ) );
	timer_arm ( &neogeo_cdrom_irq1_timer, NEOGEO_CDROM_DELAY );
	timer_arm ( &neogeo_cdrom_irq2_timer, PIXEL_TO_REF ( NEOGEO_SCREEN_WIDTH * NEOGEO_CDROM_IRQ2_LINE ) );
	timer_set_state ( &neogeo_HIRQ_timer, TIMER_STOPPED );
	timer_set_state ( &neogeo_audio_command_timer, TIMER_STOPPED );
	timer_set_state ( &neogeo_ym2610_timer_a, TIMER_STOPPED );
	timer_set_state ( &neogeo_ym2610_timer_b, TIMER_STOPPED );

	/* Reset the 68000 */
	m68k_pulse_reset();

	/* Disable the z80 */
	neogeo_z80_disable = 1;
	neogeo_z80_time_to_execute = 0;
	neogeo_audio_command = 0;
	neogeo_audio_result = 0;
	neogeo_z80_time_this_vbl = 0;

	/* Reset the YM2610 */
	YM2610Reset();

	/* Speed limiter init */
	neogeo_speed_limiter_setup();

	/* Audio init */
	neogeo_audio_setup();
}
コード例 #10
0
void m68020_reset(void* param)
{
	m68k_set_cpu_type(M68K_CPU_TYPE_68020);
	m68k_pulse_reset();
}
コード例 #11
0
ファイル: main.c プロジェクト: e8johan/tosemu
int main(int argc, char **argv)
{
    int binary_file;
    void *binary_data;
    struct stat sb;
    struct tos_environment te;
    int argb = 1;
    
    verbose = 0;
    
    /* Program usage */
    if (argc < 2)
    {
        printf("Usage: tosemu [-v] <binary> [<args>]\n\n\t<binary> name of binary to execute\n");
        return -1;
    }
    
    /* Check if we want to be verbose */
    if (argc >= 3 && strcmp("-v", argv[1]) == 0)
    {
        verbose = -1;
        argb++;
    }

    /* Open the provided file */
    binary_file = open(argv[argb], O_RDONLY);
    if (binary_file == -1)
    {
        printf("Error: failed to open '%s'\n", argv[argc-1]);
        return -1;
    }
    
    /* Determine the file size */
    fstat(binary_file, &sb);
    
    /* Mmap the file into memory */
    binary_data = mmap(NULL, sb.st_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, binary_file, 0);
    if (!binary_data)
    {
        printf("Error: failed to mmap '%s'\n", argv[argc-1]);
        close(binary_file);
        return -1;
    }
    
    /* Check that the binary starts with the magix 0x601a sequence */
    if( ((char*)binary_data)[0] != 0x60 || ((char*)binary_data)[1] != 0x1a)
    {
        printf("Error: invalid magic in '%s'\n", argv[argc-1]);
        close(binary_file);
        return -1;
    }
    
    argb++;
    argv += argb;
    argc -= argb;

    /* Setup a TOS environment for the binary */
    if (init_tos_environment(&te, binary_data, sb.st_size, argc, argv))
    {
        printf("Error: failed to initialize TOS environment\n");
        close(binary_file);
        return -1;
    }
    
    /* Close the binary file */
    close(binary_file);

    /* Start execution */

    /* TODO init cpu */
    m68k_init();
    m68k_set_cpu_type(M68K_CPU_TYPE_68000);
    m68k_pulse_reset();

    /* TODO is this really correct, or should it be the MSP? If so, why does that not work? */
    m68k_set_reg(M68K_REG_ISP, 0x600); /* supervisor stack pointer */
    m68k_set_reg(M68K_REG_USP, te.size-4); /* user stack pointer */
    m68k_write_memory_32(te.size, 0x800); /* big endian 0x800 */
    m68k_set_reg(M68K_REG_PC, 0x900); /* Set PC to the binary entry point */
    disable_supervisor_mode();
    
    /* TODO exec */
    while (keepongoing) {
        m68k_execute(1);
    }
  
    /* Clean up */
    free_tos_environment(&te);
    
    return 0; 
}
コード例 #12
0
ファイル: m68000.c プロジェクト: felipeota/cps2emu-rpi
void m68000_reset(void)
{
	irq_state = CLEAR_LINE;
	m68k_pulse_reset();
}