mirror of
https://github.com/holub/mame
synced 2025-05-23 22:20:01 +03:00
Fixed SCU DSP PC reads from SH-2 side. [Angelo Salese]
This commit is contained in:
parent
376bf4653a
commit
fe6ba0865a
@ -520,6 +520,9 @@ static READ32_HANDLER( saturn_scu_r )
|
|||||||
if(LOG_SCU) logerror("(PC=%08x) DMA status reg read\n",cpu_get_pc(&space->device()));
|
if(LOG_SCU) logerror("(PC=%08x) DMA status reg read\n",cpu_get_pc(&space->device()));
|
||||||
res = state->m_scu_regs[offset];
|
res = state->m_scu_regs[offset];
|
||||||
break;
|
break;
|
||||||
|
case 0x80/4:
|
||||||
|
res = dsp_prg_ctrl_r(space);
|
||||||
|
break;
|
||||||
case 0x8c/4:
|
case 0x8c/4:
|
||||||
if(LOG_SCU) logerror( "DSP mem read at %08X\n", state->m_scu_regs[34]);
|
if(LOG_SCU) logerror( "DSP mem read at %08X\n", state->m_scu_regs[34]);
|
||||||
res = dsp_ram_addr_r();
|
res = dsp_ram_addr_r();
|
||||||
@ -589,19 +592,20 @@ static WRITE32_HANDLER( saturn_scu_w )
|
|||||||
case 0x7c/4: if(LOG_SCU) logerror("Warning: DMA status WRITE! Offset %02x(%d)\n",offset*4,offset); break;
|
case 0x7c/4: if(LOG_SCU) logerror("Warning: DMA status WRITE! Offset %02x(%d)\n",offset*4,offset); break;
|
||||||
/*DSP section*/
|
/*DSP section*/
|
||||||
case 0x80/4:
|
case 0x80/4:
|
||||||
dsp_prg_ctrl(space, data);
|
/* TODO: you can't overwrite some flags with this */
|
||||||
|
dsp_prg_ctrl(space, state->m_scu_regs[offset]);
|
||||||
if(LOG_SCU) logerror("SCU DSP: Program Control Port Access %08x\n",data);
|
if(LOG_SCU) logerror("SCU DSP: Program Control Port Access %08x\n",data);
|
||||||
break;
|
break;
|
||||||
case 0x84/4:
|
case 0x84/4:
|
||||||
dsp_prg_data(data);
|
dsp_prg_data(state->m_scu_regs[offset]);
|
||||||
if(LOG_SCU) logerror("SCU DSP: Program RAM Data Port Access %08x\n",data);
|
if(LOG_SCU) logerror("SCU DSP: Program RAM Data Port Access %08x\n",data);
|
||||||
break;
|
break;
|
||||||
case 0x88/4:
|
case 0x88/4:
|
||||||
dsp_ram_addr_ctrl(data);
|
dsp_ram_addr_ctrl(state->m_scu_regs[offset]);
|
||||||
if(LOG_SCU) logerror("SCU DSP: Data RAM Address Port Access %08x\n",data);
|
if(LOG_SCU) logerror("SCU DSP: Data RAM Address Port Access %08x\n",data);
|
||||||
break;
|
break;
|
||||||
case 0x8c/4:
|
case 0x8c/4:
|
||||||
dsp_ram_addr_w(data);
|
dsp_ram_addr_w(state->m_scu_regs[offset]);
|
||||||
if(LOG_SCU) logerror("SCU DSP: Data RAM Data Port Access %08x\n",data);
|
if(LOG_SCU) logerror("SCU DSP: Data RAM Data Port Access %08x\n",data);
|
||||||
break;
|
break;
|
||||||
case 0x90/4: /*if(LOG_SCU) logerror("timer 0 compare data = %03x\n",state->m_scu_regs[36]);*/ break;
|
case 0x90/4: /*if(LOG_SCU) logerror("timer 0 compare data = %03x\n",state->m_scu_regs[36]);*/ break;
|
||||||
|
@ -4,6 +4,10 @@ System Control Unit - DSP emulator version 0.08
|
|||||||
Written by Angelo Salese & Mariusz Wojcieszek
|
Written by Angelo Salese & Mariusz Wojcieszek
|
||||||
|
|
||||||
Changelog:
|
Changelog:
|
||||||
|
110807: Angelo Salese
|
||||||
|
- Allow the Program Counter to be read-backable from SH-2, needed by Virtua Fighter to not
|
||||||
|
get stuck on "round 1" announcement;
|
||||||
|
|
||||||
110806: Angelo Salese
|
110806: Angelo Salese
|
||||||
- Allows reading from non-work ram h areas;
|
- Allows reading from non-work ram h areas;
|
||||||
- Fixed DMA add values;
|
- Fixed DMA add values;
|
||||||
@ -329,9 +333,18 @@ static UINT32 dsp_get_mem_source_dma( UINT32 memcode, UINT32 counter )
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dsp_prg_ctrl(address_space *space, UINT32 data)
|
UINT32 dsp_prg_ctrl_r(address_space *space)
|
||||||
{
|
{
|
||||||
saturn_state *state = space->machine().driver_data<saturn_state>();
|
saturn_state *state = space->machine().driver_data<saturn_state>();
|
||||||
|
|
||||||
|
return (state->m_scu_regs[0x80/4] & 0x06ff8000) | (dsp_reg.pc & 0xff);
|
||||||
|
}
|
||||||
|
|
||||||
|
void dsp_prg_ctrl_w(address_space *space, UINT32 data)
|
||||||
|
{
|
||||||
|
saturn_state *state = space->machine().driver_data<saturn_state>();
|
||||||
|
data = state->m_scu_regs[0x80/4] & ;
|
||||||
|
|
||||||
if(LEF) dsp_reg.pc = (data & 0xff);
|
if(LEF) dsp_reg.pc = (data & 0xff);
|
||||||
if(EXF) dsp_execute_program(space);
|
if(EXF) dsp_execute_program(space);
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
/*SCU DSP stuff*/
|
/*SCU DSP stuff*/
|
||||||
|
|
||||||
void dsp_prg_ctrl(address_space *space, UINT32 data);
|
void dsp_prg_ctrl_w(address_space *space, UINT32 data);
|
||||||
void dsp_prg_data(UINT32 data);
|
void dsp_prg_data(UINT32 data);
|
||||||
void dsp_ram_addr_ctrl(UINT32 data);
|
void dsp_ram_addr_ctrl(UINT32 data);
|
||||||
void dsp_ram_addr_w(UINT32 data);
|
void dsp_ram_addr_w(UINT32 data);
|
||||||
|
UINT32 dsp_prg_ctrl_r(address_space *space);
|
||||||
UINT32 dsp_ram_addr_r(void);
|
UINT32 dsp_ram_addr_r(void);
|
||||||
void dsp_execute_program(address_space *dmaspace);
|
void dsp_execute_program(address_space *dmaspace);
|
||||||
|
|
||||||
|
@ -124,6 +124,7 @@ static transT xfertype;
|
|||||||
static trans32T xfertype32;
|
static trans32T xfertype32;
|
||||||
static UINT32 xfercount, calcsize;
|
static UINT32 xfercount, calcsize;
|
||||||
static UINT32 xferoffs, xfersect, xfersectpos, xfersectnum, xferdnum;
|
static UINT32 xferoffs, xfersect, xfersectpos, xfersectnum, xferdnum;
|
||||||
|
static UINT8 command;
|
||||||
|
|
||||||
static filterT filters[MAX_FILTERS];
|
static filterT filters[MAX_FILTERS];
|
||||||
static filterT *cddevice;
|
static filterT *cddevice;
|
||||||
@ -196,7 +197,7 @@ TIMER_DEVICE_CALLBACK( stv_sector_cb )
|
|||||||
{
|
{
|
||||||
cd_playdata();
|
cd_playdata();
|
||||||
}
|
}
|
||||||
else
|
//else
|
||||||
{
|
{
|
||||||
hirqreg |= SCDQ;
|
hirqreg |= SCDQ;
|
||||||
}
|
}
|
||||||
@ -594,21 +595,32 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data)
|
|||||||
// CDROM_LOG(("WW CR1: %04x\n", data))
|
// CDROM_LOG(("WW CR1: %04x\n", data))
|
||||||
cr1 = data;
|
cr1 = data;
|
||||||
cd_stat &= ~CD_STAT_PERI;
|
cd_stat &= ~CD_STAT_PERI;
|
||||||
|
command |= 1;
|
||||||
break;
|
break;
|
||||||
case 0x001c:
|
case 0x001c:
|
||||||
case 0x001e:
|
case 0x001e:
|
||||||
// CDROM_LOG(("WW CR2: %04x\n", data))
|
// CDROM_LOG(("WW CR2: %04x\n", data))
|
||||||
cr2 = data;
|
cr2 = data;
|
||||||
|
command |= 2;
|
||||||
break;
|
break;
|
||||||
case 0x0020:
|
case 0x0020:
|
||||||
case 0x0022:
|
case 0x0022:
|
||||||
// CDROM_LOG(("WW CR3: %04x\n", data))
|
// CDROM_LOG(("WW CR3: %04x\n", data))
|
||||||
cr3 = data;
|
cr3 = data;
|
||||||
|
command |= 4;
|
||||||
break;
|
break;
|
||||||
case 0x0024:
|
case 0x0024:
|
||||||
case 0x0026:
|
case 0x0026:
|
||||||
// CDROM_LOG(("WW CR4: %04x\n", data))
|
// CDROM_LOG(("WW CR4: %04x\n", data))
|
||||||
cr4 = data;
|
cr4 = data;
|
||||||
|
|
||||||
|
command |= 8;
|
||||||
|
|
||||||
|
if(command != 0xf)
|
||||||
|
return;
|
||||||
|
|
||||||
|
command = 0;
|
||||||
|
|
||||||
if(cr1 != 0 && ((cr1 & 0xff00) != 0x5100) && 1)
|
if(cr1 != 0 && ((cr1 & 0xff00) != 0x5100) && 1)
|
||||||
printf("CD: command exec %04x %04x %04x %04x %04x (stat %04x)\n", hirqreg, cr1, cr2, cr3, cr4, cd_stat);
|
printf("CD: command exec %04x %04x %04x %04x %04x (stat %04x)\n", hirqreg, cr1, cr2, cr3, cr4, cd_stat);
|
||||||
|
|
||||||
@ -2166,8 +2178,14 @@ static void cd_playdata(void)
|
|||||||
if(cdrom_get_track_type(cdrom, cdrom_get_track(cdrom, cd_curfad)) != CD_TRACK_AUDIO)
|
if(cdrom_get_track_type(cdrom, cdrom_get_track(cdrom, cd_curfad)) != CD_TRACK_AUDIO)
|
||||||
cd_read_filtered_sector(cd_curfad);
|
cd_read_filtered_sector(cd_curfad);
|
||||||
|
|
||||||
cd_curfad++;
|
/* TODO: condition is wrong (should be "if partition isn't null") */
|
||||||
fadstoplay--;
|
if(!buffull)
|
||||||
|
{
|
||||||
|
cd_curfad++;
|
||||||
|
fadstoplay--;
|
||||||
|
}
|
||||||
|
//else
|
||||||
|
// hirqreg |= SCDQ;
|
||||||
|
|
||||||
hirqreg |= CSCT;
|
hirqreg |= CSCT;
|
||||||
|
|
||||||
|
@ -4372,7 +4372,8 @@ static void stv_vdp2_check_tilemap(running_machine &machine, bitmap_t *bitmap, c
|
|||||||
/* Choh Makai Mura 0x0055 */
|
/* Choh Makai Mura 0x0055 */
|
||||||
/* Sega Rally 0x0155 */
|
/* Sega Rally 0x0155 */
|
||||||
/* Find Love 0x4400 */
|
/* Find Love 0x4400 */
|
||||||
if(STV_VDP2_SFPRMD & ~0x4555)
|
/* Dragon Ball Z 0x3800 - 0x2c00 */
|
||||||
|
if(STV_VDP2_SFPRMD & ~0x7d55)
|
||||||
popmessage("Special Priority Mode enabled %04x, contact MAMEdev",STV_VDP2_SFPRMD);
|
popmessage("Special Priority Mode enabled %04x, contact MAMEdev",STV_VDP2_SFPRMD);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user