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); }
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)); } }