From 97cd9bc5430767b7e118e648541b0fbd2e8efbd4 Mon Sep 17 00:00:00 2001 From: meepingsnesroms Date: Mon, 25 Feb 2019 15:32:35 -0800 Subject: [PATCH] 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. --- src/ads7846.c | 8 ++++---- src/ads7846.h | 2 +- src/armv5.c | 8 ++++---- src/armv5.h | 2 +- src/emulator.c | 26 +++++++++++++++----------- src/emulator.h | 6 +++--- src/expansionHardware.c | 8 ++++---- src/expansionHardware.h | 2 +- src/flx68000.c | 8 ++++---- src/flx68000.h | 2 +- src/pdiUsbD12.c | 8 ++++---- src/pdiUsbD12.h | 2 +- src/portability.h | 4 ++-- src/sdCard.c | 2 +- src/sdCardAccessors.c.h | 2 +- src/sed1376.c | 8 ++++---- src/sed1376.h | 2 +- 17 files changed, 52 insertions(+), 48 deletions(-) diff --git a/src/ads7846.c b/src/ads7846.c index 4b7e193..fc743a8 100644 --- a/src/ads7846.c +++ b/src/ads7846.c @@ -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); diff --git a/src/ads7846.h b/src/ads7846.h index f430f04..e22bee5 100644 --- a/src/ads7846.h +++ b/src/ads7846.h @@ -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); diff --git a/src/armv5.c b/src/armv5.c index c98fe00..6e691ea 100755 --- a/src/armv5.c +++ b/src/armv5.c @@ -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); diff --git a/src/armv5.h b/src/armv5.h index 2321ce1..d59649d 100755 --- a/src/armv5.h +++ b/src/armv5.h @@ -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); diff --git a/src/emulator.c b/src/emulator.c index 3b79002..e697653 100644 --- a/src/emulator.c +++ b/src/emulator.c @@ -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; diff --git a/src/emulator.h b/src/emulator.h index 16f66fd..6024928 100644 --- a/src/emulator.h +++ b/src/emulator.h @@ -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 diff --git a/src/expansionHardware.c b/src/expansionHardware.c index d9909a8..37e384c 100644 --- a/src/expansionHardware.c +++ b/src/expansionHardware.c @@ -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); diff --git a/src/expansionHardware.h b/src/expansionHardware.h index 4bb4aa3..a7dcaab 100644 --- a/src/expansionHardware.h +++ b/src/expansionHardware.h @@ -4,7 +4,7 @@ #include void expansionHardwareReset(void); -uint64_t expansionHardwareStateSize(void); +uint32_t expansionHardwareStateSize(void); void expansionHardwareSaveState(uint8_t* data); void expansionHardwareLoadState(uint8_t* data); diff --git a/src/flx68000.c b/src/flx68000.c index 532740f..37c057b 100755 --- a/src/flx68000.c +++ b/src/flx68000.c @@ -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++){ diff --git a/src/flx68000.h b/src/flx68000.h index b67172e..15dacd9 100755 --- a/src/flx68000.h +++ b/src/flx68000.h @@ -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); diff --git a/src/pdiUsbD12.c b/src/pdiUsbD12.c index f62eec6..8323df1 100644 --- a/src/pdiUsbD12.c +++ b/src/pdiUsbD12.c @@ -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); diff --git a/src/pdiUsbD12.h b/src/pdiUsbD12.h index 6573d36..06c9ec1 100644 --- a/src/pdiUsbD12.h +++ b/src/pdiUsbD12.h @@ -5,7 +5,7 @@ #include void pdiUsbD12Reset(void); -uint64_t pdiUsbD12StateSize(void); +uint32_t pdiUsbD12StateSize(void); void pdiUsbD12SaveState(uint8_t* data); void pdiUsbD12LoadState(uint8_t* data); diff --git a/src/portability.h b/src/portability.h index b7a13c9..edc7743 100644 --- a/src/portability.h +++ b/src/portability.h @@ -5,9 +5,9 @@ #include //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){ diff --git a/src/sdCard.c b/src/sdCard.c index 25e269d..0cf534b 100644 --- a/src/sdCard.c +++ b/src/sdCard.c @@ -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); diff --git a/src/sdCardAccessors.c.h b/src/sdCardAccessors.c.h index 05aa635..b3d6583 100644 --- a/src/sdCardAccessors.c.h +++ b/src/sdCardAccessors.c.h @@ -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; diff --git a/src/sed1376.c b/src/sed1376.c index b129be9..b23a0dc 100644 --- a/src/sed1376.c +++ b/src/sed1376.c @@ -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); diff --git a/src/sed1376.h b/src/sed1376.h index fc533e8..597b88a 100644 --- a/src/sed1376.h +++ b/src/sed1376.h @@ -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);