BS-X support (firmware)
This commit is contained in:
parent
0fae66fac2
commit
f34318d2dc
@ -60,7 +60,7 @@
|
|||||||
tt = target (see above)
|
tt = target (see above)
|
||||||
i = increment (see above)
|
i = increment (see above)
|
||||||
|
|
||||||
E0 ssrr set MSU-1 status register (=FPGA status byte 2)
|
E0 ssrr set MSU-1 status register (=FPGA status [7:0])
|
||||||
ss = bits to set in status register (1=set)
|
ss = bits to set in status register (1=set)
|
||||||
rr = bits to reset in status register (1=reset)
|
rr = bits to reset in status register (1=reset)
|
||||||
|
|
||||||
@ -69,15 +69,40 @@
|
|||||||
E3 - reset DAC playback pointer (0)
|
E3 - reset DAC playback pointer (0)
|
||||||
E4 hhll set MSU read pointer
|
E4 hhll set MSU read pointer
|
||||||
|
|
||||||
|
E5 tt{12} set RTC (SRTC/SPC7110 format)
|
||||||
|
E6 ssrr set/reset BS-X status register [7:0]
|
||||||
F0 - receive test token (to see if FPGA is alive)
|
F0 - receive test token (to see if FPGA is alive)
|
||||||
F1 - receive status (2 bytes)
|
F1 - receive status (16bit, MSB first), see below
|
||||||
|
|
||||||
F2 - get MSU data address (32bit, MSB first)
|
F2 - get MSU data address (32bit, MSB first)
|
||||||
F3 - get MSU audio track no. (16bit, MSB first)
|
F3 - get MSU audio track no. (16bit, MSB first)
|
||||||
F4 - get MSU volume (8bit)
|
F4 - get MSU volume (8bit)
|
||||||
|
|
||||||
FE - get SNES master clock frequency (32bit, MSB first)
|
FE - get SNES master clock frequency (32bit, MSB first)
|
||||||
|
measured 1x/sec
|
||||||
FF {xx}* echo (returns the sent data in the next byte)
|
FF {xx}* echo (returns the sent data in the next byte)
|
||||||
|
|
||||||
|
FPGA status word:
|
||||||
|
bit function
|
||||||
|
==========================================================================
|
||||||
|
15 SD DMA busy (0=idle, 1=busy)
|
||||||
|
14 DAC read pointer MSB
|
||||||
|
13 MSU read pointer MSB
|
||||||
|
12 [TODO SD DMA CRC status (0=ok, 1=error); valid after bit 15 -> 0]
|
||||||
|
11 reserved (0)
|
||||||
|
10 reserved (0)
|
||||||
|
9 reserved (0)
|
||||||
|
8 reserved (0)
|
||||||
|
7 reserved (0)
|
||||||
|
6 reserved (0)
|
||||||
|
5 MSU1 Audio request from SNES
|
||||||
|
4 MSU1 Data request from SNES
|
||||||
|
3 reserved (0)
|
||||||
|
2 MSU1 Audio control status: 0=no repeat, 1=repeat
|
||||||
|
1 MSU1 Audio control status: 0=pause, 1=play
|
||||||
|
0 MSU1 Audio control request
|
||||||
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <arm/NXP/LPC17xx/LPC17xx.h>
|
#include <arm/NXP/LPC17xx/LPC17xx.h>
|
||||||
@ -189,7 +214,7 @@ void fpga_sddma(uint8_t tgt, uint8_t partial) {
|
|||||||
test++;
|
test++;
|
||||||
}
|
}
|
||||||
FPGA_DESELECT();
|
FPGA_DESELECT();
|
||||||
if(test<10)printf("loopy: %ld %02x\n", test, status);
|
if(test<5)printf("loopy: %ld %02x\n", test, status);
|
||||||
BITBAND(SD_CLKREG->FIODIR, SD_CLKPIN) = 1;
|
BITBAND(SD_CLKREG->FIODIR, SD_CLKPIN) = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -286,3 +311,14 @@ uint32_t get_snes_sysclk() {
|
|||||||
FPGA_DESELECT();
|
FPGA_DESELECT();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void set_bsx_regs(uint8_t set, uint8_t reset) {
|
||||||
|
FPGA_SELECT();
|
||||||
|
FPGA_TX_BYTE(0xe6);
|
||||||
|
FPGA_TX_BYTE(set);
|
||||||
|
FPGA_TX_BYTE(reset);
|
||||||
|
FPGA_TX_BYTE(0x00); /* latch reset */
|
||||||
|
FPGA_DESELECT();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -72,4 +72,5 @@ uint8_t get_msu_volume(void);
|
|||||||
uint16_t get_msu_track(void);
|
uint16_t get_msu_track(void);
|
||||||
uint32_t get_msu_offset(void);
|
uint32_t get_msu_offset(void);
|
||||||
uint32_t get_snes_sysclk(void);
|
uint32_t get_snes_sysclk(void);
|
||||||
|
void set_bsx_regs(uint8_t set, uint8_t reset);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
17
src/memory.c
17
src/memory.c
@ -210,6 +210,23 @@ ticks_read+=getticks()-tickstmp;
|
|||||||
printf("rom header map: %02x; mapper id: %d\n", romprops.header.map, romprops.mapper_id);
|
printf("rom header map: %02x; mapper id: %d\n", romprops.header.map, romprops.mapper_id);
|
||||||
ticks_total=getticks()-ticksstart;
|
ticks_total=getticks()-ticksstart;
|
||||||
printf("%u ticks in read, %u ticks in tx, %u ticks total\n", ticks_read, ticks_tx, ticks_total);
|
printf("%u ticks in read, %u ticks in tx, %u ticks total\n", ticks_read, ticks_tx, ticks_total);
|
||||||
|
if(romprops.mapper_id==3) {
|
||||||
|
printf("attempting to load BSX BIOS /sd2snes/bsxbios.sfc...\n");
|
||||||
|
load_sram((uint8_t*)"/sd2snes/bsxbios.sfc", 0x800000);
|
||||||
|
printf("Type: %02x\n", romprops.header.destcode);
|
||||||
|
set_bsx_regs(0xc0, 0x3f);
|
||||||
|
uint16_t rombase;
|
||||||
|
if(romprops.header.ramsize & 1) {
|
||||||
|
rombase = 0xff00;
|
||||||
|
// set_bsx_regs(0xf6, 0x09);
|
||||||
|
} else {
|
||||||
|
rombase = 0x7f00;
|
||||||
|
// set_bsx_regs(0xf4, 0x0b);
|
||||||
|
}
|
||||||
|
sram_writebyte(0x33, rombase+0xda);
|
||||||
|
sram_writebyte(0x00, rombase+0xd4);
|
||||||
|
sram_writebyte(0xfc, rombase+0xd5);
|
||||||
|
}
|
||||||
uint32_t rammask;
|
uint32_t rammask;
|
||||||
uint32_t rommask;
|
uint32_t rommask;
|
||||||
|
|
||||||
|
|||||||
26
src/smc.c
26
src/smc.c
@ -81,7 +81,7 @@ void smc_id(snes_romprops_t* props) {
|
|||||||
snes_header_t* header = &(props->header);
|
snes_header_t* header = &(props->header);
|
||||||
|
|
||||||
for(uint8_t num = 0; num < 6; num++) {
|
for(uint8_t num = 0; num < 6; num++) {
|
||||||
if(!file_readblock(header, hdr_addr[num], sizeof(snes_header_t))
|
if(!file_readblock(header, hdr_addr[num], sizeof(snes_header_t))
|
||||||
|| file_res) {
|
|| file_res) {
|
||||||
score = 0;
|
score = 0;
|
||||||
} else {
|
} else {
|
||||||
@ -104,7 +104,7 @@ void smc_id(snes_romprops_t* props) {
|
|||||||
if(score>=maxscore) {
|
if(score>=maxscore) {
|
||||||
score_idx=num;
|
score_idx=num;
|
||||||
maxscore=score;
|
maxscore=score;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(score_idx & 1) {
|
if(score_idx & 1) {
|
||||||
@ -116,6 +116,24 @@ void smc_id(snes_romprops_t* props) {
|
|||||||
/* restore the chosen one */
|
/* restore the chosen one */
|
||||||
/*dprintf("winner is %d\n", score_idx); */
|
/*dprintf("winner is %d\n", score_idx); */
|
||||||
file_readblock(header, hdr_addr[score_idx], sizeof(snes_header_t));
|
file_readblock(header, hdr_addr[score_idx], sizeof(snes_header_t));
|
||||||
|
|
||||||
|
if(header->name[0x13] == 0x00 || header->name[0x13] == 0xff) {
|
||||||
|
if(header->name[0x14] == 0x00) {
|
||||||
|
const uint8_t n15 = header->map;
|
||||||
|
if(n15 == 0x00 || n15 == 0x80 || n15 == 0x84 || n15 == 0x9c
|
||||||
|
|| n15 == 0xbc || n15 == 0xfc) {
|
||||||
|
if(header->fixed_33 == 0x33 || header->fixed_33 == 0xff) {
|
||||||
|
props->mapper_id = 0;
|
||||||
|
/*XXX do this properly */
|
||||||
|
props->ramsize_bytes = 0x8000;
|
||||||
|
props->romsize_bytes = 0x100000;
|
||||||
|
props->expramsize_bytes = 0;
|
||||||
|
props->mapper_id = 3; /* BS-X Memory Map */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
switch(header->map & 0xef) {
|
switch(header->map & 0xef) {
|
||||||
case 0x21: /* HiROM */
|
case 0x21: /* HiROM */
|
||||||
props->mapper_id = 0;
|
props->mapper_id = 0;
|
||||||
@ -130,7 +148,7 @@ void smc_id(snes_romprops_t* props) {
|
|||||||
if(file_handle.fsize > 0x400200) {
|
if(file_handle.fsize > 0x400200) {
|
||||||
props->mapper_id = 6; /* SO96 */
|
props->mapper_id = 6; /* SO96 */
|
||||||
} else {
|
} else {
|
||||||
props->mapper_id = 3;
|
props->mapper_id = 4;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default: /* invalid/unsupported mapper, use header location */
|
default: /* invalid/unsupported mapper, use header location */
|
||||||
@ -144,7 +162,7 @@ void smc_id(snes_romprops_t* props) {
|
|||||||
if(file_handle.fsize > 0x800200) {
|
if(file_handle.fsize > 0x800200) {
|
||||||
props->mapper_id = 6; /* SO96 interleaved */
|
props->mapper_id = 6; /* SO96 interleaved */
|
||||||
} else if(file_handle.fsize > 0x400200) {
|
} else if(file_handle.fsize > 0x400200) {
|
||||||
props->mapper_id = 3; /* ExLoROM */
|
props->mapper_id = 4; /* ExLoROM */
|
||||||
} else {
|
} else {
|
||||||
props->mapper_id = 1; /* LoROM */
|
props->mapper_id = 1; /* LoROM */
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user