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); } }
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(); }
inline void M68K_Reset(void) { #ifdef CPU68K_USE_MUSASHI m68k_pulse_reset(); #endif #ifdef CPU68K_USE_C68K C68k_Reset(&C68K); #endif }
// 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(); }
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 }
// 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; }
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 }
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(); }
/*------------------------------------------------------------------------- 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(); }
void m68020_reset(void* param) { m68k_set_cpu_type(M68K_CPU_TYPE_68020); m68k_pulse_reset(); }
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; }
void m68000_reset(void) { irq_state = CLEAR_LINE; m68k_pulse_reset(); }