summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers')
-rw-r--r--src/mame/drivers/highvdeo.c47
-rw-r--r--src/mame/drivers/mpu4.c24
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