Further simplifications and speedups to the json code.

Signed-off-by: Adrian Conlon <adrian.conlon@gmail.com>
This commit is contained in:
Adrian Conlon 2021-10-21 22:03:07 +01:00
parent 0adb60a0f4
commit 393fab2bbc
9 changed files with 46 additions and 49 deletions

View File

@ -1,6 +1,9 @@
#include "stdafx.h" #include "stdafx.h"
#include "TestRunner.h" #include "TestRunner.h"
std::set<uint8_t> TestRunner::m_undocumented_opcodes;
bool TestRunner::m_undocumented_opcodes_initialised = false;
TestRunner::TestRunner(const test_t& test) TestRunner::TestRunner(const test_t& test)
: m_test(test) {} : m_test(test) {}
@ -128,10 +131,10 @@ void TestRunner::initialiseState() {
CPU().Y() = starting.y(); CPU().Y() = starting.y();
CPU().P() = starting.p(); CPU().P() = starting.p();
const auto& ram = starting.ram(); const auto& ram = starting.ram();
for (auto entry : ram) for (auto entry : ram) {
RAM().poke(entry.address(), entry.value()); const byte_t byte(entry);
RAM().poke(byte.address(), byte.value());
m_actualCycles.clear(); }
} }
bool TestRunner::checkState() { bool TestRunner::checkState() {
@ -162,7 +165,8 @@ bool TestRunner::checkState() {
const auto& ram = finished.ram(); const auto& ram = finished.ram();
bool ram_problem = false; bool ram_problem = false;
for (auto entry : ram) { for (auto entry : ram) {
const auto ram_good = check("RAM", entry.address(), entry.value(), RAM().peek(entry.address())); const byte_t byte(entry);
const auto ram_good = check("RAM", byte.address(), byte.value(), RAM().peek(byte.address()));
if (!ram_good && !ram_problem) if (!ram_good && !ram_problem)
ram_problem = true; ram_problem = true;
} }
@ -231,6 +235,7 @@ void TestRunner::check() {
} }
void TestRunner::seedUndocumentedOpcodes() { void TestRunner::seedUndocumentedOpcodes() {
if (m_undocumented_opcodes_initialised) return;
m_undocumented_opcodes = { m_undocumented_opcodes = {
0x02, 0x03, 0x04, 0x07, 0x0b, 0x0c, 0x0f, 0x02, 0x03, 0x04, 0x07, 0x0b, 0x0c, 0x0f,
0x12, 0x13, 0x14, 0x17, 0x1a, 0x1b, 0x1c, 0x1f, 0x12, 0x13, 0x14, 0x17, 0x1a, 0x1b, 0x1c, 0x1f,
@ -249,4 +254,5 @@ void TestRunner::seedUndocumentedOpcodes() {
0xe2, 0xe3, 0xe7, 0xeb, 0xef, 0xe2, 0xe3, 0xe7, 0xeb, 0xef,
0xf1, 0xf2, 0xf3, 0xf4, 0xf7, 0xfa, 0xfb, 0xfc, 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf7, 0xfa, 0xfb, 0xfc, 0xff,
}; };
m_undocumented_opcodes_initialised = true;
} }

View File

@ -16,6 +16,9 @@
class TestRunner final : public EightBit::Bus { class TestRunner final : public EightBit::Bus {
private: private:
static std::set<uint8_t> m_undocumented_opcodes;
static bool m_undocumented_opcodes_initialised;
EightBit::Ram m_ram = 0x10000; EightBit::Ram m_ram = 0x10000;
EightBit::MOS6502 m_cpu = { *this }; EightBit::MOS6502 m_cpu = { *this };
EightBit::Symbols m_symbols; EightBit::Symbols m_symbols;
@ -33,8 +36,6 @@ private:
bool m_valid = true; bool m_valid = true;
bool m_undocumented = false; bool m_undocumented = false;
std::set<uint8_t> m_undocumented_opcodes;
void seedUndocumentedOpcodes(); void seedUndocumentedOpcodes();
void initialiseState(); void initialiseState();
[[nodiscard]] bool checkState(); [[nodiscard]] bool checkState();

View File

@ -1,8 +1,5 @@
#include "stdafx.h" #include "stdafx.h"
#include "byte_t.h" #include "byte_t.h"
byte_t::byte_t(simdjson::dom::element input) noexcept
: byte_t(input.get_array()) {}
byte_t::byte_t(simdjson::dom::array input) noexcept byte_t::byte_t(simdjson::dom::array input) noexcept
: m_raw(input) {} : m_raw(input) {}

View File

@ -8,10 +8,14 @@ class byte_t final {
private: private:
const simdjson::dom::array m_raw; const simdjson::dom::array m_raw;
[[nodiscard]] auto at(size_t idx) const noexcept { return m_raw.at(idx); }
[[nodiscard]] auto integer_at(size_t idx) const noexcept { return (int64_t)at(idx); }
[[nodiscard]] auto address_at(size_t idx) const noexcept { return (uint16_t)integer_at(idx); }
[[nodiscard]] auto byte_at(size_t idx) const noexcept { return (uint8_t)integer_at(idx); }
public: public:
byte_t(simdjson::dom::element input) noexcept;
byte_t(simdjson::dom::array input) noexcept; byte_t(simdjson::dom::array input) noexcept;
[[nodiscard]] auto address() const noexcept { return (uint16_t)(int64_t)m_raw.at(0); } [[nodiscard]] auto address() const noexcept { return address_at(0); }
[[nodiscard]] auto value() const noexcept { return (uint8_t)(int64_t)m_raw.at(1); } [[nodiscard]] auto value() const noexcept { return byte_at(1); }
}; };

View File

@ -21,7 +21,5 @@ public:
[[nodiscard]] auto size() const noexcept { return m_cycles.size(); } [[nodiscard]] auto size() const noexcept { return m_cycles.size(); }
void clear() { m_cycles.clear(); }
[[nodiscard]] const auto& operator[](size_t idx) const noexcept { return m_cycles[idx]; } [[nodiscard]] const auto& operator[](size_t idx) const noexcept { return m_cycles[idx]; }
}; };

View File

@ -1,14 +1,5 @@
#include "stdafx.h" #include "stdafx.h"
#include "ram_t.h" #include "ram_t.h"
void ram_t::add(byte_t byte) { ram_t::ram_t(simdjson::dom::array input)
assert(m_bytes.capacity() >= (m_bytes.size() + 1)); : m_raw(input) {}
m_bytes.push_back(byte);
}
ram_t::ram_t(simdjson::dom::array input) {
assert(m_bytes.empty());
m_bytes.reserve(input.size());
for (auto entry : input)
add(entry);
}

View File

@ -1,25 +1,16 @@
#pragma once #pragma once
#include <cstdint>
#include <vector>
#include "simdjson/simdjson.h" #include "simdjson/simdjson.h"
#include "byte_t.h" #include "byte_t.h"
class ram_t final { class ram_t final {
private: private:
std::vector<byte_t> m_bytes; simdjson::dom::array m_raw;;
public: public:
ram_t(simdjson::dom::array input); ram_t(simdjson::dom::array input);
void add(byte_t byte); [[nodiscard]] auto begin() const noexcept { return m_raw.begin(); }
[[nodiscard]] auto end() const noexcept { return m_raw.end(); }
[[nodiscard]] auto begin() const noexcept { return m_bytes.begin(); }
[[nodiscard]] auto end() const noexcept { return m_bytes.end(); }
[[nodiscard]] auto size() const noexcept { return m_bytes.size(); }
[[nodiscard]] auto operator[](size_t idx) const noexcept { return m_bytes[idx]; }
}; };

View File

@ -10,14 +10,20 @@ class state_t final {
private: private:
const simdjson::dom::element m_raw; const simdjson::dom::element m_raw;
[[nodiscard]] auto at(std::string key) const noexcept { return m_raw[key]; }
[[nodiscard]] auto integer_at(std::string key) const noexcept { return (int64_t)at(key); }
[[nodiscard]] auto address_at(std::string key) const noexcept { return (uint16_t)integer_at(key); }
[[nodiscard]] auto byte_at(std::string key) const noexcept { return (uint8_t)integer_at(key); }
[[nodiscard]] auto array_at(std::string key) const noexcept { return at(key).get_array(); }
public: public:
state_t(simdjson::dom::element input); state_t(simdjson::dom::element input);
[[nodiscard]] auto pc() const noexcept { return (uint16_t)(int64_t)m_raw["pc"]; } [[nodiscard]] auto pc() const noexcept { return address_at("pc"); }
[[nodiscard]] auto s() const noexcept { return (uint8_t)(int64_t)m_raw["s"]; } [[nodiscard]] auto s() const noexcept { return byte_at("s"); }
[[nodiscard]] auto a() const noexcept { return (uint8_t)(int64_t)m_raw["a"]; } [[nodiscard]] auto a() const noexcept { return byte_at("a"); }
[[nodiscard]] auto x() const noexcept { return (uint8_t)(int64_t)m_raw["x"]; } [[nodiscard]] auto x() const noexcept { return byte_at("x"); }
[[nodiscard]] auto y() const noexcept { return (uint8_t)(int64_t)m_raw["y"]; } [[nodiscard]] auto y() const noexcept { return byte_at("y"); }
[[nodiscard]] auto p() const noexcept { return (uint8_t)(int64_t)m_raw["p"]; } [[nodiscard]] auto p() const noexcept { return byte_at("p"); }
[[nodiscard]] const auto ram() const noexcept { return ram_t(m_raw["ram"].get_array()); } [[nodiscard]] auto ram() const noexcept { return ram_t(array_at("ram")); }
}; };

View File

@ -11,11 +11,14 @@ class test_t final {
private: private:
simdjson::dom::element m_raw; simdjson::dom::element m_raw;
[[nodiscard]] auto at(std::string key) const noexcept { return m_raw[key]; }
[[nodiscard]] auto array_at(std::string key) const noexcept { return at(key).get_array(); }
public: public:
test_t(simdjson::dom::element input); test_t(simdjson::dom::element input);
[[nodiscard]] const auto name() const noexcept { return m_raw["name"]; } [[nodiscard]] auto name() const noexcept { return at("name"); }
[[nodiscard]] const auto initial_state() const noexcept { return state_t(m_raw["initial"]); } [[nodiscard]] auto initial_state() const noexcept { return state_t(at("initial")); }
[[nodiscard]] const auto final_state() const noexcept { return state_t(m_raw["final"]); } [[nodiscard]] auto final_state() const noexcept { return state_t(at("final")); }
[[nodiscard]] const auto cycles() const noexcept { return cycles_t(m_raw["cycles"].get_array()); } [[nodiscard]] auto cycles() const noexcept { return cycles_t(array_at("cycles")); }
}; };