Пример #1
0
//---------------------------------------------------------------------------
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
}
Пример #2
0
/****************************************************************************
* 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));

}