//============================================================================ // // SSSS tt lll lll // SS SS tt ll ll // SS tttttt eeee ll ll aaaa // SSSS tt ee ee ll ll aa // SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" // SS SS tt ee ll ll aa aa // SSSS ttt eeeee llll llll aaaaa // // Copyright (c) 1995-2020 by Bradford W. Mott, Stephen Anthony // and the Stella Team // // See the file "License.txt" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. //============================================================================ #include "MT24LC256.hxx" #include "OSystem.hxx" #include "System.hxx" #include "SaveKey.hxx" // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SaveKey::SaveKey(Jack jack, const Event& event, const System& system, const string& eepromfile, const onMessageCallback& callback, Type type) : Controller(jack, event, system, type), myEEPROM(make_unique(eepromfile, system, callback)) { setPin(DigitalPin::One, true); setPin(DigitalPin::Two, true); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SaveKey::SaveKey(Jack jack, const Event& event, const System& system, const string& eepromfile, const onMessageCallback& callback) : SaveKey(jack, event, system, eepromfile, callback, Controller::Type::SaveKey) { } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SaveKey::~SaveKey() { } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool SaveKey::read(DigitalPin pin) { // We need to override the Controller::read() method, since the timing // of the actual read is important for the EEPROM (we can't just read // 60 times per second in the ::update() method) switch(pin) { // Pin 3: EEPROM SDA // input data from the 24LC256 EEPROM using the I2C protocol case DigitalPin::Three: return setPin(pin, myEEPROM->readSDA()); default: return Controller::read(pin); } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void SaveKey::write(DigitalPin pin, bool value) { // Change the pin state based on value switch(pin) { // Pin 3: EEPROM SDA // output data to the 24LC256 EEPROM using the I2C protocol case DigitalPin::Three: setPin(pin, value); myEEPROM->writeSDA(value); break; // Pin 4: EEPROM SCL // output clock data to the 24LC256 EEPROM using the I2C protocol case DigitalPin::Four: setPin(pin, value); myEEPROM->writeSCL(value); break; default: break; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void SaveKey::reset() { myEEPROM->systemReset(); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void SaveKey::close() { myEEPROM.reset(); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void SaveKey::eraseAll() { myEEPROM->eraseAll(); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void SaveKey::eraseCurrent() { myEEPROM->eraseCurrent(); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool SaveKey::isPageUsed(const uInt32 page) const { return myEEPROM->isPageUsed(page); }