winport - apply ROM file pasting as a single undoable action using the multi-byte capability already in ApplyPatch. Fixes #394

This commit is contained in:
zeromus 2022-08-28 17:14:55 -04:00
parent 069727c191
commit 6b0d1a52ca
1 changed files with 47 additions and 33 deletions

View File

@ -960,14 +960,14 @@ void FreezeRam(int address, int mode, int final){
//input is expected to be an ASCII string //input is expected to be an ASCII string
void InputData(char *input){ void InputData(char *input){
//CursorEndAddy = -1; //CursorEndAddy = -1;
int addr, i, j, datasize = 0; int addr, datasize = 0;
unsigned char *data; unsigned char *data;
char inputc; char inputc;
//char str[100]; //char str[100];
//mbg merge 7/18/06 added cast: //mbg merge 7/18/06 added cast:
data = (uint8 *)malloc(strlen(input) + 1); //it can't be larger than the input string, so use that as the size data = (uint8 *)malloc(strlen(input) + 1); //it can't be larger than the input string, so use that as the size
for(i = 0;input[i] != 0;i++){ for(int i = 0;input[i] != 0;i++){
if(!EditingText){ if(!EditingText){
inputc = -1; inputc = -1;
if((input[i] >= 'a') && (input[i] <= 'f')) inputc = input[i]-('a'-0xA); if((input[i] >= 'a') && (input[i] <= 'f')) inputc = input[i]-('a'-0xA);
@ -983,9 +983,15 @@ void InputData(char *input){
{ {
TempData = inputc; TempData = inputc;
} }
} else { }
for(j = 0;j < 256;j++)if(chartable[j] == input[i])break; else
if(j == 256)continue; {
int j;
for(j = 0; j < 256; j++)
if(chartable[j] == input[i])
break;
if(j == 256)
continue;
data[datasize++] = j; data[datasize++] = j;
} }
} }
@ -1003,35 +1009,43 @@ void InputData(char *input){
//sprintf(str,"datasize = %d",datasize); //sprintf(str,"datasize = %d",datasize);
//MessageBox(hMemView,str, "debug", MB_OK); //MessageBox(hMemView,str, "debug", MB_OK);
for(i = 0;i < datasize;i++){ if(EditingMode == MODE_NES_FILE)
addr = CursorStartAddy+i; {
ApplyPatch(CursorStartAddy, datasize, data);
if (addr >= MaxSize) continue; }
else
switch(EditingMode) {
for(int i = 0;i < datasize;i++)
{ {
case MODE_NES_MEMORY: addr = CursorStartAddy+i;
// RAM (system bus)
BWrite[addr](addr, data[i]); if (addr >= MaxSize) continue;
break;
case MODE_NES_PPU: switch(EditingMode)
// PPU {
addr &= 0x3FFF; case MODE_NES_MEMORY:
if (addr < 0x2000) // RAM (system bus)
VPage[addr >> 10][addr] = data[i]; //todo: detect if this is vrom and turn it red if so BWrite[addr](addr, data[i]);
if ((addr >= 0x2000) && (addr < 0x3F00)) break;
vnapage[(addr >> 10) & 0x3][addr & 0x3FF] = data[i]; //todo: this causes 0x3000-0x3f00 to mirror 0x2000-0x2f00, is this correct? case MODE_NES_PPU:
if ((addr >= 0x3F00) && (addr < 0x3FFF)) // PPU
PalettePoke(addr, data[i]); addr &= 0x3FFF;
break; if (addr < 0x2000)
case MODE_NES_OAM: VPage[addr >> 10][addr] = data[i]; //todo: detect if this is vrom and turn it red if so
addr &= 0xFF; if ((addr >= 0x2000) && (addr < 0x3F00))
SPRAM[addr] = data[i]; vnapage[(addr >> 10) & 0x3][addr & 0x3FF] = data[i]; //todo: this causes 0x3000-0x3f00 to mirror 0x2000-0x2f00, is this correct?
break; if ((addr >= 0x3F00) && (addr < 0x3FFF))
case MODE_NES_FILE: PalettePoke(addr, data[i]);
// ROM break;
ApplyPatch(addr, 1, &data[i]); case MODE_NES_OAM:
break; addr &= 0xFF;
SPRAM[addr] = data[i];
break;
case MODE_NES_FILE:
// ROM
ApplyPatch(addr, 1, &data[i]);
break;
}
} }
} }
CursorStartAddy+=datasize; CursorStartAddy+=datasize;