From 0ba53d21492a9b44b44a84ed02e19f59772021b9 Mon Sep 17 00:00:00 2001 From: Astoria Date: Wed, 17 Apr 2024 13:21:40 -0500 Subject: [PATCH] Functional --- .../net/brokenmoon/BasicMonitorDriver.java | 3 - src/main/java/net/brokenmoon/Emulator.java | 59 ++++++++++++++++++ src/main/java/net/brokenmoon/Main.java | 8 +-- src/main/resources/basic.img | Bin 0 -> 15232 bytes 4 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 src/main/java/net/brokenmoon/Emulator.java create mode 100644 src/main/resources/basic.img diff --git a/src/main/java/net/brokenmoon/BasicMonitorDriver.java b/src/main/java/net/brokenmoon/BasicMonitorDriver.java index 1277b1f..073a41c 100644 --- a/src/main/java/net/brokenmoon/BasicMonitorDriver.java +++ b/src/main/java/net/brokenmoon/BasicMonitorDriver.java @@ -1,6 +1,5 @@ package net.brokenmoon; -import com.simon816.j65el02.Machine; import com.simon816.j65el02.device.MonitorDriver; import com.simon816.j65el02.device.RPMonitor; @@ -23,13 +22,11 @@ public class BasicMonitorDriver implements MonitorDriver, KeyListener { BufferedImage display; JLabel[] lines = new JLabel[HEIGHT]; - Machine emu; byte[][] windowDataOld = new byte[HEIGHT][WIDTH]; int xoffset = 30; int yoffset = 26; public BasicMonitorDriver() { - this.emu = emu; try{ display = ImageIO.read(Objects.requireNonNull(getClass().getResourceAsStream("/display.png"))); } catch(IOException e){ diff --git a/src/main/java/net/brokenmoon/Emulator.java b/src/main/java/net/brokenmoon/Emulator.java new file mode 100644 index 0000000..309546a --- /dev/null +++ b/src/main/java/net/brokenmoon/Emulator.java @@ -0,0 +1,59 @@ +package net.brokenmoon; + +import com.simon816.j65el02.Bus; +import com.simon816.j65el02.Cpu; +import com.simon816.j65el02.device.Memory; +import com.simon816.j65el02.device.RedBus; +import com.simon816.j65el02.device.RedBusState; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Paths; + +public class Emulator { + + private RedBus bus; + public Cpu cpu; + private Memory ram; + + public Emulator(RedBus bus) { + this.bus = bus; + cpu = new Cpu(); + cpu.setBus(new Bus(bus)); + ram = new Memory(0x0000, 0x4000, new RedBusState()); + try { + ram.loadFromFile(Paths.get(Main.class.getResource("/rpcboot.bin").toURI()), 0x400, 0x100); + + } catch (IOException e) { + throw new RuntimeException(e); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + cpu.getBus().addDevice(ram, cpu.redBusState); + cpu.reset(); + ram.write(0, 2, cpu.redBusState); + ram.write(1, 1, cpu.redBusState); + System.out.println("Emulator made"); + } + + public RedBus getBus() { + return bus; + } + + public void setBus(RedBus bus) { + this.bus = bus; + } + + public boolean isWaitingOnInterrupt(){ + return cpu.isWaitingForInterrupt(); + } + + public void setWaitingOnInterrupt(){ + cpu.assertIrq(); + } + + public void step() { + this.cpu.step(); + this.cpu.getBus().update(cpu.redBusState); + } +} diff --git a/src/main/java/net/brokenmoon/Main.java b/src/main/java/net/brokenmoon/Main.java index 186a77a..5226ed9 100644 --- a/src/main/java/net/brokenmoon/Main.java +++ b/src/main/java/net/brokenmoon/Main.java @@ -1,6 +1,5 @@ package net.brokenmoon; -import com.simon816.j65el02.Machine; import com.simon816.j65el02.device.FileDiskDriver; import com.simon816.j65el02.device.RPDrive; import com.simon816.j65el02.device.RPMonitor; @@ -21,7 +20,7 @@ public class Main { static { try { rpcboot = Paths.get(Main.class.getResource("/rpcboot.bin").toURI()); - disk = Paths.get(Main.class.getResource("/slideshow.img").toURI()); + disk = Paths.get(Main.class.getResource("/basic.img").toURI()); } catch (URISyntaxException e) { throw new RuntimeException(e); } @@ -42,14 +41,15 @@ public class Main { TimerTask interruptTask = new TimerTask(){ public void run(){ if(core.cpu.isWaitingForInterrupt()) - core.setWaitingOnInterrupt(); + core.cpu.state.irqDisableFlag = true; } }; TimerTask cpuTask = new TimerTask(){ public void run(){ - for(int i = 0; i < 50; i++) + for(int i = 0; i < 50; i++) { core.step(); + } } }; diff --git a/src/main/resources/basic.img b/src/main/resources/basic.img new file mode 100644 index 0000000000000000000000000000000000000000..105176a139adf8441184269ebb14323a41100c61 GIT binary patch literal 15232 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