Walker Fowlkes 10 months ago
commit 83fdc7b864

@ -1 +1 @@
Subproject commit d4975fa8a08d2026086a08b7eae6543696b61cf7 Subproject commit 419245bf18a266be19f8b02a565fb5e7150a39a3

@ -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);
}
}

@ -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;
}
}

@ -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;
}
}

@ -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;
}
}

@ -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;
}
}

@ -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;
}
}

@ -1,9 +1,10 @@
package net.brokenmoon.redcontrol.blockentities; 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.RedControl;
import net.brokenmoon.redcontrol.api.RCBus; import net.brokenmoon.redcontrol.api.Emulator;
import net.brokenmoon.redcontrol.api.RCCpu; import net.brokenmoon.redcontrol.api.RCWorldBus;
import net.brokenmoon.redcontrol.api.TempRedBus;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
@ -16,8 +17,7 @@ public class CpuEntity extends Peripheral{
public int i = 0; public int i = 0;
public boolean notTicked = true; public boolean notTicked = true;
public RCCpu cpu; public Emulator core = new Emulator(new TempRedBus());
private RCBus rcbus;
private Path bootloader; private Path bootloader;
@ -29,36 +29,20 @@ public class CpuEntity extends Peripheral{
private int defaultDriveId = 2; private int defaultDriveId = 2;
public CpuEntity(BlockPos pos, BlockState state) { public CpuEntity(BlockPos pos, BlockState state) {
super(RedControl.CPU_BLOCK_ENTITY, pos, state, 0); 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) { public static void tick(World world, BlockPos pos, BlockState state, CpuEntity be) {
if(be.notTicked) { 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.reset();
be.notTicked = false; be.notTicked = false;
} }
for(int i = 0; i < 500; i++) for(int i = 0; i < 500; i++)
be.step(); be.step();
if(be.cpu.isWaitingForInterrupt()){ if(be.core.isWaitingOnInterrupt()){
be.cpu.setInterrupt(false); be.core.setWaitingOnInterrupt();
} }
} }
public void setPeripheral(int id, RedBus.Peripheral peripheral) {
this.getBus().getRedBus().setPeripheral(id, peripheral);
}
public int getDefaultDriveId() { public int getDefaultDriveId() {
return this.defaultDriveId; return this.defaultDriveId;
} }
@ -78,17 +62,12 @@ public class CpuEntity extends Peripheral{
public void reset() { public void reset() {
this.cpu.reset(); this.core.reset();
this.getBus().write(0, this.defaultDriveId, getWorld(), this.getPos());
this.getBus().write(1, this.defaultMonitorId, getWorld(), this.getPos());
} }
public void step() { public void step() {
i++; i++;
if(!this.cpu.isWaitingForInterrupt()) { core.step();
this.cpu.step();
this.getBus().update();
}
} }
@Override @Override
@ -105,4 +84,12 @@ public class CpuEntity extends Peripheral{
public void update() { 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;
}
} }

@ -146,6 +146,7 @@ public class MonitorEntity extends Peripheral {
@Override @Override
public void update() { public void update() {
RedControl.LOGGER.info("MONITOR UPDATED");
int maxWidth = Math.min(WIDTH, this.blitWidth + this.blitXOffset); int maxWidth = Math.min(WIDTH, this.blitWidth + this.blitXOffset);
int maxHeight = Math.min(HEIGHT, this.blitHeight + this.blitYOffset); int maxHeight = Math.min(HEIGHT, this.blitHeight + this.blitYOffset);

@ -1,23 +1,16 @@
package net.brokenmoon.redcontrol.blockentities; package net.brokenmoon.redcontrol.blockentities;
import com.simon816.j65el02.Bus;
import com.simon816.j65el02.device.Device;
import com.simon816.j65el02.device.RedBus; 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.BlockState;
import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.entity.BlockEntityType; 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.util.math.BlockPos;
import net.minecraft.world.World;
public abstract class Peripheral extends BlockEntity implements RedBus.Peripheral { public abstract class Peripheral extends BlockEntity implements RedBus.Peripheral {
protected RCBus bus; protected RedBus bus;
protected RCWorldBus worldBus;
protected int id; protected int id;
@ -27,12 +20,14 @@ public abstract class Peripheral extends BlockEntity implements RedBus.Periphera
this.id = id; this.id = id;
} }
public RCBus getBus(){ public RCWorldBus getBus(){
return this.bus; return this.worldBus;
} }
public void setBus(RCBus bus){ public void setBus(RCWorldBus bus){
this.bus = bus; this.bus = bus.getRedBus();
this.bus.setPeripheral(id, this);
this.worldBus = bus;
} }
public int getId() { public int getId() {

@ -45,9 +45,9 @@ public class CpuBlock extends NetworkCarrier {
if (!world.isClient) { if (!world.isClient) {
CpuEntity peripheral = (CpuEntity) world.getBlockEntity(pos); CpuEntity peripheral = (CpuEntity) world.getBlockEntity(pos);
player.sendMessage(Text.literal(String.valueOf(peripheral.getBus().hashCode())), false); 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.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; return ActionResult.SUCCESS;

@ -1,7 +1,8 @@
package net.brokenmoon.redcontrol.blocks; package net.brokenmoon.redcontrol.blocks;
import com.simon816.j65el02.device.RedBus; 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.brokenmoon.redcontrol.blockentities.Peripheral;
import net.minecraft.block.*; import net.minecraft.block.*;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
@ -20,11 +21,11 @@ public abstract class NetworkCarrier extends BlockWithEntity implements BlockEnt
super(settings); super(settings);
} }
public RCBus getBus(World world, BlockPos pos){ public RCWorldBus getBus(World world, BlockPos pos){
return ((Peripheral)world.getBlockEntity(pos)).getBus(); 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); ((Peripheral)world.getBlockEntity(pos)).setBus(bus);
} }
@ -54,16 +55,15 @@ public abstract class NetworkCarrier extends BlockWithEntity implements BlockEnt
Block worldBlock = world.getBlockState(pos).getBlock(); Block worldBlock = world.getBlockState(pos).getBlock();
if(world.getBlockEntity(pos) instanceof Peripheral){ if(world.getBlockEntity(pos) instanceof Peripheral){
Peripheral entityBlock = (Peripheral) world.getBlockEntity(pos); Peripheral entityBlock = (Peripheral) world.getBlockEntity(pos);
if(entityBlock.getBus() == null) RCWorldBus bus = new RCWorldBus(new TempRedBus(), world, pos);
entityBlock.setBus(new RCBus(new RedBus(), world, pos)); entityBlock.setBus(bus);
entityBlock.getBus().getRedBus().setPeripheral(entityBlock.getId(), entityBlock);
entityBlock.getBus().setValid(true); entityBlock.getBus().setValid(true);
floodBus(entityBlock.getBus(), world, pos); 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.north());
replaceBus(bus, world, pos.south()); replaceBus(bus, world, pos.south());
replaceBus(bus, world, pos.east()); replaceBus(bus, world, pos.east());
@ -72,38 +72,24 @@ public abstract class NetworkCarrier extends BlockWithEntity implements BlockEnt
replaceBus(bus, world, pos.down()); 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){ if(world.getBlockEntity(pos) instanceof Peripheral && ((Peripheral) world.getBlockEntity(pos)).getBus() != bus){
((Peripheral) world.getBlockEntity(pos)).setBus(bus); ((Peripheral) world.getBlockEntity(pos)).setBus(bus);
floodBus(bus, world, pos); 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 @Override
public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
if (!world.isClient) { if (!world.isClient) {
Peripheral peripheral = (Peripheral) world.getBlockEntity(pos); Peripheral peripheral = (Peripheral) world.getBlockEntity(pos);
player.sendMessage(Text.literal(String.valueOf(peripheral.getBus().hashCode())), false); 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.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; return ActionResult.SUCCESS;

Loading…
Cancel
Save