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:
mjbudd77 2022-01-22 13:05:07 -05:00
parent 91e530aa99
commit 3e577b014e
1 changed files with 74 additions and 20 deletions

View File

@ -158,6 +158,14 @@ struct romEditList_t
}
memset( modMem, 0, modMemSize );
}
if ( (addr + size) >= modMemSize )
{
size = modMemSize - addr;
}
if ( size <= 0 )
{
return;
}
entry = new romEditEntry_t();
entry->addr = addr;
entry->size = size;
@ -167,11 +175,14 @@ struct romEditList_t
{
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 );
}
@ -316,7 +327,7 @@ static int writeMem( int mode, unsigned int addr, int value )
switch ( mode )
{
default:
case QHexEdit::MODE_NES_RAM:
case QHexEdit::MODE_NES_RAM:
{
if ( addr < 0x8000 )
{
@ -336,7 +347,7 @@ static int writeMem( int mode, unsigned int addr, int value )
}
}
break;
case QHexEdit::MODE_NES_PPU:
case QHexEdit::MODE_NES_PPU:
{
addr &= 0x3FFF;
if (addr < 0x2000)
@ -353,13 +364,13 @@ static int writeMem( int mode, unsigned int addr, int value )
}
}
break;
case QHexEdit::MODE_NES_OAM:
case QHexEdit::MODE_NES_OAM:
{
addr &= 0xFF;
SPRAM[addr] = value;
}
break;
case QHexEdit::MODE_NES_ROM:
case QHexEdit::MODE_NES_ROM:
{
if (addr < 16)
{
@ -433,7 +444,7 @@ memBlock_t::~memBlock_t(void)
::free( buf ); buf = NULL;
}
_size = 0;
_maxLines = 0;
_maxLines = 0;
}
//----------------------------------------------------------------------------
@ -459,17 +470,19 @@ int memBlock_t::reAlloc( int newSize )
if ( buf != NULL )
{
memset( buf, 0, newSize * sizeof(struct memByte_t) );
_size = newSize;
init();
if ( (_size % 16) )
{
_maxLines = (_size / 16) + 1;
}
else
{
_maxLines = (_size / 16);
}
if ( (_size % 16) )
{
_maxLines = (_size / 16) + 1;
}
else
{
_maxLines = (_size / 16);
}
}
return (buf == NULL);
}
@ -1409,10 +1422,10 @@ HexEditorDialog_t::HexEditorDialog_t(QWidget *parent)
setLayout( grid );
hbar->setMinimum(0);
hbar->setMaximum(100);
vbar->setMinimum(0);
vbar->setMaximum( 0x1000 / 16 );
hbar->setRange(0,100);
hbar->setValue(0);
vbar->setRange( 0, 0x1000 / 16 );
vbar->setValue(0);
editor->setScrollBars( hbar, vbar );
@ -1940,6 +1953,9 @@ QHexEdit::QHexEdit(QWidget *parent)
this->setPalette(pal);
viewWidth = 512;
viewHeight = 512;
calcFontData();
setMinimumWidth( pxLineWidth );
@ -1960,6 +1976,8 @@ QHexEdit::QHexEdit(QWidget *parent)
actvHighlightEnable = true;
total_instructions_lp = 0;
pxLineXScroll = 0;
jumpToRomValue = 0;
ctxAddr = 0;
frzRamAddr = -1;
frzRamVal = 0;
@ -2745,6 +2763,27 @@ void QHexEdit::keyPressEvent(QKeyEvent *event)
writeMem( viewMode, addr, key );
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;
editValue = 0;
editMask = 0;
@ -2793,6 +2832,21 @@ void QHexEdit::keyPressEvent(QKeyEvent *event)
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;
}
update();