]> Shamusworld >> Repos - virtualjaguar/blob - src/gui/debug/memorybrowser.cpp
45bae7f7883f87d2a1b2259db8754bd7a69fb627
[virtualjaguar] / src / gui / debug / memorybrowser.cpp
1 //
2 // memorybrowser.cpp - Jaguar memory browser
3 //
4 // by James Hammons
5 // (C) 2012 Underground Software
6 //
7 // JLH = James Hammons <jlhamm@acm.org>
8 //
9 // Who  When        What
10 // ---  ----------  -----------------------------------------------------------
11 // JLH  08/14/2012  Created this file
12 //
13
14 // STILL TO DO:
15 //
16
17 #include "memorybrowser.h"
18 #include "memory.h"
19
20
21 MemoryBrowserWindow::MemoryBrowserWindow(QWidget * parent/*= 0*/): QWidget(parent, Qt::Dialog),
22 //      layout(new QVBoxLayout), text(new QTextBrowser),
23         layout(new QVBoxLayout), text(new QLabel),
24         refresh(new QPushButton(tr("Refresh"))),
25         address(new QLineEdit),
26         go(new QPushButton(tr("Go"))),
27         memBase(0)
28 {
29         setWindowTitle(tr("Memory Browser"));
30
31         address->setInputMask("hhhhhh");
32         QHBoxLayout * hbox1 = new QHBoxLayout;
33         hbox1->addWidget(refresh);
34         hbox1->addWidget(address);
35         hbox1->addWidget(go);
36
37         // Need to set the size as well...
38 //      resize(560, 480);
39
40         QFont fixedFont("Lucida Console", 8, QFont::Normal);
41 //      QFont fixedFont("", 8, QFont::Normal);
42         fixedFont.setStyleHint(QFont::TypeWriter);
43         text->setFont(fixedFont);
44 ////    layout->setSizeConstraint(QLayout::SetFixedSize);
45         setLayout(layout);
46
47         layout->addWidget(text);
48 //      layout->addWidget(refresh);
49         layout->addLayout(hbox1);
50
51         connect(refresh, SIGNAL(clicked()), this, SLOT(RefreshContents()));
52         connect(go, SIGNAL(clicked()), this, SLOT(GoToAddress()));
53 }
54
55
56 void MemoryBrowserWindow::RefreshContents(void)
57 {
58         char string[1024], buf[64];
59         QString memDump;
60
61         for(uint32_t i=0; i<480; i+=16)
62         {
63                 sprintf(string, "%s%06X: ", (i != 0 ? "<br>" : ""), memBase + i);
64
65                 for(uint32_t j=0; j<16; j++)
66                 {
67                         sprintf(buf, "%02X ", jaguarMainRAM[memBase + i + j]);
68                         strcat(string, buf);
69                 }
70
71                 sprintf(buf, "| ");
72                 strcat(string, buf);
73
74                 for(uint32_t j=0; j<16; j++)
75                 {
76                         uint8_t c = jaguarMainRAM[memBase + i + j];
77                         sprintf(buf, "&#%i;", c);
78
79                         if (c == 0x20)
80                                 sprintf(buf, "&nbsp;");
81
82                         if ((c < 0x20) || ((c > 0x7F) && (c < 0xA0)))
83                                 sprintf(buf, ".");
84
85                         strcat(string, buf);
86                 }
87
88                 memDump += QString(string);
89         }
90
91         text->clear();
92         text->setText(memDump);
93 }
94
95
96 void MemoryBrowserWindow::keyPressEvent(QKeyEvent * e)
97 {
98         if (e->key() == Qt::Key_Escape)
99                 hide();
100         else if (e->key() == Qt::Key_PageUp)
101         {
102                 memBase -= 480;
103
104                 if (memBase < 0)
105                         memBase = 0;
106
107                 RefreshContents();
108         }
109         else if (e->key() == Qt::Key_PageDown)
110         {
111                 memBase += 480;
112
113                 if (memBase > (0x200000 - 480))
114                         memBase = 0x200000 - 480;
115
116                 RefreshContents();
117         }
118         else if (e->key() == Qt::Key_Up || e->key() == Qt::Key_Minus)
119         {
120                 memBase -= 16;
121
122                 if (memBase < 0)
123                         memBase = 0;
124
125                 RefreshContents();
126         }
127         else if (e->key() == Qt::Key_Down || e->key() == Qt::Key_Equal)
128         {
129                 memBase += 16;
130
131                 if (memBase > (0x200000 - 480))
132                         memBase = 0x200000 - 480;
133
134                 RefreshContents();
135         }
136 }
137
138
139 void MemoryBrowserWindow::GoToAddress(void)
140 {
141         bool ok;
142         QString newAddress = address->text();
143         memBase = newAddress.toUInt(&ok, 16);
144         RefreshContents();
145 }
146