Firmware: cleanup ROM loading, minor touchups
This commit is contained in:
parent
0b0ee180df
commit
cfa78624c9
@ -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 */
|
||||
|
||||
21
src/main.c
21
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 */
|
||||
|
||||
60
src/memory.c
60
src/memory.c
@ -43,6 +43,7 @@
|
||||
#include "diskio.h"
|
||||
#include "snesboot.h"
|
||||
|
||||
#include <string.h>
|
||||
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<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();
|
||||
set_mapper(romprops.mapper_id);
|
||||
printf("rom header map: %02x; mapper id: %d\n", romprops.header.map, romprops.mapper_id);
|
||||
ticks_total=getticks()-ticksstart;
|
||||
printf("%u ticks in read, %u ticks in tx, %u ticks total\n", ticks_read, ticks_tx, ticks_total);
|
||||
ticks_total=getticks()-ticksstart;
|
||||
printf("%u ticks total\n", ticks_total);
|
||||
if(romprops.mapper_id==3) {
|
||||
printf("BSX Flash cart image\n");
|
||||
printf("attempting to load BSX BIOS /sd2snes/bsxbios.bin...\n");
|
||||
@ -229,14 +216,20 @@ ticks_total=getticks()-ticksstart;
|
||||
sram_writebyte(0xfc, rombase+0xd5);
|
||||
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);
|
||||
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 rommask;
|
||||
|
||||
if(filesize > (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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
16
src/smc.c
16
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 */
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user