millfork/src/test/java/com/grapeshot/halfnes/CPURAM.java

76 lines
2.1 KiB
Java

package com.grapeshot.halfnes;
import com.grapeshot.halfnes.mappers.Mapper;
import millfork.output.MemoryBank;
/**
* Since the original CPURAM class was a convoluted mess of dependencies,
* I overrode it with mine that has only few pieces of junk glue to make it work
* @author Karol Stasiak
*/
@SuppressWarnings("unused")
public class CPURAM {
private final MemoryBank mem;
// required by the CPU class for some reason
public Mapper mapper = new Mapper() {
@Override
public TVType getTVType() {
// the base class returns null, but this can't be null
return TVType.DENDY;
}
};
// required by the CPU class for some reason
public APU apu = new APU(null, null, this);
public CPURAM(MemoryBank mem) {
boolean[] readable = mem.readable();
boolean[] writeable = mem.writeable();
for (int i = 0xfffe; i >= 0; i--) {
if (readable[i]) {
// allow for dummy fetches by implied instructions
readable[i + 1] = true;
}
}
readable[0] = true;
readable[1] = true;
readable[2] = true;
for (int i = 0x100; i <= 0x1ff; i++) {
readable[i] = true;
writeable[i] = true;
}
for (int i = 0x4000; i <= 0x407f; i++) {
readable[i] = true;
writeable[i] = true;
}
for (int i = 0xc000; i <= 0xcfff; i++) {
readable[i] = true;
writeable[i] = true;
}
for (int i = 0xfffa; i <= 0xffff; i++) {
readable[i] = true;
writeable[i] = true;
}
this.mem = mem;
}
public final int read(int addr) {
addr &= 0xffff;
if (!mem.readable()[addr]) {
throw new RuntimeException("Can't read from $" + Integer.toHexString(addr));
}
return mem.output()[addr] & 0xff;
}
public final void write(int addr, int data) {
addr &= 0xffff;
if (!mem.writeable()[addr]) {
throw new RuntimeException("Can't write to $" + Integer.toHexString(addr));
}
mem.output()[addr] = (byte) data;
}
}