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