@@ -26,18 +26,12 @@ static uint8_t mem_read_flash_serial(uint32_t);
2626void mem_init (void ) {
2727 unsigned int i ;
2828
29- /* Allocate FLASH memory */
30- mem .flash .block = (uint8_t * )malloc (SIZE_FLASH );
31- memset (mem .flash .block , 0xFF , SIZE_FLASH );
32-
3329 for (i = 0 ; i < NUM_8K_SECTORS ; i ++ ) {
34- mem .flash .sector8k [i ].ptr = mem .flash .block + i * SIZE_FLASH_SECTOR_8K ;
3530 mem .flash .sector8k [i ].ipb = 0 ;
3631 mem .flash .sector8k [i ].dpb = 1 ;
3732 }
3833
39- for (i = 0 ; i < NUM_SECTORS ; i ++ ) {
40- mem .flash .sector [i ].ptr = mem .flash .block + i * SIZE_FLASH_SECTOR_64K ;
34+ for (i = 0 ; i < NUM_SECTORS_MAX ; i ++ ) {
4135 mem .flash .sector [i ].ipb = 1 ;
4236 mem .flash .sector [i ].dpb = 1 ;
4337 }
@@ -77,7 +71,7 @@ static uint32_t addr_block(uint32_t *addr, int32_t size, void **block, uint32_t
7771 if (* addr < 0xD00000 ) {
7872 * addr &= asic .serFlash ? flash .mask : flash .mappedBytes - 1 ;
7973 * block = mem .flash .block ;
80- * block_size = SIZE_FLASH ;
74+ * block_size = mem . flash . size ;
8175 } else if (* addr < 0xE00000 ) {
8276 * addr &= 0x07FFFF ;
8377 * block = mem .ram .block ;
@@ -184,6 +178,11 @@ void mem_dma_write(const void *buf, uint32_t addr, int32_t size) {
184178 }
185179}
186180
181+ static uint32_t flash_num_sectors (void ) {
182+ uint32_t num_sectors = mem .flash .size / SIZE_FLASH_SECTOR_64K ;
183+ return num_sectors >= NUM_SECTORS_MAX ? NUM_SECTORS_MAX : num_sectors ;
184+ }
185+
187186static void flash_reset_write_index (uint32_t addr , uint8_t byte ) {
188187 (void )addr ;
189188 (void )byte ;
@@ -208,21 +207,21 @@ static void flash_write(uint32_t addr, uint8_t byte) {
208207}
209208
210209static void flash_erase (uint32_t addr , uint8_t byte ) {
211- unsigned int i ;
212210 (void )addr ;
213211 (void )byte ;
214212
215213 mem .flash .command = FLASH_CHIP_ERASE ;
216214
217- for (i = 0 ; i < NUM_8K_SECTORS ; i ++ ) {
215+ for (uint32_t i = 0 ; i < NUM_8K_SECTORS ; i ++ ) {
218216 if ((mem .flash .sector8k [i ].ipb & mem .flash .sector8k [i ].dpb ) == 1 ) {
219- memset (mem .flash .sector8k [ i ]. ptr , 0xFF , SIZE_FLASH_SECTOR_8K );
217+ memset (& mem .flash .block [ i * SIZE_FLASH_SECTOR_8K ] , 0xFF , SIZE_FLASH_SECTOR_8K );
220218 }
221219 }
222220
223- for (i = 0 ; i < NUM_SECTORS ; i ++ ) {
221+ uint32_t num_sectors = flash_num_sectors ();
222+ for (uint32_t i = 0 ; i < num_sectors ; i ++ ) {
224223 if ((mem .flash .sector [i ].ipb & mem .flash .sector [i ].dpb ) == 1 ) {
225- memset (mem .flash .sector [ i ]. ptr , 0xFF , SIZE_FLASH_SECTOR_64K );
224+ memset (& mem .flash .block [ i * SIZE_FLASH_SECTOR_64K ] , 0xFF , SIZE_FLASH_SECTOR_64K );
226225 }
227226 }
228227
@@ -235,15 +234,15 @@ static void flash_erase_sector(uint32_t addr, uint8_t byte) {
235234
236235 mem .flash .command = FLASH_SECTOR_ERASE ;
237236
238- if (addr < 0x10000 ) {
237+ if (addr < SIZE_FLASH_SECTOR_8K * NUM_8K_SECTORS ) {
239238 selected = addr / SIZE_FLASH_SECTOR_8K ;
240239 if ((mem .flash .sector8k [selected ].ipb & mem .flash .sector8k [selected ].dpb ) == 1 ) {
241- memset (mem .flash .sector8k [selected ]. ptr , 0xff , SIZE_FLASH_SECTOR_8K );
240+ memset (& mem .flash .block [selected * SIZE_FLASH_SECTOR_8K ], 0xFF , SIZE_FLASH_SECTOR_8K );
242241 }
243242 } else {
244243 selected = addr / SIZE_FLASH_SECTOR_64K ;
245244 if ((mem .flash .sector [selected ].ipb & mem .flash .sector [selected ].dpb ) == 1 ) {
246- memset (mem .flash .sector [selected ]. ptr , 0xff , SIZE_FLASH_SECTOR_64K );
245+ memset (& mem .flash .block [selected * SIZE_FLASH_SECTOR_64K ], 0xFF , SIZE_FLASH_SECTOR_64K );
247246 }
248247 }
249248}
@@ -284,17 +283,17 @@ static void flash_enter_dpb(uint32_t addr, uint8_t byte) {
284283}
285284
286285static void flash_erase_ipb (uint32_t addr , uint8_t byte ) {
287- int i ;
288286 (void )addr ;
289287 (void )byte ;
290288
291289 if ( mem .flash .command == FLASH_IPB_MODE )
292290 {
293- for (i = 0 ; i < NUM_8K_SECTORS ; i ++ ) {
291+ for (uint32_t i = 0 ; i < NUM_8K_SECTORS ; i ++ ) {
294292 mem .flash .sector8k [i ].ipb = 1 ;
295293 }
296294
297- for (i = 0 ; i < NUM_SECTORS ; i ++ ) {
295+ uint32_t num_sectors = flash_num_sectors ();
296+ for (uint32_t i = 0 ; i < num_sectors ; i ++ ) {
298297 mem .flash .sector [i ].ipb = 1 ;
299298 }
300299
@@ -485,9 +484,10 @@ static uint8_t mem_read_flash_parallel(uint32_t addr) {
485484 }
486485 cpu .cycles += flash .waitStates ;
487486
487+ addr &= mem .flash .size - 1 ;
488488 switch (mem .flash .command ) {
489489 case FLASH_NO_COMMAND :
490- value = mem .flash .block [addr & ( SIZE_FLASH - 1 ) ];
490+ value = mem .flash .block [addr ];
491491 break ;
492492 case FLASH_SECTOR_ERASE :
493493 value = 0x80 ;
@@ -502,7 +502,7 @@ static uint8_t mem_read_flash_parallel(uint32_t addr) {
502502 mem .flash .command = FLASH_NO_COMMAND ;
503503 break ;
504504 case FLASH_READ_SECTOR_PROTECTION :
505- if (addr < 0x10000 ) {
505+ if (addr < SIZE_FLASH_SECTOR_8K * NUM_8K_SECTORS ) {
506506 selected = addr / SIZE_FLASH_SECTOR_8K ;
507507 value = !(mem .flash .sector8k [selected ].ipb & mem .flash .sector8k [selected ].dpb );
508508 } else {
@@ -597,6 +597,7 @@ static void mem_write_flash(uint32_t addr, uint8_t byte) {
597597 flash_write_t * w ;
598598 flash_write_pattern_t * pattern ;
599599
600+ addr &= mem .flash .size - 1 ;
600601 if (mem .flash .command != FLASH_NO_COMMAND ) {
601602 if ((mem .flash .command != FLASH_DEEP_POWER_DOWN && byte == 0xF0 ) ||
602603 (mem .flash .command == FLASH_DEEP_POWER_DOWN && byte == 0xAB )) {
@@ -918,37 +919,38 @@ bool mem_save(FILE *image) {
918919 assert (mem .ram .block );
919920
920921 return fwrite (& mem , sizeof (mem ), 1 , image ) == 1 &&
921- fwrite (mem .flash .block , SIZE_FLASH , 1 , image ) == 1 &&
922+ fwrite (mem .flash .block , mem . flash . size , 1 , image ) == 1 &&
922923 fwrite (mem .ram .block , SIZE_RAM , 1 , image ) == 1 ;
923924}
924925
925926bool mem_restore (FILE * image ) {
926- bool ret = false ;
927+ bool ret = true ;
927928 unsigned int i ;
928929 uint8_t * tmp_flash_ptr ;
929930 uint8_t * tmp_ram_ptr ;
930931
931- assert (mem .flash .block );
932932 assert (mem .ram .block );
933-
934- tmp_flash_ptr = mem .flash .block ;
935933 tmp_ram_ptr = mem .ram .block ;
936934
937- ret |= fread (& mem , sizeof (mem ), 1 , image ) == 1 ;
935+ free (mem .flash .block );
936+
937+ ret &= fread (& mem , sizeof (mem ), 1 , image ) == 1 ;
938938
939- mem .flash .block = tmp_flash_ptr ;
940939 mem .ram .block = tmp_ram_ptr ;
940+ mem .flash .block = NULL ;
941941
942- ret |= fread (mem .flash .block , SIZE_FLASH , 1 , image ) == 1 &&
943- fread (mem .ram .block , SIZE_RAM , 1 , image ) == 1 ;
944-
945- for (i = 0 ; i < 8 ; i ++ ) {
946- mem .flash .sector [i ].ptr = & mem .flash .block [i * SIZE_FLASH_SECTOR_8K ];
942+ if (mem .flash .size < SIZE_FLASH_MIN || mem .flash .size > SIZE_FLASH_MAX ||
943+ (mem .flash .size & (mem .flash .size - 1 ))) {
944+ return false;
947945 }
948- for (i = 0 ; i < 64 ; i ++ ) {
949- mem .flash .sector [i ].ptr = & mem .flash .block [i * SIZE_FLASH_SECTOR_64K ];
946+ mem .flash .block = malloc (mem .flash .size );
947+ if (mem .flash .block == NULL ) {
948+ return false;
950949 }
951950
951+ ret &= fread (mem .flash .block , mem .flash .size , 1 , image ) == 1 ;
952+ ret &= fread (mem .ram .block , SIZE_RAM , 1 , image ) == 1 ;
953+
952954 mem_read_flash = asic .serFlash ? mem_read_flash_serial : mem_read_flash_parallel ;
953955
954956 return ret ;
0 commit comments