From f14d05a28a56035248a5ba72278eab8619d16263 Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Wed, 13 Nov 2024 14:50:22 +0100 Subject: [PATCH] add reversing --- src/IO.cpp | 54 +++++++++++++++++++++++++++++++++++++++++++++++----- src/IO.h | 7 ++++--- src/main.cpp | 33 ++++++++++++++++++++++---------- 3 files changed, 76 insertions(+), 18 deletions(-) diff --git a/src/IO.cpp b/src/IO.cpp index 83ff2dc..de2e911 100644 --- a/src/IO.cpp +++ b/src/IO.cpp @@ -1,8 +1,27 @@ #include "IO.h" #include "Assembleur.h" +#include #include +#include #include +#include + +static std::uint32_t reverseInt(std::uint32_t a_Int) { + std::uint32_t result = 0; + for (int i = 0; i < 32; i++) { + result |= a_Int & 0x1; + result <<= 1; + a_Int >>= 1; + } + return result; +} + +static void reverseDataByte(BinaryData& a_Data) { + for (std::uint32_t& element : a_Data) { + element = reverseInt(element); + } +} BinaryData ParseFile(const std::string& fileName) { std::ifstream file{fileName}; @@ -45,22 +64,47 @@ BinaryData ParseFile(const std::string& fileName) { return output; } -void OutputFileBinary(const BinaryData& a_Data, const std::string& fileName) { +void OutputFileBinary(BinaryData& a_Data, const std::string& fileName, bool a_Reverse) { std::ofstream file{fileName}; + if (a_Reverse) + reverseDataByte(a_Data); file.write(reinterpret_cast(a_Data.data()), a_Data.size() * sizeof(a_Data.at(0))); } -void OutputFileIntegers(const BinaryData& a_Data, const std::string& fileName) { +void OutputFileIntegers(BinaryData& a_Data, const std::string& fileName, bool a_Reverse) { std::ofstream file{fileName}; + if (a_Reverse) + reverseDataByte(a_Data); for (std::uint32_t number : a_Data) { file << number << "\n"; } } -void OutputFileBinIntegers(const BinaryData& a_Data, const std::string& fileName) { +void OutputFileBinIntegers(BinaryData& a_Data, const std::string& fileName, bool a_Reverse) { std::ofstream file{fileName}; + if (a_Reverse) + reverseDataByte(a_Data); for (std::uint32_t number : a_Data) { - file << std::bitset<8>(number >> 24) << " " << std::bitset<8>(number >> 16) << " " << std::bitset<8>(number >> 8) << - " " << std::bitset<8>(number) << "\n"; + file << std::bitset<8>(number >> 24) << " " << std::bitset<8>(number >> 16) << " " << std::bitset<8>(number >> 8) << " " + << std::bitset<8>(number) << "\n"; + } +} + +void OutputFileLogisim(BinaryData& a_Data, const std::string& fileName, const std::string& a_Header, bool a_Reverse) { + std::ofstream file{fileName}; + file << a_Header << "\n"; + std::uint64_t cursor = 0; + if (a_Reverse) + reverseDataByte(a_Data); + for (std::uint32_t number : a_Data) { + if (cursor % 8 == 0) { + file << std::setfill('0') << std::setw(4) << std::hex << cursor << std::dec << ": "; + file << std::bitset<8>(number >> 24) << " " << std::bitset<8>(number >> 16) << " " << std::bitset<8>(number >> 8) << " " + << std::bitset<8>(number) << " "; + } else { + file << std::bitset<8>(number >> 24) << " " << std::bitset<8>(number >> 16) << " " << std::bitset<8>(number >> 8) << " " + << std::bitset<8>(number) << "\n"; + } + cursor += 4; } } \ No newline at end of file diff --git a/src/IO.h b/src/IO.h index dddbde7..cef78eb 100644 --- a/src/IO.h +++ b/src/IO.h @@ -7,6 +7,7 @@ using BinaryData = std::vector; BinaryData ParseFile(const std::string& fileName); -void OutputFileBinary(const BinaryData& a_Data, const std::string& fileName); -void OutputFileIntegers(const BinaryData& a_Data, const std::string& fileName); -void OutputFileBinIntegers(const BinaryData& a_Data, const std::string& fileName); \ No newline at end of file +void OutputFileBinary(BinaryData& a_Data, const std::string& fileName, bool a_Reverse); +void OutputFileIntegers(BinaryData& a_Data, const std::string& fileName, bool a_Reverse); +void OutputFileBinIntegers(BinaryData& a_Data, const std::string& fileName, bool a_Reverse); +void OutputFileLogisim(BinaryData& a_Data, const std::string& fileName, const std::string& a_Header, bool a_Reverse); \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index c2d3e30..fa7eb54 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,9 +8,7 @@ int main(int argc, char** argv) { argparse::ArgumentParser program("Assembleur"); std::string inputFileName; - program.add_argument("file") - .help("The assembly file to compile") - .store_into(inputFileName); + program.add_argument("file").help("The assembly file to compile").store_into(inputFileName); std::string outputFileName; program.add_argument("-o", "--output") @@ -21,12 +19,25 @@ int main(int argc, char** argv) { std::string formatType; program.add_argument("-f", "--format") - .help("Type of the output. [bin|int|binint]") + .help("Type of the output. [logisim|bin|int|binint]") .metavar("type") - .default_value(std::string("binint")) - .choices("bin", "int", "binint") + .default_value(std::string("logisim")) + .choices("logisim", "bin", "int", "binint") .store_into(formatType); + std::string header; + program.add_argument("-h", "--header") + .help("Header of the file") + .metavar("header") + .default_value(std::string("v3.0 hex words addressed")) + .store_into(header); + + bool reverse; + program.add_argument("-r", "--reversed") + .help("inverse bit orders") + .flag() + .store_into(reverse); + try { program.parse_args(argc, argv); } catch (const std::exception& err) { @@ -38,12 +49,14 @@ int main(int argc, char** argv) { try { auto output = ParseFile(inputFileName); - if (formatType == "bin") { - OutputFileBinary(output, outputFileName); + if (formatType == "logisim") { + OutputFileLogisim(output, outputFileName, header, reverse); + } else if (formatType == "bin") { + OutputFileBinary(output, outputFileName, reverse); } else if (formatType == "int") { - OutputFileIntegers(output, outputFileName); + OutputFileIntegers(output, outputFileName, reverse); } else { - OutputFileBinIntegers(output, outputFileName); + OutputFileBinIntegers(output, outputFileName, reverse); } } catch (std::runtime_error& e) {