From 8701007ad9c6ac7c19c3eadf0ff3b69fe7769389 Mon Sep 17 00:00:00 2001 From: simon Date: Tue, 14 Nov 2017 20:58:07 -0500 Subject: [PATCH] Bug fixes related to floppy drive --- .../cubotplugin/CubotFloppyDrive.java | 22 +++++----- .../net/simon987/cubotplugin/FloppyDisk.java | 43 ++++++++++--------- .../src/net/simon987/server/GameServer.java | 10 ++++- .../net/simon987/server/assembly/Memory.java | 2 +- 4 files changed, 44 insertions(+), 33 deletions(-) diff --git a/Plugin Cubot/src/net/simon987/cubotplugin/CubotFloppyDrive.java b/Plugin Cubot/src/net/simon987/cubotplugin/CubotFloppyDrive.java index 494c335..4e4c656 100644 --- a/Plugin Cubot/src/net/simon987/cubotplugin/CubotFloppyDrive.java +++ b/Plugin Cubot/src/net/simon987/cubotplugin/CubotFloppyDrive.java @@ -23,8 +23,6 @@ public class CubotFloppyDrive extends CpuHardware { public CubotFloppyDrive(Cubot cubot) { this.cubot = cubot; - - this.floppyDisk = new FloppyDisk();//todo remove } @Override @@ -44,12 +42,14 @@ public class CubotFloppyDrive extends CpuHardware { if (floppyDisk == null) { getCpu().getRegisterSet().getRegister("B").setValue(0); } else { - getCpu().getRegisterSet().getRegister("B").setValue(1); + if (cubot.spendEnergy(1)) { + getCpu().getRegisterSet().getRegister("B").setValue(1); - int x = getCpu().getRegisterSet().getRegister("X").getValue(); - int y = getCpu().getRegisterSet().getRegister("Y").getValue(); + int x = getCpu().getRegisterSet().getRegister("X").getValue(); + int y = getCpu().getRegisterSet().getRegister("Y").getValue(); - floppyDisk.readSector(x, cubot.getParent().getCpu().getMemory(), y); + floppyDisk.readSector(x, cubot.getParent().getCpu().getMemory(), y); + } } @@ -57,12 +57,14 @@ public class CubotFloppyDrive extends CpuHardware { if (floppyDisk == null) { getCpu().getRegisterSet().getRegister("B").setValue(0); } else { - getCpu().getRegisterSet().getRegister("B").setValue(1); + if (cubot.spendEnergy(1)) { + getCpu().getRegisterSet().getRegister("B").setValue(1); - int x = getCpu().getRegisterSet().getRegister("X").getValue(); - int y = getCpu().getRegisterSet().getRegister("Y").getValue(); + int x = getCpu().getRegisterSet().getRegister("X").getValue(); + int y = getCpu().getRegisterSet().getRegister("Y").getValue(); - floppyDisk.writeSector(x, cubot.getParent().getCpu().getMemory(), y); + floppyDisk.writeSector(x, cubot.getParent().getCpu().getMemory(), y); + } } } diff --git a/Plugin Cubot/src/net/simon987/cubotplugin/FloppyDisk.java b/Plugin Cubot/src/net/simon987/cubotplugin/FloppyDisk.java index f32e5a8..0b54718 100644 --- a/Plugin Cubot/src/net/simon987/cubotplugin/FloppyDisk.java +++ b/Plugin Cubot/src/net/simon987/cubotplugin/FloppyDisk.java @@ -3,7 +3,6 @@ package net.simon987.cubotplugin; import net.simon987.server.assembly.Memory; import net.simon987.server.io.JSONSerialisable; -import net.simon987.server.logging.LogManager; import org.json.simple.JSONObject; /** @@ -39,19 +38,21 @@ public class FloppyDisk implements JSONSerialisable { */ public boolean readSector(int sector, Memory cpuMemory, int ramAddress) { - cpuMemory.write(ramAddress, memory.getBytes(), sector * 512, 1024); + if (sector <= 1440) { + cpuMemory.write(ramAddress, memory.getBytes(), sector * 1024, 1024); - LogManager.LOGGER.fine("Read 512 words from floppy sector:" + sector + " to memory addr:" + ramAddress); + //Calculate seek time + int deltaTrack = (sector / 80) - rwHeadTrack; - //Calculate seek time - int deltaTrack = (sector / 80) - rwHeadTrack; - - if (deltaTrack != 0) { - rwHeadTrack = (sector / 80); - return false; - } else { - return true; + if (deltaTrack != 0) { + rwHeadTrack = (sector / 80); + return false; + } else { + return true; + } } + return false; + } /** @@ -64,18 +65,20 @@ public class FloppyDisk implements JSONSerialisable { */ public boolean writeSector(int sector, Memory cpuMemory, int ramAddress) { - memory.write(sector * 512, cpuMemory.getBytes(), ramAddress * 2, 1024); + if (sector <= 1440) { + memory.write(sector * 512, cpuMemory.getBytes(), ramAddress * 2, 1024); - LogManager.LOGGER.fine("Wrote 512 words to floppy sector:" + sector + " from memory addr:" + ramAddress); + //Calculate seek time + int deltaTrack = (sector / 80) - rwHeadTrack; - //Calculate seek time - int deltaTrack = (sector / 80) - rwHeadTrack; - - if (deltaTrack != 0) { - rwHeadTrack = (sector / 80); - return false; + if (deltaTrack != 0) { + rwHeadTrack = (sector / 80); + return false; + } else { + return true; + } } else { - return true; + return false; } } diff --git a/Server/src/net/simon987/server/GameServer.java b/Server/src/net/simon987/server/GameServer.java index 0c37de9..c4d2817 100644 --- a/Server/src/net/simon987/server/GameServer.java +++ b/Server/src/net/simon987/server/GameServer.java @@ -108,8 +108,14 @@ public class GameServer implements Runnable { for (User user : users_) { if(user.getCpu() != null){ - user.getCpu().reset(); - user.getCpu().execute(); + try { + user.getCpu().reset(); + user.getCpu().execute(); + } catch (Exception e) { + LogManager.LOGGER.severe("Error executing " + user.getUsername() + "'s code"); + e.printStackTrace(); + } + } } diff --git a/Server/src/net/simon987/server/assembly/Memory.java b/Server/src/net/simon987/server/assembly/Memory.java index 97535f2..a77bf94 100755 --- a/Server/src/net/simon987/server/assembly/Memory.java +++ b/Server/src/net/simon987/server/assembly/Memory.java @@ -60,7 +60,7 @@ public class Memory implements Target, JSONSerialisable { offset = (char)offset * 2; - if (offset + count > this.bytes.length || count < 0 || offset < 0) { + if (offset + count > this.bytes.length || count < 0 || offset < 0 || srcOffset >= bytes.length) { return false; }