diff options
Diffstat (limited to 'src/emu/sound/2413intf.c')
-rw-r--r-- | src/emu/sound/2413intf.c | 118 |
1 files changed, 41 insertions, 77 deletions
diff --git a/src/emu/sound/2413intf.c b/src/emu/sound/2413intf.c index 7d8b634b9c8..4f274bc6c45 100644 --- a/src/emu/sound/2413intf.c +++ b/src/emu/sound/2413intf.c @@ -9,19 +9,26 @@ #include "ym2413.h" #include "2413intf.h" -//#define YM2413ISA -#ifdef YM2413ISA - #include <pc.h> -#endif - /* for stream system */ -struct ym2413_info +typedef struct _ym2413_state ym2413_state; +struct _ym2413_state { sound_stream * stream; void * chip; }; + +INLINE ym2413_state *get_safe_token(const device_config *device) +{ + assert(device != NULL); + assert(device->token != NULL); + assert(device->type == SOUND); + assert(sound_get_type(device) == SOUND_YM2413); + return (ym2413_state *)device->token; +} + + #ifdef UNUSED_FUNCTION void YM2413DAC_update(int chip,stream_sample_t **inputs, stream_sample_t **_buffer,int length) { @@ -38,23 +45,23 @@ void YM2413DAC_update(int chip,stream_sample_t **inputs, stream_sample_t **_buff static STREAM_UPDATE( ym2413_stream_update ) { - struct ym2413_info *info = param; + ym2413_state *info = param; ym2413_update_one(info->chip, outputs, samples); } static void _stream_update(void *param, int interval) { - struct ym2413_info *info = param; + ym2413_state *info = param; stream_update(info->stream); } -static SND_START( ym2413 ) +static DEVICE_START( ym2413 ) { - int rate = clock/72; - struct ym2413_info *info = device->token; + ym2413_state *info = get_safe_token(device); + int rate = device->clock/72; /* emulator create */ - info->chip = ym2413_init(device, clock, rate); + info->chip = ym2413_init(device, device->clock, rate); assert_always(info->chip != NULL, "Error creating YM2413 chip"); /* stream system initialize */ @@ -79,7 +86,7 @@ static SND_START( ym2413 ) { ym2413_reset (i); - ym2413[i].DAC_stream = stream_create(device, 0, 1, clock/72, i, YM2413DAC_update); + ym2413[i].DAC_stream = stream_create(device, 0, 1, device->clock/72, i, YM2413DAC_update); if (ym2413[i].DAC_stream == -1) return 1; @@ -89,93 +96,50 @@ static SND_START( ym2413 ) } -static SND_STOP( ym2413 ) +static DEVICE_STOP( ym2413 ) { - struct ym2413_info *info = device->token; + ym2413_state *info = get_safe_token(device); ym2413_shutdown(info->chip); } -static SND_RESET( ym2413 ) +static DEVICE_RESET( ym2413 ) { - struct ym2413_info *info = device->token; + ym2413_state *info = get_safe_token(device); ym2413_reset_chip(info->chip); } -#ifdef YM2413ISA -WRITE8_HANDLER( ym2413_register_port_0_w ) { -int i,a; - outportb(0x308,data); // ym2413_write (0, 0, data); - //add delay - for (i=0; i<0x20; i++) - a = inportb(0x80); +WRITE8_DEVICE_HANDLER( ym2413_w ) +{ + ym2413_state *info = get_safe_token(device); + ym2413_write(info->chip, offset & 1, data); +} - } /* 1st chip */ -#else -WRITE8_HANDLER( ym2413_register_port_0_w ) { struct ym2413_info *info = sndti_token(SOUND_YM2413, 0); ym2413_write (info->chip, 0, data); } /* 1st chip */ -#endif -WRITE8_HANDLER( ym2413_register_port_1_w ) { struct ym2413_info *info = sndti_token(SOUND_YM2413, 1); ym2413_write (info->chip, 0, data); } /* 2nd chip */ -WRITE8_HANDLER( ym2413_register_port_2_w ) { struct ym2413_info *info = sndti_token(SOUND_YM2413, 2); ym2413_write (info->chip, 0, data); } /* 3rd chip */ -WRITE8_HANDLER( ym2413_register_port_3_w ) { struct ym2413_info *info = sndti_token(SOUND_YM2413, 3); ym2413_write (info->chip, 0, data); } /* 4th chip */ - -#ifdef YM2413ISA -WRITE8_HANDLER( ym2413_data_port_0_w ) { -int i,a; - outportb(0x309,data);// ym2413_write (sndti_token(SOUND_YM2413, 0), 1, data); - //add delay - for (i=0; i<0x40; i++) - a = inportb(0x80); - } /* 1st chip */ -#else -WRITE8_HANDLER( ym2413_data_port_0_w ) { struct ym2413_info *info = sndti_token(SOUND_YM2413, 0); ym2413_write (info->chip, 1, data); } /* 1st chip */ -#endif -WRITE8_HANDLER( ym2413_data_port_1_w ) { struct ym2413_info *info = sndti_token(SOUND_YM2413, 1); ym2413_write (info->chip, 1, data); } /* 2nd chip */ -WRITE8_HANDLER( ym2413_data_port_2_w ) { struct ym2413_info *info = sndti_token(SOUND_YM2413, 2); ym2413_write (info->chip, 1, data); } /* 3rd chip */ -WRITE8_HANDLER( ym2413_data_port_3_w ) { struct ym2413_info *info = sndti_token(SOUND_YM2413, 3); ym2413_write (info->chip, 1, data); } /* 4th chip */ - -WRITE16_HANDLER( ym2413_register_port_0_lsb_w ) { if (ACCESSING_BITS_0_7) ym2413_register_port_0_w(space,offset,data & 0xff); } -WRITE16_HANDLER( ym2413_register_port_0_msb_w ) { if (ACCESSING_BITS_8_15) ym2413_register_port_0_w(space,offset,((data & 0xff00) >> 8)); } -WRITE16_HANDLER( ym2413_register_port_1_lsb_w ) { if (ACCESSING_BITS_0_7) ym2413_register_port_1_w(space,offset,data & 0xff); } -WRITE16_HANDLER( ym2413_register_port_2_lsb_w ) { if (ACCESSING_BITS_0_7) ym2413_register_port_2_w(space,offset,data & 0xff); } -WRITE16_HANDLER( ym2413_register_port_3_lsb_w ) { if (ACCESSING_BITS_0_7) ym2413_register_port_3_w(space,offset,data & 0xff); } -WRITE16_HANDLER( ym2413_data_port_0_lsb_w ) { if (ACCESSING_BITS_0_7) ym2413_data_port_0_w(space,offset,data & 0xff); } -WRITE16_HANDLER( ym2413_data_port_0_msb_w ) { if (ACCESSING_BITS_8_15) ym2413_data_port_0_w(space,offset,((data & 0xff00) >> 8)); } -WRITE16_HANDLER( ym2413_data_port_1_lsb_w ) { if (ACCESSING_BITS_0_7) ym2413_data_port_1_w(space,offset,data & 0xff); } -WRITE16_HANDLER( ym2413_data_port_2_lsb_w ) { if (ACCESSING_BITS_0_7) ym2413_data_port_2_w(space,offset,data & 0xff); } -WRITE16_HANDLER( ym2413_data_port_3_lsb_w ) { if (ACCESSING_BITS_0_7) ym2413_data_port_3_w(space,offset,data & 0xff); } +WRITE8_DEVICE_HANDLER( ym2413_register_port_w ) { ym2413_w(device, 0, data); } +WRITE8_DEVICE_HANDLER( ym2413_data_port_w ) { ym2413_w(device, 1, data); } /************************************************************************** * Generic get_info **************************************************************************/ -static SND_SET_INFO( ym2413 ) -{ - switch (state) - { - /* no parameters to set */ - } -} - - -SND_GET_INFO( ym2413 ) +DEVICE_GET_INFO( ym2413 ) { switch (state) { /* --- the following bits of info are returned as 64-bit signed integers --- */ - case SNDINFO_INT_TOKEN_BYTES: info->i = sizeof(struct ym2413_info); break; + case DEVINFO_INT_TOKEN_BYTES: info->i = sizeof(ym2413_state); break; /* --- the following bits of info are returned as pointers to data or functions --- */ - case SNDINFO_PTR_SET_INFO: info->set_info = SND_SET_INFO_NAME( ym2413 ); break; - case SNDINFO_PTR_START: info->start = SND_START_NAME( ym2413 ); break; - case SNDINFO_PTR_STOP: info->stop = SND_STOP_NAME( ym2413 ); break; - case SNDINFO_PTR_RESET: info->reset = SND_RESET_NAME( ym2413 ); break; + case DEVINFO_FCT_START: info->start = DEVICE_START_NAME( ym2413 ); break; + case DEVINFO_FCT_STOP: info->stop = DEVICE_STOP_NAME( ym2413 ); break; + case DEVINFO_FCT_RESET: info->reset = DEVICE_RESET_NAME( ym2413 ); break; /* --- the following bits of info are returned as NULL-terminated strings --- */ - case SNDINFO_STR_NAME: strcpy(info->s, "YM2413"); break; - case SNDINFO_STR_CORE_FAMILY: strcpy(info->s, "Yamaha FM"); break; - case SNDINFO_STR_CORE_VERSION: strcpy(info->s, "1.0"); break; - case SNDINFO_STR_CORE_FILE: strcpy(info->s, __FILE__); break; - case SNDINFO_STR_CORE_CREDITS: strcpy(info->s, "Copyright Nicola Salmoria and the MAME Team"); break; + case DEVINFO_STR_NAME: strcpy(info->s, "YM2413"); break; + case DEVINFO_STR_FAMILY: strcpy(info->s, "Yamaha FM"); break; + case DEVINFO_STR_VERSION: strcpy(info->s, "1.0"); break; + case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break; + case DEVINFO_STR_CREDITS: strcpy(info->s, "Copyright Nicola Salmoria and the MAME Team"); break; } } |