From 8c2f74d8cd8860387ef1e78c5284a6561ca844c4 Mon Sep 17 00:00:00 2001 From: Maximilian Rehkopf Date: Sat, 9 Jun 2012 21:51:15 +0200 Subject: [PATCH] firmware: SPC player (necronomfive) --- src/filetypes.c | 13 ++++------ src/main.c | 15 ++++++++++++ src/memory.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++ src/memory.h | 9 +++++-- src/snes.h | 8 +++--- 5 files changed, 97 insertions(+), 13 deletions(-) diff --git a/src/filetypes.c b/src/filetypes.c index 9f78033..c398cb4 100644 --- a/src/filetypes.c +++ b/src/filetypes.c @@ -194,6 +194,7 @@ uint32_t scan_dir(char* path, FILINFO* fno_param, char mkdb, uint32_t this_dir_t switch(type) { case TYPE_IPS: case TYPE_SMC: + case TYPE_SPC: /* file_open_by_filinfo(&fno); if(file_res){ printf("ZOMG NOOOO %d\n", file_res); @@ -271,18 +272,14 @@ SNES_FTYPE determine_filetype(char* filename) { ) { return TYPE_SMC; } - if( (!strcasecmp(ext+1, "IPS")) +/* if( (!strcasecmp(ext+1, "IPS")) ||(!strcasecmp(ext+1, "UPS")) ) { return TYPE_IPS; - } - /* later - if(!strcasecmp_P(ext+1, PSTR("SRM"))) { - return TYPE_SRM; - } - if(!strcasecmp_P(ext+1, PSTR("SPC"))) { - return TYPE_SPC; }*/ + if(!strcasecmp(ext+1, "SPC")) { + return TYPE_SPC; + } return TYPE_UNKNOWN; } diff --git a/src/main.c b/src/main.c index dcc8487..2ac0934 100644 --- a/src/main.c +++ b/src/main.c @@ -265,6 +265,21 @@ printf("PCONP=%lx\n", LPC_SC->PCONP); sysinfo_loop(); cmd=0; /* stay in menu loop */ break; + case SNES_CMD_LOADSPC: + /* load SPC file */ + get_selected_name(file_lfn); + printf("Selected name: %s\n", file_lfn); + filesize = load_spc(file_lfn, SRAM_SPC_DATA_ADDR, SRAM_SPC_HEADER_ADDR); + cmd=0; /* stay in menu loop */ + break; + case SNES_CMD_RESET: + /* process RESET request from SNES */ + printf("RESET requested by SNES\n"); + snes_reset(1); + sleep_ms(1); + snes_reset(0); + cmd=0; /* stay in menu loop */ + break; case SNES_CMD_LOADLAST: cfg_get_last_game(file_lfn); printf("Selected name: %s\n", file_lfn); diff --git a/src/memory.c b/src/memory.c index 313af4a..bce7a0f 100644 --- a/src/memory.c +++ b/src/memory.c @@ -299,6 +299,71 @@ uint32_t load_rom(uint8_t* filename, uint32_t base_addr, uint8_t flags) { return (uint32_t)filesize; } +uint32_t load_spc(uint8_t* filename, uint32_t spc_data_addr, uint32_t spc_header_addr) { + DWORD filesize; + UINT bytes_read; + uint8_t data; + UINT j; + + printf("%s\n", filename); + + file_open(filename, FA_READ); /* Open SPC file */ + if(file_res) return 0; + filesize = file_handle.fsize; + if (filesize < 65920) { /* At this point, we care about filesize only */ + file_close(); /* since SNES decides if it is an SPC file */ + sram_writebyte(0, spc_header_addr); /* If file is too small, destroy previous SPC header */ + return 0; + } + + set_mcu_addr(spc_data_addr); + f_lseek(&file_handle, 0x100L); /* Load 64K data segment */ + + for(;;) { + bytes_read = file_read(); + if (file_res || !bytes_read) break; + FPGA_SELECT(); + FPGA_TX_BYTE(0x98); + for(j=0; j