Exemple #1
0
static void apple3_update_memory(void)
{
	UINT16 bank;
	UINT8 page;

	if (LOG_MEMORY)
	{
		logerror("apple3_update_memory(): via_0_b=0x%02x via_1_a=0x0x%02x\n", via_0_b, via_1_a);
	}

	cpunum_set_clock(0, (via_0_a & 0x80) ? 1000000 : 2000000);

	/* bank 2 (0100-01FF) */
	if (!(via_0_a & 0x04))
	{
		if (via_0_b < 0x20)
		{
			bank = ~0;	/* system bank */
			page = via_0_b ^ 0x01;
		}
		else if (via_0_b >= 0xA0)
		{
			bank = ~0;	/* system bank */
			page = (via_0_b ^ 0x01) - 0x80;
		}
		else
		{
			bank = via_1_a;
			page = (via_0_b ^ 0x01) - 0x20;
		}
	}
	else
	{
		bank = ~0;
		page = 0x01;
	}
	apple3_setbank(2, bank, ((offs_t) page) * 0x100);

	/* bank 3 (0200-1FFF) */
	apple3_setbank(3, ~0, 0x0200);

	/* bank 4 (2000-9FFF) */
	apple3_setbank(4, via_1_a, 0x0000);

	/* bank 5 (A000-BFFF) */
	apple3_setbank(5, ~0, 0x2000);

	/* install bank 8 (C000-CFFF) */
	if (via_0_a & 0x40)
	{
		memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0xC000, 0xC0FF, 0, 0, apple3_c0xx_r);
		memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xC000, 0xC0FF, 0, 0, apple3_c0xx_w);
	}
	else 
	{
		memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0xC000, 0xC0FF, 0, 0, MRA8_BANK8);
		if (via_0_a & 0x08)
			memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xC000, 0xC0FF, 0, 0, MWA8_ROM);
		else
			memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xC000, 0xC0FF, 0, 0, MWA8_BANK8);
		apple3_setbank(8, ~0, 0x4000);
	}

	/* install bank 9 (C100-C4FF) */
	if (via_0_a & 0x40)
	{
		memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0xC100, 0xC4FF, 0, 0, MRA8_NOP);
		memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xC100, 0xC4FF, 0, 0, MWA8_NOP);
	}
	else
	{
		memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0xC100, 0xC4FF, 0, 0, MRA8_BANK9);
		if (via_0_a & 0x08)
			memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xC100, 0xC4FF, 0, 0, MWA8_ROM);
		else
			memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xC100, 0xC4FF, 0, 0, MWA8_BANK9);
		apple3_setbank(9, ~0, 0x4100);
	}

	/* install bank 10 (C500-C7FF) */
	memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0xC500, 0xC7FF, 0, 0, MRA8_BANK10);
	if (via_0_a & 0x08)
		memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xC500, 0xC7FF, 0, 0, MWA8_ROM);
	else
		memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xC500, 0xC7FF, 0, 0, MWA8_BANK10);
	apple3_setbank(10, ~0, 0x4500);

	/* install bank 11 (C800-CFFF) */
	if (via_0_a & 0x40)
	{
		memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0xC800, 0xCFFF, 0, 0, MRA8_NOP);
		memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xC800, 0xCFFF, 0, 0, MWA8_NOP);
	}
	else
	{
		memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0xC800, 0xCFFF, 0, 0, MRA8_BANK11);
		if (via_0_a & 0x08)
			memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xC800, 0xCFFF, 0, 0, MWA8_ROM);
		else
			memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xC800, 0xCFFF, 0, 0, MWA8_BANK11);
		apple3_setbank(11, ~0, 0x4800);
	}

	/* install bank 6 (D000-EFFF) */
	memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0xD000, 0xEFFF, 0, 0, MRA8_BANK6);
	if (via_0_a & 0x08)
		memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xD000, 0xEFFF, 0, 0, MWA8_ROM);
	else
		memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xD000, 0xEFFF, 0, 0, MWA8_BANK6);
	apple3_setbank(6, ~0, 0x5000);

	/* install bank 7 (F000-FFFF) */
	memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0xF000, 0xFFFF, 0, 0, MRA8_BANK7);
	if (via_0_a & 0x09)
		memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xF000, 0xFFFF, 0, 0, MWA8_ROM);
	else
		memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xF000, 0xFFFF, 0, 0, MWA8_BANK7);
	if (via_0_a & 0x01)
		memory_set_bankptr(7, memory_region(REGION_CPU1));
	else
		apple3_setbank(7, ~0, 0x7000);

	/* reinstall VIA handlers */
	memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0xFFD0, 0xFFDF, 0, 0, via_0_r);
	memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xFFD0, 0xFFDF, 0, 0, via_0_w);
	memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0xFFE0, 0xFFEF, 0, 0, via_1_r);
	memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xFFE0, 0xFFEF, 0, 0, via_1_w);
}
Exemple #2
0
static void apple3_update_memory(running_machine &machine)
{
    apple3_state *state = machine.driver_data<apple3_state>();
    UINT16 bank;
    UINT8 page;
    address_space& space = machine.device("maincpu")->memory().space(AS_PROGRAM);

    if (LOG_MEMORY)
    {
        logerror("apple3_update_memory(): via_0_b=0x%02x via_1_a=0x0x%02x\n", state->m_via_0_b, state->m_via_1_a);
    }

    machine.device("maincpu")->set_unscaled_clock((state->m_via_0_a & 0x80) ? 1000000 : 2000000);

    /* bank 2 (0100-01FF) */
    if (!(state->m_via_0_a & 0x04))
    {
        if (state->m_via_0_b < 0x20)
        {
            bank = ~0;  /* system bank */
            page = state->m_via_0_b ^ 0x01;
        }
        else if (state->m_via_0_b >= 0xA0)
        {
            bank = ~0;  /* system bank */
            page = (state->m_via_0_b ^ 0x01) - 0x80;
        }
        else
        {
            bank = state->m_via_1_a;
            page = (state->m_via_0_b ^ 0x01) - 0x20;
        }
    }
    else
    {
        bank = ~0;
        page = 0x01;
    }
    apple3_setbank(machine,"bank2", bank, ((offs_t) page) * 0x100);

    /* bank 3 (0200-1FFF) */
    apple3_setbank(machine,"bank3", ~0, 0x0200);

    /* bank 4 (2000-9FFF) */
    apple3_setbank(machine,"bank4", state->m_via_1_a, 0x0000);

    /* bank 5 (A000-BFFF) */
    apple3_setbank(machine,"bank5", ~0, 0x2000);

    /* install bank 8 (C000-CFFF) */
    if (state->m_via_0_a & 0x40)
    {
        space.install_read_handler(0xC000, 0xC0FF, read8_delegate(FUNC(apple3_state::apple3_c0xx_r),state));
        space.install_write_handler(0xC000, 0xC0FF, write8_delegate(FUNC(apple3_state::apple3_c0xx_w),state));
    }
    else
    {
        space.install_read_bank(0xC000, 0xC0FF, "bank8");
        if (state->m_via_0_a & 0x08)
            space.unmap_write(0xC000, 0xC0FF);
        else
            space.install_write_bank(0xC000, 0xC0FF, "bank8");
        apple3_setbank(machine,"bank8", ~0, 0x4000);
    }

    /* install bank 9 (C100-C4FF) */
    if (state->m_via_0_a & 0x40)
    {
        space.nop_readwrite(0xC100, 0xC4FF);
    }
    else
    {
        space.install_read_bank(0xC100, 0xC4FF, "bank9");
        if (state->m_via_0_a & 0x08)
            space.unmap_write(0xC100, 0xC4FF);
        else
            space.install_write_bank(0xC100, 0xC4FF, "bank9");
        apple3_setbank(machine,"bank9", ~0, 0x4100);
    }

    /* install bank 10 (C500-C7FF) */
    space.install_read_bank(0xC500, 0xC7FF, "bank10");
    if (state->m_via_0_a & 0x08)
        space.unmap_write(0xC500, 0xC7FF);
    else
        space.install_write_bank(0xC500, 0xC7FF, "bank10");
    apple3_setbank(machine,"bank10", ~0, 0x4500);

    /* install bank 11 (C800-CFFF) */
    if (state->m_via_0_a & 0x40)
    {
        space.nop_readwrite(0xC800, 0xCFFF);
    }
    else
    {
        space.install_read_bank(0xC800, 0xCFFF, "bank11");
        if (state->m_via_0_a & 0x08)
            space.unmap_write(0xC800, 0xCFFF);
        else
            space.install_write_bank(0xC800, 0xCFFF, "bank11");
        apple3_setbank(machine,"bank11", ~0, 0x4800);
    }

    /* install bank 6 (D000-EFFF) */
    space.install_read_bank(0xD000, 0xEFFF, "bank6");
    if (state->m_via_0_a & 0x08)
        space.unmap_write(0xD000, 0xEFFF);
    else
        space.install_write_bank(0xD000, 0xEFFF, "bank6");
    apple3_setbank(machine,"bank6", ~0, 0x5000);

    /* install bank 7 (F000-FFFF) */
    space.install_read_bank(0xF000, 0xFFFF, "bank7");
    if (state->m_via_0_a & 0x09)
        space.unmap_write(0xF000, 0xFFFF);
    else
        space.install_write_bank(0xF000, 0xFFFF, "bank7");
    if (state->m_via_0_a & 0x01)
        state->membank("bank7")->set_base(machine.root_device().memregion("maincpu")->base());
    else
        apple3_setbank(machine,"bank7", ~0, 0x7000);

    /* reinstall VIA handlers */
    {
        via6522_device *via_0 = space.machine().device<via6522_device>("via6522_0");
        via6522_device *via_1 = space.machine().device<via6522_device>("via6522_1");

        space.install_readwrite_handler(0xFFD0, 0xFFDF, 0, 0, read8_delegate(FUNC(via6522_device::read),via_0), write8_delegate(FUNC(via6522_device::write),via_0));
        space.install_readwrite_handler(0xFFE0, 0xFFEF, 0, 0, read8_delegate(FUNC(via6522_device::read),via_1), write8_delegate(FUNC(via6522_device::write),via_1));
    }
}