borgware-2d/simulator/eeprom.c

77 lines
1.6 KiB
C

//EEPPROM compatibility support for simulator
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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);
}