Made numerous corrections to SNES S-DD1 chip emulation, SFA2 and Star Ocean still do not boot [Harmony]

This commit is contained in:
Ryan Holtz 2009-09-05 00:46:41 +00:00
parent 698949fe6a
commit 652a7ca441
2 changed files with 58 additions and 17 deletions

View File

@ -369,7 +369,11 @@ READ8_HANDLER( snes_r_io )
{
if(offset >= 0x4800 && offset < 0x4808)
{
return sdd1_mmio_read(space->machine, offset);
return sdd1_mmio_read(space, (UINT32)offset);
}
if(offset < 0x80)
{
offset += 0x4300;
}
}
@ -735,9 +739,13 @@ WRITE8_HANDLER( snes_w_io )
if((offset >= 0x4300 && offset < 0x4380) ||
(offset >= 0x4800 && offset < 0x4808))
{
sdd1_mmio_write(space->machine, offset, data);
sdd1_mmio_write(space, (UINT32)offset, data);
return;
}
if(offset < 0x80)
{
offset += 0x4300;
}
}
/* offset is from 0x000000 */
@ -1638,14 +1646,18 @@ READ8_HANDLER( snes_r_bank6 )
/* 0xc00000 - 0xffffff */
READ8_HANDLER( snes_r_bank7 )
{
UINT8 value;
UINT8 value = 0;
UINT16 address = offset & 0xffff;
if(snes_has_addon_chip == HAS_SUPERFX && cputag_get_cpu(space->machine, "superfx") != NULL)
if(snes_has_addon_chip == HAS_SDD1)
{
return sdd1_read(space->machine, offset);
}
else if(snes_has_addon_chip == HAS_SUPERFX && cputag_get_cpu(space->machine, "superfx") != NULL)
{
logerror( "snes_r_bank7 hit in Super FX mode, please fix me\n" );
}
if (snes_cart.mode & 5) /* Mode 20 & 22 */
else if (snes_cart.mode & 5) /* Mode 20 & 22 */
{
if (address < 0x8000)
{
@ -1732,6 +1744,7 @@ WRITE8_HANDLER( snes_w_bank4 )
if (snes_has_addon_chip == HAS_SUPERFX && cputag_get_cpu(space->machine, "superfx") != NULL)
{
//printf( "Writing %02x to %08x\n", data, 0x600000 + offset );
snes_ram[0x600000 + offset] = data;
}
else if (snes_cart.mode & 5) /* Mode 20 & 22 */
@ -2311,11 +2324,13 @@ void snes_gdma( const address_space *space, UINT8 channels )
{
if( channels & mask )
{
//printf( "Making a transfer on channel %d\n", i );
/* Find transfer addresses */
abus = (snes_ram[SNES_DMA_BASE + dma + 3] << 8) + snes_ram[SNES_DMA_BASE + dma + 2];
abus_bank = (snes_ram[SNES_DMA_BASE + dma + 4] << 16);
bbus = 0x2100 + snes_ram[SNES_DMA_BASE + dma + 1];
//printf( "Address: %06x\n", abus | abus_bank );
/* Auto increment */
if( snes_ram[SNES_DMA_BASE + dma] & 0x8 )
{
@ -2445,11 +2460,16 @@ void snes_gdma( const address_space *space, UINT8 channels )
#endif
break;
}
/* We're done so write the new abus back to the registers */
snes_ram[SNES_DMA_BASE + dma + 2] = abus & 0xff;
snes_ram[SNES_DMA_BASE + dma + 3] = (abus >> 8) & 0xff;
snes_ram[SNES_DMA_BASE + dma + 5] = 0;
snes_ram[SNES_DMA_BASE + dma + 6] = 0;
snes_w_io(space, SNES_DMA_BASE + dma + 2, abus & 0xff);
snes_w_io(space, SNES_DMA_BASE + dma + 3, (abus >> 8) & 0xff);
snes_w_io(space, SNES_DMA_BASE + dma + 5, 0);
snes_w_io(space, SNES_DMA_BASE + dma + 6, 0);
//snes_ram[SNES_DMA_BASE + dma + 2] = abus & 0xff;
//snes_ram[SNES_DMA_BASE + dma + 3] = (abus >> 8) & 0xff;
//snes_ram[SNES_DMA_BASE + dma + 5] = 0;
//snes_ram[SNES_DMA_BASE + dma + 6] = 0;
}
dma += 0x10;
mask <<= 1;
@ -2468,16 +2488,19 @@ READ8_HANDLER( superfx_r_bank2 )
READ8_HANDLER( superfx_r_bank3 )
{
//printf( "superfx_r_bank3: %08x = %02x\n", 0x600000 + offset, snes_ram[0x600000 + offset] );
return snes_ram[0x600000 + offset];
}
WRITE8_HANDLER( superfx_w_bank1 )
{
printf( "Attempting to write to cart ROM: %08x = %02x\n", offset, data );
// Do nothing; can't write to cart ROM.
}
WRITE8_HANDLER( superfx_w_bank2 )
{
printf( "Attempting to write to cart ROM: %08x = %02x\n", 0x400000 + offset, data );
// Do nothing; can't write to cart ROM.
}

View File

@ -1,4 +1,4 @@
static UINT8 sdd1_read(running_machine* machine, UINT32 addr);
static UINT8 sdd1_read(running_machine* machine, UINT16 addr);
typedef struct //Input Manager
{
@ -411,7 +411,7 @@ static void SDD1_OL_prepareDecomp(SDD1_OL* this, UINT32 first_byte, UINT16 out_l
static void SDD1_OL_launch(SDD1_OL* this)
{
UINT8 i;
UINT8 register1, register2;
UINT8 register1 = 0, register2 = 0;
switch(this->bitplanesInfo)
{
@ -540,26 +540,37 @@ static void sdd1_init(running_machine* machine)
snes_sdd1.sdd1emu = SDD1emu_ctor(machine);
}
static UINT8 sdd1_mmio_read(running_machine* machine, UINT16 addr)
static UINT8 sdd1_mmio_read(const address_space *space, UINT32 addr)
{
addr &= 0xffff;
//printf("SDD1::mmio_read(%04x)\n", addr);
if((addr & 0x4380) == 0x4300)
{
return snes_r_io(space, addr & 0x7f);
}
switch(addr)
{
case 0x4804:
return (snes_sdd1.mmc[0] >> 20) & 7;
break;
case 0x4805:
return (snes_sdd1.mmc[1] >> 20) & 7;
break;
case 0x4806:
return (snes_sdd1.mmc[2] >> 20) & 7;
break;
case 0x4807:
return (snes_sdd1.mmc[3] >> 20) & 7;
break;
}
return 0xff;
}
static void sdd1_mmio_write(running_machine* machine, UINT16 addr, UINT8 data)
static void sdd1_mmio_write(const address_space *space, UINT32 addr, UINT8 data)
{
addr &= 0xffff;
@ -570,19 +581,24 @@ static void sdd1_mmio_write(running_machine* machine, UINT16 addr, UINT8 data)
{
case 2:
snes_sdd1.dma[channel].addr = (snes_sdd1.dma[channel].addr & 0xffff00) + (data << 0);
//printf( "dma[%d].addr = %06x\n", channel, snes_sdd1.dma[channel].addr );
break;
case 3:
snes_sdd1.dma[channel].addr = (snes_sdd1.dma[channel].addr & 0xff00ff) + (data << 8);
//printf( "dma[%d].addr = %06x\n", channel, snes_sdd1.dma[channel].addr );
break;
case 4:
snes_sdd1.dma[channel].addr = (snes_sdd1.dma[channel].addr & 0x00ffff) + (data << 16);
//printf( "dma[%d].addr = %06x\n", channel, snes_sdd1.dma[channel].addr );
break;
case 5:
snes_sdd1.dma[channel].addr = (snes_sdd1.dma[channel].addr & 0xff00) + (data << 0);
snes_sdd1.dma[channel].size = (snes_sdd1.dma[channel].size & 0xff00) + (data << 0);
//printf( "dma[%d].size = %04x\n", channel, snes_sdd1.dma[channel].size );
break;
case 6:
snes_sdd1.dma[channel].addr = (snes_sdd1.dma[channel].addr & 0x00ff) + (data << 8);
snes_sdd1.dma[channel].size = (snes_sdd1.dma[channel].size & 0x00ff) + (data << 8);
//printf( "dma[%d].size = %04x\n", channel, snes_sdd1.dma[channel].size );
break;
}
snes_ram[addr] = data;
@ -613,8 +629,9 @@ static void sdd1_mmio_write(running_machine* machine, UINT16 addr, UINT8 data)
}
}
static UINT8 sdd1_read(running_machine* machine, UINT32 addr)
static UINT8 sdd1_read(running_machine* machine, UINT16 addr)
{
//printf( "sdd1.read(%06x)\n", addr );
if(snes_sdd1.sdd1_enable & snes_sdd1.xfer_enable)
{
// at least one channel has S-DD1 decompression enabled...
@ -659,7 +676,8 @@ static UINT8 sdd1_read(running_machine* machine, UINT32 addr)
} // channel loop
} // S-DD1 decompressor enabled
return memory_read_byte(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), snes_sdd1.mmc[(addr >> 20) & 3] + (addr & 0x0fffff));
//printf( "returning a generic memory read from %06x\n", 0xc00000 + snes_sdd1.mmc[(addr >> 20) & 3] + (addr & 0x0fffff) );
return snes_ram[0xc00000 + snes_sdd1.mmc[(addr >> 20) & 3] + (addr & 0x0fffff)];
}
static void sdd1_reset(running_machine *machine)