//--------------------------------------------------------------------------- void z80_init(void) { subcpu_context.z80Base = subcpu_memspace; subcpu_context.z80IoRead = ReadPorts; subcpu_context.z80IoWrite = WritePorts; subcpu_context.z80MemRead = MemRead; subcpu_context.z80MemWrite = MemWrite; mz80SetContext((void *)&subcpu_context); mz80init(); mz80reset(); // Let Z80 do its initialization mz80exec(z80_cycles); // 1 vblank }
/**************************************************************************** * neogeo_runframe * * This function will run a complete video frame for NeoCD. * CPU initialization etc is performed in neocd.c as usual. ****************************************************************************/ void neogeo_runframe (void) { int cycles; if (!inited) { memset (&CPU_Z80, 0, sizeof (CPU)); memset (&CPU_M68K, 0, sizeof (CPU)); CPU_Z80.total_cycles = 0.0; CPU_M68K.total_cycles = 0.0; inited = 1; } /*** Set CPU cycles for this frame ***/ CPU_Z80.cycles_frame = Z80FRAME + CPU_Z80.boost; CPU_M68K.cycles_frame = M68FRAME + CPU_M68K.boost; /*** Set CPU cycles for scanline ***/ CPU_Z80.cycles_scanline = ((CPU_Z80.cycles_frame) / TIMESLICE); CPU_M68K.cycles_scanline = (CPU_M68K.cycles_frame) / TIMESLICE; /*** Clear done cycles ***/ CPU_Z80.cycles_done = CPU_M68K.cycles_done = 0; for (scanline = TIMESLICE - 1; scanline >= 0; scanline--) { /*** Run M68K ***/ if (CPU_M68K.cycles_done < CPU_M68K.cycles_frame) { if (scanline) cycles = m68k_execute (CPU_M68K.cycles_scanline); else cycles = m68k_execute (CPU_M68K.cycles_frame - CPU_M68K.cycles_done); CPU_M68K.cycles_done += cycles; CPU_M68K.total_cycles += cycles; } /*** Run Z80 ***/ if ((CPU_Z80.cycles_done < CPU_Z80.cycles_frame) && ( cpu_enabled)) { if (scanline) cycles = mz80exec (CPU_Z80.cycles_scanline); else cycles = mz80exec (CPU_Z80.cycles_frame - CPU_Z80.cycles_done); CPU_Z80.cycles_done += cycles; CPU_Z80.total_cycles += cycles; my_timer (); } switch (raster_interrupt_enabled) { case 0: neogeo_interrupt (); break; case 1: neogeo_raster_interrupt (); break; case 2: neogeo_raster_interrupt_busy (); break; } } /*** Adjust processors ***/ CPU_Z80.total_time_us = (CPU_Z80.total_cycles * Z80_USEC); CPU_M68K.total_time_us = (CPU_M68K.total_cycles * M68K_USEC); CPU_Z80.boost = CPU_M68K.boost = 0; if (CPU_Z80.total_time_us > CPU_M68K.total_time_us) CPU_M68K.boost = (int) ((double) M68SEC * (CPU_Z80.total_time_us - CPU_M68K.total_time_us)); else CPU_Z80.boost = (int) ((double) Z80SEC * (CPU_M68K.total_time_us - CPU_Z80.total_time_us)); }