Added logic to Qt Hex Editor to wrap cursor to next line after entering data at the end of a line. Fixes issue #451. Also, added memory read/write protections to ensure that ROM patches cannot go beyond the valid ROM memory block.
This commit is contained in:
parent
91e530aa99
commit
3e577b014e
|
@ -158,6 +158,14 @@ struct romEditList_t
|
||||||
}
|
}
|
||||||
memset( modMem, 0, modMemSize );
|
memset( modMem, 0, modMemSize );
|
||||||
}
|
}
|
||||||
|
if ( (addr + size) >= modMemSize )
|
||||||
|
{
|
||||||
|
size = modMemSize - addr;
|
||||||
|
}
|
||||||
|
if ( size <= 0 )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
entry = new romEditEntry_t();
|
entry = new romEditEntry_t();
|
||||||
entry->addr = addr;
|
entry->addr = addr;
|
||||||
entry->size = size;
|
entry->size = size;
|
||||||
|
@ -167,11 +175,14 @@ struct romEditList_t
|
||||||
{
|
{
|
||||||
ofs = addr+i;
|
ofs = addr+i;
|
||||||
|
|
||||||
entry->data[i] = getROM(ofs);
|
if ( ofs < modMemSize )
|
||||||
|
{
|
||||||
|
entry->data[i] = getROM(ofs);
|
||||||
|
|
||||||
writeMem( QHexEdit::MODE_NES_ROM, ofs, data[i] );
|
writeMem( QHexEdit::MODE_NES_ROM, ofs, data[i] );
|
||||||
|
|
||||||
modMem[ofs]++;
|
modMem[ofs]++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
undoList.push_back( entry );
|
undoList.push_back( entry );
|
||||||
}
|
}
|
||||||
|
@ -316,7 +327,7 @@ static int writeMem( int mode, unsigned int addr, int value )
|
||||||
switch ( mode )
|
switch ( mode )
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
case QHexEdit::MODE_NES_RAM:
|
case QHexEdit::MODE_NES_RAM:
|
||||||
{
|
{
|
||||||
if ( addr < 0x8000 )
|
if ( addr < 0x8000 )
|
||||||
{
|
{
|
||||||
|
@ -336,7 +347,7 @@ static int writeMem( int mode, unsigned int addr, int value )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case QHexEdit::MODE_NES_PPU:
|
case QHexEdit::MODE_NES_PPU:
|
||||||
{
|
{
|
||||||
addr &= 0x3FFF;
|
addr &= 0x3FFF;
|
||||||
if (addr < 0x2000)
|
if (addr < 0x2000)
|
||||||
|
@ -353,13 +364,13 @@ static int writeMem( int mode, unsigned int addr, int value )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case QHexEdit::MODE_NES_OAM:
|
case QHexEdit::MODE_NES_OAM:
|
||||||
{
|
{
|
||||||
addr &= 0xFF;
|
addr &= 0xFF;
|
||||||
SPRAM[addr] = value;
|
SPRAM[addr] = value;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case QHexEdit::MODE_NES_ROM:
|
case QHexEdit::MODE_NES_ROM:
|
||||||
{
|
{
|
||||||
if (addr < 16)
|
if (addr < 16)
|
||||||
{
|
{
|
||||||
|
@ -433,7 +444,7 @@ memBlock_t::~memBlock_t(void)
|
||||||
::free( buf ); buf = NULL;
|
::free( buf ); buf = NULL;
|
||||||
}
|
}
|
||||||
_size = 0;
|
_size = 0;
|
||||||
_maxLines = 0;
|
_maxLines = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
|
@ -459,17 +470,19 @@ int memBlock_t::reAlloc( int newSize )
|
||||||
|
|
||||||
if ( buf != NULL )
|
if ( buf != NULL )
|
||||||
{
|
{
|
||||||
|
memset( buf, 0, newSize * sizeof(struct memByte_t) );
|
||||||
|
|
||||||
_size = newSize;
|
_size = newSize;
|
||||||
init();
|
init();
|
||||||
|
|
||||||
if ( (_size % 16) )
|
if ( (_size % 16) )
|
||||||
{
|
{
|
||||||
_maxLines = (_size / 16) + 1;
|
_maxLines = (_size / 16) + 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_maxLines = (_size / 16);
|
_maxLines = (_size / 16);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (buf == NULL);
|
return (buf == NULL);
|
||||||
}
|
}
|
||||||
|
@ -1409,10 +1422,10 @@ HexEditorDialog_t::HexEditorDialog_t(QWidget *parent)
|
||||||
|
|
||||||
setLayout( grid );
|
setLayout( grid );
|
||||||
|
|
||||||
hbar->setMinimum(0);
|
hbar->setRange(0,100);
|
||||||
hbar->setMaximum(100);
|
hbar->setValue(0);
|
||||||
vbar->setMinimum(0);
|
vbar->setRange( 0, 0x1000 / 16 );
|
||||||
vbar->setMaximum( 0x1000 / 16 );
|
vbar->setValue(0);
|
||||||
|
|
||||||
editor->setScrollBars( hbar, vbar );
|
editor->setScrollBars( hbar, vbar );
|
||||||
|
|
||||||
|
@ -1940,6 +1953,9 @@ QHexEdit::QHexEdit(QWidget *parent)
|
||||||
|
|
||||||
this->setPalette(pal);
|
this->setPalette(pal);
|
||||||
|
|
||||||
|
viewWidth = 512;
|
||||||
|
viewHeight = 512;
|
||||||
|
|
||||||
calcFontData();
|
calcFontData();
|
||||||
|
|
||||||
setMinimumWidth( pxLineWidth );
|
setMinimumWidth( pxLineWidth );
|
||||||
|
@ -1960,6 +1976,8 @@ QHexEdit::QHexEdit(QWidget *parent)
|
||||||
actvHighlightEnable = true;
|
actvHighlightEnable = true;
|
||||||
total_instructions_lp = 0;
|
total_instructions_lp = 0;
|
||||||
pxLineXScroll = 0;
|
pxLineXScroll = 0;
|
||||||
|
jumpToRomValue = 0;
|
||||||
|
ctxAddr = 0;
|
||||||
|
|
||||||
frzRamAddr = -1;
|
frzRamAddr = -1;
|
||||||
frzRamVal = 0;
|
frzRamVal = 0;
|
||||||
|
@ -2745,6 +2763,27 @@ void QHexEdit::keyPressEvent(QKeyEvent *event)
|
||||||
writeMem( viewMode, addr, key );
|
writeMem( viewMode, addr, key );
|
||||||
FCEU_WRAPPER_UNLOCK();
|
FCEU_WRAPPER_UNLOCK();
|
||||||
|
|
||||||
|
cursorPosX++;
|
||||||
|
|
||||||
|
if ( cursorPosX >= (32+16) )
|
||||||
|
{
|
||||||
|
cursorPosY++;
|
||||||
|
if ( cursorPosY >= viewLines )
|
||||||
|
{
|
||||||
|
lineOffset++;
|
||||||
|
if ( lineOffset > maxLineOffset )
|
||||||
|
{
|
||||||
|
lineOffset = maxLineOffset;
|
||||||
|
}
|
||||||
|
vbar->setValue(lineOffset);
|
||||||
|
cursorPosY = viewLines-1;
|
||||||
|
}
|
||||||
|
if ( cursorPosY < 0 )
|
||||||
|
{
|
||||||
|
cursorPosY = 0;
|
||||||
|
}
|
||||||
|
cursorPosX = 32;
|
||||||
|
}
|
||||||
editAddr = -1;
|
editAddr = -1;
|
||||||
editValue = 0;
|
editValue = 0;
|
||||||
editMask = 0;
|
editMask = 0;
|
||||||
|
@ -2793,6 +2832,21 @@ void QHexEdit::keyPressEvent(QKeyEvent *event)
|
||||||
|
|
||||||
if ( cursorPosX >= 32 )
|
if ( cursorPosX >= 32 )
|
||||||
{
|
{
|
||||||
|
cursorPosY++;
|
||||||
|
if ( cursorPosY >= viewLines )
|
||||||
|
{
|
||||||
|
lineOffset++;
|
||||||
|
if ( lineOffset > maxLineOffset )
|
||||||
|
{
|
||||||
|
lineOffset = maxLineOffset;
|
||||||
|
}
|
||||||
|
vbar->setValue(lineOffset);
|
||||||
|
cursorPosY = viewLines-1;
|
||||||
|
}
|
||||||
|
if ( cursorPosY < 0 )
|
||||||
|
{
|
||||||
|
cursorPosY = 0;
|
||||||
|
}
|
||||||
cursorPosX = 0;
|
cursorPosX = 0;
|
||||||
}
|
}
|
||||||
update();
|
update();
|
||||||
|
|
Loading…
Reference in New Issue