From 44bd31fe503a85f8473d67af0ea991f342329dba Mon Sep 17 00:00:00 2001 From: Zane Kaminski Date: Wed, 16 Aug 2023 05:19:15 -0400 Subject: [PATCH] Now supporting Altera MAX II/V UFM and SPI flash --- bin/GWRAM.dbg.po | Bin 143360 -> 143360 bytes bin/GWRAM.po | Bin 143360 -> 143360 bytes ram2gs.c | 122 +++++++++++++++++++++++++++++++++++++---------- 3 files changed, 97 insertions(+), 25 deletions(-) diff --git a/bin/GWRAM.dbg.po b/bin/GWRAM.dbg.po index f3f8c8c390c24161df0c53ddd2821c82d669e5f2..7d0f5df085db5f16b7adeadd03ea0f989c8bb5f2 100644 GIT binary patch delta 5525 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 Z0a7}$yUTFUy~};@+U}RH?Pg8C{6GG$A+G=c delta 4896 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 (7-i)) & 1)); + ram2gs_cmd(0x36 + ((data >> (7-i)) & 1)); + } +} +static void ram2gs_spi_wren() { + ram2gs_spi_deselect(); + ram2gs_spi_select(); + ram2gs_spi_tx8(0x06); // 0x06 is write enable + ram2gs_spi_deselect(); +} +static void ram2gs_spi_erase() { + ram2gs_spi_wren(); + ram2gs_spi_select(); + ram2gs_spi_tx8(0x20); // 0x20 is sector erase (4 kB) + ram2gs_spi_tx8(0x00); // address[23:16] + ram2gs_spi_tx8(0x10); // address[15:8] + ram2gs_spi_tx8(0x00); // address[7:0] + ram2gs_spi_deselect(); +} +static void ram2gs_spi_set_nvm(char en8meg, char enled) { + ram2gs_spi_erase(); // First erase + spin(33, 8); // Wait for >= 500ms on even the fastest systems. + ram2gs_spi_wren(); + ram2gs_spi_select(); + ram2gs_spi_tx8(0x02); // 0x02 is page (byte) program + ram2gs_spi_tx8(0x00); // address[23:16] + ram2gs_spi_tx8(0x10); // address[15:8] + ram2gs_spi_tx8(0x00); // address[7:0] + // data[7:0] + if (!en8meg && !enled) { ram2gs_spi_tx8(0x7F); } + else if (!en8meg && enled) { ram2gs_spi_tx8(0x3F); } + else if ( en8meg && !enled) { ram2gs_spi_tx8(0xFF); } + else if ( en8meg && enled) { ram2gs_spi_tx8(0xBF); } + ram2gs_spi_deselect(); +} + +static void ram2gs_erase(char typecode) { + switch (typecode) { + case 0x00: ram2gs_max_erase(); break; // Altera MAX II / V + case 0x04: ram2gs_spi_erase(); break; // Lattice MachXO / iCE40 / AGM AG256 + //case 0x08: ram2gs_erase_lcmxo2(); break; // Lattice MachXO2 + } +} +static void ram2gs_set_nvm(char typecode, char en8meg, char enled) { + switch (typecode) { + case 0x00: ram2gs_max_set_nvm(en8meg, enled); break; // Altera MAX II / V + case 0x04: ram2gs_spi_set_nvm(en8meg, enled); break; // Lattice MachXO / iCE40 / AGM AG256 + //case 0x08: ram2gs_set_nvm_lcmxo2(en8meg, enled); break; // Lattice MachXO2 + } } static void menu_led(char enled) { @@ -62,13 +119,11 @@ static void menu_led(char enled) { static void menu() { - uint8_t bankcount = ram2gs_getsize(); + uint8_t bankcount; + clrscr(); // Clear screen + gwcputsxy(5, 1, "-- RAM2GS Capacity Settings --"); - - gotoxy(4, 3); - gwcputs("Current RAM2GS capacity: "); - printf("%d", bankcount * 64); - gwcputs(" kB"); + gwcputsxy(4, 3, "Current RAM2GS capacity: ..."); gwcputsxy(1, 6, "Select desired memory capacity:"); @@ -77,24 +132,40 @@ static void menu() gwcputsxy(1, 18, "Capacity will be saved until power-off."); - gwcputsxy(1, 20, "To remember capacity setting in"); + gwcputsxy(1, 20, "To remember capacity and LED setting in"); gwcputsxy(1, 21, "nonvolatile memory, press Apple+number."); gwcputsxy(1, 23, "Press [Q] to quit without saving."); + + bankcount = ram2gs_getsize(); + gotoxy(29, 3); + printf("%d", bankcount * 64); + gwcputs(" kB"); +} + +static void loading_screen() +{ + clrscr(); // Clear screen + gwcputsxy(8, 1, "Loading RAM2GS settings..."); } int ram2gs_main(void) { - char hasled = 1; - char typecode = 0; - char enled = 0; - char en8meg = 1; - char nvm = 0; - int reset_count = 0; + char hasled = true; + char typecode = false; + char enled = false; + char en8meg = true; + char nvm = false; + int reset_count = false; - if (ram2gs_detect(0 << 2)) { + loading_screen(); + + if (ram2gs_detect(0x00)) { + typecode = 0x00; hasled = !ram2gs_detect(0x04); - typecode = 0x0; + } else if (ram2gs_detect(0x04)) { + typecode = 0x04; + hasled = true; } else { #ifndef SKIP_RAM2GS_DETECT // If no RAM2GS, show an error message and quit @@ -118,11 +189,11 @@ int ram2gs_main(void) clrscr(); return EXIT_SUCCESS; } - case '1': en8meg = 0; ram2gs_set(0, enled); break; - case '2': en8meg = 1; ram2gs_set(1, enled); break; + case '1': en8meg = false; ram2gs_set(en8meg, enled); break; + case '2': en8meg = true; ram2gs_set(en8meg, enled); break; case 'L': { - if (enled == 0) { enled = 1; } - else { enled = 0; } + enled = !enled; + ram2gs_set(en8meg, enled); if (hasled) { menu_led(enled); }; continue; } case 'R': { @@ -133,7 +204,7 @@ int ram2gs_main(void) gwcputsxy(1, 8, "Resetting RAM2GS settings."); gwcputsxy(1, 9, "Do not turn off your Apple."); - ram2gs_erase(); // Erase RAM2GS settings memory + ram2gs_erase(typecode); // Erase RAM2GS settings memory ram2gs_set(1, 0); // Enable 8 megabytes and disable LED // Wait for >= 500ms on even the fastest systems. @@ -142,6 +213,7 @@ int ram2gs_main(void) // Show success message and quit clrscr(); // Clear screen gwcputsxy(1, 8, "RAM2GS settings reset successfully."); + nvm = true; goto end; } continue; @@ -161,7 +233,7 @@ int ram2gs_main(void) gwcputsxy(1, 8, "Saving RAM2GS capacity setting."); gwcputsxy(1, 9, "Do not turn off your Apple."); // Save capacity in nonvolatile memory. - ram2gs_set_nvm(en8meg, enled); + ram2gs_set_nvm(typecode, en8meg, enled); // Wait for >= 500ms on even the fastest systems. spin(33, 8); // Print success message