/*
* 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
*/
//TQROM mapper
//mmc3 derivative with chr ram and rom
public class Mapper119 extends MMC3Mapper {
int[] chrRam = new int[8192];
@Override
public int ppuRead(final int addr) {
if (addr < 0x2000) {
checkA12(addr);
return (chr_map[addr >> 10] > 65535)
? chrRam[(chr_map[addr >> 10] + (addr & 1023)) & 8191]
: chr[(chr_map[addr >> 10] & 65535) + (addr & 1023)];
} else {
return super.ppuRead(addr);
}
}
@Override
public void ppuWrite(final int addr, final int data) {
if (addr < 0x2000) {
checkA12(addr);
if (chr_map[addr >> 10] > 63) {
chrRam[(chr_map[addr >> 10] + (addr & 1023)) & 8191] = data;
}
} else {
super.ppuWrite(addr, data);
}
}
@Override
public void loadrom() throws BadMapperException {
//needs to be in every mapper. Fill with initial cfg
super.loadrom();
//on startup:
for (int i = 0; i < 8; ++i) {
prg_map[i] = (1024 * i);
prg_map[i + 8] = (1024 * i);
//yes this actually matters; MMC3 does NOT start up in a random state
//(at least Smash TV and TMNT3 expect certain banks w/o even setting up mapper)
}
for (int i = 1; i <= 32; ++i) {
prg_map[32 - i] = prgsize - (1024 * i);
}
for (int i = 0; i < 8; ++i) {
chr_map[i] = 0;
}
setbank6();
//cpuram.setPrgRAMEnable(false);
}
protected void setppubank(int banksize, int bankpos, int banknum) {
for (int i = 0; i < banksize; ++i) {
chr_map[i + bankpos] = (1024 * ((banknum) + i));
}
}
}