Fixes issue with SRAM where writing to shared address port set control pins

This commit is contained in:
Roger Braunstein 2023-07-06 15:52:30 -07:00
parent 1dccf84d9f
commit 7f005e3f0e

View File

@ -11,14 +11,13 @@
// SH-1 memory map locations, ROM starts here // SH-1 memory map locations, ROM starts here
const uint32_t LOOPY_MAP_ROM_ZERO = 0x0E000000; const uint32_t LOOPY_MAP_ROM_ZERO = 0x0E000000;
const uint32_t LOOPY_MAP_SRAM_ZERO = 0x02000000; const uint32_t LOOPY_MAP_SRAM_ZERO = 0x02000000;
const uint32_t LOOPY_SRAM_SIZE = 0x2000;
// Control pins // Control pins
const int LOOPY_ROMCE = 42; const int LOOPY_ROMCE = 42;
const int LOOPY_OE = 43; const int LOOPY_OE = 43;
const int LOOPY_RAMWE = 6; const int LOOPY_RAMWE = 6;
const int LOOPY_RAMCS1 = 7; const int LOOPY_RAMCS1 = 7;
const int LOOPY_RAMCS2 = A7; const int LOOPY_RESET = A7;
// The internal checksum read from the cart header at 08h, will be checked against an actual sum // The internal checksum read from the cart header at 08h, will be checked against an actual sum
uint32_t loopyChecksum; uint32_t loopyChecksum;
@ -36,7 +35,8 @@ void setup_LOOPY() {
setVoltage(VOLTS_SET_5V); setVoltage(VOLTS_SET_5V);
// Set Address Pins to Output // Set Address Pins to Output
// PK1-PK7, PA1-PA7, PC0-PC3, PL0-PL3 // Take whole port and unset the exceptions later // PK1-PK7, PA1-PA7, PC0-PC3, PL0-PL3
// Take whole port and unset the exceptions later
DDRK = DDRA = DDRC = DDRL = 0xFF; DDRK = DDRA = DDRC = DDRL = 0xFF;
// Control pins, all active low // Control pins, all active low
@ -44,12 +44,12 @@ void setup_LOOPY() {
pinMode(LOOPY_OE, OUTPUT); pinMode(LOOPY_OE, OUTPUT);
pinMode(LOOPY_RAMWE, OUTPUT); pinMode(LOOPY_RAMWE, OUTPUT);
pinMode(LOOPY_RAMCS1, OUTPUT); pinMode(LOOPY_RAMCS1, OUTPUT);
pinMode(LOOPY_RAMCS2, OUTPUT); pinMode(LOOPY_RESET, OUTPUT);
digitalWrite(LOOPY_ROMCE, HIGH); digitalWrite(LOOPY_ROMCE, HIGH);
digitalWrite(LOOPY_OE, HIGH); digitalWrite(LOOPY_OE, HIGH);
digitalWrite(LOOPY_RAMWE, HIGH); digitalWrite(LOOPY_RAMWE, HIGH);
digitalWrite(LOOPY_RAMCS1, HIGH); digitalWrite(LOOPY_RAMCS1, HIGH);
digitalWrite(LOOPY_RAMCS2, HIGH); digitalWrite(LOOPY_RESET, HIGH);
// Set Pins (D0-D15) to Input // Set Pins (D0-D15) to Input
dataIn_LOOPY(); dataIn_LOOPY();
@ -185,10 +185,23 @@ void setAddress_LOOPY(unsigned long A) {
// PL1 A7 // PL1 A7
// PL2 A9 // PL2 A9
// PL3 A11 // PL3 A11
PORTL = (bitRead(A, 5)) // CAUTION PORTL is shared!
| (bitRead(A, 7) << 1) // D42 PL7 CE
| (bitRead(A, 9) << 2) // D43 PL6 OE
| (bitRead(A, 11) << 3); // D44 PL5
// D45 PL4
// D46 PL3 A11
// D47 PL2 A9
// D48 PL1 A7
// D49 PL0 A5
digitalWrite(46, bitRead(A, 11));
digitalWrite(47, bitRead(A, 9));
digitalWrite(48, bitRead(A, 7));
digitalWrite(49, bitRead(A, 5));
// PORTL = (bitRead(A, 5))
// | (bitRead(A, 7) << 1)
// | (bitRead(A, 9) << 2)
// | (bitRead(A, 11) << 3);
} }
uint16_t getWord_LOOPY() { uint16_t getWord_LOOPY() {
@ -225,23 +238,6 @@ uint16_t getWord_LOOPY() {
| (bitRead(PINJ, 0) << 13) | (bitRead(PINJ, 0) << 13)
| (bitRead(PINF, 4) << 14) | (bitRead(PINF, 4) << 14)
| (bitRead(PING, 5) << 15); | (bitRead(PING, 5) << 15);
// return digitalRead(A8)
// | (digitalRead(22) << 1)
// | (digitalRead(A6) << 2)
// | (digitalRead(A5) << 3)
// | (digitalRead(A3) << 4)
// | (digitalRead(40) << 5)
// | (digitalRead(A2) << 6)
// | (digitalRead(41) << 7)
// | (digitalRead(A1) << 8)
// | (digitalRead(3) << 9)
// | (digitalRead(A0) << 10)
// | (digitalRead(2) << 11)
// | (digitalRead(14) << 12)
// | (digitalRead(15) << 13)
// | (digitalRead(A4) << 14)
// | (digitalRead(4) << 15);
} }
uint8_t getByte_LOOPY() { uint8_t getByte_LOOPY() {
@ -253,14 +249,6 @@ uint8_t getByte_LOOPY() {
| (bitRead(PING, 1) << 5) | (bitRead(PING, 1) << 5)
| (bitRead(PINF, 2) << 6) | (bitRead(PINF, 2) << 6)
| (bitRead(PING, 0) << 7); | (bitRead(PING, 0) << 7);
// return digitalRead(A8)
// | (digitalRead(22) << 1)
// | (digitalRead(A6) << 2)
// | (digitalRead(A5) << 3)
// | (digitalRead(A3) << 4)
// | (digitalRead(40) << 5)
// | (digitalRead(A2) << 6)
// | (digitalRead(41) << 7);
} }
void setByte_LOOPY(uint8_t D) { void setByte_LOOPY(uint8_t D) {
@ -277,9 +265,8 @@ void setByte_LOOPY(uint8_t D) {
byte readByte_LOOPY(unsigned long myAddress) { byte readByte_LOOPY(unsigned long myAddress) {
setAddress_LOOPY(myAddress); setAddress_LOOPY(myAddress);
digitalWrite(LOOPY_RAMCS1, LOW); // 100ns MAX
digitalWrite(LOOPY_OE, LOW); NOP;
NOP; NOP;
NOP; NOP;
NOP; NOP;
@ -287,32 +274,39 @@ byte readByte_LOOPY(unsigned long myAddress) {
NOP; NOP;
NOP; NOP;
byte b = getByte_LOOPY(); return getByte_LOOPY();
digitalWrite(LOOPY_RAMCS1, HIGH);
digitalWrite(LOOPY_OE, HIGH);
return b;
} }
void writeByte_LOOPY(unsigned long myAddress, byte myData) { void writeByte_LOOPY(unsigned long myAddress, byte myData) {
// TODO now that resolved issues with writing sram, can we simplify again
setAddress_LOOPY(myAddress); setAddress_LOOPY(myAddress);
digitalWrite(LOOPY_RAMWE, LOW);
// tWHZ 35
NOP;
NOP;
NOP;
NOP;
dataOut_LOOPY();
setByte_LOOPY(myData); setByte_LOOPY(myData);
digitalWrite(LOOPY_RAMCS1, LOW); // tWP 60
digitalWrite(LOOPY_OE, HIGH); NOP;
digitalWrite(LOOPY_RAMWE, LOW); NOP;
NOP;
NOP;
NOP; NOP;
NOP; NOP;
NOP; NOP;
NOP; NOP;
NOP;
NOP;
digitalWrite(LOOPY_RAMWE, HIGH); digitalWrite(LOOPY_RAMWE, HIGH);
digitalWrite(LOOPY_RAMCS1, HIGH); dataIn_LOOPY();
} }
word readWord_LOOPY(unsigned long myAddress) { word readWord_LOOPY(unsigned long myAddress) {
@ -348,6 +342,8 @@ void dataOut_LOOPY() {
// // PF0-PF6 // // PF0-PF6
// DDRF |= 0b0111111; // DDRF |= 0b0111111;
// TODO we could really only control the lower bits since we never write words just bytes
pinMode(A8, OUTPUT); pinMode(A8, OUTPUT);
pinMode(22, OUTPUT); pinMode(22, OUTPUT);
pinMode(A6, OUTPUT); pinMode(A6, OUTPUT);
@ -483,6 +479,8 @@ void readROM_LOOPY() {
const size_t sdBufferSize = 512; const size_t sdBufferSize = 512;
uint32_t sum = 0; uint32_t sum = 0;
digitalWrite(LOOPY_ROMCE, LOW);
for (unsigned long ptr = 0; ptr < cartSize;) { for (unsigned long ptr = 0; ptr < cartSize;) {
word myWord = readWord_LOOPY(ptr); word myWord = readWord_LOOPY(ptr);
@ -508,6 +506,8 @@ void readROM_LOOPY() {
// TODO this assumes size is divisible by 512 // TODO this assumes size is divisible by 512
myFile.close(); myFile.close();
digitalWrite(LOOPY_ROMCE, HIGH);
// Instead of the CRC32, check the internal integrity based on the header checksum // Instead of the CRC32, check the internal integrity based on the header checksum
print_Msg(F("Header sum: ")); print_Msg(F("Header sum: "));
println_Msg(checksumStr); println_Msg(checksumStr);
@ -544,23 +544,41 @@ void readROM_LOOPY() {
//****************************************** //******************************************
void writeSRAM_LOOPY() { void writeSRAM_LOOPY() {
dataOut_LOOPY(); // dataOut_LOOPY();
sprintf(filePath, "%s/%s", filePath, fileName); sprintf(filePath, "%s/%s", filePath, fileName);
println_Msg(F("Writing...")); //println_Msg(F("Writing..."));
char str[16];
sprintf(str, "Writing %ld bytes to", sramSize);
println_Msg(str);
println_Msg(filePath); println_Msg(filePath);
display_Update(); display_Update();
digitalWrite(LOOPY_ROMCE, HIGH);
digitalWrite(LOOPY_RAMCS1, LOW);
digitalWrite(LOOPY_RESET, HIGH);
digitalWrite(LOOPY_OE, LOW);
if (myFile.open(filePath, O_READ)) { if (myFile.open(filePath, O_READ)) {
for (unsigned long currByte = 0; currByte < sramSize; currByte++) { for (unsigned long currByte = 0; currByte < sramSize; currByte++) {
writeByte_LOOPY(currByte, (myFile.read())); writeByte_LOOPY(currByte, myFile.read());
if (currByte % 512 == 0) {
blinkLED();
}
} }
myFile.close(); myFile.close();
print_STR(done_STR, 1); print_STR(done_STR, 1);
display_Update(); display_Update();
} else { } else {
print_FatalError(sd_error_STR); print_FatalError(sd_error_STR);
} }
digitalWrite(LOOPY_RAMCS1, HIGH);
digitalWrite(LOOPY_OE, HIGH);
dataIn_LOOPY(); dataIn_LOOPY();
} }
@ -581,14 +599,22 @@ void readSRAM_LOOPY() {
print_FatalError(sd_error_STR); print_FatalError(sd_error_STR);
} }
digitalWrite(LOOPY_ROMCE, HIGH);
digitalWrite(LOOPY_RAMCS1, LOW);
digitalWrite(LOOPY_OE, LOW);
const size_t sdBufferSize = 512; const size_t sdBufferSize = 512;
for (unsigned long ptr = 0; ptr < sramSize;) { for (unsigned long ptr = 0; ptr < sramSize;) {
sdBuffer[ptr++ % sdBufferSize] = readByte_LOOPY(ptr); sdBuffer[ptr++ % sdBufferSize] = readByte_LOOPY(ptr);
if (ptr % sdBufferSize == 0) { if (ptr % sdBufferSize == 0) {
myFile.write(sdBuffer, sdBufferSize); myFile.write(sdBuffer, sdBufferSize);
blinkLED();
} }
} }
digitalWrite(LOOPY_OE, HIGH);
digitalWrite(LOOPY_RAMCS1, HIGH);
myFile.close(); myFile.close();
print_Msg(F("Saved to ")); print_Msg(F("Saved to "));
print_Msg(folder); print_Msg(folder);
@ -600,6 +626,10 @@ unsigned long verifySRAM_LOOPY() {
dataIn_LOOPY(); dataIn_LOOPY();
writeErrors = 0; writeErrors = 0;
digitalWrite(LOOPY_ROMCE, HIGH);
digitalWrite(LOOPY_RAMCS1, LOW);
digitalWrite(LOOPY_OE, LOW);
if (myFile.open(filePath, O_READ)) { if (myFile.open(filePath, O_READ)) {
for (unsigned long currBuffer = 0; currBuffer < sramSize; currBuffer += 512) { for (unsigned long currBuffer = 0; currBuffer < sramSize; currBuffer += 512) {
for (int currByte = 0; currByte < 512; currByte++) { for (int currByte = 0; currByte < 512; currByte++) {
@ -617,6 +647,9 @@ unsigned long verifySRAM_LOOPY() {
print_FatalError(sd_error_STR); print_FatalError(sd_error_STR);
} }
digitalWrite(LOOPY_OE, HIGH);
digitalWrite(LOOPY_RAMCS1, HIGH);
return writeErrors; return writeErrors;
} }
#endif #endif