mirror of https://github.com/KarolS/millfork.git
76 lines
2.1 KiB
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;
|
|
}
|
|
|
|
}
|