uint32_t load_rom(uint8_t* filename, uint32_t base_addr, uint8_t flags) { UINT bytes_read; DWORD filesize; UINT count=0; tick_t ticksstart, ticks_total=0; ticksstart=getticks(); printf("%s\n", filename); file_open(filename, FA_READ); if(file_res) { uart_putc('?'); uart_putc(0x30+file_res); return 0; } filesize = file_handle.fsize; smc_id(&romprops); file_close(); /* reconfigure FPGA if necessary */ if(romprops.fpga_conf) { printf("reconfigure FPGA with %s...\n", romprops.fpga_conf); fpga_pgm((uint8_t*)romprops.fpga_conf); } set_mcu_addr(base_addr + romprops.load_address); file_open(filename, FA_READ); ff_sd_offload=1; sd_offload_tgt=0; f_lseek(&file_handle, romprops.offset); for(;;) { ff_sd_offload=1; sd_offload_tgt=0; bytes_read = file_read(); if (file_res || !bytes_read) break; if(!(count++ % 512)) { uart_putc('.'); } } 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 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"); load_sram_offload((uint8_t*)"/sd2snes/bsxbios.bin", 0x800000); printf("attempting to load BS data file /sd2snes/bsxpage.bin...\n"); load_sram_offload((uint8_t*)"/sd2snes/bsxpage.bin", 0x900000); printf("Type: %02x\n", romprops.header.destcode); set_bsx_regs(0xc0, 0x3f); uint16_t rombase; if(romprops.header.ramsize & 1) { rombase = romprops.load_address + 0xff00; // set_bsx_regs(0x36, 0xc9); } else { rombase = romprops.load_address + 0x7f00; // set_bsx_regs(0x34, 0xcb); } sram_writebyte(0x33, rombase+0xda); sram_writebyte(0x00, rombase+0xd4); sram_writebyte(0xfc, rombase+0xd5); set_fpga_time(0x0220110301180530LL); } if(romprops.has_dspx || romprops.has_cx4) { printf("DSPx game. Loading firmware image %s...\n", romprops.dsp_fw); load_dspx(romprops.dsp_fw, romprops.fpga_features); /* fallback to DSP1B firmware if DSP1.bin is not present */ if(file_res && romprops.dsp_fw == DSPFW_1) { load_dspx(DSPFW_1B, romprops.fpga_features); } if(file_res) { snes_menu_errmsg(MENU_ERR_NODSP, (void*)romprops.dsp_fw); } } uint32_t rammask; uint32_t rommask; while(filesize > (romprops.romsize_bytes + romprops.offset)) { romprops.romsize_bytes <<= 1; } if(romprops.header.ramsize == 0) { rammask = 0; } else { rammask = romprops.ramsize_bytes - 1; } rommask = romprops.romsize_bytes - 1; printf("ramsize=%x rammask=%lx\nromsize=%x rommask=%lx\n", romprops.header.ramsize, rammask, romprops.header.romsize, rommask); set_saveram_mask(rammask); set_rom_mask(rommask); readled(0); if(flags & LOADROM_WITH_SRAM) { if(romprops.ramsize_bytes) { sram_memset(SRAM_SAVE_ADDR, romprops.ramsize_bytes, 0); strcpy(strrchr((char*)filename, (int)'.'), ".srm"); printf("SRM file: %s\n", filename); load_sram(filename, SRAM_SAVE_ADDR); saveram_crc_old = calc_sram_crc(SRAM_SAVE_ADDR, romprops.ramsize_bytes); } else { printf("No SRAM\n"); } } printf("check MSU..."); if(msu1_check(filename)) { romprops.fpga_features |= FEAT_MSU1; romprops.has_msu1 = 1; } else { romprops.has_msu1 = 0; } printf("done\n"); romprops.fpga_features |= FEAT_SRTC; romprops.fpga_features |= FEAT_213F; fpga_set_213f(romprops.region); fpga_set_features(romprops.fpga_features); if(flags & LOADROM_WITH_RESET) { fpga_dspx_reset(1); snes_reset_pulse(); fpga_dspx_reset(0); } return (uint32_t)filesize; }
void cmd_setfeature(void) { uint8_t feat = parse_unsigned(0, 255, 16); fpga_set_features(feat); }