Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/fceux.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeromus <zeromus@users.noreply.github.com>2022-08-29 00:14:55 +0300
committerzeromus <zeromus@users.noreply.github.com>2022-08-29 00:15:05 +0300
commit6b0d1a52ca78a53bd8d721ac50bd2d51a0be5152 (patch)
tree46ea6df973790d470708cb6c1cf9cf810cadc547
parent069727c191ff76f799abff83c62681e59747a496 (diff)
winport - apply ROM file pasting as a single undoable action using the multi-byte capability already in ApplyPatch. Fixes #394
-rw-r--r--src/drivers/win/memview.cpp78
1 files changed, 46 insertions, 32 deletions
diff --git a/src/drivers/win/memview.cpp b/src/drivers/win/memview.cpp
index 2ad44edf..70b8b704 100644
--- a/src/drivers/win/memview.cpp
+++ b/src/drivers/win/memview.cpp
@@ -960,14 +960,14 @@ void FreezeRam(int address, int mode, int final){
//input is expected to be an ASCII string
void InputData(char *input){
//CursorEndAddy = -1;
- int addr, i, j, datasize = 0;
+ int addr, datasize = 0;
unsigned char *data;
char inputc;
//char str[100];
//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
- for(i = 0;input[i] != 0;i++){
+ for(int i = 0;input[i] != 0;i++){
if(!EditingText){
inputc = -1;
if((input[i] >= 'a') && (input[i] <= 'f')) inputc = input[i]-('a'-0xA);
@@ -983,9 +983,15 @@ void InputData(char *input){
{
TempData = inputc;
}
- } else {
- for(j = 0;j < 256;j++)if(chartable[j] == input[i])break;
- if(j == 256)continue;
+ }
+ else
+ {
+ int j;
+ for(j = 0; j < 256; j++)
+ if(chartable[j] == input[i])
+ break;
+ if(j == 256)
+ continue;
data[datasize++] = j;
}
}
@@ -1003,35 +1009,43 @@ void InputData(char *input){
//sprintf(str,"datasize = %d",datasize);
//MessageBox(hMemView,str, "debug", MB_OK);
- for(i = 0;i < datasize;i++){
- addr = CursorStartAddy+i;
+ if(EditingMode == MODE_NES_FILE)
+ {
+ ApplyPatch(CursorStartAddy, datasize, data);
+ }
+ else
+ {
+ for(int i = 0;i < datasize;i++)
+ {
+ addr = CursorStartAddy+i;
- if (addr >= MaxSize) continue;
+ if (addr >= MaxSize) continue;
- switch(EditingMode)
- {
- case MODE_NES_MEMORY:
- // RAM (system bus)
- BWrite[addr](addr, data[i]);
- break;
- case MODE_NES_PPU:
- // PPU
- addr &= 0x3FFF;
- if (addr < 0x2000)
- VPage[addr >> 10][addr] = data[i]; //todo: detect if this is vrom and turn it red if so
- if ((addr >= 0x2000) && (addr < 0x3F00))
- vnapage[(addr >> 10) & 0x3][addr & 0x3FF] = data[i]; //todo: this causes 0x3000-0x3f00 to mirror 0x2000-0x2f00, is this correct?
- if ((addr >= 0x3F00) && (addr < 0x3FFF))
- PalettePoke(addr, data[i]);
- break;
- case MODE_NES_OAM:
- addr &= 0xFF;
- SPRAM[addr] = data[i];
- break;
- case MODE_NES_FILE:
- // ROM
- ApplyPatch(addr, 1, &data[i]);
- break;
+ switch(EditingMode)
+ {
+ case MODE_NES_MEMORY:
+ // RAM (system bus)
+ BWrite[addr](addr, data[i]);
+ break;
+ case MODE_NES_PPU:
+ // PPU
+ addr &= 0x3FFF;
+ if (addr < 0x2000)
+ VPage[addr >> 10][addr] = data[i]; //todo: detect if this is vrom and turn it red if so
+ if ((addr >= 0x2000) && (addr < 0x3F00))
+ vnapage[(addr >> 10) & 0x3][addr & 0x3FF] = data[i]; //todo: this causes 0x3000-0x3f00 to mirror 0x2000-0x2f00, is this correct?
+ if ((addr >= 0x3F00) && (addr < 0x3FFF))
+ PalettePoke(addr, data[i]);
+ break;
+ case MODE_NES_OAM:
+ addr &= 0xFF;
+ SPRAM[addr] = data[i];
+ break;
+ case MODE_NES_FILE:
+ // ROM
+ ApplyPatch(addr, 1, &data[i]);
+ break;
+ }
}
}
CursorStartAddy+=datasize;