diff --git a/src/device/controllers/paks/mempak.c b/src/device/controllers/paks/mempak.c index 75ded7c16..e57dc5ff8 100644 --- a/src/device/controllers/paks/mempak.c +++ b/src/device/controllers/paks/mempak.c @@ -25,6 +25,7 @@ #include "device/controllers/game_controller.h" #include "main/util.h" +#include #include #include #include @@ -33,6 +34,7 @@ * Only used to ease offsets/pointers computation * DO NOT DEREFERENCE */ +#pragma pack(push, 1) struct id_block_serialized { uint32_t serial[6]; uint16_t device_id; @@ -40,10 +42,13 @@ struct id_block_serialized { uint8_t version; uint16_t sum; uint16_t isum; -} __attribute__((packed)); -_Static_assert(sizeof(struct id_block_serialized) == 32, "id_block_serialized must have a size of 32 bytes"); +}; +#pragma pack(pop) +#if defined(static_assert) +static_assert(sizeof(struct id_block_serialized) == 32, "id_block_serialized must have a size of 32 bytes"); +#endif -static void checksum_id_block(unsigned char ptr[static sizeof(struct id_block_serialized)], +static void checksum_id_block(unsigned char* ptr, uint16_t* sum, uint16_t* isum) { size_t i; @@ -55,7 +60,7 @@ static void checksum_id_block(unsigned char ptr[static sizeof(struct id_block_se *isum = UINT16_C(0xfff2) - accu; } -static uint8_t checksum_index_table(size_t count, unsigned char ptr[static count]) +static uint8_t checksum_index_table(size_t count, unsigned char* ptr) { unsigned sum = 0; while (count != 0) { @@ -67,7 +72,7 @@ static uint8_t checksum_index_table(size_t count, unsigned char ptr[static count return (uint8_t)sum; } -static void serialize_id_block(unsigned char ptr[static sizeof(struct id_block_serialized)], const uint32_t serial[6], uint16_t device_id, uint8_t banks, uint8_t version) { +static void serialize_id_block(unsigned char *ptr, const uint32_t serial[6], uint16_t device_id, uint8_t banks, uint8_t version) { size_t i; /* _ should never be dereferenced - it is only used to ease pointer/offsets computation */ diff --git a/src/main/util.c b/src/main/util.c index 70c800350..3fffc2ec4 100644 --- a/src/main/util.c +++ b/src/main/util.c @@ -260,18 +260,18 @@ void to_big_endian_buffer(void *buffer, size_t length, size_t count) /* Simple serialization primitives, * Use byte access to avoid alignment issues. */ -uint8_t load_beu8(const unsigned char ptr[static sizeof(uint8_t)]) +uint8_t load_beu8(const unsigned char *ptr) { return (uint8_t)ptr[0]; } -uint16_t load_beu16(const unsigned char ptr[static sizeof(uint16_t)]) +uint16_t load_beu16(const unsigned char *ptr) { return ((uint16_t)ptr[0] << 8) | ((uint16_t)ptr[1] << 0); } -uint32_t load_beu32(const unsigned char ptr[static sizeof(uint32_t)]) +uint32_t load_beu32(const unsigned char *ptr) { return ((uint32_t)ptr[0] << 24) | ((uint32_t)ptr[1] << 16) @@ -279,7 +279,7 @@ uint32_t load_beu32(const unsigned char ptr[static sizeof(uint32_t)]) | ((uint32_t)ptr[3] << 0); } -uint64_t load_beu64(const unsigned char ptr[static sizeof(uint64_t)]) +uint64_t load_beu64(const unsigned char *ptr) { return ((uint64_t)ptr[0] << 56) | ((uint64_t)ptr[1] << 48) @@ -292,18 +292,18 @@ uint64_t load_beu64(const unsigned char ptr[static sizeof(uint64_t)]) } -uint8_t load_leu8(const unsigned char ptr[static sizeof(uint8_t)]) +uint8_t load_leu8(const unsigned char *ptr) { return (uint8_t)ptr[0]; } -uint16_t load_leu16(const unsigned char ptr[static sizeof(uint16_t)]) +uint16_t load_leu16(const unsigned char *ptr) { return ((uint16_t)ptr[0] << 0) | ((uint16_t)ptr[1] << 8); } -uint32_t load_leu32(const unsigned char ptr[static sizeof(uint32_t)]) +uint32_t load_leu32(const unsigned char *ptr) { return ((uint32_t)ptr[0] << 0) | ((uint32_t)ptr[1] << 8) @@ -311,7 +311,7 @@ uint32_t load_leu32(const unsigned char ptr[static sizeof(uint32_t)]) | ((uint32_t)ptr[3] << 24); } -uint64_t load_leu64(const unsigned char ptr[static sizeof(uint64_t)]) +uint64_t load_leu64(const unsigned char *ptr) { return ((uint64_t)ptr[0] << 0) | ((uint64_t)ptr[1] << 8) @@ -325,18 +325,18 @@ uint64_t load_leu64(const unsigned char ptr[static sizeof(uint64_t)]) -void store_beu8(uint8_t value, unsigned char ptr[static sizeof(value)]) +void store_beu8(uint8_t value, unsigned char *ptr) { ptr[0] = (uint8_t)value; } -void store_beu16(uint16_t value, unsigned char ptr[static sizeof(value)]) +void store_beu16(uint16_t value, unsigned char *ptr) { ptr[0] = (uint8_t)(value >> 8); ptr[1] = (uint8_t)(value >> 0); } -void store_beu32(uint32_t value, unsigned char ptr[static sizeof(value)]) +void store_beu32(uint32_t value, unsigned char *ptr) { ptr[0] = (uint8_t)(value >> 24); ptr[1] = (uint8_t)(value >> 16); @@ -344,7 +344,7 @@ void store_beu32(uint32_t value, unsigned char ptr[static sizeof(value)]) ptr[3] = (uint8_t)(value >> 0); } -void store_beu64(uint64_t value, unsigned char ptr[static sizeof(value)]) +void store_beu64(uint64_t value, unsigned char *ptr) { ptr[0] = (uint8_t)(value >> 56); ptr[1] = (uint8_t)(value >> 48); @@ -357,18 +357,18 @@ void store_beu64(uint64_t value, unsigned char ptr[static sizeof(value)]) } -void store_leu8(uint8_t value, unsigned char ptr[static sizeof(value)]) +void store_leu8(uint8_t value, unsigned char *ptr) { ptr[0] = (uint8_t)value; } -void store_leu16(uint16_t value, unsigned char ptr[static sizeof(value)]) +void store_leu16(uint16_t value, unsigned char *ptr) { ptr[0] = (uint8_t)(value >> 0); ptr[1] = (uint8_t)(value >> 8); } -void store_leu32(uint32_t value, unsigned char ptr[static sizeof(value)]) +void store_leu32(uint32_t value, unsigned char *ptr) { ptr[0] = (uint8_t)(value >> 0); ptr[1] = (uint8_t)(value >> 8); @@ -376,7 +376,7 @@ void store_leu32(uint32_t value, unsigned char ptr[static sizeof(value)]) ptr[3] = (uint8_t)(value >> 24); } -void store_leu64(uint64_t value, unsigned char ptr[static sizeof(value)]) +void store_leu64(uint64_t value, unsigned char *ptr) { ptr[0] = (uint8_t)(value >> 0); ptr[1] = (uint8_t)(value >> 8); diff --git a/src/main/util.h b/src/main/util.h index 054e8d481..fc502c172 100644 --- a/src/main/util.h +++ b/src/main/util.h @@ -154,25 +154,25 @@ void to_big_endian_buffer(void *buffer, size_t length, size_t count); /* Simple serialization primitives, * Loosely modeled after N2827 proposal. */ -uint8_t load_beu8(const unsigned char ptr[static sizeof(uint8_t)]); -uint16_t load_beu16(const unsigned char ptr[static sizeof(uint16_t)]); -uint32_t load_beu32(const unsigned char ptr[static sizeof(uint32_t)]); -uint64_t load_beu64(const unsigned char ptr[static sizeof(uint64_t)]); - -uint8_t load_leu8(const unsigned char ptr[static sizeof(uint8_t)]); -uint16_t load_leu16(const unsigned char ptr[static sizeof(uint16_t)]); -uint32_t load_leu32(const unsigned char ptr[static sizeof(uint32_t)]); -uint64_t load_leu64(const unsigned char ptr[static sizeof(uint64_t)]); - -void store_beu8(uint8_t value, unsigned char ptr[static sizeof(value)]); -void store_beu16(uint16_t value, unsigned char ptr[static sizeof(value)]); -void store_beu32(uint32_t value, unsigned char ptr[static sizeof(value)]); -void store_beu64(uint64_t value, unsigned char ptr[static sizeof(value)]); - -void store_leu8(uint8_t value, unsigned char ptr[static sizeof(value)]); -void store_leu16(uint16_t value, unsigned char ptr[static sizeof(value)]); -void store_leu32(uint32_t value, unsigned char ptr[static sizeof(value)]); -void store_leu64(uint64_t value, unsigned char ptr[static sizeof(value)]); +uint8_t load_beu8(const unsigned char *ptr); +uint16_t load_beu16(const unsigned char *ptr); +uint32_t load_beu32(const unsigned char *ptr); +uint64_t load_beu64(const unsigned char *ptr); + +uint8_t load_leu8(const unsigned char *ptr); +uint16_t load_leu16(const unsigned char *ptr); +uint32_t load_leu32(const unsigned char *ptr); +uint64_t load_leu64(const unsigned char *ptr); + +void store_beu8(uint8_t value, unsigned char *ptr); +void store_beu16(uint16_t value, unsigned char *ptr); +void store_beu32(uint32_t value, unsigned char *ptr); +void store_beu64(uint64_t value, unsigned char *ptr); + +void store_leu8(uint8_t value, unsigned char *ptr); +void store_leu16(uint16_t value, unsigned char *ptr); +void store_leu32(uint32_t value, unsigned char *ptr); +void store_leu64(uint64_t value, unsigned char *ptr); /**********************