134 lines
3.3 KiB
Java
134 lines
3.3 KiB
Java
package com.loomcom.symon.machines;
|
|
|
|
import com.loomcom.symon.Bus;
|
|
import com.loomcom.symon.Cpu;
|
|
import com.loomcom.symon.devices.*;
|
|
import com.loomcom.symon.exceptions.MemoryRangeException;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
import java.io.File;
|
|
|
|
public class MichaelBillingtonMachine implements Machine{
|
|
|
|
private static final Logger logger = LoggerFactory.getLogger(MichaelBillingtonMachine.class.getName());
|
|
|
|
// Constants used by the simulated system
|
|
private static final int BUS_BOTTOM = 0x0000;
|
|
private static final int BUS_TOP = 0xffff;
|
|
|
|
// 32k of ram, from $0000 to $7fff
|
|
private static final int MEMORY_BASE = 0x0000;
|
|
private static final int MEMORY_SIZE = 0x8000;
|
|
|
|
// VIA at $8000-$800f
|
|
private static final int PIA_BASE = 0x8000;
|
|
|
|
// ACIA at $8400-$8403
|
|
private static final int ACIA_BASE = 0x8400;
|
|
|
|
// 16k ROM from $c000 to $ffff
|
|
private static final int ROM_BASE = 0xc000;
|
|
private static final int ROM_SIZE = 0x4000;
|
|
|
|
private final Bus bus;
|
|
private final Cpu cpu;
|
|
private final Acia acia;
|
|
private final Pia pia;
|
|
private final Memory ram;
|
|
private Memory rom;
|
|
|
|
public MichaelBillingtonMachine(String romFile) throws Exception {
|
|
this.bus = new Bus(BUS_BOTTOM, BUS_TOP);
|
|
this.cpu = new Cpu();
|
|
this.ram = new Memory(MEMORY_BASE, MEMORY_BASE + MEMORY_SIZE - 1);
|
|
this.pia = new Via6522(PIA_BASE);
|
|
this.acia = new Acia6551(ACIA_BASE);
|
|
|
|
bus.addCpu(cpu);
|
|
bus.addDevice(ram);
|
|
bus.addDevice(pia);
|
|
bus.addDevice(acia);
|
|
|
|
if (romFile != null) {
|
|
File romImage = new File(romFile);
|
|
if (romImage.canRead()) {
|
|
logger.info("Loading ROM image from file {}", romImage);
|
|
this.rom = Memory.makeROM(ROM_BASE, ROM_BASE + ROM_SIZE - 1, romImage);
|
|
} else {
|
|
logger.info("Default ROM file {} not found, loading empty R/W memory image.", romImage);
|
|
this.rom = Memory.makeRAM(ROM_BASE, ROM_BASE + ROM_SIZE - 1);
|
|
}
|
|
} else {
|
|
logger.info("No ROM file specified, loading empty R/W memory image.");
|
|
this.rom = Memory.makeRAM(ROM_BASE, ROM_BASE + ROM_SIZE - 1);
|
|
}
|
|
|
|
bus.addDevice(rom);
|
|
}
|
|
|
|
@Override
|
|
public Bus getBus() {
|
|
return bus;
|
|
}
|
|
|
|
@Override
|
|
public Cpu getCpu() {
|
|
return cpu;
|
|
}
|
|
|
|
@Override
|
|
public Memory getRam() {
|
|
return ram;
|
|
}
|
|
|
|
@Override
|
|
public Acia getAcia() {
|
|
return acia;
|
|
}
|
|
|
|
@Override
|
|
public Pia getPia() {
|
|
return pia;
|
|
}
|
|
|
|
@Override
|
|
public Crtc getCrtc() {
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public Memory getRom() {
|
|
return rom;
|
|
}
|
|
|
|
@Override
|
|
public void setRom(Memory rom) throws MemoryRangeException {
|
|
if (this.rom != null) {
|
|
bus.removeDevice(this.rom);
|
|
}
|
|
this.rom = rom;
|
|
bus.addDevice(this.rom);
|
|
}
|
|
|
|
@Override
|
|
public int getRomBase() {
|
|
return ROM_BASE;
|
|
}
|
|
|
|
@Override
|
|
public int getRomSize() {
|
|
return ROM_SIZE;
|
|
}
|
|
|
|
@Override
|
|
public int getMemorySize() {
|
|
return MEMORY_SIZE;
|
|
}
|
|
|
|
@Override
|
|
public String getName() {
|
|
return "mike42";
|
|
}
|
|
}
|