Skip to content

Commit 62ae04e

Browse files
committed
Use std::format
1 parent 984491c commit 62ae04e

File tree

4 files changed

+50
-79
lines changed

4 files changed

+50
-79
lines changed

src/CDI/common/utils.hpp

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <algorithm>
55
#include <concepts>
66
#include <cstdint>
7+
#include <format>
78
#include <sstream>
89
#include <string>
910
#include <utility>
@@ -104,24 +105,7 @@ constexpr bool isEven(const T number) noexcept
104105
template<std::integral T>
105106
static std::string toHex(const T number)
106107
{
107-
// TODO: use std::format.
108-
std::stringstream ss;
109-
ss << std::hex << number;
110-
return ss.str();
111-
}
112-
113-
/** \brief Specialisation for char types to print as numbers. */
114-
template<>
115-
constexpr std::string toHex(const uint8_t number)
116-
{
117-
return toHex<unsigned>(number);
118-
}
119-
120-
/** \brief Specialisation for char types to print as numbers. */
121-
template<>
122-
constexpr std::string toHex(const int8_t number)
123-
{
124-
return toHex<int>(number);
108+
return std::format("{:X}", number);
125109
}
126110

127111
/** \brief Converts the binary representation of a number to a string.

src/CDI/cores/SCC68070/Disassembler.cpp

Lines changed: 36 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
#include "../../common/utils.hpp"
44
#include "../../OS9/SystemCalls.hpp"
55

6-
// TODO: use std::format.
6+
#include <format>
7+
78
// TODO: make special formatters for fun and learning?
89

910
std::string SCC68070::exceptionVectorToString(ExceptionVector vector)
@@ -63,7 +64,7 @@ std::string SCC68070::exceptionVectorToString(ExceptionVector vector)
6364

6465
std::string SCC68070::DisassembleUnknownInstruction(const uint32_t) const
6566
{
66-
return "Unknown instruction 0x" + toHex(currentOpcode);
67+
return std::format("Unknown instruction 0x{:X}", currentOpcode);
6768
}
6869

6970
std::string SCC68070::DisassembleABCD(const uint32_t) const
@@ -219,13 +220,13 @@ std::string SCC68070::DisassembleANDI(const uint32_t pc) const
219220
std::string SCC68070::DisassembleANDICCR(const uint32_t pc) const
220221
{
221222
const uint8_t data = m_cdi.PeekWord(pc+2) & 0x1F;
222-
return "ANDI #0x" + toHex(data) + ", CCR";
223+
return std::format("ANDI #0x{:04X}, CCR", data);
223224
}
224225

225226
std::string SCC68070::DisassembleANDISR(const uint32_t pc) const
226227
{
227228
const uint16_t data = m_cdi.PeekWord(pc+2);
228-
return "ANDI #0x" + toHex(data) + ", SR";
229+
return std::format("ANDI #0x{:04X}, SR", data);
229230
}
230231

231232
std::string SCC68070::DisassembleASm(const uint32_t pc) const
@@ -317,7 +318,7 @@ std::string SCC68070::DisassembleBRA(const uint32_t pc) const
317318
if(disp == 0)
318319
disp = m_cdi.PeekWord(pc+2);
319320

320-
return "BRA " + toHex(pc + 2 + disp);
321+
return std::format("BRA {:X}", pc + 2 + disp);
321322
}
322323

323324
std::string SCC68070::DisassembleBSET(const uint32_t pc) const
@@ -347,7 +348,7 @@ std::string SCC68070::DisassembleBSR(const uint32_t pc) const
347348
if(disp == 0)
348349
disp = m_cdi.PeekWord(pc+2);
349350

350-
return "BSR " + toHex(pc + 2 + disp);
351+
return std::format("BSR {:X}", pc + 2 + disp);
351352
}
352353

353354
std::string SCC68070::DisassembleBTST(const uint32_t pc) const
@@ -538,13 +539,13 @@ std::string SCC68070::DisassembleEORI(const uint32_t pc) const
538539
std::string SCC68070::DisassembleEORICCR(const uint32_t pc) const
539540
{
540541
const uint8_t data = m_cdi.PeekWord(pc+2) & 0x1F;
541-
return "EORI #0x" + toHex(data) + ", CCR";
542+
return std::format("EORI #0x{:04X}, CCR", data);
542543
}
543544

544545
std::string SCC68070::DisassembleEORISR(const uint32_t pc) const
545546
{
546547
const uint8_t data = m_cdi.PeekWord(pc+2);
547-
return "EORI #0x" + toHex(data) + ", SR";
548+
return std::format("EORI #0x{:04X}, SR", data);
548549
}
549550

550551
std::string SCC68070::DisassembleEXG(const uint32_t) const
@@ -553,31 +554,28 @@ std::string SCC68070::DisassembleEXG(const uint32_t) const
553554
const uint8_t mode = (currentOpcode & 0x00F8) >> 3;
554555
const uint8_t Ry = (currentOpcode & 0x0007);
555556

556-
std::string left, right;
557557
if(mode == 0x08)
558558
{
559-
left = "D" + std::to_string(Rx);
560-
right = ", D" + std::to_string(Ry);
559+
return std::format("EXG D{}, D{}", Rx, Ry);
561560
}
562561
else if(mode == 0x09)
563562
{
564-
left = "A" + std::to_string(Rx);
565-
right = ", A" + std::to_string(Ry);
563+
return std::format("EXG A{}, A{}", Rx, Ry);
566564
}
567565
else
568566
{
569-
left = "D" + std::to_string(Rx);
570-
right = ", A" + std::to_string(Ry);
567+
return std::format("EXG D{}, A{}", Rx, Ry);
571568
}
572-
573-
return "EXG " + left + right;
574569
}
575570

576571
std::string SCC68070::DisassembleEXT(const uint32_t) const
577572
{
578573
const uint8_t opmode = (currentOpcode & 0x01C0) >> 6;
579574
const uint8_t reg = (currentOpcode & 0x0007);
580-
return std::string("EXT.") + (opmode == 2 ? "W D" : "L D") + std::to_string(reg);
575+
if(opmode == 2)
576+
return std::format("EXT.W D{}", reg);
577+
else
578+
return std::format("EXT.L D{}", reg);
581579
}
582580

583581
std::string SCC68070::DisassembleILLEGAL(const uint32_t) const
@@ -611,7 +609,7 @@ std::string SCC68070::DisassembleLINK(const uint32_t pc) const
611609
{
612610
const uint8_t reg = (currentOpcode & 0x0007);
613611
const int16_t disp = m_cdi.PeekWord(pc+2);
614-
return "LINK A" + std::to_string(reg) + ", #" + std::to_string(disp);
612+
return std::format("LINK A{}, #{}", reg, disp);
615613
}
616614

617615
std::string SCC68070::DisassembleLSm(const uint32_t pc) const
@@ -708,7 +706,10 @@ std::string SCC68070::DisassembleMOVEUSP(const uint32_t) const
708706
{
709707
const uint8_t dr = (currentOpcode & 0x0008) >> 3;
710708
const uint8_t reg = (currentOpcode & 0x0007);
711-
return std::string("MOVE ") + (dr ? "USP, A" + std::to_string(reg) : "A" + std::to_string(reg) + ", USP");
709+
if(dr)
710+
return std::format("MOVE USP, A{}", reg);
711+
else
712+
return std::format("MOVE A{}, USP", reg);
712713
}
713714

714715
std::string SCC68070::DisassembleMOVEM(const uint32_t pc) const
@@ -732,32 +733,29 @@ std::string SCC68070::DisassembleMOVEP(const uint32_t pc) const
732733
const uint8_t addrreg = (currentOpcode & 0x0007);
733734
const int16_t disp = m_cdi.PeekWord(pc+2);
734735

735-
std::string operands;
736736
if(opmode == 4)
737737
{
738-
operands = ".W (" + std::to_string(disp) + ", A" + std::to_string(addrreg) + "), D" + std::to_string(datareg);
738+
return std::format("MOVEP.W ({}, A{}), D{}", disp, addrreg, datareg);
739739
}
740740
else if(opmode == 5)
741741
{
742-
operands = ".L (" + std::to_string(disp) + ", A" + std::to_string(addrreg) + "), D" + std::to_string(datareg);
742+
return std::format("MOVEP.L ({}, A{}), D{}", disp, addrreg, datareg);
743743
}
744744
else if(opmode == 6)
745745
{
746-
operands = ".W D" + std::to_string(datareg) + ", (" + std::to_string(disp) + ", A" + std::to_string(addrreg) + ")";
746+
return std::format("MOVEP.W D{}, ({}, A{})", datareg, disp, addrreg);
747747
}
748748
else
749749
{
750-
operands = ".L D" + std::to_string(datareg) + ", (" + std::to_string(disp) + ", A" + std::to_string(addrreg) + ")";
750+
return std::format("MOVEP.L D{}, ({}, A{})", datareg, disp, addrreg);
751751
}
752-
753-
return "MOVEP" + operands;
754752
}
755753

756754
std::string SCC68070::DisassembleMOVEQ(const uint32_t) const
757755
{
758756
const uint8_t reg = (currentOpcode & 0x0E00) >> 9;
759757
const int8_t data = (currentOpcode & 0x00FF);
760-
return "MOVEQ #" + std::to_string(data) + ", D" + std::to_string(reg);
758+
return std::format("MOVEQ #{}, D{}", data, reg);
761759
}
762760

763761
std::string SCC68070::DisassembleMULS(const uint32_t pc) const
@@ -884,13 +882,13 @@ std::string SCC68070::DisassembleORI(const uint32_t pc) const
884882
std::string SCC68070::DisassembleORICCR(const uint32_t pc) const
885883
{
886884
const uint8_t data = m_cdi.PeekWord(pc+2) & 0x1F;
887-
return "ORI #0x" + toHex(data) + ", CCR";
885+
return std::format("ORI #0x{:04X}, CCR", data);
888886
}
889887

890888
std::string SCC68070::DisassembleORISR(const uint32_t pc) const
891889
{
892890
const uint16_t data = m_cdi.PeekWord(pc+2);
893-
return "ORI #0x" + toHex(data) + ", SR";
891+
return std::format("ORI #0x{:04X}, SR", data);
894892
}
895893

896894
std::string SCC68070::DisassemblePEA(const uint32_t pc) const
@@ -927,9 +925,9 @@ std::string SCC68070::DisassembleROr(const uint32_t) const
927925

928926
std::string leftOperand;
929927
if(ir)
930-
leftOperand = "D" + std::to_string(count);
928+
leftOperand = std::format("D{}", count);
931929
else
932-
leftOperand = "#" + std::to_string(count);
930+
leftOperand = std::format("#{}", count);
933931

934932
if(dr)
935933
return std::string("ROL") + (size == 0 ? ".B " : size == 1 ? ".W " : ".L ") + leftOperand + ", D" + std::to_string(reg);
@@ -959,9 +957,9 @@ std::string SCC68070::DisassembleROXr(const uint32_t) const
959957

960958
std::string leftOperand;
961959
if(ir)
962-
leftOperand = "D" + std::to_string(count);
960+
leftOperand = std::format("D{}", count);
963961
else
964-
leftOperand = "#" + std::to_string(count);
962+
leftOperand = std::format("#{}", count);
965963

966964
if(dr)
967965
return std::string("ROXL") + (size == 0 ? ".B " : size == 1 ? ".W " : ".L ") + leftOperand + ", D" + std::to_string(reg);
@@ -1004,7 +1002,7 @@ std::string SCC68070::DisassembleScc(const uint32_t pc) const
10041002
std::string SCC68070::DisassembleSTOP(const uint32_t pc) const
10051003
{
10061004
const uint16_t data = m_cdi.PeekWord(pc+2);
1007-
return "STOP #0x" + toHex(data);
1005+
return std::format("STOP #0x{:04X}", data);
10081006
}
10091007

10101008
std::string SCC68070::DisassembleSUB(const uint32_t pc) const
@@ -1105,7 +1103,7 @@ std::string SCC68070::DisassembleSUBX(const uint32_t) const
11051103

11061104
std::string SCC68070::DisassembleSWAP(const uint32_t) const
11071105
{
1108-
return "SWAP D" + std::to_string(currentOpcode & 0x0007);
1106+
return std::format("SWAP D{}", currentOpcode & 0x0007);
11091107
}
11101108

11111109
std::string SCC68070::DisassembleTAS(const uint32_t pc) const
@@ -1117,7 +1115,7 @@ std::string SCC68070::DisassembleTAS(const uint32_t pc) const
11171115

11181116
std::string SCC68070::DisassembleTRAP(const uint32_t) const
11191117
{
1120-
return "TRAP #" + std::to_string(currentOpcode & 0x000F);
1118+
return std::format("TRAP #{}", currentOpcode & 0x000F);
11211119
}
11221120

11231121
std::string SCC68070::DisassembleTRAPV(const uint32_t) const
@@ -1143,5 +1141,5 @@ std::string SCC68070::DisassembleTST(const uint32_t pc) const
11431141

11441142
std::string SCC68070::DisassembleUNLK(const uint32_t) const
11451143
{
1146-
return "UNLK A" + std::to_string(currentOpcode & 0x0007);
1144+
return std::format("UNLK A{}", currentOpcode & 0x0007);
11471145
}

src/GUI/CPUViewer.cpp

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -45,31 +45,21 @@ static constexpr std::array<const char*, 20> REGISTER_NAMES{
4545

4646
static wxString formatRegister(const uint32_t value, const int size, const bool hex)
4747
{
48-
// TODO: std::format().
49-
std::stringstream stream;
50-
51-
if(hex)
52-
stream << std::hex;
53-
else
54-
stream << std::dec;
55-
5648
if(size == 0) // Byte
57-
{
58-
stream << zeroExtend<uint8_t, uint32_t>(value >> 24) << ' '
59-
<< zeroExtend<uint8_t, uint32_t>(value >> 16) << ' '
60-
<< zeroExtend<uint8_t, uint32_t>(value >> 8) << ' '
61-
<< zeroExtend<uint8_t, uint32_t>(value);
62-
}
49+
if(hex)
50+
return std::format("{:X} {:X} {:X} {:X}", as<uint8_t>(value >> 24), as<uint8_t>(value >> 16), as<uint8_t>(value >> 8), as<uint8_t>(value));
51+
else
52+
return std::format("{} {} {} {}", as<uint8_t>(value >> 24), as<uint8_t>(value >> 16), as<uint8_t>(value >> 8), as<uint8_t>(value));
6353
else if(size == 1) // Word
64-
{
65-
stream << as<uint16_t>(value >> 16) << ' ' << as<uint16_t>(value);
66-
}
54+
if(hex)
55+
return std::format("{:X} {:X}", as<uint16_t>(value >> 16), as<uint16_t>(value));
56+
else
57+
return std::format("{} {}", as<uint16_t>(value >> 16), as<uint16_t>(value));
6758
else // Long
68-
{
69-
stream << value;
70-
}
71-
72-
return stream.str();
59+
if(hex)
60+
return std::format("{:X}", value);
61+
else
62+
return std::format("{}", value);
7363
}
7464

7565
static wxString srToString(const uint16_t sr)

src/GUI/OS9Viewer.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ static void addUIntProperty(wxPropertyGrid* properties, const std::string& label
2020

2121
static void addHexProperty(wxPropertyGrid* properties, const std::string& label, const std::string& name, unsigned long value)
2222
{
23-
// TODO: std::format.
2423
addProperty(properties, new wxStringProperty(label, name, toHex(value)));
2524
}
2625

0 commit comments

Comments
 (0)