/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.grapeshot.halfnes.mappers;
import com.grapeshot.halfnes.utils;
/**
*
* @author Andrew
*/
public class Mapper31 extends Mapper {
//mapper for NSF compilations, based on BNROM with NSF type bankswitch
//written in about 20mins so i could listen to 2a03puritans
public boolean nsfBanking;
public int[] nsfBanks = {00, 00, 00, 00, 00, 00, 00, 0xff};
@Override
public void loadrom() throws BadMapperException {
// needs to be in every mapper. Fill with initial cfg
super.loadrom();
setBanks();
}
@Override
public void cartWrite(final int addr, final int data) {
if (addr >= 0x6000 && addr < 0x8000) {
//default no-mapper operation just writes if in PRG RAM range
prgram[addr & 0x1fff] = data;
} else if ((addr >= 0x5000) && (addr < 0x6000)) {
nsfBanks[addr & 7] = data;
//System.err.println(addr - 0x5ff8 + " " + data);
setBanks();
} else {
System.err.println("write to " + utils.hex(addr) + " goes nowhere");
}
}
@Override
public 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) {
int fuuu = prg_map[((addr & 0x7fff)) >> 10] + (addr & 1023);
return prg[fuuu];
} else if (addr >= 0x6000 && hasprgram) {
return prgram[addr & 0x1fff];
} else if ((addr >= 0x5000)) {
return nsfBanks[addr & 7];
}
System.err.println("reading open bus " + utils.hex(addr));
return addr >> 8; //open bus
}
private void setBanks() {
for (int i = 0; i < prg_map.length; ++i) {
prg_map[i] = (4096 * nsfBanks[i / 4]) + (1024 * (i % 4));
if ((prg_map[i]) >= prg.length) {
// System.err.println("broken banks");
prg_map[i] &= ((this.prgsize) - 1);
}
}
}
}