Bug fixes related to floppy drive

This commit is contained in:
simon 2017-11-14 20:58:07 -05:00
parent cfb8050cee
commit 8701007ad9
4 changed files with 44 additions and 33 deletions

View File

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

View File

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

View File

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

View File

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