blob: 68f1f04c046ee92c72dca9419cad7de6c1ecbf1c [file] [log] [blame] [raw]
/*
* Copyright (c) 2014 Seth J. Morabito <web@loomcom.com>
* Maik Merten <maikmerten@googlemail.com>
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package gamax92.thistle;
import li.cil.oc.api.machine.Context;
import java.util.ArrayList;
import com.loomcom.symon.Bus;
import com.loomcom.symon.Cpu;
import gamax92.thistle.devices.BootROM;
import gamax92.thistle.devices.ComponentSelector;
import gamax92.thistle.devices.ComputerInfo;
import gamax92.thistle.devices.CopyEngine;
import gamax92.thistle.devices.RTC;
import gamax92.thistle.devices.BankSelector;
import gamax92.thistle.devices.GeneralIO;
public class ThistleMachine {
// Constants used by the simulated system. These define the memory map.
// General IO at $E000-$E00F
private static final int GIODEV_BASE = 0xE000;
// Component Mapper at $E010-$E01F
private static final int COMPMAP_BASE = 0xE010;
// Bank Selector at $E020-$E03F
private static final int BANKSEL_BASE = 0xE020;
// Copy Engine at $E040-$E04F
private static final int COPYENG_BASE = 0xE040;
// RTC and Timers at $E050-$E05F
private static final int RTCTIMER_BASE = 0xE050;
// Computer Information at $E100-$E11F
private static final int COMPINFO_BASE = 0xE100;
// EEPROM data+code at $EF00-$FFFF
private static final int EEPROM_DATA_BASE = 0xEF00;
private static final int EEPROM_CODE_BASE = 0xF000;
// The simulated peripherals
private final Bus bus;
private final Cpu cpu;
private final GeneralIO generalio;
private final ComponentSelector compsel;
private final BankSelector banksel;
private final CopyEngine copyeng;
private final ComputerInfo compinfo;
private final RTC rtc;
private final BootROM eeprom;
private Context context;
// The machine memory
private ArrayList<Byte> mem = new ArrayList<Byte>();
public ThistleMachine(Context context) throws Exception {
this.context = context;
this.bus = new Bus();
this.cpu = new Cpu();
this.generalio = new GeneralIO(GIODEV_BASE);
this.compsel = new ComponentSelector(COMPMAP_BASE);
this.banksel = new BankSelector(BANKSEL_BASE);
this.copyeng = new CopyEngine(COPYENG_BASE);
this.rtc = new RTC(RTCTIMER_BASE);
this.compinfo = new ComputerInfo(COMPINFO_BASE);
this.eeprom = new BootROM(EEPROM_DATA_BASE);
bus.setMachine(this);
bus.setCpu(this.cpu);
bus.addDevice(this.generalio);
bus.addDevice(this.compsel);
bus.addDevice(this.banksel);
bus.addDevice(this.copyeng);
bus.addDevice(this.rtc);
bus.addDevice(this.compinfo);
bus.addDevice(this.eeprom);
}
public Bus getBus() {
return bus;
}
public Cpu getCpu() {
return cpu;
}
public GeneralIO getGioDev() {
return generalio;
}
public ComponentSelector getComponentSelector() {
return compsel;
}
public BankSelector getBankSelector() {
return banksel;
}
public CopyEngine getCopyEngine() {
return copyeng;
}
public RTC getRTC() {
return rtc;
}
public ComputerInfo getCompInfo() {
return compinfo;
}
public BootROM getEEPROM() {
return eeprom;
}
public String getName() {
return "Thistle";
}
public Context getContext() {
return context;
}
public void resize(int newsize) {
if (newsize > this.mem.size())
for (int i = this.mem.size(); i < newsize; i++)
this.mem.add((byte) 0xFF);
else if (newsize < this.mem.size())
for (int i = this.mem.size(); i > newsize; i--)
this.mem.remove(i - 1);
}
public void reset() {
// TODO: Clear mappings and restore default mappings.
}
public int getMemsize() {
return this.mem.size();
}
public byte readMem(int address) {
return this.mem.get(address);
}
public void writeMem(int address, byte data) {
this.mem.set(address, data);
}
}