From 6ff2372d8c881daf2cb500a8076f31e390e216bf Mon Sep 17 00:00:00 2001 From: Phil Bennett Date: Sun, 14 Sep 2008 17:51:01 +0000 Subject: [PATCH] Namco NA-2: Use real C70 BIOS. Removed sound and input simulation code. Changed the NA-1/2 MCU type to M37702. --- .gitattributes | 2 - src/emu/sndintrf.c | 4 - src/emu/sndintrf.h | 1 - src/emu/sound/namcona.c | 1329 ----------------------------------- src/emu/sound/namcona.h | 15 - src/emu/sound/sound.mak | 5 - src/mame/drivers/namcona1.c | 533 +++----------- src/mame/mame.mak | 1 - 8 files changed, 84 insertions(+), 1806 deletions(-) delete mode 100644 src/emu/sound/namcona.c delete mode 100644 src/emu/sound/namcona.h diff --git a/.gitattributes b/.gitattributes index 9e1c676befe..181e9cba013 100644 --- a/.gitattributes +++ b/.gitattributes @@ -833,8 +833,6 @@ src/emu/sound/namco.c svneol=native#text/plain src/emu/sound/namco.h svneol=native#text/plain src/emu/sound/namco52.c svneol=native#text/plain src/emu/sound/namco52.h svneol=native#text/plain -src/emu/sound/namcona.c svneol=native#text/plain -src/emu/sound/namcona.h svneol=native#text/plain src/emu/sound/nes_apu.c svneol=native#text/plain src/emu/sound/nes_apu.h svneol=native#text/plain src/emu/sound/nes_defs.h svneol=native#text/plain diff --git a/src/emu/sndintrf.c b/src/emu/sndintrf.c index ce6f96abc87..b8f94f8bffa 100644 --- a/src/emu/sndintrf.c +++ b/src/emu/sndintrf.c @@ -105,7 +105,6 @@ void namco_15xx_get_info(void *token, UINT32 state, sndinfo *info); void namco_cus30_get_info(void *token, UINT32 state, sndinfo *info); void namco_52xx_get_info(void *token, UINT32 state, sndinfo *info); void namco_63701x_get_info(void *token, UINT32 state, sndinfo *info); -void namcona_get_info(void *token, UINT32 state, sndinfo *info); void snkwave_get_info(void *token, UINT32 state, sndinfo *info); void tms36xx_get_info(void *token, UINT32 state, sndinfo *info); void tms3615_get_info(void *token, UINT32 state, sndinfo *info); @@ -289,9 +288,6 @@ static const struct #if (HAS_NAMCO_63701X) { SOUND_NAMCO_63701X, namco_63701x_get_info }, #endif -#if (HAS_NAMCONA) - { SOUND_NAMCONA, namcona_get_info }, -#endif #if (HAS_SNKWAVE) { SOUND_SNKWAVE, snkwave_get_info }, #endif diff --git a/src/emu/sndintrf.h b/src/emu/sndintrf.h index 280e6f3f5df..da53a2c5bd1 100644 --- a/src/emu/sndintrf.h +++ b/src/emu/sndintrf.h @@ -69,7 +69,6 @@ enum _sound_type SOUND_NAMCO_CUS30, SOUND_NAMCO_52XX, SOUND_NAMCO_63701X, - SOUND_NAMCONA, SOUND_SNKWAVE, SOUND_TMS36XX, SOUND_TMS3615, diff --git a/src/emu/sound/namcona.c b/src/emu/sound/namcona.c deleted file mode 100644 index 95bcb5f74f5..00000000000 --- a/src/emu/sound/namcona.c +++ /dev/null @@ -1,1329 +0,0 @@ -/* - Namco NA1/2 Sound Hardware - - PCM samples and sound sequencing metadata are written by the main CPU to - shared RAM. - - The sound CPU's type is unknown, though it appears to be little endian. - It has an internal BIOS. - - RAM[0x820]: song select - RAM[0x822]: song control (fade?) - RAM[0x824..0x89e]: - Even addresses are used to select the sound effect. - 0x40 is written to odd addresses as a signal to play the requested sound. - - Metadata vectors: - addr sample - 0000: 0012 // table of addresses for each VOX sequence - 0002: 07e4 // table of wave records (5 words each record) - 0004: 0794 // unknown table (5 words each record) - 0006: 0000 // unknown (always zero?) - 0008: 0102 // unknown address table - 000a: 0384 // unknown address table - 000c: 0690 // unknown chunk - 000e: 07bc // unknown table (5 words each record) - 0010: 7700 // unknown - 0012: addresses for each song sequence start here - - Known issues: - - many opcodes are ignored or implemented imperfectly - - the metadata contains several mystery tables -*/ - -#include -#include "sndintrf.h" -#include "streams.h" -#include "namcona.h" - -#define kTwelfthRootTwo 1.059463094 -#define FIXED_POINT_SHIFT (10) /* for mixing */ -#define MAX_VOICE 16 -#define MAX_SEQUENCE_VOICE 32 -#define MAX_SEQUENCE 0x40 -#define MAX_SEQUENCE_RECURSION 4 /* ? */ -#define SAMPLE_RATE_BASE (42667*2) - -struct voice -{ - INT32 bActive; - - INT32 flags; - INT32 start; /* fixed point */ - INT32 end; /* fixed point */ - INT32 loop; /* fixed point */ - INT32 baseFreq; - INT32 bank; - - INT32 delta; /* fixed point */ - INT32 pos; - INT32 note; - INT32 preNote; - INT32 volume; - INT32 pan; - INT32 leftVolume; - INT32 rightVolume; - INT32 dnote; - INT32 detune; - INT32 ignoreCount; - INT32 delay; - INT32 delayCount; - INT32 freqCtrlTableNo; - INT32 freqCtrlTable; - INT32 freqCtrlSpeed; - INT32 freqCtrlAmp; - INT32 freqCtrlPointer; - INT32 freqCtrlCounter; - INT32 freqCtrlFreq; - INT32 volCtrlTable; - INT32 volCtrlCount; - INT32 volCtrlPointer; - INT32 volCtrlCounter; - INT32 volCtrlSpeed; - INT32 volCtrlVol; - INT32 volCtrlVolEnd; - INT32 panCtrlTable; - INT32 panCtrlSpeed; - INT32 panCtrlCounter; - INT32 panCtrlEnable; - INT32 portament; - INT32 portamentSpeed; - INT32 portamentNote; -}; - -struct sequence -{ - UINT8 volume; - UINT8 reg2; /* master freq? */ - UINT8 tempo; - int addr; - int pause; - int channel[8]; - int stackData[MAX_SEQUENCE_RECURSION]; /* used for sub-sequences */ - int stackSize; - int count; /* used for "repeat" opcode */ - int count2; - int count3; -}; - -struct namcona -{ - int mSampleRate; - sound_stream * mStream; - INT16 *mpMixerBuffer; - INT32 *mpPitchTable; - UINT16 *mpROM; - UINT16 *mpMetaData; - struct sequence mSequence[MAX_SEQUENCE]; - struct voice mVoice[MAX_SEQUENCE_VOICE]; -}; - -static const UINT16 VolCtrlSpeedTable[0x80] = -{ - 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0007, 0x0009, - 0x000b, 0x000d, 0x000f, 0x0011, 0x0013, 0x0015, 0x0017, 0x0019, - 0x001b, 0x001d, 0x001f, 0x0022, 0x0024, 0x0027, 0x002a, 0x002d, - 0x0030, 0x0033, 0x0037, 0x003b, 0x0040, 0x0044, 0x0049, 0x004f, - 0x0054, 0x005a, 0x0061, 0x0068, 0x0070, 0x0078, 0x0081, 0x008a, - 0x0094, 0x009f, 0x00aa, 0x00b7, 0x00c4, 0x00d2, 0x00e1, 0x00f2, - 0x0103, 0x0116, 0x012a, 0x0140, 0x0157, 0x0170, 0x018b, 0x01ab, - 0x01c7, 0x01e8, 0x020b, 0x0231, 0x025a, 0x0285, 0x02b4, 0x02e6, - 0x031c, 0x0356, 0x0394, 0x03d6, 0x041d, 0x046a, 0x04bc, 0x0514, - 0x0572, 0x05d7, 0x0644, 0x06b8, 0x0735, 0x07ba, 0x084a, 0x08e4, - 0x0989, 0x0a3a, 0x0af8, 0x0bc3, 0x0c9e, 0x0d88, 0x0e83, 0x0f91, - 0x10b2, 0x11e8, 0x1334, 0x1498, 0x1617, 0x17b1, 0x1969, 0x1b40, - 0x1d3a, 0x1f59, 0x219f, 0x240f, 0x26ac, 0x297a, 0x2c7c, 0x2fb6, - 0x332b, 0x36e1, 0x3adc, 0x3f20, 0x43b4, 0x489d, 0x4de1, 0x5386, - 0x5995, 0x6014, 0x670b, 0x6e84, 0x7687, 0x7f1f, 0x8857, 0x923a, - 0x9cd4, 0xa833, 0xb465, 0xc17a, 0xcf81, 0xde8d, 0xeeb0, 0xffff -}; - - -/** - * Given a sequence, return a pointer to the associated 16 bit word in shared RAM. - * The 16 bits are interpretted as follows: - * xxxxxxxx-------- index into sequence table (selects song/sample) - * --------x------- 1 if sequence is active/playing - * ---------x------ 1 if the main CPU has written a new sound command - * ----------xxxxxx unknown/unused - */ -static UINT16 * -GetSequenceStatusAddr( struct namcona *chip, struct sequence *pSeq ) -{ - int offs = pSeq - chip->mSequence; - return &chip->mpROM[0x820/2+offs]; -} - -static void -Silence( struct namcona *chip ) -{ - int i; - for( i=0; imVoice[i].bActive = 0; - } - for( i=0; imSequence[i]); - *pStatus &= 0xff7f; /* wipe "sequence-is-playing" flag */ - } -} - -static UINT8 -ReadMetaDataByte( struct namcona *chip, int addr ) -{ - UINT16 data = chip->mpMetaData[addr/2]; - return (addr&1)?(data&0xff):(data>>8); -} /* ReadMetaDataByte */ - -static UINT16 -ReadMetaDataWord( struct namcona *chip, int addr ) -{ - return ReadMetaDataByte(chip, addr)+ReadMetaDataByte(chip, addr+1)*256; -} /* ReadMetaDataWord */ - -static signed char -ReadPCMSample(struct namcona *chip, int addr, int flag ) -{ - UINT16 data16 = chip->mpROM[addr/2]; - int dat = (addr&1)?(data16&0xff):(data16>>8); - - if( flag&0x100 ) - { - if( dat&0x80 ) - { - dat = -(dat&0x7f) - 1; - } - } - - return dat; -} /* ReadPCMSample */ - -static void -RenderSamples(struct namcona *chip, stream_sample_t **buffer, INT16 *pSource, int length ) -{ - int i; - stream_sample_t * pDest1 = buffer[0]; - stream_sample_t * pDest2 = buffer[1]; - for (i = 0; i < length; i++) - { - INT32 dataL = /* 100 * */ (*pSource++); - INT32 dataR = /* 100 * */ (*pSource++); - if( dataL > 0x7fff ) - { - dataL = 0x7fff; /* clip */ - } - else if( dataL < -0x8000 ) - { - dataL = -0x8000; /* clip */ - } - if( dataR > 0x7fff ) - { - dataR = 0x7fff; /* clip */ - } - else if( dataR < -0x8000 ) - { - dataR = -0x8000; /* clip */ - } - *pDest1++ = (INT16)dataL; /* stereo left */ - *pDest2++ = (INT16)dataR; /* stereo right */ - } -} /* RenderSamples */ - -static void -PushSequenceAddr(struct namcona *chip, struct sequence *pSequence, int addr ) -{ - if( pSequence->stackSizestackData[pSequence->stackSize++] = addr; - } - else - { - logerror( "sound/namcona.c stack overflow!\n" ); - } -} /* PushSequenceAddr */ - -static void -PopSequenceAddr(struct namcona *chip, struct sequence *pSequence ) -{ - if( pSequence->stackSize ) - { - pSequence->addr = pSequence->stackData[--pSequence->stackSize]; - } - else - { - UINT16 *pStatus = GetSequenceStatusAddr(chip,pSequence); - *pStatus &= 0xff7f; /* wipe "sequence-is-playing" flag */ - } -} /* PopSequenceAddr */ - -static void -HandleSubroutine(struct namcona *chip, struct sequence *pSequence ) -{ - int addr = ReadMetaDataWord(chip, pSequence->addr ); - PushSequenceAddr(chip, pSequence, pSequence->addr+2 ); - pSequence->addr = addr; -} /* HandleSubroutine */ - -static void -HandleRepeat(struct namcona *chip, struct sequence *pSequence ) -{ - int count = ReadMetaDataByte( chip, pSequence->addr++ ); - int addr = ReadMetaDataWord(chip, pSequence->addr ); - if( pSequence->count < count ) - { - pSequence->count++; - pSequence->addr = addr; - } - else - { - pSequence->count = 0; - pSequence->addr += 2; - } -} /* HandleRepeat */ - -static void -HandleRepeatOut(struct namcona *chip, struct sequence *pSequence ) -{ - int count = ReadMetaDataByte( chip, pSequence->addr++ ); - int addr = ReadMetaDataWord(chip, pSequence->addr ); - if( pSequence->count2 < count ) - { - pSequence->count2++; - pSequence->addr += 2; - } - else - { - pSequence->count2 = 0; - pSequence->addr = addr; - } -} /* HandleRepeatOut */ - -static void -MapArgs(struct namcona *chip, struct sequence *pSequence, - int bCommon, - void (*callback)( struct namcona *chip, struct sequence *, int chan, UINT8 data ) ) -{ - UINT8 set = ReadMetaDataByte(chip,pSequence->addr++); - UINT8 data = 0; - int i; - if( bCommon ) - { - data = ReadMetaDataByte( chip, pSequence->addr++ ); - } - for( i=0; i<8; i++ ) - { - if( set&(1<<(7-i)) ) - { - if( !bCommon ) - { - data = ReadMetaDataByte( chip,pSequence->addr++ ); - } - callback( chip, pSequence, i, data ); - } - } -} /* MapArgs */ - -static void -AssignChannel(struct namcona *chip, struct sequence *pSequence, int chan, UINT8 data ) -{ - if( (pSequence - chip->mSequence) > 1 ) - data += 16; /* sound effect */ - - if( datamVoice[data]; - pSequence->channel[chan] = data; - pVoice->bActive = 0; - pVoice->bank = 0; - pVoice->volume = 0x80; - pVoice->pan = 0x80; - pVoice->dnote = 0; - pVoice->detune = 0; - pVoice->freqCtrlTableNo = 0; - pVoice->freqCtrlSpeed = 0; - pVoice->freqCtrlAmp = 0; - pVoice->volCtrlTable = 0; - pVoice->volCtrlCount = 0; - pVoice->panCtrlTable = 0; - pVoice->ignoreCount = 0; - pVoice->delay = 0; - pVoice->portament = 0; - } -} /* AssignChannel */ - -static void -IgnoreUnknownOp(struct namcona *chip, struct sequence *pSequence, int chan, UINT8 data ) -{ -} /* IgnoreUnknownOp */ - -static void -SelectWave(struct namcona *chip, struct sequence *pSequence, int chan, UINT8 data ) -{ - struct voice *pVoice = &chip->mVoice[pSequence->channel[chan]]; - int bank = 0x20000 + pVoice->bank*0x20000; - int addr = ReadMetaDataWord(chip,2)+10*data; - - pVoice->flags = ReadMetaDataWord(chip,addr+0*2); - pVoice->start = ReadMetaDataWord(chip,addr+1*2)*2+bank; - pVoice->end = ReadMetaDataWord(chip,addr+2*2)*2+bank; - pVoice->loop = ReadMetaDataWord(chip,addr+3*2)*2+bank; - pVoice->baseFreq = ReadMetaDataWord(chip,addr+4*2); /* unsure what this is; not currently used */ - - pVoice->start <<= FIXED_POINT_SHIFT; - pVoice->end <<= FIXED_POINT_SHIFT; - pVoice->loop <<= FIXED_POINT_SHIFT; - - pVoice->bActive = 0; - pVoice->dnote = 0; - pVoice->detune = 0; -} /* SelectWave */ - -static void -PlayNote(struct namcona *chip, struct sequence *pSequence, int chan, UINT8 data ) -{ - struct voice *pVoice = &chip->mVoice[pSequence->channel[chan]]; - if( data == 0xff ) - { - pVoice->volCtrlCounter = 1; - } - else - { - if (pVoice->ignoreCount > 0) - pVoice->ignoreCount--; - else - { - pVoice->delayCount = pVoice->delay; - pVoice->preNote = pVoice->note; - pVoice->note = data<<8; - pVoice->bActive |= 4; - } - } -} /* PlayNote */ - -static void -SelectWaveAndPlayNote(struct namcona *chip, struct sequence *pSequence, int chan, UINT8 data ) -{ - struct voice *pVoice = &chip->mVoice[pSequence->channel[chan]]; - int bank = 0x20000 + pVoice->bank*0x20000; - int addr = ReadMetaDataWord(chip,4)+10*data; - float pbase = (float)SAMPLE_RATE_BASE / (float)chip->mSampleRate; - INT32 frequency; - - pVoice->flags = ReadMetaDataWord(chip,addr+0*2); - pVoice->start = ReadMetaDataWord(chip,addr+3*2)*2+bank; - pVoice->end = ReadMetaDataWord(chip,addr+4*2)*2+bank; - pVoice->loop = pVoice->start; - - pVoice->start <<= FIXED_POINT_SHIFT; - pVoice->end <<= FIXED_POINT_SHIFT; - pVoice->loop <<= FIXED_POINT_SHIFT; - - pVoice->leftVolume = ReadMetaDataByte(chip,addr+1*2); - pVoice->rightVolume = ReadMetaDataByte(chip,addr+1*2+1); - - frequency = ReadMetaDataWord(chip,addr+2*2); - pVoice->delta = (long)((float)frequency * pbase); - pVoice->delta >>= 16-FIXED_POINT_SHIFT; - - pVoice->bActive = 2; - pVoice->pos = pVoice->start; -} /* SelectWaveAndPlayNote */ - -static void -Detune(struct namcona *chip, struct sequence *pSequence, int chan, UINT8 data ) -{ - struct voice *pVoice = &chip->mVoice[pSequence->channel[chan]]; - pVoice->detune = data; -} /* Detune */ - - -static void -DNote(struct namcona *chip, struct sequence *pSequence, int chan, UINT8 data ) -{ - struct voice *pVoice = &chip->mVoice[pSequence->channel[chan]]; - pVoice->dnote = data; -} /* DNote */ - -static void -Pan(struct namcona *chip, struct sequence *pSequence, int chan, UINT8 data ) -{ - struct voice *pVoice = &chip->mVoice[pSequence->channel[chan]]; - pVoice->pan = data; - pVoice->panCtrlSpeed = 0; -} /* Pan */ - -static void -Volume(struct namcona *chip, struct sequence *pSequence, int chan, UINT8 data ) -{ - struct voice *pVoice = &chip->mVoice[pSequence->channel[chan]]; - pVoice->volume = pSequence->volume * data / 256; -} /* Volume */ - -static void -FreqCtrlTable(struct namcona *chip, struct sequence *pSequence, int chan, UINT8 data ) -{ - struct voice *pVoice = &chip->mVoice[pSequence->channel[chan]]; - pVoice->freqCtrlTableNo = data; -} /* FreqCtrlTable */ - -static void -FreqCtrlSpeed(struct namcona *chip, struct sequence *pSequence, int chan, UINT8 data ) -{ - struct voice *pVoice = &chip->mVoice[pSequence->channel[chan]]; - pVoice->freqCtrlSpeed = data; -} /* FreqCtrlSpeed */ - -static void -FreqCtrlAmp(struct namcona *chip, struct sequence *pSequence, int chan, UINT8 data ) -{ - struct voice *pVoice = &chip->mVoice[pSequence->channel[chan]]; - pVoice->freqCtrlAmp = data; -} /* FreqCtrlAmp */ - -static void -VolCtrlTable(struct namcona *chip, struct sequence *pSequence, int chan, UINT8 data ) -{ - struct voice *pVoice = &chip->mVoice[pSequence->channel[chan]]; - int addr = ReadMetaDataWord(chip,10); - addr = ReadMetaDataWord(chip,addr+data*2); - pVoice->volCtrlTable = addr; -} /* VolCtrlTable */ - -static void -VolCtrlCount(struct namcona *chip, struct sequence *pSequence, int chan, UINT8 data ) -{ - struct voice *pVoice = &chip->mVoice[pSequence->channel[chan]]; - pVoice->volCtrlCount = data; -} /* VolCtrlCount */ - -static void -PanCtrlTable(struct namcona *chip, struct sequence *pSequence, int chan, UINT8 data ) -{ - struct voice *pVoice = &chip->mVoice[pSequence->channel[chan]]; - int addr = ReadMetaDataWord(chip,12) + data*4; - pVoice->panCtrlTable = addr; - pVoice->panCtrlSpeed = ReadMetaDataByte(chip,addr+3); - if( pVoice->panCtrlSpeed & 0x80) - pVoice->panCtrlSpeed = -(0x100 - pVoice->panCtrlSpeed); -} /* PanCtrlTable */ - -static void -IgnoreCount(struct namcona *chip, struct sequence *pSequence, int chan, UINT8 data ) -{ - struct voice *pVoice = &chip->mVoice[pSequence->channel[chan]]; - pVoice->ignoreCount = data; -} /* IgnoreCount */ - -static void -Delay(struct namcona *chip, struct sequence *pSequence, int chan, UINT8 data ) -{ - struct voice *pVoice = &chip->mVoice[pSequence->channel[chan]]; - pVoice->delay = data; -} /* Delay */ - -static void -Portament(struct namcona *chip, struct sequence *pSequence, int chan, UINT8 data ) -{ - struct voice *pVoice = &chip->mVoice[pSequence->channel[chan]]; - pVoice->portament = (0x100 - data) & 0xff; -} /* Portament */ - -static void -UpdateSequence(struct namcona *chip, struct sequence *pSequence ) -{ - UINT16 *pStatus = GetSequenceStatusAddr(chip,pSequence); - UINT16 data = *pStatus; - - if( data&0x0040 ) - { /* bit 0x0040 indicates that a sound request was written by the main CPU */ - int offs = ReadMetaDataWord(chip,0)+(data>>8)*2; - memset( pSequence, 0x00, sizeof(struct sequence) ); - if( pSequence == &chip->mSequence[0] ) Silence(chip); /* hack! */ - pSequence->addr = ReadMetaDataWord(chip,offs); - *pStatus = (data&0xffbf)|0x0080; /* set "sequence-is-playing" flag */ - } - if( data&0x0080 ) - { - if( pSequence == &chip->mSequence[1] ) - { - if( !(*(pStatus-1) & 0x0080) ) - *pStatus = data&0xff7f; - } - } - - while( (*pStatus)&0x0080 ) - { - if( pSequence->pause ) - { - pSequence->pause--; - return; - } - else - { - int code = ReadMetaDataByte(chip,pSequence->addr++); - if( code&0x80 ) - { - pSequence->pause = pSequence->tempo*((code&0x7f)+1); - } - else - { - int bCommon = (code&0x40); - switch( code&0x3f ) - { - case 0x01: /* master volume */ - pSequence->volume = ReadMetaDataByte(chip,pSequence->addr++); - break; - - case 0x02: /* master tempo */ - pSequence->reg2 = ReadMetaDataByte(chip,pSequence->addr++); - break; - - case 0x03: /* tempo */ - pSequence->tempo = ReadMetaDataByte(chip,pSequence->addr++) * pSequence->reg2; - if (pSequence->tempo == 0) pSequence->tempo = 1; - break; - - case 0x04: - HandleSubroutine(chip, pSequence ); - break; - - case 0x05: /* end-of-sequence */ - PopSequenceAddr(chip, pSequence ); - break; - - case 0x06: /* operand is note index */ - MapArgs(chip, pSequence, bCommon, PlayNote ); - pSequence->pause = pSequence->tempo; - break; - - case 0x07: - MapArgs(chip, pSequence, bCommon, SelectWave ); - break; - - case 0x08: - MapArgs(chip, pSequence, bCommon, Volume ); - break; - - case 0x09: - pSequence->addr = ReadMetaDataWord(chip,pSequence->addr); - break; - - case 0x0a: - HandleRepeat(chip, pSequence ); - break; - - case 0x0b: - HandleRepeatOut(chip, pSequence ); - break; - - case 0x0c: - MapArgs(chip, pSequence, bCommon, DNote ); - break; - - case 0x0d: - MapArgs(chip, pSequence, bCommon, Detune ); - break; - - case 0x0e: - MapArgs(chip, pSequence, bCommon, FreqCtrlTable ); - break; - - case 0x0f: - MapArgs(chip, pSequence, bCommon, FreqCtrlSpeed ); - break; - - case 0x12: - MapArgs(chip, pSequence, bCommon, FreqCtrlAmp ); - break; - - case 0x13: - MapArgs(chip, pSequence, bCommon, VolCtrlTable ); - break; - - case 0x11: - MapArgs(chip, pSequence, bCommon, VolCtrlCount ); - break; - - case 0x10: - MapArgs(chip, pSequence, bCommon, IgnoreCount ); - break; - - case 0x14: - MapArgs(chip, pSequence, bCommon, Delay ); - break; - - case 0x16: - MapArgs(chip, pSequence, bCommon, Pan ); - break; - - case 0x17: - MapArgs(chip, pSequence, bCommon, PanCtrlTable ); - break; - - case 0x19: // one loop? - if (pSequence->count3 == 0) - { - pSequence->addr = ReadMetaDataWord(chip,pSequence->addr); - pSequence->count3++; - } - else - { - pSequence->addr += 2; - pSequence->count3 = 0; - } - break; - - case 0x1b: - MapArgs(chip, pSequence, bCommon, SelectWaveAndPlayNote ); - pSequence->pause = pSequence->tempo; - break; - - case 0x1c: // request sound effect ? - pSequence->addr += 2; - break; - - case 0x1e: - { - int no = ReadMetaDataByte(chip,pSequence->addr++); /* Sequence No */ - int cod = ReadMetaDataByte(chip,pSequence->addr++); - if (no < MAX_SEQUENCE) - { - struct sequence *pSequence2 = &chip->mSequence[no]; - UINT16 *pStatus2 = GetSequenceStatusAddr(chip,pSequence2); - int offs = 0x12+cod*2; - *pStatus2 = (cod<<8)|0x0080; - memset( pSequence2, 0x00, sizeof(struct sequence) ); - pSequence2->addr = ReadMetaDataWord(chip,offs); - } - } - break; - - case 0x20: - MapArgs(chip, pSequence, bCommon, AssignChannel ); - break; - - case 0x22: - MapArgs(chip, pSequence, bCommon, Portament ); - break; - - case 0x23: - { - UINT8 reg23_0 = ReadMetaDataByte(chip,pSequence->addr++); /* Channel select */ - UINT8 reg23_1 = ReadMetaDataByte(chip,pSequence->addr++); /* PCM bank select */ - /* reg23_0: 0 = Ch. 0- 3 PCM Bank select - 1 = Ch. 4- 7 PCM Bank select - 2 = Ch. 8-11 PCM Bank select - 3 = Ch.12-15 PCM Bank select - */ - if( reg23_0 == 5 ) reg23_0 = 3; /* xday2,bkrtmaq */ - if( reg23_0 < 4 ) - { - if( (pSequence - chip->mSequence) > 1 ) - reg23_0 += 4; /* sound effect */ - chip->mVoice[reg23_0*4 + 0].bank = reg23_1; - chip->mVoice[reg23_0*4 + 1].bank = reg23_1; - chip->mVoice[reg23_0*4 + 2].bank = reg23_1; - chip->mVoice[reg23_0*4 + 3].bank = reg23_1; - } - } - break; - - case 0x24: // priority ? - MapArgs(chip, pSequence, bCommon, IgnoreUnknownOp ); - break; - - default: - //mame_printf_debug( "? 0x%x\n", code&0x3f ); - *pStatus &= 0xff7f; /* clear "sequence-is-playing" flag */ - break; - } - } - } - } -} /* UpdateSequence */ - -static void -InitFreqCtrl( struct namcona *chip, struct voice *pVoice ) -{ - if( pVoice->freqCtrlTableNo == 0 ) - { - pVoice->freqCtrlPointer = 0; - } - else - { - int addr = ReadMetaDataWord(chip,8); - addr = ReadMetaDataWord(chip,addr+pVoice->freqCtrlTableNo*2); - pVoice->freqCtrlTable = pVoice->freqCtrlTableNo; - pVoice->freqCtrlPointer = addr; - } - pVoice->freqCtrlCounter = 0; - pVoice->freqCtrlFreq = 0; -} - -static void -UpdateFreqCtrl( struct namcona *chip, struct voice *pVoice ) -{ - int addr,freq; - - if( !pVoice->freqCtrlPointer ) return; - - pVoice->freqCtrlCounter += pVoice->freqCtrlSpeed; - if( pVoice->freqCtrlCounter > 0xff ) - { - pVoice->freqCtrlPointer += pVoice->freqCtrlCounter>>8; - pVoice->freqCtrlCounter &= 0xff; - } - - switch( ReadMetaDataByte(chip,pVoice->freqCtrlPointer+1) ) - { - case 0xfd: - pVoice->freqCtrlTable++; - case 0xfe: - addr = ReadMetaDataWord(chip,8); - addr = ReadMetaDataWord(chip,addr+pVoice->freqCtrlTable*2); - pVoice->freqCtrlPointer = addr; - break; - case 0xff: - freq = ReadMetaDataByte(chip,pVoice->freqCtrlPointer+0) * 0x100; - freq -= 100 * 0x100; - freq *= pVoice->freqCtrlAmp; - freq /= 0x100 * 2; - pVoice->freqCtrlFreq = freq; - pVoice->freqCtrlPointer = 0; - break; - default: - freq = ReadMetaDataByte(chip,pVoice->freqCtrlPointer+0) * (0x100 - pVoice->freqCtrlCounter); - freq += ReadMetaDataByte(chip,pVoice->freqCtrlPointer+1) * pVoice->freqCtrlCounter; - freq -= 100 * 0x100; - freq *= pVoice->freqCtrlAmp; - freq /= 0x100 * 2; - pVoice->freqCtrlFreq = freq; - break; - } -} - -static void -InitVolCtrl( struct namcona *chip, struct voice *pVoice ) -{ - pVoice->volCtrlPointer = pVoice->volCtrlTable; - pVoice->volCtrlCounter = pVoice->volCtrlCount; - if( pVoice->volCtrlCounter > 0 ) pVoice->volCtrlCounter++; - if( pVoice->volCtrlPointer ) - { - pVoice->volCtrlSpeed = VolCtrlSpeedTable[ReadMetaDataByte(chip,pVoice->volCtrlPointer) & 0x7f]; - pVoice->volCtrlVolEnd = ReadMetaDataByte(chip,pVoice->volCtrlPointer+1)<<8; - pVoice->volCtrlPointer += 2; - pVoice->volCtrlVol = 0; - } - else - { - pVoice->volCtrlVol = 0xffff; - } -} - -static void -UpdateVolCtrl( struct namcona *chip, struct voice *pVoice ) -{ - if( !pVoice->volCtrlPointer ) return; - - if( pVoice->volCtrlCounter == 1 ) - { - pVoice->volCtrlCounter = 0; - - while( pVoice->volCtrlPointer ) - { - if( ReadMetaDataByte(chip,pVoice->volCtrlPointer) == 0x00 ) - { - if( ReadMetaDataByte(chip,pVoice->volCtrlPointer+1) == 0xff ) - { - pVoice->volCtrlPointer = 0; - pVoice->bActive &= ~1; - } - else - { - pVoice->volCtrlPointer += 2; - pVoice->volCtrlSpeed = VolCtrlSpeedTable[ReadMetaDataByte(chip,pVoice->volCtrlPointer) & 0x7f]; - pVoice->volCtrlVolEnd = ReadMetaDataByte(chip,pVoice->volCtrlPointer+1)<<8; - pVoice->volCtrlPointer += 2; - } - break; - } - pVoice->volCtrlPointer += 2; - } - } - else - { - int next = 0; - - if( pVoice->volCtrlCounter > 0 ) - pVoice->volCtrlCounter--; - - if( pVoice->volCtrlVol < pVoice->volCtrlVolEnd ) - { - pVoice->volCtrlVol += pVoice->volCtrlSpeed; - if( pVoice->volCtrlVol >= pVoice->volCtrlVolEnd ) - { - pVoice->volCtrlVol = pVoice->volCtrlVolEnd; - next = 1; - } - } - else - { - pVoice->volCtrlVol -= pVoice->volCtrlSpeed; - if( pVoice->volCtrlVol <= pVoice->volCtrlVolEnd ) - { - pVoice->volCtrlVol = pVoice->volCtrlVolEnd; - next = 1; - } - } - - if( next ) - { - UINT8 val1, val2; - - val1 = ReadMetaDataByte(chip,pVoice->volCtrlPointer+0); - val2 = ReadMetaDataByte(chip,pVoice->volCtrlPointer+1); - - if( val1 == 0x00 && val2 > 0x80 ) - { - pVoice->volCtrlPointer = 0; - pVoice->bActive &= ~1; - } - else if( val1 != 0x00 || val2 != 0x80 ) - { - if( val1 == 0x00 ) - pVoice->volCtrlPointer = pVoice->volCtrlTable + val2; - pVoice->volCtrlSpeed = VolCtrlSpeedTable[ReadMetaDataByte(chip,pVoice->volCtrlPointer) & 0x7f]; - pVoice->volCtrlVolEnd = ReadMetaDataByte(chip,pVoice->volCtrlPointer+1)<<8; - pVoice->volCtrlPointer += 2; - } - } - } -} - - -static void -InitPanCtrl( struct namcona *chip, struct voice *pVoice ) -{ - if( pVoice->panCtrlTable != 0 && pVoice->panCtrlSpeed != 0) - { - pVoice->panCtrlEnable = 1; - pVoice->panCtrlCounter = ReadMetaDataByte(chip,pVoice->panCtrlTable); - if( pVoice->panCtrlCounter != 0xFE ) - pVoice->pan = ReadMetaDataByte(chip,pVoice->panCtrlTable+1); - } - else - { - pVoice->panCtrlEnable = 0; - } -} - -static void -UpdatePanCtrl( struct namcona *chip, struct voice *pVoice ) -{ - if( pVoice->panCtrlEnable ) - { - if( pVoice->panCtrlCounter == 0 ) - { - UINT8 pan_2 = ReadMetaDataByte(chip,pVoice->panCtrlTable+2); - UINT8 pan_3 = ReadMetaDataByte(chip,pVoice->panCtrlTable+3); - if( !(pan_3&0x80) ) - { - pVoice->pan += pan_3; - if( pVoice->pan > 0xff || pVoice->pan >= pan_2) - { - pVoice->pan = pan_2; - pVoice->panCtrlEnable = 0; - } - } - else - { - pVoice->pan -= 0x100 - pan_3; - if( pVoice->pan < 0 || pVoice->pan <= pan_2) - { - pVoice->pan = pan_2; - pVoice->panCtrlEnable = 0; - } - } - } - else if( pVoice->panCtrlCounter < 0xFE ) - { - pVoice->panCtrlCounter--; - } - else - { - if( pVoice->panCtrlSpeed >= 0 ) - { - pVoice->pan += pVoice->panCtrlSpeed; - if( pVoice->pan > 0xff ) - { - pVoice->pan = 0xff; - pVoice->panCtrlSpeed = -pVoice->panCtrlSpeed; - } - } - else - { - pVoice->pan += pVoice->panCtrlSpeed; - if( pVoice->pan < 0 ) - { - pVoice->pan = 0; - pVoice->panCtrlSpeed = -pVoice->panCtrlSpeed; - } - } - } - } -} - -static void -InitPortament( struct namcona *chip, struct voice *pVoice ) -{ - pVoice->portamentSpeed = pVoice->portament; -} - -static void -UpdatePortament( struct namcona *chip, struct voice *pVoice ) -{ - if( !pVoice->portamentSpeed ) - { - pVoice->portamentNote = pVoice->note; - } - else - { - int note; - note = pVoice->note - pVoice->preNote; - if( note >= 0 ) - { - note = (note/256+1) * pVoice->portamentSpeed / 2; - pVoice->portamentNote += note; - if( pVoice->portamentNote > pVoice->note ) - { - pVoice->portamentNote = pVoice->note; - pVoice->portamentSpeed = 0; - } - } - else - { - note = (-note/256+1) * pVoice->portamentSpeed / 2; - pVoice->portamentNote -= note; - if( pVoice->portamentNote < pVoice->note ) - { - pVoice->portamentNote = pVoice->note; - pVoice->portamentSpeed = 0; - } - } - } -} - -static void -StartPlayNote( struct namcona *chip, struct voice *pVoice ) -{ - if( pVoice->bActive & 4 ) - { - if( pVoice->delayCount == 0) - { - pVoice->bActive &= ~4; - pVoice->bActive |= 1; - pVoice->pos = pVoice->start; - InitFreqCtrl( chip, pVoice ); - InitVolCtrl( chip, pVoice ); - InitPanCtrl( chip, pVoice ); - InitPortament( chip, pVoice ); - } - else - pVoice->delayCount--; - } -} - -static void -UpdatePlayNote( struct namcona *chip, struct voice *pVoice ) -{ - int vol; - UINT16 Note = pVoice->portamentNote + (pVoice->dnote<<8) + pVoice->detune + pVoice->baseFreq; - Note += pVoice->freqCtrlFreq; - Note &= 0x7fff; - pVoice->delta = chip->mpPitchTable[Note>>8]; - pVoice->delta += (chip->mpPitchTable[(Note>>8)+1]-pVoice->delta) * (Note&0xff) / 256; - - vol = (pVoice->volCtrlVol>>8) * pVoice->volume / 256; - pVoice->leftVolume = (0x100-pVoice->pan) * vol / 256; - pVoice->rightVolume = pVoice->pan * vol / 256; -} - -static void -UpdateStatus( struct namcona *chip, struct voice *pVoice ) -{ - StartPlayNote( chip, pVoice ); - if( pVoice->bActive & 1 ) - { - UpdateFreqCtrl( chip, pVoice ); - UpdateVolCtrl( chip, pVoice ); - UpdatePanCtrl( chip, pVoice ); - UpdatePortament( chip, pVoice ); - UpdatePlayNote( chip, pVoice ); - } -} - -static void -UpdateSound( void *param, stream_sample_t **inputs, stream_sample_t **buffer, int length ) -{ - struct namcona *chip = param; - int i; - - for( i=0; imSequence[i] ); - for( i=0; imVoice[i] ); - for( i=0; imSequence[i] ); - for( i=0; imVoice[i] ); - - if( length>chip->mSampleRate ) length = chip->mSampleRate; - memset(chip->mpMixerBuffer, 0, length * sizeof(INT16) * 2); - for( i=0;imVoice[i+16].bActive & 3 ) - pVoice = &chip->mVoice[i+16]; //sound effect is high priority - else - pVoice = &chip->mVoice[i]; - - if( (pVoice->bActive & 3) && pVoice->delta ) - { - INT32 delta = pVoice->delta; - INT32 end = pVoice->end; - INT32 pos = pVoice->pos; - INT32 lvol = pVoice->leftVolume; - INT32 rvol = pVoice->rightVolume; - INT16 *pDest = chip->mpMixerBuffer; - INT16 dat; - int j; - for( j=0; j= end ) - { - if( pVoice->flags&0x1000 ) - { - pos = pos - end + pVoice->loop; - } - else - { - pVoice->bActive &= ~3; - break; - } - } - dat = ReadPCMSample(chip,pos>>FIXED_POINT_SHIFT, pVoice->flags)*32; - *pDest++ += dat*lvol/256; - *pDest++ += dat*rvol/256; - pos += delta; - } - pVoice->pos = pos; - } - } - RenderSamples(chip, buffer, chip->mpMixerBuffer, length ); -} /* UpdateSound */ - -static void *namcona_start(const char *tag, int sndindex, int clock, const void *config) -{ - const namcona_interface *intf = config; - struct namcona *chip; - chip = auto_malloc(sizeof(*chip)); - memset(chip, 0, sizeof(*chip)); - chip->mSampleRate = clock; - chip->mStream = stream_create(0, 2, chip->mSampleRate, chip, UpdateSound); - chip->mpROM = (UINT16 *)intf->memory_base; - chip->mpMetaData = chip->mpROM+intf->metadata_offset; - - memset( chip->mVoice, 0x00, sizeof(chip->mVoice) ); - memset( chip->mSequence, 0x00, sizeof(chip->mSequence) ); - - chip->mpMixerBuffer = auto_malloc( sizeof(INT16)*chip->mSampleRate*2 ); - chip->mpPitchTable = auto_malloc( sizeof(INT32)*0xff ); - { - int i; - for( i=0; i<0xff; i++ ) - { - int data = i; - double freq = freq = (1<0x3a ) - { - data--; - freq *= kTwelfthRootTwo; - } - while( data<0x3a ) - { - data++; - freq /= kTwelfthRootTwo; - } - chip->mpPitchTable[i] = (INT32)freq; - } - } - return chip; -} /* NAMCONA_sh_start */ - -#if 0 -static void -DumpSampleTable( FILE *f, struct namcona *chip, int table, unsigned char *special ) -{ - int iStart = ReadMetaDataWord(chip,table); - int i=iStart; - fprintf( f, "\nsample table:\n" ); - while( i<0x10000 ) - { - fprintf( f, "%04x(%02x): %04x %04x %04x %04x %04x (len=%d)\n", - i, (i-iStart)/10, - ReadMetaDataWord(chip,i+0*2), // flags - ReadMetaDataWord(chip,i+1*2), // start - ReadMetaDataWord(chip,i+2*2), // end - ReadMetaDataWord(chip,i+3*2), // loop - ReadMetaDataWord(chip,i+4*2), // freq - ReadMetaDataWord(chip,i+2*2)-ReadMetaDataWord(chip,i+1*2) ); - i+=5*2; - if( special[i] || special[i+1] ) break; - } - fprintf( f, "\n" ); -} - -static void -DumpBytes( FILE *f, struct namcona *chip, int addr, unsigned char *special ) -{ - fprintf( f, "%04x:", addr ); - while( addr<0x10000 ) - { - fprintf( f, " %02x", ReadMetaDataByte(chip,addr) ); - addr++; - if( (addr&0xf)==0 ) fprintf( f, "\n%04x;", addr ); - if( special[addr] ) break; - } - fprintf( f, "\n" ); -} - -static void -DumpUnkTable( FILE *f, struct namcona *chip, int table, unsigned char *special ) -{ - int iStart = ReadMetaDataWord(chip,table); - int iFinish = ReadMetaDataWord(chip,iStart); - int i,addr; - - if( iFinish=0x10000 || special[addr] ) break; - } - fprintf( f, "\n" ); - } - fprintf( f, "\n" ); -} -#endif - -static void -namcona_stop( void *chip ) -{ - #if 0 - FILE *f = fopen("snd.txt","w"); - if( f ) - { - unsigned char *special = malloc(0x10000); - if( special ) - { - int i,addr, table; - memset( special, 0x00, 0x10000 ); - for( i=0; i<0x12; i+=2 ) - { - addr = ReadMetaDataWord(chip,i); - if( i ) special[addr] = 1; - fprintf( f, "%04x: %04x\n", i, addr ); - } - table = 0x12; - i = table; - while( i<0x10000 ) - { - addr = ReadMetaDataWord(chip,i); - special[addr] = 1; - i+=2; - if( special[i] ) break; - } - DumpSampleTable( f, chip, 0x0002, special ); - DumpSampleTable( f, chip, 0x0004, special ); - /* 0x0006 is unused */ - DumpUnkTable( f, chip, 0x0008, special ); - DumpUnkTable( f, chip, 0x000a, special ); - fprintf( f, "\nunknown chunk:\n" ); - DumpBytes(f, chip, ReadMetaDataWord(chip,0x0c), special ); - DumpSampleTable( f, chip, 0x000e, special ); - fprintf( f, "\nSong Table:\n" ); - i = 0x12; - while( i<0x10000 ) - { - addr = ReadMetaDataWord(chip,i); - fprintf( f, "[%02x] ", (i-0x12)/2 ); - DumpBytes( f,chip,addr,special ); - i+=2; - if( special[i] ) break; - } - free( special ); - } - fclose( f ); - } - #endif -} /* NAMCONA_sh_stop */ - - - - -/************************************************************************** - * Generic get_info - **************************************************************************/ - -static void namcona_set_info(void *token, UINT32 state, sndinfo *info) -{ - switch (state) - { - /* no parameters to set */ - } -} - - -void namcona_get_info(void *token, UINT32 state, sndinfo *info) -{ - switch (state) - { - /* --- the following bits of info are returned as 64-bit signed integers --- */ - - /* --- the following bits of info are returned as pointers to data or functions --- */ - case SNDINFO_PTR_SET_INFO: info->set_info = namcona_set_info; break; - case SNDINFO_PTR_START: info->start = namcona_start; break; - case SNDINFO_PTR_STOP: info->stop = namcona_stop; break; - case SNDINFO_PTR_RESET: /* Nothing */ break; - - /* --- the following bits of info are returned as NULL-terminated strings --- */ - case SNDINFO_STR_NAME: info->s = "Namco NA"; break; - case SNDINFO_STR_CORE_FAMILY: info->s = "Namco custom"; break; - case SNDINFO_STR_CORE_VERSION: info->s = "1.0"; break; - case SNDINFO_STR_CORE_FILE: info->s = __FILE__; break; - case SNDINFO_STR_CORE_CREDITS: info->s = "Copyright Nicola Salmoria and the MAME Team"; break; - } -} - diff --git a/src/emu/sound/namcona.h b/src/emu/sound/namcona.h deleted file mode 100644 index 5eca0095ac6..00000000000 --- a/src/emu/sound/namcona.h +++ /dev/null @@ -1,15 +0,0 @@ -/* namcona1.h */ - -#pragma once - -#ifndef __NAMCONA_H__ -#define __NAMCONA_H__ - -typedef struct _namcona_interface namcona_interface; -struct _namcona_interface -{ - void *memory_base; - int metadata_offset; -}; - -#endif /* __NAMCONA_H__ */ diff --git a/src/emu/sound/sound.mak b/src/emu/sound/sound.mak index d954496b635..d6ec478e444 100644 --- a/src/emu/sound/sound.mak +++ b/src/emu/sound/sound.mak @@ -310,7 +310,6 @@ SOUNDDEFS += -DHAS_NAMCO_15XX=$(if $(filter NAMCO_15XX,$(SOUNDS)),1,0) SOUNDDEFS += -DHAS_NAMCO_CUS30=$(if $(filter NAMCO_CUS30,$(SOUNDS)),1,0) SOUNDDEFS += -DHAS_NAMCO_52XX=$(if $(filter NAMCO_52XX,$(SOUNDS)),1,0) SOUNDDEFS += -DHAS_NAMCO_63701X=$(if $(filter NAMCO_63701X,$(SOUNDS)),1,0) -SOUNDDEFS += -DHAS_NAMCONA=$(if $(filter NAMCONA,$(SOUNDS)),1,0) SOUNDDEFS += -DHAS_C140=$(if $(filter C140,$(SOUNDS)),1,0) SOUNDDEFS += -DHAS_C352=$(if $(filter C352,$(SOUNDS)),1,0) @@ -326,10 +325,6 @@ ifneq ($(filter NAMCO_63701X,$(SOUNDS)),) SOUNDOBJS += $(SOUNDOBJ)/n63701x.o endif -ifneq ($(filter NAMCONA,$(SOUNDS)),) -SOUNDOBJS += $(SOUNDOBJ)/namcona.o -endif - ifneq ($(filter C140,$(SOUNDS)),) SOUNDOBJS += $(SOUNDOBJ)/c140.o endif diff --git a/src/mame/drivers/namcona1.c b/src/mame/drivers/namcona1.c index 2a85a51bb4c..71aad91a565 100644 --- a/src/mame/drivers/namcona1.c +++ b/src/mame/drivers/namcona1.c @@ -18,10 +18,10 @@ NA-2 Games: - X-Day 2 To Do: +- Remove remaining MCU simulation hacks +- View area / screen resolution controlled by registers? -- view area / screen resolution controlled by registers? - -- Xday 2: +- X-Day 2: Rom board M112 Rom board custom Key chip i.d. C394 Game uses a small cash-register type printer (connects to rom board) @@ -162,16 +162,11 @@ Notes: #include "deprecat.h" #include "namcona1.h" #include "sound/c140.h" -#include "sound/namcona.h" #include "cpu/m37710/m37710.h" static UINT16 *mpBank0, *mpBank1; -static UINT8 mCoinCount[4]; -static UINT8 mCoinState; -static UINT16 *mcu_ram; static int mEnableInterrupts; int namcona1_gametype; -static int is_na2; /*************************************************************************/ @@ -370,264 +365,15 @@ static INPUT_PORTS_START( namcona1_quiz ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 ) INPUT_PORTS_END -static INPUT_PORTS_START( namcona2_joy ) - PORT_START("DSW") - PORT_DIPNAME( 0x01, 0x00, "DIP2 (Freeze)" ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x01, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x00, "DIP1 (Test)" ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x02, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x00, DEF_STR( Test ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x20, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x00, "SERVICE" ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x40, DEF_STR( On ) ) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SERVICE ) - - PORT_START("P1") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON3 ) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_START1 ) - - PORT_START("P2") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_START2 ) - - PORT_START("P3") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(3) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(3) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(3) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(3) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(3) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(3) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(3) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_START3 ) - - PORT_START("P4") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(4) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(4) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(4) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(4) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(4) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(4) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(4) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_START4 ) - - PORT_START("COIN") - PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_COIN1 ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN2 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN3 ) - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN4 ) -INPUT_PORTS_END - -static INPUT_PORTS_START( namcona2_quiz ) - PORT_START("DSW") - PORT_DIPNAME( 0x01, 0x00, "DIP2 (Freeze)" ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x01, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x00, "DIP1 (Test)" ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x02, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x00, DEF_STR( Test ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x20, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x00, "SERVICE" ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x40, DEF_STR( On ) ) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SERVICE ) - - PORT_START("P1") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_START1 ) - - PORT_START("P2") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_START2 ) - - PORT_START("P3") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(3) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(3) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(3) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(3) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_START3 ) - - PORT_START("P4") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(4) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(4) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(4) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(4) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_START4 ) - - PORT_START("COIN") - PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_COIN1 ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN2 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN3 ) - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN4 ) -INPUT_PORTS_END /***************************************************************************/ -static void -simulate_mcu( running_machine *machine ) +/* FIXME: These two functions shouldn't be necessary? */ +static void simulate_mcu( running_machine *machine ) { - int i; - UINT16 data; - UINT8 poll_coins; - static const char *const portnames[] = { "P1", "P2", "P3", "P4" }; - namcona1_workram[0xf60/2] = 0x0000; /* mcu ready */ - - if (is_na2) - { - mcu_ram[0xfc0/2] = input_port_read(machine, "DSW"); /* dipswitch */ - - for( i=1; i<=4; i++ ) - { - data = input_port_read(machine, portnames[i-1])<<8; - switch( namcona1_gametype ) - { - case NAMCO_KNCKHEAD: - case NAMCO_BKRTMAQ: - case NAMCO_QUIZTOU: - case NAMCO_EXBANIA: - data |= data>>8; - break; - - case NAMCO_XDAY2: - data |= data>>8; /* wrong! */ - break; - - case NAMCO_TINKLPIT: - if( data&0x2000 ) data |= 0x20; /* throw */ - if( data&0x4000 ) data |= 0x10; /* jump */ - if( i==1 ) - { - if( input_port_read(machine, "P1") & 0x80 ) data |= 0x80; /* P1 start */ - } - if( i==2 ) - { - if( input_port_read(machine, "P2") & 0x80 ) data |= 0x80; /* P2 start */ - } - break; - - default: - break; - } - mcu_ram[0xfc0/2+i] = data; - } - - /* "analog" and "encoder" ports are polled during test mode, - * but I haven't found any games that make use of them. - */ - mcu_ram[0xfc0/2+0x05] = 0xffff; /* analog0,1 */ - mcu_ram[0xfc0/2+0x06] = 0xffff; /* analog2,3 */ - mcu_ram[0xfc0/2+0x07] = 0xffff; /* analog4,5 */ - mcu_ram[0xfc0/2+0x08] = 0xffff; /* analog6,7 */ - mcu_ram[0xfc0/2+0x09] = 0xffff; /* encoder0,1 */ - - poll_coins = input_port_read(machine, "COIN"); /* coin input */ - if( (poll_coins&0x8)&~(mCoinState&0x8) ) mCoinCount[0]++; - if( (poll_coins&0x4)&~(mCoinState&0x4) ) mCoinCount[1]++; - if( (poll_coins&0x2)&~(mCoinState&0x2) ) mCoinCount[2]++; - if( (poll_coins&0x1)&~(mCoinState&0x1) ) mCoinCount[3]++; - mCoinState = poll_coins; - - mcu_ram[0xfc0/2+0xa] = (mCoinCount[0]<<8)|mCoinCount[1]; - mcu_ram[0xfc0/2+0xb] = (mCoinCount[2]<<8)|mCoinCount[3]; - - /* special handling for F/A */ - data = ~((input_port_read(machine, "P1")<<8)|input_port_read(machine, "P2")); - mcu_ram[0xffc/2] = data; - mcu_ram[0xffe/2] = data; - - if( namcona1_gametype == NAMCO_XDAY2 ) - { - int p1 = input_port_read(machine, "P1"); - int p2 = input_port_read(machine, "P2"); - UINT32 code = 0; - if( p2&0x40 ) code |= 0x2000; // enter (top-level of self-test) - if( p2&0x20 ) code |= 0x1000; // exit (top-level of self-test) - if( p1&0x40 ) code |= 0x0020; // next (top-level of self-test) - if( p1&0x20 ) code |= 0x0010; // prev (top-level of self-test) - code = ~code; - mcu_ram[0xffc/2] = code>>16; - mcu_ram[0xffe/2] = code&0xffff; - } - } -} /* simulate_mcu */ - -#ifdef UNUSED_FUNCTION -static READ16_HANDLER( namcona1_mcu_r ) -{ - return mcu_ram[offset]; } -#endif -static WRITE16_HANDLER( namcona1_mcu_w ) -{ - COMBINE_DATA( &mcu_ram[offset] ); - if( offset>=0x400/2 && (offset<0x820/2 || (offset>=0xf30/2 && offset<0xf72/2)) ) - { - logerror( "0x%03x: 0x%04x\n", offset*2, mcu_ram[offset] ); - } - /* - 400..53d code for MCU? - - 820: song select - 822: song control (volume? tempo?) - 824,826,828,....89e: sample select - 0x40 is written to odd addresses to signal the MCU that a sound command has been issued - - 8f0: 0x07 unknown - 8f2: 0x01 unknown - 8f4: 0xa4 unknown - - f30..f71 data for MCU - f72: MCU command: - 0x07 = identify version - 0x03 = process data - 0x87 = ? - - fc0..fc9: used by knuckleheads (NA2-specific?) - - fd8: ? - - fbf: watchdog - */ -} /* NA2 hardware sends a special command to the MCU, then tests to * see if the proper BIOS version string appears in shared memory. @@ -643,58 +389,7 @@ static void write_version_info( void ) { namcona1_workram[0x1000/2+i] = source[i]; } -} /* write_version_info */ - -static WRITE16_HANDLER( mcu_command_w ) -{ - UINT16 cmd = mcu_ram[0xf72/2]>>8; - - switch( cmd ){ - case 0x03: - /* Process data at 0xf30..0xf71 - * - * f30: 0101 0020 0400 013e 8a00 0000 0000 011e - * f40: 0301 0000 0000 0000 8a16 0000 0000 012c - * f50: 0301 0000 0000 0000 8a61 0000 0000 019e - * f60: 0301 0000 0000 0000 8a61 0000 0000 01ae - * f70: 0000 - * - * f30: 0301 0000 0000 0000 8a88 0000 0000 0120 - * f40: 0301 0000 0000 0000 8ad1 0000 0000 015a - * f50: 0301 0000 0000 0000 8af6 0000 0000 011c - * f60: 0301 0000 0000 0000 8b08 0000 0000 0114 - * f70: 0000 - * - * f30: 0300 0000 0000 0000 8b1f 2004 0000 0000 - * f40: 0301 0000 0000 0000 8b33 0000 0000 8902 - * f50: 0000 - */ - break; - - case 0x07: - /* This command is used to detect Namco NA-2 hardware; without it, - * NA-2 games (Knuckleheads, Numan Athletics) refuse to run. - */ - write_version_info(); - break; - } -} /* mcu_command_w */ - -/***************************************************************************/ -/* sound - * - * 8 bit signed PCM data - * copied to workram - * - * 0x01fffc: pointer - * 0x020000: samples - * 0x040000: samples - * 0x060000: samples - * - * 0x070000: metadata; 10 byte frames - */ - -/***************************************************************************/ +} /** * "Custom Key" Emulation @@ -800,8 +495,7 @@ static READ16_HANDLER( namcona1_vreg_r ) return namcona1_vreg[offset]; } /* namcona1_vreg_r */ -static int -transfer_dword( running_machine *machine, UINT32 dest, UINT32 source ) +static int transfer_dword( running_machine *machine, UINT32 dest, UINT32 source ) { UINT16 data; @@ -846,8 +540,7 @@ transfer_dword( running_machine *machine, UINT32 dest, UINT32 source ) return 0; } /* transfer_dword */ -static void -blit_setup( int format, int *bytes_per_row, int *pitch, int mode ) +static void blit_setup( int format, int *bytes_per_row, int *pitch, int mode ) { if( mode == 3 ) { /* TILE DATA */ @@ -1027,9 +720,18 @@ static WRITE16_HANDLER( mcu_mailbox_w_68k ) { // logerror("mailbox_w_68k: %x @ %x\n", data, offset); - if (offset == 4) cpunum_set_input_line(machine, 1, M37710_LINE_IRQ0, HOLD_LINE); + if (offset == 4) + cpunum_set_input_line(machine, 1, M37710_LINE_IRQ0, HOLD_LINE); COMBINE_DATA(&mcu_mailbox[offset%8]); + + /* FIXME: This shouldn't be necessary now that the C70 BIOS is implemented, + but for some reason the MCU never responds to the version string command */ + if ( (namcona1_gametype == NAMCO_NUMANATH) || (namcona1_gametype == NAMCO_KNCKHEAD) ) + { + if ((namcona1_workram[0xf72/2] >> 8) == 7) + write_version_info(); + } } static WRITE16_HANDLER( mcu_mailbox_w_mcu ) @@ -1053,6 +755,29 @@ static ADDRESS_MAP_START( namcona1_main_map, ADDRESS_SPACE_PROGRAM, 16 ) AM_RANGE(0xfff000, 0xffffff) AM_RAM AM_BASE(&spriteram16) /* spriteram */ ADDRESS_MAP_END + +static ADDRESS_MAP_START( namcona2_main_map, ADDRESS_SPACE_PROGRAM, 16 ) + AM_RANGE(0x000000, 0x07ffff) AM_RAM AM_BASE(&namcona1_workram) + AM_RANGE(0x3f8000, 0x3fffff) AM_READWRITE(mcu_mailbox_r, mcu_mailbox_w_68k) + AM_RANGE(0x400000, 0xbfffff) AM_ROM AM_REGION("main", 0x280000) /* data */ + AM_RANGE(0xd00000, 0xd00001) AM_WRITE(SMH_NOP) /* xday: serial out? */ + AM_RANGE(0xd40000, 0xd40001) AM_WRITE(SMH_NOP) /* xday: serial out? */ + AM_RANGE(0xd80000, 0xd80001) AM_WRITE(SMH_NOP) /* xday: serial out? */ + AM_RANGE(0xdc0000, 0xdc001f) AM_WRITE(SMH_NOP) /* xday: serial config? */ + AM_RANGE(0xc00000, 0xdfffff) AM_ROM AM_REGION("main", 0x080000) /* code */ + AM_RANGE(0xe00000, 0xe00fff) AM_READWRITE(namcona1_nvram_r, namcona1_nvram_w) + /* xday: additional battery-backed ram at 00E024FA? */ + AM_RANGE(0xe40000, 0xe4000f) AM_READWRITE(custom_key_r, custom_key_w) + AM_RANGE(0xefff00, 0xefffff) AM_READWRITE(namcona1_vreg_r, namcona1_vreg_w) AM_BASE(&namcona1_vreg) + AM_RANGE(0xf00000, 0xf01fff) AM_READWRITE(namcona1_paletteram_r, namcona1_paletteram_w) AM_BASE(&paletteram16) + AM_RANGE(0xf40000, 0xf7ffff) AM_READWRITE(namcona1_gfxram_r, namcona1_gfxram_w) + AM_RANGE(0xff0000, 0xffbfff) AM_READWRITE(namcona1_videoram_r, namcona1_videoram_w) AM_BASE(&videoram16) + AM_RANGE(0xffd000, 0xffdfff) AM_RAM /* unknown */ + AM_RANGE(0xffe000, 0xffefff) AM_RAM AM_BASE(&namcona1_scroll) /* scroll registers */ + AM_RANGE(0xfff000, 0xffffff) AM_RAM AM_BASE(&spriteram16) /* spriteram */ +ADDRESS_MAP_END + + /* ----- NA-1 MCU handling ----------------------------------- */ static READ16_HANDLER( na1mcu_shared_r ) @@ -1285,7 +1010,7 @@ static MACHINE_DRIVER_START( namcona1 ) MDRV_CPU_PROGRAM_MAP(namcona1_main_map,0) MDRV_CPU_VBLANK_INT_HACK(namcona1_interrupt,5) - MDRV_CPU_ADD("mcu", M37710, 50113000/4) + MDRV_CPU_ADD("mcu", M37702, 50113000/4) MDRV_CPU_PROGRAM_MAP(namcona1_mcu_map, 0) MDRV_CPU_IO_MAP( namcona1_mcu_io_map, 0 ) MDRV_CPU_VBLANK_INT_HACK(mcu_interrupt, 2) @@ -1331,83 +1056,18 @@ static MACHINE_DRIVER_START( namcona1w ) MDRV_SCREEN_VISIBLE_AREA(0, 38*8-1-0, 4*8, 32*8-1) MACHINE_DRIVER_END -static ADDRESS_MAP_START( namcona2_readmem, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x07ffff) AM_READ(SMH_RAM) /* work RAM */ - AM_RANGE(0x400000, 0xbfffff) AM_ROM AM_REGION("main", 0x280000) /* data */ - AM_RANGE(0xc00000, 0xdfffff) AM_ROM AM_REGION("main", 0x080000) /* code */ - AM_RANGE(0xe00000, 0xe00fff) AM_READ(namcona1_nvram_r) - /* xday: additional battery-backed ram at 00E024FA? */ - AM_RANGE(0xe40000, 0xe4000f) AM_READ(custom_key_r) - AM_RANGE(0xefff00, 0xefffff) AM_READ(namcona1_vreg_r) - AM_RANGE(0xf00000, 0xf01fff) AM_READ(namcona1_paletteram_r) - AM_RANGE(0xf40000, 0xf7ffff) AM_READ(namcona1_gfxram_r) - AM_RANGE(0xff0000, 0xffbfff) AM_READ(namcona1_videoram_r) - AM_RANGE(0xffd000, 0xffdfff) AM_READ(SMH_RAM) /* unknown */ - AM_RANGE(0xffe000, 0xffefff) AM_READ(SMH_RAM) /* scroll registers */ - AM_RANGE(0xfff000, 0xffffff) AM_READ(SMH_RAM) /* spriteram */ -ADDRESS_MAP_END - -static ADDRESS_MAP_START( namcona2_writemem, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x000fff) AM_WRITE(namcona1_mcu_w) AM_BASE(&mcu_ram) - AM_RANGE(0x000000, 0x07ffff) AM_WRITE(SMH_RAM) AM_BASE(&namcona1_workram) - AM_RANGE(0x3f8008, 0x3f8009) AM_WRITE(mcu_command_w) - AM_RANGE(0xd00000, 0xd00001) AM_WRITE(SMH_NOP) /* xday: serial out? */ - AM_RANGE(0xd40000, 0xd40001) AM_WRITE(SMH_NOP) /* xday: serial out? */ - AM_RANGE(0xd80000, 0xd80001) AM_WRITE(SMH_NOP) /* xday: serial out? */ - AM_RANGE(0xdc0000, 0xdc001f) AM_WRITE(SMH_NOP) /* xday: serial config? */ - AM_RANGE(0x400000, 0xdfffff) AM_WRITE(SMH_ROM) /* data + code */ - AM_RANGE(0xe00000, 0xe00fff) AM_WRITE(namcona1_nvram_w) - AM_RANGE(0xe40000, 0xe4000f) AM_WRITE(custom_key_w) - AM_RANGE(0xefff00, 0xefffff) AM_WRITE(namcona1_vreg_w) AM_BASE(&namcona1_vreg) - AM_RANGE(0xf00000, 0xf01fff) AM_WRITE(namcona1_paletteram_w) AM_BASE(&paletteram16) - AM_RANGE(0xf40000, 0xf7ffff) AM_WRITE(namcona1_gfxram_w) - AM_RANGE(0xff0000, 0xffbfff) AM_WRITE(namcona1_videoram_w) AM_BASE(&videoram16) - AM_RANGE(0xffd000, 0xffdfff) AM_WRITE(SMH_RAM) /* unknown */ - AM_RANGE(0xffe000, 0xffefff) AM_WRITE(SMH_RAM) AM_BASE(&namcona1_scroll) - AM_RANGE(0xfff000, 0xffffff) AM_WRITE(SMH_RAM) AM_BASE(&spriteram16) -ADDRESS_MAP_END - -static namcona_interface NAMCONA_interface = -{ - NULL, - 0x70000/2 -}; static MACHINE_DRIVER_START( namcona2 ) + /* basic machine hardware */ - MDRV_CPU_ADD("main", M68000, 50113000/4) - MDRV_CPU_PROGRAM_MAP(namcona2_readmem,namcona2_writemem) - MDRV_CPU_VBLANK_INT_HACK(namcona1_interrupt,5) + MDRV_IMPORT_FROM(namcona1) - MDRV_NVRAM_HANDLER(namcosna1) - MDRV_INTERLEAVE(40) - - /* video hardware */ - MDRV_VIDEO_ATTRIBUTES(VIDEO_HAS_SHADOWS) - - MDRV_SCREEN_ADD("main", RASTER) - MDRV_SCREEN_REFRESH_RATE(60) - MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MDRV_SCREEN_SIZE(38*8, 32*8) - MDRV_SCREEN_VISIBLE_AREA(8, 38*8-1-8, 4*8, 32*8-1) - - MDRV_PALETTE_LENGTH(0x2000) - - MDRV_VIDEO_START(namcona1) - MDRV_VIDEO_UPDATE(namcona1) - - /* sound hardware */ - MDRV_SPEAKER_STANDARD_STEREO("left", "right") - - MDRV_SOUND_ADD("namco", NAMCONA, 4*8000) - MDRV_SOUND_CONFIG(NAMCONA_interface) - MDRV_SOUND_ROUTE(0, "left", 1.0) - MDRV_SOUND_ROUTE(1, "right", 1.0) + MDRV_CPU_REPLACE("main", M68000, 50113000/4) + MDRV_CPU_PROGRAM_MAP(namcona2_main_map, 0) MACHINE_DRIVER_END -static void -init_namcona1( running_machine *machine, int gametype ) + +static void init_namcona1( running_machine *machine, int gametype ) { UINT16 *pMem = (UINT16 *)memory_region( machine, "main" ); @@ -1415,46 +1075,21 @@ init_namcona1( running_machine *machine, int gametype ) mpBank0 = &pMem[0x80000/2]; mpBank1 = mpBank0 + 0x200000/2; - is_na2 = 0; mEnableInterrupts = 0; } -static void -init_namcona2( running_machine *machine, int gametype ) -{ - UINT16 *pMem = (UINT16 *)memory_region( machine, "main" ); - - namcona1_workram[0] = 0x0007; namcona1_workram[1] = 0xfffc; /* (?) stack */ - namcona1_workram[2] = 0x00c0; namcona1_workram[3] = 0x0000; /* reset vector */ - - namcona1_gametype = gametype; - mpBank0 = &pMem[0x80000/2]; - mpBank1 = mpBank0 + 0x200000/2; - - is_na2 = 1; - mCoinCount[0] = mCoinCount[1] = mCoinCount[2] = mCoinCount[3] = 0; - mCoinState = 0; - mEnableInterrupts = 0; - - NAMCONA_interface.memory_base = namcona1_workram; - if (namcona1_gametype == NAMCO_KNCKHEAD) - NAMCONA_interface.metadata_offset = 0x10000/2; - else - NAMCONA_interface.metadata_offset = 0x70000/2; -} - static DRIVER_INIT( bkrtmaq ){ init_namcona1(machine, NAMCO_BKRTMAQ); } static DRIVER_INIT( cgangpzl ){ init_namcona1(machine, NAMCO_CGANGPZL); } -static DRIVER_INIT( emeralda ){ init_namcona2(machine, NAMCO_EMERALDA); } /* NA-2 Hardware */ +static DRIVER_INIT( emeralda ){ init_namcona1(machine, NAMCO_EMERALDA); } /* NA-2 Hardware */ static DRIVER_INIT( emeraldj ){ init_namcona1(machine, NAMCO_EMERALDA); } /* NA-1 Hardware */ static DRIVER_INIT( exbania ){ init_namcona1(machine, NAMCO_EXBANIA); } static DRIVER_INIT( fa ){ init_namcona1(machine, NAMCO_FA); } -static DRIVER_INIT( knckhead ){ init_namcona2(machine, NAMCO_KNCKHEAD); } -static DRIVER_INIT( numanath ){ init_namcona2(machine, NAMCO_NUMANATH); } -static DRIVER_INIT( quiztou ){ init_namcona2(machine, NAMCO_QUIZTOU); } +static DRIVER_INIT( knckhead ){ init_namcona1(machine, NAMCO_KNCKHEAD); } +static DRIVER_INIT( numanath ){ init_namcona1(machine, NAMCO_NUMANATH); } +static DRIVER_INIT( quiztou ){ init_namcona1(machine, NAMCO_QUIZTOU); } static DRIVER_INIT( swcourt ){ init_namcona1(machine, NAMCO_SWCOURT); } static DRIVER_INIT( tinklpit ){ init_namcona1(machine, NAMCO_TINKLPIT); } -static DRIVER_INIT( xday2 ){ init_namcona2(machine, NAMCO_XDAY2); } +static DRIVER_INIT( xday2 ){ init_namcona1(machine, NAMCO_XDAY2); } ROM_START( bkrtmaq ) ROM_REGION( 0xa80000, "main", 0 ) @@ -1633,8 +1268,8 @@ ROM_START( emeralda ) /* NA-2 Game PCB, clones are NA-1 based; see games listed ROM_LOAD16_BYTE( "em2-ep1u.7f", 0x180000, 0x080000, CRC(dee15a81) SHA1(474a264029bd77e4205773a7461dea695e65933f) ) /* M37702 BIOS - labeled as Namco custom C70 */ - ROM_REGION16_LE( 0x4000, "cpu1", 0 ) - ROM_LOAD( "c70.bin", 0x000000, 0x004000, NO_DUMP ) + ROM_REGION16_LE( 0x4000, "mcu", 0 ) + ROM_LOAD( "c70.bin", 0x000000, 0x004000, CRC(b4015f23) SHA1(7ce91eda76e86b5cab625e2b67c463b7d143832e) ) ROM_END ROM_START( knckhead ) @@ -1654,8 +1289,8 @@ ROM_START( knckhead ) ROM_LOAD16_BYTE( "kh1-ma3u.bin", 0x880000, 0x100000, CRC(efeb768d) SHA1(15d016244549f3ea0d19f5cfb04bcebd65ac6134) ) /* M37702 BIOS - labeled as Namco custom C70 */ - ROM_REGION16_LE( 0x4000, "cpu1", 0 ) - ROM_LOAD( "c70.bin", 0x000000, 0x004000, NO_DUMP ) + ROM_REGION16_LE( 0x4000, "mcu", 0 ) + ROM_LOAD( "c70.bin", 0x000000, 0x004000, CRC(b4015f23) SHA1(7ce91eda76e86b5cab625e2b67c463b7d143832e) ) ROM_END ROM_START( knckhedj ) @@ -1675,8 +1310,8 @@ ROM_START( knckhedj ) ROM_LOAD16_BYTE( "kh1-ma3u.bin", 0x880000, 0x100000, CRC(efeb768d) SHA1(15d016244549f3ea0d19f5cfb04bcebd65ac6134) ) /* M37702 BIOS - labeled as Namco custom C70 */ - ROM_REGION16_LE( 0x4000, "cpu1", 0 ) - ROM_LOAD( "c70.bin", 0x000000, 0x004000, NO_DUMP ) + ROM_REGION16_LE( 0x4000, "mcu", 0 ) + ROM_LOAD( "c70.bin", 0x000000, 0x004000, CRC(b4015f23) SHA1(7ce91eda76e86b5cab625e2b67c463b7d143832e) ) ROM_END ROM_START( numanath ) @@ -1696,8 +1331,8 @@ ROM_START( numanath ) ROM_LOAD16_BYTE( "nm1-ma3u.bin", 0x880000, 0x100000, CRC(f79e2112) SHA1(8bb8639a9d3a5d3ac5c9bb78e72b3d76582a9c25) ) /* M37702 BIOS - labeled as Namco custom C70 */ - ROM_REGION16_LE( 0x4000, "cpu1", 0 ) - ROM_LOAD( "c70.bin", 0x000000, 0x004000, NO_DUMP ) + ROM_REGION16_LE( 0x4000, "mcu", 0 ) + ROM_LOAD( "c70.bin", 0x000000, 0x004000, CRC(b4015f23) SHA1(7ce91eda76e86b5cab625e2b67c463b7d143832e) ) ROM_END ROM_START( numanatj ) @@ -1717,8 +1352,8 @@ ROM_START( numanatj ) ROM_LOAD16_BYTE( "nm1-ma3u.bin", 0x880000, 0x100000, CRC(f79e2112) SHA1(8bb8639a9d3a5d3ac5c9bb78e72b3d76582a9c25) ) /* M37702 BIOS - labeled as Namco custom C70 */ - ROM_REGION16_LE( 0x4000, "cpu1", 0 ) - ROM_LOAD( "c70.bin", 0x000000, 0x004000, NO_DUMP ) + ROM_REGION16_LE( 0x4000, "mcu", 0 ) + ROM_LOAD( "c70.bin", 0x000000, 0x004000, CRC(b4015f23) SHA1(7ce91eda76e86b5cab625e2b67c463b7d143832e) ) ROM_END ROM_START( quiztou ) @@ -1738,8 +1373,8 @@ ROM_START( quiztou ) ROM_LOAD16_BYTE( "qt1ma3u.5f", 0x880000, 0x100000, CRC(14a5a163) SHA1(1107f50e491bedeb4ab7ac3f32cfe47727274ba9) ) /* M37702 BIOS - labeled as Namco custom C70 */ - ROM_REGION16_LE( 0x4000, "cpu1", 0 ) - ROM_LOAD( "c70.bin", 0x000000, 0x004000, NO_DUMP ) + ROM_REGION16_LE( 0x4000, "mcu", 0 ) + ROM_LOAD( "c70.bin", 0x000000, 0x004000, CRC(b4015f23) SHA1(7ce91eda76e86b5cab625e2b67c463b7d143832e) ) ROM_END ROM_START( xday2 ) @@ -1753,28 +1388,28 @@ ROM_START( xday2 ) ROM_LOAD16_BYTE( "xds1-dat3.8c", 0x680000, 0x200000, CRC(8980acc4) SHA1(ecd94a3d3a38923e8e322cd8863671af26e30812) ) /* M37702 BIOS - labeled as Namco custom C70 */ - ROM_REGION16_LE( 0x4000, "cpu1", 0 ) - ROM_LOAD( "c70.bin", 0x000000, 0x004000, NO_DUMP ) + ROM_REGION16_LE( 0x4000, "mcu", 0 ) + ROM_LOAD( "c70.bin", 0x000000, 0x004000, CRC(b4015f23) SHA1(7ce91eda76e86b5cab625e2b67c463b7d143832e) ) ROM_END // NA-1 (C69 MCU) GAME( 1992,bkrtmaq, 0, namcona1w, namcona1_quiz,bkrtmaq, ROT0, "Namco", "Bakuretsu Quiz Ma-Q Dai Bouken (Japan)", 0 ) -GAME( 1992,cgangpzl, 0, namcona1w, namcona1_joy, cgangpzl, ROT0, "Namco", "Cosmo Gang the Puzzle (US)", 0 ) -GAME( 1992,cgangpzj, cgangpzl, namcona1w, namcona1_joy, cgangpzl, ROT0, "Namco", "Cosmo Gang the Puzzle (Japan)", 0 ) -GAME( 1992,exvania, 0, namcona1, namcona1_joy, exbania, ROT0, "Namco", "Exvania (Japan)", 0 ) -GAME( 1992,fghtatck, 0, namcona1, namcona1_joy, fa, ROT90,"Namco", "Fighter & Attacker (US)", 0 ) -GAME( 1992,fa, fghtatck, namcona1, namcona1_joy, fa, ROT90,"Namco", "F/A (Japan)", 0 ) -GAME( 1992,swcourt, 0, namcona1w, namcona1_joy, swcourt, ROT0, "Namco", "Super World Court (World)", 0 ) -GAME( 1992,swcourtj, swcourt, namcona1w, namcona1_joy, swcourt, ROT0, "Namco", "Super World Court (Japan)", 0 ) -GAME( 1993,emeraldj, emeralda, namcona1w, namcona1_joy, emeraldj, ROT0, "Namco", "Emeraldia (Japan Version B)", 0 ) /* Parent is below on NA-2 Hardware */ -GAME( 1993,emerldja, emeralda, namcona1w, namcona1_joy, emeraldj, ROT0, "Namco", "Emeraldia (Japan)", 0 ) /* Parent is below on NA-2 Hardware */ -GAME( 1993,tinklpit, 0, namcona1w, namcona1_joy, tinklpit, ROT0, "Namco", "Tinkle Pit (Japan)", 0 ) +GAME( 1992,cgangpzl, 0, namcona1w, namcona1_joy, cgangpzl, ROT0, "Namco", "Cosmo Gang the Puzzle (US)", 0 ) +GAME( 1992,cgangpzj, cgangpzl, namcona1w, namcona1_joy, cgangpzl, ROT0, "Namco", "Cosmo Gang the Puzzle (Japan)", 0 ) +GAME( 1992,exvania, 0, namcona1, namcona1_joy, exbania, ROT0, "Namco", "Exvania (Japan)", 0 ) +GAME( 1992,fghtatck, 0, namcona1, namcona1_joy, fa, ROT90,"Namco", "Fighter & Attacker (US)", 0 ) +GAME( 1992,fa, fghtatck, namcona1, namcona1_joy, fa, ROT90,"Namco", "F/A (Japan)", 0 ) +GAME( 1992,swcourt, 0, namcona1w, namcona1_joy, swcourt, ROT0, "Namco", "Super World Court (World)", 0 ) +GAME( 1992,swcourtj, swcourt, namcona1w, namcona1_joy, swcourt, ROT0, "Namco", "Super World Court (Japan)", 0 ) +GAME( 1993,emeraldj, emeralda, namcona1w, namcona1_joy, emeraldj, ROT0, "Namco", "Emeraldia (Japan Version B)", 0 ) /* Parent is below on NA-2 Hardware */ +GAME( 1993,emerldja, emeralda, namcona1w, namcona1_joy, emeraldj, ROT0, "Namco", "Emeraldia (Japan)", 0 ) /* Parent is below on NA-2 Hardware */ +GAME( 1993,tinklpit, 0, namcona1w, namcona1_joy, tinklpit, ROT0, "Namco", "Tinkle Pit (Japan)", 0 ) // NA-2 (C70 MCU) -GAME( 1992,knckhead, 0, namcona2, namcona2_joy, knckhead, ROT0, "Namco", "Knuckle Heads (World)", GAME_IMPERFECT_SOUND ) -GAME( 1992,knckhedj, knckhead, namcona2, namcona2_joy, knckhead, ROT0, "Namco", "Knuckle Heads (Japan)", GAME_IMPERFECT_SOUND ) -GAME( 1993,emeralda, 0, namcona2, namcona2_joy, emeralda, ROT0, "Namco", "Emeraldia (World)", GAME_IMPERFECT_SOUND ) -GAME( 1993,numanath, 0, namcona2, namcona2_joy, numanath, ROT0, "Namco", "Numan Athletics (World)", GAME_IMPERFECT_SOUND ) -GAME( 1993,numanatj, numanath, namcona2, namcona2_joy, numanath, ROT0, "Namco", "Numan Athletics (Japan)", GAME_IMPERFECT_SOUND ) -GAME( 1993,quiztou, 0, namcona2, namcona2_quiz,quiztou, ROT0, "Namco", "Nettou! Gekitou! Quiztou!! (Japan)", GAME_IMPERFECT_SOUND ) -GAME( 1995,xday2, 0, namcona2, namcona2_joy, xday2, ROT0, "Namco", "X-Day 2 (Japan)", GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +GAME( 1992,knckhead, 0, namcona2, namcona1_joy, knckhead, ROT0, "Namco", "Knuckle Heads (World)", 0 ) +GAME( 1992,knckhedj, knckhead, namcona2, namcona1_joy, knckhead, ROT0, "Namco", "Knuckle Heads (Japan)", 0 ) +GAME( 1993,emeralda, 0, namcona2, namcona1_joy, emeralda, ROT0, "Namco", "Emeraldia (World)", 0 ) +GAME( 1993,numanath, 0, namcona2, namcona1_joy, numanath, ROT0, "Namco", "Numan Athletics (World)", 0 ) +GAME( 1993,numanatj, numanath, namcona2, namcona1_joy, numanath, ROT0, "Namco", "Numan Athletics (Japan)", 0 ) +GAME( 1993,quiztou, 0, namcona2, namcona1_quiz,quiztou, ROT0, "Namco", "Nettou! Gekitou! Quiztou!! (Japan)", 0 ) +GAME( 1995,xday2, 0, namcona2, namcona1_joy, xday2, ROT0, "Namco", "X-Day 2 (Japan)", GAME_IMPERFECT_GRAPHICS ) diff --git a/src/mame/mame.mak b/src/mame/mame.mak index 0185fe7733f..e9fd8ce61c1 100644 --- a/src/mame/mame.mak +++ b/src/mame/mame.mak @@ -263,7 +263,6 @@ SOUNDS += NAMCO_15XX SOUNDS += NAMCO_CUS30 SOUNDS += NAMCO_52XX SOUNDS += NAMCO_63701X -SOUNDS += NAMCONA SOUNDS += SNKWAVE SOUNDS += C140 SOUNDS += C352