//EEPPROM compatibility support for simulator #include #include #include #include #define EEPROM_SIZE 1024 static FILE * fp; static uint8_t eemem[EEPROM_SIZE]; static uint8_t inited; static void init(){ if(!inited){ inited = 1; char* filename = ".simulated_eeprom.bin"; size_t size; fp = fopen(filename, "r+"); if(fp == 0){ fp = fopen(filename, "w+"); if(fp == 0){ printf("Failed to open %s\n",filename ); exit (1); } } size = fread (eemem, 1, EEPROM_SIZE, fp); if(size < EEPROM_SIZE){ memset(eemem, 0xff, EEPROM_SIZE); } } } extern uint8_t _eeprom_start__[]; uint16_t conv_addr(void * p){ uint16_t addr; addr = (unsigned long)p - (unsigned long)_eeprom_start__; if(addr >= EEPROM_SIZE){ printf ("warning: eeprom write to %X\n",addr); } addr &= (EEPROM_SIZE-1); return addr; } void eeprom_write_byte (uint8_t *p, uint8_t value){ printf("sim eeprom write [%04X]=%02X\n", conv_addr(p), value); init(); eemem[conv_addr(p)] = value; fseek(fp, 0, SEEK_SET); fwrite(eemem, 1, EEPROM_SIZE, fp); } void eeprom_write_word (uint16_t *p, uint16_t value){ printf("sim eeprom write [%04X]=%04X\n", conv_addr(p), value); init(); eemem[conv_addr((uint8_t*)p) ] = value & 0xff; eemem[conv_addr((uint8_t*)p)+1] = value >> 8; fseek(fp, 0, SEEK_SET); fwrite(eemem, 1, EEPROM_SIZE, fp); fflush(fp); } uint8_t eeprom_read_byte (uint8_t *p){ init(); return eemem[conv_addr(p)]; } uint16_t eeprom_read_word (uint16_t *p){ init(); return eemem[conv_addr((uint8_t*)p)] | (eemem[conv_addr((uint8_t*)p)+1]<<8); }