From 8f92c6d6ccd633234b8ad60a35a4e302c6d494fe Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 17 Apr 2021 16:27:38 -0300 Subject: [PATCH] Clean up SPD type handling with unions --- src/include/86box/spd.h | 24 ++++++++++++++---------- src/mem/spd.c | 6 ++---- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/include/86box/spd.h b/src/include/86box/spd.h index 3b716028f..53492d0e8 100644 --- a/src/include/86box/spd.h +++ b/src/include/86box/spd.h @@ -47,16 +47,6 @@ #define SPD_SDR_ATTR_VCC_HI_5 0x20 -typedef struct { - uint8_t slot; - uint16_t size; - uint16_t row1; - uint16_t row2; - - uint8_t data[SPD_DATA_SIZE]; - void *eeprom; -} spd_t; - typedef struct { uint8_t bytes_used, spd_size, mem_type, row_bits, col_bits, banks, @@ -99,6 +89,20 @@ typedef struct { checksum2; } spd_sdram_t; +typedef struct { + uint8_t slot; + uint16_t size; + uint16_t row1; + uint16_t row2; + + union { + uint8_t data[SPD_DATA_SIZE]; + spd_edo_t edo_data; + spd_sdram_t sdram_data; + }; + void *eeprom; +} spd_t; + extern void spd_register(uint8_t ram_type, uint8_t slot_mask, uint16_t max_module_size); extern void spd_write_drbs(uint8_t *regs, uint8_t reg_min, uint8_t reg_max, uint8_t drb_unit); diff --git a/src/mem/spd.c b/src/mem/spd.c index aeddbc06a..32b49a101 100644 --- a/src/mem/spd.c +++ b/src/mem/spd.c @@ -226,8 +226,7 @@ spd_register(uint8_t ram_type, uint8_t slot_mask, uint16_t max_module_size) switch (ram_type) { case SPD_TYPE_FPM: case SPD_TYPE_EDO: - edo_data = (spd_edo_t *) &spd_modules[slot]->data; - memset(edo_data, 0, sizeof(spd_edo_t)); + edo_data = &spd_modules[slot]->edo_data; /* EDO SPD is specified by JEDEC and present in some modules, but most utilities cannot interpret it correctly. SIV32 at least gets @@ -265,8 +264,7 @@ spd_register(uint8_t ram_type, uint8_t slot_mask, uint16_t max_module_size) break; case SPD_TYPE_SDRAM: - sdram_data = (spd_sdram_t *) &spd_modules[slot]->data; - memset(sdram_data, 0, sizeof(spd_sdram_t)); + sdram_data = &spd_modules[slot]->sdram_data; sdram_data->bytes_used = 0x80; sdram_data->spd_size = 0x08;