In the CpuWidget, separated the PC from the rest of the registers.

They're now in separate widgets, and must be tabbed/selected
separately.

Related to above, made the CPU PC widget hold 16bit values and be
wide enough to hold 16 digits (binary mode).  Also, made the other
registers in CpuWidget be 8bit only.

Removed frame around a cell when a DataGridWidget or ToggleBitWidget
loses focus.  It's obvious when a widget isn't in focus
(there's no bounding rectangle around the whole thing), so another
visual indicator wasn't really required.


git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@718 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
stephena 2005-08-12 17:12:43 +00:00
parent 51c89930bf
commit 8f6cc81951
5 changed files with 80 additions and 76 deletions

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: CpuWidget.cxx,v 1.6 2005-08-10 18:44:37 stephena Exp $ // $Id: CpuWidget.cxx,v 1.7 2005-08-12 17:12:43 stephena Exp $
// //
// Based on code from ScummVM - Scumm Interpreter // Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project // Copyright (C) 2002-2004 The ScummVM project
@ -33,13 +33,19 @@
#include "CpuWidget.hxx" #include "CpuWidget.hxx"
// ID's for the various widgets
// We need ID's, since there are more than one of several types of widgets
enum {
kPCRegID,
kCpuRegID
};
enum { enum {
kPCRegAddr, kPCRegAddr,
kSPRegAddr, kSPRegAddr,
kARegAddr, kARegAddr,
kXRegAddr, kXRegAddr,
kYRegAddr, kYRegAddr
kNumRegs
}; };
enum { enum {
@ -63,14 +69,31 @@ CpuWidget::CpuWidget(GuiObject* boss, const GUI::Font& font, int x, int y)
int xpos, ypos, lwidth; int xpos, ypos, lwidth;
StaticTextWidget* t; StaticTextWidget* t;
// Create a 1x5 grid with labels for the CPU registers // Create a 1x1 grid with label for the PC register
xpos = x; ypos = y; lwidth = 4 * fontWidth; xpos = x; ypos = y; lwidth = 4 * fontWidth;
myCpuGrid = new DataGridWidget(boss, font, xpos + lwidth, ypos, 1, 5, 8, 16); t = new StaticTextWidget(boss, xpos, ypos+2, lwidth-2, fontHeight,
"PC:", kTextAlignLeft);
t->setFont(font);
myPCGrid = new DataGridWidget(boss, font, xpos + lwidth, ypos, 1, 1, 16, 16);
myPCGrid->setTarget(this);
myPCGrid->setID(kPCRegID);
addFocusWidget(myPCGrid);
// Create a read-only textbox containing the current PC label
xpos += lwidth + myPCGrid->getWidth() + 10;
myPCLabel = new EditTextWidget(boss, xpos, ypos, fontWidth*15, lineHeight, "");
myPCLabel->setFont(font);
myPCLabel->setEditable(false);
// Create a 1x4 grid with labels for the other CPU registers
xpos = x; ypos += myPCGrid->getHeight() + 1;
myCpuGrid = new DataGridWidget(boss, font, xpos + lwidth, ypos, 1, 4, 8, 8);
myCpuGrid->setTarget(this); myCpuGrid->setTarget(this);
myCpuGrid->setID(kCpuRegID);
addFocusWidget(myCpuGrid); addFocusWidget(myCpuGrid);
string labels[5] = { "PC:", "SP:", "A:", "X:", "Y:" }; string labels[4] = { "SP:", "A:", "X:", "Y:" };
for(int row = 0; row < 5; ++row) for(int row = 0; row < 4; ++row)
{ {
t = new StaticTextWidget(boss, xpos, ypos + row*lineHeight + 2, t = new StaticTextWidget(boss, xpos, ypos + row*lineHeight + 2,
lwidth-2, fontHeight, lwidth-2, fontHeight,
@ -78,18 +101,12 @@ CpuWidget::CpuWidget(GuiObject* boss, const GUI::Font& font, int x, int y)
t->setFont(font); t->setFont(font);
} }
// Create a read-only textbox containing the current PC label
xpos += lwidth + myCpuGrid->getWidth() + 10;
myPCLabel = new EditTextWidget(boss, xpos, ypos, fontWidth*25, lineHeight, "");
myPCLabel->setFont(font);
myPCLabel->setEditable(false);
// Create a bitfield widget for changing the processor status // Create a bitfield widget for changing the processor status
xpos = x; ypos += 5*lineHeight + 5; xpos = x; ypos += 4*lineHeight + 2;
t = new StaticTextWidget(boss, xpos, ypos, lwidth-2, fontHeight, t = new StaticTextWidget(boss, xpos, ypos+2, lwidth-2, fontHeight,
"PS:", kTextAlignLeft); "PS:", kTextAlignLeft);
t->setFont(font); t->setFont(font);
myPSRegister = new ToggleBitWidget(boss, font, xpos+lwidth, ypos-2, 8, 1); myPSRegister = new ToggleBitWidget(boss, font, xpos+lwidth, ypos, 8, 1);
myPSRegister->setTarget(this); myPSRegister->setTarget(this);
addFocusWidget(myPSRegister); addFocusWidget(myPSRegister);
@ -106,7 +123,7 @@ CpuWidget::CpuWidget(GuiObject* boss, const GUI::Font& font, int x, int y)
myPSRegister->setList(off, on); myPSRegister->setList(off, on);
// Calculate real dimensions // Calculate real dimensions
_w = lwidth + myCpuGrid->getWidth() + myPCLabel->getWidth() + 20; _w = lwidth + myPCGrid->getWidth() + myPCLabel->getWidth() + 20;
_h = ypos + myPSRegister->getHeight() - y; _h = ypos + myPSRegister->getHeight() - y;
} }
@ -118,14 +135,24 @@ CpuWidget::~CpuWidget()
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CpuWidget::handleCommand(CommandSender* sender, int cmd, int data, int id) void CpuWidget::handleCommand(CommandSender* sender, int cmd, int data, int id)
{ {
int addr, value; int addr = -1, value = -1;
CpuDebug& dbg = instance()->debugger().cpuDebug(); CpuDebug& dbg = instance()->debugger().cpuDebug();
switch(cmd) switch(cmd)
{ {
case kDGItemDataChangedCmd: case kDGItemDataChangedCmd:
addr = myCpuGrid->getSelectedAddr(); switch(id)
value = myCpuGrid->getSelectedValue(); {
case kPCRegID:
addr = myPCGrid->getSelectedAddr();
value = myPCGrid->getSelectedValue();
break;
case kCpuRegID:
addr = myCpuGrid->getSelectedAddr();
value = myCpuGrid->getSelectedValue();
break;
}
switch(addr) switch(addr)
{ {
@ -195,6 +222,13 @@ void CpuWidget::loadConfig()
fillGrid(); fillGrid();
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CpuWidget::setOpsWidget(DataGridOpsWidget* w)
{
myPCGrid->setOpsWidget(w);
myCpuGrid->setOpsWidget(w);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CpuWidget::fillGrid() void CpuWidget::fillGrid()
{ {
@ -202,27 +236,33 @@ void CpuWidget::fillGrid()
IntArray vlist; IntArray vlist;
BoolArray changed; BoolArray changed;
// We push the enumerated items as addresses, and deal with the real
// address in the callback (handleCommand)
CpuDebug& cpu = instance()->debugger().cpuDebug(); CpuDebug& cpu = instance()->debugger().cpuDebug();
CpuState state = (CpuState&) cpu.getState(); CpuState state = (CpuState&) cpu.getState();
CpuState oldstate = (CpuState&) cpu.getOldState(); CpuState oldstate = (CpuState&) cpu.getOldState();
// We push the enumerated items as addresses, and deal with the real // Add PC to its own DataGridWidget
// address in the callback (handleCommand)
alist.push_back(kPCRegAddr); alist.push_back(kPCRegAddr);
vlist.push_back(state.PC);
changed.push_back(state.PC != oldstate.PC);
myPCGrid->setList(alist, vlist, changed);
// Add the other registers
alist.clear(); vlist.clear(); changed.clear();
alist.push_back(kSPRegAddr); alist.push_back(kSPRegAddr);
alist.push_back(kARegAddr); alist.push_back(kARegAddr);
alist.push_back(kXRegAddr); alist.push_back(kXRegAddr);
alist.push_back(kYRegAddr); alist.push_back(kYRegAddr);
// And now fill the values // And now fill the values
vlist.push_back(state.PC);
vlist.push_back(state.SP); vlist.push_back(state.SP);
vlist.push_back(state.A); vlist.push_back(state.A);
vlist.push_back(state.X); vlist.push_back(state.X);
vlist.push_back(state.Y); vlist.push_back(state.Y);
// Figure out which items have changed // Figure out which items have changed
changed.push_back(state.PC != oldstate.PC);
changed.push_back(state.SP != oldstate.SP); changed.push_back(state.SP != oldstate.SP);
changed.push_back(state.A != oldstate.A); changed.push_back(state.A != oldstate.A);
changed.push_back(state.X != oldstate.X); changed.push_back(state.X != oldstate.X);
@ -237,30 +277,4 @@ void CpuWidget::fillGrid()
changed.push_back(state.PSbits[i] != oldstate.PSbits[i]); changed.push_back(state.PSbits[i] != oldstate.PSbits[i]);
myPSRegister->setState(state.PSbits, changed); myPSRegister->setState(state.PSbits, changed);
/*
// Update the other status fields
int pc = state.PC;
const char* buf;
Debugger& dbg = instance()->debugger();
buf = dbg.equates()->getLabel(pc).c_str();
if(*buf)
myPCLabel->setEditString(buf);
else
myPCLabel->setEditString("");
myPCLabel->setEditString("");
myCurrentIns->setEditString(dbg.disassemble(pc, 1));
myCycleCount->setEditString(dbg.valueToString(dbg.cycles(), kBASE_10));
string status;
if(dbg.breakpoints()->isSet(pc))
status = "BP set";
// FIXME - add trap info
myStatus->setEditString(status);
*/
} }

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: CpuWidget.hxx,v 1.3 2005-08-10 18:44:37 stephena Exp $ // $Id: CpuWidget.hxx,v 1.4 2005-08-12 17:12:43 stephena Exp $
// //
// Based on code from ScummVM - Scumm Interpreter // Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project // Copyright (C) 2002-2004 The ScummVM project
@ -42,19 +42,16 @@ class CpuWidget : public Widget, public CommandSender
void handleCommand(CommandSender* sender, int cmd, int data, int id); void handleCommand(CommandSender* sender, int cmd, int data, int id);
void loadConfig(); void loadConfig();
void setOpsWidget(DataGridOpsWidget* w) { myCpuGrid->setOpsWidget(w); } void setOpsWidget(DataGridOpsWidget* w);
private: private:
void fillGrid(); void fillGrid();
private: private:
DataGridWidget* myPCGrid;
DataGridWidget* myCpuGrid; DataGridWidget* myCpuGrid;
ToggleBitWidget* myPSRegister; ToggleBitWidget* myPSRegister;
EditTextWidget* myPCLabel;
EditTextWidget* myPCLabel;
EditTextWidget* myCurrentIns;
EditTextWidget* myCycleCount;
EditTextWidget* myStatus;
}; };
#endif #endif

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: RamWidget.cxx,v 1.8 2005-08-11 21:57:30 stephena Exp $ // $Id: RamWidget.cxx,v 1.9 2005-08-12 17:12:43 stephena Exp $
// //
// Based on code from ScummVM - Scumm Interpreter // Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project // Copyright (C) 2002-2004 The ScummVM project
@ -102,7 +102,7 @@ RamWidget::RamWidget(GuiObject* boss, const GUI::Font& font, int x, int y)
} }
for(int col = 0; col < 16; ++col) for(int col = 0; col < 16; ++col)
{ {
t = new StaticTextWidget(boss, xpos + col*myRamGrid->colWidth() + lwidth + 7, t = new StaticTextWidget(boss, xpos + col*myRamGrid->colWidth() + lwidth + 8,
ypos - lineHeight, ypos - lineHeight,
fontWidth, fontHeight, fontWidth, fontHeight,
Debugger::to_hex_4(col), Debugger::to_hex_4(col),
@ -141,7 +141,7 @@ RamWidget::RamWidget(GuiObject* boss, const GUI::Font& font, int x, int y)
myBinValue->setEditable(false); myBinValue->setEditable(false);
// Inputbox which will pop up when searching RAM // Inputbox which will pop up when searching RAM
xpos = x + lwidth + 20; ypos = y + 2*lineHeight; xpos = x + lwidth + 20; ypos = y + 2*lineHeight - 5;
myInputBox = new InputTextDialog(boss, font, xpos, ypos); myInputBox = new InputTextDialog(boss, font, xpos, ypos);
myInputBox->setTarget(this); myInputBox->setTarget(this);

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: DataGridWidget.cxx,v 1.21 2005-08-11 21:57:30 stephena Exp $ // $Id: DataGridWidget.cxx,v 1.22 2005-08-12 17:12:43 stephena Exp $
// //
// Based on code from ScummVM - Scumm Interpreter // Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project // Copyright (C) 2002-2004 The ScummVM project
@ -481,13 +481,9 @@ void DataGridWidget::drawWidget(bool hilite)
int pos = row*_cols + col; int pos = row*_cols + col;
// Draw the selected item inverted, on a highlighted background. // Draw the selected item inverted, on a highlighted background.
if (_currentRow == row && _currentCol == col) if (_currentRow == row && _currentCol == col &&
{ _hasFocus && !_editMode)
if (_hasFocus && !_editMode) fb.fillRect(x - 4, y - 2, _colWidth+1, _rowHeight+1, kTextColorHi);
fb.fillRect(x - 4, y - 2, _colWidth+1, _rowHeight+1, kTextColorHi);
else
fb.frameRect(x - 4, y - 2, _colWidth+1, _rowHeight+1, kTextColorHi);
}
if (_selectedItem == pos && _editMode) if (_selectedItem == pos && _editMode)
{ {

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: ToggleBitWidget.cxx,v 1.7 2005-08-10 12:23:42 stephena Exp $ // $Id: ToggleBitWidget.cxx,v 1.8 2005-08-12 17:12:43 stephena Exp $
// //
// Based on code from ScummVM - Scumm Interpreter // Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project // Copyright (C) 2002-2004 The ScummVM project
@ -106,6 +106,7 @@ void ToggleBitWidget::handleMouseUp(int x, int y, int button, int clickCount)
if (clickCount == 2 && (_selectedItem == findItem(x, y))) if (clickCount == 2 && (_selectedItem == findItem(x, y)))
{ {
_stateList[_selectedItem] = !_stateList[_selectedItem]; _stateList[_selectedItem] = !_stateList[_selectedItem];
_changedList[_selectedItem] = !_changedList[_selectedItem];
sendCommand(kTBItemDataChangedCmd, _selectedItem, _id); sendCommand(kTBItemDataChangedCmd, _selectedItem, _id);
setDirty(); draw(); setDirty(); draw();
} }
@ -220,6 +221,7 @@ bool ToggleBitWidget::handleKeyDown(int ascii, int keycode, int modifiers)
if(toggle) if(toggle)
{ {
_stateList[_selectedItem] = !_stateList[_selectedItem]; _stateList[_selectedItem] = !_stateList[_selectedItem];
_changedList[_selectedItem] = !_changedList[_selectedItem];
sendCommand(kTBItemDataChangedCmd, _selectedItem, _id); sendCommand(kTBItemDataChangedCmd, _selectedItem, _id);
} }
@ -271,13 +273,8 @@ cerr << "ToggleBitWidget::drawWidget\n";
int pos = row*_cols + col; int pos = row*_cols + col;
// Draw the selected item inverted, on a highlighted background. // Draw the selected item inverted, on a highlighted background.
if (_currentRow == row && _currentCol == col) if (_currentRow == row && _currentCol == col && _hasFocus)
{ fb.fillRect(x - 4, y - 2, _colWidth+1, _rowHeight+1, kTextColorHi);
if (_hasFocus)
fb.fillRect(x - 4, y - 2, _colWidth+1, _rowHeight+1, kTextColorHi);
else
fb.frameRect(x - 4, y - 2, _colWidth+1, _rowHeight+1, kTextColorHi);
}
if(_stateList[pos]) if(_stateList[pos])
buffer = _onList[pos]; buffer = _onList[pos];