Firmware: cleanup ROM loading, minor touchups
This commit is contained in:
parent
0b0ee180df
commit
cfa78624c9
@ -28,6 +28,8 @@
|
|||||||
#define FILETYPES_H
|
#define FILETYPES_H
|
||||||
|
|
||||||
#include "ff.h"
|
#include "ff.h"
|
||||||
|
|
||||||
|
#define SYS_DIR_NAME ((const uint8_t*)"sd2snes")
|
||||||
typedef enum {
|
typedef enum {
|
||||||
TYPE_UNKNOWN = 0, /* 0 */
|
TYPE_UNKNOWN = 0, /* 0 */
|
||||||
TYPE_SMC, /* 1 */
|
TYPE_SMC, /* 1 */
|
||||||
|
|||||||
21
src/main.c
21
src/main.c
@ -115,7 +115,7 @@ printf("PCONP=%lx\n", LPC_SC->PCONP);
|
|||||||
uint8_t card_go = 0;
|
uint8_t card_go = 0;
|
||||||
while(!card_go) {
|
while(!card_go) {
|
||||||
if(disk_status(0) & (STA_NOINIT|STA_NODISK)) {
|
if(disk_status(0) & (STA_NOINIT|STA_NODISK)) {
|
||||||
snes_bootprint(" No Card! \0");
|
snes_bootprint(" No SD Card found! \0");
|
||||||
while(disk_status(0) & (STA_NOINIT|STA_NODISK));
|
while(disk_status(0) & (STA_NOINIT|STA_NODISK));
|
||||||
delay_ms(200);
|
delay_ms(200);
|
||||||
}
|
}
|
||||||
@ -191,7 +191,7 @@ printf("PCONP=%lx\n", LPC_SC->PCONP);
|
|||||||
fpga_pgm((uint8_t*)"/sd2snes/fpga_base.bit");
|
fpga_pgm((uint8_t*)"/sd2snes/fpga_base.bit");
|
||||||
fpga_dspx_reset(1);
|
fpga_dspx_reset(1);
|
||||||
uart_putc('(');
|
uart_putc('(');
|
||||||
load_rom((uint8_t*)"/sd2snes/menu.bin", SRAM_MENU_ADDR);
|
load_rom((uint8_t*)"/sd2snes/menu.bin", SRAM_MENU_ADDR, 0);
|
||||||
/* force memory size + mapper */
|
/* force memory size + mapper */
|
||||||
set_rom_mask(0x3fffff);
|
set_rom_mask(0x3fffff);
|
||||||
set_mapper(0x7);
|
set_mapper(0x7);
|
||||||
@ -236,7 +236,6 @@ sram_hexdump(SRAM_DIR_ADDR, 0x300);
|
|||||||
//sram_hexdump(SRAM_MENU_ADDR, 0x400);
|
//sram_hexdump(SRAM_MENU_ADDR, 0x400);
|
||||||
while(!cmd) {
|
while(!cmd) {
|
||||||
cmd=menu_main_loop();
|
cmd=menu_main_loop();
|
||||||
// cmd = 1;
|
|
||||||
printf("cmd: %d\n", cmd);
|
printf("cmd: %d\n", cmd);
|
||||||
sleep_ms(500);
|
sleep_ms(500);
|
||||||
uart_putc('-');
|
uart_putc('-');
|
||||||
@ -244,22 +243,8 @@ sram_hexdump(SRAM_DIR_ADDR, 0x300);
|
|||||||
case SNES_CMD_LOADROM:
|
case SNES_CMD_LOADROM:
|
||||||
get_selected_name(file_lfn);
|
get_selected_name(file_lfn);
|
||||||
set_mcu_ovr(1);
|
set_mcu_ovr(1);
|
||||||
// strcpy((char*)file_lfn, "/mon.smc");
|
|
||||||
|
|
||||||
printf("Selected name: %s\n", file_lfn);
|
printf("Selected name: %s\n", file_lfn);
|
||||||
filesize = load_rom(file_lfn, SRAM_ROM_ADDR);
|
filesize = load_rom(file_lfn, SRAM_ROM_ADDR, LOADROM_WITH_SRAM | LOADROM_WITH_RESET);
|
||||||
if(romprops.ramsize_bytes) {
|
|
||||||
strcpy(strrchr((char*)file_lfn, (int)'.'), ".srm");
|
|
||||||
printf("SRM file: %s\n", file_lfn);
|
|
||||||
load_sram(file_lfn, SRAM_SAVE_ADDR);
|
|
||||||
} else {
|
|
||||||
printf("No SRAM\n");
|
|
||||||
}
|
|
||||||
set_mcu_ovr(0);
|
|
||||||
snes_reset(1);
|
|
||||||
delay_ms(10);
|
|
||||||
snes_reset(0);
|
|
||||||
fpga_dspx_reset(0);
|
|
||||||
break;
|
break;
|
||||||
case SNES_CMD_SETRTC:
|
case SNES_CMD_SETRTC:
|
||||||
/* get time from RAM */
|
/* get time from RAM */
|
||||||
|
|||||||
60
src/memory.c
60
src/memory.c
@ -43,6 +43,7 @@
|
|||||||
#include "diskio.h"
|
#include "diskio.h"
|
||||||
#include "snesboot.h"
|
#include "snesboot.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
char* hex = "0123456789ABCDEF";
|
char* hex = "0123456789ABCDEF";
|
||||||
|
|
||||||
extern snes_romprops_t romprops;
|
extern snes_romprops_t romprops;
|
||||||
@ -163,13 +164,14 @@ void sram_writeblock(void* buf, uint32_t addr, uint16_t size) {
|
|||||||
FPGA_DESELECT();
|
FPGA_DESELECT();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t load_rom(uint8_t* filename, uint32_t base_addr) {
|
uint32_t load_rom(uint8_t* filename, uint32_t base_addr, uint8_t flags) {
|
||||||
UINT bytes_read;
|
UINT bytes_read;
|
||||||
DWORD filesize;
|
DWORD filesize;
|
||||||
UINT count=0;
|
UINT count=0;
|
||||||
tick_t tickstmp, ticksstart, ticks_read=0, ticks_tx=0, ticks_total=0;
|
tick_t ticksstart, ticks_total=0;
|
||||||
ticksstart=getticks();
|
ticksstart=getticks();
|
||||||
printf("%s\n", filename);
|
printf("%s\n", filename);
|
||||||
|
if(flags & LOADROM_WITH_RESET) set_mcu_ovr(1);
|
||||||
file_open(filename, FA_READ);
|
file_open(filename, FA_READ);
|
||||||
if(file_res) {
|
if(file_res) {
|
||||||
uart_putc('?');
|
uart_putc('?');
|
||||||
@ -181,35 +183,20 @@ printf("%s\n", filename);
|
|||||||
set_mcu_addr(base_addr);
|
set_mcu_addr(base_addr);
|
||||||
printf("no nervous breakdown beyond this point! or else!\n");
|
printf("no nervous breakdown beyond this point! or else!\n");
|
||||||
f_lseek(&file_handle, romprops.offset);
|
f_lseek(&file_handle, romprops.offset);
|
||||||
// FPGA_DESELECT();
|
|
||||||
// FPGA_SELECT();
|
|
||||||
// FPGA_TX_BYTE(0x91); /* write w/ increment */
|
|
||||||
for(;;) {
|
for(;;) {
|
||||||
ff_sd_offload=1;
|
ff_sd_offload=1;
|
||||||
sd_offload_tgt=0;
|
sd_offload_tgt=0;
|
||||||
tickstmp=getticks();
|
|
||||||
bytes_read = file_read();
|
bytes_read = file_read();
|
||||||
ticks_read+=getticks()-tickstmp;
|
|
||||||
if (file_res || !bytes_read) break;
|
if (file_res || !bytes_read) break;
|
||||||
if(!(count++ % 512)) {
|
if(!(count++ % 512)) {
|
||||||
// toggle_read_led();
|
|
||||||
/* bounce_busy_led(); */
|
|
||||||
uart_putc('.');
|
uart_putc('.');
|
||||||
}
|
}
|
||||||
// for(int j=0; j<bytes_read; j++) {
|
|
||||||
// FPGA_TX_BYTE(file_buf[j]);
|
|
||||||
// }
|
|
||||||
//tickstmp = getticks();
|
|
||||||
// FPGA_TX_BLOCK(file_buf, 512);
|
|
||||||
//ticks_tx+=getticks()-tickstmp;
|
|
||||||
}
|
}
|
||||||
// FPGA_TX_BYTE(0x00); /* dummy tx for increment+write pulse */
|
|
||||||
// FPGA_DESELECT();
|
|
||||||
file_close();
|
file_close();
|
||||||
set_mapper(romprops.mapper_id);
|
set_mapper(romprops.mapper_id);
|
||||||
printf("rom header map: %02x; mapper id: %d\n", romprops.header.map, romprops.mapper_id);
|
printf("rom header map: %02x; mapper id: %d\n", romprops.header.map, romprops.mapper_id);
|
||||||
ticks_total=getticks()-ticksstart;
|
ticks_total=getticks()-ticksstart;
|
||||||
printf("%u ticks in read, %u ticks in tx, %u ticks total\n", ticks_read, ticks_tx, ticks_total);
|
printf("%u ticks total\n", ticks_total);
|
||||||
if(romprops.mapper_id==3) {
|
if(romprops.mapper_id==3) {
|
||||||
printf("BSX Flash cart image\n");
|
printf("BSX Flash cart image\n");
|
||||||
printf("attempting to load BSX BIOS /sd2snes/bsxbios.bin...\n");
|
printf("attempting to load BSX BIOS /sd2snes/bsxbios.bin...\n");
|
||||||
@ -229,14 +216,20 @@ ticks_total=getticks()-ticksstart;
|
|||||||
sram_writebyte(0xfc, rombase+0xd5);
|
sram_writebyte(0xfc, rombase+0xd5);
|
||||||
set_fpga_time(0x0220110301180530LL);
|
set_fpga_time(0x0220110301180530LL);
|
||||||
}
|
}
|
||||||
if(romprops.mapper_id == 4 || romprops.mapper_id == 5) {
|
if(romprops.has_dspx) {
|
||||||
printf("DSPx game. Loading firmware image %s...\n", romprops.necdsp_fw);
|
printf("DSPx game. Loading firmware image %s...\n", romprops.necdsp_fw);
|
||||||
load_dspx(romprops.necdsp_fw);
|
load_dspx(romprops.necdsp_fw);
|
||||||
|
if(file_res && romprops.necdsp_fw == DSPFW_1) {
|
||||||
|
load_dspx(DSPFW_1B);
|
||||||
|
}
|
||||||
|
if(file_res) {
|
||||||
|
snes_menu_errmsg(MENU_ERR_NODSP, (void*)romprops.necdsp_fw);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
uint32_t rammask;
|
uint32_t rammask;
|
||||||
uint32_t rommask;
|
uint32_t rommask;
|
||||||
|
|
||||||
if(filesize > (romprops.romsize_bytes + romprops.offset)) {
|
while(filesize > (romprops.romsize_bytes + romprops.offset)) {
|
||||||
romprops.romsize_bytes <<= 1;
|
romprops.romsize_bytes <<= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -250,6 +243,25 @@ ticks_total=getticks()-ticksstart;
|
|||||||
set_saveram_mask(rammask);
|
set_saveram_mask(rammask);
|
||||||
set_rom_mask(rommask);
|
set_rom_mask(rommask);
|
||||||
readled(0);
|
readled(0);
|
||||||
|
if(flags & LOADROM_WITH_SRAM) {
|
||||||
|
if(romprops.ramsize_bytes) {
|
||||||
|
strcpy(strrchr((char*)filename, (int)'.'), ".srm");
|
||||||
|
printf("SRM file: %s\n", filename);
|
||||||
|
load_sram(filename, SRAM_SAVE_ADDR);
|
||||||
|
} else {
|
||||||
|
printf("No SRAM\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(flags & LOADROM_WITH_RESET) {
|
||||||
|
set_mcu_ovr(0);
|
||||||
|
fpga_dspx_reset(1);
|
||||||
|
snes_reset(1);
|
||||||
|
delay_ms(10);
|
||||||
|
snes_reset(0);
|
||||||
|
fpga_dspx_reset(0);
|
||||||
|
}
|
||||||
|
|
||||||
return (uint32_t)filesize;
|
return (uint32_t)filesize;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -487,7 +499,6 @@ void load_dspx(const uint8_t *filename) {
|
|||||||
wordsize_cnt = 0;
|
wordsize_cnt = 0;
|
||||||
word_cnt++;
|
word_cnt++;
|
||||||
fpga_write_dspx_pgm(pgmdata);
|
fpga_write_dspx_pgm(pgmdata);
|
||||||
printf("%06lx ", pgmdata&0xffffff);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -507,7 +518,6 @@ void load_dspx(const uint8_t *filename) {
|
|||||||
wordsize_cnt = 0;
|
wordsize_cnt = 0;
|
||||||
word_cnt++;
|
word_cnt++;
|
||||||
fpga_write_dspx_dat(datdata);
|
fpga_write_dspx_dat(datdata);
|
||||||
printf("%04x ",datdata&0xffff);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -44,7 +44,10 @@
|
|||||||
#define SRAM_DIRID (0xFFFFF0L)
|
#define SRAM_DIRID (0xFFFFF0L)
|
||||||
#define SRAM_RELIABILITY_SCORE (0x100)
|
#define SRAM_RELIABILITY_SCORE (0x100)
|
||||||
|
|
||||||
uint32_t load_rom(uint8_t* filename, uint32_t base_addr);
|
#define LOADROM_WITH_SRAM (1)
|
||||||
|
#define LOADROM_WITH_RESET (2)
|
||||||
|
|
||||||
|
uint32_t load_rom(uint8_t* filename, uint32_t base_addr, uint8_t flags);
|
||||||
uint32_t load_sram(uint8_t* filename, uint32_t base_addr);
|
uint32_t load_sram(uint8_t* filename, uint32_t base_addr);
|
||||||
uint32_t load_sram_offload(uint8_t* filename, uint32_t base_addr);
|
uint32_t load_sram_offload(uint8_t* filename, uint32_t base_addr);
|
||||||
uint32_t load_sram_rle(uint8_t* filename, uint32_t base_addr);
|
uint32_t load_sram_rle(uint8_t* filename, uint32_t base_addr);
|
||||||
|
|||||||
16
src/smc.c
16
src/smc.c
@ -32,12 +32,6 @@
|
|||||||
|
|
||||||
snes_romprops_t romprops;
|
snes_romprops_t romprops;
|
||||||
|
|
||||||
const uint8_t* DSPFW_1 = (uint8_t*)"/sd2snes/dsp1.bin";
|
|
||||||
const uint8_t* DSPFW_1B = (uint8_t*)"/sd2snes/dsp1b.bin";
|
|
||||||
const uint8_t* DSPFW_2 = (uint8_t*)"/sd2snes/dsp2.bin";
|
|
||||||
const uint8_t* DSPFW_3 = (uint8_t*)"/sd2snes/dsp3.bin";
|
|
||||||
const uint8_t* DSPFW_4 = (uint8_t*)"/sd2snes/dsp4.bin";
|
|
||||||
|
|
||||||
uint32_t hdr_addr[6] = {0xffb0, 0x101b0, 0x7fb0, 0x81b0, 0x40ffb0, 0x4101b0};
|
uint32_t hdr_addr[6] = {0xffb0, 0x101b0, 0x7fb0, 0x81b0, 0x40ffb0, 0x4101b0};
|
||||||
uint8_t countAllASCII(uint8_t* data, int size) {
|
uint8_t countAllASCII(uint8_t* data, int size) {
|
||||||
uint8_t res = 0;
|
uint8_t res = 0;
|
||||||
@ -86,6 +80,7 @@ void smc_id(snes_romprops_t* props) {
|
|||||||
uint8_t score, maxscore=1, score_idx=2; /* assume LoROM */
|
uint8_t score, maxscore=1, score_idx=2; /* assume LoROM */
|
||||||
snes_header_t* header = &(props->header);
|
snes_header_t* header = &(props->header);
|
||||||
|
|
||||||
|
props->has_dspx = 0;
|
||||||
for(uint8_t num = 0; num < 6; num++) {
|
for(uint8_t num = 0; num < 6; num++) {
|
||||||
if(!file_readblock(header, hdr_addr[num], sizeof(snes_header_t))
|
if(!file_readblock(header, hdr_addr[num], sizeof(snes_header_t))
|
||||||
|| file_res) {
|
|| file_res) {
|
||||||
@ -144,6 +139,7 @@ void smc_id(snes_romprops_t* props) {
|
|||||||
|
|
||||||
case 0x21: /* HiROM */
|
case 0x21: /* HiROM */
|
||||||
if(header->map == 0x31 && (header->carttype == 0x03 || header->carttype == 0x05)) {
|
if(header->map == 0x31 && (header->carttype == 0x03 || header->carttype == 0x05)) {
|
||||||
|
props->has_dspx = 1;
|
||||||
props->mapper_id = 4; /* DSPx HiROM */
|
props->mapper_id = 4; /* DSPx HiROM */
|
||||||
props->necdsp_fw = DSPFW_1B;
|
props->necdsp_fw = DSPFW_1B;
|
||||||
} else {
|
} else {
|
||||||
@ -155,6 +151,7 @@ void smc_id(snes_romprops_t* props) {
|
|||||||
if ((header->map == 0x20 && header->carttype == 0x03) ||
|
if ((header->map == 0x20 && header->carttype == 0x03) ||
|
||||||
(header->map == 0x30 && header->carttype == 0x05 && header->licensee != 0xb2)) {
|
(header->map == 0x30 && header->carttype == 0x05 && header->licensee != 0xb2)) {
|
||||||
props->mapper_id = 5;
|
props->mapper_id = 5;
|
||||||
|
props->has_dspx = 1;
|
||||||
// Pilotwings uses DSP1 instead of DSP1B
|
// Pilotwings uses DSP1 instead of DSP1B
|
||||||
if(!memcmp(header->name, "PILOTWINGS", 10)) {
|
if(!memcmp(header->name, "PILOTWINGS", 10)) {
|
||||||
props->necdsp_fw = DSPFW_1;
|
props->necdsp_fw = DSPFW_1;
|
||||||
@ -162,12 +159,15 @@ void smc_id(snes_romprops_t* props) {
|
|||||||
props->necdsp_fw = DSPFW_1B;
|
props->necdsp_fw = DSPFW_1B;
|
||||||
}
|
}
|
||||||
} else if (header->map == 0x20 && header->carttype == 0x05) {
|
} else if (header->map == 0x20 && header->carttype == 0x05) {
|
||||||
|
props->has_dspx = 1;
|
||||||
props->mapper_id = 5; /* DSPx LoROM */
|
props->mapper_id = 5; /* DSPx LoROM */
|
||||||
props->necdsp_fw = DSPFW_2;
|
props->necdsp_fw = DSPFW_2;
|
||||||
} else if (header->map == 0x30 && header->carttype == 0x05 && header->licensee == 0xb2) {
|
} else if (header->map == 0x30 && header->carttype == 0x05 && header->licensee == 0xb2) {
|
||||||
|
props->has_dspx = 1;
|
||||||
props->mapper_id = 5; /* DSPx LoROM */
|
props->mapper_id = 5; /* DSPx LoROM */
|
||||||
props->necdsp_fw = DSPFW_3;
|
props->necdsp_fw = DSPFW_3;
|
||||||
} else if (header->map == 0x30 && header->carttype == 0x03) {
|
} else if (header->map == 0x30 && header->carttype == 0x03) {
|
||||||
|
props->has_dspx = 1;
|
||||||
props->mapper_id = 5; /* DSPx LoROM */
|
props->mapper_id = 5; /* DSPx LoROM */
|
||||||
props->necdsp_fw = DSPFW_4;
|
props->necdsp_fw = DSPFW_4;
|
||||||
} else {
|
} else {
|
||||||
@ -183,7 +183,7 @@ void smc_id(snes_romprops_t* props) {
|
|||||||
if(file_handle.fsize > 0x400200) {
|
if(file_handle.fsize > 0x400200) {
|
||||||
props->mapper_id = 6; /* SO96 */
|
props->mapper_id = 6; /* SO96 */
|
||||||
} else {
|
} else {
|
||||||
props->mapper_id = 4;
|
props->mapper_id = 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -198,7 +198,7 @@ void smc_id(snes_romprops_t* props) {
|
|||||||
if(file_handle.fsize > 0x800200) {
|
if(file_handle.fsize > 0x800200) {
|
||||||
props->mapper_id = 6; /* SO96 interleaved */
|
props->mapper_id = 6; /* SO96 interleaved */
|
||||||
} else if(file_handle.fsize > 0x400200) {
|
} else if(file_handle.fsize > 0x400200) {
|
||||||
props->mapper_id = 4; /* ExLoROM */
|
props->mapper_id = 1; /* ExLoROM */
|
||||||
} else {
|
} else {
|
||||||
props->mapper_id = 1; /* LoROM */
|
props->mapper_id = 1; /* LoROM */
|
||||||
}
|
}
|
||||||
|
|||||||
@ -27,6 +27,12 @@
|
|||||||
#ifndef SMC_H
|
#ifndef SMC_H
|
||||||
#define SMC_H
|
#define SMC_H
|
||||||
|
|
||||||
|
#define DSPFW_1 ((const uint8_t*)"/sd2snes/dsp1.bin")
|
||||||
|
#define DSPFW_2 ((const uint8_t*)"/sd2snes/dsp2.bin")
|
||||||
|
#define DSPFW_3 ((const uint8_t*)"/sd2snes/dsp3.bin")
|
||||||
|
#define DSPFW_4 ((const uint8_t*)"/sd2snes/dsp4.bin")
|
||||||
|
#define DSPFW_1B ((const uint8_t*)"/sd2snes/dsp1b.bin")
|
||||||
|
|
||||||
typedef struct _snes_header {
|
typedef struct _snes_header {
|
||||||
uint8_t maker[2]; /* 0xB0 */
|
uint8_t maker[2]; /* 0xB0 */
|
||||||
uint8_t gamecode[4]; /* 0xB2 */
|
uint8_t gamecode[4]; /* 0xB2 */
|
||||||
@ -54,6 +60,7 @@ typedef struct _snes_romprops {
|
|||||||
uint32_t ramsize_bytes; /* CartRAM size in bytes */
|
uint32_t ramsize_bytes; /* CartRAM size in bytes */
|
||||||
uint32_t romsize_bytes; /* ROM size in bytes (rounded up) */
|
uint32_t romsize_bytes; /* ROM size in bytes (rounded up) */
|
||||||
const uint8_t* necdsp_fw; /* NEC DSP ROM filename */
|
const uint8_t* necdsp_fw; /* NEC DSP ROM filename */
|
||||||
|
uint8_t has_dspx; /* DSP[1-4] presence flag */
|
||||||
snes_header_t header; /* original header from ROM image */
|
snes_header_t header; /* original header from ROM image */
|
||||||
} snes_romprops_t;
|
} snes_romprops_t;
|
||||||
|
|
||||||
|
|||||||
@ -171,3 +171,10 @@ void snes_bootprint(void* msg) {
|
|||||||
delay_ms(30);
|
delay_ms(30);
|
||||||
set_mcu_ovr(1);
|
set_mcu_ovr(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void snes_menu_errmsg(int err, void* msg) {
|
||||||
|
set_mcu_ovr(1);
|
||||||
|
sram_writeblock(msg, SRAM_CMD_ADDR+1, 64);
|
||||||
|
sram_writebyte(err, SRAM_CMD_ADDR);
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@ -30,6 +30,10 @@
|
|||||||
#define SNES_CMD_LOADROM (1)
|
#define SNES_CMD_LOADROM (1)
|
||||||
#define SNES_CMD_SETRTC (2)
|
#define SNES_CMD_SETRTC (2)
|
||||||
|
|
||||||
|
#define MENU_ERR_OK (0)
|
||||||
|
#define MENU_ERR_NODSP (1)
|
||||||
|
#define MENU_ERR_NOBSX (2)
|
||||||
|
|
||||||
uint8_t crc_valid;
|
uint8_t crc_valid;
|
||||||
|
|
||||||
void prepare_reset(void);
|
void prepare_reset(void);
|
||||||
@ -40,4 +44,5 @@ void snes_main_loop(void);
|
|||||||
uint8_t menu_main_loop(void);
|
uint8_t menu_main_loop(void);
|
||||||
void get_selected_name(uint8_t* lfn);
|
void get_selected_name(uint8_t* lfn);
|
||||||
void snes_bootprint(void* msg);
|
void snes_bootprint(void* msg);
|
||||||
|
void snes_menu_errmsg(int err, void* msg);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user