/* * 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)); } } }