mirror of
https://github.com/sanni/cartreader.git
synced 2024-12-27 05:21:53 +01:00
Fixes issue with SRAM where writing to shared address port set control pins
This commit is contained in:
parent
1dccf84d9f
commit
7f005e3f0e
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user