--- previous/src/nextMemory.c 2018/04/24 19:25:10 1.1.1.1 +++ previous/src/nextMemory.c 2018/04/24 19:27:28 1.1.1.3 @@ -16,9 +16,9 @@ const char STMemory_fileid[] = "Hatari s #include "memorySnapShot.h" /* - * main RAM buffer (8mb for stock Next) + * Main RAM buffer (128 MB for turbo systems) */ -Uint8 NEXTRam[64*1024*1024]; +Uint8 NEXTRam[128*1024*1024]; Uint32 NEXTRamEnd; /* End of ST Ram, above this address is no-mans-land and ROM/IO memory */ @@ -35,6 +35,39 @@ void NEXTMemory_Clear(Uint32 StartAddres memset(&NEXTRam[StartAddress], 0, EndAddress-StartAddress); } +/** --useful for next? + * Copy given memory area safely to Atari RAM. + * If the memory area isn't fully within RAM, only the valid parts are written. + * Useful for all kinds of IO operations. + * + * addr - destination Atari RAM address + * src - source Hatari memory address + * len - number of bytes to copy + * name - name / description if this memory copy for error messages + * + * Return true if whole copy was safe / valid. + */ + +bool NEXTMemory_SafeCopy(Uint32 addr, Uint8 *src, unsigned int len, const char *name) +{ + Uint32 end; + + if (NEXTMemory_ValidArea(addr, len)) + { + memcpy(&NEXTRam[addr], src, len); + return true; + } + Log_Printf(LOG_WARN, "Invalid '%s' RAM range 0x%x+%i!\n", name, addr, len); + + for (end = addr + len; addr < end; addr++, src++) + { + if (NEXTMemory_ValidArea(addr, 1)) + NEXTRam[addr] = *src; + } + return false; +} + + /** * TODO