/*
* HalfNES by Andrew Hoffman
* Licensed under the GNU GPL Version 3. See LICENSE file
*/
package com.grapeshot.halfnes.mappers;
/**
* Speed optimization for NROM games: copy everything to linear mapping and
* don't use the bankswitching capability at all
*
* thanks to Stephen Chin - steveonjava@gmail.com
*/
public class NromMapper extends Mapper {
@Override
public void loadrom() throws BadMapperException {
super.loadrom();
//copy the whole rom around so we need to do less math
int[] shiftedprg = new int[65536];
System.arraycopy(prg, 0, shiftedprg, 0x8000, prg.length);
if (prgsize <= 16384) {
//double up the rom if 16k
System.arraycopy(prg, 0, shiftedprg, 0xc000, prg.length);
}
prg = shiftedprg;
}
@Override
public int cartRead(final int addr) {
if (addr >= 0x8000) {
return prg[addr];
} else if (addr >= 0x6000 && hasprgram) {
return prgram[addr & 0x1fff];
}
return addr >> 8; //open bus
}
@Override
public int ppuRead(int addr) {
if (addr < 0x2000) {
//math is hard let's go shopping
return chr[addr];
} else {
switch (addr & 0xc00) {
case 0:
return nt0[addr & 0x3ff];
case 0x400:
return nt1[addr & 0x3ff];
case 0x800:
return nt2[addr & 0x3ff];
case 0xc00:
default:
if (addr >= 0x3f00) {
addr &= 0x1f;
if (addr >= 0x10 && ((addr & 3) == 0)) {
addr -= 0x10;
}
return ppu.pal[addr];
} else {
return nt3[addr & 0x3ff];
}
}
}
}
}