From d9cb0d1212ea81c2f921c3e93f035d4ab20eb955 Mon Sep 17 00:00:00 2001 From: empathicqubit Date: Thu, 4 Nov 2021 00:24:50 +0100 Subject: [PATCH] Registers available --- commands.lua | 86 ++++++++++++++++++++++++++++++++++++++++------------ server.lua | 7 +++++ 2 files changed, 74 insertions(+), 19 deletions(-) diff --git a/commands.lua b/commands.lua index 1efba18..5207aa3 100644 --- a/commands.lua +++ b/commands.lua @@ -179,23 +179,6 @@ return function(server) server.response(server.responseType.PING, server.errorType.OK, command.requestId, nil) end - local function processExit(command) - server.running = true - - server.response(server.responseType.EXIT, server.errorType.OK, command.requestId, nil) - - me.monitorClosed() - end - - local function processReset(command) - server.running = true - emu.reset() - - server.response(server.responseType.RESET, server.errorType.OK, command.requestId, nil) - - me.monitorClosed() - end - local memspaces = { MAIN = 0, INVALID = -1, @@ -222,6 +205,69 @@ return function(server) return memspace == memspaces.MAIN and banknum >= banks.default and banknum <= banks.secondaryOam end + local function ignoreRegister(meta) + return false + end + + local function processRegistersAvailable(command) + if command.length < 1 then + server.errorResponse(server.errorType.CMD_INVALID_LENGTH, command.requestId) + return + end + + local requestedMemspace = server.readUint8(command.body, 1) + local memspace = getRequestedMemspace(requestedMemspace) + + if memspace == memspaces.INVALID then + server.errorResponse(server.errorType.INVALID_MEMSPACE, command.requestId) + return + end + + local allRegCount = 0; + local responseRegCount = 0; + + for name, meta in pairs(regMeta) do + if not ignoreRegister(meta) then + responseRegCount = responseRegCount + 1 + end + allRegCount = allRegCount + 1 + end + + local r = {} + + r[#r+1] = server.uint16ToLittleEndian(responseRegCount) + + for name, meta in pairs(regMeta) do + if not ignoreRegister(meta) then + local itemSize = meta.name:len() + 3 + + r[#r+1] = server.uint8ToLittleEndian(itemSize) + r[#r+1] = server.uint8ToLittleEndian(meta.id) + r[#r+1] = server.uint8ToLittleEndian(meta.size * 8) + r[#r+1] = server.writeString(meta.name); + end + end + + server.response(server.responseType.REGISTERS_AVAILABLE, server.errorType.OK, command.requestId, table.concat(r)); + end + + local function processExit(command) + server.running = true + + server.response(server.responseType.EXIT, server.errorType.OK, command.requestId, nil) + + me.monitorClosed() + end + + local function processReset(command) + server.running = true + emu.reset() + + server.response(server.responseType.RESET, server.errorType.OK, command.requestId, nil) + + me.monitorClosed() + end + local function processMemorySet(command) local newSidefx = server.readBool(command.body, 1) @@ -241,8 +287,6 @@ return function(server) end local requestedMemspace = server.readUint8(command.body, 6) - local requestedBanknum = server.readUint16(command.body, 7) - local memspace = getRequestedMemspace(requestedMemspace) if memspace == memspaces.INVALID then @@ -250,6 +294,8 @@ return function(server) return end + local requestedBanknum = server.readUint16(command.body, 7) + if not validateBanknum(memspace, requestedBanknum) then server.errorResponse(server.errorType.INVALID_PARAMETER, command.requestId) return @@ -642,6 +688,8 @@ return function(server) elseif ct == server.commandType.PING then processPing(command) + elseif ct == server.commandType.REGISTERS_AVAILABLE then + processRegistersAvailable(command) elseif ct == server.commandType.EXIT then processExit(command) diff --git a/server.lua b/server.lua index af12a4e..ec19b91 100644 --- a/server.lua +++ b/server.lua @@ -43,6 +43,13 @@ function me.uint32ToLittleEndian(value) return string.char(value & 0xff, (value >> 8) & 0xff, (value >> 16) & 0xff, (value >> 24) & 0xff) end +function me.writeString(value) + if value == nil then + error("value is nil", 2) + end + return string.char(value:len()) .. value +end + function me.readUint32(data, index) return data:byte(index) + (data:byte(index + 1) << 8) + (data:byte(index + 2) << 16) + (data:byte(index + 3) << 24) end