Added basic floppy drives #3.

This commit is contained in:
simon
2017-11-14 17:25:12 -05:00
parent da7d050661
commit cfb8050cee
13 changed files with 318 additions and 28 deletions

View File

@@ -55,7 +55,7 @@ public class Memory implements Target, JSONSerialisable {
/**
* Write x words from an array at an offset
*/
public boolean write(int offset, byte[] bytes, int count) {
public boolean write(int offset, byte[] bytes, int srcOffset, int count) {
offset = (char)offset * 2;
@@ -64,7 +64,7 @@ public class Memory implements Target, JSONSerialisable {
return false;
}
System.arraycopy(bytes, 0, this.bytes, offset, count);
System.arraycopy(bytes, srcOffset, this.bytes, offset, count);
return true;
}
@@ -122,18 +122,6 @@ public class Memory implements Target, JSONSerialisable {
e.printStackTrace();
}
//To deflate
/*
ByteArrayOutputStream stream2 = new ByteArrayOutputStream();
Inflater decompresser = new Inflater(true);
InflaterOutputStream inflaterOutputStream = new InflaterOutputStream(stream2, decompresser);
inflaterOutputStream.write(output);
inflaterOutputStream.close();
byte[] output2 = stream2.toByteArray();
*/
return json;
}
@@ -157,4 +145,8 @@ public class Memory implements Target, JSONSerialisable {
return memory;
}
public void setBytes(byte[] bytes) {
this.bytes = bytes;
}
}

View File

@@ -1,5 +1,6 @@
package net.simon987.server.game;
import net.simon987.server.assembly.Memory;
import net.simon987.server.user.User;
import java.util.ArrayList;
@@ -14,4 +15,6 @@ public interface ControllableUnit {
ArrayList<Integer> getKeyboardBuffer();
Memory getFloppyData();
}

View File

@@ -29,7 +29,7 @@ public class GameUniverse implements JSONSerialisable{
private int nextObjectId = 0;
private int maxWidth = 3; //0xFFFF
private int maxWidth = 0xFFFF;
public GameUniverse(ServerConfiguration config) {
@@ -113,9 +113,11 @@ public class GameUniverse implements JSONSerialisable{
user.getCpu().getMemory().clear();
//Write assembled code to mem
user.getCpu().getMemory().write((short) ar.origin, ar.bytes, ar.bytes.length);
user.getCpu().getMemory().write((short) ar.origin, ar.bytes, 0, ar.bytes.length);
user.getCpu().setCodeSegmentOffset(ar.origin);
//Init
} else {
user = new User(null);
}

View File

@@ -28,7 +28,7 @@ public class CodeUploadHandler implements MessageHandler {
user.getUser().getCpu().getMemory().clear();
//Write assembled code to mem
user.getUser().getCpu().getMemory().write((char) ar.origin, ar.bytes, ar.bytes.length);
user.getUser().getCpu().getMemory().write((char) ar.origin, ar.bytes, 0, ar.bytes.length);
user.getUser().getCpu().setCodeSegmentOffset(ar.origin);
JSONObject response = new JSONObject();

View File

@@ -0,0 +1,36 @@
package net.simon987.server.webserver;
import net.simon987.server.GameServer;
import net.simon987.server.logging.LogManager;
import org.json.simple.JSONObject;
public class FloppyHandler implements MessageHandler {
SocketServerDatabase db = new SocketServerDatabase(GameServer.INSTANCE.getConfig());
@Override
public void handle(OnlineUser user, JSONObject json) {
if (json.get("t").equals("floppyDown")) {
LogManager.LOGGER.info("(WS) Floppy download request from " + user.getUser().getUsername());
//floppy
byte[] bytes = user.getUser().getControlledUnit().getFloppyData().getBytes();
user.getWebSocket().send(bytes);
} else if (json.get("t").equals("floppyUp")) {
LogManager.LOGGER.info("(WS) Floppy upload request from " + user.getUser().getUsername());
//Check newly uploaded file on the database
byte[] bytes = db.getFloppy(user.getUser().getUsername());
if (bytes != null) {
user.getUser().getControlledUnit().getFloppyData().setBytes(bytes);
}
}
}
}

View File

@@ -68,6 +68,7 @@ public class SocketServer extends WebSocketServer {
messageEventDispatcher.addHandler(new CodeUploadHandler());
messageEventDispatcher.addHandler(new CodeRequestHandler());
messageEventDispatcher.addHandler(new KeypressHandler());
messageEventDispatcher.addHandler(new FloppyHandler());
}

View File

@@ -4,10 +4,7 @@ import net.simon987.server.ServerConfiguration;
import net.simon987.server.io.DatabaseManager;
import net.simon987.server.logging.LogManager;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.*;
class SocketServerDatabase extends DatabaseManager {
@@ -48,4 +45,39 @@ class SocketServerDatabase extends DatabaseManager {
return null;
}
byte[] getFloppy(String username) {
Connection connection = null;
try {
connection = getConnection();
PreparedStatement p = connection.prepareStatement("SELECT floppyData FROM mar_user WHERE username=?");
p.setString(1, username);
ResultSet rs = p.executeQuery();
if (rs.next()) {
Blob blob = rs.getBlob("floppyData");
if (blob != null) {
return blob.getBytes(1, (int) blob.length() - 1);
}
}
} catch (SQLException e) {
LogManager.LOGGER.severe("MySQL Error " + e.getErrorCode() + ": " + e.getMessage());
} finally {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return null;
}
}

View File

@@ -36,14 +36,14 @@ public class MemoryTest {
Memory memory = new Memory(memorySize);
assertTrue(memory.write(0, new byte[memorySize], memorySize));
assertFalse(memory.write(0, new byte[memorySize], memorySize + 1));
assertFalse(memory.write(0, new byte[memorySize], -1));
assertFalse(memory.write(-1, new byte[memorySize], 10));
assertTrue(memory.write(0, new byte[memorySize], 0, memorySize));
assertFalse(memory.write(0, new byte[memorySize], 0, memorySize + 1));
assertFalse(memory.write(0, new byte[memorySize], 0, -1));
assertFalse(memory.write(-1, new byte[memorySize], 0, 10));
assertFalse(memory.write(memorySize / 2, new byte[15], 1));
assertFalse(memory.write((memorySize / 2) - 5, new byte[11], 11));
assertTrue(memory.write((memorySize / 2) - 5, new byte[11], 10));
assertFalse(memory.write(memorySize / 2, new byte[15], 0, 1));
assertFalse(memory.write((memorySize / 2) - 5, new byte[11], 0, 11));
assertTrue(memory.write((memorySize / 2) - 5, new byte[11], 0, 10));
}