14 Eeprom::Eeprom(Bus
& bus
, unsigned int size
)
15 : Hardware(bus
), Memory(size
), oldEecr(0) {
21 void Eeprom::writeToAddress(unsigned int addr
, unsigned char val
) {
25 unsigned char Eeprom::readFromAddress(unsigned int addr
) {
26 return readByte(addr
);
29 bool Eeprom::attachReg(const char *name
, IORegister
*reg
) {
30 if( strcmp(name
, "eecr") == 0 )
32 else if( strcmp(name
, "eedr") == 0 )
34 else if( strcmp(name
, "eearl") == 0 )
36 else if( strcmp(name
, "eearh") == 0 )
41 reg
->registerHW(this);
45 void Eeprom::regChanged( IORegister
*reg
) {
47 eear
= (eear
& 0x00ff) | (*eearh
<< 8);
48 else if( reg
== eearl
)
49 eear
= (eear
& 0xff00) | (*eearl
);
50 else if( reg
== eecr
)
60 *eecr
= *eecr
& CLEAR
;
61 writeToAddress( eear
, *eedr
);
66 *eecr
= *eecr
& CLEAR
;
67 *eedr
= readFromAddress( eear
);
72 *eecr
= *eecr
& ~EEMWE
;
78 void Eeprom::setEECR( unsigned char eecr
) {
79 if( ((eecr
& EEMWE
) != 0) && (state
== READY
) ) {
80 state
= WRITE_ENABLED
;
81 bus
.reassignBreakDelta(writeEnableCycles
, this);
82 } else if( ((eecr
& EEWE
) != 0) && (state
== WRITE_ENABLED
) ) {
84 setHoldCycles( writeCycles
);
85 bus
.reassignBreakDelta(writeCycles
, this);
86 } else if( (eecr
& EERE
) != 0 ) {
87 //EERE EEprom read enable
88 if( state
== WRITE
) {
92 setHoldCycles( readCycles
);
93 bus
.reassignBreakDelta(readCycles
, this);
95 } else if( (eecr
& 0x07) != 0x00 ) {
97 bus
.clearBreak( this );