Skip to content

Commit c080e54

Browse files
authored
fix typing in 32-bit BE mode (#1013)
1 parent dd94f5c commit c080e54

File tree

3 files changed

+87
-5
lines changed

3 files changed

+87
-5
lines changed

src/ui/viewmodels/MemoryViewerViewModel.cpp

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,20 @@ int MemoryViewerViewModel::NibblesPerWord() const
155155
return NibblesForSize(GetSize());
156156
}
157157

158+
int MemoryViewerViewModel::GetSelectedNibbleOffset() const
159+
{
160+
const auto nSize = GetSize();
161+
switch (nSize)
162+
{
163+
case MemSize::SixteenBit:
164+
case MemSize::ThirtyTwoBit:
165+
return (NibblesForSize(nSize) - m_nSelectedNibble - 1);
166+
167+
default:
168+
return m_nSelectedNibble ^ 1;
169+
}
170+
}
171+
158172
static MemoryViewerViewModel::TextColor GetColor(ra::ByteAddress nAddress,
159173
const ra::ui::viewmodels::MemoryBookmarksViewModel& pBookmarksViewModel,
160174
const ra::data::context::GameContext& pGameContext, bool bCheckNotes = true)
@@ -318,11 +332,10 @@ void MemoryViewerViewModel::UpdateSelectedNibble(int nNewNibble)
318332
{
319333
const auto nAddress = GetAddress();
320334
const auto nFirstAddress = GetFirstAddress();
321-
const auto nNibblesPerWord = NibblesPerWord();
322-
m_pColor[nAddress - nFirstAddress + (nNibblesPerWord - m_nSelectedNibble - 1) / 2] |= STALE_COLOR;
335+
m_pColor[nAddress - nFirstAddress + GetSelectedNibbleOffset() / 2] |= STALE_COLOR;
323336
m_nSelectedNibble = nNewNibble;
324337

325-
m_pColor[nAddress - nFirstAddress + (nNibblesPerWord - m_nSelectedNibble - 1) / 2] |= STALE_COLOR;
338+
m_pColor[nAddress - nFirstAddress + GetSelectedNibbleOffset() / 2] |= STALE_COLOR;
326339
m_nNeedsRedraw |= REDRAW_MEMORY;
327340
}
328341
}
@@ -919,8 +932,7 @@ bool MemoryViewerViewModel::OnChar(char c)
919932
}
920933

921934
// adjust for 16-bit and 32-bit views
922-
const auto nNibblesPerWord = NibblesPerWord();
923-
auto nSelectedNibble = (nNibblesPerWord - m_nSelectedNibble - 1);
935+
auto nSelectedNibble = GetSelectedNibbleOffset();
924936
while (nSelectedNibble > 1)
925937
{
926938
++nAddress;

src/ui/viewmodels/MemoryViewerViewModel.hh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ private:
221221
void UpdateHighlight(ra::ByteAddress nAddress, int nNewLength, int nOldLength);
222222

223223
int NibblesPerWord() const;
224+
int GetSelectedNibbleOffset() const;
224225
void UpdateSelectedNibble(int nNewNibble);
225226

226227
std::unique_ptr<uint8_t[]> m_pBuffer;

tests/ui/viewmodels/MemoryViewerViewModel_Tests.cpp

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1608,6 +1608,75 @@ TEST_CLASS(MemoryViewerViewModel_Tests)
16081608
Assert::AreEqual({ 0x27U }, viewer.GetByte(7U));
16091609
}
16101610

1611+
TEST_METHOD(TestOnCharThirtyTwoBitBigEndian)
1612+
{
1613+
MemoryViewerViewModelHarness viewer;
1614+
viewer.InitializeMemory(256);
1615+
viewer.SetSize(MemSize::ThirtyTwoBitBigEndian);
1616+
viewer.MockRender();
1617+
1618+
Assert::AreEqual({0U}, viewer.GetAddress());
1619+
Assert::AreEqual({0U}, viewer.GetSelectedNibble());
1620+
Assert::AreEqual({0U}, viewer.GetByte(0U));
1621+
Assert::IsFalse(viewer.NeedsRedraw());
1622+
1623+
// ignore if readonly
1624+
Assert::IsTrue(viewer.IsReadOnly());
1625+
Assert::IsFalse(viewer.OnChar('6'));
1626+
1627+
viewer.SetReadOnly(false);
1628+
Assert::IsFalse(viewer.IsReadOnly());
1629+
1630+
// '6' should be set as upper nibble of selected byte
1631+
Assert::IsTrue(viewer.OnChar('6'));
1632+
Assert::AreEqual({0U}, viewer.GetAddress());
1633+
Assert::AreEqual({1U}, viewer.GetSelectedNibble());
1634+
Assert::AreEqual({0x60U}, viewer.GetByte(0U));
1635+
Assert::AreEqual({COLOR_RED | COLOR_REDRAW}, viewer.GetColor(0U));
1636+
Assert::IsTrue(viewer.NeedsRedraw());
1637+
viewer.MockRender();
1638+
1639+
// ignore invalid character
1640+
Assert::IsFalse(viewer.OnChar('G'));
1641+
Assert::AreEqual({0U}, viewer.GetAddress());
1642+
Assert::AreEqual({1U}, viewer.GetSelectedNibble());
1643+
Assert::AreEqual({0x60U}, viewer.GetByte(0U));
1644+
Assert::AreEqual({COLOR_RED}, viewer.GetColor(0U));
1645+
Assert::IsFalse(viewer.NeedsRedraw());
1646+
1647+
// 'B' should be set as lower nibble of selected byte
1648+
viewer.OnChar('B');
1649+
Assert::AreEqual({0U}, viewer.GetAddress());
1650+
Assert::AreEqual({2U}, viewer.GetSelectedNibble());
1651+
Assert::AreEqual({0x6BU}, viewer.GetByte(0U));
1652+
Assert::AreEqual({COLOR_RED | COLOR_REDRAW}, viewer.GetColor(0U));
1653+
Assert::IsTrue(viewer.NeedsRedraw());
1654+
viewer.MockRender();
1655+
1656+
// 'F' should be set as upper nibble of next byte
1657+
viewer.OnChar('F');
1658+
Assert::AreEqual({0U}, viewer.GetAddress());
1659+
Assert::AreEqual({3U}, viewer.GetSelectedNibble());
1660+
Assert::AreEqual({0xF1U}, viewer.GetByte(1U));
1661+
1662+
viewer.OnChar('3');
1663+
viewer.OnChar('D');
1664+
viewer.OnChar('E');
1665+
viewer.OnChar('6');
1666+
viewer.OnChar('8');
1667+
1668+
Assert::AreEqual({4U}, viewer.GetAddress());
1669+
Assert::AreEqual({0U}, viewer.GetSelectedNibble());
1670+
Assert::AreEqual({0xF3U}, viewer.GetByte(1U));
1671+
Assert::AreEqual({0xDEU}, viewer.GetByte(2U));
1672+
Assert::AreEqual({0x68U}, viewer.GetByte(3U));
1673+
1674+
viewer.OnChar('2');
1675+
Assert::AreEqual({4U}, viewer.GetAddress());
1676+
Assert::AreEqual({1U}, viewer.GetSelectedNibble());
1677+
Assert::AreEqual({0x24U}, viewer.GetByte(4U));
1678+
}
1679+
16111680
TEST_METHOD(TestTotalMemorySizeChanged)
16121681
{
16131682
MemoryViewerViewModelHarness viewer;

0 commit comments

Comments
 (0)