Ejemplo n.º 1
0
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);
    }
}
Ejemplo n.º 2
0
void gen_zreset_w(unsigned int data, unsigned int cycles)
{
    if (data)  /* !ZRESET released */
    {
        /* check if Z80 is going to be restarted */
        if (zstate == 0)
        {
            /* resynchronize with 68k */
            mcycles_z80 = cycles;

            /* reset Z80 & YM2612 */
            z80_reset();
            fm_reset(cycles);
        }

        /* check if 68k access to Z80 bus is granted */
        else if (zstate == 2)
        {
            /* enable 68k access to Z80 bus */
            _m68k_memory_map *base = &m68k_memory_map[0xa0];
            base->read8   = z80_read_byte;
            base->read16  = z80_read_word;
            base->write8  = z80_write_byte;
            base->write16 = z80_write_word;

            /* reset Z80 & YM2612 */
            z80_reset();
            fm_reset(cycles);
        }

        /* update Z80 bus status */
        zstate |= 1;
    }
    else  /* !ZRESET asserted */
    {
        /* check if Z80 is going to be stopped */
        if (zstate == 1)
        {
            /* resynchronize with 68k */
            z80_run(cycles);
        }

        /* check if 68k had access to Z80 bus */
        else if (zstate == 3)
        {
            /* disable 68k access to Z80 bus */
            _m68k_memory_map *base = &m68k_memory_map[0xa0];
            base->read8   = m68k_read_bus_8;
            base->read16  = m68k_read_bus_16;
            base->write8  = m68k_unused_8_w;
            base->write16 = m68k_unused_16_w;
        }

        /* stop YM2612 */
        fm_reset(cycles);

        /* update Z80 bus status */
        zstate &= 2;
    }
}
Ejemplo n.º 3
0
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();
}