diff options
Diffstat (limited to 'src/mame/drivers')
-rw-r--r-- | src/mame/drivers/highvdeo.c | 47 | ||||
-rw-r--r-- | src/mame/drivers/mpu4.c | 24 |
2 files changed, 53 insertions, 18 deletions
diff --git a/src/mame/drivers/highvdeo.c b/src/mame/drivers/highvdeo.c index c53181aca83..7d28da446b9 100644 --- a/src/mame/drivers/highvdeo.c +++ b/src/mame/drivers/highvdeo.c @@ -26,7 +26,7 @@ Port layout: 0x0000 W Keyboard Lights control port 0x0002 W \ Hopper or ticket related 0x0004 W / -0x0006 W OKI6395 ADPCM command: need to be latched +0x0006 W OKI6395 (6376?)ADPCM command: need to be latched 0x0010 W Like 0x3c8 in VGA 0x0014 W Like 0x3c9 in VGA @@ -235,14 +235,24 @@ static WRITE16_HANDLER( tv_vcf_bankselect_w ) } -static WRITE16_DEVICE_HANDLER( tv_oki6395_w ) +static WRITE16_DEVICE_HANDLER( tv_oki6376_w ) { static int okidata; - if (ACCESSING_BITS_0_7 && okidata != data) { + if (ACCESSING_BITS_0_7 && okidata != data) + { okidata = data; - okim6376_w(device, 0, data); - okim6376_w(device, 0, (1 << 4)); + okim6376_w(device, 0, data & ~0x80); + okim6376_st_w (device, data & 0x80); + } +} + +static READ16_DEVICE_HANDLER( tv_oki6376_r ) +{ + if (ACCESSING_BITS_0_7) + { + return okim6376_busy_r(device); } + return 0xff; } static WRITE16_HANDLER( write1_w ) @@ -278,12 +288,12 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( tv_vcf_io, AS_IO, 16 ) AM_RANGE(0x0000, 0x0001) AM_WRITE( write1_w ) // lamps - AM_RANGE(0x0006, 0x0007) AM_DEVWRITE( "oki", tv_oki6395_w ) + AM_RANGE(0x0006, 0x0007) AM_DEVWRITE( "oki", tv_oki6376_w ) AM_RANGE(0x0008, 0x0009) AM_READ( read1_r ) AM_RANGE(0x000a, 0x000b) AM_READ( read2_r ) AM_RANGE(0x000c, 0x000d) AM_READ( read3_r ) AM_RANGE(0x0010, 0x0015) AM_WRITE( tv_vcf_paletteram_w ) - AM_RANGE(0x0030, 0x0031) AM_WRITE( tv_vcf_bankselect_w ) AM_DEVREAD8( "oki", okim6376_r, 0x00ff ) + AM_RANGE(0x0030, 0x0031) AM_WRITE( tv_vcf_bankselect_w ) AM_DEVREAD( "oki", tv_oki6376_r ) ADDRESS_MAP_END @@ -298,15 +308,23 @@ static READ16_HANDLER( tv_ncf_read2_r ) return (input_port_read(space->machine(), "IN1") & 0xbf) | resetpulse; } -static WRITE16_DEVICE_HANDLER( tv_ncf_oki6395_w ) +static WRITE16_DEVICE_HANDLER( tv_ncf_oki6376_w ) { static int okidata; if (ACCESSING_BITS_0_7 && okidata != data) { okidata = data; - okim6376_w(device, 0, data | 0x80); - okim6376_w(device, 0, (1 << 4)); + okim6376_w(device, 0, data ); } } + +static WRITE16_DEVICE_HANDLER( tv_ncf_oki6376_st_w ) +{ + if (ACCESSING_BITS_0_7) + { + okim6376_st_w(device, (data & 0x80) ); + } +} + static ADDRESS_MAP_START( tv_ncf_map, AS_PROGRAM, 16 ) AM_RANGE(0x00000, 0x003ff) AM_RAM /*irq vector area*/ AM_RANGE(0x00400, 0x03fff) AM_RAM AM_SHARE("nvram") @@ -317,7 +335,8 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( tv_ncf_io, AS_IO, 16 ) AM_RANGE(0x0000, 0x0001) AM_WRITE( write1_w ) // lamps - AM_RANGE(0x0008, 0x0009) AM_DEVWRITE( "oki", tv_ncf_oki6395_w ) + AM_RANGE(0x0008, 0x0009) AM_DEVWRITE( "oki", tv_ncf_oki6376_w ) + AM_RANGE(0x000a, 0x000b) AM_DEVWRITE( "oki", tv_ncf_oki6376_st_w ) AM_RANGE(0x000c, 0x000d) AM_READ( read1_r ) AM_RANGE(0x0010, 0x0011) AM_READ( tv_ncf_read2_r ) AM_RANGE(0x0012, 0x0013) AM_READ( read3_r ) @@ -361,7 +380,7 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( tv_tcf_io, AS_IO, 16 ) AM_RANGE(0x0000, 0x0001) AM_WRITE( write1_w ) // lamps - AM_RANGE(0x0006, 0x0007) AM_DEVWRITE( "oki", tv_oki6395_w ) + AM_RANGE(0x0006, 0x0007) AM_DEVWRITE( "oki", tv_oki6376_w ) AM_RANGE(0x0008, 0x0009) AM_READ( read1_r ) AM_RANGE(0x000a, 0x000b) AM_READ( read2_r ) AM_RANGE(0x0030, 0x0031) AM_READ( read3_r ) AM_WRITE( tv_tcf_bankselect_w ) @@ -423,7 +442,7 @@ static ADDRESS_MAP_START( newmcard_io, AS_IO, 16 ) AM_RANGE(0x0000, 0x0001) AM_WRITE( write1_w ) // lamps AM_RANGE(0x0002, 0x0003) AM_WRITE( write2_w ) // coin counter & coin lockout AM_RANGE(0x0004, 0x0005) AM_WRITE( newmcard_vblank_w ) - AM_RANGE(0x0006, 0x0007) AM_DEVWRITE( "oki", tv_oki6395_w ) + AM_RANGE(0x0006, 0x0007) AM_DEVWRITE( "oki", tv_oki6376_w ) AM_RANGE(0x0008, 0x0009) AM_READ( read1_r ) AM_RANGE(0x000a, 0x000b) AM_READ( read2_r ) AM_RANGE(0x000c, 0x000d) AM_READ( newmcard_vblank_r ) @@ -491,7 +510,7 @@ static ADDRESS_MAP_START( brasil_io, AS_IO, 16 ) AM_RANGE(0x0030, 0x0031) AM_WRITE( brasil_status_w ) AM_RANGE(0x0000, 0x0001) AM_WRITE( write1_w ) // lamps AM_RANGE(0x0002, 0x0003) AM_WRITE( write2_w ) // coin counter & coin lockout - AM_RANGE(0x0006, 0x0007) AM_DEVWRITE( "oki", tv_oki6395_w ) + AM_RANGE(0x0006, 0x0007) AM_DEVWRITE( "oki", tv_oki6376_w ) AM_RANGE(0x0008, 0x0009) AM_READ( read1_r ) AM_RANGE(0x000a, 0x000b) AM_READ( read2_r ) AM_RANGE(0x000e, 0x000f) AM_READ( read3_r ) diff --git a/src/mame/drivers/mpu4.c b/src/mame/drivers/mpu4.c index 3f4efa1ec9d..ed2956d5f19 100644 --- a/src/mame/drivers/mpu4.c +++ b/src/mame/drivers/mpu4.c @@ -4,6 +4,7 @@ This is the core driver, no video specific stuff should go in here. This driver holds all the mechanical games. + 05-2011: Add better OKI emulation - clock rate may be wrong but samples sound good now. 04-2011: More accurate gamball code, fixed ROM banking (Project Amber), added BwB CHR simulator (Amber) This is still a hard coded system, but significantly different to Barcrest's version. Started adding support for the Crystal Gaming program card, and the link keys for setting parameters. @@ -217,8 +218,9 @@ TODO: - Distinguish door switches using manual For now, we're ignoring any extra writes to strobes, as the alternative is to assign a timer to *everything* - Flo's move in Great Escape gives spin alarms - need a different opto setting for reverse spin reels? - Fix BwB characteriser, need to be able to calculate stabiliser bytes. Anyone fancy reading 6809 source? - - Fix MSM6376 - We're triggering 'contact MAMEDEV' since we need all features of the chip, - including dynamic sample rate adjustment and BEEP. + - Fix MSM6376 - We need all features of the chip, including dynamic sample rate adjustment and BEEP. + - OKI sound chip rate - need to confirm independently (3MHz sounds good, but that could be because + of the old driver - BwB manual claims 64KHz to 128KHz). ***********************************************************************************************************/ #include "emu.h" #include "machine/6821pia.h" @@ -374,6 +376,7 @@ public: int m_pageset; int m_hopper; int m_reels; + int m_chrdata; const mpu4_chr_table* m_current_chr_table; const bwb_chr_table* m_bwb_chr_table1; //Video @@ -1670,6 +1673,8 @@ static WRITE8_DEVICE_HANDLER( pia_gb_porta_w ) static WRITE8_DEVICE_HANDLER( pia_gb_portb_w ) { mpu4_state *state = device->machine().driver_data<mpu4_state>(); + device_t *msm6376 = device->machine().device("msm6376"); + int changed = state->m_expansion_latch^data; LOG_SS(("%s: GAMEBOARD: PIA Port A Set to %2x\n", device->machine().describe_context(),data)); @@ -1695,18 +1700,29 @@ static WRITE8_DEVICE_HANDLER( pia_gb_portb_w ) } } } + okim6376_ch2_w(msm6376,data&0x02); + okim6376_st_w(msm6376,data&0x01); + } static READ8_DEVICE_HANDLER( pia_gb_portb_r ) { device_t *msm6376 = device->machine().device("msm6376"); + mpu4_state *state = device->machine().driver_data<mpu4_state>(); LOG_SS(("%s: GAMEBOARD: PIA Read of Port B\n",device->machine().describe_context())); + int data=0; // // b7, 1 = OKI ready, 0 = OKI busy // b5, vol clock // b4, 1 = Vol down, 0 = Vol up // - return okim6376_r(msm6376,0); + if ( okim6376_busy_r(msm6376) ) data |= 0x80; + else data &= ~0x80; + + if ( okim6376_nar_r(msm6376) ) data |= 0x40; + else data &= ~0x40; + + return ( data | state->m_expansion_latch ); } static WRITE_LINE_DEVICE_HANDLER( pia_gb_ca2_w ) @@ -2883,7 +2899,7 @@ static MACHINE_CONFIG_DERIVED( mod4oki, mpu4mod2 ) MCFG_CPU_PROGRAM_MAP(mod4_oki_map) MCFG_DEVICE_REMOVE("ay8913") - MCFG_SOUND_ADD("msm6376", OKIM6376, 64000) //Dynamic, can also be 85430 at 10.5KHz and 128000 at 16KHz + MCFG_SOUND_ADD("msm6376", OKIM6376, 3000000) //Wrong, needs to be 64 KHz, can also be 85430 at 10.5KHz and 128000 at 16KHz MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MACHINE_CONFIG_END |