its not working and im not sure why
parent
f31f33fbb4
commit
4a8ea0a098
@ -1,20 +1,17 @@
|
||||
package net.brokenmoon.redcontrol.api;
|
||||
|
||||
import com.simon816.j65el02.Cpu;
|
||||
import com.simon816.j65el02.CpuState;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class RCCpu extends Cpu {
|
||||
|
||||
private RCBus rcbus;
|
||||
|
||||
public RCCpu() {
|
||||
}
|
||||
|
||||
public RCBus getRCBus() {
|
||||
return rcbus;
|
||||
}
|
||||
|
||||
private final World world;
|
||||
private final BlockPos pos;
|
||||
|
||||
public void setRCBus(RCBus rcbus) {
|
||||
this.rcbus = rcbus;
|
||||
public RCCpu(World world, BlockPos pos) {
|
||||
this.world = world;
|
||||
this.pos = pos;
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,124 @@
|
||||
package net.brokenmoon.redcontrol.blockentities;
|
||||
|
||||
import com.simon816.j65el02.device.DiskDriver;
|
||||
import com.simon816.j65el02.device.FileDiskDriver;
|
||||
import net.brokenmoon.redcontrol.RedControl;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.entity.BlockEntityType;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.file.Paths;
|
||||
|
||||
public class DriveEntity extends Peripheral{
|
||||
|
||||
private static final int SECTOR_SIZE = 0x80;
|
||||
|
||||
private final DiskDriver driver;
|
||||
private final byte[] diskName = new byte[SECTOR_SIZE];
|
||||
private final byte[] diskSerial = new byte[SECTOR_SIZE];
|
||||
private final ByteBuffer buffer;
|
||||
|
||||
private int sector;
|
||||
private int command;
|
||||
|
||||
public DriveEntity(BlockPos pos, BlockState state) {
|
||||
super(RedControl.DRIVE_BLOCK_ENTITY, pos, state, 2);
|
||||
|
||||
try {
|
||||
this.driver = new FileDiskDriver(Paths.get("/home/astoria/code/java/mods/RedControl/src/main/resources/assets/redcontrol/image/redforth.img"), "Forth", "FORTH", false);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
this.buffer = ByteBuffer.allocateDirect(SECTOR_SIZE);
|
||||
byte[] name = driver.getDriveName();
|
||||
byte[] serial = driver.getDriveSerial();
|
||||
System.arraycopy(name, 0, this.diskName, 0, name.length);
|
||||
System.arraycopy(serial, 0, this.diskSerial, 0, serial.length);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(int address, int data) {
|
||||
switch (address) {
|
||||
case 0x80: // Sector number (lo)
|
||||
this.sector = (this.sector & 0xff00) | data;
|
||||
break;
|
||||
case 0x81: // Sector number (hi)
|
||||
this.sector = (data << 8) | (this.sector & 0xff);
|
||||
break;
|
||||
case 0x82: // Disk command
|
||||
this.command = data;
|
||||
break;
|
||||
default: // Disk sector buffer
|
||||
if (address >= 0 && address <= 0x7f) {
|
||||
this.buffer.put(address, (byte) data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int read(int address) {
|
||||
RedControl.LOGGER.info("Drive Reading");
|
||||
switch (address) {
|
||||
case 0x80: // Sector number (lo)
|
||||
return this.sector & 0xff;
|
||||
case 0x81: // Sector number (hi)
|
||||
return (this.sector >> 8) & 0xff;
|
||||
case 0x82: // Disk command
|
||||
return this.command;
|
||||
default: // Disk sector buffer
|
||||
if (address >= 0 && address <= 0x7f) {
|
||||
return this.buffer.get(address);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update() {
|
||||
try {
|
||||
switch (this.command) {
|
||||
case 0x01: // Read Disk Name
|
||||
this.buffer.clear();
|
||||
this.buffer.put(this.diskName);
|
||||
this.command = 0;
|
||||
break;
|
||||
case 0x02: // Write Disk Name
|
||||
this.buffer.position(0);
|
||||
this.buffer.get(this.diskName);
|
||||
this.driver.writeDiskName(this.diskName);
|
||||
this.command = 0;
|
||||
break;
|
||||
case 0x03: // Read Disk Serial
|
||||
this.buffer.clear();
|
||||
this.buffer.put(this.diskSerial);
|
||||
this.command = 0;
|
||||
break;
|
||||
case 0x04: // Read Disk Sector
|
||||
if (this.sector >= 0x800) {
|
||||
this.command = 0xff;
|
||||
break;
|
||||
}
|
||||
this.driver.seek(this.sector << 7);
|
||||
this.buffer.position(0);
|
||||
this.driver.read(this.buffer);
|
||||
this.command = 0;
|
||||
break;
|
||||
case 0x05: // Write Disk Sector
|
||||
if (this.sector >= 0x800) {
|
||||
this.command = 0xff;
|
||||
break;
|
||||
}
|
||||
this.driver.seek(this.sector << 7);
|
||||
this.buffer.position(0);
|
||||
this.driver.write(this.buffer);
|
||||
this.command = 0;
|
||||
break;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
this.command = 0xff;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
package net.brokenmoon.redcontrol.blocks;
|
||||
|
||||
import com.mojang.serialization.MapCodec;
|
||||
import net.brokenmoon.redcontrol.blockentities.DriveEntity;
|
||||
import net.brokenmoon.redcontrol.blockentities.MonitorEntity;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.BlockWithEntity;
|
||||
import net.minecraft.block.entity.BlockEntity;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public class DriveBlock extends NetworkCarrier{
|
||||
public DriveBlock(Settings settings) {
|
||||
super(settings);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected MapCodec<? extends BlockWithEntity> getCodec() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public BlockEntity createBlockEntity(BlockPos pos, BlockState state) {
|
||||
return new DriveEntity(pos, state);
|
||||
}
|
||||
}
|
Binary file not shown.
Loading…
Reference in New Issue