mirror of
https://github.com/garrettsworkshop/GWRAM.SYSTEM.git
synced 2025-10-31 11:56:44 -07:00
RC
This commit is contained in:
178
ram2gs.c
178
ram2gs.c
@@ -7,119 +7,10 @@
|
||||
|
||||
#include "util.h"
|
||||
#include "gwconio.h"
|
||||
#include "ram2gs_asm.h"
|
||||
|
||||
static void ram2gs_set(char en8meg, char enled) {
|
||||
char cmd = 0x10;
|
||||
if (en8meg) { cmd |= 0x01; }
|
||||
if (enled) { cmd |= 0x02; }
|
||||
ram2gs_cmd(cmd);
|
||||
}
|
||||
|
||||
static void ram2gs_max_erase() { ram2gs_cmd(0x28); }
|
||||
static void ram2gs_max_set_nvm(char en8meg, char enled) {
|
||||
char i;
|
||||
// Clock in 0 to enable this setting entry
|
||||
ram2gs_cmd(0x20);
|
||||
ram2gs_cmd(0x22);
|
||||
|
||||
if (en8meg) {
|
||||
// Clock in 1 to enable 8mb
|
||||
ram2gs_cmd(0x21);
|
||||
ram2gs_cmd(0x23);
|
||||
} else {
|
||||
// Clock in 0 to disable 8mb
|
||||
ram2gs_cmd(0x20);
|
||||
ram2gs_cmd(0x22);
|
||||
}
|
||||
|
||||
if (enled) {
|
||||
// Clock in 0 to enable LED
|
||||
ram2gs_cmd(0x20);
|
||||
ram2gs_cmd(0x22);
|
||||
} else {
|
||||
// Clock in 1 to disable LED
|
||||
ram2gs_cmd(0x21);
|
||||
ram2gs_cmd(0x23);
|
||||
}
|
||||
|
||||
// Clock in 13 dummy "1"s
|
||||
for (i = 0; i < 13; i++) {
|
||||
ram2gs_cmd(0x21);
|
||||
ram2gs_cmd(0x23);
|
||||
}
|
||||
|
||||
// Program
|
||||
ram2gs_cmd(0x24);
|
||||
}
|
||||
|
||||
static void ram2gs_spi_select() { ram2gs_cmd(0x34); }
|
||||
static void ram2gs_spi_deselect() { ram2gs_cmd(0x30); }
|
||||
static void ram2gs_spi_tx8(char data) {
|
||||
char i;
|
||||
for (i = 0; i < 8; i++) {
|
||||
ram2gs_cmd(0x34 + ((data >> (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) {
|
||||
if (enled) {
|
||||
gwcputsxy(1, 15, "LED enabled. Press [L] to disable LED.");
|
||||
} else {
|
||||
gwcputsxy(1, 15, "LED disabled. Press [L] to enable LED.");
|
||||
}
|
||||
}
|
||||
#include "ram2gs_hal.h"
|
||||
|
||||
static void menu()
|
||||
{
|
||||
uint8_t bankcount;
|
||||
clrscr(); // Clear screen
|
||||
|
||||
gwcputsxy(5, 1, "-- RAM2GS Capacity Settings --");
|
||||
@@ -136,13 +27,19 @@ static void menu()
|
||||
gwcputsxy(1, 21, "nonvolatile memory, press Apple+number.");
|
||||
|
||||
gwcputsxy(1, 23, "Press [Q] to quit without saving.");
|
||||
}
|
||||
|
||||
bankcount = ram2gs_getsize();
|
||||
static void menu_size(uint16_t bankcount) {
|
||||
gotoxy(29, 3);
|
||||
printf("%d", bankcount * 64);
|
||||
gwcputs(" kB");
|
||||
}
|
||||
|
||||
static void menu_led(char enled) {
|
||||
if (enled) { gwcputsxy(1, 15, "LED enabled. Press [L] to disable LED."); }
|
||||
else { gwcputsxy(1, 15, "LED disabled. Press [L] to enable LED."); }
|
||||
}
|
||||
|
||||
static void loading_screen()
|
||||
{
|
||||
clrscr(); // Clear screen
|
||||
@@ -151,35 +48,56 @@ static void loading_screen()
|
||||
|
||||
int ram2gs_main(void)
|
||||
{
|
||||
char hasled = true;
|
||||
char typecode = false;
|
||||
char enled = false;
|
||||
char type;
|
||||
uint16_t bankcount;
|
||||
char en8meg = true;
|
||||
char hasled = true;
|
||||
char enled = false;
|
||||
|
||||
char nvm = false;
|
||||
int reset_count = false;
|
||||
int reset_count = 0;
|
||||
|
||||
loading_screen();
|
||||
|
||||
if (ram2gs_detect(0x00)) {
|
||||
typecode = 0x00;
|
||||
if (ram2gs_detect(0x00)) { // Altera MAX II / V
|
||||
type = 0x00;
|
||||
hasled = !ram2gs_detect(0x04);
|
||||
} else if (ram2gs_detect(0x04)) {
|
||||
typecode = 0x04;
|
||||
} else if (ram2gs_detect(0x04)) { // Lattice MachXO / iCE40 / AGM AG256
|
||||
type = 0x04;
|
||||
hasled = true;
|
||||
} else if (ram2gs_detect(0x08)) { // Lattice MachXO2
|
||||
type = 0x08;
|
||||
hasled = true;
|
||||
} else {
|
||||
#ifndef SKIP_RAM2GS_DETECT
|
||||
// If no RAM2GS, show an error message and quit
|
||||
gwcputsxy(0, 8, " No RAM2GS II detected.");
|
||||
gwcputsxy(0, 8, " No RAM2GS II detected.");
|
||||
gwcputsxy(0, 10, " Press any key to quit.");
|
||||
cgetc(); // Wait for key
|
||||
clrscr(); // Clear screen before quitting
|
||||
return EXIT_SUCCESS;
|
||||
#else
|
||||
hasled = true;
|
||||
#endif
|
||||
}
|
||||
|
||||
if (hasled) { enled = !ram2gs_detect(typecode | 0x02); }
|
||||
// Set chip type
|
||||
ram2gs_hal_set_type(type);
|
||||
|
||||
// Print menu
|
||||
menu();
|
||||
if (hasled) { menu_led(enled); }
|
||||
|
||||
// Detect and print current capacity
|
||||
bankcount = ram2gs_getsize();
|
||||
menu_size(bankcount);
|
||||
|
||||
// Detect and print LED menu
|
||||
#ifndef SKIP_RAM2GS_DETECT
|
||||
if (hasled) {
|
||||
enled = !ram2gs_detect(type | 0x02);
|
||||
menu_led(enled);
|
||||
}
|
||||
#endif
|
||||
|
||||
// Get user choice from menu
|
||||
while (true) {
|
||||
@@ -194,7 +112,15 @@ int ram2gs_main(void)
|
||||
case 'L': {
|
||||
enled = !enled;
|
||||
ram2gs_set(en8meg, enled);
|
||||
if (hasled) { menu_led(enled); };
|
||||
if (hasled) {
|
||||
menu_led(enled);
|
||||
if (enled) {
|
||||
wait(1);
|
||||
ram2gs_flashled(10);
|
||||
wait(10);
|
||||
ram2gs_flashled(10);
|
||||
}
|
||||
};
|
||||
continue;
|
||||
} case 'R': {
|
||||
reset_count++;
|
||||
@@ -204,7 +130,7 @@ int ram2gs_main(void)
|
||||
gwcputsxy(1, 8, "Resetting RAM2GS settings.");
|
||||
gwcputsxy(1, 9, "Do not turn off your Apple.");
|
||||
|
||||
ram2gs_erase(typecode); // Erase RAM2GS settings memory
|
||||
ram2gs_erase(); // Erase RAM2GS settings memory
|
||||
ram2gs_set(1, 0); // Enable 8 megabytes and disable LED
|
||||
|
||||
// Wait for >= 500ms on even the fastest systems.
|
||||
@@ -233,9 +159,11 @@ 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(typecode, en8meg, enled);
|
||||
ram2gs_save_start(en8meg, enled);
|
||||
// Wait for >= 500ms on even the fastest systems.
|
||||
spin(33, 8);
|
||||
// Finish saving
|
||||
ram2gs_save_end(en8meg, enled);
|
||||
// Print success message
|
||||
clrscr(); // Clear screen
|
||||
gwcputsxy(1, 8, "RAM2GS capacity saved successfully.");
|
||||
|
||||
Reference in New Issue
Block a user