summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Scott Stone <tafoid@users.noreply.github.com>2012-11-17 03:59:32 +0000
committer Scott Stone <tafoid@users.noreply.github.com>2012-11-17 03:59:32 +0000
commit27c8616807545fa6674f259818c94b7649fd1466 (patch)
tree4684a57b8e66c90f87cc234c0f31a07535ed5257
parent559ad133ce356edd1c6f96b679410c0957495bdc (diff)
[MESS] Started wrapping some neocd functions in mame code, now sending valid cd commands and some sets are now booting on neocdz. From Haze (nw)
-rw-r--r--hash/neocd.xml243
-rw-r--r--src/mess/drivers/ng_aes.c575
2 files changed, 436 insertions, 382 deletions
diff --git a/hash/neocd.xml b/hash/neocd.xml
index cb622c2bf83..5feea9f68a0 100644
--- a/hash/neocd.xml
+++ b/hash/neocd.xml
@@ -15,7 +15,129 @@
</diskarea>
</part>
</software>
-
+
+ <software name="lbowling">
+ <description>League Bowling (1994)(SNK)(JP-US)[!]</description>
+ <year>199?</year>
+ <publisher>SNK</publisher>
+ <part name="cdrom" interface="neocd_cdrom">
+ <diskarea name="cdrom">
+ <disk name="league bowling (1994)(snk)(jp-us)[!]" sha1="ca657fa76e16ae70745a6938770677c523daa041"/>
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="crsword2">
+ <description>Crossed Swords II (1995)(ADK)(JP)[!]</description>
+ <year>199?</year>
+ <publisher>SNK</publisher>
+ <part name="cdrom" interface="neocd_cdrom">
+ <diskarea name="cdrom">
+ <disk name="crossed swords ii (1995)(adk)(jp)[!]" sha1="dc65e9a937bfc912c3fdaff0b8200bfd4df4c34c"/>
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="zintrick">
+ <description>Oshidashi Zintrick (1996)(ADK)(JP)[!][Zintrick]</description>
+ <year>199?</year>
+ <publisher>SNK</publisher>
+ <part name="cdrom" interface="neocd_cdrom">
+ <diskarea name="cdrom">
+ <disk name="oshidashi zintrick (1996)(adk)(jp)[!][zintrick]" sha1="46ab081316ffc6d5cca76fee679e80270fe1a8ab"/>
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="fromanc2">
+ <description>Idol Mahjong Final Romance 2 (1995)(Video System)(JP)[!]</description>
+ <year>199?</year>
+ <publisher>SNK</publisher>
+ <part name="cdrom" interface="neocd_cdrom">
+ <diskarea name="cdrom">
+ <disk name="idol mahjong final romance 2 (1995)(video system)(jp)[!]" sha1="63c2b6c8cccfbcba9c41efb61954db9885ff9869"/>
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="lasthope">
+ <description>Last Hope (DE) [NGDT CD-300J] [N.A.]</description>
+ <year>199?</year>
+ <publisher>SNK</publisher>
+ <part name="cdrom" interface="neocd_cdrom">
+ <diskarea name="cdrom">
+ <disk name="cd-rom [ngdt cd-300j] [v2007-10-03] [!-]" sha1="4cf60613098531b49c447a2b223aeb49a6395fd2"/>
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="ironclad">
+ <description>Choutetsu Brikin'ger (1996)(Saurus)(JP)[!][Ironclad]</description>
+ <year>199?</year>
+ <publisher>SNK</publisher>
+ <part name="cdrom" interface="neocd_cdrom">
+ <diskarea name="cdrom">
+ <disk name="choutetsu brikin'ger (1996)(saurus)(jp)[!][ironclad]" sha1="4d518370686853c727eb300a91c0f070c3333225"/>
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="ncdspec">
+ <description>Neo Geo CD Special (1996)(SNK)(JP)[!]</description>
+ <year>199?</year>
+ <publisher>SNK</publisher>
+ <part name="cdrom" interface="neocd_cdrom">
+ <diskarea name="cdrom">
+ <disk name="neo geo cd special (1996)(snk)(jp)[!]" sha1="20ceb3e2cb21c6ccad99e0e21dc990affb4ecc39"/>
+ </diskarea>
+ </part>
+ </software>
+
+
+ <software name="kof96col">
+ <description>King of Fighters '96 NEOGEO Collection, The (1997)(SNK)(JP)[!][NGCD-229 MT B07]</description>
+ <year>199?</year>
+ <publisher>SNK</publisher>
+ <part name="cdrom" interface="neocd_cdrom">
+ <diskarea name="cdrom">
+ <disk name="king of fighters '96 neogeo collection, the (1997)(snk)(jp)[!][ngcd-229 mt b07]" sha1="4f0fa12fc1e6b77e08fbbfa84366dbb04ca09f32"/>
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="trally">
+ <description>Rally Chase (1994)(ADK)(JP)[!]</description>
+ <year>199?</year>
+ <publisher>SNK</publisher>
+ <part name="cdrom" interface="neocd_cdrom">
+ <diskarea name="cdrom">
+ <disk name="rally chase (1994)(adk)(jp)[!]" sha1="07a394aaf9937206f4bd61e2c9f46afe1a43aecb"/>
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="adkworld">
+ <description>ADK World (1995)(ADK)(JP)[!]</description>
+ <year>199?</year>
+ <publisher>SNK</publisher>
+ <part name="cdrom" interface="neocd_cdrom">
+ <diskarea name="cdrom">
+ <disk name="adk world (1995)(adk)(jp)[!]" sha1="c99032d62ce5bf6be9b1dc37c70ef45a4dc37180"/>
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="samsrpg">
+ <description>Shinsetsu Samurai Spirits - Bushidohretsuden (1997)(SNK)(JP)[!][NGCD-0850 MT A01]</description>
+ <year>199?</year>
+ <publisher>SNK</publisher>
+ <part name="cdrom" interface="neocd_cdrom">
+ <diskarea name="cdrom">
+ <disk name="shinsetsu samurai spirits - bushidohretsuden (1997)(snk)(jp)[!][ngcd-0850 mt a01]" sha1="5df33f9533c2bc55c3354790bcafb1350039b438"/>
+ </diskarea>
+ </part>
+ </software>
+
<!-- disable most things for now, until I actually get it working -->
<!--
<software name="2020bb">
@@ -40,17 +162,6 @@
</part>
</software>
- <software name="adkworld">
- <description>ADK World (1995)(ADK)(JP)[!]</description>
- <year>199?</year>
- <publisher>SNK</publisher>
- <part name="cdrom" interface="neocd_cdrom">
- <diskarea name="cdrom">
- <disk name="adk world (1995)(adk)(jp)[!]" sha1="c99032d62ce5bf6be9b1dc37c70ef45a4dc37180"/>
- </diskarea>
- </part>
- </software>
-
<software name="sonicwi2">
<description>Aero Fighters 2 (1994)(SNK)(JP-US)[!][Sonic Wings 2]</description>
<year>199?</year>
@@ -200,32 +311,12 @@
<publisher>SNK</publisher>
<part name="cdrom" interface="neocd_cdrom">
<diskarea name="cdrom">
- <disk name="cd-rom [ngcd-500] [v2011-12-22] [!-].chd" sha1="95c9e0b42410ac4e384529b3c067cb55e9b0e537"/>
+ <disk name="cd-rom [ngcd-500] [v2011-12-22] [!-]" sha1="95c9e0b42410ac4e384529b3c067cb55e9b0e537"/>
</diskarea>
</part>
</software>
- <software name="lasthope">
- <description>Last Hope (DE) [NGDT CD-300J] [N.A.]</description>
- <year>199?</year>
- <publisher>SNK</publisher>
- <part name="cdrom" interface="neocd_cdrom">
- <diskarea name="cdrom">
- <disk name="cd-rom [ngdt cd-300j] [v2007-10-03] [!-].chd" sha1="4cf60613098531b49c447a2b223aeb49a6395fd2"/>
- </diskarea>
- </part>
- </software>
- <software name="ironclad">
- <description>Choutetsu Brikin'ger (1996)(Saurus)(JP)[!][Ironclad]</description>
- <year>199?</year>
- <publisher>SNK</publisher>
- <part name="cdrom" interface="neocd_cdrom">
- <diskarea name="cdrom">
- <disk name="choutetsu brikin'ger (1996)(saurus)(jp)[!][ironclad]" sha1="4d518370686853c727eb300a91c0f070c3333225"/>
- </diskarea>
- </part>
- </software>
<software name="crsword">
<description>Crossed Swords (1994)(ADK)(JP)[!]</description>
@@ -238,16 +329,7 @@
</part>
</software>
- <software name="crsword2">
- <description>Crossed Swords II (1995)(ADK)(JP)[!]</description>
- <year>199?</year>
- <publisher>SNK</publisher>
- <part name="cdrom" interface="neocd_cdrom">
- <diskarea name="cdrom">
- <disk name="crossed swords ii (1995)(adk)(jp)[!]" sha1="dc65e9a937bfc912c3fdaff0b8200bfd4df4c34c"/>
- </diskarea>
- </part>
- </software>
+
<software name="cyberlip">
<description>Cyber-Lip (1995)(SNK)(JP-US)[!]</description>
@@ -370,16 +452,6 @@
</part>
</software>
- <software name="fromanc2">
- <description>Idol Mahjong Final Romance 2 (1995)(Video System)(JP)[!]</description>
- <year>199?</year>
- <publisher>SNK</publisher>
- <part name="cdrom" interface="neocd_cdrom">
- <diskarea name="cdrom">
- <disk name="idol mahjong final romance 2 (1995)(video system)(jp)[!]" sha1="63c2b6c8cccfbcba9c41efb61954db9885ff9869"/>
- </diskarea>
- </part>
- </software>
<software name="janshin">
<description>Janshin Densetsu - Quest of the Jongmaster (1995)(SNK)(JP)[!]</description>
@@ -447,17 +519,6 @@
</part>
</software>
- <software name="kof96col">
- <description>King of Fighters '96 NEOGEO Collection, The (1997)(SNK)(JP)[!][NGCD-229 MT B07]</description>
- <year>199?</year>
- <publisher>SNK</publisher>
- <part name="cdrom" interface="neocd_cdrom">
- <diskarea name="cdrom">
- <disk name="king of fighters '96 neogeo collection, the (1997)(snk)(jp)[!][ngcd-229 mt b07]" sha1="4f0fa12fc1e6b77e08fbbfa84366dbb04ca09f32"/>
- </diskarea>
- </part>
- </software>
-
<software name="kof96">
<description>King of Fighters '96, The (1996)(SNK)(JP)[!][NGCD-214 MT A02+A03]</description>
<year>199?</year>
@@ -546,17 +607,6 @@
</part>
</software>
- <software name="lbowling">
- <description>League Bowling (1994)(SNK)(JP-US)[!]</description>
- <year>199?</year>
- <publisher>SNK</publisher>
- <part name="cdrom" interface="neocd_cdrom">
- <diskarea name="cdrom">
- <disk name="league bowling (1994)(snk)(jp-us)[!]" sha1="ca657fa76e16ae70745a6938770677c523daa041"/>
- </diskarea>
- </part>
- </software>
-
<software name="magdrop2">
<description>Magical Drop 2 (1996)(Data East)(JP)[!]</description>
<year>199?</year>
@@ -645,16 +695,7 @@
</part>
</software>
- <software name="ncdspec">
- <description>Neo Geo CD Special (1996)(SNK)(JP)[!]</description>
- <year>199?</year>
- <publisher>SNK</publisher>
- <part name="cdrom" interface="neocd_cdrom">
- <diskarea name="cdrom">
- <disk name="neo geo cd special (1996)(snk)(jp)[!]" sha1="20ceb3e2cb21c6ccad99e0e21dc990affb4ecc39"/>
- </diskarea>
- </part>
- </software>
+
<software name="turfmast">
<description>Neo Turf Masters (1996)(SNK)(JP)[!][Big Tournament Golf]</description>
@@ -700,16 +741,6 @@
</part>
</software>
- <software name="zintrick">
- <description>Oshidashi Zintrick (1996)(ADK)(JP)[!][Zintrick]</description>
- <year>199?</year>
- <publisher>SNK</publisher>
- <part name="cdrom" interface="neocd_cdrom">
- <diskarea name="cdrom">
- <disk name="oshidashi zintrick (1996)(adk)(jp)[!][zintrick]" sha1="46ab081316ffc6d5cca76fee679e80270fe1a8ab"/>
- </diskarea>
- </part>
- </software>
<software name="overtop">
<description>OverTop (1996)(ADK)(JP)[!]</description>
@@ -777,17 +808,6 @@
</part>
</software>
- <software name="trally">
- <description>Rally Chase (1994)(ADK)(JP)[!]</description>
- <year>199?</year>
- <publisher>SNK</publisher>
- <part name="cdrom" interface="neocd_cdrom">
- <diskarea name="cdrom">
- <disk name="rally chase (1994)(adk)(jp)[!]" sha1="07a394aaf9937206f4bd61e2c9f46afe1a43aecb"/>
- </diskarea>
- </part>
- </software>
-
<software name="rbff1">
<description>Real Bout Fatal Fury (1996)(SNK)(JP-US)[!][Real Bout Garou Densetsu][NGCD-095 MT B06+B08, NGCD-095E]</description>
<year>199?</year>
@@ -931,17 +951,6 @@
</part>
</software>
- <software name="samsrpg">
- <description>Shinsetsu Samurai Spirits - Bushidohretsuden (1997)(SNK)(JP)[!][NGCD-0850 MT A01]</description>
- <year>199?</year>
- <publisher>SNK</publisher>
- <part name="cdrom" interface="neocd_cdrom">
- <diskarea name="cdrom">
- <disk name="shinsetsu samurai spirits - bushidohretsuden (1997)(snk)(jp)[!][ngcd-0850 mt a01]" sha1="5df33f9533c2bc55c3354790bcafb1350039b438"/>
- </diskarea>
- </part>
- </software>
-
<software name="mosyougi">
<description>Shougi no Tatsujin - Master of Syougi (1995)(ADK)(JP)[!]</description>
<year>199?</year>
diff --git a/src/mess/drivers/ng_aes.c b/src/mess/drivers/ng_aes.c
index 1356ac4eb96..07bb3bfa543 100644
--- a/src/mess/drivers/ng_aes.c
+++ b/src/mess/drivers/ng_aes.c
@@ -38,6 +38,15 @@
#include "imagedev/chd_cd.h"
#include "sound/cdda.h"
+struct neocd_t
+{
+ cdrom_file *cd;
+ const cdrom_toc *toc;
+ UINT32 current_frame;
+};
+
+static neocd_t neocd;
+
extern const char layout_neogeo[];
static const char *audio_banks[4] =
@@ -67,18 +76,17 @@ struct neocd_ctrl_t
#define SEK_IRQSTATUS_AUTO (0x2000)
#define SEK_IRQSTATUS_ACK (0x1000)
-static INT32 nNeoCDIRQVector = 0;
-static INT32 nNeoCDIRQVectorAck = 0;
+static IRQ_CALLBACK(neocd_int_callback);
/* Stubs for various functions called by the FBA code, replace with MAME specifics later */
#define MAX_SLOT (8)
UINT8 *NeoSpriteRAM, *NeoTextRAM;
-UINT8* NeoSpriteROM[MAX_SLOT];
-UINT8* NeoTextROM[MAX_SLOT];
+//UINT8* NeoSpriteROM[MAX_SLOT];
+//UINT8* NeoTextROM[MAX_SLOT];
UINT8* YM2610ADPCMAROM[MAX_SLOT];
UINT8* NeoZ80ROMActive;
UINT32 nNeoActiveSlot;
-UINT8 NeoSystem;
+UINT8 NeoSystem = 6;
INT32 nNeoCDZ80ProgWriteWordCancelHack = 0;
enum CDEmuStatusValue { idle = 0, reading, playing, paused, seeking, fastforward, fastreverse };
@@ -86,65 +94,154 @@ CDEmuStatusValue CDEmuStatus;
static inline CDEmuStatusValue CDEmuGetStatus()
{
+ printf("CDEmuGetStatus\n");
return CDEmuStatus;
}
-static UINT8* CDEmuReadQChannel()
+static UINT8* CDEmuReadQChannel(int NeoCDSectorLBA)
{
- return NULL;
+ printf("CDEmuReadQChannel\n");
+ static unsigned char QChannelData[8];
+
+ if(neocd.cd == NULL) // no cd is there, bail out
+ return QChannelData;
+
+// NeoCDSectorLBA
+ switch (CDEmuStatus) {
+ case reading:
+ case playing: {
+
+ UINT32 msf;
+ msf = lba_to_msf_alt(NeoCDSectorLBA+150);
+
+
+
+ QChannelData[0] = cdrom_get_track(neocd.cd, NeoCDSectorLBA);
+
+ QChannelData[1] = (msf >> 16)&0xff;
+ QChannelData[2] = (msf >> 8)&0xff;
+ QChannelData[3] = (msf >> 0)&0xff;
+
+ int elapsedlba;
+ elapsedlba = NeoCDSectorLBA - neocd.toc->tracks[ cdrom_get_track(neocd.cd, NeoCDSectorLBA) ].physframeofs;
+ msf = lba_to_msf_alt (elapsedlba);
+
+ QChannelData[4] = (msf >> 16)&0xff;
+ QChannelData[5] = (msf >> 8)&0xff;
+ QChannelData[6] = (msf >> 0)&0xff;
+
+ if (QChannelData[0]==1)
+ QChannelData[7] = 0x4;
+ else
+ QChannelData[7] = 0x0;
+
+ break;
+ }
+ case paused: {
+ break;
+ }
+ default: {
+ memset(QChannelData, 0, sizeof(QChannelData));
+ }
+ }
+
+ return QChannelData;
}
static UINT8* CDEmuReadTOC(INT32 track)
{
- return NULL;
+ printf("CDEmuReadTOC\n");
+
+ static unsigned char TOCEntry[4];
+
+ if(neocd.cd == NULL)
+ return TOCEntry;
+
+
+ if (track == -1) {
+ printf("get first/last track nums\n");
+ TOCEntry[0] = 1;
+ TOCEntry[1] = cdrom_get_last_track(neocd.cd);
+ TOCEntry[2] = 0;
+ TOCEntry[3] = 0;
+
+ return TOCEntry;
+ }
+ else if (track == -2) {
+ printf("get disc length\n");
+
+ UINT32 startlba = (neocd.toc->tracks[cdrom_get_last_track(neocd.cd)].physframeofs);
+ UINT32 startmsf = lba_to_msf_alt( startlba );
+
+
+ TOCEntry[0] = (startmsf >> 16)&0xff;
+ TOCEntry[1] = (startmsf >> 8)&0xff;
+ TOCEntry[2] = (startmsf >> 0)&0xff;
+
+ TOCEntry[3] = 0;
+
+ return TOCEntry;
+ }
+ else
+ {
+ printf("get track address\n");
+
+ int last_track = cdrom_get_last_track(neocd.cd);
+
+ if (track > last_track)
+ track = last_track;
+
+ if (track < 1)
+ track = 1;
+
+ UINT32 startlba = (neocd.toc->tracks[track-1].physframeofs);
+ UINT32 startmsf = lba_to_msf_alt( startlba+150 );
+
+ TOCEntry[0] = (startmsf >> 16)&0xff;
+ TOCEntry[1] = (startmsf >> 8)&0xff;
+ TOCEntry[2] = (startmsf >> 0)&0xff;
+ TOCEntry[3] = track % 10;;
+ }
+
+ return TOCEntry;
+
}
static void CDEmuStartRead()
{
+ printf("CDEmuStartRead\n");
CDEmuStatus = seeking;
}
static void CDEmuPause()
{
+ printf("CDEmuPause\n");
CDEmuStatus = paused;
}
static INT32 CDEmuStop()
{
+ printf("CDEmuStop\n");
return 1;
}
static INT32 CDEmuPlay(UINT8 M, UINT8 S, UINT8 F)
{
+ printf("CDEmuPlay\n");
return 1;
}
static INT32 CDEmuLoadSector(INT32 LBA, char* pBuffer)
{
- return 0;
-}
-
-static void SekWriteWord(UINT32 a, UINT16 d)
-{
-
-}
-
-static void SekWriteByte(UINT32 a, UINT8 d)
-{
+ printf("CDEmuLoadSector %d\n", LBA);
+ //LBA += 150;
-}
+ cdrom_read_data(neocd.cd, LBA, pBuffer, CD_TRACK_MODE1);
-static UINT32 SekReadByte(UINT32 a)
-{
- return 0;
+ return LBA+1;// - 150;
}
-static UINT32 SekReadWord(UINT32 a)
-{
- return 0;
-}
-
static INT32 SekIdle(INT32 nCycles)
{
@@ -173,20 +270,7 @@ static void ZetSetBUSREQLine(INT32 nStatus)
}
-static void NeoDecodeSpritesCD(UINT8* pData, UINT8* pDest, INT32 nSize)
-{
-
-}
-static void NeoUpdateSprites(INT32 nOffset, INT32 nSize)
-{
-
-}
-
-static void NeoUpdateText(INT32 nOffset, const INT32 nSize, UINT8* pData, UINT8* pDest)
-{
-
-}
static void MapVectorTable(bool bMapBoardROM)
{
@@ -212,7 +296,7 @@ public:
: neogeo_state(mconfig, type, tag)
{
nff0002 = 0;
- nIRQAcknowledge = 0;
+ nIRQAcknowledge = ~0;
for (int i=0;i<10;i++)
NeoCDCommsCommandFIFO[i] = 0;
for (int i=0;i<10;i++)
@@ -234,6 +318,8 @@ public:
NeoCDDMACount = 0;
NeoCDDMAMode = 0;
nLC8951Register = 0;
+ nNeoCDIRQVectorAck = 0;
+ nNeoCDIRQVector = 0;
}
UINT8 *m_memcard_data;
@@ -264,6 +350,7 @@ public:
DECLARE_MACHINE_START(neocd);
DECLARE_MACHINE_START(neogeo);
DECLARE_MACHINE_RESET(neogeo);
+
DECLARE_CUSTOM_INPUT_MEMBER(get_memcard_status);
TIMER_CALLBACK_MEMBER(display_position_interrupt_callback);
@@ -342,9 +429,41 @@ public:
void neogeoWriteByteTransfer(UINT32 sekAddress, UINT8 byteValue);
void neogeoWriteWordTransfer(UINT32 sekAddress, UINT16 wordValue);
void NeoIRQUpdate(UINT16 wordValue);
+ void SekWriteWord(UINT32 a, UINT16 d);
+ void SekWriteByte(UINT32 a, UINT8 d);
+ UINT32 SekReadByte(UINT32 a);
+ UINT32 SekReadWord(UINT32 a);
+ address_space* curr_space;
+ int nNeoCDIRQVectorAck;
+ int nNeoCDIRQVector;
};
+void ng_aes_state::SekWriteWord(UINT32 a, UINT16 d)
+{
+// printf("write word %08x %04x\n", a, d);
+ curr_space->write_word(a,d);
+}
+
+void ng_aes_state::SekWriteByte(UINT32 a, UINT8 d)
+{
+// printf("write byte %08x %02x\n", a, d);
+ curr_space->write_byte(a,d);
+}
+
+UINT32 ng_aes_state::SekReadByte(UINT32 a)
+{
+// printf("read byte %08x\n", a);
+ return curr_space->read_byte(a);
+}
+
+
+UINT32 ng_aes_state::SekReadWord(UINT32 a)
+{
+// printf("read WORD %08x\n", a);
+ return curr_space->read_word(a);
+}
+
#define LOG_VIDEO_SYSTEM (0)
@@ -972,97 +1091,6 @@ WRITE16_MEMBER(ng_aes_state::system_control_w)
*
*/
-static void neocd_do_dma(address_space& space)
-{
- ng_aes_state *state = space.machine().driver_data<ng_aes_state>();
- // TODO: Proper DMA timing and control
- int count;
-// UINT16 word;
-
- switch(state->m_neocd_ctrl.dma_mode[0])
- {
- case 0xffdd:
- for(count=0;count<state->m_neocd_ctrl.word_count;count++)
- {
- //word = space.read_word(state->m_neocd_ctrl.addr_source);
- space.write_word(state->m_neocd_ctrl.addr_source+(count*2),state->m_neocd_ctrl.fill_word);
- }
- logerror("CTRL: DMA word-fill transfer of %i bytes\n",count*2);
- break;
- case 0xfef5:
- for(count=0;count<state->m_neocd_ctrl.word_count;count++)
- {
- //word = space.read_word(state->m_neocd_ctrl.addr_source);
- space.write_word(state->m_neocd_ctrl.addr_source+(count*4),(state->m_neocd_ctrl.addr_source+(count*4)) >> 16);
- space.write_word(state->m_neocd_ctrl.addr_source+(count*4)+2,(state->m_neocd_ctrl.addr_source+(count*4)) & 0xffff);
- }
- logerror("CTRL: DMA mode 2 transfer of %i bytes\n",count*4);
- break;
- case 0xcffd:
- for(count=0;count<state->m_neocd_ctrl.word_count;count++)
- {
- //word = space.read_word(state->m_neocd_ctrl.addr_source);
- space.write_word(state->m_neocd_ctrl.addr_source+(count*8),((state->m_neocd_ctrl.addr_source+(count*8)) >> 24) | 0xff00);
- space.write_word(state->m_neocd_ctrl.addr_source+(count*8)+2,((state->m_neocd_ctrl.addr_source+(count*8)) >> 16) | 0xff00);
- space.write_word(state->m_neocd_ctrl.addr_source+(count*8)+4,((state->m_neocd_ctrl.addr_source+(count*8)) >> 8) | 0xff00);
- space.write_word(state->m_neocd_ctrl.addr_source+(count*8)+6,(state->m_neocd_ctrl.addr_source+(count*8)) | 0xff00);
- }
- logerror("CTRL: DMA mode 3 transfer of %i bytes\n",count*8);
- break;
- default:
- logerror("CTRL: Unknown DMA transfer mode %04x\n",state->m_neocd_ctrl.dma_mode[0]);
- }
-}
-
-READ16_MEMBER(ng_aes_state::neocd_control_r)
-{
-
- switch(offset)
- {
-
- case 0x16/2:
- return nff0016;
-
- case 0x64/2: // source address, high word
- return (m_neocd_ctrl.addr_source >> 16) & 0xffff;
- case 0x66/2: // source address, low word
- return m_neocd_ctrl.addr_source & 0xffff;
- case 0x68/2: // target address, high word
- return (m_neocd_ctrl.addr_target >> 16) & 0xffff;
- case 0x6a/2: // target address, low word
- return m_neocd_ctrl.addr_target & 0xffff;
- case 0x6c/2: // fill word
- return m_neocd_ctrl.fill_word;
- case 0x70/2: // word count
- return (m_neocd_ctrl.word_count >> 16) & 0xffff;
- case 0x72/2:
- return m_neocd_ctrl.word_count & 0xffff;
- case 0x7e/2: // DMA parameters
- case 0x80/2:
- case 0x82/2:
- case 0x84/2:
- case 0x86/2:
- case 0x88/2:
- case 0x8a/2:
- case 0x8c/2:
- case 0x8e/2:
- return m_neocd_ctrl.dma_mode[offset-(0x7e/2)];
- case 0x105/2:
- return m_neocd_ctrl.area_sel;
- case 0x11c/2:
- logerror("CTRL: Read region code.\n");
- return 0x0600; // we'll just force USA region for now
- case 0x1a0/2:
- return m_neocd_ctrl.spr_bank_sel;
- case 0x1a2/2:
- return m_neocd_ctrl.pcm_bank_sel;
- default:
- logerror("CTRL: Read offset %04x\n",offset);
- }
-
- return 0;
-}
-
void ng_aes_state::NeoCDReadSector()
{
@@ -1071,7 +1099,7 @@ void ng_aes_state::NeoCDReadSector()
// if (LC8951RegistersW[10] & 0x80) {
NeoCDSectorLBA++;
- NeoCDSectorLBA = CDEmuLoadSector(NeoCDSectorLBA, NeoCDSectorData + 4) - 1;
+ NeoCDSectorLBA = CDEmuLoadSector(NeoCDSectorLBA, NeoCDSectorData + 4) -1;
// }
if (LC8951RegistersW[10] & 0x80) {
@@ -1170,13 +1198,21 @@ void ng_aes_state::neogeoWriteByteTransfer(UINT32 sekAddress, UINT8 byteValue)
if (!nTransferWriteEnable) {
// return;
}
+ int address;
sekAddress ^= 1;
switch (nActiveTransferArea) {
case 0: // Sprites
- NeoSpriteRAM[nSpriteTransferBank + (sekAddress & 0x0FFFFF)] = byteValue;
- NeoCDOBJBankUpdate[nSpriteTransferBank >> 20] = true;
+ address = (nSpriteTransferBank + (sekAddress & 0x0FFFFF));
+
+ // wtf? is this just due to how we decode the sprite gfx or is something bad happening?
+ 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[nNeoActiveSlot][nADPCMTransferBank + ((sekAddress & 0x0FFFFF) >> 1)] = byteValue;
@@ -1200,11 +1236,18 @@ void ng_aes_state::neogeoWriteWordTransfer(UINT32 sekAddress, UINT16 wordValue)
if (!nTransferWriteEnable) {
// return;
}
+ //int address;
switch (nActiveTransferArea) {
case 0: // Sprites
- *((UINT16*)(NeoSpriteRAM + nSpriteTransferBank + (sekAddress & 0xFFFFF))) = wordValue;
- NeoCDOBJBankUpdate[nSpriteTransferBank >> 20] = true;
+ neogeoWriteByteTransfer(sekAddress+0, wordValue>>8);
+ neogeoWriteByteTransfer(sekAddress+1, wordValue&0xff);
+
+ //address = (nSpriteTransferBank + (sekAddress & 0x0FFFFF));
+ //NeoSpriteRAM[(address+0)] = (wordValue&0x00ff)>>0;
+ //NeoSpriteRAM[address+1] = (wordValue&0xff00)>>8;
+ // *((UINT16*)(NeoSpriteRAM + nSpriteTransferBank + (sekAddress & 0xFFFFF))) = wordValue;
+ // NeoCDOBJBankUpdate[nSpriteTransferBank >> 20] = true;
break;
case 1: // ADPCM
YM2610ADPCMAROM[nNeoActiveSlot][nADPCMTransferBank + ((sekAddress & 0x0FFFFF) >> 1)] = wordValue;
@@ -1364,7 +1407,9 @@ void ng_aes_state::neogeoWriteByteCDROM(UINT32 sekAddress, UINT8 byteValue)
break;
case 0x0141:
-// bprintf(PRINT_NORMAL, _T(" - NGCD OBJ BUSREQ -> 0 (PC: 0x%06X)\n"), SekGetPC(-1));
+// bprintf(PRINT_NORMAL, _T(" - NGCD OBJ BUSREQ -> 0 (PC: 0x%06X)\n"), SekGetPC(-1));
+ video_reset();
+ /* NO MAME
NeoSetSpriteSlot(0);
for (INT32 i = 0; i < 4; i++) {
if (NeoCDOBJBankUpdate[i]) {
@@ -1372,6 +1417,7 @@ void ng_aes_state::neogeoWriteByteCDROM(UINT32 sekAddress, UINT8 byteValue)
NeoUpdateSprites((i << 20), 0x100000);
}
}
+ */
break;
case 0x0143:
@@ -1384,8 +1430,13 @@ void ng_aes_state::neogeoWriteByteCDROM(UINT32 sekAddress, UINT8 byteValue)
break;
case 0x0149:
// bprintf(PRINT_NORMAL, _T(" - NGCD FIX BUSREQ -> 0 (PC: 0x%06X)\n"), SekGetPC(-1));
- NeoSetTextSlot(0);
- NeoUpdateText(0, 0x020000, NeoTextRAM, NeoTextROM[0]);
+ video_reset();
+
+ /* NO MAME
+
+ NeoSetTextSlot(0);
+ NeoUpdateText(0, 0x020000, NeoTextRAM, NeoTextROM[0]);
+ */
break;
// CD mechanism communication
@@ -1461,7 +1512,7 @@ void ng_aes_state::neogeoWriteWordCDROM(UINT32 sekAddress, UINT16 wordValue)
break;
case 0x000E:
- NeoCDIRQUpdate(wordValue);
+ NeoCDIRQUpdate(wordValue); // irqack
break;
// DMA controller
@@ -1532,6 +1583,8 @@ void ng_aes_state::NeoCDLBAToMSF(const INT32 LBA)
void ng_aes_state::NeoCDCommsWrite(UINT8 data)
{
+ //printf("NeoCDCommsWrite %d, %02x\n", NeoCDCommsWordCount, data);
+
if (NeoCDCommsWordCount >= 0 && NeoCDCommsWordCount < 10) {
NeoCDCommsCommandFIFO[NeoCDCommsWordCount] = data & 0x0F;
}
@@ -1838,7 +1891,7 @@ void ng_aes_state::NeoCDProcessCommand()
switch (NeoCDCommsCommandFIFO[3]) {
case 0: {
- UINT8* ChannelData = CDEmuReadQChannel();
+ UINT8* ChannelData = CDEmuReadQChannel(NeoCDSectorLBA);
NeoCDCommsStatusFIFO[2] = ChannelData[1] / 10;
NeoCDCommsStatusFIFO[3] = ChannelData[1] % 10;
@@ -1856,7 +1909,7 @@ void ng_aes_state::NeoCDProcessCommand()
break;
}
case 1: {
- UINT8* ChannelData = CDEmuReadQChannel();
+ UINT8* ChannelData = CDEmuReadQChannel(NeoCDSectorLBA);
NeoCDCommsStatusFIFO[2] = ChannelData[4] / 10;
NeoCDCommsStatusFIFO[3] = ChannelData[4] % 10;
@@ -1873,7 +1926,7 @@ void ng_aes_state::NeoCDProcessCommand()
}
case 2: {
- UINT8* ChannelData = CDEmuReadQChannel();
+ UINT8* ChannelData = CDEmuReadQChannel(NeoCDSectorLBA);
NeoCDCommsStatusFIFO[2] = ChannelData[0] / 10;
NeoCDCommsStatusFIFO[3] = ChannelData[0] % 10;
@@ -1934,7 +1987,7 @@ void ng_aes_state::NeoCDProcessCommand()
case 6: {
- UINT8* ChannelData = CDEmuReadQChannel();
+ UINT8* ChannelData = CDEmuReadQChannel(NeoCDSectorLBA);
NeoCDCommsStatusFIFO[8] = ChannelData[7];
@@ -2040,6 +2093,8 @@ void ng_aes_state::NeoCDCommsControl(UINT8 clock, UINT8 send)
if (NeoCDCommsCommandFIFO[0]) {
INT32 sum = 0;
+ printf("has command %02x\n", NeoCDCommsCommandFIFO[0]);
+
// bprintf(PRINT_NORMAL, _T(" - CD mechanism command receive completed : 0x"));
for (INT32 i = 0; i < 9; i++) {
// bprintf(PRINT_NORMAL, _T("%X"), NeoCDCommsCommandFIFO[i]);
@@ -2049,6 +2104,8 @@ void ng_aes_state::NeoCDCommsControl(UINT8 clock, UINT8 send)
// bprintf(PRINT_NORMAL, _T(" (CS 0x%X, %s)\n"), NeoCDCommsCommandFIFO[9], (sum == NeoCDCommsCommandFIFO[9]) ? _T("OK") : _T("NG"));
if (sum == NeoCDCommsCommandFIFO[9]) {
+ printf("request to process command %02x\n", NeoCDCommsCommandFIFO[0]);
+
NeoCDProcessCommand();
if (NeoCDCommsCommandFIFO[0]) {
@@ -2171,146 +2228,84 @@ void ng_aes_state::LC8951Reset()
-WRITE16_MEMBER(ng_aes_state::neocd_control_w)
+READ16_MEMBER(ng_aes_state::neocd_control_r)
{
- switch(offset)
+ if (mem_mask == 0xffff)
{
- case 0x02/2: // HOCK
- COMBINE_DATA(&nff0002);
- printf("nff0002 = %04x %04x\n", data, mem_mask);
- break;
+ return neogeoReadWordCDROM(0xff0000+ (offset*2));
+ }
+ else if (mem_mask ==0xff00)
+ {
+ return neogeoReadByteCDROM(0xff0000+ (offset*2)) << 8;
+ }
+ else if (mem_mask ==0x00ff)
+ {
+ return neogeoReadByteCDROM(0xff0000+ (offset*2)+1) & 0xff;
+ }
- case 0x16/2:
- COMBINE_DATA(&nff0016);
- printf("nff0016 = %04x %04x\n", data, mem_mask);
- break;
+ return 0x0000;
+}
- case 0x60/2: // Start DMA transfer
- if((data & 0xff) == 0x40)
- neocd_do_dma(space);
- break;
- case 0x64/2: // source address, high word
- m_neocd_ctrl.addr_source = (m_neocd_ctrl.addr_source & 0x0000ffff) | (data << 16);
- logerror("CTRL: Set source address to %08x\n",m_neocd_ctrl.addr_source);
- break;
- case 0x66/2: // source address, low word
- m_neocd_ctrl.addr_source = (m_neocd_ctrl.addr_source & 0xffff0000) | data;
- logerror("CTRL: Set source address to %08x\n",m_neocd_ctrl.addr_source);
- break;
- case 0x68/2: // target address, high word
- m_neocd_ctrl.addr_target = (m_neocd_ctrl.addr_target & 0x0000ffff) | (data << 16);
- logerror("CTRL: Set target address to %08x\n",m_neocd_ctrl.addr_target);
- break;
- case 0x6a/2: // target address, low word
- m_neocd_ctrl.addr_target = (m_neocd_ctrl.addr_target & 0xffff0000) | data;
- logerror("CTRL: Set target address to %08x\n",m_neocd_ctrl.addr_target);
- break;
- case 0x6c/2: // fill word
- m_neocd_ctrl.fill_word = data;
- logerror("CTRL: Set fill word to %04x\n",data);
- break;
- case 0x70/2: // word count
- m_neocd_ctrl.word_count = (m_neocd_ctrl.word_count & 0x0000ffff) | (data << 16);
- logerror("CTRL: Set word count to %i\n",m_neocd_ctrl.word_count);
- break;
- case 0x72/2: // word count (low word)
- m_neocd_ctrl.word_count = (m_neocd_ctrl.word_count & 0xffff0000) | data;
- logerror("CTRL: Set word count to %i\n",m_neocd_ctrl.word_count);
- break;
- case 0x7e/2: // DMA parameters
- case 0x80/2:
- case 0x82/2:
- case 0x84/2:
- case 0x86/2:
- case 0x88/2:
- case 0x8a/2:
- case 0x8c/2:
- case 0x8e/2:
- m_neocd_ctrl.dma_mode[offset-(0x7e/2)] = data;
- logerror("CTRL: DMA parameter %i set to %04x\n",offset-(0x7e/2),data);
- break;
- case 0x104/2:
- m_neocd_ctrl.area_sel = data & 0x00ff;
- logerror("CTRL: 0xExxxxx set to area %i\n",data & 0xff);
- break;
- case 0x140/2: // end sprite transfer
- video_reset();
- break;
- case 0x142/2: // end PCM transfer
- break;
- case 0x146/2: // end Z80 transfer
- machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_RESET,PULSE_LINE);
- break;
- case 0x148/2: // end FIX transfer
- video_reset();
- break;
- case 0x1a0/2:
- m_neocd_ctrl.spr_bank_sel = data & 0xff;
- logerror("CTRL: Sprite area set to bank %i\n",data & 0xff);
- break;
- case 0x1a2/2:
- m_neocd_ctrl.pcm_bank_sel = data & 0xff;
- logerror("CTRL: PCM area set to bank %i\n",data & 0xff);
- break;
- default:
- logerror("CTRL: Write offset %04x, data %04x\n",offset*2,data);
+
+WRITE16_MEMBER(ng_aes_state::neocd_control_w)
+{
+ if (mem_mask == 0xffff)
+ {
+ neogeoWriteWordCDROM(0xff0000+ (offset*2), data);
+ }
+ else if (mem_mask ==0xff00)
+ {
+ neogeoWriteByteCDROM(0xff0000+ (offset*2), data>>8);
+ }
+ else if (mem_mask ==0x00ff)
+ {
+ neogeoWriteByteCDROM(0xff0000+ (offset*2)+1, data&0xff);
}
}
+
+
+
/*
* Handling NeoCD banked RAM
* When the Z80 space is banked in to 0xe00000, only the low byte of each word is used
*/
+
READ16_MEMBER(ng_aes_state::neocd_transfer_r)
{
- UINT16 ret = 0x0000;
- UINT8* Z80 = memregion("audiocpu")->base();
- UINT8* PCM = memregion("ymsnd")->base();
- UINT8* FIX = memregion("fixed")->base();
- UINT16* SPR = (UINT16*)(*machine().root_device().memregion("sprites"));
-
- switch(m_neocd_ctrl.area_sel)
+ if (mem_mask == 0xffff)
{
- case NEOCD_AREA_AUDIO:
- ret = Z80[offset & 0xffff] | 0xff00;
- break;
- case NEOCD_AREA_PCM:
- ret = PCM[offset + (0x100000*m_neocd_ctrl.pcm_bank_sel)] | 0xff00;
- break;
- case NEOCD_AREA_SPR:
- ret = SPR[offset + (0x80000*m_neocd_ctrl.spr_bank_sel)];
- break;
- case NEOCD_AREA_FIX:
- ret = FIX[offset & 0x1ffff] | 0xff00;
- break;
+ return neogeoReadWordTransfer(0xe00000+ (offset*2));
+ }
+ else if (mem_mask ==0xff00)
+ {
+ return neogeoReadByteTransfer(0xe00000+ (offset*2)) << 8;
+ }
+ else if (mem_mask ==0x00ff)
+ {
+ return neogeoReadByteTransfer(0xe00000+ (offset*2)+1) & 0xff;
}
- return ret;
+
+ return 0x0000;
+
}
WRITE16_MEMBER(ng_aes_state::neocd_transfer_w)
{
- UINT8* Z80 = memregion("audiocpu")->base();
- UINT8* PCM = memregion("ymsnd")->base();
- UINT8* FIX = memregion("fixed")->base();
- UINT16* SPR = (UINT16*)(*machine().root_device().memregion("sprites"));
-
- switch(m_neocd_ctrl.area_sel)
+ if (mem_mask == 0xffff)
{
- case NEOCD_AREA_AUDIO:
- Z80[offset & 0xffff] = data & 0xff;
- break;
- case NEOCD_AREA_PCM:
- PCM[offset + (0x100000*m_neocd_ctrl.pcm_bank_sel)] = data & 0xff;
- break;
- case NEOCD_AREA_SPR:
- COMBINE_DATA(SPR+(offset + (0x80000*m_neocd_ctrl.spr_bank_sel)));
- break;
- case NEOCD_AREA_FIX:
- FIX[offset & 0x1ffff] = data & 0xff;
- break;
+ neogeoWriteWordTransfer(0xe00000+ (offset*2), data);
+ }
+ else if (mem_mask ==0xff00)
+ {
+ neogeoWriteByteTransfer(0xe00000+ (offset*2), data>>8);
+ }
+ else if (mem_mask ==0x00ff)
+ {
+ neogeoWriteByteTransfer(0xe00000+ (offset*2)+1, data&0xff);
}
}
@@ -2410,6 +2405,8 @@ static void aes_postload(neogeo_state *state)
_set_audio_cpu_rom_source(state->machine().device("maincpu")->memory().space(AS_PROGRAM));
}
+
+
static void common_machine_start(running_machine &machine)
{
neogeo_state *state = machine.driver_data<neogeo_state>();
@@ -2493,6 +2490,26 @@ MACHINE_START_MEMBER(ng_aes_state,neocd)
// copy fixed tiles into FIX space (from 0x70000)
memcpy(FIXbios,ROM+0x70000,0x10000);
+
+ // for custom vectors
+ machine().device("maincpu")->execute().set_irq_acknowledge_callback(neocd_int_callback);
+
+ {
+ cdrom_image_device *cddevice = machine().device<cdrom_image_device>("cdrom");
+ if ( cddevice )
+ {
+ neocd.cd = cddevice->get_cdrom_file();
+ if ( neocd.cd )
+ {
+ printf("found cd\n");
+ neocd.toc = cdrom_get_toc( neocd.cd );
+ cdda_set_cdrom( machine().device("cdda"), neocd.cd );
+ cdda_stop_audio( machine().device( "cdda" ) ); //stop any pending CD-DA
+ }
+ }
+ }
+
+
}
//static DEVICE_IMAGE_LOAD(aes_cart)
@@ -2531,6 +2548,17 @@ MACHINE_RESET_MEMBER(ng_aes_state,neogeo)
/* AES apparently always uses the cartridge's fixed bank mode */
neogeo_set_fixed_layer_source(machine(),1);
+
+ NeoSpriteRAM = memregion("sprites")->base();
+ YM2610ADPCMAROM[0] = memregion("ymsnd")->base();
+ NeoZ80ROMActive = memregion("audiocpu")->base();
+ NeoTextRAM = memregion("fixed")->base();
+ curr_space = &machine().device("maincpu")->memory().space(AS_PROGRAM);
+
+ NeoCDCommsReset();
+
+ nTransferWriteEnable = 0;
+
}
@@ -2567,6 +2595,8 @@ static ADDRESS_MAP_START( main_map, AS_PROGRAM, 16, ng_aes_state )
AM_RANGE(0xe00000, 0xffffff) AM_READ(neogeo_unmapped_r)
ADDRESS_MAP_END
+
+
static ADDRESS_MAP_START( neocd_main_map, AS_PROGRAM, 16, ng_aes_state )
AM_RANGE(0x000000, 0x00007f) AM_RAMBANK(NEOGEO_BANK_VECTORS)
AM_RANGE(0x000080, 0x0fffff) AM_RAM
@@ -2963,6 +2993,21 @@ void ng_aes_state::NeoIRQUpdate(UINT16 wordValue)
}
+/* NeoCD uses custom vectors on IRQ4 to handle various events from the CDC */
+
+static IRQ_CALLBACK(neocd_int_callback)
+{
+ ng_aes_state *state = device->machine().driver_data<ng_aes_state>();
+
+ // this is how FBA seems to be setup, but surely this would cause the custom
+ // interrupt levels to end up being used for the regular interrupts too in cases?
+ if (state->nNeoCDIRQVectorAck) {
+ state->nNeoCDIRQVectorAck = 0;
+ return state->nNeoCDIRQVector;
+ }
+
+ return (0x60+irqline*4)/4;
+}
void ng_aes_state::NeoCDIRQUpdate(UINT8 byteValue)
{
@@ -2980,19 +3025,19 @@ void ng_aes_state::NeoCDIRQUpdate(UINT8 byteValue)
if ((nIRQAcknowledge & 0x08) == 0) {
nNeoCDIRQVector = 0x17;
nNeoCDIRQVectorAck = 1;
- SekSetIRQLine(4, SEK_IRQSTATUS_ACK /*| SEK_IRQSTATUS_CALLBACK*/);
+ m_maincpu->set_input_line(4, HOLD_LINE);
return;
}
if ((nIRQAcknowledge & 0x10) == 0) {
nNeoCDIRQVector = 0x16;
nNeoCDIRQVectorAck = 1;
- SekSetIRQLine(4, SEK_IRQSTATUS_ACK /*| SEK_IRQSTATUS_CALLBACK*/);
+ m_maincpu->set_input_line(4, HOLD_LINE);
return;
}
if ((nIRQAcknowledge & 0x20) == 0) {
nNeoCDIRQVector = 0x15;
nNeoCDIRQVectorAck = 1;
- SekSetIRQLine(4, SEK_IRQSTATUS_ACK /*| SEK_IRQSTATUS_CALLBACK*/);
+ m_maincpu->set_input_line(4, HOLD_LINE);
return;
}
}