diff options
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 |
commit | 27c8616807545fa6674f259818c94b7649fd1466 (patch) | |
tree | 4684a57b8e66c90f87cc234c0f31a07535ed5257 | |
parent | 559ad133ce356edd1c6f96b679410c0957495bdc (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.xml | 243 | ||||
-rw-r--r-- | src/mess/drivers/ng_aes.c | 575 |
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; } } |