From b57470510dc7056882165e45b2e507b82678b54e Mon Sep 17 00:00:00 2001 From: splash5 <2173030+splash5@users.noreply.github.com> Date: Sat, 10 Dec 2022 12:29:46 +0800 Subject: [PATCH 1/3] Add support for SUPER A'CAN --- Cart_Reader/Cart_Reader.ino | 18 +- Cart_Reader/SUPRACAN.ino | 562 ++++++++++++++++++++++++++++++++++++ 2 files changed, 578 insertions(+), 2 deletions(-) create mode 100644 Cart_Reader/SUPRACAN.ino diff --git a/Cart_Reader/Cart_Reader.ino b/Cart_Reader/Cart_Reader.ino index a9a1c41..b57cf1a 100644 --- a/Cart_Reader/Cart_Reader.ino +++ b/Cart_Reader/Cart_Reader.ino @@ -146,6 +146,9 @@ char ver[5] = "12.3"; // WonderSwan //#define enable_WS +// Super A'can +#define enable_SUPRACAN + //****************************************** // HW CONFIGS //****************************************** @@ -409,6 +412,8 @@ void print_STR(byte string_number, boolean newline) { #define mode_ARC 30 #define mode_FAIRCHILD 31 +#define mode_SUPRACAN 99 + // optimization-safe nop delay #define NOP __asm__ __volatile__("nop\n\t") @@ -1002,8 +1007,9 @@ static const char modeItem16[] PROGMEM = "Magnavox Odyssey 2"; static const char modeItem17[] PROGMEM = "Arcadia 2001"; static const char modeItem18[] PROGMEM = "Fairchild Channel F"; static const char modeItem19[] PROGMEM = "Flashrom Programmer"; +static const char modeItem99[] PROGMEM = "Super A'can"; static const char modeItem20[] PROGMEM = "About"; -static const char* const modeOptions[] PROGMEM = { modeItem1, modeItem2, modeItem3, modeItem4, modeItem5, modeItem6, modeItem7, modeItem8, modeItem9, modeItem10, modeItem11, modeItem12, modeItem13, modeItem14, modeItem15, modeItem16, modeItem17, modeItem18, modeItem19, modeItem20 }; +static const char* const modeOptions[] PROGMEM = { modeItem1, modeItem2, modeItem3, modeItem4, modeItem5, modeItem6, modeItem7, modeItem8, modeItem9, modeItem10, modeItem11, modeItem12, modeItem13, modeItem14, modeItem15, modeItem16, modeItem17, modeItem18, modeItem99, modeItem19, modeItem20 }; // All included slots void mainMenu() { @@ -1171,6 +1177,11 @@ void mainMenu() { case 17: setup_FAIRCHILD(); fairchildMenu(); + +#ifdef enable_SUPRACAN + case 99: + setup_SuprAcan(); + mode = mode_SUPRACAN; break; #endif @@ -1236,6 +1247,10 @@ static const char consoles80Item3[] PROGMEM = "SMS/GG/MIII/SG-1000"; //static const char consoles80Item4[] PROGMEM = "Reset"; (stored in common strings array) static const char* const consoles80Options[] PROGMEM = { consoles80Item1, consoles80Item2, consoles80Item3, string_reset2 }; +// 90s Consoles submenu +static const char consoles90Item1[] PROGMEM = "Super A'can"; +static const char* const consoles90Options[] PROGMEM = { consoles90Item1, string_reset2 }; + // Handhelds submenu static const char handheldsItem1[] PROGMEM = "Virtual Boy"; static const char handheldsItem2[] PROGMEM = "WonderSwan"; @@ -1347,7 +1362,6 @@ void consoles70Menu() { // Copy menuOptions out of progmem convertPgm(consoles70Options, 7); consoles70Menu = question_box(F("Choose Adapter"), menuOptions, 7, 0); - // wait for user choice to come back from the question box menu switch (consoles70Menu) { #ifdef enable_ATARI diff --git a/Cart_Reader/SUPRACAN.ino b/Cart_Reader/SUPRACAN.ino new file mode 100644 index 0000000..4cc8a8d --- /dev/null +++ b/Cart_Reader/SUPRACAN.ino @@ -0,0 +1,562 @@ +//****************************************** +// Super A'can MODULE +//****************************************** +#ifdef enable_SUPRACAN + +/****************************************** + Menu +*****************************************/ +static const char acanMenuItem1[] PROGMEM = "Read Rom"; +static const char acanMenuItem2[] PROGMEM = "Read Save"; +static const char acanMenuItem3[] PROGMEM = "Write Save"; +static const char acanMenuItem4[] PROGMEM = "Read UM6650"; +static const char acanMenuItem5[] PROGMEM = "Write UM6650"; + +static const char* const menuOptionsAcan[] PROGMEM = {acanMenuItem1, acanMenuItem2, acanMenuItem3, acanMenuItem4, acanMenuItem5, string_reset2}; + +void setup_SuprAcan() +{ + // addr as output + DDRF = 0xff; // A0 - A7 + DDRK = 0xff; // A8 - A15 + DDRL = 0xff; // A16 - A23 + + // data as input + DDRC = 0xff; + DDRA = 0xff; + PORTC = 0x00; // disable internal pull-up + PORTA = 0x00; + DDRC = 0x00; // D0 - D7 + DDRA = 0x00; // D8 - D15 + + // set /RST(PH0), /CS(PH3), C27(PH4), R/W(PH5), /AS(PH6) output + DDRH |= ((1 << 0) | (1 << 3) | (1 << 4) | (1 << 5) | (1 << 6)); + PORTH |= ((1 << 3) | (1 << 5) | (1 << 6)); + PORTH &= ~((1 << 0) | (1 << 4)); + + // set /CARTIN(PG5) input + DDRG &= ~(1 << 5); + // set 6619_124(PE4) input + DDRE &= ~(1 << 4); + + display_Clear(); + initializeClockOffset(); + + // clockgen + if (i2c_found) + { + clockgen.set_freq(1073863500ULL, SI5351_CLK1); // cpu + clockgen.set_freq(357954500ULL, SI5351_CLK2); // subcarrier + clockgen.set_freq(5369317500ULL, SI5351_CLK0); // master clock + + clockgen.output_enable(SI5351_CLK1, 1); + clockgen.output_enable(SI5351_CLK2, 1); + clockgen.output_enable(SI5351_CLK0, 0); + + // Wait for clock generator + clockgen.update_status(); + delay(500); + } +#ifdef clockgen_installed + else + { + print_FatalError(F("Clock Generator not found")); + } +#endif + + // /RST to 1 + PORTH |= (1 << 0); + + cartSize = checkRomSize_Acan(); + romSize = cartSize >> 17; + mode = mode_SUPRACAN; + + if (cartSize == 0) + print_Error(F("Unable to find rom signature...")); + else + { + print_Msg(F("ROM Size: ")); + print_Msg(romSize); + println_Msg(F(" Mb")); + } + + display_Update(); + wait(); +} + +void suprAcanMenu() +{ + uint8_t mainMenu; + + convertPgm(menuOptionsAcan, 6); + mainMenu = question_box(F("Super A'can Menu"), menuOptions, 6, 0); + + switch (mainMenu) + { + case 0: + { + readROM_Acan(); + break; + } + case 1: + { + readSRAM_Acan(); + break; + } + case 2: + { + writeSRAM_Acan(); + verifySRAM_Acan(); + break; + } + case 3: + { + readUM6650(); + break; + } + case 4: + { + writeUM6650(); + verifyUM6650(); + break; + } + default: + { + resetCart_Acan(); + resetArduino(); + break; + } + } + + println_Msg(F("")); + print_STR(press_button_STR, 1); + display_Update(); + wait(); +} + +static void readROM_Acan() +{ + uint32_t crc32 = 0xffffffff; + + EEPROM_readAnything(0, foldern); + snprintf(folder, FILEPATH_LENGTH, "ACAN/ROM/%d", foldern); + + display_Clear(); + print_STR(saving_to_STR, 0); + print_Msg(folder); + println_Msg(F("/...")); + display_Update(); + + sd.mkdir(folder, true); + sd.chdir(folder); + + if (!myFile.open("rom.bin", O_RDWR | O_CREAT)) + print_FatalError(create_file_STR); + + foldern++; + EEPROM_writeAnything(0, foldern); + + draw_progressbar(0, cartSize); + + dataIn_MD(); + for (uint32_t addr = 0; addr < cartSize; addr += 512, draw_progressbar(addr, cartSize)) + { + for (uint32_t i = 0; i < 512; i += 2) + { + *((uint16_t*)(sdBuffer + i)) = readWord_Acan(addr + i); + UPDATE_CRC(crc32, sdBuffer[i]); + UPDATE_CRC(crc32, sdBuffer[i + 1]); + } + + myFile.write(sdBuffer, 512); + + if ((addr & ((1 << 14) - 1)) == 0) + blinkLED(); + } + + crc32 = ~crc32; + myFile.close(); + + print_Msg(F("CRC32: ")); + print_Msg_PaddedHex32(crc32); + println_Msg(F("")); + print_STR(done_STR, 1); +} + +static void readSRAM_Acan() +{ + // create a new folder for storing rom file + EEPROM_readAnything(0, foldern); + snprintf(folder, FILEPATH_LENGTH, "ACAN/SAVE/%d", foldern); + + display_Clear(); + print_STR(saving_to_STR, 0); + print_Msg(folder); + println_Msg(F("/...")); + display_Update(); + + sd.mkdir(folder, true); + sd.chdir(folder); + + if (!myFile.open("save.bin", O_RDWR | O_CREAT)) + print_FatalError(create_file_STR); + + foldern++; + EEPROM_writeAnything(0, foldern); + + dataIn_MD(); + for (uint32_t i = 0; i < 0x10000; i += 1024) + { + for (uint32_t j = 0; j < 1024; j += 2) + sdBuffer[(j >> 1)] = readWord_Acan(0xec0000 + i + j); + + myFile.write(sdBuffer, 512); + } + + myFile.close(); + print_STR(done_STR, 1); +} + +static void writeSRAM_Acan() +{ + filePath[0] = 0; + sd.chdir("/"); + fileBrowser(F("Select a file")); + snprintf(filePath, FILEPATH_LENGTH, "%s/%s", filePath, fileName); + + display_Clear(); + + if (!myFile.open(filePath, O_READ)) + { + print_Error(F("File doesn't exist")); + return; + } + + print_Msg(F("Writing ")); + print_Msg(filePath); + println_Msg(F("...")); + display_Update(); + + dataOut_MD(); + for (uint32_t i = 0; i < 0x10000 && myFile.available(); i += 1024) + { + myFile.read(sdBuffer, 512); + + for (uint32_t j = 0; j < 1024; j += 2) + writeWord_Acan(0xec0000 + i + j, sdBuffer[(j >> 1)]); + } + + myFile.close(); + + dataIn_MD(); + print_STR(done_STR, 1); +} + +static void verifySRAM_Acan() +{ + print_STR(verifying_STR, 0); + display_Update(); + + if (!myFile.open(filePath, O_READ)) + { + print_Error(F("File doesn't exist")); + return; + } + + uint16_t write_errors = 0; + + dataIn_MD(); + for (uint32_t i = 0; i < 0x10000 && myFile.available(); i += 1024) + { + myFile.read(sdBuffer, 512); + + for (uint32_t j = 0; j < 1024; j += 2) + { + if (readWord_Acan(0xec0000 + i + j) != sdBuffer[(j >> 1)]) + write_errors++; + } + } + + myFile.close(); + + if (write_errors == 0) + { + println_Msg(F("passed")); + } + else + { + println_Msg(F("failed")); + print_Msg(F("Error: ")); + print_Msg(write_errors); + println_Msg(F(" bytes ")); + print_Error(did_not_verify_STR); + } +} + +static void readUM6650() +{ + // create a new folder for storing rom file + EEPROM_readAnything(0, foldern); + snprintf(folder, sizeof(folder), "ACAN/UM6650/%d", foldern); + + display_Clear(); + print_STR(saving_to_STR, 0); + print_Msg(folder); + println_Msg(F("/...")); + display_Update(); + + sd.mkdir(folder, true); + sd.chdir(folder); + + if (!myFile.open("UM6650.bin", O_RDWR | O_CREAT)) + print_FatalError(create_file_STR); + + foldern++; + EEPROM_writeAnything(0, foldern); + + for (uint16_t i = 0; i < 256; i++) + { + dataOut_MD(); + writeWord_Acan(0xeb0d03, i); + + dataIn_MD(); + sdBuffer[i] = readWord_Acan(0xeb0d01); + } + + myFile.write(sdBuffer, 256); + myFile.close(); + + print_STR(done_STR, 1); +} + +static void verifyUM6650() +{ + print_STR(verifying_STR, 0); + display_Update(); + + if (!myFile.open(filePath, O_READ)) + { + print_Error(F("File doesn't exist")); + return; + } + + uint16_t write_errors = 0; + uint16_t len = myFile.read(sdBuffer, 256); + myFile.close(); + + for (uint16_t i = 0; i < len; i++) + { + dataOut_MD(); + writeWord_Acan(0xeb0d03, i); + + dataIn_MD(); + if (readWord_Acan(0xeb0d01) != sdBuffer[i]) + write_errors++; + } + + if (write_errors) + { + println_Msg(F("failed")); + print_Msg(F("Error: ")); + print_Msg(write_errors); + println_Msg(F(" bytes ")); + print_Error(did_not_verify_STR); + } + else + { + println_Msg(F("passed")); + } +} + +static void writeUM6650() +{ + filePath[0] = 0; + sd.chdir("/"); + fileBrowser(F("Select a file")); + snprintf(filePath, FILEPATH_LENGTH, "%s/%s", filePath, fileName); + + display_Clear(); + + if (!myFile.open(filePath, O_READ)) + { + print_Error(F("File doesn't exist")); + return; + } + + uint16_t len = myFile.read(sdBuffer, 256); + myFile.close(); + + print_Msg(F("Writing ")); + print_Msg(filePath); + println_Msg(F("...")); + display_Update(); + + dataOut_MD(); + for (uint16_t i = 0; i < len; i++) + { + writeWord_Acan(0xeb0d03, i); + writeWord_Acan(0xeb0d01, sdBuffer[i]); + + delay(10); // for AT28C64B write + } + + dataIn_MD(); + print_STR(done_STR, 1); +} + +static uint32_t checkRomSize_Acan() +{ + uint32_t addr = 0; + uint32_t crc32; + + do + { + // check if there is rom chip exists + // pull-up enable + DDRC = 0xff; + DDRA = 0xff; + PORTC = 0xff; + PORTA = 0xff; + DDRC = 0x00; + DDRA = 0x00; + *((uint16_t*)sdBuffer) = readWord_Acan(addr); + + // pull-up disable + DDRC = 0xff; + DDRA = 0xff; + PORTC = 0x00; + PORTA = 0x00; + DDRC = 0x00; + DDRA = 0x00; + *((uint16_t*)(sdBuffer + 2)) = readWord_Acan(addr); + + // should be them same if chip exists + if (sdBuffer[0] != sdBuffer[2] || sdBuffer[1] != sdBuffer[3]) + break; + + crc32 = 0xffffffff; + + for (uint32_t i = 0x2000; i < 0x2080; i += 2) + { + *((uint16_t*)sdBuffer) = readWord_Acan(addr + i); + UPDATE_CRC(crc32, sdBuffer[0]); + UPDATE_CRC(crc32, sdBuffer[1]); + } + + crc32 = ~crc32; + + if (crc32 == 0xa2bc9d7a) + { + if (addr > 0) + break; + } + else + { + if (addr == 0) + break; + } + + addr += 0x80000; + + } while (addr < 0x800000); + + return addr; +} + +static void resetCart_Acan() +{ + // set /CS(PH3), R/W(PH5), /AS(PH6) high + // /RST(PH0) and C27(PH4) low + PORTH |= ((1 << 3) | (1 << 5) | (1 << 6)); + PORTH &= ~((1 << 0) | (1 << 4)); + + if (i2c_found) + { + clockgen.output_enable(SI5351_CLK1, 0); // CPU clock + clockgen.output_enable(SI5351_CLK2, 0); // CIC clock + clockgen.output_enable(SI5351_CLK0, 0); // master clock + } +} + +static void writeWord_Acan(uint32_t addr, uint16_t data) +{ + uint8_t *ptr = (uint8_t*)&addr; + + PORTF = *ptr++; + PORTK = *ptr++; + PORTL = *ptr; + + if (*ptr < 0xe0) + { + // ROM area + // /CS(PH3), C27(PH4), R/W(PH5), /AS(PH6) to L + PORTH &= ~((1 << 3) | (1 << 4) | (1 << 5) | (1 << 6)); + } + else if (*ptr == 0xec) + { + // save area + // /CS(PH3) to H, C27(PH4), R/W(PH5), /AS(PH6) to L + PORTH |= (1 << 3); + PORTH &= ~((1 << 4) | (1 << 5) | (1 << 6)); + } + else if (addr == 0x00eb0d03 || addr == 0x00eb0d01) + { + // UM6650 area + // /CS(PH3), C27(PH4) to H, R/W(PH5), /AS(PH6) to L + PORTH |= ((1 << 3) | (1 << 4)); + PORTH &= ~((1 << 5) | (1 << 6)); + } + + ptr = (uint8_t*)&data; + PORTC = *ptr++; + PORTA = *ptr; + + NOP; NOP; NOP; + + PORTH &= ~(1 << 4); + PORTH |= ((1 << 3) | (1 << 5) | (1 << 6)); +} + +static uint16_t readWord_Acan(uint32_t addr) +{ + uint8_t *ptr = (uint8_t*)&addr; + uint16_t data; + + PORTF = *ptr++; + PORTK = *ptr++; + PORTL = *ptr; + + if (*ptr < 0xe0) + { + // ROM area + // /CS(PH3), C27(PH4), /AS(PH6) to L + PORTH &= ~((1 << 3) | (1 << 4) | (1 << 6)); + } + else if (*ptr == 0xec) + { + // save area + // /CS(PH3) to H, C27(PH4), /AS(PH6) to L + PORTH |= (1 << 3); + PORTH &= ~((1 << 4) | (1 << 6)); + } + else if (addr == 0x00eb0d03 || addr == 0x00eb0d01) + { + // UM6650 area + // /CS(PH3), C27(PH4) to H, /AS(PH6) to L + PORTH |= ((1 << 3) | (1 << 4)); + PORTH &= ~(1 << 6); + } + + ptr = (uint8_t*)&data; + NOP; NOP; NOP; + + *ptr++ = PINC; + *ptr = PINA; + + PORTH &= ~(1 << 4); + PORTH |= ((1 << 3) | (1 << 5) | (1 << 6)); + + return data; +} + +#endif From 79f2a2b16a82b602338e18a0988abd982dcbf0e2 Mon Sep 17 00:00:00 2001 From: splash5 <2173030+splash5@users.noreply.github.com> Date: Tue, 24 Jan 2023 16:34:54 +0800 Subject: [PATCH 2/3] Add support for Super A'can flash cart --- Cart_Reader/Cart_Reader.ino | 60 ++++++++++++--- Cart_Reader/SUPRACAN.ino | 142 +++++++++++++++++++++++++++++++++--- 2 files changed, 180 insertions(+), 22 deletions(-) diff --git a/Cart_Reader/Cart_Reader.ino b/Cart_Reader/Cart_Reader.ino index b57cf1a..891656e 100644 --- a/Cart_Reader/Cart_Reader.ino +++ b/Cart_Reader/Cart_Reader.ino @@ -147,7 +147,7 @@ char ver[5] = "12.3"; //#define enable_WS // Super A'can -#define enable_SUPRACAN +// #define enable_SUPRACAN //****************************************** // HW CONFIGS @@ -1007,9 +1007,9 @@ static const char modeItem16[] PROGMEM = "Magnavox Odyssey 2"; static const char modeItem17[] PROGMEM = "Arcadia 2001"; static const char modeItem18[] PROGMEM = "Fairchild Channel F"; static const char modeItem19[] PROGMEM = "Flashrom Programmer"; -static const char modeItem99[] PROGMEM = "Super A'can"; static const char modeItem20[] PROGMEM = "About"; -static const char* const modeOptions[] PROGMEM = { modeItem1, modeItem2, modeItem3, modeItem4, modeItem5, modeItem6, modeItem7, modeItem8, modeItem9, modeItem10, modeItem11, modeItem12, modeItem13, modeItem14, modeItem15, modeItem16, modeItem17, modeItem18, modeItem99, modeItem19, modeItem20 }; +static const char modeItem99[] PROGMEM = "Super A'can"; +static const char* const modeOptions[] PROGMEM = { modeItem1, modeItem2, modeItem3, modeItem4, modeItem5, modeItem6, modeItem7, modeItem8, modeItem9, modeItem10, modeItem11, modeItem12, modeItem13, modeItem14, modeItem15, modeItem16, modeItem17, modeItem18, modeItem19, modeItem20, modeItem99 }; // All included slots void mainMenu() { @@ -1032,7 +1032,7 @@ void mainMenu() { num_answers = 7; } else { // currPage == 3 option_offset = 14; - num_answers = 6; + num_answers = 7; } // Copy menuOptions out of progmem convertPgm(modeOptions + option_offset, num_answers); @@ -1177,11 +1177,6 @@ void mainMenu() { case 17: setup_FAIRCHILD(); fairchildMenu(); - -#ifdef enable_SUPRACAN - case 99: - setup_SuprAcan(); - mode = mode_SUPRACAN; break; #endif @@ -1199,6 +1194,12 @@ void mainMenu() { aboutScreen(); break; +#ifdef enable_SUPRACAN + case 20: + setup_SuprAcan(); + break; +#endif + default: print_MissingModule(); // does not return } @@ -1227,8 +1228,9 @@ static const char addonsItem1[] PROGMEM = "70s Consoles"; static const char addonsItem2[] PROGMEM = "80s Consoles"; static const char addonsItem3[] PROGMEM = "Handhelds"; static const char addonsItem4[] PROGMEM = "Flashrom Programmer"; +static const char addonsItem5[] PROGMEM = "90s Consoles"; //static const char addonsItem5[] PROGMEM = "Reset"; (stored in common strings array) -static const char* const addonsOptions[] PROGMEM = { addonsItem1, addonsItem2, addonsItem3, addonsItem4, string_reset2 }; +static const char* const addonsOptions[] PROGMEM = { addonsItem1, addonsItem2, addonsItem3, addonsItem4, string_reset2, addonsItem5 }; // 70s Consoles submenu static const char consoles70Item1[] PROGMEM = "Atari 2600"; @@ -1316,8 +1318,8 @@ void addonMenu() { // create menu with title and 5 options to choose from unsigned char addonsMenu; // Copy menuOptions out of progmem - convertPgm(addonsOptions, 5); - addonsMenu = question_box(F("Type"), menuOptions, 5, 0); + convertPgm(addonsOptions, 6); + addonsMenu = question_box(F("Type"), menuOptions, 6, 0); // wait for user choice to come back from the question box menu switch (addonsMenu) { @@ -1350,6 +1352,10 @@ void addonMenu() { resetArduino(); break; + case 5: + consoles90Menu(); + break; + default: print_MissingModule(); // does not return } @@ -1460,6 +1466,31 @@ void consoles80Menu() { } } +// Everything that needs an adapter +void consoles90Menu() { + unsigned char consoles90Menu; + // Copy menuOptions out of progmem + convertPgm(consoles90Options, 2); + consoles90Menu = question_box(F("Choose Adapter"), menuOptions, 2, 0); + + // wait for user choice to come back from the question box menu + switch (consoles90Menu) { +#ifdef enable_SUPRACAN + case 0: + setup_SuprAcan(); + break; +#endif + + case 1: + resetArduino(); + break; + + default: + print_MissingModule(); // does not return + break; + } +} + // Everything that needs an adapter void handheldMenu() { // create menu with title and 6 options to choose from @@ -3524,6 +3555,11 @@ void loop() { else if (mode == mode_FAIRCHILD) { fairchildMenu(); } +#endif +#ifdef enable_SUPRACAN + else if (mode == mode_SUPRACAN) { + suprAcanMenu(); + } #endif else { display_Clear(); diff --git a/Cart_Reader/SUPRACAN.ino b/Cart_Reader/SUPRACAN.ino index 4cc8a8d..9173f5a 100644 --- a/Cart_Reader/SUPRACAN.ino +++ b/Cart_Reader/SUPRACAN.ino @@ -11,8 +11,9 @@ static const char acanMenuItem2[] PROGMEM = "Read Save"; static const char acanMenuItem3[] PROGMEM = "Write Save"; static const char acanMenuItem4[] PROGMEM = "Read UM6650"; static const char acanMenuItem5[] PROGMEM = "Write UM6650"; +static const char acanMenuItem6[] PROGMEM = "Flash..."; -static const char* const menuOptionsAcan[] PROGMEM = {acanMenuItem1, acanMenuItem2, acanMenuItem3, acanMenuItem4, acanMenuItem5, string_reset2}; +static const char* const menuOptionsAcan[] PROGMEM = {acanMenuItem1, acanMenuItem2, acanMenuItem3, acanMenuItem4, acanMenuItem5, string_reset2, acanMenuItem6}; void setup_SuprAcan() { @@ -34,11 +35,33 @@ void setup_SuprAcan() PORTH |= ((1 << 3) | (1 << 5) | (1 << 6)); PORTH &= ~((1 << 0) | (1 << 4)); - // set /CARTIN(PG5) input - DDRG &= ~(1 << 5); // set 6619_124(PE4) input DDRE &= ~(1 << 4); + // detect if flash chip exists + PORTG |= (1 << 5); + DDRG |= (1 << 5); + PORTG |= (1 << 5); + + dataOut_MD(); + writeWord_Acan(0xaaaa, 0xaaaa); + writeWord_Acan(0x5555, 0x5555); + writeWord_Acan(0xaaaa, 0x9090); + + dataIn_MD(); + eepbit[0] = readWord_Acan(0x2); + eepbit[1] = readWord_Acan(0x0); + + dataOut_MD(); + writeWord_Acan(0x0, 0xf0f0); + + dataIn_MD(); + // set /CARTIN(PG5) input + PORTG &= ~(1 << 5); + DDRG &= ~(1 << 5); + + *((uint32_t*)(eepbit + 4)) = getFlashChipSize_Acan(*((uint16_t*)eepbit)); + display_Clear(); initializeClockOffset(); @@ -86,10 +109,13 @@ void setup_SuprAcan() void suprAcanMenu() { - uint8_t mainMenu; + uint8_t mainMenu = 6; - convertPgm(menuOptionsAcan, 6); - mainMenu = question_box(F("Super A'can Menu"), menuOptions, 6, 0); + if (*((uint32_t*)(eepbit + 4)) > 0) + mainMenu = 7; + + convertPgm(menuOptionsAcan, mainMenu); + mainMenu = question_box(F("Super A'can Menu"), menuOptions, mainMenu, 0); switch (mainMenu) { @@ -120,6 +146,11 @@ void suprAcanMenu() verifyUM6650(); break; } + case 6: + { + flashCart_Acan(); + break; + } default: { resetCart_Acan(); @@ -139,7 +170,7 @@ static void readROM_Acan() uint32_t crc32 = 0xffffffff; EEPROM_readAnything(0, foldern); - snprintf(folder, FILEPATH_LENGTH, "ACAN/ROM/%d", foldern); + snprintf(folder, FILEPATH_LENGTH, "/ACAN/ROM/%d", foldern); display_Clear(); print_STR(saving_to_STR, 0); @@ -187,7 +218,7 @@ static void readSRAM_Acan() { // create a new folder for storing rom file EEPROM_readAnything(0, foldern); - snprintf(folder, FILEPATH_LENGTH, "ACAN/SAVE/%d", foldern); + snprintf(folder, FILEPATH_LENGTH, "/ACAN/SAVE/%d", foldern); display_Clear(); print_STR(saving_to_STR, 0); @@ -220,7 +251,7 @@ static void readSRAM_Acan() static void writeSRAM_Acan() { filePath[0] = 0; - sd.chdir("/"); + sd.chdir(); fileBrowser(F("Select a file")); snprintf(filePath, FILEPATH_LENGTH, "%s/%s", filePath, fileName); @@ -297,7 +328,7 @@ static void readUM6650() { // create a new folder for storing rom file EEPROM_readAnything(0, foldern); - snprintf(folder, sizeof(folder), "ACAN/UM6650/%d", foldern); + snprintf(folder, sizeof(folder), "/ACAN/UM6650/%d", foldern); display_Clear(); print_STR(saving_to_STR, 0); @@ -404,6 +435,84 @@ static void writeUM6650() print_STR(done_STR, 1); } +static void flashCart_Acan() +{ + uint32_t *flash_size = (uint32_t*)(eepbit + 4); + + filePath[0] = 0; + sd.chdir(); + fileBrowser(F("Select a file")); + snprintf(filePath, FILEPATH_LENGTH, "%s/%s", filePath, fileName); + + display_Clear(); + + if (!myFile.open(filePath, O_READ)) + { + print_Error(F("File doesn't exist")); + return; + } + + print_Msg(F("Writing ")); + print_Msg(filePath + 1); + println_Msg(F("...")); + display_Update(); + + uint32_t i, j, k, file_length = myFile.fileSize(); + uint16_t data; + + DDRG |= (1 << 5); + PORTG |= (1 << 5); + + draw_progressbar(0, file_length); + + for (i = 0; i < file_length; i += *flash_size) + { + // erase chip + dataOut_MD(); + writeWord_Acan(i + 0xaaaa, 0xaaaa); + writeWord_Acan(i + 0x5555, 0x5555); + writeWord_Acan(i + 0xaaaa, 0x8080); + writeWord_Acan(i + 0xaaaa, 0xaaaa); + writeWord_Acan(i + 0x5555, 0x5555); + writeWord_Acan(i + 0xaaaa, 0x1010); + + dataIn_MD(); + while (readWord_Acan(i) != 0xffff); + + for (j = 0; j < *flash_size; j += 512) + { + myFile.read(sdBuffer, 512); + + for (k = 0; k < 512; k += 2) + { + data = *((uint16_t*)(sdBuffer + k)); + + dataOut_MD(); + writeWord_Acan(i + 0xaaaa, 0xaaaa); + writeWord_Acan(i + 0x5555, 0x5555); + writeWord_Acan(i + 0xaaaa, 0xa0a0); + writeWord_Acan(i + j + k, data); + + dataIn_MD(); + while (readWord_Acan(i + j + k) != data); + } + + draw_progressbar(i + j + k, file_length); + + if ((j & 0xfff) == 0) + blinkLED(); + } + } + + PORTG &= ~(1 << 5); + DDRG &= ~(1 << 5); + + myFile.close(); + + print_STR(done_STR, 1); + display_Update(); +} + static uint32_t checkRomSize_Acan() { uint32_t addr = 0; @@ -559,4 +668,17 @@ static uint16_t readWord_Acan(uint32_t addr) return data; } +static uint32_t getFlashChipSize_Acan(uint16_t chip_id) +{ + // 0x0458 (8M), 0x01ab (4M), 0x01d8 (16M) + switch (chip_id) + { + case 0x01ab: return 524288; + case 0x0458: return 1048576; + case 0x01d8: return 2097152; + } + + return 0; +} + #endif From 7356b5db19e9a3410c9891d7fb4eb06a5adfae59 Mon Sep 17 00:00:00 2001 From: splash5 <2173030+splash5@users.noreply.github.com> Date: Thu, 23 Feb 2023 13:48:11 +0800 Subject: [PATCH 3/3] Rebase code to 12.3 Reformat code --- Cart_Reader/Cart_Reader.ino | 43 +++-- Cart_Reader/SUPRACAN.ino | 333 ++++++++++++++++-------------------- 2 files changed, 169 insertions(+), 207 deletions(-) diff --git a/Cart_Reader/Cart_Reader.ino b/Cart_Reader/Cart_Reader.ino index 891656e..0ef9c2f 100644 --- a/Cart_Reader/Cart_Reader.ino +++ b/Cart_Reader/Cart_Reader.ino @@ -147,7 +147,7 @@ char ver[5] = "12.3"; //#define enable_WS // Super A'can -// #define enable_SUPRACAN +//#define enable_SUPRACAN //****************************************** // HW CONFIGS @@ -411,8 +411,7 @@ void print_STR(byte string_number, boolean newline) { #define mode_ODY2 29 #define mode_ARC 30 #define mode_FAIRCHILD 31 - -#define mode_SUPRACAN 99 +#define mode_SUPRACAN 32 // optimization-safe nop delay #define NOP __asm__ __volatile__("nop\n\t") @@ -1007,9 +1006,9 @@ static const char modeItem16[] PROGMEM = "Magnavox Odyssey 2"; static const char modeItem17[] PROGMEM = "Arcadia 2001"; static const char modeItem18[] PROGMEM = "Fairchild Channel F"; static const char modeItem19[] PROGMEM = "Flashrom Programmer"; -static const char modeItem20[] PROGMEM = "About"; -static const char modeItem99[] PROGMEM = "Super A'can"; -static const char* const modeOptions[] PROGMEM = { modeItem1, modeItem2, modeItem3, modeItem4, modeItem5, modeItem6, modeItem7, modeItem8, modeItem9, modeItem10, modeItem11, modeItem12, modeItem13, modeItem14, modeItem15, modeItem16, modeItem17, modeItem18, modeItem19, modeItem20, modeItem99 }; +static const char modeItem20[] PROGMEM = "Super A'can"; +static const char modeItem21[] PROGMEM = "About"; +static const char* const modeOptions[] PROGMEM = { modeItem1, modeItem2, modeItem3, modeItem4, modeItem5, modeItem6, modeItem7, modeItem8, modeItem9, modeItem10, modeItem11, modeItem12, modeItem13, modeItem14, modeItem15, modeItem16, modeItem17, modeItem18, modeItem19, modeItem20, modeItem21 }; // All included slots void mainMenu() { @@ -1190,16 +1189,16 @@ void mainMenu() { break; #endif - case 19: - aboutScreen(); - break; - #ifdef enable_SUPRACAN - case 20: + case 19: setup_SuprAcan(); break; #endif + case 20: + aboutScreen(); + break; + default: print_MissingModule(); // does not return } @@ -1226,11 +1225,11 @@ static const char* const modeOptions[] PROGMEM = { modeItem1, modeItem2, modeIte // Add-ons submenu static const char addonsItem1[] PROGMEM = "70s Consoles"; static const char addonsItem2[] PROGMEM = "80s Consoles"; -static const char addonsItem3[] PROGMEM = "Handhelds"; -static const char addonsItem4[] PROGMEM = "Flashrom Programmer"; -static const char addonsItem5[] PROGMEM = "90s Consoles"; +static const char addonsItem3[] PROGMEM = "90s Consoles"; +static const char addonsItem4[] PROGMEM = "Handhelds"; +static const char addonsItem5[] PROGMEM = "Flashrom Programmer"; //static const char addonsItem5[] PROGMEM = "Reset"; (stored in common strings array) -static const char* const addonsOptions[] PROGMEM = { addonsItem1, addonsItem2, addonsItem3, addonsItem4, string_reset2, addonsItem5 }; +static const char* const addonsOptions[] PROGMEM = { addonsItem1, addonsItem2, addonsItem3, addonsItem4, addonsItem5, string_reset2 }; // 70s Consoles submenu static const char consoles70Item1[] PROGMEM = "Atari 2600"; @@ -1333,13 +1332,17 @@ void addonMenu() { consoles80Menu(); break; - // Handhelds case 2: + consoles90Menu(); + break; + + // Handhelds + case 3: handheldMenu(); break; #ifdef enable_FLASH - case 3: + case 4: #ifdef enable_FLASH16 flashMenu(); #else @@ -1348,12 +1351,8 @@ void addonMenu() { break; #endif - case 4: - resetArduino(); - break; - case 5: - consoles90Menu(); + resetArduino(); break; default: diff --git a/Cart_Reader/SUPRACAN.ino b/Cart_Reader/SUPRACAN.ino index 9173f5a..329705d 100644 --- a/Cart_Reader/SUPRACAN.ino +++ b/Cart_Reader/SUPRACAN.ino @@ -1,5 +1,6 @@ //****************************************** // Super A'can MODULE +// Only tested with HW3 and HW5 //****************************************** #ifdef enable_SUPRACAN @@ -11,12 +12,13 @@ static const char acanMenuItem2[] PROGMEM = "Read Save"; static const char acanMenuItem3[] PROGMEM = "Write Save"; static const char acanMenuItem4[] PROGMEM = "Read UM6650"; static const char acanMenuItem5[] PROGMEM = "Write UM6650"; -static const char acanMenuItem6[] PROGMEM = "Flash..."; +static const char acanMenuItem6[] PROGMEM = "Flash repro"; -static const char* const menuOptionsAcan[] PROGMEM = {acanMenuItem1, acanMenuItem2, acanMenuItem3, acanMenuItem4, acanMenuItem5, string_reset2, acanMenuItem6}; +static const char *const menuOptionsAcan[] PROGMEM = { acanMenuItem1, acanMenuItem2, acanMenuItem3, acanMenuItem4, acanMenuItem5, string_reset2, acanMenuItem6 }; + +void setup_SuprAcan() { + vselect(false); -void setup_SuprAcan() -{ // addr as output DDRF = 0xff; // A0 - A7 DDRK = 0xff; // A8 - A15 @@ -25,7 +27,7 @@ void setup_SuprAcan() // data as input DDRC = 0xff; DDRA = 0xff; - PORTC = 0x00; // disable internal pull-up + PORTC = 0x00; // disable internal pull-up PORTA = 0x00; DDRC = 0x00; // D0 - D7 DDRA = 0x00; // D8 - D15 @@ -42,7 +44,7 @@ void setup_SuprAcan() PORTG |= (1 << 5); DDRG |= (1 << 5); PORTG |= (1 << 5); - + dataOut_MD(); writeWord_Acan(0xaaaa, 0xaaaa); writeWord_Acan(0x5555, 0x5555); @@ -60,17 +62,16 @@ void setup_SuprAcan() PORTG &= ~(1 << 5); DDRG &= ~(1 << 5); - *((uint32_t*)(eepbit + 4)) = getFlashChipSize_Acan(*((uint16_t*)eepbit)); + *((uint32_t *)(eepbit + 4)) = getFlashChipSize_Acan(*((uint16_t *)eepbit)); display_Clear(); initializeClockOffset(); // clockgen - if (i2c_found) - { - clockgen.set_freq(1073863500ULL, SI5351_CLK1); // cpu - clockgen.set_freq(357954500ULL, SI5351_CLK2); // subcarrier - clockgen.set_freq(5369317500ULL, SI5351_CLK0); // master clock + if (i2c_found) { + clockgen.set_freq(1073863500ULL, SI5351_CLK1); // cpu + clockgen.set_freq(357954500ULL, SI5351_CLK2); // subcarrier + clockgen.set_freq(5369317500ULL, SI5351_CLK0); // master clock clockgen.output_enable(SI5351_CLK1, 1); clockgen.output_enable(SI5351_CLK2, 1); @@ -81,82 +82,63 @@ void setup_SuprAcan() delay(500); } #ifdef clockgen_installed - else - { + else { print_FatalError(F("Clock Generator not found")); } #endif - // /RST to 1 - PORTH |= (1 << 0); - - cartSize = checkRomSize_Acan(); - romSize = cartSize >> 17; - mode = mode_SUPRACAN; - - if (cartSize == 0) - print_Error(F("Unable to find rom signature...")); - else - { - print_Msg(F("ROM Size: ")); - print_Msg(romSize); - println_Msg(F(" Mb")); - } - - display_Update(); + checkRomExist_Acan(); wait(); } -void suprAcanMenu() -{ +void suprAcanMenu() { uint8_t mainMenu = 6; - if (*((uint32_t*)(eepbit + 4)) > 0) + if (*((uint32_t *)(eepbit + 4)) > 0) mainMenu = 7; convertPgm(menuOptionsAcan, mainMenu); mainMenu = question_box(F("Super A'can Menu"), menuOptions, mainMenu, 0); - switch (mainMenu) - { + switch (mainMenu) { case 0: - { - readROM_Acan(); - break; - } + { + readROM_Acan(); + break; + } case 1: - { - readSRAM_Acan(); - break; - } + { + readSRAM_Acan(); + break; + } case 2: - { - writeSRAM_Acan(); - verifySRAM_Acan(); - break; - } + { + writeSRAM_Acan(); + verifySRAM_Acan(); + break; + } case 3: - { - readUM6650(); - break; - } + { + readUM6650(); + break; + } case 4: - { - writeUM6650(); - verifyUM6650(); - break; - } + { + writeUM6650(); + verifyUM6650(); + break; + } case 6: - { - flashCart_Acan(); - break; - } + { + flashCart_Acan(); + break; + } default: - { - resetCart_Acan(); - resetArduino(); - break; - } + { + resetCart_Acan(); + resetArduino(); + break; + } } println_Msg(F("")); @@ -165,8 +147,7 @@ void suprAcanMenu() wait(); } -static void readROM_Acan() -{ +static void readROM_Acan() { uint32_t crc32 = 0xffffffff; EEPROM_readAnything(0, foldern); @@ -190,11 +171,9 @@ static void readROM_Acan() draw_progressbar(0, cartSize); dataIn_MD(); - for (uint32_t addr = 0; addr < cartSize; addr += 512, draw_progressbar(addr, cartSize)) - { - for (uint32_t i = 0; i < 512; i += 2) - { - *((uint16_t*)(sdBuffer + i)) = readWord_Acan(addr + i); + for (uint32_t addr = 0; addr < cartSize; addr += 512, draw_progressbar(addr, cartSize)) { + for (uint32_t i = 0; i < 512; i += 2) { + *((uint16_t *)(sdBuffer + i)) = readWord_Acan(addr + i); UPDATE_CRC(crc32, sdBuffer[i]); UPDATE_CRC(crc32, sdBuffer[i + 1]); } @@ -214,8 +193,7 @@ static void readROM_Acan() print_STR(done_STR, 1); } -static void readSRAM_Acan() -{ +static void readSRAM_Acan() { // create a new folder for storing rom file EEPROM_readAnything(0, foldern); snprintf(folder, FILEPATH_LENGTH, "/ACAN/SAVE/%d", foldern); @@ -236,8 +214,7 @@ static void readSRAM_Acan() EEPROM_writeAnything(0, foldern); dataIn_MD(); - for (uint32_t i = 0; i < 0x10000; i += 1024) - { + for (uint32_t i = 0; i < 0x10000; i += 1024) { for (uint32_t j = 0; j < 1024; j += 2) sdBuffer[(j >> 1)] = readWord_Acan(0xec0000 + i + j); @@ -248,8 +225,7 @@ static void readSRAM_Acan() print_STR(done_STR, 1); } -static void writeSRAM_Acan() -{ +static void writeSRAM_Acan() { filePath[0] = 0; sd.chdir(); fileBrowser(F("Select a file")); @@ -257,8 +233,7 @@ static void writeSRAM_Acan() display_Clear(); - if (!myFile.open(filePath, O_READ)) - { + if (!myFile.open(filePath, O_READ)) { print_Error(F("File doesn't exist")); return; } @@ -269,8 +244,7 @@ static void writeSRAM_Acan() display_Update(); dataOut_MD(); - for (uint32_t i = 0; i < 0x10000 && myFile.available(); i += 1024) - { + for (uint32_t i = 0; i < 0x10000 && myFile.available(); i += 1024) { myFile.read(sdBuffer, 512); for (uint32_t j = 0; j < 1024; j += 2) @@ -283,13 +257,11 @@ static void writeSRAM_Acan() print_STR(done_STR, 1); } -static void verifySRAM_Acan() -{ +static void verifySRAM_Acan() { print_STR(verifying_STR, 0); display_Update(); - if (!myFile.open(filePath, O_READ)) - { + if (!myFile.open(filePath, O_READ)) { print_Error(F("File doesn't exist")); return; } @@ -297,12 +269,10 @@ static void verifySRAM_Acan() uint16_t write_errors = 0; dataIn_MD(); - for (uint32_t i = 0; i < 0x10000 && myFile.available(); i += 1024) - { + for (uint32_t i = 0; i < 0x10000 && myFile.available(); i += 1024) { myFile.read(sdBuffer, 512); - for (uint32_t j = 0; j < 1024; j += 2) - { + for (uint32_t j = 0; j < 1024; j += 2) { if (readWord_Acan(0xec0000 + i + j) != sdBuffer[(j >> 1)]) write_errors++; } @@ -310,12 +280,9 @@ static void verifySRAM_Acan() myFile.close(); - if (write_errors == 0) - { + if (write_errors == 0) { println_Msg(F("passed")); - } - else - { + } else { println_Msg(F("failed")); print_Msg(F("Error: ")); print_Msg(write_errors); @@ -324,8 +291,7 @@ static void verifySRAM_Acan() } } -static void readUM6650() -{ +static void readUM6650() { // create a new folder for storing rom file EEPROM_readAnything(0, foldern); snprintf(folder, sizeof(folder), "/ACAN/UM6650/%d", foldern); @@ -345,8 +311,7 @@ static void readUM6650() foldern++; EEPROM_writeAnything(0, foldern); - for (uint16_t i = 0; i < 256; i++) - { + for (uint16_t i = 0; i < 256; i++) { dataOut_MD(); writeWord_Acan(0xeb0d03, i); @@ -360,13 +325,11 @@ static void readUM6650() print_STR(done_STR, 1); } -static void verifyUM6650() -{ +static void verifyUM6650() { print_STR(verifying_STR, 0); display_Update(); - if (!myFile.open(filePath, O_READ)) - { + if (!myFile.open(filePath, O_READ)) { print_Error(F("File doesn't exist")); return; } @@ -375,8 +338,7 @@ static void verifyUM6650() uint16_t len = myFile.read(sdBuffer, 256); myFile.close(); - for (uint16_t i = 0; i < len; i++) - { + for (uint16_t i = 0; i < len; i++) { dataOut_MD(); writeWord_Acan(0xeb0d03, i); @@ -385,22 +347,18 @@ static void verifyUM6650() write_errors++; } - if (write_errors) - { + if (write_errors) { println_Msg(F("failed")); print_Msg(F("Error: ")); print_Msg(write_errors); println_Msg(F(" bytes ")); print_Error(did_not_verify_STR); - } - else - { + } else { println_Msg(F("passed")); } } -static void writeUM6650() -{ +static void writeUM6650() { filePath[0] = 0; sd.chdir("/"); fileBrowser(F("Select a file")); @@ -408,8 +366,7 @@ static void writeUM6650() display_Clear(); - if (!myFile.open(filePath, O_READ)) - { + if (!myFile.open(filePath, O_READ)) { print_Error(F("File doesn't exist")); return; } @@ -423,8 +380,7 @@ static void writeUM6650() display_Update(); dataOut_MD(); - for (uint16_t i = 0; i < len; i++) - { + for (uint16_t i = 0; i < len; i++) { writeWord_Acan(0xeb0d03, i); writeWord_Acan(0xeb0d01, sdBuffer[i]); @@ -435,9 +391,8 @@ static void writeUM6650() print_STR(done_STR, 1); } -static void flashCart_Acan() -{ - uint32_t *flash_size = (uint32_t*)(eepbit + 4); +static void flashCart_Acan() { + uint32_t *flash_size = (uint32_t *)(eepbit + 4); filePath[0] = 0; sd.chdir(); @@ -446,8 +401,7 @@ static void flashCart_Acan() display_Clear(); - if (!myFile.open(filePath, O_READ)) - { + if (!myFile.open(filePath, O_READ)) { print_Error(F("File doesn't exist")); return; } @@ -465,8 +419,7 @@ static void flashCart_Acan() draw_progressbar(0, file_length); - for (i = 0; i < file_length; i += *flash_size) - { + for (i = 0; i < file_length; i += *flash_size) { // erase chip dataOut_MD(); writeWord_Acan(i + 0xaaaa, 0xaaaa); @@ -477,15 +430,14 @@ static void flashCart_Acan() writeWord_Acan(i + 0xaaaa, 0x1010); dataIn_MD(); - while (readWord_Acan(i) != 0xffff); + while (readWord_Acan(i) != 0xffff) + ; - for (j = 0; j < *flash_size; j += 512) - { + for (j = 0; j < *flash_size; j += 512) { myFile.read(sdBuffer, 512); - - for (k = 0; k < 512; k += 2) - { - data = *((uint16_t*)(sdBuffer + k)); + + for (k = 0; k < 512; k += 2) { + data = *((uint16_t *)(sdBuffer + k)); dataOut_MD(); writeWord_Acan(i + 0xaaaa, 0xaaaa); @@ -494,7 +446,8 @@ static void flashCart_Acan() writeWord_Acan(i + j + k, data); dataIn_MD(); - while (readWord_Acan(i + j + k) != data); + while (readWord_Acan(i + j + k) != data) + ; } draw_progressbar(i + j + k, file_length); @@ -508,18 +461,44 @@ static void flashCart_Acan() DDRG &= ~(1 << 5); myFile.close(); - print_STR(done_STR, 1); + + checkRomExist_Acan(); +} + +static void checkRomExist_Acan() { + // RST to 0 + PORTH &= ~(1 << 0); + NOP; + NOP; + NOP; + NOP; + NOP; + NOP; + + // /RST to 1 + PORTH |= (1 << 0); + + cartSize = getRomSize_Acan(); + romSize = cartSize >> 17; + mode = mode_SUPRACAN; + + if (cartSize == 0) + print_Error(F("Unable to find rom signature...")); + else { + print_Msg(F("ROM Size: ")); + print_Msg(romSize); + println_Msg(F(" Mb")); + } + display_Update(); } -static uint32_t checkRomSize_Acan() -{ +static uint32_t getRomSize_Acan() { uint32_t addr = 0; uint32_t crc32; - do - { + do { // check if there is rom chip exists // pull-up enable DDRC = 0xff; @@ -528,7 +507,7 @@ static uint32_t checkRomSize_Acan() PORTA = 0xff; DDRC = 0x00; DDRA = 0x00; - *((uint16_t*)sdBuffer) = readWord_Acan(addr); + *((uint16_t *)sdBuffer) = readWord_Acan(addr); // pull-up disable DDRC = 0xff; @@ -537,7 +516,7 @@ static uint32_t checkRomSize_Acan() PORTA = 0x00; DDRC = 0x00; DDRA = 0x00; - *((uint16_t*)(sdBuffer + 2)) = readWord_Acan(addr); + *((uint16_t *)(sdBuffer + 2)) = readWord_Acan(addr); // should be them same if chip exists if (sdBuffer[0] != sdBuffer[2] || sdBuffer[1] != sdBuffer[3]) @@ -545,22 +524,18 @@ static uint32_t checkRomSize_Acan() crc32 = 0xffffffff; - for (uint32_t i = 0x2000; i < 0x2080; i += 2) - { - *((uint16_t*)sdBuffer) = readWord_Acan(addr + i); + for (uint32_t i = 0x2000; i < 0x2080; i += 2) { + *((uint16_t *)sdBuffer) = readWord_Acan(addr + i); UPDATE_CRC(crc32, sdBuffer[0]); UPDATE_CRC(crc32, sdBuffer[1]); } crc32 = ~crc32; - if (crc32 == 0xa2bc9d7a) - { + if (crc32 == 0xa2bc9d7a) { if (addr > 0) break; - } - else - { + } else { if (addr == 0) break; } @@ -572,92 +547,82 @@ static uint32_t checkRomSize_Acan() return addr; } -static void resetCart_Acan() -{ +static void resetCart_Acan() { // set /CS(PH3), R/W(PH5), /AS(PH6) high // /RST(PH0) and C27(PH4) low PORTH |= ((1 << 3) | (1 << 5) | (1 << 6)); PORTH &= ~((1 << 0) | (1 << 4)); - if (i2c_found) - { - clockgen.output_enable(SI5351_CLK1, 0); // CPU clock - clockgen.output_enable(SI5351_CLK2, 0); // CIC clock - clockgen.output_enable(SI5351_CLK0, 0); // master clock + if (i2c_found) { + clockgen.output_enable(SI5351_CLK1, 0); // CPU clock + clockgen.output_enable(SI5351_CLK2, 0); // CIC clock + clockgen.output_enable(SI5351_CLK0, 0); // master clock } } -static void writeWord_Acan(uint32_t addr, uint16_t data) -{ - uint8_t *ptr = (uint8_t*)&addr; +static void writeWord_Acan(uint32_t addr, uint16_t data) { + uint8_t *ptr = (uint8_t *)&addr; PORTF = *ptr++; PORTK = *ptr++; PORTL = *ptr; - if (*ptr < 0xe0) - { + if (*ptr < 0xe0) { // ROM area // /CS(PH3), C27(PH4), R/W(PH5), /AS(PH6) to L PORTH &= ~((1 << 3) | (1 << 4) | (1 << 5) | (1 << 6)); - } - else if (*ptr == 0xec) - { + } else if (*ptr == 0xec) { // save area // /CS(PH3) to H, C27(PH4), R/W(PH5), /AS(PH6) to L PORTH |= (1 << 3); PORTH &= ~((1 << 4) | (1 << 5) | (1 << 6)); - } - else if (addr == 0x00eb0d03 || addr == 0x00eb0d01) - { + } else if (addr == 0x00eb0d03 || addr == 0x00eb0d01) { // UM6650 area // /CS(PH3), C27(PH4) to H, R/W(PH5), /AS(PH6) to L PORTH |= ((1 << 3) | (1 << 4)); PORTH &= ~((1 << 5) | (1 << 6)); } - ptr = (uint8_t*)&data; + ptr = (uint8_t *)&data; PORTC = *ptr++; PORTA = *ptr; - NOP; NOP; NOP; + NOP; + NOP; + NOP; PORTH &= ~(1 << 4); PORTH |= ((1 << 3) | (1 << 5) | (1 << 6)); } -static uint16_t readWord_Acan(uint32_t addr) -{ - uint8_t *ptr = (uint8_t*)&addr; +static uint16_t readWord_Acan(uint32_t addr) { + uint8_t *ptr = (uint8_t *)&addr; uint16_t data; PORTF = *ptr++; PORTK = *ptr++; PORTL = *ptr; - if (*ptr < 0xe0) - { + if (*ptr < 0xe0) { // ROM area // /CS(PH3), C27(PH4), /AS(PH6) to L PORTH &= ~((1 << 3) | (1 << 4) | (1 << 6)); - } - else if (*ptr == 0xec) - { + } else if (*ptr == 0xec) { // save area // /CS(PH3) to H, C27(PH4), /AS(PH6) to L PORTH |= (1 << 3); PORTH &= ~((1 << 4) | (1 << 6)); - } - else if (addr == 0x00eb0d03 || addr == 0x00eb0d01) - { + } else if (addr == 0x00eb0d03 || addr == 0x00eb0d01) { // UM6650 area // /CS(PH3), C27(PH4) to H, /AS(PH6) to L PORTH |= ((1 << 3) | (1 << 4)); PORTH &= ~(1 << 6); } - ptr = (uint8_t*)&data; - NOP; NOP; NOP; + ptr = (uint8_t *)&data; + NOP; + NOP; + NOP; *ptr++ = PINC; *ptr = PINA; @@ -668,11 +633,9 @@ static uint16_t readWord_Acan(uint32_t addr) return data; } -static uint32_t getFlashChipSize_Acan(uint16_t chip_id) -{ +static uint32_t getFlashChipSize_Acan(uint16_t chip_id) { // 0x0458 (8M), 0x01ab (4M), 0x01d8 (16M) - switch (chip_id) - { + switch (chip_id) { case 0x01ab: return 524288; case 0x0458: return 1048576; case 0x01d8: return 2097152;