/*
* HalfNES by Andrew Hoffman
* Licensed under the GNU GPL Version 3. See LICENSE file
*/
package com.grapeshot.halfnes.mappers;
import com.grapeshot.halfnes.utils;
/**
*
* @author Andrew
*/
public class Action52Mapper extends Mapper {
int[] ram = new int[4];
int prgchip = 0;
int prgpage = 0;
int chrpage = 0;
boolean prgmode = false;
@Override
public void loadrom() throws BadMapperException {
super.loadrom();
cartWrite(0x8000, 0);
}
@Override
public final void cartWrite(final int addr, final int data) {
if (addr <= 0x5fff) {
ram[addr & 3] = data & 0xf;
} else if (addr >= 0x8000) {
chrpage = ((addr & 0xf) << 2) + (data & 3);
prgmode = ((addr & (utils.BIT5)) != 0);
prgpage = (addr >> 6) & 0x1f;
prgchip = (addr >> 11) & 3;
setmirroring((((addr & (utils.BIT13)) != 0)) ? MirrorType.H_MIRROR : MirrorType.V_MIRROR);
for (int i = 0; i < 8; ++i) {
chr_map[i] = (1024 * (chrpage * 8 + i)) % chrsize;
}
int off = 0;
switch (prgchip) {
case 0:
off = 0;
break;
case 1:
off = 0x080000;
break;
case 3:
off = 0x100000;
break;
default:
System.err.println("Who knows.");
}
if (prgmode) {
for (int i = 0; i < 16; ++i) {
prg_map[i] = ((1024 * ((16 * prgpage) + i)) + off) % prgsize;
prg_map[i + 16] = ((1024 * ((16 * prgpage) + i)) + off) % prgsize;
}
} else {
for (int i = 0; i < 32; ++i) {
prg_map[i] = ((1024 * ((32 * (prgpage >> 1)) + i)) + off) % prgsize;
}
}
}
}
@Override
public final int cartRead(final int addr) {
// by default has wram at 0x6000 and cartridge at 0x8000-0xfff
// but some mappers have different so override for those
if (addr >= 0x8000) {
return prg[prg_map[((addr & 0x7fff)) >> 10] + (addr & 1023)];
} else if (addr < 0x6000) {
return ram[addr & 3] & 0xf;
}
return addr >> 8; //open bus
}
public void reset() {
cartWrite(0x8000, 0);
}
}