/*
* HalfNES by Andrew Hoffman
* Licensed under the GNU GPL Version 3. See LICENSE file
*/
package com.grapeshot.halfnes;
import com.grapeshot.halfnes.cheats.Patch;
import com.grapeshot.halfnes.mappers.Mapper;
import java.util.Arrays;
import java.util.HashMap;
/**
*
* @author Andrew Hoffman
*
*
*/
public class CPURAM {
private final int[] wram = new int[2048];
Mapper mapper;
public APU apu;
PPU ppu; //need these to call their write handlers from here.
private HashMap<Integer, Patch> patches = new HashMap<>();
public CPURAM(final Mapper mappy) {
mapper = mappy;
// init memory
Arrays.fill(wram, 0xff);
}
public final int read(final int addr) {
if (!patches.isEmpty()) {
int retval = _read(addr);
Patch p = patches.get(addr);
if (p != null && p.getAddress() == addr && p.matchesData(retval)) {
return p.getData();
}
return retval;
} else {
return _read(addr);
}
}
public final int _read(final int addr) {
if (addr > 0x4018) {
return mapper.cartRead(addr);
} else if (addr <= 0x1fff) {
return wram[addr & 0x7FF];
} else if (addr <= 0x3fff) {
// 8 byte ppu regs; mirrored lots
return ppu.read(addr & 7);
} else if (0x4000 <= addr && addr <= 0x4018) {
return apu.read(addr - 0x4000);
} else {
return addr >> 8; //open bus
}
}
public final void write(final int addr, final int data) {
// if((data & 0xff) != data){
// System.err.println("DANGER WILL ROBINSON");
// }
if (addr > 0x4018) {
mapper.cartWrite(addr, data);
} else if (addr <= 0x1fff) {
wram[addr & 0x7FF] = data;
} else if (addr <= 0x3fff) {
// 8 byte ppu regs; mirrored lots
ppu.write(addr & 7, data);
} else if (0x4000 <= addr && addr <= 0x4018) {
apu.write(addr - 0x4000, data);
}
}
public void setAPU(APU apu) {
this.apu = apu;
}
public void setPPU(PPU ppu) {
this.ppu = ppu;
}
public void setPatches(HashMap<Integer, Patch> p) {
this.patches = p;
}
}