diff --git a/src/gui/Src/BasicView/HexDump.cpp b/src/gui/Src/BasicView/HexDump.cpp index 5e62269b..d13c58a5 100644 --- a/src/gui/Src/BasicView/HexDump.cpp +++ b/src/gui/Src/BasicView/HexDump.cpp @@ -3,6 +3,7 @@ #include "Bridge.h" #include "StringUtil.h" #include +#include #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #include @@ -1083,6 +1084,12 @@ void HexDump::wordToString(duint rva, uint16_t word, WordViewMode mode, RichText } break; + case HalfFloatWord: + { + str = ToFloatingString(&word, 3); + } + break; + default: { @@ -1319,6 +1326,12 @@ static int wordStringMaxLength(HexDump::WordViewMode mode) } break; + case HexDump::HalfFloatWord: + { + length = 9; + } + break; + default: { diff --git a/src/gui/Src/BasicView/HexDump.h b/src/gui/Src/BasicView/HexDump.h index ba8a58c3..882e4646 100644 --- a/src/gui/Src/BasicView/HexDump.h +++ b/src/gui/Src/BasicView/HexDump.h @@ -31,7 +31,8 @@ public: HexWord, UnicodeWord, SignedDecWord, - UnsignedDecWord + UnsignedDecWord, + HalfFloatWord //half precision floatint point }; enum DwordViewMode diff --git a/src/gui/Src/Gui/CPUDump.cpp b/src/gui/Src/Gui/CPUDump.cpp index 9e433191..13d96705 100644 --- a/src/gui/Src/Gui/CPUDump.cpp +++ b/src/gui/Src/Gui/CPUDump.cpp @@ -239,6 +239,7 @@ void CPUDump::setupContextMenu() floatMenu->addAction(makeAction(DIcon("32bit-float"), tr("&Float (32-bit)"), SLOT(floatFloatSlot()))); floatMenu->addAction(makeAction(DIcon("64bit-float"), tr("&Double (64-bit)"), SLOT(floatDoubleSlot()))); floatMenu->addAction(makeAction(DIcon("80bit-float"), tr("&Long double (80-bit)"), SLOT(floatLongDoubleSlot()))); + floatMenu->addAction(makeAction(DIcon("word"), tr("&Half float (16-bit)"), SLOT(floatHalfSlot()))); mMenuBuilder->addMenu(makeMenu(DIcon("float"), tr("&Float")), floatMenu); mMenuBuilder->addAction(makeAction(DIcon("address"), tr("&Address"), SLOT(addressAsciiSlot()))); @@ -1208,6 +1209,31 @@ void CPUDump::floatLongDoubleSlot() reloadData(); } +void CPUDump::floatHalfSlot() +{ + Config()->setUint("HexDump", "DefaultView", (duint)ViewFloatHalf); + int charwidth = getCharWidth(); + ColumnDescriptor colDesc; + DataDescriptor dDesc; + + colDesc.isData = true; //float half + colDesc.itemCount = 4; + colDesc.separator = 0; + colDesc.data.itemSize = Word; + colDesc.data.wordMode = HalfFloatWord; + appendResetDescriptor(8 + charwidth * 40, tr("Half float (16-bit)"), false, colDesc); + + colDesc.isData = false; //empty column + colDesc.itemCount = 0; + colDesc.separator = 0; + dDesc.itemSize = Byte; + dDesc.byteMode = AsciiByte; + colDesc.data = dDesc; + appendDescriptor(0, "", false, colDesc); + + reloadData(); +} + void CPUDump::addressAsciiSlot() { Config()->setUint("HexDump", "DefaultView", (duint)ViewAddressAscii); diff --git a/src/gui/Src/Gui/CPUDump.h b/src/gui/Src/Gui/CPUDump.h index e99d2a37..dd51c938 100644 --- a/src/gui/Src/Gui/CPUDump.h +++ b/src/gui/Src/Gui/CPUDump.h @@ -59,6 +59,7 @@ public slots: void floatFloatSlot(); void floatDoubleSlot(); void floatLongDoubleSlot(); + void floatHalfSlot(); void addressUnicodeSlot(); void addressAsciiSlot(); @@ -122,7 +123,8 @@ private: ViewAddressAscii, ViewAddressUnicode, ViewHexCodepage, - ViewTextCodepage + ViewTextCodepage, + ViewFloatHalf }; void setView(ViewEnum_t view); diff --git a/src/gui/Src/Tracer/TraceDump.cpp b/src/gui/Src/Tracer/TraceDump.cpp index 675d3ef4..199bf99d 100644 --- a/src/gui/Src/Tracer/TraceDump.cpp +++ b/src/gui/Src/Tracer/TraceDump.cpp @@ -159,6 +159,7 @@ void TraceDump::setupContextMenu() wFloatMenu->addAction(makeAction(DIcon("32bit-float"), tr("&Float (32-bit)"), SLOT(floatFloatSlot()))); wFloatMenu->addAction(makeAction(DIcon("64bit-float"), tr("&Double (64-bit)"), SLOT(floatDoubleSlot()))); wFloatMenu->addAction(makeAction(DIcon("80bit-float"), tr("&Long double (80-bit)"), SLOT(floatLongDoubleSlot()))); + wFloatMenu->addAction(makeAction(DIcon("word"), tr("&Half float (16-bit)"), SLOT(floatHalfSlot()))); mMenuBuilder->addMenu(makeMenu(DIcon("float"), tr("&Float")), wFloatMenu); mMenuBuilder->addAction(makeAction(DIcon("address"), tr("&Address"), SLOT(addressAsciiSlot()))); @@ -992,6 +993,31 @@ void TraceDump::floatLongDoubleSlot() reloadData(); } +void TraceDump::floatHalfSlot() +{ + Config()->setUint("HexDump", "DefaultView", (duint)ViewFloatHalf); + int charwidth = getCharWidth(); + ColumnDescriptor colDesc; + DataDescriptor dDesc; + + colDesc.isData = true; //float half + colDesc.itemCount = 4; + colDesc.separator = 0; + colDesc.data.itemSize = Word; + colDesc.data.wordMode = HalfFloatWord; + appendResetDescriptor(8 + charwidth * 40, tr("Half float (16-bit)"), false, colDesc); + + colDesc.isData = false; //empty column + colDesc.itemCount = 0; + colDesc.separator = 0; + dDesc.itemSize = Byte; + dDesc.byteMode = AsciiByte; + colDesc.data = dDesc; + appendDescriptor(0, "", false, colDesc); + + reloadData(); +} + void TraceDump::addressAsciiSlot() { Config()->setUint("HexDump", "DefaultView", (duint)ViewAddressAscii); diff --git a/src/gui/Src/Tracer/TraceDump.h b/src/gui/Src/Tracer/TraceDump.h index 5c9ea2f2..af27241c 100644 --- a/src/gui/Src/Tracer/TraceDump.h +++ b/src/gui/Src/Tracer/TraceDump.h @@ -63,6 +63,7 @@ public slots: void floatFloatSlot(); void floatDoubleSlot(); void floatLongDoubleSlot(); + void floatHalfSlot(); void addressUnicodeSlot(); void addressAsciiSlot(); @@ -123,7 +124,8 @@ private: ViewAddressAscii, ViewAddressUnicode, ViewHexCodepage, - ViewTextCodepage + ViewTextCodepage, + ViewFloatHalf }; void setView(ViewEnum_t view);