
void update_eeprom(uint16_t location, uint8_t val)
{
    uint8_t old = read_eeprom(location); 
    uint8_t diff = val ^ old;
    
    if (diff == 0) return;     // eeprom value unchanged

    if ((val & diff) == 0) {   // are bits blown?
        write_eeprom(location, val); // only bits 1 -> 0
    else {                     // need to erase page
        uint16_t page = location & ~511;
        uint16_t i;
        for (i = 0; i < 512; i++) {
            xbuf[i] = read_eeprom(i + page); // copy page to XRAM
        eeprom_erase(page);
        xbuf[location - page] = val;  // update XRAM copy
        for (i = 0; i < 512; i++) {
            write_eeprom(i + page, xbuf[i]); // write new page
    }
}
