1//============================================================================
2//
3// SSSS tt lll lll
4// SS SS tt ll ll
5// SS tttttt eeee ll ll aaaa
6// SSSS tt ee ee ll ll aa
7// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
8// SS SS tt ee ll ll aa aa
9// SSSS ttt eeeee llll llll aaaaa
10//
11// Copyright (c) 1995-2019 by Bradford W. Mott, Stephen Anthony
12// and the Stella Team
13//
14// See the file "License.txt" for information on usage and redistribution of
15// this file, and for a DISCLAIMER OF ALL WARRANTIES.
16//============================================================================
17
18#include "MT24LC256.hxx"
19#include "OSystem.hxx"
20#include "System.hxx"
21#include "SaveKey.hxx"
22
23// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
24SaveKey::SaveKey(Jack jack, const Event& event, const System& system,
25 const string& eepromfile, onMessageCallback callback, Type type)
26 : Controller(jack, event, system, type)
27{
28 myEEPROM = make_unique<MT24LC256>(eepromfile, system, callback);
29
30 setPin(DigitalPin::One, true);
31 setPin(DigitalPin::Two, true);
32}
33
34// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
35SaveKey::SaveKey(Jack jack, const Event& event, const System& system,
36 const string& eepromfile, onMessageCallback callback)
37 : SaveKey(jack, event, system, eepromfile, callback, Controller::Type::SaveKey)
38{
39}
40
41// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
42SaveKey::~SaveKey()
43{
44}
45
46// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
47bool SaveKey::read(DigitalPin pin)
48{
49 // We need to override the Controller::read() method, since the timing
50 // of the actual read is important for the EEPROM (we can't just read
51 // 60 times per second in the ::update() method)
52 switch(pin)
53 {
54 // Pin 3: EEPROM SDA
55 // input data from the 24LC256 EEPROM using the I2C protocol
56 case DigitalPin::Three:
57 return setPin(pin, myEEPROM->readSDA());
58
59 default:
60 return Controller::read(pin);
61 }
62}
63
64// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
65void SaveKey::write(DigitalPin pin, bool value)
66{
67 // Change the pin state based on value
68 switch(pin)
69 {
70 // Pin 3: EEPROM SDA
71 // output data to the 24LC256 EEPROM using the I2C protocol
72 case DigitalPin::Three:
73 setPin(pin, value);
74 myEEPROM->writeSDA(value);
75 break;
76
77 // Pin 4: EEPROM SCL
78 // output clock data to the 24LC256 EEPROM using the I2C protocol
79 case DigitalPin::Four:
80 setPin(pin, value);
81 myEEPROM->writeSCL(value);
82 break;
83
84 default:
85 break;
86 }
87}
88
89// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
90void SaveKey::reset()
91{
92 myEEPROM->systemReset();
93}
94
95// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
96void SaveKey::close()
97{
98 myEEPROM.reset();
99}
100
101// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
102void SaveKey::eraseAll()
103{
104 myEEPROM->eraseAll();
105}
106
107// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
108void SaveKey::eraseCurrent()
109{
110 myEEPROM->eraseCurrent();
111}
112
113// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
114bool SaveKey::isPageUsed(const uInt32 page) const
115{
116 return myEEPROM->isPageUsed(page);
117}
118