Also reset the YM2610 when resetting the Z80, seems to avoid some lost sounds in neocdz crsword2 + misc cleanups (nw)

This commit is contained in:
David Haywood 2012-12-07 14:06:12 +00:00
parent 032cb7cc46
commit 44dcd0d39c
4 changed files with 109 additions and 134 deletions

View file

@ -138,8 +138,6 @@
</part>
</software>
<!-- disable most things for now, until I actually get it working -->
<!--
<software name="2020bb">
<description>2020 Super Baseball (1995)(SNK)(JP-US)[!]</description>
<year>199?</year>
@ -1160,6 +1158,4 @@
</part>
</software>
-->
</softwarelist>

View file

@ -42,6 +42,9 @@ public:
m_has_audio_banking = true;
m_is_mvs = true;
m_is_cartsys = true;
m_has_sprite_bus = true;
m_has_text_bus = true;
m_has_ymrom_bus = true;
}
/* memory pointers */
@ -231,6 +234,11 @@ public:
bool m_has_audio_banking; // does the system use Audio Banking (the NeoCD doesn't?)
bool m_is_mvs; // is the system an MVS (watchdog, SRAM etc.)
bool m_is_cartsys; // does the system use Cartridges? (MVS and AES)
// the NeoCD can steal the bus during uploads
bool m_has_sprite_bus;
bool m_has_text_bus;
bool m_has_ymrom_bus;
};

View file

@ -921,9 +921,9 @@ UINT32 neogeo_state::screen_update_neogeo(screen_device &screen, bitmap_rgb32 &b
/* fill with background color first */
bitmap.fill(m_pens[0x0fff], cliprect);
draw_sprites(machine(), bitmap, cliprect.min_y);
if (m_has_sprite_bus) draw_sprites(machine(), bitmap, cliprect.min_y);
draw_fixed_layer(machine(), bitmap, cliprect.min_y);
if (m_has_text_bus) draw_fixed_layer(machine(), bitmap, cliprect.min_y);
return 0;
}

View file

