diff --git a/src/main/java/li/cil/oc2/common/block/entity/ComputerTileEntity.java b/src/main/java/li/cil/oc2/common/block/entity/ComputerTileEntity.java index 4ceccc65..5d2cebf8 100644 --- a/src/main/java/li/cil/oc2/common/block/entity/ComputerTileEntity.java +++ b/src/main/java/li/cil/oc2/common/block/entity/ComputerTileEntity.java @@ -416,7 +416,7 @@ public final class ComputerTileEntity extends AbstractTileEntity implements ITic super.loadServer(); busElement.initialize(); - virtualMachine.rtc.setWorld(getWorld()); + virtualMachine.rtcMinecraft.setWorld(getWorld()); } @Override @@ -565,8 +565,8 @@ public final class ComputerTileEntity extends AbstractTileEntity implements ITic } private static final class ComputerVirtualMachine extends VirtualMachine { - private static final int UART_INTERRUPT = 0x3; - private static final int VFS_INTERRUPT = 0x4; + private static final int UART_INTERRUPT = 0x4; + private static final int VFS_INTERRUPT = 0x5; @Serialized public UART16550A uart; @Serialized public VirtIOFileSystemDevice vfs; diff --git a/src/main/java/li/cil/oc2/common/vm/VirtualMachine.java b/src/main/java/li/cil/oc2/common/vm/VirtualMachine.java index 572490fd..f4358e07 100644 --- a/src/main/java/li/cil/oc2/common/vm/VirtualMachine.java +++ b/src/main/java/li/cil/oc2/common/vm/VirtualMachine.java @@ -8,21 +8,20 @@ import li.cil.oc2.api.bus.device.vm.VMContext; import li.cil.oc2.common.bus.RPCAdapter; import li.cil.sedna.api.device.InterruptController; import li.cil.sedna.device.rtc.GoldfishRTC; +import li.cil.sedna.device.rtc.SystemTimeRealTimeCounter; import li.cil.sedna.device.virtio.VirtIOConsoleDevice; import li.cil.sedna.riscv.R5Board; public class VirtualMachine { - // We report a clock rate to the VM such that for the VM it looks as though - // passes as much faster as MC time passes faster than real time. - public static final int REPORTED_CPU_FREQUENCY = 700_000; - public static final int ACTUAL_CPU_FREQUENCY = REPORTED_CPU_FREQUENCY * 72; + public static final int CPU_FREQUENCY = 33_000_000; - public static final int RTC_INTERRUPT = 0x1; - public static final int RPC_INTERRUPT = 0x2; + public static final int RTC_HOST_INTERRUPT = 0x1; + public static final int RTC_MINECRAFT_INTERRUPT = 0x2; + public static final int RPC_INTERRUPT = 0x3; /////////////////////////////////////////////////////////////////// - public final MinecraftRealTimeCounter rtc = new MinecraftRealTimeCounter(); + public final MinecraftRealTimeCounter rtcMinecraft = new MinecraftRealTimeCounter(); /////////////////////////////////////////////////////////////////// @@ -36,7 +35,7 @@ public class VirtualMachine { public VirtualMachine(final DeviceBusController busController) { board = new R5Board(); - board.getCpu().setFrequency(REPORTED_CPU_FREQUENCY); + board.getCpu().setFrequency(CPU_FREQUENCY); vmAdapter = new VirtualMachineDeviceBusAdapter(board); final VMContext context = vmAdapter.getGlobalContext(); @@ -45,10 +44,15 @@ public class VirtualMachine { final InterruptAllocator interruptAllocator = context.getInterruptAllocator(); final InterruptController interruptController = context.getInterruptController(); - final GoldfishRTC rtc = new GoldfishRTC(this.rtc); - interruptAllocator.claimInterrupt(RTC_INTERRUPT).ifPresent(interrupt -> - rtc.getInterrupt().set(interrupt, interruptController)); - memoryRangeAllocator.claimMemoryRange(rtc); + final GoldfishRTC rtcHost = new GoldfishRTC(SystemTimeRealTimeCounter.get()); + interruptAllocator.claimInterrupt(RTC_HOST_INTERRUPT).ifPresent(interrupt -> + rtcHost.getInterrupt().set(interrupt, interruptController)); + memoryRangeAllocator.claimMemoryRange(rtcHost); + + final GoldfishRTC rtcMinecraft = new GoldfishRTC(this.rtcMinecraft); + interruptAllocator.claimInterrupt(RTC_MINECRAFT_INTERRUPT).ifPresent(interrupt -> + rtcMinecraft.getInterrupt().set(interrupt, interruptController)); + memoryRangeAllocator.claimMemoryRange(rtcMinecraft); deviceBusSerialDevice = new VirtIOConsoleDevice(board.getMemoryMap()); interruptAllocator.claimInterrupt(RPC_INTERRUPT).ifPresent(interrupt -> diff --git a/src/main/java/li/cil/oc2/common/vm/VirtualMachineRunner.java b/src/main/java/li/cil/oc2/common/vm/VirtualMachineRunner.java index 929801e5..94b2a836 100644 --- a/src/main/java/li/cil/oc2/common/vm/VirtualMachineRunner.java +++ b/src/main/java/li/cil/oc2/common/vm/VirtualMachineRunner.java @@ -98,7 +98,7 @@ public class VirtualMachineRunner implements Runnable { /////////////////////////////////////////////////////////////////// - private int getCyclesPerTick() { - return VirtualMachine.ACTUAL_CPU_FREQUENCY / TICKS_PER_SECOND; + private static int getCyclesPerTick() { + return VirtualMachine.CPU_FREQUENCY / TICKS_PER_SECOND; } }