Added a breakpoint on execution of specific ROM Address feature to debugger.
This commit is contained in:
parent
4301b96b4a
commit
129fbe3c32
|
@ -22,7 +22,7 @@ int offsetStringToInt(unsigned int type, const char* offsetBuffer)
|
||||||
{
|
{
|
||||||
int offset = -1;
|
int offset = -1;
|
||||||
|
|
||||||
if (sscanf(offsetBuffer,"%4X",(unsigned int *)&offset) == EOF)
|
if (sscanf(offsetBuffer,"%7X",(unsigned int *)&offset) == EOF)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -35,6 +35,10 @@ int offsetStringToInt(unsigned int type, const char* offsetBuffer)
|
||||||
{
|
{
|
||||||
return offset & 0x00FF;
|
return offset & 0x00FF;
|
||||||
}
|
}
|
||||||
|
else if (type & BT_R)
|
||||||
|
{
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
else // BT_C
|
else // BT_C
|
||||||
{
|
{
|
||||||
int type = GIT_CART;
|
int type = GIT_CART;
|
||||||
|
@ -62,7 +66,7 @@ int offsetStringToInt(unsigned int type, const char* offsetBuffer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return offset;
|
return offset & 0xFFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns the value of a given type or register
|
// Returns the value of a given type or register
|
||||||
|
@ -200,6 +204,9 @@ unsigned int NewBreak(const char* name, int start, int end, unsigned int type, c
|
||||||
watchpoint[num].flags|=BT_S;
|
watchpoint[num].flags|=BT_S;
|
||||||
watchpoint[num].flags&=~WP_X; //disable execute flag!
|
watchpoint[num].flags&=~WP_X; //disable execute flag!
|
||||||
}
|
}
|
||||||
|
if (type & BT_R) {
|
||||||
|
watchpoint[num].flags|=BT_R;
|
||||||
|
}
|
||||||
|
|
||||||
if (watchpoint[num].desc)
|
if (watchpoint[num].desc)
|
||||||
free(watchpoint[num].desc);
|
free(watchpoint[num].desc);
|
||||||
|
@ -635,7 +642,7 @@ uint16 StackNextIgnorePC = 0xFFFF;
|
||||||
|
|
||||||
///fires a breakpoint
|
///fires a breakpoint
|
||||||
static void breakpoint(uint8 *opcode, uint16 A, int size) {
|
static void breakpoint(uint8 *opcode, uint16 A, int size) {
|
||||||
int i, j;
|
int i, j, romAddrPC;
|
||||||
uint8 brk_type;
|
uint8 brk_type;
|
||||||
uint8 stackop=0;
|
uint8 stackop=0;
|
||||||
uint8 stackopstartaddr=0,stackopendaddr=0;
|
uint8 stackopstartaddr=0,stackopendaddr=0;
|
||||||
|
@ -700,6 +707,8 @@ static void breakpoint(uint8 *opcode, uint16 A, int size) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
romAddrPC = GetNesFileAddress(_PC);
|
||||||
|
|
||||||
brk_type = opbrktype[opcode[0]] | WP_X;
|
brk_type = opbrktype[opcode[0]] | WP_X;
|
||||||
|
|
||||||
switch (opcode[0]) {
|
switch (opcode[0]) {
|
||||||
|
@ -769,11 +778,31 @@ static void breakpoint(uint8 *opcode, uint16 A, int size) {
|
||||||
if (((watchpoint[i].flags & (WP_R | WP_W)) && (watchpoint[i].address <= A) && (watchpoint[i].endaddress >= A)) ||
|
if (((watchpoint[i].flags & (WP_R | WP_W)) && (watchpoint[i].address <= A) && (watchpoint[i].endaddress >= A)) ||
|
||||||
((watchpoint[i].flags & WP_X) && (watchpoint[i].address <= _PC) && (watchpoint[i].endaddress >= _PC)))
|
((watchpoint[i].flags & WP_X) && (watchpoint[i].address <= _PC) && (watchpoint[i].endaddress >= _PC)))
|
||||||
BREAKHIT(i);
|
BREAKHIT(i);
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
if (((watchpoint[i].flags & (WP_R | WP_W)) && (watchpoint[i].address == A)) ||
|
if (watchpoint[i].flags & BT_R)
|
||||||
((watchpoint[i].flags & WP_X) && (watchpoint[i].address == _PC)))
|
{
|
||||||
BREAKHIT(i);
|
if ( (watchpoint[i].flags & WP_X) && (watchpoint[i].address == romAddrPC) )
|
||||||
|
{
|
||||||
|
BREAKHIT(i);
|
||||||
|
}
|
||||||
|
//else if ( (watchpoint[i].flags & WP_R) && (watchpoint[i].address == A) )
|
||||||
|
//{
|
||||||
|
// BREAKHIT(i);
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( (watchpoint[i].flags & (WP_R | WP_W)) && (watchpoint[i].address == A))
|
||||||
|
{
|
||||||
|
BREAKHIT(i);
|
||||||
|
}
|
||||||
|
else if ( (watchpoint[i].flags & WP_X) && (watchpoint[i].address == _PC) )
|
||||||
|
{
|
||||||
|
BREAKHIT(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#define BT_C 0x00 //break type, cpu mem
|
#define BT_C 0x00 //break type, cpu mem
|
||||||
#define BT_P 0x20 //break type, ppu mem
|
#define BT_P 0x20 //break type, ppu mem
|
||||||
#define BT_S 0x40 //break type, sprite mem
|
#define BT_S 0x40 //break type, sprite mem
|
||||||
|
#define BT_R 0x80 //break type, rom mem
|
||||||
|
|
||||||
#define BREAK_TYPE_STEP -1
|
#define BREAK_TYPE_STEP -1
|
||||||
#define BREAK_TYPE_BADOP -2
|
#define BREAK_TYPE_BADOP -2
|
||||||
|
@ -48,9 +49,9 @@ static const uint8 opbrktype[256] = {
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint16 address;
|
uint32 address;
|
||||||
uint16 endaddress;
|
uint32 endaddress;
|
||||||
uint8 flags;
|
uint16 flags;
|
||||||
|
|
||||||
Condition* cond;
|
Condition* cond;
|
||||||
char* condText;
|
char* condText;
|
||||||
|
|
|
@ -1542,7 +1542,7 @@ void ConsoleDebugger::openBpEditWindow( int editIdx, watchpointinfo *wp, bool fo
|
||||||
QFrame *frame;
|
QFrame *frame;
|
||||||
QGroupBox *gbox;
|
QGroupBox *gbox;
|
||||||
QPushButton *okButton, *cancelButton;
|
QPushButton *okButton, *cancelButton;
|
||||||
QRadioButton *cpu_radio, *ppu_radio, *sprite_radio;
|
QRadioButton *cpu_radio, *ppu_radio, *oam_radio, *rom_radio;
|
||||||
|
|
||||||
if ( editIdx >= 0 )
|
if ( editIdx >= 0 )
|
||||||
{
|
{
|
||||||
|
@ -1595,15 +1595,17 @@ void ConsoleDebugger::openBpEditWindow( int editIdx, watchpointinfo *wp, bool fo
|
||||||
hbox->addWidget( ebp );
|
hbox->addWidget( ebp );
|
||||||
|
|
||||||
hbox = new QHBoxLayout();
|
hbox = new QHBoxLayout();
|
||||||
cpu_radio = new QRadioButton( tr("CPU Mem") );
|
cpu_radio = new QRadioButton( tr("CPU") );
|
||||||
ppu_radio = new QRadioButton( tr("PPU Mem") );
|
ppu_radio = new QRadioButton( tr("PPU") );
|
||||||
sprite_radio = new QRadioButton( tr("Sprite Mem") );
|
oam_radio = new QRadioButton( tr("OAM") );
|
||||||
|
rom_radio = new QRadioButton( tr("ROM") );
|
||||||
cpu_radio->setChecked(true);
|
cpu_radio->setChecked(true);
|
||||||
|
|
||||||
gbox->setLayout( hbox );
|
gbox->setLayout( hbox );
|
||||||
hbox->addWidget( cpu_radio );
|
hbox->addWidget( cpu_radio );
|
||||||
hbox->addWidget( ppu_radio );
|
hbox->addWidget( ppu_radio );
|
||||||
hbox->addWidget( sprite_radio );
|
hbox->addWidget( oam_radio );
|
||||||
|
hbox->addWidget( rom_radio );
|
||||||
|
|
||||||
grid = new QGridLayout();
|
grid = new QGridLayout();
|
||||||
|
|
||||||
|
@ -1643,7 +1645,11 @@ void ConsoleDebugger::openBpEditWindow( int editIdx, watchpointinfo *wp, bool fo
|
||||||
}
|
}
|
||||||
else if ( wp->flags & BT_S )
|
else if ( wp->flags & BT_S )
|
||||||
{
|
{
|
||||||
sprite_radio->setChecked(true);
|
oam_radio->setChecked(true);
|
||||||
|
}
|
||||||
|
else if ( wp->flags & BT_R )
|
||||||
|
{
|
||||||
|
rom_radio->setChecked(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf( stmp, "%04X", wp->address );
|
sprintf( stmp, "%04X", wp->address );
|
||||||
|
@ -1689,9 +1695,21 @@ void ConsoleDebugger::openBpEditWindow( int editIdx, watchpointinfo *wp, bool fo
|
||||||
// If new breakpoint, suggest condition if in ROM Mapping area of memory.
|
// If new breakpoint, suggest condition if in ROM Mapping area of memory.
|
||||||
if ( wp->address >= 0x8000 )
|
if ( wp->address >= 0x8000 )
|
||||||
{
|
{
|
||||||
char str[64];
|
int romAddr = GetNesFileAddress(wp->address);
|
||||||
sprintf(str, "K==#%02X", getBank(wp->address));
|
|
||||||
cond->setText( tr(str) );
|
if ( romAddr >= 0 )
|
||||||
|
{
|
||||||
|
wp->address = romAddr;
|
||||||
|
sprintf( stmp, "%X", wp->address );
|
||||||
|
addr1->setText( tr(stmp) );
|
||||||
|
rom_radio->setChecked(true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char str[64];
|
||||||
|
sprintf(str, "K==#%02X", getBank(wp->address));
|
||||||
|
cond->setText( tr(str) );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1728,10 +1746,14 @@ void ConsoleDebugger::openBpEditWindow( int editIdx, watchpointinfo *wp, bool fo
|
||||||
{
|
{
|
||||||
type |= BT_P;
|
type |= BT_P;
|
||||||
}
|
}
|
||||||
else if ( sprite_radio->isChecked() )
|
else if ( oam_radio->isChecked() )
|
||||||
{
|
{
|
||||||
type |= BT_S;
|
type |= BT_S;
|
||||||
}
|
}
|
||||||
|
else if ( rom_radio->isChecked() )
|
||||||
|
{
|
||||||
|
type |= BT_R;
|
||||||
|
}
|
||||||
|
|
||||||
s = addr1->text().toStdString();
|
s = addr1->text().toStdString();
|
||||||
|
|
||||||
|
@ -1875,6 +1897,10 @@ void ConsoleDebugger::bpListUpdate( bool reset )
|
||||||
{
|
{
|
||||||
flags[1] = 'S';
|
flags[1] = 'S';
|
||||||
}
|
}
|
||||||
|
else if ( watchpoint[i].flags & BT_R )
|
||||||
|
{
|
||||||
|
flags[1] = 'R';
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
flags[1] = 'C';
|
flags[1] = 'C';
|
||||||
|
@ -3999,6 +4025,10 @@ void saveGameDebugBreakpoints( bool force )
|
||||||
{
|
{
|
||||||
flags[1] = 'S';
|
flags[1] = 'S';
|
||||||
}
|
}
|
||||||
|
else if ( watchpoint[i].flags & BT_R )
|
||||||
|
{
|
||||||
|
flags[1] = 'R';
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
flags[1] = 'C';
|
flags[1] = 'C';
|
||||||
|
@ -4010,7 +4040,7 @@ void saveGameDebugBreakpoints( bool force )
|
||||||
flags[5] = (watchpoint[i].flags & WP_F) ? 'F' : '-';
|
flags[5] = (watchpoint[i].flags & WP_F) ? 'F' : '-';
|
||||||
flags[6] = 0;
|
flags[6] = 0;
|
||||||
|
|
||||||
fprintf( fp, "BreakPoint: startAddr=%04X endAddr=%04X flags=%s condition=\"%s\" desc=\"%s\" \n",
|
fprintf( fp, "BreakPoint: startAddr=%08X endAddr=%08X flags=%s condition=\"%s\" desc=\"%s\" \n",
|
||||||
watchpoint[i].address, watchpoint[i].endaddress, flags,
|
watchpoint[i].address, watchpoint[i].endaddress, flags,
|
||||||
(watchpoint[i].condText != NULL) ? watchpoint[i].condText : "",
|
(watchpoint[i].condText != NULL) ? watchpoint[i].condText : "",
|
||||||
(watchpoint[i].desc != NULL) ? watchpoint[i].desc : "");
|
(watchpoint[i].desc != NULL) ? watchpoint[i].desc : "");
|
||||||
|
@ -4183,6 +4213,10 @@ void loadGameDebugBreakpoints(void)
|
||||||
{
|
{
|
||||||
type |= BT_S;
|
type |= BT_S;
|
||||||
}
|
}
|
||||||
|
else if ( data[1] == 'R' )
|
||||||
|
{
|
||||||
|
type |= BT_R;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
type |= BT_C;
|
type |= BT_C;
|
||||||
|
|
Loading…
Reference in New Issue