mirror of
https://github.com/libretro/Mu.git
synced 2026-09-22 14:45:57 +00:00
Can now get SD cards size properly on format, reduce offsets from 64 to 32 bit
If theres a > 4gb savestate, thats the problem, not the address bits in the offset.
This commit is contained in:
@@ -37,8 +37,8 @@ void ads7846Reset(void){
|
||||
#endif
|
||||
}
|
||||
|
||||
uint64_t ads7846StateSize(void){
|
||||
uint64_t size = 0;
|
||||
uint32_t ads7846StateSize(void){
|
||||
uint32_t size = 0;
|
||||
|
||||
size += sizeof(uint8_t) * 4;
|
||||
size += sizeof(uint16_t);
|
||||
@@ -47,7 +47,7 @@ uint64_t ads7846StateSize(void){
|
||||
}
|
||||
|
||||
void ads7846SaveState(uint8_t* data){
|
||||
uint64_t offset = 0;
|
||||
uint32_t offset = 0;
|
||||
|
||||
writeStateValue8(data + offset, ads7846PenIrqEnabled);
|
||||
offset += sizeof(uint8_t);
|
||||
@@ -62,7 +62,7 @@ void ads7846SaveState(uint8_t* data){
|
||||
}
|
||||
|
||||
void ads7846LoadState(uint8_t* data){
|
||||
uint64_t offset = 0;
|
||||
uint32_t offset = 0;
|
||||
|
||||
ads7846PenIrqEnabled = readStateValue8(data + offset);
|
||||
offset += sizeof(uint8_t);
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
extern bool ads7846PenIrqEnabled;
|
||||
|
||||
void ads7846Reset(void);
|
||||
uint64_t ads7846StateSize(void);
|
||||
uint32_t ads7846StateSize(void);
|
||||
void ads7846SaveState(uint8_t* data);
|
||||
void ads7846LoadState(uint8_t* data);
|
||||
|
||||
|
||||
@@ -121,8 +121,8 @@ void armv5Reset(void){
|
||||
armv5ServiceRequest = false;
|
||||
}
|
||||
|
||||
uint64_t armv5StateSize(void){
|
||||
uint64_t size = 0;
|
||||
uint32_t armv5StateSize(void){
|
||||
uint32_t size = 0;
|
||||
|
||||
//need to add armv5Cpu here
|
||||
size += sizeof(uint8_t);
|
||||
@@ -131,7 +131,7 @@ uint64_t armv5StateSize(void){
|
||||
}
|
||||
|
||||
void armv5SaveState(uint8_t* data){
|
||||
uint64_t offset = 0;
|
||||
uint32_t offset = 0;
|
||||
|
||||
//need to add armv5Cpu here
|
||||
writeStateValue8(data + offset, armv5ServiceRequest);
|
||||
@@ -139,7 +139,7 @@ void armv5SaveState(uint8_t* data){
|
||||
}
|
||||
|
||||
void armv5LoadState(uint8_t* data){
|
||||
uint64_t offset = 0;
|
||||
uint32_t offset = 0;
|
||||
|
||||
//need to add armv5Cpu here
|
||||
armv5ServiceRequest = readStateValue8(data + offset);
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
extern bool armv5ServiceRequest;
|
||||
|
||||
void armv5Reset(void);
|
||||
uint64_t armv5StateSize(void);
|
||||
uint32_t armv5StateSize(void);
|
||||
void armv5SaveState(uint8_t* data);
|
||||
void armv5LoadState(uint8_t* data);
|
||||
|
||||
|
||||
@@ -168,8 +168,8 @@ void emulatorSetRtc(uint16_t days, uint8_t hours, uint8_t minutes, uint8_t secon
|
||||
setRtc(days, hours, minutes, seconds);
|
||||
}
|
||||
|
||||
uint64_t emulatorGetStateSize(void){
|
||||
uint64_t size = 0;
|
||||
uint32_t emulatorGetStateSize(void){
|
||||
uint32_t size = 0;
|
||||
|
||||
size += sizeof(uint32_t);//save state version
|
||||
size += sizeof(uint32_t);//palmEmuFeatures.info
|
||||
@@ -216,7 +216,7 @@ uint64_t emulatorGetStateSize(void){
|
||||
}
|
||||
|
||||
bool emulatorSaveState(buffer_t buffer){
|
||||
uint64_t offset = 0;
|
||||
uint32_t offset = 0;
|
||||
uint8_t index;
|
||||
|
||||
if(buffer.size < emulatorGetStateSize())
|
||||
@@ -413,9 +413,9 @@ bool emulatorSaveState(buffer_t buffer){
|
||||
}
|
||||
|
||||
bool emulatorLoadState(buffer_t buffer){
|
||||
uint64_t offset = 0;
|
||||
uint32_t offset = 0;
|
||||
uint8_t index;
|
||||
uint64_t stateSdCardSize;
|
||||
uint32_t stateSdCardSize;
|
||||
uint8_t* stateSdCardBuffer;
|
||||
|
||||
//state validation, wont load states that are not from the same state version
|
||||
@@ -620,12 +620,12 @@ bool emulatorLoadState(buffer_t buffer){
|
||||
return true;
|
||||
}
|
||||
|
||||
uint64_t emulatorGetRamSize(void){
|
||||
uint32_t emulatorGetRamSize(void){
|
||||
return palmEmuFeatures.info & FEATURE_RAM_HUGE ? SUPERMASSIVE_RAM_SIZE : RAM_SIZE;
|
||||
}
|
||||
|
||||
bool emulatorSaveRam(buffer_t buffer){
|
||||
uint64_t size = palmEmuFeatures.info & FEATURE_RAM_HUGE ? SUPERMASSIVE_RAM_SIZE : RAM_SIZE;
|
||||
uint32_t size = palmEmuFeatures.info & FEATURE_RAM_HUGE ? SUPERMASSIVE_RAM_SIZE : RAM_SIZE;
|
||||
|
||||
if(buffer.size < size)
|
||||
return false;
|
||||
@@ -637,7 +637,7 @@ bool emulatorSaveRam(buffer_t buffer){
|
||||
}
|
||||
|
||||
bool emulatorLoadRam(buffer_t buffer){
|
||||
uint64_t size = palmEmuFeatures.info & FEATURE_RAM_HUGE ? SUPERMASSIVE_RAM_SIZE : RAM_SIZE;
|
||||
uint32_t size = palmEmuFeatures.info & FEATURE_RAM_HUGE ? SUPERMASSIVE_RAM_SIZE : RAM_SIZE;
|
||||
|
||||
if(buffer.size < size)
|
||||
return false;
|
||||
@@ -657,12 +657,16 @@ uint32_t emulatorInsertSdCard(buffer_t image, bool writeProtectSwitch){
|
||||
if(palmSdCard.flashChip.data)
|
||||
return EMU_ERROR_RESOURCE_LOCKED;
|
||||
|
||||
//no 0 sized chips
|
||||
if(image.size == 0x00000000)
|
||||
return EMU_ERROR_INVALID_PARAMETER;
|
||||
|
||||
//max out at 2gb SD card, Palms cant handle higher than that anyway because of incompatibility with FAT32 and SDHC
|
||||
if(image.size > 0x20000000)
|
||||
return EMU_ERROR_OUT_OF_MEMORY;
|
||||
return EMU_ERROR_INVALID_PARAMETER;
|
||||
|
||||
//round up to 1 block of SDSC block size to prevent buffer overflows when accessing the last block
|
||||
palmSdCard.flashChip.size = image.size & ~(SD_CARD_BLOCK_SIZE - 1) + (image.size & (SD_CARD_BLOCK_SIZE - 1) ? SD_CARD_BLOCK_SIZE : 0);
|
||||
//round up to nearest mb, prevents issues with buffer size and too small SD cards
|
||||
palmSdCard.flashChip.size = image.size & 0xFF100000 + (image.size & 0x000FFFFF ? 0x00100000 : 0x00000000);
|
||||
palmSdCard.flashChip.data = malloc(palmSdCard.flashChip.size);
|
||||
if(!palmSdCard.flashChip.data)
|
||||
return EMU_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
@@ -81,7 +81,7 @@ enum{
|
||||
//types
|
||||
typedef struct{
|
||||
uint8_t* data;
|
||||
uint64_t size;
|
||||
uint32_t size;
|
||||
}buffer_t;
|
||||
|
||||
typedef struct{
|
||||
@@ -166,10 +166,10 @@ void emulatorExit(void);
|
||||
void emulatorHardReset(void);
|
||||
void emulatorSoftReset(void);
|
||||
void emulatorSetRtc(uint16_t days, uint8_t hours, uint8_t minutes, uint8_t seconds);
|
||||
uint64_t emulatorGetStateSize(void);
|
||||
uint32_t emulatorGetStateSize(void);
|
||||
bool emulatorSaveState(buffer_t buffer);//true = success
|
||||
bool emulatorLoadState(buffer_t buffer);//true = success
|
||||
uint64_t emulatorGetRamSize(void);
|
||||
uint32_t emulatorGetRamSize(void);
|
||||
bool emulatorSaveRam(buffer_t buffer);//true = success
|
||||
bool emulatorLoadRam(buffer_t buffer);//true = success
|
||||
buffer_t emulatorGetSdCardBuffer(void);//this is a direct pointer to the SD card data, do not free it
|
||||
|
||||
@@ -24,8 +24,8 @@ void expansionHardwareReset(void){
|
||||
armv5Reset();
|
||||
}
|
||||
|
||||
uint64_t expansionHardwareStateSize(void){
|
||||
uint64_t size = 0;
|
||||
uint32_t expansionHardwareStateSize(void){
|
||||
uint32_t size = 0;
|
||||
|
||||
size += sizeof(uint32_t);
|
||||
if(palmEmuFeatures.info & FEATURE_HYBRID_CPU)
|
||||
@@ -35,7 +35,7 @@ uint64_t expansionHardwareStateSize(void){
|
||||
}
|
||||
|
||||
void expansionHardwareSaveState(uint8_t* data){
|
||||
uint64_t offset = 0;
|
||||
uint32_t offset = 0;
|
||||
|
||||
writeStateValue32(data + offset, expansionHardwareLcdPointer);
|
||||
offset += sizeof(uint32_t);
|
||||
@@ -46,7 +46,7 @@ void expansionHardwareSaveState(uint8_t* data){
|
||||
}
|
||||
|
||||
void expansionHardwareLoadState(uint8_t* data){
|
||||
uint64_t offset = 0;
|
||||
uint32_t offset = 0;
|
||||
|
||||
expansionHardwareLcdPointer = readStateValue32(data + offset);
|
||||
offset += sizeof(uint32_t);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#include <stdint.h>
|
||||
|
||||
void expansionHardwareReset(void);
|
||||
uint64_t expansionHardwareStateSize(void);
|
||||
uint32_t expansionHardwareStateSize(void);
|
||||
void expansionHardwareSaveState(uint8_t* data);
|
||||
void expansionHardwareLoadState(uint8_t* data);
|
||||
|
||||
|
||||
@@ -98,8 +98,8 @@ void flx68000Reset(void){
|
||||
m68k_pulse_reset();
|
||||
}
|
||||
|
||||
uint64_t flx68000StateSize(void){
|
||||
uint64_t size = 0;
|
||||
uint32_t flx68000StateSize(void){
|
||||
uint32_t size = 0;
|
||||
|
||||
size += sizeof(uint32_t) * 50;//m68ki_cpu
|
||||
|
||||
@@ -107,7 +107,7 @@ uint64_t flx68000StateSize(void){
|
||||
}
|
||||
|
||||
void flx68000SaveState(uint8_t* data){
|
||||
uint64_t offset = 0;
|
||||
uint32_t offset = 0;
|
||||
uint8_t index;
|
||||
|
||||
for(index = 0; index < 16; index++){
|
||||
@@ -175,7 +175,7 @@ void flx68000SaveState(uint8_t* data){
|
||||
}
|
||||
|
||||
void flx68000LoadState(uint8_t* data){
|
||||
uint64_t offset = 0;
|
||||
uint32_t offset = 0;
|
||||
uint8_t index;
|
||||
|
||||
for(index = 0; index < 16; index++){
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
void flx68000Init(void);
|
||||
void flx68000Reset(void);
|
||||
uint64_t flx68000StateSize(void);
|
||||
uint32_t flx68000StateSize(void);
|
||||
void flx68000SaveState(uint8_t* data);
|
||||
void flx68000LoadState(uint8_t* data);
|
||||
void flx68000LoadStateFinished(void);
|
||||
|
||||
@@ -67,8 +67,8 @@ void pdiUsbD12Reset(void){
|
||||
}
|
||||
}
|
||||
|
||||
uint64_t pdiUsbD12StateSize(void){
|
||||
uint64_t size = 0;
|
||||
uint32_t pdiUsbD12StateSize(void){
|
||||
uint32_t size = 0;
|
||||
|
||||
size += sizeof(uint8_t);
|
||||
size += sizeof(uint64_t);
|
||||
@@ -79,7 +79,7 @@ uint64_t pdiUsbD12StateSize(void){
|
||||
}
|
||||
|
||||
void pdiUsbD12SaveState(uint8_t* data){
|
||||
uint64_t offset = 0;
|
||||
uint32_t offset = 0;
|
||||
uint8_t index;
|
||||
|
||||
writeStateValue8(data + offset, pdiUsbD12Command);
|
||||
@@ -97,7 +97,7 @@ void pdiUsbD12SaveState(uint8_t* data){
|
||||
}
|
||||
|
||||
void pdiUsbD12LoadState(uint8_t* data){
|
||||
uint64_t offset = 0;
|
||||
uint32_t offset = 0;
|
||||
uint8_t index;
|
||||
|
||||
pdiUsbD12Command = readStateValue8(data + offset);
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#include <stdbool.h>
|
||||
|
||||
void pdiUsbD12Reset(void);
|
||||
uint64_t pdiUsbD12StateSize(void);
|
||||
uint32_t pdiUsbD12StateSize(void);
|
||||
void pdiUsbD12SaveState(uint8_t* data);
|
||||
void pdiUsbD12LoadState(uint8_t* data);
|
||||
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
#include <stdbool.h>
|
||||
|
||||
//endian
|
||||
static inline void swap16BufferIfLittle(uint8_t* buffer, uint64_t count){
|
||||
static inline void swap16BufferIfLittle(uint8_t* buffer, uint32_t count){
|
||||
#if !defined(EMU_BIG_ENDIAN)
|
||||
uint64_t index;
|
||||
uint32_t index;
|
||||
//count specifys the number of uint16_t's that need to be swapped, the uint8_t* is because of alignment restrictions that crash on some platforms
|
||||
count *= sizeof(uint16_t);
|
||||
for(index = 0; index < count; index += 2){
|
||||
|
||||
@@ -220,7 +220,7 @@ bool sdCardExchangeBit(bool bit){
|
||||
case SEND_CID:{
|
||||
uint8_t cid[16];
|
||||
|
||||
sdCardGetCsd(cid);
|
||||
sdCardGetCid(cid);
|
||||
if(!palmSdCard.allowInvalidCrc)
|
||||
cid[15] = sdCardCrc7(cid, 15);
|
||||
sdCardDoResponseR1(palmSdCard.inIdleState);
|
||||
|
||||
@@ -96,7 +96,7 @@ static void sdCardGetCsd(uint8_t* csd){
|
||||
memcpy(csd, sdCardCsd, 16);
|
||||
|
||||
//set device size field(in multiples of 256k right now, the multiplier size also scales based on chip size), needed to get size
|
||||
deviceSize = palmSdCard.flashChip.size / SD_CARD_BLOCK_SIZE / SD_CARD_BLOCK_SIZE;//to calculate the card capacity excluding security area ((device size + 1) * device size multiplier * max read data block length) bytes
|
||||
deviceSize = palmSdCard.flashChip.size / SD_CARD_BLOCK_SIZE / 512;//to calculate the card capacity excluding security area ((device size + 1) * device size multiplier * max read data block length) bytes
|
||||
csd[6] = csd[6] & 0xFC | deviceSize >> 10 & 0x03;
|
||||
csd[7] = deviceSize >> 2 & 0xFF;
|
||||
csd[8] = csd[8] & 0x3F | deviceSize << 6 & 0xC0;
|
||||
|
||||
@@ -127,8 +127,8 @@ void sed1376Reset(void){
|
||||
sed1376Registers[PWR_SAVE_CFG] = 0x80;
|
||||
}
|
||||
|
||||
uint64_t sed1376StateSize(void){
|
||||
uint64_t size = 0;
|
||||
uint32_t sed1376StateSize(void){
|
||||
uint32_t size = 0;
|
||||
|
||||
size += SED1376_REG_SIZE;
|
||||
size += SED1376_LUT_SIZE * 3;
|
||||
@@ -138,7 +138,7 @@ uint64_t sed1376StateSize(void){
|
||||
}
|
||||
|
||||
void sed1376SaveState(uint8_t* data){
|
||||
uint64_t offset = 0;
|
||||
uint32_t offset = 0;
|
||||
|
||||
memcpy(data + offset, sed1376Registers, SED1376_REG_SIZE);
|
||||
offset += SED1376_REG_SIZE;
|
||||
@@ -153,7 +153,7 @@ void sed1376SaveState(uint8_t* data){
|
||||
}
|
||||
|
||||
void sed1376LoadState(uint8_t* data){
|
||||
uint64_t offset = 0;
|
||||
uint32_t offset = 0;
|
||||
uint16_t index;
|
||||
|
||||
memcpy(sed1376Registers, data + offset, SED1376_REG_SIZE);
|
||||
|
||||
@@ -8,7 +8,7 @@ extern uint16_t sed1376Framebuffer[];
|
||||
extern uint8_t sed1376Ram[];
|
||||
|
||||
void sed1376Reset(void);
|
||||
uint64_t sed1376StateSize(void);
|
||||
uint32_t sed1376StateSize(void);
|
||||
void sed1376SaveState(uint8_t* data);
|
||||
void sed1376LoadState(uint8_t* data);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user