From 5e9f484662fc50f875d341976aa41abbc1a16521 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Mon, 22 Jan 2024 21:09:13 -0500 Subject: [PATCH 1/7] Avoid macro. --- Analyser/Static/StaticAnalyser.hpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/Analyser/Static/StaticAnalyser.hpp b/Analyser/Static/StaticAnalyser.hpp index 63b9e8867..05aedfa64 100644 --- a/Analyser/Static/StaticAnalyser.hpp +++ b/Analyser/Static/StaticAnalyser.hpp @@ -38,12 +38,15 @@ struct Media { } Media &operator +=(const Media &rhs) { -#define append(name) name.insert(name.end(), rhs.name.begin(), rhs.name.end()); - append(disks); - append(tapes); - append(cartridges); - append(mass_storage_devices); -#undef append + const auto append = [&](auto &destination, auto &source) { + destination.insert(destination.end(), source.begin(), source.end()); + }; + + append(disks, rhs.disks); + append(tapes, rhs.tapes); + append(cartridges, rhs.cartridges); + append(mass_storage_devices, rhs.mass_storage_devices); + return *this; } }; From ae31f85f0ca444fb7b67aff9bbd66130a91678cf Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Mon, 22 Jan 2024 21:11:15 -0500 Subject: [PATCH 2/7] Eliminate macro. --- Storage/Disk/Encodings/AppleGCR/Encoder.cpp | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/Storage/Disk/Encodings/AppleGCR/Encoder.cpp b/Storage/Disk/Encodings/AppleGCR/Encoder.cpp index 0cd6850f0..68f8280cd 100644 --- a/Storage/Disk/Encodings/AppleGCR/Encoder.cpp +++ b/Storage/Disk/Encodings/AppleGCR/Encoder.cpp @@ -74,16 +74,14 @@ Storage::Disk::PCMSegment AppleGCR::AppleII::header(uint8_t volume, uint8_t trac data[1] = header_prologue[1]; data[2] = header_prologue[2]; -#define WriteFM(index, value) \ - data[index+0] = uint8_t(((value) >> 1) | 0xaa); \ - data[index+1] = uint8_t((value) | 0xaa); \ - - WriteFM(3, volume); - WriteFM(5, track); - WriteFM(7, sector); - WriteFM(9, checksum); - -#undef WriteFM + const auto write_fm = [&](std::size_t index, uint8_t value) { + data[index+0] = uint8_t(((value) >> 1) | 0xaa); + data[index+1] = uint8_t((value) | 0xaa); + }; + write_fm(3, volume); + write_fm(5, track); + write_fm(7, sector); + write_fm(9, checksum); data[11] = epilogue[0]; data[12] = epilogue[1]; From a3337ea90f3b5f3deb5fac9118d3c438fa88a4f4 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Mon, 22 Jan 2024 21:15:44 -0500 Subject: [PATCH 3/7] Remove macro. --- Storage/Disk/Encodings/AppleGCR/SegmentParser.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Storage/Disk/Encodings/AppleGCR/SegmentParser.cpp b/Storage/Disk/Encodings/AppleGCR/SegmentParser.cpp index 8df9d09ca..7e0802551 100644 --- a/Storage/Disk/Encodings/AppleGCR/SegmentParser.cpp +++ b/Storage/Disk/Encodings/AppleGCR/SegmentParser.cpp @@ -205,9 +205,11 @@ std::unique_ptr decode_appleii_sector(const std::array } else { // Undo the 6 and 2 mapping. constexpr uint8_t bit_reverse[] = {0, 2, 1, 3}; - #define unmap(byte, nibble, shift) \ - sector->data[86 + byte] = uint8_t(\ - (sector->data[86 + byte] << 2) | bit_reverse[(sector->data[nibble] >> shift)&3]); + const auto unmap = [&](std::size_t byte, std::size_t nibble, int shift) { + sector->data[86 + byte] = uint8_t( + (sector->data[86 + byte] << 2) | bit_reverse[(sector->data[nibble] >> shift)&3] + ); + }; for(std::size_t c = 0; c < 84; ++c) { unmap(c, c, 0); @@ -220,8 +222,6 @@ std::unique_ptr decode_appleii_sector(const std::array unmap(85, 85, 0); unmap(171, 85, 2); - #undef unmap - // Throw away the collection of two-bit chunks from the start of the sector. sector->data.erase(sector->data.begin(), sector->data.end() - 256); From cb125e6336c85f0827769961ea6a83e24ef9d67c Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Mon, 22 Jan 2024 21:17:00 -0500 Subject: [PATCH 4/7] Use constexpr functions rather than macros. --- .../MassStorage/SCSI/TargetImplementation.hpp | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/Storage/MassStorage/SCSI/TargetImplementation.hpp b/Storage/MassStorage/SCSI/TargetImplementation.hpp index 4ef8e230d..67078484e 100644 --- a/Storage/MassStorage/SCSI/TargetImplementation.hpp +++ b/Storage/MassStorage/SCSI/TargetImplementation.hpp @@ -170,14 +170,16 @@ template void Target::begin_command(uint8_t first_ } } +namespace { + +constexpr uint8_t G0(uint8_t opcode) { return 0x00 | opcode; } +constexpr uint8_t G1(uint8_t opcode) { return 0x20 | opcode; } +constexpr uint8_t G5(uint8_t opcode) { return 0xa0 | opcode; } + +} + template bool Target::dispatch_command() { - CommandState arguments(command_, data_); - -#define G0(x) x -#define G1(x) (0x20|x) -#define G5(x) (0xa0|x) - log_.info().append("---Command %02x---", command_[0]); switch(command_[0]) { @@ -209,14 +211,9 @@ template bool Target::dispatch_command() { case G1(0x1c): return executor_.read_buffer(arguments, *this); case G1(0x15): return executor_.mode_select(arguments, *this); - case G5(0x09): return executor_.set_block_limits(arguments, *this); } -#undef G0 -#undef G1 -#undef G5 - return false; } From cc165b65be2599a5faee87f17b7d80e0d10869aa Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Mon, 22 Jan 2024 21:22:56 -0500 Subject: [PATCH 5/7] Switch to lambda. --- Storage/Tape/Parsers/Oric.cpp | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/Storage/Tape/Parsers/Oric.cpp b/Storage/Tape/Parsers/Oric.cpp index cc3019bc4..c1ebdc007 100644 --- a/Storage/Tape/Parsers/Oric.cpp +++ b/Storage/Tape/Parsers/Oric.cpp @@ -88,22 +88,23 @@ void Parser::inspect_waves(const std::vector &waves) { } break; - case SlowData: -#define CHECK_RUN(length, type, symbol) \ - if(waves.size() >= length) {\ - std::size_t c;\ - for(c = 0; c < length; c++) if(waves[c] != type) break;\ - if(c == length) {\ - push_symbol(symbol, length);\ - return;\ - }\ - } + case SlowData: { + const auto check_run = [&](std::size_t length, WaveType type, SymbolType symbol) -> bool { + if(waves.size() >= length) { + std::size_t c; + for(c = 0; c < length; c++) if(waves[c] != type) break; + if(c == length) { + push_symbol(symbol, int(length)); + return true; + } + } + return false; + }; - CHECK_RUN(4, WaveType::Long, SymbolType::Zero); - CHECK_RUN(8, WaveType::Short, SymbolType::One); -#undef CHECK_RUN + if(check_run(4, WaveType::Long, SymbolType::Zero)) return; + if(check_run(8, WaveType::Short, SymbolType::One)) return; if(waves.size() < 16) return; // TODO, maybe: if there are any inconsistencies in the first 8, don't return - break; + } break; case Sync: { // Sync is 0x16, either encoded fast or slow; i.e. 0 0110 1000 1 From 030f49db837a2f11e006ab103decf80c1704da98 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Mon, 22 Jan 2024 21:33:39 -0500 Subject: [PATCH 6/7] Eliminate macro. --- Analyser/Static/Acorn/Tape.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Analyser/Static/Acorn/Tape.cpp b/Analyser/Static/Acorn/Tape.cpp index b162e2a56..8badda594 100644 --- a/Analyser/Static/Acorn/Tape.cpp +++ b/Analyser/Static/Acorn/Tape.cpp @@ -19,8 +19,10 @@ static std::unique_ptr GetNextChunk(const std::shared_ptr(); int shift_register = 0; -// TODO: move this into the parser -#define shift() shift_register = (shift_register >> 1) | (parser.get_next_bit(tape) << 9) + // TODO: move this into the parser + const auto shift = [&] { + shift_register = (shift_register >> 1) | (parser.get_next_bit(tape) << 9); + }; // find next area of high tone while(!tape->is_at_end() && (shift_register != 0x3ff)) { @@ -32,8 +34,6 @@ static std::unique_ptr GetNextChunk(const std::shared_ptr Date: Mon, 22 Jan 2024 21:37:04 -0500 Subject: [PATCH 7/7] Avoid macro. --- Storage/Disk/DiskImage/Formats/WOZ.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Storage/Disk/DiskImage/Formats/WOZ.cpp b/Storage/Disk/DiskImage/Formats/WOZ.cpp index 9baa0ddc8..37f237db3 100644 --- a/Storage/Disk/DiskImage/Formats/WOZ.cpp +++ b/Storage/Disk/DiskImage/Formats/WOZ.cpp @@ -15,6 +15,12 @@ using namespace Storage::Disk; +namespace { +constexpr uint32_t chunk(const char *str) { + return uint32_t(str[0] | (str[1] << 8) | (str[2] << 16) | (str[3] << 24)); +} +} + WOZ::WOZ(const std::string &file_name) : file_(file_name) { @@ -58,9 +64,8 @@ WOZ::WOZ(const std::string &file_name) : long end_of_chunk = file_.tell() + long(chunk_size); - #define CK(str) (str[0] | (str[1] << 8) | (str[2] << 16) | (str[3] << 24)) switch(chunk_id) { - case CK("INFO"): { + case chunk("INFO"): { const uint8_t version = file_.get8(); if(version > 2) break; is_3_5_disk_ = file_.get8() == 2; @@ -81,12 +86,12 @@ WOZ::WOZ(const std::string &file_name) : */ } break; - case CK("TMAP"): { + case chunk("TMAP"): { file_.read(track_map_, 160); has_tmap = true; } break; - case CK("TRKS"): { + case chunk("TRKS"): { tracks_offset_ = file_.tell(); } break; @@ -95,7 +100,6 @@ WOZ::WOZ(const std::string &file_name) : default: break; } - #undef CK file_.seek(end_of_chunk, SEEK_SET); }