Rumata, /UWR задействовали буквально сегодня) а вот /VRES не делал. Когда именно его нужно дергать?
void byteWrite(unsigned long addr, byte value, int CARTState) {
int i;
CEHigh();
OEHigh();
LWRHigh();
UWRHigh();
shiftOut24bit(addrClockPin, addrLatchPin, addrDataPin, addr >> 1);
if((CARTState && addr <= 0x3FFFFF) || (!CARTState && addr >= 0x400000 && addr <= 0x7FFFFF)) {
CELow();
}
if(addr >= 0xA13000 && addr <= 0xA130FF) {
TIMELow();
}
ASLow();
value = ((value & 0xFF) | ((value & 0xFF) << 8));
for(i = 0; i <= DATA_PINS; i++) {
pinMode(dataPin[i], OUTPUT);
if(value & (1 << i)) {
digitalWrite(dataPin[i], HIGH);
} else {
digitalWrite(dataPin[i], LOW);
}
}
if(addr % 2) {
LWRLow();
} else {
UWRLow();
}
delayMicroseconds(opDelay);
LWRHigh();
UWRHigh();
TIMEHigh();
ASHigh();
CEHigh();
}
word wordRead(unsigned long addr, int CARTState) {
word data = 0;
int i;
for(i = 0; i < DATA_PINS; i++) {
pinMode(dataPin[i], INPUT);
}
CEHigh();
OEHigh();
LWRHigh();
UWRHigh();
shiftOut24bit(addrClockPin, addrLatchPin, addrDataPin, addr >> 1);
if((CARTState && addr <= 0x3FFFFF) || (!CARTState && addr >= 0x400000 && addr <= 0x7FFFFF)) {
CELow();
}
if(addr <= 0xDFFFFF) {
OELow();
}
if(addr >= 0xA13000 && addr <= 0xA130FF) {
TIMELow();
}
ASLow();
delayMicroseconds(opDelay);
for(i = 0; i < DATA_PINS; i++) {
if(digitalRead(dataPin[i])) {
data |= (1 << i);
}
}
TIMEHigh();
ASHigh();
LWRHigh();
UWRHigh();
CEHigh();
OEHigh();
return data;
}