Firmware: cleanup ROM loading, minor touchups

This commit is contained in:
ikari 2011-06-17 01:05:43 +02:00
parent 0b0ee180df
commit cfa78624c9
8 changed files with 71 additions and 52 deletions

View File

@ -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 */

View File

@ -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 */

View File

@ -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);
}
}

View File

@ -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);

View File

@ -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 */
}

View File

@ -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;

View File

@ -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);
}

View File

@ -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