@ -125,8 +125,8 @@ public:
DECLARE_WRITE16_MEMBER(neocd_memcard_w);
DECLARE_READ16_MEMBER(neocd_control_r);
DECLARE_WRITE16_MEMBER(neocd_control_w);
DECLARE_READ16_MEMBER(neocd_transfer_r);
DECLARE_WRITE16_MEMBER(neocd_transfer_w);
DECLARE_READ8_MEMBER(neocd_transfer_r);
DECLARE_WRITE8_MEMBER(neocd_transfer_w);
DECLARE_READ16_MEMBER(aes_in0_r);
DECLARE_READ16_MEMBER(aes_in1_r);
DECLARE_READ16_MEMBER(aes_in2_r);
@ -271,78 +271,6 @@ static MEMCARD_HANDLER( neogeo_aes )
UINT8 ng_aes_state::neogeoReadTransfer(UINT32 sekAddress, int is_byte_transfer)
{
// if ((sekAddress & 0x0FFFFF) < 16)
// printf(PRINT_NORMAL, _T(" - NGCD port 0x%06X read (byte, PC: 0x%06X)\n"), sekAddress, SekGetPC(-1));
sekAddress ^= 1;
switch (nActiveTransferArea) {
case 0: // Sprites
return NeoSpriteRAM[nSpriteTransferBank + (sekAddress & 0x0FFFFF)];
break;
case 1: // ADPCM
return YM2610ADPCMAROM[nADPCMTransferBank + ((sekAddress & 0x0FFFFF) >> 1)];
break;
case 4: // Z80
if ((sekAddress & 0xfffff) >= 0x20000) break;
return NeoZ80ROMActive[(sekAddress & 0x1FFFF) >> 1];
break;
case 5: // Text
return NeoTextRAM[(sekAddress & 0x3FFFF) >> 1];
break;
}
return ~0;
}
void ng_aes_state::neogeoWriteTransfer(UINT32 sekAddress, UINT8 byteValue, int is_byte_transfer)
{
// if ((sekAddress & 0x0FFFFF) < 16)
// bprintf(PRINT_NORMAL, _T(" - Transfer: 0x%06X -> 0x%02X (PC: 0x%06X)\n"), sekAddress, byteValue, SekGetPC(-1));
if (!nTransferWriteEnable) {
// return;
}
int address;
// why, is our DMA broken?
sekAddress ^= 1;
switch (nActiveTransferArea) {
case 0: // Sprites
address = (nSpriteTransferBank + (sekAddress & 0x0FFFFF));
if ((address&3)==0) NeoSpriteRAM[address] = byteValue;
if ((address&3)==1) NeoSpriteRAM[address^3] = byteValue;
if ((address&3)==2) NeoSpriteRAM[address^3] = byteValue;
if ((address&3)==3) NeoSpriteRAM[address] = byteValue;
// NeoCDOBJBankUpdate[nSpriteTransferBank >> 20] = true;
break;
case 1: // ADPCM
YM2610ADPCMAROM[nADPCMTransferBank + ((sekAddress & 0x0FFFFF) >> 1)] = byteValue;
break;
case 4: // Z80
if ((sekAddress & 0xfffff) >= 0x20000) break;
if (!is_byte_transfer)
{
if (((sekAddress & 0xfffff) >= 0x20000) || nNeoCDZ80ProgWriteWordCancelHack) break;
if (sekAddress == 0xe1fdf2) nNeoCDZ80ProgWriteWordCancelHack = 1;
}
NeoZ80ROMActive[(sekAddress & 0x1FFFF) >> 1] = byteValue;
break;
case 5: // Text
NeoTextRAM[(sekAddress & 0x3FFFF) >> 1] = byteValue;
// NeoUpdateTextOne((sekAddress & 0x3FFFF) >> 1, byteValue);
break;
}
}
@ -449,9 +377,11 @@ WRITE16_MEMBER(ng_aes_state::neocd_control_w)
case 0x0120:
// bprintf(PRINT_NORMAL, _T(" - NGCD OBJ BUSREQ -> 1 (PC: 0x%06X)\n"), SekGetPC(-1));
m_has_sprite_bus = false;
break;
case 0x0122:
// bprintf(PRINT_NORMAL, _T(" - NGCD PCM BUSREQ -> 1 (PC: 0x%06X) %x\n"), SekGetPC(-1), byteValue);
m_has_ymrom_bus = false;
break;
case 0x0126:
// bprintf(PRINT_NORMAL, _T(" - NGCD Z80 BUSREQ -> 1 (PC: 0x%06X)\n"), SekGetPC(-1));
@ -460,14 +390,16 @@ WRITE16_MEMBER(ng_aes_state::neocd_control_w)
break;
case 0x0128:
// bprintf(PRINT_NORMAL, _T(" - NGCD FIX BUSREQ -> 1 (PC: 0x%06X)\n"), SekGetPC(-1));
m_has_text_bus = false;
break;
case 0x0140:
// bprintf(PRINT_NORMAL, _T(" - NGCD OBJ BUSREQ -> 0 (PC: 0x%06X)\n"), SekGetPC(-1));
m_has_sprite_bus = true;
video_reset();
break;
case 0x0142:
// bprintf(PRINT_NORMAL, _T(" - NGCD PCM BUSREQ -> 0 (PC: 0x%06X)\n"), SekGetPC(-1));
m_has_ymrom_bus = true;
break;
case 0x0146:
// bprintf(PRINT_NORMAL, _T(" - NGCD Z80 BUSREQ -> 0 (PC: 0x%06X)\n"), SekGetPC(-1));
@ -476,6 +408,7 @@ WRITE16_MEMBER(ng_aes_state::neocd_control_w)
break;
case 0x0148:
// bprintf(PRINT_NORMAL, _T(" - NGCD FIX BUSREQ -> 0 (PC: 0x%06X)\n"), SekGetPC(-1));
m_has_text_bus = true;
video_reset();
break;
@ -524,7 +457,11 @@ WRITE16_MEMBER(ng_aes_state::neocd_control_w)
}
case 0x0182: {
// printf("blah %02x\n", byteValue);
if (byteValue == 0x00) m_audiocpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
if (byteValue == 0x00)
{
machine().device("ymsnd")->reset();
m_audiocpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
}
else m_audiocpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
break;
@ -553,45 +490,71 @@ WRITE16_MEMBER(ng_aes_state::neocd_control_w)
*/
READ16_MEMBER(ng_aes_state::neocd_transfer_r)
READ8_MEMBER(ng_aes_state::neocd_transfer_r)
{
int is_byte_transfer = 0;
if (mem_mask != 0xffff) is_byte_transfer = 1;
UINT32 sekAddress = 0xe00000+ (offset);
int address;
sekAddress ^= 1;
UINT16 ret = 0x0000;
switch (nActiveTransferArea) {
case 0: // Sprites
address = (nSpriteTransferBank + (sekAddress & 0x0FFFFF));
// address is swizzled a bit due to out sprite decoding
if ((address&3)==0) return NeoSpriteRAM[address];
if ((address&3)==1) return NeoSpriteRAM[address^3];
if ((address&3)==2) return NeoSpriteRAM[address^3];
if ((address&3)==3) return NeoSpriteRAM[address];
if (mem_mask & 0x00ff)
{
ret |= neogeoReadTransfer(0xe00000+ (offset*2)+1, is_byte_transfer) & 0xff;
}
if (mem_mask & 0xff00)
{
ret |= neogeoReadTransfer(0xe00000+ (offset*2), is_byte_transfer) << 8;
return NeoSpriteRAM[nSpriteTransferBank + (sekAddress & 0x0FFFFF)];
case 1: // ADPCM
return YM2610ADPCMAROM[nADPCMTransferBank + ((sekAddress & 0x0FFFFF) >> 1)];
case 4: // Z80
if ((sekAddress & 0xfffff) >= 0x20000) return ~0;
return NeoZ80ROMActive[(sekAddress & 0x1FFFF) >> 1];
case 5: // Text
return NeoTextRAM[(sekAddress & 0x3FFFF) >> 1];
}
return ret;
return ~0;
}
WRITE16_MEMBER(ng_aes_state::neocd_transfer_w)
WRITE8_MEMBER(ng_aes_state::neocd_transfer_w)
{
int is_byte_transfer = 0;
if (mem_mask != 0xffff) is_byte_transfer = 1;
UINT8 byteValue = data;
UINT32 sekAddress = 0xe00000+ (offset);
if (mem_mask & 0xff00)
{
neogeoWriteTransfer(0xe00000+ (offset*2), data>>8, is_byte_transfer);
if (!nTransferWriteEnable) {
// return;
}
int address;
if (mem_mask & 0x00ff)
{
neogeoWriteTransfer(0xe00000+ (offset*2)+1, data&0xff, is_byte_transfer);
sekAddress ^= 1;
switch (nActiveTransferArea) {
case 0: // Sprites
address = (nSpriteTransferBank + (sekAddress & 0x0FFFFF));
// address is swizzled a bit due to out sprite decoding
if ((address&3)==0) NeoSpriteRAM[address] = byteValue;
if ((address&3)==1) NeoSpriteRAM[address^3] = byteValue;
if ((address&3)==2) NeoSpriteRAM[address^3] = byteValue;
if ((address&3)==3) NeoSpriteRAM[address] = byteValue;
break;
case 1: // ADPCM
YM2610ADPCMAROM[nADPCMTransferBank + ((sekAddress & 0x0FFFFF) >> 1)] = byteValue;
break;
case 4: // Z80
if ((sekAddress & 0xfffff) >= 0x20000) break;
NeoZ80ROMActive[(sekAddress & 0x1FFFF) >> 1] = byteValue;
break;
case 5: // Text
NeoTextRAM[(sekAddress & 0x3FFFF) >> 1] = byteValue;
break;
}
}
@ -1236,7 +1199,7 @@ static ADDRESS_MAP_START( neocd_main_map, AS_PROGRAM, 16, ng_aes_state )
AM_RANGE(0x800000, 0x803fff) AM_READWRITE(neocd_memcard_r, neocd_memcard_w)
AM_RANGE(0xc00000, 0xcfffff) AM_ROMBANK(NEOGEO_BANK_BIOS)
AM_RANGE(0xd00000, 0xd0ffff) AM_MIRROR(0x0f0000) AM_READ(neogeo_unmapped_r) AM_SHARE("save_ram") //AM_RAM_WRITE(save_ram_w)
AM_RANGE(0xe00000, 0xefffff) AM_READWRITE(neocd_transfer_r,neocd_transfer_w)
AM_RANGE(0xe00000, 0xefffff) AM_READWRITE8(neocd_transfer_r,neocd_transfer_w, 0xffff)
AM_RANGE(0xf00000, 0xfeffff) AM_READ(neogeo_unmapped_r)
AM_RANGE(0xff0000, 0xff01ff) AM_READWRITE(neocd_control_r, neocd_control_w) // CDROM / DMA
AM_RANGE(0xff0200, 0xffffff) AM_READ(neogeo_unmapped_r)
@ -1634,48 +1597,56 @@ ROM_START( neocd )
ROM_SYSTEM_BIOS( 1, "front", "Front loading NeoGeo CD" )
ROMX_LOAD( "front-sp1.bin", 0x00000, 0x80000, CRC(cac62307) SHA1(53bc1f283cdf00fa2efbb79f2e36d4c8038d743a), ROM_GROUPWORD | ROM_REVERSE | ROM_BIOS(2))
ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASEFF )
ROM_REGION( 0x100000, "audiobios", ROMREGION_ERASEFF )
ROM_REGION( 0x100000, "ymsnd", ROMREGION_ERASEFF )
/* 1MB of Sound RAM */
ROM_REGION( 0x90000, "audiocpu", ROMREGION_ERASEFF )
/* 64KB of Z80 RAM */
ROM_REGION( 0x20000, "zoomy", 0 )
ROM_LOAD( "000-lo.lo", 0x00000, 0x20000, CRC(5a86cff2) SHA1(5992277debadeb64d1c1c64b0a92d9293eaf7e4a) )
ROM_REGION( 0x20000, "fixedbios", ROMREGION_ERASEFF )
ROM_REGION( 0x20000, "fixed", ROMREGION_ERASEFF )
ROM_REGION( 0x400000, "ymsnd", ROMREGION_ERASEFF )
// NO_DELTAT_REGION
ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASE00 )
/* 2MB of 68K RAM */
ROM_REGION( 0x400000, "sprites", ROMREGION_ERASEFF )
/* 4MB of Sprite Tile RAM */
ROM_REGION( 0x20000, "fixed", ROMREGION_ERASEFF )
/* 128KB of Text Tile RAM */
ROM_REGION( 0x20000, "audiobios", ROMREGION_ERASEFF )
ROM_REGION( 0x20000, "fixedbios", ROMREGION_ERASEFF )
ROM_REGION( 0x20000, "zoomy", 0 )
ROM_LOAD( "000-lo.lo", 0x00000, 0x20000, CRC(5a86cff2) SHA1(5992277debadeb64d1c1c64b0a92d9293eaf7e4a) )
ROM_END
ROM_START( neocdz )
ROM_REGION16_BE( 0x100000, "mainbios", 0 )
ROM_LOAD16_WORD_SWAP( "neocd.bin", 0x00000, 0x80000, CRC(df9de490) SHA1(7bb26d1e5d1e930515219cb18bcde5b7b23e2eda) )
ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASEFF )
ROM_REGION( 0x20000, "audiobios", ROMREGION_ERASEFF )
ROM_REGION( 0x100000, "ymsnd", ROMREGION_ERASEFF )
/* 1MB of Sound RAM */
ROM_REGION( 0x90000, "audiocpu", ROMREGION_ERASEFF )
/* 64KB of Z80 RAM */
ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASE00 )
/* 2MB of 68K RAM */
ROM_REGION( 0x400000, "sprites", ROMREGION_ERASEFF )
/* 4MB of Sprite Tile RAM */
ROM_REGION( 0x20000, "fixed", ROMREGION_ERASEFF )
/* 128KB of Text Tile RAM */
ROM_REGION( 0x20000, "audiobios", ROMREGION_ERASEFF )
ROM_REGION( 0x20000, "fixedbios", ROMREGION_ERASEFF )
ROM_REGION( 0x20000, "zoomy", 0 )
ROM_LOAD( "000-lo.lo", 0x00000, 0x20000, CRC(5a86cff2) SHA1(5992277debadeb64d1c1c64b0a92d9293eaf7e4a) )
ROM_REGION( 0x20000, "fixedbios", ROMREGION_ERASEFF )
ROM_REGION( 0x20000, "fixed", ROMREGION_ERASEFF )
ROM_REGION( 0x400000, "ymsnd", ROMREGION_ERASEFF )
// NO_DELTAT_REGION
ROM_REGION( 0x400000, "sprites", ROMREGION_ERASEFF )
ROM_END
/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */