[Dialogs] Prevent viewers from causing a crash
Some of the viewers dialogs were not properly set up and were causing a crash at runtime.
This commit is contained in:
parent
ecd16a21dc
commit
047ad27777
|
@ -1683,7 +1683,9 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
int charbase_, is256_, palette_;
|
int charbase_ = 0;
|
||||||
|
int is256_ = 0;
|
||||||
|
int palette_ = 0;
|
||||||
wxControl *tileno_, *addr_;
|
wxControl *tileno_, *addr_;
|
||||||
int selx_, sely_;
|
int selx_, sely_;
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
|
||||||
|
#include <wx/event.h>
|
||||||
#include <wx/ffile.h>
|
#include <wx/ffile.h>
|
||||||
#include <wx/vlbox.h>
|
#include <wx/vlbox.h>
|
||||||
|
|
||||||
|
@ -79,7 +80,7 @@ public:
|
||||||
Fit();
|
Fit();
|
||||||
SetMinSize(GetSize());
|
SetMinSize(GetSize());
|
||||||
dis->maxaddr = (uint32_t)~0;
|
dis->maxaddr = (uint32_t)~0;
|
||||||
dismode = 0;
|
disassembly_mode_ = DisassemblyMode::Automatic;
|
||||||
GotoPC();
|
GotoPC();
|
||||||
}
|
}
|
||||||
void Update()
|
void Update()
|
||||||
|
@ -88,13 +89,13 @@ public:
|
||||||
}
|
}
|
||||||
void Next(wxCommandEvent& ev)
|
void Next(wxCommandEvent& ev)
|
||||||
{
|
{
|
||||||
(void)ev; // unused params
|
(void)ev; // unused params
|
||||||
CPULoop(1);
|
CPULoop(1);
|
||||||
GotoPC();
|
GotoPC();
|
||||||
}
|
}
|
||||||
void Goto(wxCommandEvent& ev)
|
void Goto(wxCommandEvent& ev)
|
||||||
{
|
{
|
||||||
(void)ev; // unused params
|
(void)ev; // unused params
|
||||||
wxString as = goto_addr->GetValue();
|
wxString as = goto_addr->GetValue();
|
||||||
|
|
||||||
if (!as.size())
|
if (!as.size())
|
||||||
|
@ -106,30 +107,29 @@ public:
|
||||||
UpdateDis();
|
UpdateDis();
|
||||||
}
|
}
|
||||||
// wx-2.8.4 or MacOSX compiler can't resolve overloads in evt table
|
// wx-2.8.4 or MacOSX compiler can't resolve overloads in evt table
|
||||||
void GotoPCEv(wxCommandEvent& ev)
|
void GotoPCEv(wxCommandEvent&)
|
||||||
{
|
{
|
||||||
(void)ev; // unused params
|
|
||||||
GotoPC();
|
GotoPC();
|
||||||
}
|
}
|
||||||
void GotoPC()
|
void GotoPC()
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
|
|
||||||
// this is what the win32 interface used
|
// this is what the win32 interface used
|
||||||
if (armState)
|
if (armState)
|
||||||
dis->SetSel(armNextPC - 16);
|
dis->SetSel(armNextPC - 16);
|
||||||
else
|
else
|
||||||
dis->SetSel(armNextPC - 8);
|
dis->SetSel(armNextPC - 8);
|
||||||
|
|
||||||
// doesn't make sense, though. Maybe it's just trying to keep the
|
// doesn't make sense, though. Maybe it's just trying to keep the
|
||||||
// sel 4 instructions below top...
|
// sel 4 instructions below top...
|
||||||
#endif
|
#endif
|
||||||
dis->SetSel(armNextPC);
|
dis->SetSel(armNextPC);
|
||||||
UpdateDis();
|
UpdateDis();
|
||||||
}
|
}
|
||||||
void RefreshCmd(wxCommandEvent& ev)
|
void RefreshCmd(wxCommandEvent& ev)
|
||||||
{
|
{
|
||||||
(void)ev; // unused params
|
(void)ev; // unused params
|
||||||
UpdateDis();
|
UpdateDis();
|
||||||
}
|
}
|
||||||
void UpdateDis()
|
void UpdateDis()
|
||||||
|
@ -161,13 +161,14 @@ public:
|
||||||
dis->strings.clear();
|
dis->strings.clear();
|
||||||
dis->addrs.clear();
|
dis->addrs.clear();
|
||||||
uint32_t addr = dis->topaddr;
|
uint32_t addr = dis->topaddr;
|
||||||
bool arm = dismode == 1 || (armState && dismode != 2);
|
const bool arm_mode = disassembly_mode_ == DisassemblyMode::Arm ||
|
||||||
dis->back_size = arm ? 4 : 2;
|
(armState && disassembly_mode_ == DisassemblyMode::Automatic);
|
||||||
|
dis->back_size = arm_mode ? 4 : 2;
|
||||||
|
|
||||||
for (int i = 0; i < dis->nlines; i++) {
|
for (int i = 0; i < dis->nlines; i++) {
|
||||||
dis->addrs.push_back(addr);
|
dis->addrs.push_back(addr);
|
||||||
|
|
||||||
if (arm)
|
if (arm_mode)
|
||||||
addr += disArm(addr, buf, 4096, DIS_VIEW_CODE | DIS_VIEW_ADDRESS);
|
addr += disArm(addr, buf, 4096, DIS_VIEW_CODE | DIS_VIEW_ADDRESS);
|
||||||
else
|
else
|
||||||
addr += disThumb(addr, buf, 4096, DIS_VIEW_CODE | DIS_VIEW_ADDRESS);
|
addr += disThumb(addr, buf, 4096, DIS_VIEW_CODE | DIS_VIEW_ADDRESS);
|
||||||
|
@ -178,10 +179,32 @@ public:
|
||||||
dis->Refill();
|
dis->Refill();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
enum class DisassemblyMode {
|
||||||
|
Automatic,
|
||||||
|
Arm,
|
||||||
|
Thumb,
|
||||||
|
};
|
||||||
|
|
||||||
|
void AutomaticMode(wxCommandEvent& ev) {
|
||||||
|
disassembly_mode_ = DisassemblyMode::Automatic;
|
||||||
|
RefillListEv(ev);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ArmMode(wxCommandEvent& ev) {
|
||||||
|
disassembly_mode_ = DisassemblyMode::Arm;
|
||||||
|
RefillListEv(ev);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ThumbMode(wxCommandEvent& ev) {
|
||||||
|
disassembly_mode_ = DisassemblyMode::Thumb;
|
||||||
|
RefillListEv(ev);
|
||||||
|
}
|
||||||
|
|
||||||
DisList* dis;
|
DisList* dis;
|
||||||
wxTextCtrl* goto_addr;
|
wxTextCtrl* goto_addr;
|
||||||
wxCheckBox *N, *Z, *C, *V, *I, *F, *T;
|
wxCheckBox *N, *Z, *C, *V, *I, *F, *T;
|
||||||
int dismode;
|
DisassemblyMode disassembly_mode_;
|
||||||
wxControl *regv[17], *Modev;
|
wxControl *regv[17], *Modev;
|
||||||
DECLARE_EVENT_TABLE()
|
DECLARE_EVENT_TABLE()
|
||||||
};
|
};
|
||||||
|
@ -193,6 +216,9 @@ EVT_TEXT_ENTER(XRCID("GotoAddress"), DisassembleViewer::Goto)
|
||||||
EVT_BUTTON(XRCID("GotoPC"), DisassembleViewer::GotoPCEv)
|
EVT_BUTTON(XRCID("GotoPC"), DisassembleViewer::GotoPCEv)
|
||||||
EVT_BUTTON(XRCID("Next"), DisassembleViewer::Next)
|
EVT_BUTTON(XRCID("Next"), DisassembleViewer::Next)
|
||||||
EVT_BUTTON(XRCID("Refresh"), DisassembleViewer::RefreshCmd)
|
EVT_BUTTON(XRCID("Refresh"), DisassembleViewer::RefreshCmd)
|
||||||
|
EVT_BUTTON(XRCID("InsAuto"), DisassembleViewer::AutomaticMode)
|
||||||
|
EVT_BUTTON(XRCID("InsARM"), DisassembleViewer::ArmMode)
|
||||||
|
EVT_BUTTON(XRCID("InsThumb"), DisassembleViewer::ThumbMode)
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
class GBDisassembleViewer : public Viewer {
|
class GBDisassembleViewer : public Viewer {
|
||||||
|
@ -386,7 +412,7 @@ public:
|
||||||
// and while at it, translate all the strings
|
// and while at it, translate all the strings
|
||||||
if (!lline) {
|
if (!lline) {
|
||||||
for (int j = 0; j < 16; j++) {
|
for (int j = 0; j < 16; j++) {
|
||||||
if (ioregs[i].bits[j][0]) {
|
if (!ioregs[i].bits[j].IsEmpty()) {
|
||||||
ioregs[i].bits[j] = wxGetTranslation(ioregs[i].bits[j]);
|
ioregs[i].bits[j] = wxGetTranslation(ioregs[i].bits[j]);
|
||||||
int w, h;
|
int w, h;
|
||||||
bitlab[0]->GetTextExtent(ioregs[i].bits[j], &w, &h);
|
bitlab[0]->GetTextExtent(ioregs[i].bits[j], &w, &h);
|
||||||
|
@ -621,7 +647,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
bs = XRCCTRL(*this, "BlockStart", wxChoice);
|
bs = XRCCTRL(*this, "BlockStart", wxChoice);
|
||||||
if (bs) {
|
if (!bs) {
|
||||||
baddialog();
|
baddialog();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue