From fecf68e8163dcbe5fbdfffd3219f3aa468072456 Mon Sep 17 00:00:00 2001 From: Astoria Date: Tue, 9 Apr 2024 11:21:44 -0500 Subject: [PATCH 1/5] Bus: still broken! --- .../net/brokenmoon/redcontrol/api/RCBus.java | 1 + .../net/brokenmoon/redcontrol/api/RCCpu.java | 7 ++--- .../brokenmoon/redcontrol/api/RCRedbus.java | 29 +++++++++++++++++ .../redcontrol/blockentities/CpuEntity.java | 31 +++++++++++++------ .../redcontrol/blockentities/Peripheral.java | 1 + .../redcontrol/blocks/NetworkCarrier.java | 6 ++-- 6 files changed, 59 insertions(+), 16 deletions(-) create mode 100644 src/main/java/net/brokenmoon/redcontrol/api/RCRedbus.java diff --git a/src/main/java/net/brokenmoon/redcontrol/api/RCBus.java b/src/main/java/net/brokenmoon/redcontrol/api/RCBus.java index b2197bd..47781e9 100644 --- a/src/main/java/net/brokenmoon/redcontrol/api/RCBus.java +++ b/src/main/java/net/brokenmoon/redcontrol/api/RCBus.java @@ -2,6 +2,7 @@ package net.brokenmoon.redcontrol.api; import com.simon816.j65el02.Bus; import com.simon816.j65el02.device.Device; +import com.simon816.j65el02.device.Memory; import com.simon816.j65el02.device.RedBus; import net.brokenmoon.redcontrol.RedControl; import net.brokenmoon.redcontrol.blockentities.Peripheral; diff --git a/src/main/java/net/brokenmoon/redcontrol/api/RCCpu.java b/src/main/java/net/brokenmoon/redcontrol/api/RCCpu.java index f27540b..b097033 100644 --- a/src/main/java/net/brokenmoon/redcontrol/api/RCCpu.java +++ b/src/main/java/net/brokenmoon/redcontrol/api/RCCpu.java @@ -14,9 +14,9 @@ public class RCCpu extends Cpu { private CpuEntity cpuEntity; private Memory ram = new Memory(0x0000, 0x2000);; - public RCCpu(CpuEntity cpuEntity) { + public RCCpu(CpuEntity cpuEntity, RCBus bus) { this.cpuEntity = cpuEntity; - this.setBus(this.cpuEntity.getBus()); + this.setBus(bus); } public void setInterrupt(boolean val){ @@ -40,8 +40,7 @@ public class RCCpu extends Cpu { @Override public void setBus(Bus bus) { super.setBus(bus); - if(!cpuEntity.notTicked) - getBus().addDevice(this.ram); + this.getBus().addDevice(this.ram); } public Memory getRam() { diff --git a/src/main/java/net/brokenmoon/redcontrol/api/RCRedbus.java b/src/main/java/net/brokenmoon/redcontrol/api/RCRedbus.java new file mode 100644 index 0000000..6d08cf3 --- /dev/null +++ b/src/main/java/net/brokenmoon/redcontrol/api/RCRedbus.java @@ -0,0 +1,29 @@ +package net.brokenmoon.redcontrol.api; + +import com.simon816.j65el02.device.RedBus; +import net.brokenmoon.redcontrol.RedControl; + +public class RCRedbus extends RedBus { + @Override + public void write(int address, int data) { + if (!this.enabled) { + return; + } + Peripheral peripheral = this.peripherals[this.activeDeviceId]; + if (peripheral != null) { + peripheral.write(address, data & 0xff); + } + } + + @Override + public void setActiveDevice(int id) { + RedControl.LOGGER.info("Active device is now " + id); + this.activeDeviceId = id; + } + + @Override + public int getActiveDevice() { + RedControl.LOGGER.info("Active device is being read, and it is " + activeDeviceId); + return this.activeDeviceId; + } +} diff --git a/src/main/java/net/brokenmoon/redcontrol/blockentities/CpuEntity.java b/src/main/java/net/brokenmoon/redcontrol/blockentities/CpuEntity.java index edb37cc..8fd928a 100644 --- a/src/main/java/net/brokenmoon/redcontrol/blockentities/CpuEntity.java +++ b/src/main/java/net/brokenmoon/redcontrol/blockentities/CpuEntity.java @@ -1,9 +1,11 @@ package net.brokenmoon.redcontrol.blockentities; +import com.simon816.j65el02.Bus; import com.simon816.j65el02.device.*; import net.brokenmoon.redcontrol.RedControl; import net.brokenmoon.redcontrol.api.RCBus; import net.brokenmoon.redcontrol.api.RCCpu; +import net.brokenmoon.redcontrol.api.RCRedbus; import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -29,16 +31,22 @@ public class CpuEntity extends Peripheral{ private int defaultDriveId = 2; public CpuEntity(BlockPos pos, BlockState state) { super(RedControl.CPU_BLOCK_ENTITY, pos, state, 0); - RedControl.LOGGER.info("Making CpuEntity"); - } public static void tick(World world, BlockPos pos, BlockState state, CpuEntity be) { if(be.notTicked) { - be.cpu = new RCCpu(be); - be.setBus(new RCBus(new RedBus(), world, pos)); - be.cpu.setBus(be.getBus()); - be.cpu.getBus().addDevice(be.cpu.getRam()); + RCBus bus; + if(be.getBus() == null) { + bus = new RCBus(new RCRedbus(), world, pos); + be.bus = bus; + } else { + bus = be.getBus(); + } + if (be.cpu == null){ + RedControl.LOGGER.info("Making CpuEntity"); + be.cpu = new RCCpu(be, bus); + } + try { be.cpu.getRam().loadFromFile(be.bootloader, 0x400, 0x100); } catch (IOException e) { @@ -54,9 +62,14 @@ public class CpuEntity extends Peripheral{ } } - - public void setPeripheral(int id, RedBus.Peripheral peripheral) { - this.getBus().getRedBus().setPeripheral(id, peripheral); + @Override + public void setBus(RCBus bus){ + this.bus = bus; + if(cpu == null) { + RedControl.LOGGER.info("Making CpuEntity setbus edition"); + this.cpu = new RCCpu(this, bus); + } + this.cpu.setBus(bus); } public int getDefaultDriveId() { diff --git a/src/main/java/net/brokenmoon/redcontrol/blockentities/Peripheral.java b/src/main/java/net/brokenmoon/redcontrol/blockentities/Peripheral.java index b1d462a..4ef3da4 100644 --- a/src/main/java/net/brokenmoon/redcontrol/blockentities/Peripheral.java +++ b/src/main/java/net/brokenmoon/redcontrol/blockentities/Peripheral.java @@ -33,6 +33,7 @@ public abstract class Peripheral extends BlockEntity implements RedBus.Periphera public void setBus(RCBus bus){ this.bus = bus; + this.bus.getRedBus().setPeripheral(id, this); } public int getId() { diff --git a/src/main/java/net/brokenmoon/redcontrol/blocks/NetworkCarrier.java b/src/main/java/net/brokenmoon/redcontrol/blocks/NetworkCarrier.java index 5e9c3b3..f665b47 100644 --- a/src/main/java/net/brokenmoon/redcontrol/blocks/NetworkCarrier.java +++ b/src/main/java/net/brokenmoon/redcontrol/blocks/NetworkCarrier.java @@ -2,6 +2,7 @@ package net.brokenmoon.redcontrol.blocks; import com.simon816.j65el02.device.RedBus; import net.brokenmoon.redcontrol.api.RCBus; +import net.brokenmoon.redcontrol.api.RCRedbus; import net.brokenmoon.redcontrol.blockentities.Peripheral; import net.minecraft.block.*; import net.minecraft.entity.LivingEntity; @@ -54,9 +55,8 @@ public abstract class NetworkCarrier extends BlockWithEntity implements BlockEnt Block worldBlock = world.getBlockState(pos).getBlock(); if(world.getBlockEntity(pos) instanceof Peripheral){ Peripheral entityBlock = (Peripheral) world.getBlockEntity(pos); - if(entityBlock.getBus() == null) - entityBlock.setBus(new RCBus(new RedBus(), world, pos)); - entityBlock.getBus().getRedBus().setPeripheral(entityBlock.getId(), entityBlock); + RCBus bus = new RCBus(new RCRedbus(), world, pos); + entityBlock.setBus(bus); entityBlock.getBus().setValid(true); floodBus(entityBlock.getBus(), world, pos); } From a3364cb2601b87235a2b4d4d1ee78210682b8cb1 Mon Sep 17 00:00:00 2001 From: Astoria Date: Tue, 9 Apr 2024 15:54:16 -0500 Subject: [PATCH 2/5] Bus: still broken, but closer, i think. --- J65el02 | 2 +- .../net/brokenmoon/redcontrol/api/RCBus.java | 55 +++++++++++-------- .../net/brokenmoon/redcontrol/api/RCCpu.java | 12 ++-- .../brokenmoon/redcontrol/api/RCRedbus.java | 24 ++++---- .../redcontrol/blockentities/CpuEntity.java | 9 ++- .../redcontrol/blocks/NetworkCarrier.java | 8 +-- 6 files changed, 59 insertions(+), 51 deletions(-) diff --git a/J65el02 b/J65el02 index d4975fa..9e2e514 160000 --- a/J65el02 +++ b/J65el02 @@ -1 +1 @@ -Subproject commit d4975fa8a08d2026086a08b7eae6543696b61cf7 +Subproject commit 9e2e5145e04787fc2cd36f53e67c572887ee1b15 diff --git a/src/main/java/net/brokenmoon/redcontrol/api/RCBus.java b/src/main/java/net/brokenmoon/redcontrol/api/RCBus.java index 47781e9..a95e2bf 100644 --- a/src/main/java/net/brokenmoon/redcontrol/api/RCBus.java +++ b/src/main/java/net/brokenmoon/redcontrol/api/RCBus.java @@ -5,7 +5,6 @@ import com.simon816.j65el02.device.Device; import com.simon816.j65el02.device.Memory; import com.simon816.j65el02.device.RedBus; import net.brokenmoon.redcontrol.RedControl; -import net.brokenmoon.redcontrol.blockentities.Peripheral; import net.brokenmoon.redcontrol.blocks.NetworkCarrier; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -23,40 +22,44 @@ public class RCBus extends Bus { - public void write(int address, int data, World world, BlockPos pos) { + public void write(int address, int data, int redbusTarget, int redbusStartAddress, World world, BlockPos pos) { if(isValid) { - Device device = findDevice(address); - device.write(address - device.startAddress(), data); + Device device = findDevice(address, redbusStartAddress); + if(!(device instanceof Memory)) + RedControl.LOGGER.info(device.toString()); + device.write(address, data, redbusTarget, redbusStartAddress); } else { - generateBusWithWrite(address, data, world, pos); + generateBusWithWrite(address, data, redbusTarget, redbusStartAddress, world, pos); } } @Override - public void write(int address, int data) { - write(address, data, backupWorld, backupPos); + public void write(int address, int data, int redbusTarget, int redbusStartAddress) { + write(address, data, redbusTarget, redbusStartAddress, backupWorld, backupPos); } - private void generateBusWithWrite(int address, int data, World world, BlockPos pos) { - ((NetworkCarrier)(world.getBlockState(pos).getBlock())).generateBusWithWrite(world, pos, address, data); + private void generateBusWithWrite(int address, int data, int redbusTarget, int redbusStartAddress, World world, BlockPos pos) { + ((NetworkCarrier)(world.getBlockState(pos).getBlock())).generateBusWithWrite(world, pos, address, data, redbusTarget, redbusStartAddress); } - public int read(int address, boolean cpuAccess, World world, BlockPos pos) { + public int read(int address, boolean cpuAccess, int redbusTarget, int redbusStartAddress, World world, BlockPos pos) { if(isValid) { - Device device = findDevice(address); - return device.read(address - device.startAddress(), cpuAccess) & 0xff; + Device device = findDevice(address, redbusStartAddress); + if(!(device instanceof Memory)) + RedControl.LOGGER.info(device.toString()); + return device.read(address, cpuAccess, redbusTarget, redbusStartAddress) & 0xff; } else { - return generateBusWithRead(address, cpuAccess, world, pos); + return generateBusWithRead(address, cpuAccess, redbusTarget, redbusStartAddress, world, pos); } } - private int generateBusWithRead(int address, boolean cpuAccess, World world, BlockPos pos) { - return ((NetworkCarrier)(world.getBlockState(pos).getBlock())).generateBusWithRead(world, pos, address, cpuAccess); + private int generateBusWithRead(int address, boolean cpuAccess, int redbusTarget, int redbusStartAddress, World world, BlockPos pos) { + return ((NetworkCarrier)(world.getBlockState(pos).getBlock())).generateBusWithRead(world, pos, address, cpuAccess, redbusTarget, redbusStartAddress); } @Override - public int read(int address, boolean cpuAccess) { - return read(address, cpuAccess, backupWorld, backupPos); + public int read(int address, boolean cpuAccess, int redbusTarget, int redbusStartAddress) { + return read(address, cpuAccess, redbusTarget, redbusStartAddress, backupWorld, backupPos); } public RCBus(RedBus redBus, World world, BlockPos pos) { @@ -79,12 +82,20 @@ public class RCBus extends Bus { this.redBus = redBus; } - @Override - public void update() { - this.getRedBus().updatePeripheral(); - } - public void setValid(boolean val){ this.isValid = val; } + + @Override + protected Device findDevice(int address, int redbusStartAddress) { + // RedBus takes priority + if (address >= redbusStartAddress && address <= (redbusStartAddress + 0xFF)) { + return this.redBus; + } + int idx = Arrays.binarySearch(this.boundaries, address); + if (idx < 0) { + idx = -idx - 2; + } + return this.devices.get(idx); + } } diff --git a/src/main/java/net/brokenmoon/redcontrol/api/RCCpu.java b/src/main/java/net/brokenmoon/redcontrol/api/RCCpu.java index b097033..e493f1e 100644 --- a/src/main/java/net/brokenmoon/redcontrol/api/RCCpu.java +++ b/src/main/java/net/brokenmoon/redcontrol/api/RCCpu.java @@ -2,17 +2,13 @@ package net.brokenmoon.redcontrol.api; import com.simon816.j65el02.Bus; import com.simon816.j65el02.Cpu; -import com.simon816.j65el02.CpuState; import com.simon816.j65el02.device.Memory; -import net.brokenmoon.redcontrol.RedControl; import net.brokenmoon.redcontrol.blockentities.CpuEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; public class RCCpu extends Cpu { private CpuEntity cpuEntity; - private Memory ram = new Memory(0x0000, 0x2000);; + private Memory ram = new Memory(0x0000, 0x2000); public RCCpu(CpuEntity cpuEntity, RCBus bus) { this.cpuEntity = cpuEntity; @@ -25,15 +21,15 @@ public class RCCpu extends Cpu { @Override protected int readByte(int address) { - return this.cpuEntity.getBus().getRedBus().read(address, true); + return this.cpuEntity.getBus().getRedBus().read(address, true, redbusTarget, redbusStartAddress); } @Override protected void writeMemory(int address, int value, boolean x) { - this.getBus().write(address, value); + this.getBus().write(address, value, this.redbusTarget, this.redbusStartAddress); boolean flag = x ? this.state.indexWidthFlag : this.state.mWidthFlag; if (!this.state.emulationFlag && !flag) { - this.cpuEntity.getBus().getRedBus().write(address + 1, value >>> 8); + this.cpuEntity.getBus().getRedBus().write(address + 1, value >>> 8, redbusTarget, redbusStartAddress); } } diff --git a/src/main/java/net/brokenmoon/redcontrol/api/RCRedbus.java b/src/main/java/net/brokenmoon/redcontrol/api/RCRedbus.java index 6d08cf3..81201b6 100644 --- a/src/main/java/net/brokenmoon/redcontrol/api/RCRedbus.java +++ b/src/main/java/net/brokenmoon/redcontrol/api/RCRedbus.java @@ -5,25 +5,27 @@ import net.brokenmoon.redcontrol.RedControl; public class RCRedbus extends RedBus { @Override - public void write(int address, int data) { + public void write(int address, int data, int redbusTarget, int redbusStartAddress) { if (!this.enabled) { return; } - Peripheral peripheral = this.peripherals[this.activeDeviceId]; + Peripheral peripheral = this.peripherals[redbusTarget]; + RedControl.LOGGER.info("Peripheral write at " + address + " for " + redbusTarget); if (peripheral != null) { peripheral.write(address, data & 0xff); } } @Override - public void setActiveDevice(int id) { - RedControl.LOGGER.info("Active device is now " + id); - this.activeDeviceId = id; - } - - @Override - public int getActiveDevice() { - RedControl.LOGGER.info("Active device is being read, and it is " + activeDeviceId); - return this.activeDeviceId; + public int read(int address, boolean cpuAccess, int redbusTarget, int redbusStartAddress) { + if (!this.enabled) { + return 0; + } + Peripheral peripheral = this.peripherals[redbusTarget]; + RedControl.LOGGER.info("Peripheral read at " + address + " for " + redbusTarget); + if (peripheral != null) { + return peripheral.read(address); + } + return 0; } } diff --git a/src/main/java/net/brokenmoon/redcontrol/blockentities/CpuEntity.java b/src/main/java/net/brokenmoon/redcontrol/blockentities/CpuEntity.java index 8fd928a..50d857e 100644 --- a/src/main/java/net/brokenmoon/redcontrol/blockentities/CpuEntity.java +++ b/src/main/java/net/brokenmoon/redcontrol/blockentities/CpuEntity.java @@ -1,7 +1,6 @@ package net.brokenmoon.redcontrol.blockentities; -import com.simon816.j65el02.Bus; -import com.simon816.j65el02.device.*; +import com.simon816.j65el02.device.RedBus; import net.brokenmoon.redcontrol.RedControl; import net.brokenmoon.redcontrol.api.RCBus; import net.brokenmoon.redcontrol.api.RCCpu; @@ -92,15 +91,15 @@ public class CpuEntity extends Peripheral{ public void reset() { this.cpu.reset(); - this.getBus().write(0, this.defaultDriveId, getWorld(), this.getPos()); - this.getBus().write(1, this.defaultMonitorId, getWorld(), this.getPos()); + this.getBus().write(0, this.defaultDriveId, cpu.redbusTarget, cpu.redbusStartAddress, getWorld(), this.getPos()); + this.getBus().write(1, this.defaultMonitorId, cpu.redbusTarget, cpu.redbusStartAddress, getWorld(), this.getPos()); } public void step() { i++; if(!this.cpu.isWaitingForInterrupt()) { this.cpu.step(); - this.getBus().update(); + this.getBus().update(this.cpu.redbusTarget); } } diff --git a/src/main/java/net/brokenmoon/redcontrol/blocks/NetworkCarrier.java b/src/main/java/net/brokenmoon/redcontrol/blocks/NetworkCarrier.java index f665b47..b4d0610 100644 --- a/src/main/java/net/brokenmoon/redcontrol/blocks/NetworkCarrier.java +++ b/src/main/java/net/brokenmoon/redcontrol/blocks/NetworkCarrier.java @@ -79,21 +79,21 @@ public abstract class NetworkCarrier extends BlockWithEntity implements BlockEnt } } - public void generateBusWithWrite(World world, BlockPos pos, int address, int data) { + public void generateBusWithWrite(World world, BlockPos pos, int address, int data, int redbusTarget, int redbusStartAddress) { if(world.getBlockEntity(pos) instanceof Peripheral){ Peripheral entityBlock = (Peripheral) world.getBlockEntity(pos); generateBus(world,pos); floodBus(entityBlock.getBus(), world, pos); - entityBlock.getBus().write(address, data, world, pos); + entityBlock.getBus().write(address, data, redbusTarget, redbusStartAddress, world, pos); } } - public int generateBusWithRead(World world, BlockPos pos, int address, boolean cpuAccess) { + public int generateBusWithRead(World world, BlockPos pos, int address, boolean cpuAccess, int redbusTarget, int redbusStartAddress) { if(world.getBlockEntity(pos) instanceof Peripheral){ Peripheral entityBlock = (Peripheral) world.getBlockEntity(pos); generateBus(world,pos); floodBus(entityBlock.getBus(), world, pos); - return entityBlock.getBus().read(address, cpuAccess, world, pos); + return entityBlock.getBus().read(address, cpuAccess, redbusTarget, redbusStartAddress, world, pos); } return 0; } From 9ad756e11b2025499f17653df8bcbd1b954e198d Mon Sep 17 00:00:00 2001 From: Astoria Date: Wed, 10 Apr 2024 14:00:07 -0500 Subject: [PATCH 3/5] Bus: maybe not broken but still not working --- J65el02 | 2 +- .../brokenmoon/redcontrol/api/Emulator.java | 67 ++++++++++++ .../net/brokenmoon/redcontrol/api/RCBus.java | 101 ------------------ .../net/brokenmoon/redcontrol/api/RCCpu.java | 45 -------- .../brokenmoon/redcontrol/api/RCRedbus.java | 31 ------ .../brokenmoon/redcontrol/api/RCWorldBus.java | 39 +++++++ .../redcontrol/blockentities/CpuEntity.java | 47 ++------ .../redcontrol/blockentities/Peripheral.java | 24 ++--- .../redcontrol/blocks/CpuBlock.java | 2 +- .../redcontrol/blocks/NetworkCarrier.java | 32 ++---- 10 files changed, 131 insertions(+), 259 deletions(-) create mode 100644 src/main/java/net/brokenmoon/redcontrol/api/Emulator.java delete mode 100644 src/main/java/net/brokenmoon/redcontrol/api/RCBus.java delete mode 100644 src/main/java/net/brokenmoon/redcontrol/api/RCCpu.java delete mode 100644 src/main/java/net/brokenmoon/redcontrol/api/RCRedbus.java create mode 100644 src/main/java/net/brokenmoon/redcontrol/api/RCWorldBus.java diff --git a/J65el02 b/J65el02 index 9e2e514..3690b00 160000 --- a/J65el02 +++ b/J65el02 @@ -1 +1 @@ -Subproject commit 9e2e5145e04787fc2cd36f53e67c572887ee1b15 +Subproject commit 3690b0031fd685abecc2f7d21678c61dca69f40f diff --git a/src/main/java/net/brokenmoon/redcontrol/api/Emulator.java b/src/main/java/net/brokenmoon/redcontrol/api/Emulator.java new file mode 100644 index 0000000..327f9e9 --- /dev/null +++ b/src/main/java/net/brokenmoon/redcontrol/api/Emulator.java @@ -0,0 +1,67 @@ +package net.brokenmoon.redcontrol.api; + +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 boolean isRunning = false; + + public Emulator(RedBus bus){ + this.bus = bus; + cpu = new Cpu(); + cpu.setBus(new Bus(bus)); + ram = new Memory(0x0000, 0x2000, new RedBusState()); + try { + ram.loadFromFile(Paths.get("/home/astoria/code/java/mods/RedControl/src/main/resources/assets/redcontrol/image/redforth.img"), 0x400, 0x100); + + } catch (IOException 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.getCpuState().intWait = false; + } + + public void step() { + if(!isWaitingOnInterrupt() && isRunning) { + this.cpu.step(); + this.cpu.getBus().update(cpu.redBusState); + } + } + + public void reset(){ + isRunning = false; + cpu.reset(); + ram.write(0, 2, cpu.redBusState); + ram.write(1, 1, cpu.redBusState); + } +} diff --git a/src/main/java/net/brokenmoon/redcontrol/api/RCBus.java b/src/main/java/net/brokenmoon/redcontrol/api/RCBus.java deleted file mode 100644 index a95e2bf..0000000 --- a/src/main/java/net/brokenmoon/redcontrol/api/RCBus.java +++ /dev/null @@ -1,101 +0,0 @@ -package net.brokenmoon.redcontrol.api; - -import com.simon816.j65el02.Bus; -import com.simon816.j65el02.device.Device; -import com.simon816.j65el02.device.Memory; -import com.simon816.j65el02.device.RedBus; -import net.brokenmoon.redcontrol.RedControl; -import net.brokenmoon.redcontrol.blocks.NetworkCarrier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.Arrays; - -public class RCBus extends Bus { - - private boolean isValid = false; - - private RedBus redBus; - - private World backupWorld; - private BlockPos backupPos; - - - - public void write(int address, int data, int redbusTarget, int redbusStartAddress, World world, BlockPos pos) { - if(isValid) { - Device device = findDevice(address, redbusStartAddress); - if(!(device instanceof Memory)) - RedControl.LOGGER.info(device.toString()); - device.write(address, data, redbusTarget, redbusStartAddress); - } else { - generateBusWithWrite(address, data, redbusTarget, redbusStartAddress, world, pos); - } - } - - @Override - public void write(int address, int data, int redbusTarget, int redbusStartAddress) { - write(address, data, redbusTarget, redbusStartAddress, backupWorld, backupPos); - } - - private void generateBusWithWrite(int address, int data, int redbusTarget, int redbusStartAddress, World world, BlockPos pos) { - ((NetworkCarrier)(world.getBlockState(pos).getBlock())).generateBusWithWrite(world, pos, address, data, redbusTarget, redbusStartAddress); - } - - public int read(int address, boolean cpuAccess, int redbusTarget, int redbusStartAddress, World world, BlockPos pos) { - if(isValid) { - Device device = findDevice(address, redbusStartAddress); - if(!(device instanceof Memory)) - RedControl.LOGGER.info(device.toString()); - return device.read(address, cpuAccess, redbusTarget, redbusStartAddress) & 0xff; - } else { - return generateBusWithRead(address, cpuAccess, redbusTarget, redbusStartAddress, world, pos); - } - } - - private int generateBusWithRead(int address, boolean cpuAccess, int redbusTarget, int redbusStartAddress, World world, BlockPos pos) { - return ((NetworkCarrier)(world.getBlockState(pos).getBlock())).generateBusWithRead(world, pos, address, cpuAccess, redbusTarget, redbusStartAddress); - } - - @Override - public int read(int address, boolean cpuAccess, int redbusTarget, int redbusStartAddress) { - return read(address, cpuAccess, redbusTarget, redbusStartAddress, backupWorld, backupPos); - } - - public RCBus(RedBus redBus, World world, BlockPos pos) { - super(redBus); - this.redBus = redBus; - backupWorld = world; - backupPos = pos; - } - - - public void generateBus(World world, BlockPos pos){ - ((NetworkCarrier)(world.getBlockState(pos).getBlock())).generateBus(world, pos); - } - - public RedBus getRedBus() { - return redBus; - } - - public void setRedBus(RedBus redBus) { - this.redBus = redBus; - } - - public void setValid(boolean val){ - this.isValid = val; - } - - @Override - protected Device findDevice(int address, int redbusStartAddress) { - // RedBus takes priority - if (address >= redbusStartAddress && address <= (redbusStartAddress + 0xFF)) { - return this.redBus; - } - int idx = Arrays.binarySearch(this.boundaries, address); - if (idx < 0) { - idx = -idx - 2; - } - return this.devices.get(idx); - } -} diff --git a/src/main/java/net/brokenmoon/redcontrol/api/RCCpu.java b/src/main/java/net/brokenmoon/redcontrol/api/RCCpu.java deleted file mode 100644 index e493f1e..0000000 --- a/src/main/java/net/brokenmoon/redcontrol/api/RCCpu.java +++ /dev/null @@ -1,45 +0,0 @@ -package net.brokenmoon.redcontrol.api; - -import com.simon816.j65el02.Bus; -import com.simon816.j65el02.Cpu; -import com.simon816.j65el02.device.Memory; -import net.brokenmoon.redcontrol.blockentities.CpuEntity; - -public class RCCpu extends Cpu { - - private CpuEntity cpuEntity; - private Memory ram = new Memory(0x0000, 0x2000); - - public RCCpu(CpuEntity cpuEntity, RCBus bus) { - this.cpuEntity = cpuEntity; - this.setBus(bus); - } - - public void setInterrupt(boolean val){ - state.intWait = val; - } - - @Override - protected int readByte(int address) { - return this.cpuEntity.getBus().getRedBus().read(address, true, redbusTarget, redbusStartAddress); - } - - @Override - protected void writeMemory(int address, int value, boolean x) { - this.getBus().write(address, value, this.redbusTarget, this.redbusStartAddress); - boolean flag = x ? this.state.indexWidthFlag : this.state.mWidthFlag; - if (!this.state.emulationFlag && !flag) { - this.cpuEntity.getBus().getRedBus().write(address + 1, value >>> 8, redbusTarget, redbusStartAddress); - } - } - - @Override - public void setBus(Bus bus) { - super.setBus(bus); - this.getBus().addDevice(this.ram); - } - - public Memory getRam() { - return ram; - } -} diff --git a/src/main/java/net/brokenmoon/redcontrol/api/RCRedbus.java b/src/main/java/net/brokenmoon/redcontrol/api/RCRedbus.java deleted file mode 100644 index 81201b6..0000000 --- a/src/main/java/net/brokenmoon/redcontrol/api/RCRedbus.java +++ /dev/null @@ -1,31 +0,0 @@ -package net.brokenmoon.redcontrol.api; - -import com.simon816.j65el02.device.RedBus; -import net.brokenmoon.redcontrol.RedControl; - -public class RCRedbus extends RedBus { - @Override - public void write(int address, int data, int redbusTarget, int redbusStartAddress) { - if (!this.enabled) { - return; - } - Peripheral peripheral = this.peripherals[redbusTarget]; - RedControl.LOGGER.info("Peripheral write at " + address + " for " + redbusTarget); - if (peripheral != null) { - peripheral.write(address, data & 0xff); - } - } - - @Override - public int read(int address, boolean cpuAccess, int redbusTarget, int redbusStartAddress) { - if (!this.enabled) { - return 0; - } - Peripheral peripheral = this.peripherals[redbusTarget]; - RedControl.LOGGER.info("Peripheral read at " + address + " for " + redbusTarget); - if (peripheral != null) { - return peripheral.read(address); - } - return 0; - } -} diff --git a/src/main/java/net/brokenmoon/redcontrol/api/RCWorldBus.java b/src/main/java/net/brokenmoon/redcontrol/api/RCWorldBus.java new file mode 100644 index 0000000..9629110 --- /dev/null +++ b/src/main/java/net/brokenmoon/redcontrol/api/RCWorldBus.java @@ -0,0 +1,39 @@ +package net.brokenmoon.redcontrol.api; + +import com.simon816.j65el02.device.RedBus; +import net.brokenmoon.redcontrol.blocks.NetworkCarrier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +public class RCWorldBus { + + private boolean isValid = false; + + private RedBus redBus; + + private World backupWorld; + private BlockPos backupPos; + + public RCWorldBus(RedBus redBus, World world, BlockPos pos) { + this.redBus = redBus; + backupWorld = world; + backupPos = pos; + } + + + public void generateBus(World world, BlockPos pos){ + ((NetworkCarrier)(world.getBlockState(pos).getBlock())).generateBus(world, pos); + } + + public RedBus getRedBus() { + return redBus; + } + + public void setRedBus(RedBus redBus) { + this.redBus = redBus; + } + + public void setValid(boolean val){ + this.isValid = val; + } +} diff --git a/src/main/java/net/brokenmoon/redcontrol/blockentities/CpuEntity.java b/src/main/java/net/brokenmoon/redcontrol/blockentities/CpuEntity.java index 50d857e..0e1230e 100644 --- a/src/main/java/net/brokenmoon/redcontrol/blockentities/CpuEntity.java +++ b/src/main/java/net/brokenmoon/redcontrol/blockentities/CpuEntity.java @@ -2,9 +2,7 @@ package net.brokenmoon.redcontrol.blockentities; import com.simon816.j65el02.device.RedBus; import net.brokenmoon.redcontrol.RedControl; -import net.brokenmoon.redcontrol.api.RCBus; -import net.brokenmoon.redcontrol.api.RCCpu; -import net.brokenmoon.redcontrol.api.RCRedbus; +import net.brokenmoon.redcontrol.api.Emulator; import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -17,8 +15,7 @@ public class CpuEntity extends Peripheral{ public int i = 0; public boolean notTicked = true; - public RCCpu cpu; - private RCBus rcbus; + public Emulator core; private Path bootloader; @@ -34,41 +31,18 @@ public class CpuEntity extends Peripheral{ public static void tick(World world, BlockPos pos, BlockState state, CpuEntity be) { if(be.notTicked) { - RCBus bus; - if(be.getBus() == null) { - bus = new RCBus(new RCRedbus(), world, pos); - be.bus = bus; - } else { - bus = be.getBus(); - } - if (be.cpu == null){ + if (be.core == null){ RedControl.LOGGER.info("Making CpuEntity"); - be.cpu = new RCCpu(be, bus); - } - - try { - be.cpu.getRam().loadFromFile(be.bootloader, 0x400, 0x100); - } catch (IOException e) { - throw new RuntimeException(e); + be.core = new Emulator(new RedBus()); } be.reset(); be.notTicked = false; } for(int i = 0; i < 500; i++) be.step(); - if(be.cpu.isWaitingForInterrupt()){ - be.cpu.setInterrupt(false); - } - } - - @Override - public void setBus(RCBus bus){ - this.bus = bus; - if(cpu == null) { - RedControl.LOGGER.info("Making CpuEntity setbus edition"); - this.cpu = new RCCpu(this, bus); + if(be.core.isWaitingOnInterrupt()){ + be.core.setWaitingOnInterrupt(); } - this.cpu.setBus(bus); } public int getDefaultDriveId() { @@ -90,17 +64,12 @@ public class CpuEntity extends Peripheral{ public void reset() { - this.cpu.reset(); - this.getBus().write(0, this.defaultDriveId, cpu.redbusTarget, cpu.redbusStartAddress, getWorld(), this.getPos()); - this.getBus().write(1, this.defaultMonitorId, cpu.redbusTarget, cpu.redbusStartAddress, getWorld(), this.getPos()); + this.core.reset(); } public void step() { i++; - if(!this.cpu.isWaitingForInterrupt()) { - this.cpu.step(); - this.getBus().update(this.cpu.redbusTarget); - } + core.step(); } @Override diff --git a/src/main/java/net/brokenmoon/redcontrol/blockentities/Peripheral.java b/src/main/java/net/brokenmoon/redcontrol/blockentities/Peripheral.java index 4ef3da4..b53c86c 100644 --- a/src/main/java/net/brokenmoon/redcontrol/blockentities/Peripheral.java +++ b/src/main/java/net/brokenmoon/redcontrol/blockentities/Peripheral.java @@ -1,23 +1,16 @@ package net.brokenmoon.redcontrol.blockentities; -import com.simon816.j65el02.Bus; -import com.simon816.j65el02.device.Device; import com.simon816.j65el02.device.RedBus; -import net.brokenmoon.redcontrol.api.RCBus; +import net.brokenmoon.redcontrol.api.RCWorldBus; import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.text.Text; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; public abstract class Peripheral extends BlockEntity implements RedBus.Peripheral { - protected RCBus bus; + protected RedBus bus; + protected RCWorldBus worldBus; protected int id; @@ -27,13 +20,14 @@ public abstract class Peripheral extends BlockEntity implements RedBus.Periphera this.id = id; } - public RCBus getBus(){ - return this.bus; + public RCWorldBus getBus(){ + return this.worldBus; } - public void setBus(RCBus bus){ - this.bus = bus; - this.bus.getRedBus().setPeripheral(id, this); + public void setBus(RCWorldBus bus){ + this.bus = bus.getRedBus(); + this.bus.setPeripheral(id, this); + this.worldBus = bus; } public int getId() { diff --git a/src/main/java/net/brokenmoon/redcontrol/blocks/CpuBlock.java b/src/main/java/net/brokenmoon/redcontrol/blocks/CpuBlock.java index a28ac49..e44c90b 100644 --- a/src/main/java/net/brokenmoon/redcontrol/blocks/CpuBlock.java +++ b/src/main/java/net/brokenmoon/redcontrol/blocks/CpuBlock.java @@ -47,7 +47,7 @@ public class CpuBlock extends NetworkCarrier { player.sendMessage(Text.literal(String.valueOf(peripheral.getBus().hashCode())), false); player.sendMessage(Text.literal(String.valueOf(peripheral.getBus().getRedBus().hashCode())), false); player.sendMessage(Text.literal(String.valueOf(peripheral.i)), false); - player.sendMessage(Text.literal(String.valueOf(peripheral.cpu.isWaitingForInterrupt())), false); + player.sendMessage(Text.literal(String.valueOf(peripheral.core.isWaitingOnInterrupt())), false); } return ActionResult.SUCCESS; diff --git a/src/main/java/net/brokenmoon/redcontrol/blocks/NetworkCarrier.java b/src/main/java/net/brokenmoon/redcontrol/blocks/NetworkCarrier.java index b4d0610..d0e989f 100644 --- a/src/main/java/net/brokenmoon/redcontrol/blocks/NetworkCarrier.java +++ b/src/main/java/net/brokenmoon/redcontrol/blocks/NetworkCarrier.java @@ -1,8 +1,7 @@ package net.brokenmoon.redcontrol.blocks; import com.simon816.j65el02.device.RedBus; -import net.brokenmoon.redcontrol.api.RCBus; -import net.brokenmoon.redcontrol.api.RCRedbus; +import net.brokenmoon.redcontrol.api.RCWorldBus; import net.brokenmoon.redcontrol.blockentities.Peripheral; import net.minecraft.block.*; import net.minecraft.entity.LivingEntity; @@ -21,11 +20,11 @@ public abstract class NetworkCarrier extends BlockWithEntity implements BlockEnt super(settings); } - public RCBus getBus(World world, BlockPos pos){ + public RCWorldBus getBus(World world, BlockPos pos){ return ((Peripheral)world.getBlockEntity(pos)).getBus(); } - public void setBus(World world, BlockPos pos, RCBus bus){ + public void setBus(World world, BlockPos pos, RCWorldBus bus){ ((Peripheral)world.getBlockEntity(pos)).setBus(bus); } @@ -55,7 +54,7 @@ public abstract class NetworkCarrier extends BlockWithEntity implements BlockEnt Block worldBlock = world.getBlockState(pos).getBlock(); if(world.getBlockEntity(pos) instanceof Peripheral){ Peripheral entityBlock = (Peripheral) world.getBlockEntity(pos); - RCBus bus = new RCBus(new RCRedbus(), world, pos); + RCWorldBus bus = new RCWorldBus(new RedBus(), world, pos); entityBlock.setBus(bus); entityBlock.getBus().setValid(true); floodBus(entityBlock.getBus(), world, pos); @@ -63,7 +62,7 @@ public abstract class NetworkCarrier extends BlockWithEntity implements BlockEnt } - private void floodBus(RCBus bus, World world, BlockPos pos) { + private void floodBus(RCWorldBus bus, World world, BlockPos pos) { replaceBus(bus, world, pos.north()); replaceBus(bus, world, pos.south()); replaceBus(bus, world, pos.east()); @@ -72,32 +71,13 @@ public abstract class NetworkCarrier extends BlockWithEntity implements BlockEnt replaceBus(bus, world, pos.down()); } - private void replaceBus(RCBus bus, World world, BlockPos pos) { + private void replaceBus(RCWorldBus bus, World world, BlockPos pos) { if(world.getBlockEntity(pos) instanceof Peripheral && ((Peripheral) world.getBlockEntity(pos)).getBus() != bus){ ((Peripheral) world.getBlockEntity(pos)).setBus(bus); floodBus(bus, world, pos); } } - public void generateBusWithWrite(World world, BlockPos pos, int address, int data, int redbusTarget, int redbusStartAddress) { - if(world.getBlockEntity(pos) instanceof Peripheral){ - Peripheral entityBlock = (Peripheral) world.getBlockEntity(pos); - generateBus(world,pos); - floodBus(entityBlock.getBus(), world, pos); - entityBlock.getBus().write(address, data, redbusTarget, redbusStartAddress, world, pos); - } - } - - public int generateBusWithRead(World world, BlockPos pos, int address, boolean cpuAccess, int redbusTarget, int redbusStartAddress) { - if(world.getBlockEntity(pos) instanceof Peripheral){ - Peripheral entityBlock = (Peripheral) world.getBlockEntity(pos); - generateBus(world,pos); - floodBus(entityBlock.getBus(), world, pos); - return entityBlock.getBus().read(address, cpuAccess, redbusTarget, redbusStartAddress, world, pos); - } - return 0; - } - @Override public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { if (!world.isClient) { From 17ff02dfe1cdccb59425624693e5aecfa0536804 Mon Sep 17 00:00:00 2001 From: Astoria Date: Wed, 10 Apr 2024 14:28:38 -0500 Subject: [PATCH 4/5] send bus to emulator --- .../net/brokenmoon/redcontrol/api/Emulator.java | 3 ++- .../redcontrol/blockentities/CpuEntity.java | 15 ++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/brokenmoon/redcontrol/api/Emulator.java b/src/main/java/net/brokenmoon/redcontrol/api/Emulator.java index 327f9e9..5e7d44e 100644 --- a/src/main/java/net/brokenmoon/redcontrol/api/Emulator.java +++ b/src/main/java/net/brokenmoon/redcontrol/api/Emulator.java @@ -41,6 +41,7 @@ public class Emulator { public void setBus(RedBus bus) { this.bus = bus; + this.cpu.getBus().setRedBus(bus); } public boolean isWaitingOnInterrupt(){ @@ -52,7 +53,7 @@ public class Emulator { } public void step() { - if(!isWaitingOnInterrupt() && isRunning) { + if(!isWaitingOnInterrupt()) { this.cpu.step(); this.cpu.getBus().update(cpu.redBusState); } diff --git a/src/main/java/net/brokenmoon/redcontrol/blockentities/CpuEntity.java b/src/main/java/net/brokenmoon/redcontrol/blockentities/CpuEntity.java index 0e1230e..902291d 100644 --- a/src/main/java/net/brokenmoon/redcontrol/blockentities/CpuEntity.java +++ b/src/main/java/net/brokenmoon/redcontrol/blockentities/CpuEntity.java @@ -3,6 +3,7 @@ package net.brokenmoon.redcontrol.blockentities; import com.simon816.j65el02.device.RedBus; import net.brokenmoon.redcontrol.RedControl; import net.brokenmoon.redcontrol.api.Emulator; +import net.brokenmoon.redcontrol.api.RCWorldBus; import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -15,7 +16,7 @@ public class CpuEntity extends Peripheral{ public int i = 0; public boolean notTicked = true; - public Emulator core; + public Emulator core = new Emulator(new RedBus()); private Path bootloader; @@ -31,10 +32,6 @@ public class CpuEntity extends Peripheral{ public static void tick(World world, BlockPos pos, BlockState state, CpuEntity be) { if(be.notTicked) { - if (be.core == null){ - RedControl.LOGGER.info("Making CpuEntity"); - be.core = new Emulator(new RedBus()); - } be.reset(); be.notTicked = false; } @@ -86,4 +83,12 @@ public class CpuEntity extends Peripheral{ public void update() { } + + @Override + public void setBus(RCWorldBus bus){ + this.bus = bus.getRedBus(); + this.core.setBus(this.bus); + this.bus.setPeripheral(id, this); + this.worldBus = bus; + } } From ed54f55acf824d94a1ebcf286de508dc80cb6d0c Mon Sep 17 00:00:00 2001 From: Astoria Date: Wed, 10 Apr 2024 15:53:16 -0500 Subject: [PATCH 5/5] Still not working! --- J65el02 | 2 +- .../brokenmoon/redcontrol/api/Emulator.java | 8 ++--- .../brokenmoon/redcontrol/api/TempBus.java | 27 +++++++++++++++ .../brokenmoon/redcontrol/api/TempRedBus.java | 33 +++++++++++++++++++ .../redcontrol/blockentities/CpuEntity.java | 3 +- .../blockentities/MonitorEntity.java | 1 + .../redcontrol/blocks/CpuBlock.java | 2 +- .../redcontrol/blocks/NetworkCarrier.java | 8 ++++- 8 files changed, 76 insertions(+), 8 deletions(-) create mode 100644 src/main/java/net/brokenmoon/redcontrol/api/TempBus.java create mode 100644 src/main/java/net/brokenmoon/redcontrol/api/TempRedBus.java diff --git a/J65el02 b/J65el02 index 3690b00..419245b 160000 --- a/J65el02 +++ b/J65el02 @@ -1 +1 @@ -Subproject commit 3690b0031fd685abecc2f7d21678c61dca69f40f +Subproject commit 419245bf18a266be19f8b02a565fb5e7150a39a3 diff --git a/src/main/java/net/brokenmoon/redcontrol/api/Emulator.java b/src/main/java/net/brokenmoon/redcontrol/api/Emulator.java index 5e7d44e..ac2521c 100644 --- a/src/main/java/net/brokenmoon/redcontrol/api/Emulator.java +++ b/src/main/java/net/brokenmoon/redcontrol/api/Emulator.java @@ -5,6 +5,7 @@ import com.simon816.j65el02.Cpu; import com.simon816.j65el02.device.Memory; import com.simon816.j65el02.device.RedBus; import com.simon816.j65el02.device.RedBusState; +import net.brokenmoon.redcontrol.RedControl; import java.io.IOException; import java.net.URISyntaxException; @@ -15,13 +16,12 @@ public class Emulator { private RedBus bus; public Cpu cpu; private Memory ram; - public boolean isRunning = false; public Emulator(RedBus bus){ this.bus = bus; cpu = new Cpu(); - cpu.setBus(new Bus(bus)); - ram = new Memory(0x0000, 0x2000, new RedBusState()); + cpu.setBus(new TempBus(bus)); + ram = new Memory(0x0000, 0x2000 - 1, cpu.redBusState); try { ram.loadFromFile(Paths.get("/home/astoria/code/java/mods/RedControl/src/main/resources/assets/redcontrol/image/redforth.img"), 0x400, 0x100); @@ -40,6 +40,7 @@ public class Emulator { } public void setBus(RedBus bus) { + RedControl.LOGGER.info("Setting Emulator bus"); this.bus = bus; this.cpu.getBus().setRedBus(bus); } @@ -60,7 +61,6 @@ public class Emulator { } public void reset(){ - isRunning = false; cpu.reset(); ram.write(0, 2, cpu.redBusState); ram.write(1, 1, cpu.redBusState); diff --git a/src/main/java/net/brokenmoon/redcontrol/api/TempBus.java b/src/main/java/net/brokenmoon/redcontrol/api/TempBus.java new file mode 100644 index 0000000..93b861c --- /dev/null +++ b/src/main/java/net/brokenmoon/redcontrol/api/TempBus.java @@ -0,0 +1,27 @@ +package net.brokenmoon.redcontrol.api; + +import com.simon816.j65el02.Bus; +import com.simon816.j65el02.device.Device; +import com.simon816.j65el02.device.RedBus; +import com.simon816.j65el02.device.RedBusState; +import net.brokenmoon.redcontrol.RedControl; + +public class TempBus extends Bus { + public TempBus(RedBus redBus) { + super(redBus); + } + + @Override + public void write(int address, int data, RedBusState state) { + Device device = findDevice(address,state); + RedControl.LOGGER.info("Writing to bus with device " + device + "at address " + (address - device.startAddress(state)) + " with data " + data + " with target " + state.activeDeviceId + " and redbus offset of " + state.offset); + device.write(address - device.startAddress(state) % 0x2000, data, state); + } + + @Override + public int read(int address, boolean cpuAccess, RedBusState state) { + Device device = findDevice(address,state); + RedControl.LOGGER.info("Reading from bus with device " + device + "at address " + (address - device.startAddress(state)) + " with target " + state.activeDeviceId + " and redbus offset of " + state.offset); + return device.read(address - device.startAddress(state) % 0x2000, cpuAccess, state) & 0xff; + } +} diff --git a/src/main/java/net/brokenmoon/redcontrol/api/TempRedBus.java b/src/main/java/net/brokenmoon/redcontrol/api/TempRedBus.java new file mode 100644 index 0000000..5cad760 --- /dev/null +++ b/src/main/java/net/brokenmoon/redcontrol/api/TempRedBus.java @@ -0,0 +1,33 @@ +package net.brokenmoon.redcontrol.api; + +import com.simon816.j65el02.device.RedBus; +import com.simon816.j65el02.device.RedBusState; +import net.brokenmoon.redcontrol.RedControl; + +public class TempRedBus extends RedBus { + + @Override + public void write(int address, int data, RedBusState state) { + RedControl.LOGGER.info("Writing at " + address); + if (!state.enabled) { + return; + } + Peripheral peripheral = this.peripherals[state.activeDeviceId]; + if (peripheral != null) { + peripheral.write(address, data & 0xff); + } + } + + @Override + public int read(int address, boolean cpuAccess, RedBusState state) { + RedControl.LOGGER.info("Reading at " + address); + if (!state.enabled) { + return 0; + } + Peripheral peripheral = this.peripherals[state.activeDeviceId]; + if (peripheral != null) { + return peripheral.read(address); + } + return 0; + } +} diff --git a/src/main/java/net/brokenmoon/redcontrol/blockentities/CpuEntity.java b/src/main/java/net/brokenmoon/redcontrol/blockentities/CpuEntity.java index 902291d..4efb519 100644 --- a/src/main/java/net/brokenmoon/redcontrol/blockentities/CpuEntity.java +++ b/src/main/java/net/brokenmoon/redcontrol/blockentities/CpuEntity.java @@ -4,6 +4,7 @@ import com.simon816.j65el02.device.RedBus; import net.brokenmoon.redcontrol.RedControl; import net.brokenmoon.redcontrol.api.Emulator; import net.brokenmoon.redcontrol.api.RCWorldBus; +import net.brokenmoon.redcontrol.api.TempRedBus; import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -16,7 +17,7 @@ public class CpuEntity extends Peripheral{ public int i = 0; public boolean notTicked = true; - public Emulator core = new Emulator(new RedBus()); + public Emulator core = new Emulator(new TempRedBus()); private Path bootloader; diff --git a/src/main/java/net/brokenmoon/redcontrol/blockentities/MonitorEntity.java b/src/main/java/net/brokenmoon/redcontrol/blockentities/MonitorEntity.java index 0c6d554..0c92e1f 100644 --- a/src/main/java/net/brokenmoon/redcontrol/blockentities/MonitorEntity.java +++ b/src/main/java/net/brokenmoon/redcontrol/blockentities/MonitorEntity.java @@ -146,6 +146,7 @@ public class MonitorEntity extends Peripheral { @Override public void update() { + RedControl.LOGGER.info("MONITOR UPDATED"); int maxWidth = Math.min(WIDTH, this.blitWidth + this.blitXOffset); int maxHeight = Math.min(HEIGHT, this.blitHeight + this.blitYOffset); diff --git a/src/main/java/net/brokenmoon/redcontrol/blocks/CpuBlock.java b/src/main/java/net/brokenmoon/redcontrol/blocks/CpuBlock.java index e44c90b..0c3b2b0 100644 --- a/src/main/java/net/brokenmoon/redcontrol/blocks/CpuBlock.java +++ b/src/main/java/net/brokenmoon/redcontrol/blocks/CpuBlock.java @@ -45,7 +45,7 @@ public class CpuBlock extends NetworkCarrier { if (!world.isClient) { CpuEntity peripheral = (CpuEntity) world.getBlockEntity(pos); player.sendMessage(Text.literal(String.valueOf(peripheral.getBus().hashCode())), false); - player.sendMessage(Text.literal(String.valueOf(peripheral.getBus().getRedBus().hashCode())), false); + player.sendMessage(Text.literal(String.valueOf(peripheral.core.cpu.getBus().getRedBus().hashCode())), false); player.sendMessage(Text.literal(String.valueOf(peripheral.i)), false); player.sendMessage(Text.literal(String.valueOf(peripheral.core.isWaitingOnInterrupt())), false); } diff --git a/src/main/java/net/brokenmoon/redcontrol/blocks/NetworkCarrier.java b/src/main/java/net/brokenmoon/redcontrol/blocks/NetworkCarrier.java index d0e989f..07946bb 100644 --- a/src/main/java/net/brokenmoon/redcontrol/blocks/NetworkCarrier.java +++ b/src/main/java/net/brokenmoon/redcontrol/blocks/NetworkCarrier.java @@ -2,6 +2,7 @@ package net.brokenmoon.redcontrol.blocks; import com.simon816.j65el02.device.RedBus; import net.brokenmoon.redcontrol.api.RCWorldBus; +import net.brokenmoon.redcontrol.api.TempRedBus; import net.brokenmoon.redcontrol.blockentities.Peripheral; import net.minecraft.block.*; import net.minecraft.entity.LivingEntity; @@ -54,7 +55,7 @@ public abstract class NetworkCarrier extends BlockWithEntity implements BlockEnt Block worldBlock = world.getBlockState(pos).getBlock(); if(world.getBlockEntity(pos) instanceof Peripheral){ Peripheral entityBlock = (Peripheral) world.getBlockEntity(pos); - RCWorldBus bus = new RCWorldBus(new RedBus(), world, pos); + RCWorldBus bus = new RCWorldBus(new TempRedBus(), world, pos); entityBlock.setBus(bus); entityBlock.getBus().setValid(true); floodBus(entityBlock.getBus(), world, pos); @@ -84,6 +85,11 @@ public abstract class NetworkCarrier extends BlockWithEntity implements BlockEnt Peripheral peripheral = (Peripheral) world.getBlockEntity(pos); player.sendMessage(Text.literal(String.valueOf(peripheral.getBus().hashCode())), false); player.sendMessage(Text.literal(String.valueOf(peripheral.getBus().getRedBus().hashCode())), false); + for(int i = 0; i < peripheral.getBus().getRedBus().peripherals.length; i++){ + if (peripheral.getBus().getRedBus().peripherals[i] != null){ + player.sendMessage(Text.literal(String.valueOf(peripheral.getBus().getRedBus().peripherals[i])), false); + } + } } return ActionResult.SUCCESS;