static WRITE8_HANDLER(pcat_nit_rombank_w) { logerror( "rom bank #%02x at PC=%08X\n", data, cpu_get_pc(space->cpu) ); if ( data & 0x40 ) { // rom bank memory_install_read_bank(space, 0x000d8000, 0x000dffff, 0, 0, "rombank" ); memory_unmap_write(space, 0x000d8000, 0x000dffff, 0, 0); if ( data & 0x80 ) { memory_set_bank(space->machine, "rombank", (data & 0x3f) | 0x40 ); } else { memory_set_bank(space->machine, "rombank", data & 0x3f ); } } else { // nvram bank memory_unmap_read(space, 0x000d8000, 0x000dffff, 0, 0); memory_unmap_write(space, 0x000d8000, 0x000dffff, 0, 0); memory_install_read_bank(space, 0x000d8000, 0x000d9fff, 0, 0, "nvrambank" ); memory_install_write_bank(space, 0x000d8000, 0x000d9fff, 0, 0, "nvrambank" ); memory_set_bankptr(space->machine, "nvrambank", space->machine->generic.nvram.u8); } }
static WRITE8_DEVICE_HANDLER( arcadia_cia_0_porta_w ) { /* switch banks as appropriate */ memory_set_bank(device->machine, "bank1", data & 1); /* swap the write handlers between ROM and bank 1 based on the bit */ if ((data & 1) == 0) /* overlay disabled, map RAM on 0x000000 */ memory_install_write_bank(cputag_get_address_space(device->machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x000000, 0x07ffff, 0, 0, "bank1"); else /* overlay enabled, map Amiga system ROM on 0x000000 */ memory_unmap_write(cputag_get_address_space(device->machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x000000, 0x07ffff, 0, 0); /* bit 2 = Power Led on Amiga */ set_led_status(device->machine, 0, (data & 2) ? 0 : 1); }
static void update_memory_mapping(running_machine *machine, struct memory_mapper_chip *chip, int decrypt) { int rgnum; if (LOG_MEMORY_MAP) mame_printf_debug("----\nRemapping:\n"); /* first reset everything back to the beginning */ memory_install_readwrite16_handler(cpu_get_address_space(chip->cpu, ADDRESS_SPACE_PROGRAM), 0x000000, 0xffffff, 0, 0, segaic16_memory_mapper_lsb_r, segaic16_memory_mapper_lsb_w); /* loop over the regions */ for (rgnum = 0; chip->map[rgnum].regbase != 0; rgnum++) { static const offs_t region_size_map[4] = { 0x00ffff, 0x01ffff, 0x07ffff, 0x1fffff }; const segaic16_memory_map_entry *rgn = &chip->map[rgnum]; offs_t region_size = region_size_map[chip->regs[rgn->regbase] & 3]; offs_t region_base = (chip->regs[rgn->regbase + 1] << 16) & ~region_size; offs_t region_mirror = rgn->mirror & region_size; offs_t region_start = region_base + (rgn->regoffs & region_size); offs_t region_end = region_start + ((rgn->length - 1 < region_size) ? rgn->length - 1 : region_size); const char *writebank = rgn->writebank; write16_space_func write = rgn->write; const char *readbank = rgn->readbank; read16_space_func read = rgn->read; /* ROM areas need extra clamping */ if (rgn->romoffset != ~0) { offs_t romsize = chip->cpu->region()->bytes(); if (region_start >= romsize) read = NULL; else if (region_start + rgn->length > romsize) region_end = romsize - 1; } /* map it */ if (read != NULL) memory_install_read16_handler(cpu_get_address_space(chip->cpu, ADDRESS_SPACE_PROGRAM), region_start, region_end, 0, region_mirror, read); else if (readbank != NULL) memory_install_read_bank(cpu_get_address_space(chip->cpu, ADDRESS_SPACE_PROGRAM), region_start, region_end, 0, region_mirror, readbank); if (write != NULL) memory_install_write16_handler(cpu_get_address_space(chip->cpu, ADDRESS_SPACE_PROGRAM), region_start, region_end, 0, region_mirror, write); else if (writebank != NULL) memory_install_write_bank(cpu_get_address_space(chip->cpu, ADDRESS_SPACE_PROGRAM), region_start, region_end, 0, region_mirror, writebank); /* set the bank pointer */ if (readbank != NULL) { if (rgn->base != NULL) { memory_configure_bank(machine, readbank, 0, 1, *rgn->base, 0); memory_set_bank(machine, readbank, 0); } else if (rgn->romoffset != ~0) { UINT8 *decrypted = NULL; if (decrypt) { decrypted = (UINT8 *)fd1094_get_decrypted_base(); if (!decrypted) decrypted = (UINT8 *)fd1089_get_decrypted_base(); } memory_configure_bank(machine, readbank, 0, 1, chip->cpu->region()->base() + region_start, 0); if (decrypted) memory_configure_bank_decrypted(machine, readbank, 0, 1, decrypted + region_start, 0); memory_set_bank(machine, readbank, 0); } } if (LOG_MEMORY_MAP) mame_printf_debug(" %06X-%06X (%06X) = %s\n", region_start, region_end, region_mirror, rgn->name); } }