Fixed 'delete last word' in PromptWidget.

Removed an ifdef from PromptWidget, and placed it in bspf.hxx.

Implemented showing the currently defined symbol for PC address
in CpuWidget.


git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@824 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
stephena 2005-10-11 17:14:35 +00:00
parent c0f1ab9cc7
commit 568713ee45
6 changed files with 207 additions and 159 deletions

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: Debugger.hxx,v 1.78 2005-09-25 20:18:46 urchlay Exp $
// $Id: Debugger.hxx,v 1.79 2005-10-11 17:14:34 stephena Exp $
//============================================================================
#ifndef DEBUGGER_HXX
@ -64,7 +64,7 @@ enum {
};
/*
// These will probably turn out to be unneeded, left for reference for now
// These will probably turn out to be unneeded, left for reference for now
// pointer types for Debugger instance methods
typedef uInt8 (Debugger::*DEBUGGER_BYTE_METHOD)();
typedef uInt16 (Debugger::*DEBUGGER_WORD_METHOD)();
@ -79,7 +79,7 @@ typedef uInt16 (Debugger::*DEBUGGER_WORD_METHOD)();
for all debugging operations in Stella (parser, 6502 debugger, etc).
@author Stephen Anthony
@version $Id: Debugger.hxx,v 1.78 2005-09-25 20:18:46 urchlay Exp $
@version $Id: Debugger.hxx,v 1.79 2005-10-11 17:14:34 stephena Exp $
*/
class Debugger : public DialogContainer
{

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: EquateList.cxx,v 1.18 2005-07-14 15:28:51 urchlay Exp $
// $Id: EquateList.cxx,v 1.19 2005-10-11 17:14:34 stephena Exp $
//============================================================================
#include <string>
@ -98,204 +98,252 @@ static Equate hardCodedEquates[] = {
{ "TIM1024T", 0x0297 }
};
EquateList::EquateList() {
int size = sizeof(hardCodedEquates)/sizeof(struct Equate);
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
EquateList::EquateList()
{
int size = sizeof(hardCodedEquates)/sizeof(struct Equate);
for(int i=0; i<size; i++) {
string l = hardCodedEquates[i].label;
int a = hardCodedEquates[i].address;
for(int i=0; i<size; i++)
{
string l = hardCodedEquates[i].label;
int a = hardCodedEquates[i].address;
myFwdMap.insert(make_pair(l, a));
myRevMap.insert(make_pair(a, l));
}
calcSize();
myFwdMap.insert(make_pair(l, a));
myRevMap.insert(make_pair(a, l));
}
calcSize();
}
EquateList::~EquateList() {
myFwdMap.clear();
myRevMap.clear();
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
EquateList::~EquateList()
{
myFwdMap.clear();
myRevMap.clear();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int EquateList::calcSize() {
currentSize = myFwdMap.size();
return currentSize;
}
const string& EquateList::getLabel(int addr) {
static string nothing = "";
addrToLabel::const_iterator iter = myRevMap.find(addr);
if(iter == myRevMap.end())
return nothing;
else
return iter->second;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
const string& EquateList::getLabel(int addr)
{
static string nothing = "";
addrToLabel::const_iterator iter = myRevMap.find(addr);
if(iter == myRevMap.end())
return nothing;
else
return iter->second;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// returns either the label, or a formatted hex string
// if no label found.
const char *EquateList::getFormatted(int addr, int places) {
static char fmt[10], buf[255];
string res = getLabel(addr);
if(res != "")
return res.c_str();
const char *EquateList::getFormatted(int addr, int places)
{
static char fmt[10], buf[255];
string res = getLabel(addr);
if(res != "")
return res.c_str();
sprintf(fmt, "$%%0%dx", places);
//cerr << addr << ", " << fmt << ", " << places << endl;
sprintf(buf, fmt, addr);
return buf;
sprintf(fmt, "$%%0%dx", places);
//cerr << addr << ", " << fmt << ", " << places << endl;
sprintf(buf, fmt, addr);
return buf;
}
int EquateList::getAddress(const string& label) {
labelToAddr::const_iterator iter = myFwdMap.find(label);
if(iter == myFwdMap.end())
return -1;
else
return iter->second;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int EquateList::getAddress(const string& label)
{
labelToAddr::const_iterator iter = myFwdMap.find(label);
if(iter == myFwdMap.end())
return -1;
else
return iter->second;
}
bool EquateList::undefine(string& label) {
labelToAddr::iterator iter = myFwdMap.find(label);
if(iter == myFwdMap.end()) {
return false;
} else {
myRevMap.erase( myRevMap.find(iter->second) ); // FIXME: error check?
myFwdMap.erase(iter);
return true;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool EquateList::undefine(string& label)
{
labelToAddr::iterator iter = myFwdMap.find(label);
if(iter == myFwdMap.end())
{
return false;
}
else
{
myRevMap.erase( myRevMap.find(iter->second) ); // FIXME: error check?
myFwdMap.erase(iter);
return true;
}
}
bool EquateList::saveFile(string file) {
char buf[256];
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool EquateList::saveFile(string file)
{
char buf[256];
ofstream out(file.c_str());
if(!out.is_open())
return false;
ofstream out(file.c_str());
if(!out.is_open())
return false;
out << "--- Symbol List (sorted by symbol)" << endl;
out << "--- Symbol List (sorted by symbol)" << endl;
labelToAddr::iterator iter;
for(iter = myFwdMap.begin(); iter != myFwdMap.end(); iter++) {
sprintf(buf, "%-24s %04x \n", iter->first.c_str(), iter->second);
out << buf;
}
labelToAddr::iterator iter;
for(iter = myFwdMap.begin(); iter != myFwdMap.end(); iter++)
{
sprintf(buf, "%-24s %04x \n", iter->first.c_str(), iter->second);
out << buf;
}
out << "--- End of Symbol List." << endl;
return true;
out << "--- End of Symbol List." << endl;
return true;
}
string EquateList::loadFile(string file) {
int lines = 0;
string curLabel;
int curVal;
char buffer[256]; // FIXME: static buffers suck
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
string EquateList::loadFile(string file)
{
int lines = 0, curVal;
string curLabel;
char buffer[256]; // FIXME: static buffers suck
ifstream in(file.c_str());
if(!in.is_open())
return "Unable to read symbols from " + file;
ifstream in(file.c_str());
if(!in.is_open())
return "Unable to read symbols from " + file;
myFwdMap.clear();
myRevMap.clear();
myFwdMap.clear();
myRevMap.clear();
while( !in.eof() ) {
curVal = 0;
curLabel = "";
while( !in.eof() )
{
curVal = 0;
curLabel = "";
if(!in.getline(buffer, 255))
break;
if(!in.getline(buffer, 255))
break;
if(buffer[0] != '-') {
curLabel = extractLabel(buffer);
if((curVal = extractValue(buffer)) < 0)
return "invalid symbol file";
if(buffer[0] != '-')
{
curLabel = extractLabel(buffer);
if((curVal = extractValue(buffer)) < 0)
return "invalid symbol file";
addEquate(curLabel, curVal);
addEquate(curLabel, curVal);
lines++;
}
}
in.close();
lines++;
}
}
in.close();
calcSize();
calcSize();
return "loaded " + file + " OK";
return "loaded " + file + " OK";
}
void EquateList::addEquate(string label, int address) {
undefine(label);
myFwdMap.insert(make_pair(label, address));
myRevMap.insert(make_pair(address, label));
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void EquateList::addEquate(string label, int address)
{
undefine(label);
myFwdMap.insert(make_pair(label, address));
myRevMap.insert(make_pair(address, label));
}
int EquateList::parse4hex(char *c) {
int ret = 0;
for(int i=0; i<4; i++) {
if(*c >= '0' && *c <= '9')
ret = (ret << 4) + (*c) - '0';
else if(*c >= 'a' && *c <= 'f')
ret = (ret << 4) + (*c) - 'a' + 10;
else
return -1;
c++;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int EquateList::parse4hex(char *c)
{
int ret = 0;
for(int i=0; i<4; i++)
{
if(*c >= '0' && *c <= '9')
ret = (ret << 4) + (*c) - '0';
else if(*c >= 'a' && *c <= 'f')
ret = (ret << 4) + (*c) - 'a' + 10;
else
return -1;
c++;
}
return ret;
return ret;
}
int EquateList::extractValue(char *c) {
while(*c != ' ') {
if(*c == '\0')
return -1;
c++;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int EquateList::extractValue(char *c)
{
while(*c != ' ')
{
if(*c == '\0')
return -1;
c++;
}
while(*c == ' ') {
if(*c == '\0')
return -1;
c++;
}
while(*c == ' ')
{
if(*c == '\0')
return -1;
c++;
}
return parse4hex(c);
return parse4hex(c);
}
string EquateList::extractLabel(char *c) {
string l = "";
while(*c != ' ')
l += *c++;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
string EquateList::extractLabel(char *c)
{
string l = "";
while(*c != ' ')
l += *c++;
return l;
return l;
}
int EquateList::countCompletions(const char *in) {
int count = 0;
completions = compPrefix = "";
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int EquateList::countCompletions(const char *in)
{
int count = 0;
completions = compPrefix = "";
labelToAddr::iterator iter;
for(iter = myFwdMap.begin(); iter != myFwdMap.end(); iter++) {
const char *l = iter->first.c_str();
labelToAddr::iterator iter;
for(iter = myFwdMap.begin(); iter != myFwdMap.end(); iter++)
{
const char *l = iter->first.c_str();
if(STR_N_CASE_CMP(l, in, strlen(in)) == 0) {
if(compPrefix == "")
compPrefix += l;
else {
int nonMatch = 0;
const char *c = compPrefix.c_str();
while(*c != '\0' && tolower(*c) == tolower(l[nonMatch])) {
c++;
nonMatch++;
}
compPrefix.erase(nonMatch, compPrefix.length());
}
if(STR_N_CASE_CMP(l, in, strlen(in)) == 0)
{
if(compPrefix == "")
compPrefix += l;
else
{
int nonMatch = 0;
const char *c = compPrefix.c_str();
while(*c != '\0' && tolower(*c) == tolower(l[nonMatch]))
{
c++;
nonMatch++;
}
compPrefix.erase(nonMatch, compPrefix.length());
}
if(count++) completions += " ";
completions += l;
}
}
return count;
if(count++) completions += " ";
completions += l;
}
}
return count;
}
const char *EquateList::getCompletions() {
return completions.c_str();
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
const char *EquateList::getCompletions()
{
return completions.c_str();
}
const char *EquateList::getCompletionPrefix() {
return compPrefix.c_str();
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
const char *EquateList::getCompletionPrefix()
{
return compPrefix.c_str();
}

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: CpuWidget.cxx,v 1.1 2005-08-30 17:51:26 stephena Exp $
// $Id: CpuWidget.cxx,v 1.2 2005-10-11 17:14:35 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
@ -238,7 +238,8 @@ void CpuWidget::fillGrid()
// We push the enumerated items as addresses, and deal with the real
// address in the callback (handleCommand)
CpuDebug& cpu = instance()->debugger().cpuDebug();
Debugger& dbg = instance()->debugger();
CpuDebug& cpu = dbg.cpuDebug();
CpuState state = (CpuState&) cpu.getState();
CpuState oldstate = (CpuState&) cpu.getOldState();
@ -277,4 +278,5 @@ void CpuWidget::fillGrid()
changed.push_back(state.PSbits[i] != oldstate.PSbits[i]);
myPSRegister->setState(state.PSbits, changed);
myPCLabel->setEditString(dbg.equates()->getLabel(state.PC));
}

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: PromptWidget.cxx,v 1.3 2005-09-30 22:12:18 stephena Exp $
// $Id: PromptWidget.cxx,v 1.4 2005-10-11 17:14:35 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
@ -618,7 +618,7 @@ void PromptWidget::killLastWord()
bool space = true;
while (_currentPos > _promptStartPos)
{
if (buffer(_currentPos - 1) == ' ')
if ((buffer(_currentPos - 1) & 0xff) == ' ')
{
if (!space)
break;
@ -768,12 +768,8 @@ int PromptWidget::printf(const char *format, ...)
int PromptWidget::vprintf(const char *format, va_list argptr)
{
char buf[2048];
int count = VSNPRINTF(buf, sizeof(buf), format, argptr);
#if defined(WIN32)
int count = _vsnprintf(buf, sizeof(buf), format, argptr);
#else
int count = vsnprintf(buf, sizeof(buf), format, argptr);
#endif
print(buf);
return count;
}

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: PromptWidget.hxx,v 1.2 2005-09-30 22:12:18 stephena Exp $
// $Id: PromptWidget.hxx,v 1.3 2005-10-11 17:14:35 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
@ -85,7 +85,7 @@ class PromptWidget : public Widget, public CommandSender
void loadConfig();
protected:
int _buffer[kBufferSize];
int _buffer[kBufferSize];
int _linesInBuffer;
int _lineWidth;

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: bspf.hxx,v 1.11 2005-10-09 17:31:47 stephena Exp $
// $Id: bspf.hxx,v 1.12 2005-10-11 17:14:35 stephena Exp $
//============================================================================
#ifndef BSPF_HXX
@ -24,7 +24,7 @@
that need to be defined for different operating systems.
@author Bradford W. Mott
@version $Id: bspf.hxx,v 1.11 2005-10-09 17:31:47 stephena Exp $
@version $Id: bspf.hxx,v 1.12 2005-10-11 17:14:35 stephena Exp $
*/
// Types for 8-bit signed and unsigned integers
@ -76,10 +76,12 @@ typedef unsigned int uInt32;
#define STR_CASE_CMP stricmp
#define STR_N_CASE_CMP strnicmp
#define IS_BLANK(c) ((c == ' ') || (c == '\t'))
#define VSNPRINTF _vsnprintf
#else
#define STR_CASE_CMP strcasecmp
#define STR_N_CASE_CMP strncasecmp
#define IS_BLANK(c) isblank(c)
#define VSNPRINTF vsnprintf
#endif