diff --git a/src/filetypes.h b/src/filetypes.h index c337b22..bceae08 100644 --- a/src/filetypes.h +++ b/src/filetypes.h @@ -28,6 +28,8 @@ #define FILETYPES_H #include "ff.h" + +#define SYS_DIR_NAME ((const uint8_t*)"sd2snes") typedef enum { TYPE_UNKNOWN = 0, /* 0 */ TYPE_SMC, /* 1 */ diff --git a/src/main.c b/src/main.c index 26f6776..c1e750b 100644 --- a/src/main.c +++ b/src/main.c @@ -115,7 +115,7 @@ printf("PCONP=%lx\n", LPC_SC->PCONP); uint8_t card_go = 0; while(!card_go) { 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)); delay_ms(200); } @@ -191,7 +191,7 @@ printf("PCONP=%lx\n", LPC_SC->PCONP); fpga_pgm((uint8_t*)"/sd2snes/fpga_base.bit"); fpga_dspx_reset(1); 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 */ set_rom_mask(0x3fffff); set_mapper(0x7); @@ -236,7 +236,6 @@ sram_hexdump(SRAM_DIR_ADDR, 0x300); //sram_hexdump(SRAM_MENU_ADDR, 0x400); while(!cmd) { cmd=menu_main_loop(); -// cmd = 1; printf("cmd: %d\n", cmd); sleep_ms(500); uart_putc('-'); @@ -244,22 +243,8 @@ sram_hexdump(SRAM_DIR_ADDR, 0x300); case SNES_CMD_LOADROM: get_selected_name(file_lfn); set_mcu_ovr(1); -// strcpy((char*)file_lfn, "/mon.smc"); - printf("Selected name: %s\n", file_lfn); - filesize = load_rom(file_lfn, SRAM_ROM_ADDR); - 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); + filesize = load_rom(file_lfn, SRAM_ROM_ADDR, LOADROM_WITH_SRAM | LOADROM_WITH_RESET); break; case SNES_CMD_SETRTC: /* get time from RAM */ diff --git a/src/memory.c b/src/memory.c index e0eaae1..a308161 100644 --- a/src/memory.c +++ b/src/memory.c @@ -43,6 +43,7 @@ #include "diskio.h" #include "snesboot.h" +#include char* hex = "0123456789ABCDEF"; extern snes_romprops_t romprops; @@ -163,13 +164,14 @@ void sram_writeblock(void* buf, uint32_t addr, uint16_t size) { 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; DWORD filesize; UINT count=0; - tick_t tickstmp, ticksstart, ticks_read=0, ticks_tx=0, ticks_total=0; -ticksstart=getticks(); -printf("%s\n", filename); + tick_t ticksstart, ticks_total=0; + ticksstart=getticks(); + printf("%s\n", filename); + if(flags & LOADROM_WITH_RESET) set_mcu_ovr(1); file_open(filename, FA_READ); if(file_res) { uart_putc('?'); @@ -181,35 +183,20 @@ printf("%s\n", filename); set_mcu_addr(base_addr); printf("no nervous breakdown beyond this point! or else!\n"); f_lseek(&file_handle, romprops.offset); -// FPGA_DESELECT(); -// FPGA_SELECT(); -// FPGA_TX_BYTE(0x91); /* write w/ increment */ for(;;) { ff_sd_offload=1; sd_offload_tgt=0; -tickstmp=getticks(); bytes_read = file_read(); -ticks_read+=getticks()-tickstmp; if (file_res || !bytes_read) break; if(!(count++ % 512)) { -// toggle_read_led(); -/* bounce_busy_led(); */ uart_putc('.'); } -// for(int j=0; j (romprops.romsize_bytes + romprops.offset)) { + while(filesize > (romprops.romsize_bytes + romprops.offset)) { romprops.romsize_bytes <<= 1; } @@ -250,6 +243,25 @@ ticks_total=getticks()-ticksstart; set_saveram_mask(rammask); set_rom_mask(rommask); 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; } @@ -487,7 +499,6 @@ void load_dspx(const uint8_t *filename) { wordsize_cnt = 0; word_cnt++; fpga_write_dspx_pgm(pgmdata); - printf("%06lx ", pgmdata&0xffffff); } } @@ -507,7 +518,6 @@ void load_dspx(const uint8_t *filename) { wordsize_cnt = 0; word_cnt++; fpga_write_dspx_dat(datdata); - printf("%04x ",datdata&0xffff); } } diff --git a/src/memory.h b/src/memory.h index b0327c4..7bb1347 100644 --- a/src/memory.h +++ b/src/memory.h @@ -44,7 +44,10 @@ #define SRAM_DIRID (0xFFFFF0L) #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_offload(uint8_t* filename, uint32_t base_addr); uint32_t load_sram_rle(uint8_t* filename, uint32_t base_addr); diff --git a/src/smc.c b/src/smc.c index 2efd898..ed86a71 100644 --- a/src/smc.c +++ b/src/smc.c @@ -32,12 +32,6 @@ 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}; uint8_t countAllASCII(uint8_t* data, int size) { 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 */ snes_header_t* header = &(props->header); + props->has_dspx = 0; for(uint8_t num = 0; num < 6; num++) { if(!file_readblock(header, hdr_addr[num], sizeof(snes_header_t)) || file_res) { @@ -144,6 +139,7 @@ void smc_id(snes_romprops_t* props) { case 0x21: /* HiROM */ if(header->map == 0x31 && (header->carttype == 0x03 || header->carttype == 0x05)) { + props->has_dspx = 1; props->mapper_id = 4; /* DSPx HiROM */ props->necdsp_fw = DSPFW_1B; } else { @@ -155,6 +151,7 @@ void smc_id(snes_romprops_t* props) { if ((header->map == 0x20 && header->carttype == 0x03) || (header->map == 0x30 && header->carttype == 0x05 && header->licensee != 0xb2)) { props->mapper_id = 5; + props->has_dspx = 1; // Pilotwings uses DSP1 instead of DSP1B if(!memcmp(header->name, "PILOTWINGS", 10)) { props->necdsp_fw = DSPFW_1; @@ -162,12 +159,15 @@ void smc_id(snes_romprops_t* props) { props->necdsp_fw = DSPFW_1B; } } else if (header->map == 0x20 && header->carttype == 0x05) { + props->has_dspx = 1; props->mapper_id = 5; /* DSPx LoROM */ props->necdsp_fw = DSPFW_2; } else if (header->map == 0x30 && header->carttype == 0x05 && header->licensee == 0xb2) { + props->has_dspx = 1; props->mapper_id = 5; /* DSPx LoROM */ props->necdsp_fw = DSPFW_3; } else if (header->map == 0x30 && header->carttype == 0x03) { + props->has_dspx = 1; props->mapper_id = 5; /* DSPx LoROM */ props->necdsp_fw = DSPFW_4; } else { @@ -183,7 +183,7 @@ void smc_id(snes_romprops_t* props) { if(file_handle.fsize > 0x400200) { props->mapper_id = 6; /* SO96 */ } else { - props->mapper_id = 4; + props->mapper_id = 1; } break; @@ -198,7 +198,7 @@ void smc_id(snes_romprops_t* props) { if(file_handle.fsize > 0x800200) { props->mapper_id = 6; /* SO96 interleaved */ } else if(file_handle.fsize > 0x400200) { - props->mapper_id = 4; /* ExLoROM */ + props->mapper_id = 1; /* ExLoROM */ } else { props->mapper_id = 1; /* LoROM */ } diff --git a/src/smc.h b/src/smc.h index ee516d6..271122b 100644 --- a/src/smc.h +++ b/src/smc.h @@ -27,6 +27,12 @@ #ifndef 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 { uint8_t maker[2]; /* 0xB0 */ uint8_t gamecode[4]; /* 0xB2 */ @@ -54,6 +60,7 @@ typedef struct _snes_romprops { uint32_t ramsize_bytes; /* CartRAM size in bytes */ uint32_t romsize_bytes; /* ROM size in bytes (rounded up) */ 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_romprops_t; diff --git a/src/snes.c b/src/snes.c index 99014aa..175ccf5 100644 --- a/src/snes.c +++ b/src/snes.c @@ -171,3 +171,10 @@ void snes_bootprint(void* msg) { delay_ms(30); 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); +} + diff --git a/src/snes.h b/src/snes.h index 977eb22..fa7b762 100644 --- a/src/snes.h +++ b/src/snes.h @@ -30,6 +30,10 @@ #define SNES_CMD_LOADROM (1) #define SNES_CMD_SETRTC (2) +#define MENU_ERR_OK (0) +#define MENU_ERR_NODSP (1) +#define MENU_ERR_NOBSX (2) + uint8_t crc_valid; void prepare_reset(void); @@ -40,4 +44,5 @@ void snes_main_loop(void); uint8_t menu_main_loop(void); void get_selected_name(uint8_t* lfn); void snes_bootprint(void* msg); +void snes_menu_errmsg(int err, void* msg); #endif