@Override public final void cartWrite(final int addr, final int data) { if (addr < 0x8000 || addr > 0xffff) { super.cartWrite(addr, data); return; } int prgselect = (byte) (data & 0xF); // remap PRG bank for (int i = 0; i < 16; ++i) { prg_map[16 + i] = (1024 * (i + 16 * prgselect)) & (prgsize - 1); } int mirroring = data >> 6; switch (mirroring) { case 0: setmirroring(MirrorType.SS_MIRROR0); break; case 1: setmirroring(MirrorType.H_MIRROR); break; case 2: setmirroring(MirrorType.V_MIRROR); break; case 3: setmirroring(MirrorType.SS_MIRROR1); break; } }
@Override public final void cartWrite(final int addr, final int data) { // System.out.println(data); if (addr < 0x8000 || addr > 0xffff) { super.cartWrite(addr, data); return; } int prgselect = data & 7; int chrselect = (data >> 4) & 0xf; if (crc == 0x42392440) // Cosmo Carrier { setmirroring(((data & (utils.BIT3)) != 0) ? MirrorType.SS_MIRROR1 : MirrorType.SS_MIRROR0); } else { setmirroring(((data & (utils.BIT3)) != 0) ? MirrorType.V_MIRROR : MirrorType.H_MIRROR); } // remap CHR bank for (int i = 0; i < 8; ++i) { chr_map[i] = (1024 * (i + 8 * chrselect)) & (chrsize - 1); } // remap PRG bank for (int i = 0; i < 16; ++i) { prg_map[i] = (1024 * (i + 16 * prgselect)) & (prgsize - 1); } }
@Override public final void cartWrite(final int addr, final int data) { if (addr < 0x8000 || addr > 0xffff) { super.cartWrite(addr, data); return; } // remap all 32k of PRG to 32 x bank # for (int i = 0; i < 32; ++i) { prg_map[i] = (1024 * (i + (32 * (data & 15)))) & (prgsize - 1); } setmirroring(((data & (utils.BIT4)) != 0) ? MirrorType.SS_MIRROR1 : MirrorType.SS_MIRROR0); }
@Override public final void cartWrite(final int addr, final int data) { if (addr < 0x8000 || addr > 0xffff) { super.cartWrite(addr, data); return; } final boolean bit0 = utils.getbit(addr, registers[0]); final boolean bit1 = utils.getbit(addr, registers[1]); switch (addr >> 12) { case 0x8: // 8000-8003: prg bank 0 select prgbank0 = data; setbanks(); break; case 0x9: case 0xa: // sound registers here sndchip.write((addr & 0xf000) + (bit1 ? 2 : 0) + (bit0 ? 1 : 0), data); break; case 0xc: // c000-c003: prg bank 1 select prgbank1 = data; setbanks(); break; case 0xb: if (bit0 && bit1) { // mirroring select switch ((data >> 2) & 3) { case 0: setmirroring(Mapper.MirrorType.V_MIRROR); break; case 1: setmirroring(Mapper.MirrorType.H_MIRROR); break; case 2: setmirroring(Mapper.MirrorType.SS_MIRROR0); break; case 3: setmirroring(Mapper.MirrorType.SS_MIRROR1); break; } } else { // expansion sound register here as well sndchip.write((addr & 0xf000) + (bit1 ? 2 : 0) + (bit0 ? 1 : 0), data); } break; case 0xd: // character bank selects chrbank[(bit1 ? 2 : 0) + (bit0 ? 1 : 0)] = data; setbanks(); break; case 0xe: chrbank[(bit1 ? 2 : 0) + (bit0 ? 1 : 0) + 4] = data; setbanks(); break; case 0xf: // irq control if (!bit1) { if (!bit0) { irqreload = data; } else { irqack = utils.getbit(data, 0); irqenable = utils.getbit(data, 1); irqmode = utils.getbit(data, 2); if (irqenable) { irqcounter = irqreload; prescaler = 341; } if (firedinterrupt) { --cpu.interrupt; } firedinterrupt = false; } } else { if (!bit0) { irqenable = irqack; if (firedinterrupt) { --cpu.interrupt; } firedinterrupt = false; } } } }
@Override public final void cartWrite(final int addr, final int data) { if (addr < 0x8000 || addr > 0xFFFF) { super.cartWrite(addr, data); return; } else if (addr <= 0x9FFF) { switch (addr & 3) { case 0: prgbank0 = data; setbanks(); break; case 1: prgbank1 = data; setbanks(); break; case 2: chrbank[0] = data; setbanks(); break; case 3: chrbank[1] = data; setbanks(); break; } } else if (addr <= 0xBFFF) { switch (addr & 3) { case 0: chrbank[2] = data; setbanks(); break; case 1: chrbank[3] = data; setbanks(); break; case 2: chrbank[4] = data; setbanks(); break; case 3: chrbank[5] = data; setbanks(); break; } } else if (addr <= 0xDFFF) { switch (addr & 3) { case 0: // value written here used to reload irq counter _@ end of scanline_ irqctrreload = data & 0xFF; irqreload = true; break; case 1: // any value here reloads irq counter irqctr = data; irqreload = true; break; case 2: // any value here enables interrupts irqenable = true; break; case 3: // any value here disables IRQ and acknowledges if (interrupted) { --cpu.interrupt; } interrupted = false; irqenable = false; irqctr = irqctrreload; break; } } else if (addr <= 0xFFFF) { switch (addr & 3) { case 0: setmirroring(utils.getbit(data, 6) ? MirrorType.H_MIRROR : MirrorType.V_MIRROR); break; } } }