diff --git a/J65el02 b/J65el02 index d4975fa..419245b 160000 --- a/J65el02 +++ b/J65el02 @@ -1 +1 @@ -Subproject commit d4975fa8a08d2026086a08b7eae6543696b61cf7 +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 new file mode 100644 index 0000000..ac2521c --- /dev/null +++ b/src/main/java/net/brokenmoon/redcontrol/api/Emulator.java @@ -0,0 +1,68 @@ +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 net.brokenmoon.redcontrol.RedControl; + +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 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); + + } 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) { + RedControl.LOGGER.info("Setting Emulator bus"); + this.bus = bus; + this.cpu.getBus().setRedBus(bus); + } + + public boolean isWaitingOnInterrupt(){ + return cpu.isWaitingForInterrupt(); + } + + public void setWaitingOnInterrupt(){ + cpu.getCpuState().intWait = false; + } + + public void step() { + if(!isWaitingOnInterrupt()) { + this.cpu.step(); + this.cpu.getBus().update(cpu.redBusState); + } + } + + public void reset(){ + 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 b2197bd..0000000 --- a/src/main/java/net/brokenmoon/redcontrol/api/RCBus.java +++ /dev/null @@ -1,89 +0,0 @@ -package net.brokenmoon.redcontrol.api; - -import com.simon816.j65el02.Bus; -import com.simon816.j65el02.device.Device; -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; - -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, World world, BlockPos pos) { - if(isValid) { - Device device = findDevice(address); - device.write(address - device.startAddress(), data); - } else { - generateBusWithWrite(address, data, world, pos); - } - } - - @Override - public void write(int address, int data) { - write(address, data, backupWorld, backupPos); - } - - private void generateBusWithWrite(int address, int data, World world, BlockPos pos) { - ((NetworkCarrier)(world.getBlockState(pos).getBlock())).generateBusWithWrite(world, pos, address, data); - } - - public int read(int address, boolean cpuAccess, World world, BlockPos pos) { - if(isValid) { - Device device = findDevice(address); - return device.read(address - device.startAddress(), cpuAccess) & 0xff; - } else { - return generateBusWithRead(address, cpuAccess, world, pos); - } - } - - private int generateBusWithRead(int address, boolean cpuAccess, World world, BlockPos pos) { - return ((NetworkCarrier)(world.getBlockState(pos).getBlock())).generateBusWithRead(world, pos, address, cpuAccess); - } - - @Override - public int read(int address, boolean cpuAccess) { - return read(address, cpuAccess, 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; - } - - @Override - public void update() { - this.getRedBus().updatePeripheral(); - } - - public void setValid(boolean val){ - this.isValid = val; - } -} 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 f27540b..0000000 --- a/src/main/java/net/brokenmoon/redcontrol/api/RCCpu.java +++ /dev/null @@ -1,50 +0,0 @@ -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);; - - public RCCpu(CpuEntity cpuEntity) { - this.cpuEntity = cpuEntity; - this.setBus(this.cpuEntity.getBus()); - } - - public void setInterrupt(boolean val){ - state.intWait = val; - } - - @Override - protected int readByte(int address) { - return this.cpuEntity.getBus().getRedBus().read(address, true); - } - - @Override - protected void writeMemory(int address, int value, boolean x) { - this.getBus().write(address, value); - boolean flag = x ? this.state.indexWidthFlag : this.state.mWidthFlag; - if (!this.state.emulationFlag && !flag) { - this.cpuEntity.getBus().getRedBus().write(address + 1, value >>> 8); - } - } - - @Override - public void setBus(Bus bus) { - super.setBus(bus); - if(!cpuEntity.notTicked) - getBus().addDevice(this.ram); - } - - public Memory getRam() { - return ram; - } -} 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/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 edb37cc..4efb519 100644 --- a/src/main/java/net/brokenmoon/redcontrol/blockentities/CpuEntity.java +++ b/src/main/java/net/brokenmoon/redcontrol/blockentities/CpuEntity.java @@ -1,9 +1,10 @@ package net.brokenmoon.redcontrol.blockentities; -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; +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,8 +17,7 @@ public class CpuEntity extends Peripheral{ public int i = 0; public boolean notTicked = true; - public RCCpu cpu; - private RCBus rcbus; + public Emulator core = new Emulator(new TempRedBus()); private Path bootloader; @@ -29,36 +29,20 @@ 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()); - try { - be.cpu.getRam().loadFromFile(be.bootloader, 0x400, 0x100); - } catch (IOException e) { - throw new RuntimeException(e); - } be.reset(); be.notTicked = false; } for(int i = 0; i < 500; i++) be.step(); - if(be.cpu.isWaitingForInterrupt()){ - be.cpu.setInterrupt(false); + if(be.core.isWaitingOnInterrupt()){ + be.core.setWaitingOnInterrupt(); } } - - public void setPeripheral(int id, RedBus.Peripheral peripheral) { - this.getBus().getRedBus().setPeripheral(id, peripheral); - } - public int getDefaultDriveId() { return this.defaultDriveId; } @@ -78,17 +62,12 @@ 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.core.reset(); } public void step() { i++; - if(!this.cpu.isWaitingForInterrupt()) { - this.cpu.step(); - this.getBus().update(); - } + core.step(); } @Override @@ -105,4 +84,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; + } } 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/blockentities/Peripheral.java b/src/main/java/net/brokenmoon/redcontrol/blockentities/Peripheral.java index b1d462a..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,12 +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; + 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..0c3b2b0 100644 --- a/src/main/java/net/brokenmoon/redcontrol/blocks/CpuBlock.java +++ b/src/main/java/net/brokenmoon/redcontrol/blocks/CpuBlock.java @@ -45,9 +45,9 @@ 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.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 5e9c3b3..07946bb 100644 --- a/src/main/java/net/brokenmoon/redcontrol/blocks/NetworkCarrier.java +++ b/src/main/java/net/brokenmoon/redcontrol/blocks/NetworkCarrier.java @@ -1,7 +1,8 @@ package net.brokenmoon.redcontrol.blocks; import com.simon816.j65el02.device.RedBus; -import net.brokenmoon.redcontrol.api.RCBus; +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; @@ -20,11 +21,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); } @@ -54,16 +55,15 @@ 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); + RCWorldBus bus = new RCWorldBus(new TempRedBus(), world, pos); + entityBlock.setBus(bus); entityBlock.getBus().setValid(true); floodBus(entityBlock.getBus(), world, pos); } } - 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,38 +72,24 @@ 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) { - 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); - } - } - - public int generateBusWithRead(World world, BlockPos pos, int address, boolean cpuAccess) { - 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 0; - } - @Override public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { if (!world.isClient) { 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;