From 69c7fb048ced84d4cbf97bf80a8ff9baa08fbbc0 Mon Sep 17 00:00:00 2001 From: Scott Stone Date: Sat, 9 Apr 2011 18:38:50 +0000 Subject: [PATCH] Audio device additions: [Atari Ace] - exidy440/m72/segasnd are converted to legacy devices. - cage/dcs/williams variables are restructured internally to resemble a device, simplifying a future device conversion. Some AM_BASE macros are eliminated as well. - taito_en has minor changes to eliminate an AM_BASE macro. --- src/mame/audio/cage.c | 266 +++++++++++++----------- src/mame/audio/cage.h | 9 +- src/mame/audio/dcs.c | 308 +++++++++++++++------------- src/mame/audio/dcs.h | 16 +- src/mame/audio/exidy440.c | 348 +++++++++++++++++-------------- src/mame/audio/exidy440.h | 4 +- src/mame/audio/m72.c | 182 +++++++++++------ src/mame/audio/m72.h | 22 +- src/mame/audio/mcr.c | 4 +- src/mame/audio/segasnd.c | 385 ++++++++++++++++++++++------------- src/mame/audio/segasnd.h | 14 +- src/mame/audio/taito_en.c | 5 +- src/mame/audio/williams.c | 145 ++++++++----- src/mame/audio/williams.h | 14 +- src/mame/drivers/atarigt.c | 8 +- src/mame/drivers/exidy440.c | 9 +- src/mame/drivers/kinst.c | 6 +- src/mame/drivers/m72.c | 126 ++++++------ src/mame/drivers/m90.c | 23 +-- src/mame/drivers/mcr68.c | 2 +- src/mame/drivers/metalmx.c | 6 +- src/mame/drivers/midvunit.c | 14 +- src/mame/drivers/midyunit.c | 6 +- src/mame/drivers/seattle.c | 4 +- src/mame/drivers/segag80r.c | 59 +++--- src/mame/drivers/segag80v.c | 45 ++-- src/mame/drivers/shisen.c | 16 +- src/mame/drivers/vegas.c | 6 +- src/mame/drivers/vigilant.c | 35 ++-- src/mame/drivers/zaxxon.c | 26 +-- src/mame/includes/exidy440.h | 1 + src/mame/includes/m72.h | 1 + src/mame/includes/segag80v.h | 2 +- src/mame/includes/vertigo.h | 1 + src/mame/machine/midtunit.c | 20 +- src/mame/machine/midwayic.c | 24 +-- src/mame/machine/midwunit.c | 12 +- src/mame/machine/midxunit.c | 14 +- src/mame/machine/midyunit.c | 24 +-- src/mame/machine/vertigo.c | 11 +- 40 files changed, 1265 insertions(+), 958 deletions(-) diff --git a/src/mame/audio/cage.c b/src/mame/audio/cage.c index abba6b5cd22..890a9b06c4d 100644 --- a/src/mame/audio/cage.c +++ b/src/mame/audio/cage.c @@ -33,31 +33,35 @@ * *************************************/ -static cpu_device *cage_cpu; -static attotime cage_cpu_h1_clock_period; -static UINT8 cpu_to_cage_ready; -static UINT8 cage_to_cpu_ready; +typedef struct +{ + cpu_device *cpu; + attotime cpu_h1_clock_period; -static void (*cage_irqhandler)(running_machine &, int); + UINT8 cpu_to_cage_ready; + UINT8 cage_to_cpu_ready; -static attotime serial_period_per_word; + void (*irqhandler)(running_machine &, int); -static UINT8 dma_enabled; -static UINT8 dma_timer_enabled; -static timer_device *dma_timer; + attotime serial_period_per_word; -static UINT8 cage_timer_enabled[2]; -static timer_device *timer[2]; + UINT8 dma_enabled; + UINT8 dma_timer_enabled; + timer_device *dma_timer; -static UINT32 *tms32031_io_regs; + UINT8 timer_enabled[2]; + timer_device *timer[2]; + + UINT32 tms32031_io_regs[0x100]; + UINT16 from_main; + UINT16 control; -static UINT16 cage_from_main; -static UINT16 cage_control; + UINT32 *speedup_ram; + dmadac_sound_device *dmadac[DAC_BUFFER_CHANNELS]; +} cage_t; -static UINT32 *speedup_ram; - -static dmadac_sound_device *dmadac[DAC_BUFFER_CHANNELS]; +static cage_t cage; @@ -155,54 +159,57 @@ static WRITE32_HANDLER( speedup_w ); void cage_init(running_machine &machine, offs_t speedup) { + cage_t *state = &cage; attotime cage_cpu_clock_period; int chan; - cage_irqhandler = NULL; + state->irqhandler = NULL; memory_set_bankptr(machine, "bank10", machine.region("cageboot")->base()); memory_set_bankptr(machine, "bank11", machine.region("cage")->base()); - cage_cpu = machine.device("cage"); - cage_cpu_clock_period = attotime::from_hz(cage_cpu->clock()); - cage_cpu_h1_clock_period = cage_cpu_clock_period * 2; + state->cpu = machine.device("cage"); + cage_cpu_clock_period = attotime::from_hz(state->cpu->clock()); + state->cpu_h1_clock_period = cage_cpu_clock_period * 2; - dma_timer = machine.device("cage_dma_timer"); - timer[0] = machine.device("cage_timer0"); - timer[1] = machine.device("cage_timer1"); + state->dma_timer = machine.device("cage_dma_timer"); + state->timer[0] = machine.device("cage_timer0"); + state->timer[1] = machine.device("cage_timer1"); if (speedup) - speedup_ram = cage_cpu->memory().space(AS_PROGRAM)->install_legacy_write_handler(speedup, speedup, FUNC(speedup_w)); + state->speedup_ram = state->cpu->memory().space(AS_PROGRAM)->install_legacy_write_handler(speedup, speedup, FUNC(speedup_w)); for (chan = 0; chan < DAC_BUFFER_CHANNELS; chan++) { char buffer[10]; sprintf(buffer, "dac%d", chan + 1); - dmadac[chan] = machine.device(buffer); + state->dmadac[chan] = machine.device(buffer); } - state_save_register_global(machine, cpu_to_cage_ready); - state_save_register_global(machine, cage_to_cpu_ready); - state_save_register_global(machine, serial_period_per_word); - state_save_register_global(machine, dma_enabled); - state_save_register_global(machine, dma_timer_enabled); - state_save_register_global_array(machine, cage_timer_enabled); - state_save_register_global(machine, cage_from_main); - state_save_register_global(machine, cage_control); + state_save_register_global(machine, cage.cpu_to_cage_ready); + state_save_register_global(machine, cage.cage_to_cpu_ready); + state_save_register_global(machine, cage.serial_period_per_word); + state_save_register_global(machine, cage.dma_enabled); + state_save_register_global(machine, cage.dma_timer_enabled); + state_save_register_global_array(machine, cage.timer_enabled); + state_save_register_global(machine, cage.from_main); + state_save_register_global(machine, cage.control); } void cage_set_irq_handler(void (*irqhandler)(running_machine &, int)) { - cage_irqhandler = irqhandler; + cage_t *state = &cage; + state->irqhandler = irqhandler; } -void cage_reset_w(int state) +void cage_reset_w(address_space *space, int state) { + cage_t *sndstate = &cage; if (state) - cage_control_w(cage_cpu->machine(), 0); - device_set_input_line(cage_cpu, INPUT_LINE_RESET, state ? ASSERT_LINE : CLEAR_LINE); + cage_control_w(space->machine(), 0); + device_set_input_line(sndstate->cpu, INPUT_LINE_RESET, state ? ASSERT_LINE : CLEAR_LINE); } @@ -215,13 +222,16 @@ void cage_reset_w(int state) static TIMER_DEVICE_CALLBACK( dma_timer_callback ) { + cage_t *state = &cage; + UINT32 *tms32031_io_regs = state->tms32031_io_regs; + /* if we weren't enabled, don't do anything, just shut ourself off */ - if (!dma_enabled) + if (!state->dma_enabled) { - if (dma_timer_enabled) + if (state->dma_timer_enabled) { timer.adjust(attotime::never); - dma_timer_enabled = 0; + state->dma_timer_enabled = 0; } return; } @@ -231,18 +241,21 @@ static TIMER_DEVICE_CALLBACK( dma_timer_callback ) tms32031_io_regs[DMA_SOURCE_ADDR] = param; /* set the interrupt */ - device_set_input_line(cage_cpu, TMS3203X_DINT, ASSERT_LINE); - dma_enabled = 0; + device_set_input_line(state->cpu, TMS3203X_DINT, ASSERT_LINE); + state->dma_enabled = 0; } static void update_dma_state(address_space *space) { + cage_t *state = &cage; + UINT32 *tms32031_io_regs = state->tms32031_io_regs; + /* determine the new enabled state */ int enabled = ((tms32031_io_regs[DMA_GLOBAL_CTL] & 3) == 3) && (tms32031_io_regs[DMA_TRANSFER_COUNT] != 0); /* see if we turned on */ - if (enabled && !dma_enabled) + if (enabled && !state->dma_enabled) { INT16 sound_data[STACK_SOUND_BUFSIZE]; UINT32 addr, inc; @@ -262,29 +275,29 @@ static void update_dma_state(address_space *space) sound_data[i % STACK_SOUND_BUFSIZE] = space->read_dword(addr * 4); addr += inc; if (i % STACK_SOUND_BUFSIZE == STACK_SOUND_BUFSIZE - 1) - dmadac_transfer(&dmadac[0], DAC_BUFFER_CHANNELS, 1, DAC_BUFFER_CHANNELS, STACK_SOUND_BUFSIZE / DAC_BUFFER_CHANNELS, sound_data); + dmadac_transfer(&state->dmadac[0], DAC_BUFFER_CHANNELS, 1, DAC_BUFFER_CHANNELS, STACK_SOUND_BUFSIZE / DAC_BUFFER_CHANNELS, sound_data); } if (tms32031_io_regs[DMA_TRANSFER_COUNT] % STACK_SOUND_BUFSIZE != 0) - dmadac_transfer(&dmadac[0], DAC_BUFFER_CHANNELS, 1, DAC_BUFFER_CHANNELS, (tms32031_io_regs[DMA_TRANSFER_COUNT] % STACK_SOUND_BUFSIZE) / DAC_BUFFER_CHANNELS, sound_data); + dmadac_transfer(&state->dmadac[0], DAC_BUFFER_CHANNELS, 1, DAC_BUFFER_CHANNELS, (tms32031_io_regs[DMA_TRANSFER_COUNT] % STACK_SOUND_BUFSIZE) / DAC_BUFFER_CHANNELS, sound_data); /* compute the time of the interrupt and set the timer */ - if (!dma_timer_enabled) + if (!state->dma_timer_enabled) { - attotime period = serial_period_per_word * tms32031_io_regs[DMA_TRANSFER_COUNT]; - dma_timer->adjust(period, addr, period); - dma_timer_enabled = 1; + attotime period = state->serial_period_per_word * tms32031_io_regs[DMA_TRANSFER_COUNT]; + state->dma_timer->adjust(period, addr, period); + state->dma_timer_enabled = 1; } } /* see if we turned off */ - else if (!enabled && dma_enabled) + else if (!enabled && state->dma_enabled) { - dma_timer->reset(); - dma_timer_enabled = 0; + state->dma_timer->reset(); + state->dma_timer_enabled = 0; } /* set the new state */ - dma_enabled = enabled; + state->dma_enabled = enabled; } @@ -297,41 +310,45 @@ static void update_dma_state(address_space *space) static TIMER_DEVICE_CALLBACK( cage_timer_callback ) { + cage_t *state = &cage; int which = param; /* set the interrupt */ - device_set_input_line(cage_cpu, TMS3203X_TINT0 + which, ASSERT_LINE); - cage_timer_enabled[which] = 0; + device_set_input_line(state->cpu, TMS3203X_TINT0 + which, ASSERT_LINE); + state->timer_enabled[which] = 0; update_timer(which); } static void update_timer(int which) { + cage_t *state = &cage; + UINT32 *tms32031_io_regs = state->tms32031_io_regs; + /* determine the new enabled state */ int base = 0x10 * which; int enabled = ((tms32031_io_regs[base + TIMER0_GLOBAL_CTL] & 0xc0) == 0xc0); /* see if we turned on */ - if (enabled && !cage_timer_enabled[which]) + if (enabled && !state->timer_enabled[which]) { - attotime period = cage_cpu_h1_clock_period * (2 * tms32031_io_regs[base + TIMER0_PERIOD]); + attotime period = state->cpu_h1_clock_period * (2 * tms32031_io_regs[base + TIMER0_PERIOD]); /* make sure our assumptions are correct */ if (tms32031_io_regs[base + TIMER0_GLOBAL_CTL] != 0x2c1) logerror("CAGE TIMER%d: unexpected timer config %08X!\n", which, tms32031_io_regs[base + TIMER0_GLOBAL_CTL]); - timer[which]->adjust(period, which); + state->timer[which]->adjust(period, which); } /* see if we turned off */ - else if (!enabled && cage_timer_enabled[which]) + else if (!enabled && state->timer_enabled[which]) { - timer[which]->adjust(attotime::never, which); + state->timer[which]->adjust(attotime::never, which); } /* set the new state */ - cage_timer_enabled[which] = enabled; + state->timer_enabled[which] = enabled; } @@ -344,11 +361,13 @@ static void update_timer(int which) static void update_serial(running_machine &machine) { + cage_t *state = &cage; + UINT32 *tms32031_io_regs = state->tms32031_io_regs; attotime serial_clock_period, bit_clock_period; UINT32 freq; /* we start out at half the H1 frequency (or 2x the H1 period) */ - serial_clock_period = cage_cpu_h1_clock_period * 2; + serial_clock_period = state->cpu_h1_clock_period * 2; /* if we're in clock mode, muliply by another factor of 2 */ if (tms32031_io_regs[SPORT_GLOBAL_CTL] & 4) @@ -358,14 +377,14 @@ static void update_serial(running_machine &machine) bit_clock_period = serial_clock_period * (tms32031_io_regs[SPORT_TIMER_PERIOD] & 0xffff); /* and times the number of bits per sample */ - serial_period_per_word = bit_clock_period * (8 * (((tms32031_io_regs[SPORT_GLOBAL_CTL] >> 18) & 3) + 1)); + state->serial_period_per_word = bit_clock_period * (8 * (((tms32031_io_regs[SPORT_GLOBAL_CTL] >> 18) & 3) + 1)); /* compute the step value to stretch this to the sample_rate */ - freq = ATTOSECONDS_TO_HZ(serial_period_per_word.attoseconds) / DAC_BUFFER_CHANNELS; + freq = ATTOSECONDS_TO_HZ(state->serial_period_per_word.attoseconds) / DAC_BUFFER_CHANNELS; if (freq > 0 && freq < 100000) { - dmadac_set_frequency(&dmadac[0], DAC_BUFFER_CHANNELS, freq); - dmadac_enable(&dmadac[0], DAC_BUFFER_CHANNELS, 1); + dmadac_set_frequency(&state->dmadac[0], DAC_BUFFER_CHANNELS, freq); + dmadac_enable(&state->dmadac[0], DAC_BUFFER_CHANNELS, 1); } } @@ -379,12 +398,14 @@ static void update_serial(running_machine &machine) static READ32_HANDLER( tms32031_io_r ) { + cage_t *state = &cage; + UINT32 *tms32031_io_regs = state->tms32031_io_regs; UINT16 result = tms32031_io_regs[offset]; switch (offset) { case DMA_GLOBAL_CTL: - result = (result & ~0xc) | (dma_enabled ? 0xc : 0x0); + result = (result & ~0xc) | (state->dma_enabled ? 0xc : 0x0); break; } @@ -396,6 +417,9 @@ static READ32_HANDLER( tms32031_io_r ) static WRITE32_HANDLER( tms32031_io_w ) { + cage_t *state = &cage; + UINT32 *tms32031_io_regs = state->tms32031_io_regs; + COMBINE_DATA(&tms32031_io_regs[offset]); if (LOG_32031_IOPORTS) @@ -430,7 +454,7 @@ static WRITE32_HANDLER( tms32031_io_w ) case SPORT_DATA_TX: #if (DAC_BUFFER_CHANNELS == 4) - if ((int)ATTOSECONDS_TO_HZ(serial_period_per_word.attoseconds) == 22050*4 && (tms32031_io_regs[SPORT_RX_CTL] & 0xff) == 0x62) + if ((int)ATTOSECONDS_TO_HZ(state->serial_period_per_word.attoseconds) == 22050*4 && (tms32031_io_regs[SPORT_RX_CTL] & 0xff) == 0x62) tms32031_io_regs[SPORT_RX_CTL] ^= 0x800; #endif break; @@ -453,104 +477,113 @@ static WRITE32_HANDLER( tms32031_io_w ) static void update_control_lines(running_machine &machine) { + cage_t *state = &cage; int val; /* set the IRQ to the main CPU */ - if (cage_irqhandler) + if (state->irqhandler) { int reason = 0; - if ((cage_control & 3) == 3 && !cpu_to_cage_ready) + if ((state->control & 3) == 3 && !state->cpu_to_cage_ready) reason |= CAGE_IRQ_REASON_BUFFER_EMPTY; - if ((cage_control & 2) && cage_to_cpu_ready) + if ((state->control & 2) && state->cage_to_cpu_ready) reason |= CAGE_IRQ_REASON_DATA_READY; - (*cage_irqhandler)(machine, reason); + (*state->irqhandler)(machine, reason); } /* set the IOF input lines */ - val = cpu_get_reg(cage_cpu, TMS3203X_IOF); + val = cpu_get_reg(state->cpu, TMS3203X_IOF); val &= ~0x88; - if (cpu_to_cage_ready) val |= 0x08; - if (cage_to_cpu_ready) val |= 0x80; - cage_cpu->set_state(TMS3203X_IOF, val); + if (state->cpu_to_cage_ready) val |= 0x08; + if (state->cage_to_cpu_ready) val |= 0x80; + state->cpu->set_state(TMS3203X_IOF, val); } static READ32_HANDLER( cage_from_main_r ) { + cage_t *state = &cage; if (LOG_COMM) - logerror("%06X:CAGE read command = %04X\n", cpu_get_pc(&space->device()), cage_from_main); - cpu_to_cage_ready = 0; + logerror("%06X:CAGE read command = %04X\n", cpu_get_pc(&space->device()), state->from_main); + state->cpu_to_cage_ready = 0; update_control_lines(space->machine()); - device_set_input_line(cage_cpu, TMS3203X_IRQ0, CLEAR_LINE); - return cage_from_main; + device_set_input_line(state->cpu, TMS3203X_IRQ0, CLEAR_LINE); + return state->from_main; } static WRITE32_HANDLER( cage_from_main_ack_w ) { if (LOG_COMM) - logerror("%06X:CAGE ack command = %04X\n", cpu_get_pc(&space->device()), cage_from_main); + { + cage_t *state = &cage; + logerror("%06X:CAGE ack command = %04X\n", cpu_get_pc(&space->device()), state->from_main); + } } static WRITE32_HANDLER( cage_to_main_w ) { + cage_t *state = &cage; if (LOG_COMM) logerror("%06X:Data from CAGE = %04X\n", cpu_get_pc(&space->device()), data); soundlatch_word_w(space, 0, data, mem_mask); - cage_to_cpu_ready = 1; + state->cage_to_cpu_ready = 1; update_control_lines(space->machine()); } static READ32_HANDLER( cage_io_status_r ) { + cage_t *state = &cage; int result = 0; - if (cpu_to_cage_ready) + if (state->cpu_to_cage_ready) result |= 0x80; - if (!cage_to_cpu_ready) + if (!state->cage_to_cpu_ready) result |= 0x40; return result; } -UINT16 main_from_cage_r(address_space *space) +UINT16 cage_main_r(address_space *space) { + cage_t *state = &cage; if (LOG_COMM) logerror("%s:main read data = %04X\n", space->machine().describe_context(), soundlatch_word_r(space, 0, 0)); - cage_to_cpu_ready = 0; + state->cage_to_cpu_ready = 0; update_control_lines(space->machine()); return soundlatch_word_r(space, 0, 0xffff); } -static TIMER_CALLBACK( deferred_cage_w ) +static TIMER_CALLBACK( cage_deferred_w ) { - cage_from_main = param; - cpu_to_cage_ready = 1; + cage_t *state = &cage; + state->from_main = param; + state->cpu_to_cage_ready = 1; update_control_lines(machine); - device_set_input_line(cage_cpu, TMS3203X_IRQ0, ASSERT_LINE); + device_set_input_line(state->cpu, TMS3203X_IRQ0, ASSERT_LINE); } -void main_to_cage_w(UINT16 data) +void cage_main_w(address_space *space, UINT16 data) { - running_machine &machine = cage_cpu->machine(); if (LOG_COMM) - logerror("%s:Command to CAGE = %04X\n", machine.describe_context(), data); - machine.scheduler().synchronize(FUNC(deferred_cage_w), data); + logerror("%s:Command to CAGE = %04X\n", space->machine().describe_context(), data); + space->machine().scheduler().synchronize(FUNC(cage_deferred_w), data); } -UINT16 cage_control_r(void) +UINT16 cage_control_r(running_machine &machine) { + cage_t *state = &cage; UINT16 result = 0; - if (cpu_to_cage_ready) + if (state->cpu_to_cage_ready) result |= 2; - if (cage_to_cpu_ready) + if (state->cage_to_cpu_ready) result |= 1; return result; @@ -559,29 +592,32 @@ UINT16 cage_control_r(void) void cage_control_w(running_machine &machine, UINT16 data) { - cage_control = data; + cage_t *state = &cage; + UINT32 *tms32031_io_regs = state->tms32031_io_regs; + + state->control = data; /* CPU is reset if both control lines are 0 */ - if (!(cage_control & 3)) + if (!(state->control & 3)) { - device_set_input_line(cage_cpu, INPUT_LINE_RESET, ASSERT_LINE); + device_set_input_line(state->cpu, INPUT_LINE_RESET, ASSERT_LINE); - dma_enabled = 0; - dma_timer_enabled = 0; - dma_timer->reset(); + state->dma_enabled = 0; + state->dma_timer_enabled = 0; + state->dma_timer->reset(); - cage_timer_enabled[0] = 0; - cage_timer_enabled[1] = 0; - timer[0]->reset(); - timer[1]->reset(); + state->timer_enabled[0] = 0; + state->timer_enabled[1] = 0; + state->timer[0]->reset(); + state->timer[1]->reset(); memset(tms32031_io_regs, 0, 0x60 * 4); - cpu_to_cage_ready = 0; - cage_to_cpu_ready = 0; + state->cpu_to_cage_ready = 0; + state->cage_to_cpu_ready = 0; } else - device_set_input_line(cage_cpu, INPUT_LINE_RESET, CLEAR_LINE); + device_set_input_line(state->cpu, INPUT_LINE_RESET, CLEAR_LINE); /* update the control state */ update_control_lines(machine); @@ -597,8 +633,10 @@ void cage_control_w(running_machine &machine, UINT16 data) static WRITE32_HANDLER( speedup_w ) { + cage_t *state = &cage; + device_eat_cycles(&space->device(), 100); - COMBINE_DATA(&speedup_ram[offset]); + COMBINE_DATA(&state->speedup_ram[offset]); } @@ -619,7 +657,7 @@ static ADDRESS_MAP_START( cage_map, AS_PROGRAM, 32 ) AM_RANGE(0x000000, 0x00ffff) AM_RAM AM_RANGE(0x200000, 0x200000) AM_WRITENOP AM_RANGE(0x400000, 0x47ffff) AM_ROMBANK("bank10") - AM_RANGE(0x808000, 0x8080ff) AM_READWRITE(tms32031_io_r, tms32031_io_w) AM_BASE(&tms32031_io_regs) + AM_RANGE(0x808000, 0x8080ff) AM_READWRITE(tms32031_io_r, tms32031_io_w) AM_RANGE(0x809800, 0x809fff) AM_RAM AM_RANGE(0xa00000, 0xa00000) AM_READWRITE(cage_from_main_r, cage_to_main_w) AM_RANGE(0xc00000, 0xffffff) AM_ROMBANK("bank11") @@ -630,7 +668,7 @@ static ADDRESS_MAP_START( cage_map_seattle, AS_PROGRAM, 32 ) AM_RANGE(0x000000, 0x00ffff) AM_RAM AM_RANGE(0x200000, 0x200000) AM_WRITENOP AM_RANGE(0x400000, 0x47ffff) AM_ROMBANK("bank10") - AM_RANGE(0x808000, 0x8080ff) AM_READWRITE(tms32031_io_r, tms32031_io_w) AM_BASE(&tms32031_io_regs) + AM_RANGE(0x808000, 0x8080ff) AM_READWRITE(tms32031_io_r, tms32031_io_w) AM_RANGE(0x809800, 0x809fff) AM_RAM AM_RANGE(0xa00000, 0xa00000) AM_READWRITE(cage_from_main_r, cage_from_main_ack_w) AM_RANGE(0xa00001, 0xa00001) AM_WRITE(cage_to_main_w) diff --git a/src/mame/audio/cage.h b/src/mame/audio/cage.h index 56169307470..40294161e61 100644 --- a/src/mame/audio/cage.h +++ b/src/mame/audio/cage.h @@ -12,9 +12,10 @@ MACHINE_CONFIG_EXTERN( cage_seattle ); void cage_init(running_machine &machine, offs_t speedup); void cage_set_irq_handler(void (*irqhandler)(running_machine &, int)); -void cage_reset_w(int state); +void cage_reset_w(address_space *space, int state); -UINT16 main_from_cage_r(address_space *space); -UINT16 cage_control_r(void); -void main_to_cage_w(UINT16 data); +UINT16 cage_main_r(address_space *space); +void cage_main_w(address_space *space, UINT16 data); + +UINT16 cage_control_r(running_machine &machine); void cage_control_w(running_machine &machine, UINT16 data); diff --git a/src/mame/audio/dcs.c b/src/mame/audio/dcs.c index 6fc5ea0e9b0..4aee1859584 100644 --- a/src/mame/audio/dcs.c +++ b/src/mame/audio/dcs.c @@ -216,45 +216,45 @@ enum /* these macros are used to reference the SDRC ASIC */ -#define SDRC_ROM_ST ((sdrc.reg[0] >> 0) & 3) /* 0=0000, 1=3000, 2=3400, 3=none */ -#define SDRC_ROM_SZ ((sdrc.reg[0] >> 4) & 1) /* 0=4k, 1=1k */ -#define SDRC_ROM_MS ((sdrc.reg[0] >> 5) & 1) /* 0=/BMS, 1=/DMS */ -#define SDRC_ROM_PG ((sdrc.reg[0] >> 7) & 7) -#define SDRC_SM_EN ((sdrc.reg[0] >> 11) & 1) -#define SDRC_SM_BK ((sdrc.reg[0] >> 12) & 1) -#define SDRC_SMODE ((sdrc.reg[0] >> 13) & 7) +#define SDRC_ROM_ST ((dcs.sdrc.reg[0] >> 0) & 3) /* 0=0000, 1=3000, 2=3400, 3=none */ +#define SDRC_ROM_SZ ((dcs.sdrc.reg[0] >> 4) & 1) /* 0=4k, 1=1k */ +#define SDRC_ROM_MS ((dcs.sdrc.reg[0] >> 5) & 1) /* 0=/BMS, 1=/DMS */ +#define SDRC_ROM_PG ((dcs.sdrc.reg[0] >> 7) & 7) +#define SDRC_SM_EN ((dcs.sdrc.reg[0] >> 11) & 1) +#define SDRC_SM_BK ((dcs.sdrc.reg[0] >> 12) & 1) +#define SDRC_SMODE ((dcs.sdrc.reg[0] >> 13) & 7) -#define SDRC_DM_ST ((sdrc.reg[1] >> 0) & 3) /* 0=none, 1=0000, 2=3000, 3=3400 */ -#define SDRC_DM_REF ((sdrc.reg[1] >> 4) & 3) -#define SDRC_DM_3WS ((sdrc.reg[1] >> 7) & 1) -#define SDRC_TFS_INV ((sdrc.reg[1] >> 8) & 1) -#define SDRC_RES_TFS ((sdrc.reg[1] >> 10) & 3) -#define SDRC_LED ((sdrc.reg[1] >> 13) & 1) -#define SDRC_MUTE ((sdrc.reg[1] >> 14) & 1) -#define SDRC_AREF_ACT ((sdrc.reg[1] >> 15) & 1) +#define SDRC_DM_ST ((dcs.sdrc.reg[1] >> 0) & 3) /* 0=none, 1=0000, 2=3000, 3=3400 */ +#define SDRC_DM_REF ((dcs.sdrc.reg[1] >> 4) & 3) +#define SDRC_DM_3WS ((dcs.sdrc.reg[1] >> 7) & 1) +#define SDRC_TFS_INV ((dcs.sdrc.reg[1] >> 8) & 1) +#define SDRC_RES_TFS ((dcs.sdrc.reg[1] >> 10) & 3) +#define SDRC_LED ((dcs.sdrc.reg[1] >> 13) & 1) +#define SDRC_MUTE ((dcs.sdrc.reg[1] >> 14) & 1) +#define SDRC_AREF_ACT ((dcs.sdrc.reg[1] >> 15) & 1) -#define SDRC_DM_PG ((sdrc.reg[2] >> 0) & 0x7ff) -#define SDRC_EPM_PG ((sdrc.reg[2] >> 0) & 0x1fff) +#define SDRC_DM_PG ((dcs.sdrc.reg[2] >> 0) & 0x7ff) +#define SDRC_EPM_PG ((dcs.sdrc.reg[2] >> 0) & 0x1fff) /* these macros are used to reference the DSIO ASIC */ -#define DSIO_EMPTY_FIFO ((dsio.reg[1] >> 0) & 1) -#define DSIO_CUR_OUTPUT ((dsio.reg[1] >> 4) & 1) -#define DSIO_RES_TFS ((dsio.reg[1] >> 10) & 1) -#define DSIO_LED ((dsio.reg[1] >> 13) & 1) -#define DSIO_MUTE ((dsio.reg[1] >> 14) & 1) +#define DSIO_EMPTY_FIFO ((dcs.dsio.reg[1] >> 0) & 1) +#define DSIO_CUR_OUTPUT ((dcs.dsio.reg[1] >> 4) & 1) +#define DSIO_RES_TFS ((dcs.dsio.reg[1] >> 10) & 1) +#define DSIO_LED ((dcs.dsio.reg[1] >> 13) & 1) +#define DSIO_MUTE ((dcs.dsio.reg[1] >> 14) & 1) -#define DSIO_DM_PG ((dsio.reg[2] >> 0) & 0x7ff) +#define DSIO_DM_PG ((dcs.dsio.reg[2] >> 0) & 0x7ff) /* these macros are used to reference the DENVER ASIC */ -#define DENV_DSP_SPEED ((dsio.reg[1] >> 2) & 3) /* read only: 1=33.33MHz */ -#define DENV_RES_TFS ((dsio.reg[1] >> 10) & 1) -#define DENV_CHANNELS ((dsio.reg[1] >> 11) & 3) /* 0=2ch, 1=4ch, 2=6ch */ -#define DENV_LED ((dsio.reg[1] >> 13) & 1) -#define DENV_MUTE ((dsio.reg[1] >> 14) & 1) +#define DENV_DSP_SPEED ((dcs.dsio.reg[1] >> 2) & 3) /* read only: 1=33.33MHz */ +#define DENV_RES_TFS ((dcs.dsio.reg[1] >> 10) & 1) +#define DENV_CHANNELS ((dcs.dsio.reg[1] >> 11) & 3) /* 0=2ch, 1=4ch, 2=6ch */ +#define DENV_LED ((dcs.dsio.reg[1] >> 13) & 1) +#define DENV_MUTE ((dcs.dsio.reg[1] >> 14) & 1) -#define DENV_DM_PG ((dsio.reg[2] >> 0) & 0x7ff) +#define DENV_DM_PG ((dcs.dsio.reg[2] >> 0) & 0x7ff) @@ -281,6 +281,23 @@ struct _dsio_denver_state }; +typedef struct _hle_transfer_state hle_transfer_state; +struct _hle_transfer_state +{ + UINT8 hle_enabled; + INT32 dcs_state; + INT32 state; + INT32 start; + INT32 stop; + INT32 type; + INT32 temp; + INT32 writes_left; + UINT16 sum; + INT32 fifo_entries; + timer_device *watchdog; +}; + + typedef struct _dcs_state dcs_state; struct _dcs_state { @@ -334,23 +351,15 @@ struct _dcs_state UINT32 timer_scale; UINT32 timer_period; UINT32 timers_fired; -}; + UINT16 *sram; + UINT16 *polling_base; + UINT32 *internal_program_ram; + UINT32 *external_program_ram; -typedef struct _hle_transfer_state hle_transfer_state; -struct _hle_transfer_state -{ - UINT8 hle_enabled; - INT32 dcs_state; - INT32 state; - INT32 start; - INT32 stop; - INT32 type; - INT32 temp; - INT32 writes_left; - UINT16 sum; - INT32 fifo_entries; - timer_device *watchdog; + sdrc_state sdrc; + dsio_state dsio; + hle_transfer_state transfer; }; @@ -362,16 +371,6 @@ struct _hle_transfer_state *************************************/ static dcs_state dcs; -static sdrc_state sdrc; -static dsio_state dsio; -static hle_transfer_state transfer; - -static UINT16 *dcs_sram; - -static UINT16 *dcs_polling_base; - -static UINT32 *dcs_internal_program_ram; -static UINT32 *dcs_external_program_ram; @@ -390,11 +389,11 @@ static READ16_HANDLER( sdrc_r ); static WRITE16_HANDLER( sdrc_w ); static STATE_POSTLOAD( sdrc_postload ); -static void dsio_reset(void); +static void dsio_reset(running_machine &machine); static READ16_HANDLER( dsio_r ); static WRITE16_HANDLER( dsio_w ); -static void denver_reset(void); +static void denver_reset(running_machine &machine); static READ16_HANDLER( denver_r ); static WRITE16_HANDLER( denver_w ); @@ -432,10 +431,10 @@ static int preprocess_write(running_machine &machine, UINT16 data); /* DCS 2k memory map */ static ADDRESS_MAP_START( dcs_2k_program_map, AS_PROGRAM, 32 ) - AM_RANGE(0x0000, 0x03ff) AM_RAM AM_BASE(&dcs_internal_program_ram) - AM_RANGE(0x0800, 0x0fff) AM_RAM AM_SHARE("share1") AM_BASE(&dcs_external_program_ram) - AM_RANGE(0x1000, 0x17ff) AM_RAM AM_SHARE("share1") - AM_RANGE(0x1800, 0x1fff) AM_RAM AM_SHARE("share1") + AM_RANGE(0x0000, 0x03ff) AM_RAM AM_SHARE("dcsint") + AM_RANGE(0x0800, 0x0fff) AM_RAM AM_SHARE("dcsext") + AM_RANGE(0x1000, 0x17ff) AM_RAM AM_SHARE("dcsext") + AM_RANGE(0x1800, 0x1fff) AM_RAM AM_SHARE("dcsext") ADDRESS_MAP_END static ADDRESS_MAP_START( dcs_2k_data_map, AS_DATA, 16 ) @@ -463,8 +462,8 @@ ADDRESS_MAP_END /* DCS 8k memory map */ static ADDRESS_MAP_START( dcs_8k_program_map, AS_PROGRAM, 32 ) - AM_RANGE(0x0000, 0x03ff) AM_RAM AM_BASE(&dcs_internal_program_ram) - AM_RANGE(0x0800, 0x1fff) AM_RAM AM_BASE(&dcs_external_program_ram) + AM_RANGE(0x0000, 0x03ff) AM_RAM AM_SHARE("dcsint") + AM_RANGE(0x0800, 0x1fff) AM_RAM AM_SHARE("dcsext") ADDRESS_MAP_END static ADDRESS_MAP_START( dcs_8k_data_map, AS_DATA, 16 ) @@ -487,12 +486,12 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( dcs2_2115_program_map, AS_PROGRAM, 32 ) ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x0000, 0x03ff) AM_RAM AM_BASE(&dcs_internal_program_ram) + AM_RANGE(0x0000, 0x03ff) AM_RAM AM_SHARE("dcsint") ADDRESS_MAP_END static ADDRESS_MAP_START( dcs2_2104_program_map, AS_PROGRAM, 32 ) ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x0000, 0x01ff) AM_RAM AM_BASE(&dcs_internal_program_ram) + AM_RANGE(0x0000, 0x01ff) AM_RAM AM_SHARE("dcsint") ADDRESS_MAP_END @@ -530,7 +529,7 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( dsio_program_map, AS_PROGRAM, 32 ) ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x0000, 0x3fff) AM_RAM AM_BASE(&dcs_internal_program_ram) + AM_RANGE(0x0000, 0x3fff) AM_RAM AM_SHARE("dcsint") ADDRESS_MAP_END @@ -562,7 +561,7 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( denver_program_map, AS_PROGRAM, 32 ) ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x0000, 0x3fff) AM_RAM AM_BASE(&dcs_internal_program_ram) + AM_RANGE(0x0000, 0x3fff) AM_RAM AM_SHARE("dcsint") ADDRESS_MAP_END @@ -750,7 +749,7 @@ MACHINE_CONFIG_END * *************************************/ -static void dcs_boot(void) +static void dcs_boot(running_machine &machine) { UINT8 buffer[0x1000]; UINT32 max_banks; @@ -769,7 +768,7 @@ static void dcs_boot(void) /* convert from 16-bit data to 8-bit data and boot */ for (i = 0; i < 0x1000; i++) buffer[i] = base[i]; - dcs.cpu->load_boot_data(buffer, dcs_internal_program_ram); + dcs.cpu->load_boot_data(buffer, dcs.internal_program_ram); break; /* rev 2: use the ROM page in the SDRC to boot from */ @@ -790,14 +789,14 @@ static void dcs_boot(void) /* convert from 16-bit data to 8-bit data and boot */ for (i = 0; i < 0x1000; i++) buffer[i] = base[i]; - dcs.cpu->load_boot_data(buffer, dcs_internal_program_ram); + dcs.cpu->load_boot_data(buffer, dcs.internal_program_ram); break; /* rev 3/4: HALT the ADSP-2181 until program is downloaded via IDMA */ case 3: case 4: device_set_input_line(dcs.cpu, INPUT_LINE_HALT, ASSERT_LINE); - dsio.start_on_next_write = 0; + dcs.dsio.start_on_next_write = 0; break; } } @@ -831,12 +830,12 @@ static TIMER_CALLBACK( dcs_reset ) /* rev 3: reset the DSIO ASIC */ case 3: - dsio_reset(); + dsio_reset(machine); break; /* rev 4: reset the Denver ASIC */ case 4: - denver_reset(); + denver_reset(machine); break; } @@ -862,7 +861,7 @@ static TIMER_CALLBACK( dcs_reset ) (*dcs.output_full_cb)(machine, dcs.last_output_full = 0); /* boot */ - dcs_boot(); + dcs_boot(machine); /* reset timers */ dcs.timer_enable = 0; @@ -874,7 +873,7 @@ static TIMER_CALLBACK( dcs_reset ) dcs.sport_timer->adjust(attotime::from_hz(1000), 0, attotime::from_hz(1000)); /* reset the HLE transfer states */ - transfer.dcs_state = transfer.state = 0; + dcs.transfer.dcs_state = dcs.transfer.state = 0; } @@ -887,12 +886,12 @@ static TIMER_CALLBACK( dcs_reset ) static void dcs_register_state(running_machine &machine) { - state_save_register_global_array(machine, sdrc.reg); - state_save_register_global(machine, sdrc.seed); + state_save_register_global_array(machine, dcs.sdrc.reg); + state_save_register_global(machine, dcs.sdrc.seed); - state_save_register_global_array(machine, dsio.reg); - state_save_register_global(machine, dsio.start_on_next_write); - state_save_register_global(machine, dsio.channelbits); + state_save_register_global_array(machine, dcs.dsio.reg); + state_save_register_global(machine, dcs.dsio.start_on_next_write); + state_save_register_global(machine, dcs.dsio.channelbits); state_save_register_global(machine, dcs.channels); state_save_register_global(machine, dcs.size); @@ -921,18 +920,18 @@ static void dcs_register_state(running_machine &machine) state_save_register_global(machine, dcs.timer_period); state_save_register_global(machine, dcs.timers_fired); - state_save_register_global(machine, transfer.dcs_state); - state_save_register_global(machine, transfer.state); - state_save_register_global(machine, transfer.start); - state_save_register_global(machine, transfer.stop); - state_save_register_global(machine, transfer.type); - state_save_register_global(machine, transfer.temp); - state_save_register_global(machine, transfer.writes_left); - state_save_register_global(machine, transfer.sum); - state_save_register_global(machine, transfer.fifo_entries); + state_save_register_global(machine, dcs.transfer.dcs_state); + state_save_register_global(machine, dcs.transfer.state); + state_save_register_global(machine, dcs.transfer.start); + state_save_register_global(machine, dcs.transfer.stop); + state_save_register_global(machine, dcs.transfer.type); + state_save_register_global(machine, dcs.transfer.temp); + state_save_register_global(machine, dcs.transfer.writes_left); + state_save_register_global(machine, dcs.transfer.sum); + state_save_register_global(machine, dcs.transfer.fifo_entries); - if (dcs_sram != NULL) - state_save_register_global_pointer(machine, dcs_sram, 0x8000*4 / sizeof(dcs_sram[0])); + if (dcs.sram != NULL) + state_save_register_global_pointer(machine, dcs.sram, 0x8000*4 / sizeof(dcs.sram[0])); if (dcs.rev == 2) machine.state().register_postload(sdrc_postload, NULL); @@ -941,7 +940,10 @@ static void dcs_register_state(running_machine &machine) void dcs_init(running_machine &machine) { memset(&dcs, 0, sizeof(dcs)); - dcs_sram = NULL; + dcs.sram = NULL; + + dcs.internal_program_ram = (UINT32 *)memory_get_shared(machine, "dcsint"); + dcs.external_program_ram = (UINT32 *)memory_get_shared(machine, "dcsext"); /* find the DCS CPU and the sound ROMs */ dcs.cpu = machine.device("dcs"); @@ -979,6 +981,8 @@ void dcs2_init(running_machine &machine, int dram_in_mb, offs_t polling_offset) int soundbank_words; memset(&dcs, 0, sizeof(dcs)); + dcs.internal_program_ram = (UINT32 *)memory_get_shared(machine, "dcsint"); + dcs.external_program_ram = (UINT32 *)memory_get_shared(machine, "dcsext"); /* find the DCS CPU and the sound ROMs */ dcs.cpu = machine.device("dcs2"); @@ -1022,7 +1026,7 @@ void dcs2_init(running_machine &machine, int dram_in_mb, offs_t polling_offset) memory_configure_bank(machine, "databank", 0, dcs.sounddata_banks, dcs.sounddata, soundbank_words*2); /* allocate memory for the SRAM */ - dcs_sram = auto_alloc_array(machine, UINT16, 0x8000*4/2); + dcs.sram = auto_alloc_array(machine, UINT16, 0x8000*4/2); /* create the timers */ dcs.internal_timer = machine.device("dcs_int_timer"); @@ -1035,12 +1039,12 @@ void dcs2_init(running_machine &machine, int dram_in_mb, offs_t polling_offset) /* install the speedup handler */ dcs.polling_offset = polling_offset; if (polling_offset) - dcs_polling_base = dcs.cpu->space(AS_DATA)->install_legacy_readwrite_handler(polling_offset, polling_offset, FUNC(dcs_polling_r), FUNC(dcs_polling_w)); + dcs.polling_base = dcs.cpu->space(AS_DATA)->install_legacy_readwrite_handler(dcs.polling_offset, dcs.polling_offset, FUNC(dcs_polling_r), FUNC(dcs_polling_w)); /* allocate a watchdog timer for HLE transfers */ - transfer.hle_enabled = (ENABLE_HLE_TRANSFERS && dram_in_mb != 0); - if (transfer.hle_enabled) - transfer.watchdog = machine.device("dcs_hle_timer"); + dcs.transfer.hle_enabled = (ENABLE_HLE_TRANSFERS && dram_in_mb != 0); + if (dcs.transfer.hle_enabled) + dcs.transfer.watchdog = machine.device("dcs_hle_timer"); /* register for save states */ dcs_register_state(machine); @@ -1050,7 +1054,7 @@ void dcs2_init(running_machine &machine, int dram_in_mb, offs_t polling_offset) } -void dcs_set_auto_ack(int state) +void dcs_set_auto_ack(running_machine &machine, int state) { dcs.auto_ack = state; } @@ -1065,15 +1069,15 @@ void dcs_set_auto_ack(int state) static READ16_HANDLER( dcs_dataram_r ) { - return dcs_external_program_ram[offset] >> 8; + return dcs.external_program_ram[offset] >> 8; } static WRITE16_HANDLER( dcs_dataram_w ) { - UINT16 newdata = dcs_external_program_ram[offset] >> 8; + UINT16 newdata = dcs.external_program_ram[offset] >> 8; COMBINE_DATA(&newdata); - dcs_external_program_ram[offset] = (newdata << 8) | (dcs_external_program_ram[offset] & 0xff); + dcs.external_program_ram[offset] = (newdata << 8) | (dcs.external_program_ram[offset] & 0xff); } @@ -1134,23 +1138,23 @@ static void sdrc_remap_memory(running_machine &machine) else { /* first start with a clean program map */ - dcs.program->install_ram(0x0800, 0x3fff, dcs_sram + 0x4800); + dcs.program->install_ram(0x0800, 0x3fff, dcs.sram + 0x4800); /* set up the data map based on the SRAM banking */ /* map 0: ram from 0800-37ff */ if (SDRC_SM_BK == 0) { - dcs.data->install_ram(0x0800, 0x17ff, dcs_sram + 0x0000); - dcs.data->install_ram(0x1800, 0x27ff, dcs_sram + 0x1000); - dcs.data->install_ram(0x2800, 0x37ff, dcs_sram + 0x2000); + dcs.data->install_ram(0x0800, 0x17ff, dcs.sram + 0x0000); + dcs.data->install_ram(0x1800, 0x27ff, dcs.sram + 0x1000); + dcs.data->install_ram(0x2800, 0x37ff, dcs.sram + 0x2000); } /* map 1: nothing from 0800-17ff, alternate RAM at 1800-27ff, same RAM at 2800-37ff */ else { dcs.data->unmap_readwrite(0x0800, 0x17ff); - dcs.data->install_ram(0x1800, 0x27ff, dcs_sram + 0x3000); - dcs.data->install_ram(0x2800, 0x37ff, dcs_sram + 0x2000); + dcs.data->install_ram(0x1800, 0x27ff, dcs.sram + 0x3000); + dcs.data->install_ram(0x2800, 0x37ff, dcs.sram + 0x2000); } } @@ -1174,7 +1178,7 @@ static void sdrc_remap_memory(running_machine &machine) /* reinstall the polling hotspot */ if (dcs.polling_offset) - dcs_polling_base = dcs.cpu->space(AS_DATA)->install_legacy_readwrite_handler(dcs.polling_offset, dcs.polling_offset, FUNC(dcs_polling_r), FUNC(dcs_polling_w)); + dcs.polling_base = dcs.cpu->space(AS_DATA)->install_legacy_readwrite_handler(dcs.polling_offset, dcs.polling_offset, FUNC(dcs_polling_r), FUNC(dcs_polling_w)); } @@ -1186,7 +1190,7 @@ static STATE_POSTLOAD( sdrc_postload ) static void sdrc_reset(running_machine &machine) { - memset(sdrc.reg, 0, sizeof(sdrc.reg)); + memset(dcs.sdrc.reg, 0, sizeof(dcs.sdrc.reg)); sdrc_remap_memory(machine); } @@ -1200,6 +1204,7 @@ static void sdrc_reset(running_machine &machine) static READ16_HANDLER( sdrc_r ) { + sdrc_state &sdrc = dcs.sdrc; UINT16 result = sdrc.reg[offset]; /* offset 3 is for security */ @@ -1248,6 +1253,7 @@ static READ16_HANDLER( sdrc_r ) static WRITE16_HANDLER( sdrc_w ) { + sdrc_state &sdrc = dcs.sdrc; UINT16 diff = sdrc.reg[offset] ^ data; switch (offset) @@ -1264,7 +1270,7 @@ static WRITE16_HANDLER( sdrc_w ) /* offset 1 controls RAM mapping */ case 1: sdrc.reg[1] = data; -// dmadac_enable(&dcs.dmadac[0], dcs.channels, SDRC_MUTE); + //dmadac_enable(&dcs.dmadac[0], dcs.channels, SDRC_MUTE); if (diff & 0x0003) sdrc_remap_memory(space->machine()); break; @@ -1320,14 +1326,15 @@ static WRITE16_HANDLER( sdrc_w ) * *************************************/ -static void dsio_reset(void) +static void dsio_reset(running_machine &machine) { - memset(&dsio, 0, sizeof(dsio)); + memset(&dcs.dsio, 0, sizeof(dcs.dsio)); } static READ16_HANDLER( dsio_r ) { + dsio_state &dsio = dcs.dsio; UINT16 result = dsio.reg[offset]; if (offset == 1) @@ -1342,6 +1349,8 @@ static READ16_HANDLER( dsio_r ) static WRITE16_HANDLER( dsio_w ) { + dsio_state &dsio = dcs.dsio; + switch (offset) { /* offset 1 controls I/O */ @@ -1371,15 +1380,15 @@ static WRITE16_HANDLER( dsio_w ) * *************************************/ -static void denver_reset(void) +static void denver_reset(running_machine &machine) { - memset(&dsio, 0, sizeof(dsio)); + memset(&dcs.dsio, 0, sizeof(dcs.dsio)); } static READ16_HANDLER( denver_r ) { - UINT16 result = dsio.reg[offset]; + UINT16 result = dcs.dsio.reg[offset]; if (offset == 3) { @@ -1392,6 +1401,7 @@ static READ16_HANDLER( denver_r ) static WRITE16_HANDLER( denver_w ) { + dsio_state &dsio = dcs.dsio; int enable, channels, chan; switch (offset) @@ -1444,6 +1454,7 @@ static WRITE16_HANDLER( denver_w ) WRITE32_HANDLER( dsio_idma_addr_w ) { + dsio_state &dsio = dcs.dsio; if (LOG_DCS_TRANSFERS) logerror("%08X:IDMA_addr = %04X\n", cpu_get_pc(&space->device()), data); downcast(dcs.cpu)->idma_addr_w(data); @@ -1454,6 +1465,7 @@ WRITE32_HANDLER( dsio_idma_addr_w ) WRITE32_HANDLER( dsio_idma_data_w ) { + dsio_state &dsio = dcs.dsio; UINT32 pc = cpu_get_pc(&space->device()); if (ACCESSING_BITS_0_15) { @@ -1504,24 +1516,24 @@ void dcs_set_fifo_callbacks(UINT16 (*fifo_data_r)(device_t *device), UINT16 (*fi } -int dcs_control_r(void) +int dcs_control_r(running_machine &machine) { /* only boost for DCS2 boards */ - if (!dcs.auto_ack && !transfer.hle_enabled) - dcs.cpu->machine().scheduler().boost_interleave(attotime::from_nsec(500), attotime::from_usec(5)); + if (!dcs.auto_ack && !dcs.transfer.hle_enabled) + machine.scheduler().boost_interleave(attotime::from_nsec(500), attotime::from_usec(5)); return dcs.latch_control; } -void dcs_reset_w(int state) +void dcs_reset_w(running_machine &machine, int state) { /* going high halts the CPU */ if (state) { - logerror("%s: DCS reset = %d\n", dcs.cpu->machine().describe_context(), state); + logerror("%s: DCS reset = %d\n", machine.describe_context(), state); /* just run through the init code again */ - dcs.cpu->machine().scheduler().synchronize(FUNC(dcs_reset)); + machine.scheduler().synchronize(FUNC(dcs_reset)); device_set_input_line(dcs.cpu, INPUT_LINE_RESET, ASSERT_LINE); } @@ -1538,9 +1550,9 @@ static READ16_HANDLER( latch_status_r ) result |= 0x80; if (IS_OUTPUT_EMPTY()) result |= 0x40; - if (dcs.fifo_status_r != NULL && (!transfer.hle_enabled || transfer.state == 0)) + if (dcs.fifo_status_r != NULL && (!dcs.transfer.hle_enabled || dcs.transfer.state == 0)) result |= (*dcs.fifo_status_r)(dcs.cpu) & 0x38; - if (transfer.hle_enabled && transfer.state != 0) + if (dcs.transfer.hle_enabled && dcs.transfer.state != 0) result |= 0x08; return result; } @@ -1587,17 +1599,17 @@ static TIMER_CALLBACK( dcs_delayed_data_w_callback ) } -void dcs_data_w(int data) +void dcs_data_w(running_machine &machine, int data) { /* preprocess the write */ - if (preprocess_write(dcs.cpu->machine(), data)) + if (preprocess_write(machine, data)) return; /* if we are DCS1, set a timer to latch the data */ if (dcs.sport_timer == NULL) - dcs.cpu->machine().scheduler().synchronize(FUNC(dcs_delayed_data_w_callback), data); + machine.scheduler().synchronize(FUNC(dcs_delayed_data_w_callback), data); else - dcs_delayed_data_w(dcs.cpu->machine(), data); + dcs_delayed_data_w(machine, data); } @@ -1642,7 +1654,7 @@ static WRITE16_HANDLER( output_latch_w ) } -static void delayed_ack_w(void) +static void delayed_ack_w(running_machine &machine) { SET_OUTPUT_EMPTY(); } @@ -1650,26 +1662,26 @@ static void delayed_ack_w(void) static TIMER_CALLBACK( delayed_ack_w_callback ) { - delayed_ack_w(); + delayed_ack_w(machine); } -void dcs_ack_w(void) +void dcs_ack_w(running_machine &machine) { - dcs.cpu->machine().scheduler().synchronize(FUNC(delayed_ack_w_callback)); + machine.scheduler().synchronize(FUNC(delayed_ack_w_callback)); } -int dcs_data_r(void) +int dcs_data_r(running_machine &machine) { /* data is actually only 8 bit (read from d8-d15) */ if (dcs.last_output_full && dcs.output_full_cb) - (*dcs.output_full_cb)(dcs.cpu->machine(), dcs.last_output_full = 0); + (*dcs.output_full_cb)(machine, dcs.last_output_full = 0); if (dcs.auto_ack) - delayed_ack_w(); + delayed_ack_w(machine); if (LOG_DCS_IO) - logerror("%s:dcs_data_r(%04X)\n", dcs.cpu->machine().describe_context(), dcs.output_data); + logerror("%s:dcs_data_r(%04X)\n", machine.describe_context(), dcs.output_data); return dcs.output_data; } @@ -1703,7 +1715,7 @@ static READ16_HANDLER( output_control_r ) } -int dcs_data2_r(void) +int dcs_data2_r(running_machine &machine) { return dcs.output_control; } @@ -1803,12 +1815,12 @@ static void timer_enable_callback(adsp21xx_device &device, int enable) dcs.timer_ignore = 0; if (enable) { -// mame_printf_debug("Timer enabled @ %d cycles/int, or %f Hz\n", dcs.timer_scale * (dcs.timer_period + 1), 1.0 / dcs.cpu->cycles_to_attotime(dcs.timer_scale * (dcs.timer_period + 1))); + //mame_printf_debug("Timer enabled @ %d cycles/int, or %f Hz\n", dcs.timer_scale * (dcs.timer_period + 1), 1.0 / dcs.cpu->cycles_to_attotime(dcs.timer_scale * (dcs.timer_period + 1))); reset_timer(device.machine()); } else { -// mame_printf_debug("Timer disabled\n"); + //mame_printf_debug("Timer disabled\n"); dcs.internal_timer->reset(); } } @@ -1879,7 +1891,7 @@ static WRITE16_HANDLER( adsp_control_w ) { logerror("%04X:Rebooting DCS due to SYSCONTROL write\n", cpu_get_pc(&space->device())); device_set_input_line(dcs.cpu, INPUT_LINE_RESET, PULSE_LINE); - dcs_boot(); + dcs_boot(space->machine()); dcs.control_regs[SYSCONTROL_REG] = 0; } @@ -2074,14 +2086,14 @@ static READ16_HANDLER( dcs_polling_r ) { if (dcs.polling_count++ > 5) device_eat_cycles(&space->device(), 10000); - return *dcs_polling_base; + return *dcs.polling_base; } static WRITE16_HANDLER( dcs_polling_w ) { dcs.polling_count = 0; - COMBINE_DATA(dcs_polling_base); + COMBINE_DATA(dcs.polling_base); } @@ -2090,8 +2102,10 @@ static WRITE16_HANDLER( dcs_polling_w ) DATA TRANSFER HLE MECHANISM ****************************************************************************/ -void dcs_fifo_notify(int count, int max) +void dcs_fifo_notify(running_machine &machine, int count, int max) { + hle_transfer_state &transfer = dcs.transfer; + /* skip if not in mid-transfer */ if (!transfer.hle_enabled || transfer.state == 0 || !dcs.fifo_data_r) { @@ -2104,13 +2118,14 @@ void dcs_fifo_notify(int count, int max) if (transfer.state != 5 || transfer.fifo_entries == transfer.writes_left || transfer.fifo_entries >= 256) { for ( ; transfer.fifo_entries; transfer.fifo_entries--) - preprocess_write(dcs.cpu->machine(), (*dcs.fifo_data_r)(dcs.cpu)); + preprocess_write(machine, (*dcs.fifo_data_r)(dcs.cpu)); } } static TIMER_DEVICE_CALLBACK( transfer_watchdog_callback ) { + hle_transfer_state &transfer = dcs.transfer; int starting_writes_left = param; if (transfer.fifo_entries && starting_writes_left == transfer.writes_left) @@ -2152,6 +2167,8 @@ static TIMER_CALLBACK( s1_ack_callback1 ) static int preprocess_stage_1(running_machine &machine, UINT16 data) { + hle_transfer_state &transfer = dcs.transfer; + switch (transfer.state) { case 0: @@ -2223,12 +2240,12 @@ static int preprocess_stage_1(running_machine &machine, UINT16 data) { if (transfer.type == 1 && SDRC_SM_BK == 1) { - sdrc.reg[0] &= ~0x1000; + dcs.sdrc.reg[0] &= ~0x1000; sdrc_remap_memory(machine); } if (transfer.type == 2 && SDRC_SM_BK == 0) { - sdrc.reg[0] |= 0x1000; + dcs.sdrc.reg[0] |= 0x1000; sdrc_remap_memory(machine); } return 1; @@ -2288,6 +2305,8 @@ static TIMER_CALLBACK( s2_ack_callback ) static int preprocess_stage_2(running_machine &machine, UINT16 data) { + hle_transfer_state &transfer = dcs.transfer; + switch (transfer.state) { case 0: @@ -2388,6 +2407,7 @@ static int preprocess_stage_2(running_machine &machine, UINT16 data) static int preprocess_write(running_machine &machine, UINT16 data) { + hle_transfer_state &transfer = dcs.transfer; int result; /* if we're not DCS2, skip */ diff --git a/src/mame/audio/dcs.h b/src/mame/audio/dcs.h index ae65cedd1ee..99edc8601b0 100644 --- a/src/mame/audio/dcs.h +++ b/src/mame/audio/dcs.h @@ -14,20 +14,20 @@ MACHINE_CONFIG_EXTERN( dcs2_audio_denver ); void dcs_init(running_machine &machine); void dcs2_init(running_machine &machine, int dram_in_mb, offs_t polling_offset); -void dcs_set_auto_ack(int state); +void dcs_set_auto_ack(running_machine &machine, int state); void dcs_set_fifo_callbacks(UINT16 (*fifo_data_r)(device_t *device), UINT16 (*fifo_status_r)(device_t *device)); void dcs_set_io_callbacks(void (*output_full_cb)(running_machine &, int), void (*input_empty_cb)(running_machine &, int)); -int dcs_data_r(void); -void dcs_ack_w(void); -int dcs_data2_r(void); -int dcs_control_r(void); +int dcs_data_r(running_machine &machine); +void dcs_ack_w(running_machine &machine); +int dcs_data2_r(running_machine &machine); +int dcs_control_r(running_machine &machine); -void dcs_data_w(int data); -void dcs_reset_w(int state); +void dcs_data_w(running_machine &machine, int data); +void dcs_reset_w(running_machine &machine, int state); -void dcs_fifo_notify(int count, int max); +void dcs_fifo_notify(running_machine &machine, int count, int max); WRITE32_HANDLER( dsio_idma_addr_w ); WRITE32_HANDLER( dsio_idma_data_w ); diff --git a/src/mame/audio/exidy440.c b/src/mame/audio/exidy440.c index b0c9de7f3df..e794fe4e78d 100644 --- a/src/mame/audio/exidy440.c +++ b/src/mame/audio/exidy440.c @@ -71,33 +71,36 @@ typedef struct sound_cache_entry -/* local allocated storage */ -static UINT8 sound_command; -static UINT8 sound_command_ack; -static UINT8 *sound_banks; -static UINT8 *m6844_data; -static UINT8 *sound_volume; -static INT32 *mixer_buffer_left; -static INT32 *mixer_buffer_right; -static sound_cache_entry *sound_cache; -static sound_cache_entry *sound_cache_end; -static sound_cache_entry *sound_cache_max; +typedef struct +{ + UINT8 sound_command; + UINT8 sound_command_ack; -/* 6844 description */ -static m6844_channel_data m6844_channel[4]; -static UINT8 m6844_priority; -static UINT8 m6844_interrupt; -static UINT8 m6844_chain; + UINT8 sound_banks[4]; + UINT8 m6844_data[0x20]; + UINT8 sound_volume[0x10]; + INT32 *mixer_buffer_left; + INT32 *mixer_buffer_right; + sound_cache_entry *sound_cache; + sound_cache_entry *sound_cache_end; + sound_cache_entry *sound_cache_max; -/* sound interface parameters */ -static sound_stream *stream; -static sound_channel_data sound_channel[4]; + /* 6844 description */ + m6844_channel_data m6844_channel[4]; + UINT8 m6844_priority; + UINT8 m6844_interrupt; + UINT8 m6844_chain; -/* debugging */ -static FILE *debuglog; + /* sound interface parameters */ + sound_stream *stream; + sound_channel_data sound_channel[4]; -/* channel frequency is configurable */ -static int channel_frequency[4]; + /* debugging */ + FILE *debuglog; + + /* channel frequency is configurable */ + int channel_frequency[4]; +} exidy440_audio_state; /* constant channel parameters */ static const int channel_bits[4] = @@ -109,18 +112,19 @@ static const int channel_bits[4] = /* function prototypes */ static STREAM_UPDATE( channel_update ); -static void m6844_finished(int ch); -static void play_cvsd(running_machine &machine, int ch); -static void stop_cvsd(int ch); +static void m6844_finished(m6844_channel_data *channel); +static void play_cvsd(device_t *device, int ch); +static void stop_cvsd(device_t *device, int ch); -static void reset_sound_cache(void); -static INT16 *add_to_sound_cache(UINT8 *input, int address, int length, int bits, int frequency); -static INT16 *find_or_add_to_sound_cache(running_machine &machine, int address, int length, int bits, int frequency); +static void reset_sound_cache(device_t *device); +static INT16 *add_to_sound_cache(device_t *device, UINT8 *input, int address, int length, int bits, int frequency); +static INT16 *find_or_add_to_sound_cache(device_t *device, int address, int length, int bits, int frequency); -static void decode_and_filter_cvsd(UINT8 *data, int bytes, int maskbits, int frequency, INT16 *dest); -static void fir_filter(INT32 *input, INT16 *output, int count); +static void decode_and_filter_cvsd(device_t *device, UINT8 *data, int bytes, int maskbits, int frequency, INT16 *dest); +static void fir_filter(device_t *device, INT32 *input, INT16 *output, int count); +DECLARE_LEGACY_SOUND_DEVICE(EXIDY440, exidy440_sound); /************************************* * @@ -128,53 +132,62 @@ static void fir_filter(INT32 *input, INT16 *output, int count); * *************************************/ +INLINE exidy440_audio_state *get_safe_token(device_t *device) +{ + assert(device != NULL); + assert(device->type() == EXIDY440); + + return (exidy440_audio_state *)downcast(device)->token(); +} + static DEVICE_START( exidy440_sound ) { + exidy440_audio_state *state = get_safe_token(device); running_machine &machine = device->machine(); int i, length; /* reset the system */ - sound_command = 0; - sound_command_ack = 1; - state_save_register_global(machine, sound_command); - state_save_register_global(machine, sound_command_ack); + state->sound_command = 0; + state->sound_command_ack = 1; + state_save_register_global(machine, state->sound_command); + state_save_register_global(machine, state->sound_command_ack); /* reset the 6844 */ for (i = 0; i < 4; i++) { - m6844_channel[i].active = 0; - m6844_channel[i].control = 0x00; + state->m6844_channel[i].active = 0; + state->m6844_channel[i].control = 0x00; } - m6844_priority = 0x00; - m6844_interrupt = 0x00; - m6844_chain = 0x00; + state->m6844_priority = 0x00; + state->m6844_interrupt = 0x00; + state->m6844_chain = 0x00; - state_save_register_global(machine, m6844_priority); - state_save_register_global(machine, m6844_interrupt); - state_save_register_global(machine, m6844_chain); + state_save_register_global(machine, state->m6844_priority); + state_save_register_global(machine, state->m6844_interrupt); + state_save_register_global(machine, state->m6844_chain); - channel_frequency[0] = device->clock(); /* channels 0 and 1 are run by FCLK */ - channel_frequency[1] = device->clock(); - channel_frequency[2] = device->clock()/2; /* channels 2 and 3 are run by SCLK */ - channel_frequency[3] = device->clock()/2; + state->channel_frequency[0] = device->clock(); /* channels 0 and 1 are run by FCLK */ + state->channel_frequency[1] = device->clock(); + state->channel_frequency[2] = device->clock()/2; /* channels 2 and 3 are run by SCLK */ + state->channel_frequency[3] = device->clock()/2; /* get stream channels */ - stream = device->machine().sound().stream_alloc(*device, 0, 2, device->clock(), NULL, channel_update); + state->stream = device->machine().sound().stream_alloc(*device, 0, 2, device->clock(), NULL, channel_update); /* allocate the sample cache */ length = machine.region("cvsd")->bytes() * 16 + MAX_CACHE_ENTRIES * sizeof(sound_cache_entry); - sound_cache = (sound_cache_entry *)auto_alloc_array(machine, UINT8, length); + state->sound_cache = (sound_cache_entry *)auto_alloc_array(machine, UINT8, length); /* determine the hard end of the cache and reset */ - sound_cache_max = (sound_cache_entry *)((UINT8 *)sound_cache + length); - reset_sound_cache(); + state->sound_cache_max = (sound_cache_entry *)((UINT8 *)state->sound_cache + length); + reset_sound_cache(device); /* allocate the mixer buffer */ - mixer_buffer_left = auto_alloc_array(machine, INT32, 2 * device->clock()); - mixer_buffer_right = mixer_buffer_left + device->clock(); + state->mixer_buffer_left = auto_alloc_array(machine, INT32, 2 * device->clock()); + state->mixer_buffer_right = state->mixer_buffer_left + device->clock(); if (SOUND_LOG) - debuglog = fopen("sound.log", "w"); + state->debuglog = fopen("sound.log", "w"); } @@ -187,8 +200,9 @@ static DEVICE_START( exidy440_sound ) static DEVICE_STOP( exidy440_sound ) { - if (SOUND_LOG && debuglog) - fclose(debuglog); + exidy440_audio_state *state = get_safe_token(device); + if (SOUND_LOG && state->debuglog) + fclose(state->debuglog); } @@ -199,9 +213,10 @@ static DEVICE_STOP( exidy440_sound ) * *************************************/ -static void add_and_scale_samples(int ch, INT32 *dest, int samples, int volume) +static void add_and_scale_samples(device_t *device, int ch, INT32 *dest, int samples, int volume) { - sound_channel_data *channel = &sound_channel[ch]; + exidy440_audio_state *state = get_safe_token(device); + sound_channel_data *channel = &state->sound_channel[ch]; INT16 *srcdata; int i; @@ -243,10 +258,11 @@ static void add_and_scale_samples(int ch, INT32 *dest, int samples, int volume) * *************************************/ -static void mix_to_16(int length, stream_sample_t *dest_left, stream_sample_t *dest_right) +static void mix_to_16(device_t *device, int length, stream_sample_t *dest_left, stream_sample_t *dest_right) { - INT32 *mixer_left = mixer_buffer_left; - INT32 *mixer_right = mixer_buffer_right; + exidy440_audio_state *state = get_safe_token(device); + INT32 *mixer_left = state->mixer_buffer_left; + INT32 *mixer_right = state->mixer_buffer_right; int i, clippers = 0; for (i = 0; i < length; i++) @@ -274,16 +290,17 @@ static void mix_to_16(int length, stream_sample_t *dest_left, stream_sample_t *d static STREAM_UPDATE( channel_update ) { + exidy440_audio_state *state = get_safe_token(device); int ch; /* reset the mixer buffers */ - memset(mixer_buffer_left, 0, samples * sizeof(INT32)); - memset(mixer_buffer_right, 0, samples * sizeof(INT32)); + memset(state->mixer_buffer_left, 0, samples * sizeof(INT32)); + memset(state->mixer_buffer_right, 0, samples * sizeof(INT32)); /* loop over channels */ for (ch = 0; ch < 4; ch++) { - sound_channel_data *channel = &sound_channel[ch]; + sound_channel_data *channel = &state->sound_channel[ch]; int length, volume, left = samples; int effective_offset; @@ -295,14 +312,14 @@ static STREAM_UPDATE( channel_update ) length = (left > channel->remaining) ? channel->remaining : left; /* get a pointer to the sample data and copy to the left */ - volume = sound_volume[2 * ch + 0]; + volume = state->sound_volume[2 * ch + 0]; if (volume) - add_and_scale_samples(ch, mixer_buffer_left, length, volume); + add_and_scale_samples(device, ch, state->mixer_buffer_left, length, volume); /* get a pointer to the sample data and copy to the left */ - volume = sound_volume[2 * ch + 1]; + volume = state->sound_volume[2 * ch + 1]; if (volume) - add_and_scale_samples(ch, mixer_buffer_right, length, volume); + add_and_scale_samples(device, ch, state->mixer_buffer_right, length, volume); /* update our counters */ channel->offset += length; @@ -311,18 +328,18 @@ static STREAM_UPDATE( channel_update ) /* update the MC6844 */ effective_offset = (ch & 2) ? channel->offset / 2 : channel->offset; - m6844_channel[ch].address = m6844_channel[ch].start_address + effective_offset / 8; - m6844_channel[ch].counter = m6844_channel[ch].start_counter - effective_offset / 8; - if (m6844_channel[ch].counter <= 0) + state->m6844_channel[ch].address = state->m6844_channel[ch].start_address + effective_offset / 8; + state->m6844_channel[ch].counter = state->m6844_channel[ch].start_counter - effective_offset / 8; + if (state->m6844_channel[ch].counter <= 0) { - if (SOUND_LOG && debuglog) - fprintf(debuglog, "Channel %d finished\n", ch); - m6844_finished(ch); + if (SOUND_LOG && state->debuglog) + fprintf(state->debuglog, "Channel %d finished\n", ch); + m6844_finished(&state->m6844_channel[ch]); } } /* all done, time to mix it */ - mix_to_16(samples, outputs[0], outputs[1]); + mix_to_16(device, samples, outputs[0], outputs[1]); } @@ -333,27 +350,30 @@ static STREAM_UPDATE( channel_update ) * *************************************/ -static READ8_HANDLER( sound_command_r ) +static READ8_DEVICE_HANDLER( sound_command_r ) { + exidy440_audio_state *state = get_safe_token(device); /* clear the FIRQ that got us here and acknowledge the read to the main CPU */ - cputag_set_input_line(space->machine(), "audiocpu", 1, CLEAR_LINE); - sound_command_ack = 1; + cputag_set_input_line(device->machine(), "audiocpu", 1, CLEAR_LINE); + state->sound_command_ack = 1; - return sound_command; + return state->sound_command; } -void exidy440_sound_command(running_machine &machine, UINT8 param) +void exidy440_sound_command(device_t *device, UINT8 param) { - sound_command = param; - sound_command_ack = 0; - cputag_set_input_line(machine, "audiocpu", INPUT_LINE_IRQ1, ASSERT_LINE); + exidy440_audio_state *state = get_safe_token(device); + state->sound_command = param; + state->sound_command_ack = 0; + cputag_set_input_line(device->machine(), "audiocpu", INPUT_LINE_IRQ1, ASSERT_LINE); } -UINT8 exidy440_sound_command_ack(void) +UINT8 exidy440_sound_command_ack(device_t *device) { - return sound_command_ack; + exidy440_audio_state *state = get_safe_token(device); + return state->sound_command_ack; } @@ -364,16 +384,23 @@ UINT8 exidy440_sound_command_ack(void) * *************************************/ -static WRITE8_HANDLER( sound_volume_w ) +static READ8_DEVICE_HANDLER( sound_volume_r ) { - if (SOUND_LOG && debuglog) - fprintf(debuglog, "Volume %02X=%02X\n", offset, data); + exidy440_audio_state *state = get_safe_token(device); + return state->sound_volume[offset]; +} + +static WRITE8_DEVICE_HANDLER( sound_volume_w ) +{ + exidy440_audio_state *state = get_safe_token(device); + if (SOUND_LOG && state->debuglog) + fprintf(state->debuglog, "Volume %02X=%02X\n", offset, data); /* update the stream */ - stream->update(); + state->stream->update(); /* set the new volume */ - sound_volume[offset] = ~data; + state->sound_volume[offset] = ~data; } @@ -384,9 +411,9 @@ static WRITE8_HANDLER( sound_volume_w ) * *************************************/ -static WRITE8_HANDLER( sound_interrupt_clear_w ) +static WRITE8_DEVICE_HANDLER( sound_interrupt_clear_w ) { - cputag_set_input_line(space->machine(), "audiocpu", 0, CLEAR_LINE); + cputag_set_input_line(device->machine(), "audiocpu", 0, CLEAR_LINE); } @@ -397,17 +424,16 @@ static WRITE8_HANDLER( sound_interrupt_clear_w ) * *************************************/ -static void m6844_update(void) +static void m6844_update(device_t *device) { + exidy440_audio_state *state = get_safe_token(device); /* update the stream */ - stream->update(); + state->stream->update(); } -static void m6844_finished(int ch) +static void m6844_finished(m6844_channel_data *channel) { - m6844_channel_data *channel = &m6844_channel[ch]; - /* mark us inactive */ channel->active = 0; @@ -428,12 +454,14 @@ static void m6844_finished(int ch) * *************************************/ -static READ8_HANDLER( m6844_r ) +static READ8_DEVICE_HANDLER( m6844_r ) { + exidy440_audio_state *state = get_safe_token(device); + m6844_channel_data *m6844_channel = state->m6844_channel; int result = 0; /* first update the current state of the DMA transfers */ - m6844_update(); + m6844_update(device); /* switch off the offset we were given */ switch (offset) @@ -483,25 +511,25 @@ static READ8_HANDLER( m6844_r ) /* priority control */ case 0x14: - result = m6844_priority; + result = state->m6844_priority; break; /* interrupt control */ case 0x15: /* update the global DMA end flag */ - m6844_interrupt &= ~0x80; - m6844_interrupt |= (m6844_channel[0].control & 0x80) | + state->m6844_interrupt &= ~0x80; + state->m6844_interrupt |= (m6844_channel[0].control & 0x80) | (m6844_channel[1].control & 0x80) | (m6844_channel[2].control & 0x80) | (m6844_channel[3].control & 0x80); - result = m6844_interrupt; + result = state->m6844_interrupt; break; /* chaining control */ case 0x16: - result = m6844_chain; + result = state->m6844_chain; break; /* 0x17-0x1f not used */ @@ -512,12 +540,14 @@ static READ8_HANDLER( m6844_r ) } -static WRITE8_HANDLER( m6844_w ) +static WRITE8_DEVICE_HANDLER( m6844_w ) { + exidy440_audio_state *state = get_safe_token(device); + m6844_channel_data *m6844_channel = state->m6844_channel; int i; /* first update the current state of the DMA transfers */ - m6844_update(); + m6844_update(device); /* switch off the offset we were given */ switch (offset) @@ -564,7 +594,7 @@ static WRITE8_HANDLER( m6844_w ) /* priority control */ case 0x14: - m6844_priority = data; + state->m6844_priority = data; /* update the sound playback on each channel */ for (i = 0; i < 4; i++) @@ -584,7 +614,7 @@ static WRITE8_HANDLER( m6844_w ) m6844_channel[i].start_counter = m6844_channel[i].counter; /* generate and play the sample */ - play_cvsd(space->machine(), i); + play_cvsd(device, i); } /* if we're going inactive... */ @@ -594,19 +624,19 @@ static WRITE8_HANDLER( m6844_w ) m6844_channel[i].active = 0; /* stop playing the sample */ - stop_cvsd(i); + stop_cvsd(device, i); } } break; /* interrupt control */ case 0x15: - m6844_interrupt = (m6844_interrupt & 0x80) | (data & 0x7f); + state->m6844_interrupt = (state->m6844_interrupt & 0x80) | (data & 0x7f); break; /* chaining control */ case 0x16: - m6844_chain = data; + state->m6844_chain = data; break; /* 0x17-0x1f not used */ @@ -622,48 +652,51 @@ static WRITE8_HANDLER( m6844_w ) * *************************************/ -static void reset_sound_cache(void) +static void reset_sound_cache(device_t *device) { - sound_cache_end = sound_cache; + exidy440_audio_state *state = get_safe_token(device); + state->sound_cache_end = state->sound_cache; } -static INT16 *add_to_sound_cache(UINT8 *input, int address, int length, int bits, int frequency) +static INT16 *add_to_sound_cache(device_t *device, UINT8 *input, int address, int length, int bits, int frequency) { - sound_cache_entry *current = sound_cache_end; + exidy440_audio_state *state = get_safe_token(device); + sound_cache_entry *current = state->sound_cache_end; /* compute where the end will be once we add this entry */ - sound_cache_end = (sound_cache_entry *)((UINT8 *)current + sizeof(sound_cache_entry) + length * 16); + state->sound_cache_end = (sound_cache_entry *)((UINT8 *)current + sizeof(sound_cache_entry) + length * 16); /* if this will overflow the cache, reset and re-add */ - if (sound_cache_end > sound_cache_max) + if (state->sound_cache_end > state->sound_cache_max) { - reset_sound_cache(); - return add_to_sound_cache(input, address, length, bits, frequency); + reset_sound_cache(device); + return add_to_sound_cache(device, input, address, length, bits, frequency); } /* fill in this entry */ - current->next = sound_cache_end; + current->next = state->sound_cache_end; current->address = address; current->length = length; current->bits = bits; current->frequency = frequency; /* decode the data into the cache */ - decode_and_filter_cvsd(input, length, bits, frequency, current->data); + decode_and_filter_cvsd(device, input, length, bits, frequency, current->data); return current->data; } -static INT16 *find_or_add_to_sound_cache(running_machine &machine, int address, int length, int bits, int frequency) +static INT16 *find_or_add_to_sound_cache(device_t *device, int address, int length, int bits, int frequency) { + exidy440_audio_state *state = get_safe_token(device); sound_cache_entry *current; - for (current = sound_cache; current < sound_cache_end; current = current->next) + for (current = state->sound_cache; current < state->sound_cache_end; current = current->next) if (current->address == address && current->length == length && current->bits == bits && current->frequency == frequency) return current->data; - return add_to_sound_cache(&machine.region("cvsd")->base()[address], address, length, bits, frequency); + return add_to_sound_cache(device, &device->machine().region("cvsd")->base()[address], address, length, bits, frequency); } @@ -674,25 +707,26 @@ static INT16 *find_or_add_to_sound_cache(running_machine &machine, int address, * *************************************/ -static void play_cvsd(running_machine &machine, int ch) +static void play_cvsd(device_t *device, int ch) { - sound_channel_data *channel = &sound_channel[ch]; - int address = m6844_channel[ch].address; - int length = m6844_channel[ch].counter; + exidy440_audio_state *state = get_safe_token(device); + sound_channel_data *channel = &state->sound_channel[ch]; + int address = state->m6844_channel[ch].address; + int length = state->m6844_channel[ch].counter; INT16 *base; /* add the bank number to the address */ - if (sound_banks[ch] & 1) + if (state->sound_banks[ch] & 1) address += 0x00000; - else if (sound_banks[ch] & 2) + else if (state->sound_banks[ch] & 2) address += 0x08000; - else if (sound_banks[ch] & 4) + else if (state->sound_banks[ch] & 4) address += 0x10000; - else if (sound_banks[ch] & 8) + else if (state->sound_banks[ch] & 8) address += 0x18000; /* compute the base address in the converted samples array */ - base = find_or_add_to_sound_cache(machine, address, length, channel_bits[ch], channel_frequency[ch]); + base = find_or_add_to_sound_cache(device, address, length, channel_bits[ch], state->channel_frequency[ch]); if (!base) return; @@ -702,14 +736,15 @@ static void play_cvsd(running_machine &machine, int ch) channel->base = base; channel->offset = length; channel->remaining = 0; - m6844_finished(ch); + m6844_finished(&state->m6844_channel[ch]); return; } - if (SOUND_LOG && debuglog) - fprintf(debuglog, "Sound channel %d play at %02X,%04X, length = %04X, volume = %02X/%02X\n", - ch, sound_banks[ch], m6844_channel[ch].address, - m6844_channel[ch].counter, sound_volume[ch * 2], sound_volume[ch * 2 + 1]); + if (SOUND_LOG && state->debuglog) + fprintf(state->debuglog, "Sound channel %d play at %02X,%04X, length = %04X, volume = %02X/%02X\n", + ch, state->sound_banks[ch], + state->m6844_channel[ch].address, state->m6844_channel[ch].counter, + state->sound_volume[ch * 2], state->sound_volume[ch * 2 + 1]); /* set the pointer and count */ channel->base = base; @@ -721,14 +756,15 @@ static void play_cvsd(running_machine &machine, int ch) } -static void stop_cvsd(int ch) +static void stop_cvsd(device_t *device, int ch) { + exidy440_audio_state *state = get_safe_token(device); /* the DMA channel is marked inactive; that will kill the audio */ - sound_channel[ch].remaining = 0; - stream->update(); + state->sound_channel[ch].remaining = 0; + state->stream->update(); - if (SOUND_LOG && debuglog) - fprintf(debuglog, "Channel %d stop\n", ch); + if (SOUND_LOG && state->debuglog) + fprintf(state->debuglog, "Channel %d stop\n", ch); } @@ -739,7 +775,7 @@ static void stop_cvsd(int ch) * *************************************/ -static void fir_filter(INT32 *input, INT16 *output, int count) +static void fir_filter(device_t *device, INT32 *input, INT16 *output, int count) { while (count--) { @@ -774,7 +810,7 @@ static void fir_filter(INT32 *input, INT16 *output, int count) * *************************************/ -static void decode_and_filter_cvsd(UINT8 *input, int bytes, int maskbits, int frequency, INT16 *output) +static void decode_and_filter_cvsd(device_t *device, UINT8 *input, int bytes, int maskbits, int frequency, INT16 *output) { INT32 buffer[SAMPLE_BUFFER_LENGTH + FIR_HISTORY_LENGTH]; int total_samples = bytes * 8; @@ -873,7 +909,7 @@ static void decode_and_filter_cvsd(UINT8 *input, int bytes, int maskbits, int fr } /* all done with this chunk, run the filter on it */ - fir_filter(&buffer[FIR_HISTORY_LENGTH], &output[chunk_start], chunk_bytes * 8); + fir_filter(device, &buffer[FIR_HISTORY_LENGTH], &output[chunk_start], chunk_bytes * 8); /* copy the last few input samples down to the start for a new history */ memcpy(&buffer[0], &buffer[SAMPLE_BUFFER_LENGTH], FIR_HISTORY_LENGTH * sizeof(INT32)); @@ -895,6 +931,12 @@ static void decode_and_filter_cvsd(UINT8 *input, int bytes, int maskbits, int fr } +static WRITE8_DEVICE_HANDLER( sound_banks_w ) +{ + exidy440_audio_state *state = get_safe_token(device); + state->sound_banks[offset] = data; +} + /************************************* * @@ -904,12 +946,12 @@ static void decode_and_filter_cvsd(UINT8 *input, int bytes, int maskbits, int fr static ADDRESS_MAP_START( exidy440_audio_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_NOP - AM_RANGE(0x8000, 0x801f) AM_MIRROR(0x03e0) AM_READWRITE(m6844_r, m6844_w) AM_BASE(&m6844_data) - AM_RANGE(0x8400, 0x840f) AM_MIRROR(0x03f0) AM_RAM_WRITE(sound_volume_w) AM_BASE(&sound_volume) - AM_RANGE(0x8800, 0x8800) AM_MIRROR(0x03ff) AM_READ(sound_command_r) AM_WRITENOP + AM_RANGE(0x8000, 0x801f) AM_MIRROR(0x03e0) AM_DEVREADWRITE("custom", m6844_r, m6844_w) + AM_RANGE(0x8400, 0x840f) AM_MIRROR(0x03f0) AM_DEVREADWRITE("custom", sound_volume_r, sound_volume_w) + AM_RANGE(0x8800, 0x8800) AM_MIRROR(0x03ff) AM_DEVREAD("custom", sound_command_r) AM_WRITENOP AM_RANGE(0x8c00, 0x93ff) AM_NOP - AM_RANGE(0x9400, 0x9403) AM_MIRROR(0x03fc) AM_READNOP AM_WRITEONLY AM_BASE(&sound_banks) - AM_RANGE(0x9800, 0x9800) AM_MIRROR(0x03ff) AM_READNOP AM_WRITE(sound_interrupt_clear_w) + AM_RANGE(0x9400, 0x9403) AM_MIRROR(0x03fc) AM_READNOP AM_DEVWRITE("custom", sound_banks_w) + AM_RANGE(0x9800, 0x9800) AM_MIRROR(0x03ff) AM_READNOP AM_DEVWRITE("custom", sound_interrupt_clear_w) AM_RANGE(0x9c00, 0x9fff) AM_NOP AM_RANGE(0xa000, 0xbfff) AM_RAM AM_RANGE(0xc000, 0xdfff) AM_NOP @@ -928,6 +970,9 @@ DEVICE_GET_INFO( exidy440_sound ) { switch (state) { + /* --- the following bits of info are returned as 64-bit signed integers --- */ + case DEVINFO_INT_TOKEN_BYTES: info->i = sizeof(exidy440_audio_state); break; + /* --- the following bits of info are returned as pointers to data or functions --- */ case DEVINFO_FCT_START: info->start = DEVICE_START_NAME(exidy440_sound); break; case DEVINFO_FCT_STOP: info->stop = DEVICE_STOP_NAME(exidy440_sound); break; @@ -939,7 +984,6 @@ DEVICE_GET_INFO( exidy440_sound ) } -DECLARE_LEGACY_SOUND_DEVICE(EXIDY440, exidy440_sound); DEFINE_LEGACY_SOUND_DEVICE(EXIDY440, exidy440_sound); diff --git a/src/mame/audio/exidy440.h b/src/mame/audio/exidy440.h index 15339153cb4..3b4f70bc9e5 100644 --- a/src/mame/audio/exidy440.h +++ b/src/mame/audio/exidy440.h @@ -1,4 +1,4 @@ -void exidy440_sound_command(running_machine &machine, UINT8 param); -UINT8 exidy440_sound_command_ack(void); +void exidy440_sound_command(device_t *device, UINT8 param); +UINT8 exidy440_sound_command_ack(device_t *device); MACHINE_CONFIG_EXTERN( exidy440_audio ); diff --git a/src/mame/audio/m72.c b/src/mame/audio/m72.c index 0fbe57ff755..42f9d5ff07b 100644 --- a/src/mame/audio/m72.c +++ b/src/mame/audio/m72.c @@ -67,144 +67,208 @@ enum Z80_CLEAR }; -static UINT8 irqvector; -static UINT32 sample_addr; +typedef struct _m72_audio_state m72_audio_state; +struct _m72_audio_state +{ + UINT8 irqvector; + UINT32 sample_addr; + UINT8 *samples; + UINT32 samples_size; + address_space *space; + device_t *dac; +}; + +INLINE m72_audio_state *get_safe_token(device_t *device) +{ + assert(device != NULL); + assert(device->type() == M72); + + return (m72_audio_state *)downcast(device)->token(); +} + static TIMER_CALLBACK( setvector_callback ) { + m72_audio_state *state = (m72_audio_state *)ptr; + switch(param) { case VECTOR_INIT: - irqvector = 0xff; + state->irqvector = 0xff; break; case YM2151_ASSERT: - irqvector &= 0xef; + state->irqvector &= 0xef; break; case YM2151_CLEAR: - irqvector |= 0x10; + state->irqvector |= 0x10; break; case Z80_ASSERT: - irqvector &= 0xdf; + state->irqvector &= 0xdf; break; case Z80_CLEAR: - irqvector |= 0x20; + state->irqvector |= 0x20; break; } - if (irqvector == 0) + if (state->irqvector == 0) logerror("You didn't call m72_init_sound()\n"); - if (irqvector == 0xff) /* no IRQs pending */ - cputag_set_input_line_and_vector(machine, "soundcpu",0,CLEAR_LINE, irqvector); - else /* IRQ pending */ - cputag_set_input_line_and_vector(machine, "soundcpu",0,ASSERT_LINE, irqvector); + cputag_set_input_line_and_vector(machine, "soundcpu", 0, (state->irqvector == 0xff) ? CLEAR_LINE : ASSERT_LINE, state->irqvector); } -SOUND_START( m72 ) +static DEVICE_START( m72_audio ) { - state_save_register_global(machine, irqvector); - state_save_register_global(machine, sample_addr); + m72_audio_state *state = get_safe_token(device); + + state->samples = device->machine().region("samples")->base(); + state->samples_size = device->machine().region("samples")->bytes(); + state->space = device->machine().device("soundcpu")->memory().space(AS_IO); + state->dac = device->machine().device("dac"); + + device->save_item(NAME(state->irqvector)); + device->save_item(NAME(state->sample_addr)); } -SOUND_RESET( m72 ) +static DEVICE_RESET( m72_audio ) { - setvector_callback(machine, NULL, VECTOR_INIT); + m72_audio_state *state = get_safe_token(device); + + setvector_callback(device->machine(), state, VECTOR_INIT); } void m72_ym2151_irq_handler(device_t *device, int irq) { - if (irq) - device->machine().scheduler().synchronize(FUNC(setvector_callback), YM2151_ASSERT); - else - device->machine().scheduler().synchronize(FUNC(setvector_callback), YM2151_CLEAR); + device_t *audio = device->machine().device("m72"); + m72_audio_state *state = get_safe_token(audio); + + device->machine().scheduler().synchronize(FUNC(setvector_callback), irq ? YM2151_ASSERT : YM2151_CLEAR, state); } -WRITE16_HANDLER( m72_sound_command_w ) +WRITE16_DEVICE_HANDLER( m72_sound_command_w ) { if (ACCESSING_BITS_0_7) { - soundlatch_w(space,offset,data); - space->machine().scheduler().synchronize(FUNC(setvector_callback), Z80_ASSERT); + m72_audio_state *state = get_safe_token(device); + + soundlatch_w(state->space, offset, data); + device->machine().scheduler().synchronize(FUNC(setvector_callback), Z80_ASSERT, state); } } -WRITE8_HANDLER( m72_sound_command_byte_w ) +WRITE8_DEVICE_HANDLER( m72_sound_command_byte_w ) { - soundlatch_w(space,offset,data); - space->machine().scheduler().synchronize(FUNC(setvector_callback), Z80_ASSERT); + m72_audio_state *state = get_safe_token(device); + + soundlatch_w(state->space, offset, data); + device->machine().scheduler().synchronize(FUNC(setvector_callback), Z80_ASSERT, state); } -WRITE8_HANDLER( m72_sound_irq_ack_w ) +WRITE8_DEVICE_HANDLER( m72_sound_irq_ack_w ) { - space->machine().scheduler().synchronize(FUNC(setvector_callback), Z80_CLEAR); + m72_audio_state *state = get_safe_token(device); + + device->machine().scheduler().synchronize(FUNC(setvector_callback), Z80_CLEAR, state); } -void m72_set_sample_start(int start) +void m72_set_sample_start(device_t *device, int start) { - sample_addr = start; + m72_audio_state *state = get_safe_token(device); + + state->sample_addr = start; } -WRITE8_HANDLER( vigilant_sample_addr_w ) +WRITE8_DEVICE_HANDLER( vigilant_sample_addr_w ) { - if (offset == 1) - sample_addr = (sample_addr & 0x00ff) | ((data << 8) & 0xff00); - else - sample_addr = (sample_addr & 0xff00) | ((data << 0) & 0x00ff); -} - -WRITE8_HANDLER( shisen_sample_addr_w ) -{ - sample_addr >>= 2; + m72_audio_state *state = get_safe_token(device); if (offset == 1) - sample_addr = (sample_addr & 0x00ff) | ((data << 8) & 0xff00); + state->sample_addr = (state->sample_addr & 0x00ff) | ((data << 8) & 0xff00); else - sample_addr = (sample_addr & 0xff00) | ((data << 0) & 0x00ff); - - sample_addr <<= 2; + state->sample_addr = (state->sample_addr & 0xff00) | ((data << 0) & 0x00ff); } -WRITE8_HANDLER( rtype2_sample_addr_w ) +WRITE8_DEVICE_HANDLER( shisen_sample_addr_w ) { - sample_addr >>= 5; + m72_audio_state *state = get_safe_token(device); + + state->sample_addr >>= 2; if (offset == 1) - sample_addr = (sample_addr & 0x00ff) | ((data << 8) & 0xff00); + state->sample_addr = (state->sample_addr & 0x00ff) | ((data << 8) & 0xff00); else - sample_addr = (sample_addr & 0xff00) | ((data << 0) & 0x00ff); + state->sample_addr = (state->sample_addr & 0xff00) | ((data << 0) & 0x00ff); - sample_addr <<= 5; + state->sample_addr <<= 2; } -WRITE8_HANDLER( poundfor_sample_addr_w ) +WRITE8_DEVICE_HANDLER( rtype2_sample_addr_w ) { + m72_audio_state *state = get_safe_token(device); + + state->sample_addr >>= 5; + + if (offset == 1) + state->sample_addr = (state->sample_addr & 0x00ff) | ((data << 8) & 0xff00); + else + state->sample_addr = (state->sample_addr & 0xff00) | ((data << 0) & 0x00ff); + + state->sample_addr <<= 5; +} + +WRITE8_DEVICE_HANDLER( poundfor_sample_addr_w ) +{ + m72_audio_state *state = get_safe_token(device); + /* poundfor writes both sample start and sample END - a first for Irem... we don't handle the end written here, 00 marks the sample end as usual. */ if (offset > 1) return; - sample_addr >>= 4; + state->sample_addr >>= 4; if (offset == 1) - sample_addr = (sample_addr & 0x00ff) | ((data << 8) & 0xff00); + state->sample_addr = (state->sample_addr & 0x00ff) | ((data << 8) & 0xff00); else - sample_addr = (sample_addr & 0xff00) | ((data << 0) & 0x00ff); + state->sample_addr = (state->sample_addr & 0xff00) | ((data << 0) & 0x00ff); - sample_addr <<= 4; + state->sample_addr <<= 4; } -READ8_HANDLER( m72_sample_r ) +READ8_DEVICE_HANDLER( m72_sample_r ) { - return space->machine().region("samples")->base()[sample_addr]; + m72_audio_state *state = get_safe_token(device); + + return state->samples[state->sample_addr]; } WRITE8_DEVICE_HANDLER( m72_sample_w ) { - dac_signed_data_w(device, data); - sample_addr = (sample_addr + 1) & (device->machine().region("samples")->bytes() - 1); + m72_audio_state *state = get_safe_token(device); + + dac_signed_data_w(state->dac, data); + state->sample_addr = (state->sample_addr + 1) & (state->samples_size - 1); } + +DEVICE_GET_INFO( m72_audio ) +{ + switch (state) + { + /* --- the following bits of info are returned as 64-bit signed integers --- */ + case DEVINFO_INT_TOKEN_BYTES: info->i = sizeof(m72_audio_state); break; + + /* --- the following bits of info are returned as pointers to data or functions --- */ + case DEVINFO_FCT_START: info->start = DEVICE_START_NAME(m72_audio); break; + case DEVINFO_FCT_RESET: info->start = DEVICE_RESET_NAME(m72_audio); break; + + /* --- the following bits of info are returned as NULL-terminated strings --- */ + case DEVINFO_STR_NAME: strcpy(info->s, "M72 Custom"); break; + case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break; + } +} + +DEFINE_LEGACY_SOUND_DEVICE(M72, m72_audio); diff --git a/src/mame/audio/m72.h b/src/mame/audio/m72.h index 5812eae66aa..15e8e74cfc3 100644 --- a/src/mame/audio/m72.h +++ b/src/mame/audio/m72.h @@ -4,18 +4,18 @@ ****************************************************************************/ -SOUND_START( m72 ); -SOUND_RESET( m72 ); void m72_ym2151_irq_handler(device_t *device, int irq); -WRITE8_HANDLER( m72_sound_command_byte_w ); -WRITE16_HANDLER( m72_sound_command_w ); -WRITE8_HANDLER( m72_sound_irq_ack_w ); -READ8_HANDLER( m72_sample_r ); +WRITE8_DEVICE_HANDLER( m72_sound_command_byte_w ); +WRITE16_DEVICE_HANDLER( m72_sound_command_w ); +WRITE8_DEVICE_HANDLER( m72_sound_irq_ack_w ); +READ8_DEVICE_HANDLER( m72_sample_r ); WRITE8_DEVICE_HANDLER( m72_sample_w ); /* the port goes to different address bits depending on the game */ -void m72_set_sample_start(int start); -WRITE8_HANDLER( vigilant_sample_addr_w ); -WRITE8_HANDLER( shisen_sample_addr_w ); -WRITE8_HANDLER( rtype2_sample_addr_w ); -WRITE8_HANDLER( poundfor_sample_addr_w ); +void m72_set_sample_start(device_t *device, int start); +WRITE8_DEVICE_HANDLER( vigilant_sample_addr_w ); +WRITE8_DEVICE_HANDLER( shisen_sample_addr_w ); +WRITE8_DEVICE_HANDLER( rtype2_sample_addr_w ); +WRITE8_DEVICE_HANDLER( poundfor_sample_addr_w ); + +DECLARE_LEGACY_SOUND_DEVICE(M72, m72_audio); diff --git a/src/mame/audio/mcr.c b/src/mame/audio/mcr.c index 095c11ee698..ad77cd8ff02 100644 --- a/src/mame/audio/mcr.c +++ b/src/mame/audio/mcr.c @@ -193,8 +193,8 @@ void mcr_sound_reset(running_machine &machine) /* Advanced Audio */ if (mcr_sound_config & MCR_WILLIAMS_SOUND) { - williams_cvsd_reset_w(1); - williams_cvsd_reset_w(0); + williams_cvsd_reset_w(machine, 1); + williams_cvsd_reset_w(machine, 0); } } diff --git a/src/mame/audio/segasnd.c b/src/mame/audio/segasnd.c index 454f66c3489..27250d1d301 100644 --- a/src/mame/audio/segasnd.c +++ b/src/mame/audio/segasnd.c @@ -80,6 +80,7 @@ struct _usb_state { sound_stream * stream; /* output stream */ device_t *cpu; /* CPU index of the 8035 */ + device_t *maincpu; UINT8 in_latch; /* input latch */ UINT8 out_latch; /* output latch */ UINT8 last_p2_value; /* current P2 output value */ @@ -99,17 +100,13 @@ struct _usb_state filter_state noise_filters[5]; }; - - -/*************************************************************************** - GLOBAL VARIABLES -***************************************************************************/ - /* SP0250-based speech board */ -static UINT8 speech_latch, speech_t0, speech_p2, speech_drq; - -/* Universal sound board */ -static usb_state usb; +typedef struct _speech_state speech_state; +struct _speech_state +{ + UINT8 latch, t0, p2, drq; + UINT8 *speech; +}; @@ -144,6 +141,43 @@ INLINE double step_cr_filter(filter_state *state, double input) SPEECH BOARD ***************************************************************************/ +DECLARE_LEGACY_SOUND_DEVICE(SEGASPEECH, speech_sound); + +INLINE speech_state *get_safe_speech(device_t *device) +{ + assert(device != NULL); + assert(device->type() == SEGASPEECH); + + return (speech_state *)downcast(device)->token(); +} + +static DEVICE_START( speech_sound ) +{ + speech_state *state = get_safe_speech(device); + + state->speech = device->machine().region("speech")->base(); +} + + +DEVICE_GET_INFO( speech_sound ) +{ + switch (state) + { + /* --- the following bits of info are returned as 64-bit signed integers --- */ + case DEVINFO_INT_TOKEN_BYTES: info->i = sizeof(speech_state); break; + + /* --- the following bits of info are returned as pointers to data or functions --- */ + case DEVINFO_FCT_START: info->start = DEVICE_START_NAME(speech_sound); break; + + /* --- the following bits of info are returned as NULL-terminated strings --- */ + case DEVINFO_STR_NAME: strcpy(info->s, "Sega Speech Sound Board"); break; + case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break; + } +} + +DEFINE_LEGACY_SOUND_DEVICE(SEGASPEECH, speech_sound); + + /************************************* * @@ -151,35 +185,49 @@ INLINE double step_cr_filter(filter_state *state, double input) * *************************************/ -static READ8_HANDLER( speech_t0_r ) + + +static READ8_DEVICE_HANDLER( speech_t0_r ) { - return speech_t0; + speech_state *state = get_safe_speech(device); + + return state->t0; } -static READ8_HANDLER( speech_t1_r ) +static READ8_DEVICE_HANDLER( speech_t1_r ) { - return speech_drq; + speech_state *state = get_safe_speech(device); + + return state->drq; } -static READ8_HANDLER( speech_p1_r ) +static READ8_DEVICE_HANDLER( speech_p1_r ) { - return speech_latch & 0x7f; + speech_state *state = get_safe_speech(device); + + return state->latch & 0x7f; } -static READ8_HANDLER( speech_rom_r ) +static READ8_DEVICE_HANDLER( speech_rom_r ) { - return space->machine().region("speech")->base()[0x100 * (speech_p2 & 0x3f) + offset]; + speech_state *state = get_safe_speech(device); + + return state->speech[0x100 * (state->p2 & 0x3f) + offset]; } -static WRITE8_HANDLER( speech_p1_w ) +static WRITE8_DEVICE_HANDLER( speech_p1_w ) { + speech_state *state = get_safe_speech(device); + if (!(data & 0x80)) - speech_t0 = 0; + state->t0 = 0; } -static WRITE8_HANDLER( speech_p2_w ) +static WRITE8_DEVICE_HANDLER( speech_p2_w ) { - speech_p2 = data; + speech_state *state = get_safe_speech(device); + + state->p2 = data; } @@ -192,7 +240,10 @@ static WRITE8_HANDLER( speech_p2_w ) static void speech_drq_w(device_t *device, int level) { - speech_drq = (level == ASSERT_LINE); + device_t *speech = device->machine().device("segaspeech"); + speech_state *state = get_safe_speech(speech); + + state->drq = (level == ASSERT_LINE); } @@ -206,27 +257,30 @@ static void speech_drq_w(device_t *device, int level) static TIMER_CALLBACK( delayed_speech_w ) { int data = param; - UINT8 old = speech_latch; + speech_state *state = (speech_state *)ptr; + UINT8 old = state->latch; /* all 8 bits are latched */ - speech_latch = data; + state->latch = data; /* the high bit goes directly to the INT line */ cputag_set_input_line(machine, "audiocpu", 0, (data & 0x80) ? CLEAR_LINE : ASSERT_LINE); /* a clock on the high bit clocks a 1 into T0 */ if (!(old & 0x80) && (data & 0x80)) - speech_t0 = 1; + state->t0 = 1; } -WRITE8_HANDLER( sega_speech_data_w ) +WRITE8_DEVICE_HANDLER( sega_speech_data_w ) { - space->machine().scheduler().synchronize(FUNC(delayed_speech_w), data); + speech_state *state = get_safe_speech(device); + + device->machine().scheduler().synchronize(FUNC(delayed_speech_w), data, state); } -WRITE8_HANDLER( sega_speech_control_w ) +WRITE8_DEVICE_HANDLER( sega_speech_control_w ) { LOG(("Speech control = %X\n", data)); } @@ -245,12 +299,12 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( speech_portmap, AS_IO, 8 ) - AM_RANGE(0x00, 0xff) AM_READ(speech_rom_r) + AM_RANGE(0x00, 0xff) AM_DEVREAD("segaspeech", speech_rom_r) AM_RANGE(0x00, 0xff) AM_DEVWRITE("speech", sp0250_w) - AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READWRITE(speech_p1_r, speech_p1_w) - AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_WRITE(speech_p2_w) - AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_READ(speech_t0_r) - AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(speech_t1_r) + AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_DEVREADWRITE("segaspeech", speech_p1_r, speech_p1_w) + AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_DEVWRITE("segaspeech", speech_p2_w) + AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_DEVREAD("segaspeech", speech_t0_r) + AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_DEVREAD("segaspeech", speech_t1_r) ADDRESS_MAP_END @@ -282,6 +336,7 @@ MACHINE_CONFIG_FRAGMENT( sega_speech_board ) MCFG_CPU_IO_MAP(speech_portmap) /* sound hardware */ + MCFG_SOUND_ADD("segaspeech", SEGASPEECH, 0) MCFG_SOUND_ADD("speech", SP0250, SPEECH_MASTER_CLOCK) MCFG_SOUND_CONFIG(sp0250_interface) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) @@ -293,6 +348,15 @@ MACHINE_CONFIG_END UNIVERSAL SOUND BOARD ***************************************************************************/ +static DECLARE_LEGACY_SOUND_DEVICE(SEGAUSB, usb_sound); + +INLINE usb_state *get_safe_token(device_t *device) +{ + assert(device != NULL); + assert(device->type() == SEGAUSB); + + return (usb_state *)downcast(device)->token(); +} /************************************* * @@ -302,19 +366,24 @@ MACHINE_CONFIG_END static TIMER_DEVICE_CALLBACK( increment_t1_clock ) { + device_t *usbsnd = timer.machine().device("usbsnd"); + usb_state *usb = get_safe_token(usbsnd); + /* only increment if it is not being forced clear */ - if (!(usb.last_p2_value & 0x80)) - usb.t1_clock++; + if (!(usb->last_p2_value & 0x80)) + usb->t1_clock++; } -void sega_usb_reset(running_machine &machine, UINT8 t1_clock_mask) +static DEVICE_RESET( usb_sound ) { + usb_state *usb = get_safe_token(device); + /* halt the USB CPU at reset time */ - device_set_input_line(usb.cpu, INPUT_LINE_RESET, ASSERT_LINE); + device_set_input_line(usb->cpu, INPUT_LINE_RESET, ASSERT_LINE); /* start the clock timer */ - usb.t1_clock_mask = t1_clock_mask; + usb->t1_clock_mask = 0x10; } @@ -325,56 +394,65 @@ void sega_usb_reset(running_machine &machine, UINT8 t1_clock_mask) * *************************************/ -READ8_HANDLER( sega_usb_status_r ) +READ8_DEVICE_HANDLER( sega_usb_status_r ) { - LOG(("%04X:usb_data_r = %02X\n", cpu_get_pc(&space->device()), (usb.out_latch & 0x81) | (usb.in_latch & 0x7e))); + usb_state *usb = get_safe_token(device); - device_adjust_icount(&space->device(), -200); + LOG(("%04X:usb_data_r = %02X\n", cpu_get_pc(usb->maincpu), (usb->out_latch & 0x81) | (usb->in_latch & 0x7e))); + + device_adjust_icount(usb->maincpu, -200); /* only bits 0 and 7 are controlled by the I8035; the remaining */ /* bits 1-6 reflect the current input latch values */ - return (usb.out_latch & 0x81) | (usb.in_latch & 0x7e); + return (usb->out_latch & 0x81) | (usb->in_latch & 0x7e); } static TIMER_CALLBACK( delayed_usb_data_w ) { + usb_state *usb = (usb_state *)ptr; int data = param; /* look for rising/falling edges of bit 7 to control the RESET line */ - device_set_input_line(usb.cpu, INPUT_LINE_RESET, (data & 0x80) ? ASSERT_LINE : CLEAR_LINE); + device_set_input_line(usb->cpu, INPUT_LINE_RESET, (data & 0x80) ? ASSERT_LINE : CLEAR_LINE); /* if the CLEAR line is set, the low 7 bits of the input are ignored */ - if ((usb.last_p2_value & 0x40) == 0) + if ((usb->last_p2_value & 0x40) == 0) data &= ~0x7f; /* update the effective input latch */ - usb.in_latch = data; + usb->in_latch = data; } -WRITE8_HANDLER( sega_usb_data_w ) +WRITE8_DEVICE_HANDLER( sega_usb_data_w ) { - LOG(("%04X:usb_data_w = %02X\n", cpu_get_pc(&space->device()), data)); - space->machine().scheduler().synchronize(FUNC(delayed_usb_data_w), data); + usb_state *usb = get_safe_token(device); + + LOG(("%04X:usb_data_w = %02X\n", cpu_get_pc(usb->maincpu), data)); + device->machine().scheduler().synchronize(FUNC(delayed_usb_data_w), data, usb); /* boost the interleave so that sequences can be sent */ - space->machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(250)); + device->machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(250)); } -READ8_HANDLER( sega_usb_ram_r ) +READ8_DEVICE_HANDLER( sega_usb_ram_r ) { - return usb.program_ram[offset]; + usb_state *usb = get_safe_token(device); + + return usb->program_ram[offset]; } -WRITE8_HANDLER( sega_usb_ram_w ) +WRITE8_DEVICE_HANDLER( sega_usb_ram_w ) { - if (usb.in_latch & 0x80) - usb.program_ram[offset] = data; + usb_state *usb = get_safe_token(device); + + if (usb->in_latch & 0x80) + usb->program_ram[offset] = data; else - LOG(("%04X:sega_usb_ram_w(%03X) = %02X while /LOAD disabled\n", cpu_get_pc(&space->device()), offset, data)); + LOG(("%04X:sega_usb_ram_w(%03X) = %02X while /LOAD disabled\n", cpu_get_pc(usb->maincpu), offset, data)); } @@ -385,50 +463,57 @@ WRITE8_HANDLER( sega_usb_ram_w ) * *************************************/ -static READ8_HANDLER( usb_p1_r ) +static READ8_DEVICE_HANDLER( usb_p1_r ) { + usb_state *usb = get_safe_token(device); + /* bits 0-6 are inputs and map to bits 0-6 of the input latch */ - if ((usb.in_latch & 0x7f) != 0) - LOG(("%03X: P1 read = %02X\n", cpu_get_pc(&space->device()), usb.in_latch & 0x7f)); - return usb.in_latch & 0x7f; + if ((usb->in_latch & 0x7f) != 0) + LOG(("%03X: P1 read = %02X\n", cpu_get_pc(usb->maincpu), usb->in_latch & 0x7f)); + return usb->in_latch & 0x7f; } -static WRITE8_HANDLER( usb_p1_w ) +static WRITE8_DEVICE_HANDLER( usb_p1_w ) { + usb_state *usb = get_safe_token(device); + /* bit 7 maps to bit 0 on the output latch */ - usb.out_latch = (usb.out_latch & 0xfe) | (data >> 7); - LOG(("%03X: P1 write = %02X\n", cpu_get_pc(&space->device()), data)); + usb->out_latch = (usb->out_latch & 0xfe) | (data >> 7); + LOG(("%03X: P1 write = %02X\n", cpu_get_pc(usb->maincpu), data)); } -static WRITE8_HANDLER( usb_p2_w ) +static WRITE8_DEVICE_HANDLER( usb_p2_w ) { - UINT8 old = usb.last_p2_value; - usb.last_p2_value = data; + usb_state *usb = get_safe_token(device); + UINT8 old = usb->last_p2_value; + usb->last_p2_value = data; /* low 2 bits control the bank of work RAM we are addressing */ - usb.work_ram_bank = data & 3; + usb->work_ram_bank = data & 3; /* bit 6 controls the "ready" bit output to the host */ /* it also clears the input latch from the host (active low) */ - usb.out_latch = ((data & 0x40) << 1) | (usb.out_latch & 0x7f); + usb->out_latch = ((data & 0x40) << 1) | (usb->out_latch & 0x7f); if ((data & 0x40) == 0) - usb.in_latch = 0; + usb->in_latch = 0; /* bit 7 controls the reset on the upper counter at U33 */ if ((old & 0x80) && !(data & 0x80)) - usb.t1_clock = 0; + usb->t1_clock = 0; - LOG(("%03X: P2 write -> bank=%d ready=%d clock=%d\n", cpu_get_pc(&space->device()), data & 3, (data >> 6) & 1, (data >> 7) & 1)); + LOG(("%03X: P2 write -> bank=%d ready=%d clock=%d\n", cpu_get_pc(usb->maincpu), data & 3, (data >> 6) & 1, (data >> 7) & 1)); } -static READ8_HANDLER( usb_t1_r ) +static READ8_DEVICE_HANDLER( usb_t1_r ) { + usb_state *usb = get_safe_token(device); + /* T1 returns 1 based on the value of the T1 clock; the exact */ /* pattern is determined by one or more jumpers on the board. */ - return (usb.t1_clock & usb.t1_clock_mask) != 0; + return (usb->t1_clock & usb->t1_clock_mask) != 0; } @@ -482,6 +567,7 @@ INLINE void clock_channel(timer8253_channel *ch) static STREAM_UPDATE( usb_stream_update ) { + usb_state *usb = get_safe_token(device); stream_sample_t *dest = outputs[0]; /* iterate over samples */ @@ -503,30 +589,30 @@ static STREAM_UPDATE( usb_stream_update ) */ /* update the noise source */ - for (step = USB_2MHZ_CLOCK / SAMPLE_RATE; step >= usb.noise_subcount; step -= usb.noise_subcount) + for (step = USB_2MHZ_CLOCK / SAMPLE_RATE; step >= usb->noise_subcount; step -= usb->noise_subcount) { - usb.noise_shift = (usb.noise_shift << 1) | (((usb.noise_shift >> 13) ^ (usb.noise_shift >> 16)) & 1); - usb.noise_state = (usb.noise_shift >> 16) & 1; - usb.noise_subcount = USB_2MHZ_CLOCK / MM5837_CLOCK; + usb->noise_shift = (usb->noise_shift << 1) | (((usb->noise_shift >> 13) ^ (usb->noise_shift >> 16)) & 1); + usb->noise_state = (usb->noise_shift >> 16) & 1; + usb->noise_subcount = USB_2MHZ_CLOCK / MM5837_CLOCK; } - usb.noise_subcount -= step; + usb->noise_subcount -= step; /* update the filtered noise value -- this is just an approximation to the pink noise filter */ /* being applied on the PCB, but it sounds pretty close */ - usb.noise_filters[0].capval = 0.99765 * usb.noise_filters[0].capval + usb.noise_state * 0.0990460; - usb.noise_filters[1].capval = 0.96300 * usb.noise_filters[1].capval + usb.noise_state * 0.2965164; - usb.noise_filters[2].capval = 0.57000 * usb.noise_filters[2].capval + usb.noise_state * 1.0526913; - noiseval = usb.noise_filters[0].capval + usb.noise_filters[1].capval + usb.noise_filters[2].capval + usb.noise_state * 0.1848; + usb->noise_filters[0].capval = 0.99765 * usb->noise_filters[0].capval + usb->noise_state * 0.0990460; + usb->noise_filters[1].capval = 0.96300 * usb->noise_filters[1].capval + usb->noise_state * 0.2965164; + usb->noise_filters[2].capval = 0.57000 * usb->noise_filters[2].capval + usb->noise_state * 1.0526913; + noiseval = usb->noise_filters[0].capval + usb->noise_filters[1].capval + usb->noise_filters[2].capval + usb->noise_state * 0.1848; /* final output goes through a CR filter; the scaling factor is arbitrary to get the noise to the */ /* correct relative volume */ - noiseval = step_cr_filter(&usb.noise_filters[4], noiseval); + noiseval = step_cr_filter(&usb->noise_filters[4], noiseval); noiseval *= 0.075; /* there are 3 identical groups of circuits, each with its own 8253 */ for (group = 0; group < 3; group++) { - timer8253 *g = &usb.timer_group[group]; + timer8253 *g = &usb->timer_group[group]; double chan0, chan1, chan2, mix; @@ -601,8 +687,8 @@ static STREAM_UPDATE( usb_stream_update ) } /* the exponents for the gate filters are determined by channel 2's output */ - g->gate1.exponent = usb.gate_rc1_exp[g->chan[2].output]; - g->gate2.exponent = usb.gate_rc2_exp[g->chan[2].output]; + g->gate1.exponent = usb->gate_rc1_exp[g->chan[2].output]; + g->gate2.exponent = usb->gate_rc2_exp[g->chan[2].output]; /* based on the envelope mode, we do one of two things with source 2 */ if (g->config == 0) @@ -631,33 +717,37 @@ static STREAM_UPDATE( usb_stream_update ) WEIGHT */ - *dest++ = 4000 * step_cr_filter(&usb.final_filter, sample); + *dest++ = 4000 * step_cr_filter(&usb->final_filter, sample); } } static DEVICE_START( usb_sound ) { + usb_state *usb = get_safe_token(device); running_machine &machine = device->machine(); filter_state temp; int tchan, tgroup; /* find the CPU we are associated with */ - usb.cpu = machine.device("usbcpu"); - assert(usb.cpu != NULL); + usb->maincpu = machine.device("maincpu"); + assert(usb->maincpu != NULL); + usb->cpu = machine.device("usbcpu"); + assert(usb->cpu != NULL); - /* allocate work RAM */ - usb.work_ram = auto_alloc_array(machine, UINT8, 0x400); + /* allocate RAM */ + usb->program_ram = (UINT8 *)memory_get_shared(device->machine(), "pgmram"); + usb->work_ram = auto_alloc_array(machine, UINT8, 0x400); /* create a sound stream */ - usb.stream = device->machine().sound().stream_alloc(*device, 0, 1, SAMPLE_RATE, NULL, usb_stream_update); + usb->stream = device->machine().sound().stream_alloc(*device, 0, 1, SAMPLE_RATE, NULL, usb_stream_update); /* initialize state */ - usb.noise_shift = 0x15555; + usb->noise_shift = 0x15555; for (tgroup = 0; tgroup < 3; tgroup++) { - timer8253 *g = &usb.timer_group[tgroup]; + timer8253 *g = &usb->timer_group[tgroup]; configure_filter(&g->chan_filter[0], 10e3, 1e-6); configure_filter(&g->chan_filter[1], 10e3, 1e-6); configure_filter(&g->gate1, 100e3, 0.01e-6); @@ -665,32 +755,32 @@ static DEVICE_START( usb_sound ) } configure_filter(&temp, 100e3, 0.01e-6); - usb.gate_rc1_exp[0] = temp.exponent; + usb->gate_rc1_exp[0] = temp.exponent; configure_filter(&temp, 1e3, 0.01e-6); - usb.gate_rc1_exp[1] = temp.exponent; + usb->gate_rc1_exp[1] = temp.exponent; configure_filter(&temp, 2 * 100e3, 0.01e-6); - usb.gate_rc2_exp[0] = temp.exponent; + usb->gate_rc2_exp[0] = temp.exponent; configure_filter(&temp, 2 * 1e3, 0.01e-6); - usb.gate_rc2_exp[1] = temp.exponent; + usb->gate_rc2_exp[1] = temp.exponent; - configure_filter(&usb.noise_filters[0], 2.7e3 + 2.7e3, 1.0e-6); - configure_filter(&usb.noise_filters[1], 2.7e3 + 1e3, 0.30e-6); - configure_filter(&usb.noise_filters[2], 2.7e3 + 270, 0.15e-6); - configure_filter(&usb.noise_filters[3], 2.7e3 + 0, 0.082e-6); - configure_filter(&usb.noise_filters[4], 33e3, 0.1e-6); + configure_filter(&usb->noise_filters[0], 2.7e3 + 2.7e3, 1.0e-6); + configure_filter(&usb->noise_filters[1], 2.7e3 + 1e3, 0.30e-6); + configure_filter(&usb->noise_filters[2], 2.7e3 + 270, 0.15e-6); + configure_filter(&usb->noise_filters[3], 2.7e3 + 0, 0.082e-6); + configure_filter(&usb->noise_filters[4], 33e3, 0.1e-6); - configure_filter(&usb.final_filter, 100e3, 4.7e-6); + configure_filter(&usb->final_filter, 100e3, 4.7e-6); /* register for save states */ - state_save_register_item(machine, "usb", NULL, 0, usb.in_latch); - state_save_register_item(machine, "usb", NULL, 0, usb.out_latch); - state_save_register_item(machine, "usb", NULL, 0, usb.last_p2_value); - state_save_register_item(machine, "usb", NULL, 0, usb.work_ram_bank); - state_save_register_item(machine, "usb", NULL, 0, usb.t1_clock); + state_save_register_item(machine, "usb", NULL, 0, usb->in_latch); + state_save_register_item(machine, "usb", NULL, 0, usb->out_latch); + state_save_register_item(machine, "usb", NULL, 0, usb->last_p2_value); + state_save_register_item(machine, "usb", NULL, 0, usb->work_ram_bank); + state_save_register_item(machine, "usb", NULL, 0, usb->t1_clock); for (tgroup = 0; tgroup < 3; tgroup++) { - timer8253 *group = &usb.timer_group[tgroup]; + timer8253 *group = &usb->timer_group[tgroup]; for (tchan = 0; tchan < 3; tchan++) { timer8253_channel *channel = &group->chan[tchan]; @@ -714,16 +804,16 @@ static DEVICE_START( usb_sound ) state_save_register_item(machine, "usb", NULL, tgroup, group->config); } - state_save_register_item_array(machine, "usb", NULL, 0, usb.timer_mode); - state_save_register_item(machine, "usb", NULL, 0, usb.noise_shift); - state_save_register_item(machine, "usb", NULL, 0, usb.noise_state); - state_save_register_item(machine, "usb", NULL, 0, usb.noise_subcount); - state_save_register_item(machine, "usb", NULL, 0, usb.final_filter.capval); - state_save_register_item(machine, "usb", NULL, 0, usb.noise_filters[0].capval); - state_save_register_item(machine, "usb", NULL, 0, usb.noise_filters[1].capval); - state_save_register_item(machine, "usb", NULL, 0, usb.noise_filters[2].capval); - state_save_register_item(machine, "usb", NULL, 0, usb.noise_filters[3].capval); - state_save_register_item(machine, "usb", NULL, 0, usb.noise_filters[4].capval); + state_save_register_item_array(machine, "usb", NULL, 0, usb->timer_mode); + state_save_register_item(machine, "usb", NULL, 0, usb->noise_shift); + state_save_register_item(machine, "usb", NULL, 0, usb->noise_state); + state_save_register_item(machine, "usb", NULL, 0, usb->noise_subcount); + state_save_register_item(machine, "usb", NULL, 0, usb->final_filter.capval); + state_save_register_item(machine, "usb", NULL, 0, usb->noise_filters[0].capval); + state_save_register_item(machine, "usb", NULL, 0, usb->noise_filters[1].capval); + state_save_register_item(machine, "usb", NULL, 0, usb->noise_filters[2].capval); + state_save_register_item(machine, "usb", NULL, 0, usb->noise_filters[3].capval); + state_save_register_item(machine, "usb", NULL, 0, usb->noise_filters[4].capval); } @@ -731,8 +821,12 @@ static DEVICE_GET_INFO( usb_sound ) { switch (state) { + /* --- the following bits of info are returned as 64-bit signed integers --- */ + case DEVINFO_INT_TOKEN_BYTES: info->i = sizeof(usb_state); break; + /* --- the following bits of info are returned as pointers to data or functions --- */ case DEVINFO_FCT_START: info->start = DEVICE_START_NAME(usb_sound); break; + case DEVINFO_FCT_RESET: info->start = DEVICE_RESET_NAME(usb_sound); break; /* --- the following bits of info are returned as NULL-terminated strings --- */ case DEVINFO_STR_NAME: strcpy(info->s, "Sega Universal Sound Board"); break; @@ -740,7 +834,6 @@ static DEVICE_GET_INFO( usb_sound ) } } -DECLARE_LEGACY_SOUND_DEVICE(SEGAUSB, usb_sound); DEFINE_LEGACY_SOUND_DEVICE(SEGAUSB, usb_sound); @@ -751,13 +844,13 @@ DEFINE_LEGACY_SOUND_DEVICE(SEGAUSB, usb_sound); * *************************************/ -static void timer_w(int which, UINT8 offset, UINT8 data) +static void timer_w(usb_state *usb, int which, UINT8 offset, UINT8 data) { - timer8253 *g = &usb.timer_group[which]; + timer8253 *g = &usb->timer_group[which]; timer8253_channel *ch; int was_holding; - usb.stream->update(); + usb->stream->update(); /* switch off the offset */ switch (offset) @@ -820,11 +913,11 @@ static void timer_w(int which, UINT8 offset, UINT8 data) } -static void env_w(int which, UINT8 offset, UINT8 data) +static void env_w(usb_state *usb, int which, UINT8 offset, UINT8 data) { - timer8253 *g = &usb.timer_group[which]; + timer8253 *g = &usb->timer_group[which]; - usb.stream->update(); + usb->stream->update(); if (offset < 3) g->env[offset] = (double)data; @@ -840,43 +933,47 @@ static void env_w(int which, UINT8 offset, UINT8 data) * *************************************/ -static READ8_HANDLER( usb_workram_r ) +static READ8_DEVICE_HANDLER( usb_workram_r ) { - offset += 256 * usb.work_ram_bank; - return usb.work_ram[offset]; + usb_state *usb = get_safe_token(device); + + offset += 256 * usb->work_ram_bank; + return usb->work_ram[offset]; } -static WRITE8_HANDLER( usb_workram_w ) +static WRITE8_DEVICE_HANDLER( usb_workram_w ) { - offset += 256 * usb.work_ram_bank; - usb.work_ram[offset] = data; + usb_state *usb = get_safe_token(device); + + offset += 256 * usb->work_ram_bank; + usb->work_ram[offset] = data; /* writes to the low 32 bytes go to various controls */ switch (offset & ~3) { case 0x00: /* CTC0 */ - timer_w(0, offset & 3, data); + timer_w(usb, 0, offset & 3, data); break; case 0x04: /* ENV0 */ - env_w(0, offset & 3, data); + env_w(usb, 0, offset & 3, data); break; case 0x08: /* CTC1 */ - timer_w(1, offset & 3, data); + timer_w(usb, 1, offset & 3, data); break; case 0x0c: /* ENV1 */ - env_w(1, offset & 3, data); + env_w(usb, 1, offset & 3, data); break; case 0x10: /* CTC2 */ - timer_w(2, offset & 3, data); + timer_w(usb, 2, offset & 3, data); break; case 0x14: /* ENV2 */ - env_w(2, offset & 3, data); + env_w(usb, 2, offset & 3, data); break; } } @@ -890,7 +987,7 @@ static WRITE8_HANDLER( usb_workram_w ) *************************************/ static ADDRESS_MAP_START( usb_map, AS_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x0fff) AM_RAM AM_BASE(&usb.program_ram) + AM_RANGE(0x0000, 0x0fff) AM_RAM AM_SHARE("pgmram") ADDRESS_MAP_END @@ -900,10 +997,10 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( usb_portmap, AS_IO, 8 ) - AM_RANGE(0x00, 0xff) AM_READWRITE(usb_workram_r, usb_workram_w) - AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READWRITE(usb_p1_r, usb_p1_w) - AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_WRITE(usb_p2_w) - AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(usb_t1_r) + AM_RANGE(0x00, 0xff) AM_DEVREADWRITE("usbsnd", usb_workram_r, usb_workram_w) + AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_DEVREADWRITE("usbsnd", usb_p1_r, usb_p1_w) + AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_DEVWRITE("usbsnd", usb_p2_w) + AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_DEVREAD("usbsnd", usb_t1_r) ADDRESS_MAP_END diff --git a/src/mame/audio/segasnd.h b/src/mame/audio/segasnd.h index 2690a8d0d61..da998fa3abf 100644 --- a/src/mame/audio/segasnd.h +++ b/src/mame/audio/segasnd.h @@ -6,17 +6,15 @@ MACHINE_CONFIG_EXTERN( sega_speech_board ); -WRITE8_HANDLER( sega_speech_data_w ); -WRITE8_HANDLER( sega_speech_control_w ); +WRITE8_DEVICE_HANDLER( sega_speech_data_w ); +WRITE8_DEVICE_HANDLER( sega_speech_control_w ); MACHINE_CONFIG_EXTERN( sega_universal_sound_board ); MACHINE_CONFIG_EXTERN( sega_universal_sound_board_rom ); -void sega_usb_reset(running_machine &machine, UINT8 t1_clock_mask); - -READ8_HANDLER( sega_usb_status_r ); -WRITE8_HANDLER( sega_usb_data_w ); -READ8_HANDLER( sega_usb_ram_r ); -WRITE8_HANDLER( sega_usb_ram_w ); +READ8_DEVICE_HANDLER( sega_usb_status_r ); +WRITE8_DEVICE_HANDLER( sega_usb_data_w ); +READ8_DEVICE_HANDLER( sega_usb_ram_r ); +WRITE8_DEVICE_HANDLER( sega_usb_ram_w ); diff --git a/src/mame/audio/taito_en.c b/src/mame/audio/taito_en.c index db4bea686ae..df2168b0ae3 100644 --- a/src/mame/audio/taito_en.c +++ b/src/mame/audio/taito_en.c @@ -238,10 +238,8 @@ static WRITE16_HANDLER(es5510_dsp_w) } } -static UINT16 *sound_ram; - static ADDRESS_MAP_START( f3_sound_map, AS_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x00ffff) AM_RAM AM_MIRROR(0x30000) AM_SHARE("share1") AM_BASE(&sound_ram) + AM_RANGE(0x000000, 0x00ffff) AM_RAM AM_MIRROR(0x30000) AM_SHARE("share1") AM_RANGE(0x140000, 0x140fff) AM_READWRITE(f3_68000_share_r, f3_68000_share_w) AM_RANGE(0x200000, 0x20001f) AM_DEVREADWRITE("ensoniq", es5505_r, es5505_w) AM_RANGE(0x260000, 0x2601ff) AM_READWRITE(es5510_dsp_r, es5510_dsp_w) @@ -258,6 +256,7 @@ SOUND_RESET( taito_f3_soundsystem_reset ) { /* Sound cpu program loads to 0xc00000 so we use a bank */ UINT16 *ROM = (UINT16 *)machine.region("audiocpu")->base(); + UINT16 *sound_ram = (UINT16 *)memory_get_shared(machine, "share1"); memory_set_bankptr(machine, "bank1",&ROM[0x80000]); memory_set_bankptr(machine, "bank2",&ROM[0x90000]); memory_set_bankptr(machine, "bank3",&ROM[0xa0000]); diff --git a/src/mame/audio/williams.c b/src/mame/audio/williams.c index 4d321d0bd0e..f95befbf558 100644 --- a/src/mame/audio/williams.c +++ b/src/mame/audio/williams.c @@ -47,15 +47,19 @@ STATIC GLOBALS ****************************************************************************/ -static UINT8 williams_sound_int_state; +typedef struct _williams_audio_state williams_audio_state; +struct _williams_audio_state +{ + UINT8 sound_int_state; -static UINT8 audio_talkback; -static UINT8 audio_sync; - -static device_t *sound_cpu; -static device_t *soundalt_cpu; + UINT8 audio_talkback; + UINT8 audio_sync; + device_t *sound_cpu; + device_t *soundalt_cpu; +}; +static williams_audio_state audio; /*************************************************************************** FUNCTION PROTOTYPES @@ -266,12 +270,13 @@ MACHINE_CONFIG_END void williams_cvsd_init(running_machine &machine) { + williams_audio_state *state = &audio; UINT8 *ROM; int bank; /* configure the CPU */ - sound_cpu = machine.device("cvsdcpu"); - soundalt_cpu = NULL; + state->sound_cpu = machine.device("cvsdcpu"); + state->soundalt_cpu = NULL; /* configure master CPU banks */ ROM = machine.region("cvsdcpu")->base(); @@ -291,19 +296,20 @@ void williams_cvsd_init(running_machine &machine) pia6821_ca1_w(machine.device("cvsdpia"), 1); /* register for save states */ - state_save_register_global(machine, williams_sound_int_state); - state_save_register_global(machine, audio_talkback); + state_save_register_global(machine, state->sound_int_state); + state_save_register_global(machine, state->audio_talkback); } void williams_narc_init(running_machine &machine) { + williams_audio_state *state = &audio; UINT8 *ROM; int bank; /* configure the CPU */ - sound_cpu = machine.device("narc1cpu"); - soundalt_cpu = machine.device("narc2cpu"); + state->sound_cpu = machine.device("narc1cpu"); + state->soundalt_cpu = machine.device("narc2cpu"); /* configure master CPU banks */ ROM = machine.region("narc1cpu")->base(); @@ -334,19 +340,20 @@ void williams_narc_init(running_machine &machine) memory_set_bankptr(machine, "bank8", &ROM[0x10000 + 0x4000 + 0x8000 + 0x10000 + 0x20000 * 3]); /* register for save states */ - state_save_register_global(machine, williams_sound_int_state); - state_save_register_global(machine, audio_talkback); - state_save_register_global(machine, audio_sync); + state_save_register_global(machine, state->sound_int_state); + state_save_register_global(machine, state->audio_talkback); + state_save_register_global(machine, state->audio_sync); } void williams_adpcm_init(running_machine &machine) { + williams_audio_state *state = &audio; UINT8 *ROM; /* configure the CPU */ - sound_cpu = machine.device("adpcm"); - soundalt_cpu = NULL; + state->sound_cpu = machine.device("adpcm"); + state->soundalt_cpu = NULL; /* configure banks */ ROM = machine.region("adpcm")->base(); @@ -373,18 +380,22 @@ void williams_adpcm_init(running_machine &machine) memcpy(ROM + 0x020000, ROM + 0x060000, 0x20000); /* register for save states */ - state_save_register_global(machine, williams_sound_int_state); - state_save_register_global(machine, audio_talkback); + state_save_register_global(machine, state->sound_int_state); + state_save_register_global(machine, state->audio_talkback); } static void init_audio_state(running_machine &machine) { + williams_audio_state *state = &audio; + device_t *sound_cpu = state->sound_cpu; + device_t *soundalt_cpu = state->soundalt_cpu; + /* reset the YM2151 state */ devtag_reset(machine, "ymsnd"); /* clear all the interrupts */ - williams_sound_int_state = 0; + state->sound_int_state = 0; if (sound_cpu != NULL) { device_set_input_line(sound_cpu, M6809_FIRQ_LINE, CLEAR_LINE); @@ -413,13 +424,17 @@ static void cvsd_ym2151_irq(device_t *device, int state) static WRITE_LINE_DEVICE_HANDLER( cvsd_irqa ) { - device_set_input_line(sound_cpu, M6809_FIRQ_LINE, state ? ASSERT_LINE : CLEAR_LINE); + williams_audio_state *sndstate = &audio; + + device_set_input_line(sndstate->sound_cpu, M6809_FIRQ_LINE, state ? ASSERT_LINE : CLEAR_LINE); } static WRITE_LINE_DEVICE_HANDLER( cvsd_irqb ) { - device_set_input_line(sound_cpu, INPUT_LINE_NMI, state ? ASSERT_LINE : CLEAR_LINE); + williams_audio_state *sndstate = &audio; + + device_set_input_line(sndstate->sound_cpu, INPUT_LINE_NMI, state ? ASSERT_LINE : CLEAR_LINE); } @@ -430,7 +445,9 @@ static WRITE_LINE_DEVICE_HANDLER( cvsd_irqb ) static void adpcm_ym2151_irq(device_t *device, int state) { - device_set_input_line(sound_cpu, M6809_FIRQ_LINE, state ? ASSERT_LINE : CLEAR_LINE); + williams_audio_state *sndstate = &audio; + + device_set_input_line(sndstate->sound_cpu, M6809_FIRQ_LINE, state ? ASSERT_LINE : CLEAR_LINE); } @@ -447,7 +464,9 @@ static WRITE8_HANDLER( cvsd_bank_select_w ) static WRITE8_DEVICE_HANDLER( cvsd_talkback_w ) { - audio_talkback = data; + williams_audio_state *state = &audio; + + state->audio_talkback = data; logerror("CVSD Talkback = %02X\n", data); } @@ -484,9 +503,10 @@ void williams_cvsd_data_w(running_machine &machine, int data) } -void williams_cvsd_reset_w(int state) +void williams_cvsd_reset_w(running_machine &machine, int state) { - address_space *space = sound_cpu->memory().space(AS_PROGRAM); + williams_audio_state *sndstate = &audio; + address_space *space = sndstate->sound_cpu->memory().space(AS_PROGRAM); /* going high halts the CPU */ if (state) @@ -520,42 +540,54 @@ static WRITE8_HANDLER( narc_slave_bank_select_w ) static READ8_HANDLER( narc_command_r ) { - device_set_input_line(sound_cpu, M6809_IRQ_LINE, CLEAR_LINE); - williams_sound_int_state = 0; + williams_audio_state *state = &audio; + + device_set_input_line(state->sound_cpu, M6809_IRQ_LINE, CLEAR_LINE); + state->sound_int_state = 0; return soundlatch_r(space, 0); } static WRITE8_HANDLER( narc_command2_w ) { + williams_audio_state *state = &audio; + soundlatch2_w(space, 0, data & 0xff); - device_set_input_line(soundalt_cpu, M6809_FIRQ_LINE, ASSERT_LINE); + device_set_input_line(state->soundalt_cpu, M6809_FIRQ_LINE, ASSERT_LINE); } static READ8_HANDLER( narc_command2_r ) { - device_set_input_line(soundalt_cpu, M6809_FIRQ_LINE, CLEAR_LINE); + williams_audio_state *state = &audio; + + device_set_input_line(state->soundalt_cpu, M6809_FIRQ_LINE, CLEAR_LINE); return soundlatch2_r(space, 0); } static WRITE8_HANDLER( narc_master_talkback_w ) { - audio_talkback = data; + williams_audio_state *state = &audio; + + state->audio_talkback = data; logerror("Master Talkback = %02X\n", data); } static TIMER_CALLBACK( narc_sync_clear ) { - audio_sync &= ~param; + williams_audio_state *state = &audio; + + state->audio_sync &= ~param; } static WRITE8_HANDLER( narc_master_sync_w ) { + williams_audio_state *state = &audio; + space->machine().scheduler().timer_set(attotime::from_double(TIME_OF_74LS123(180000, 0.000001)), FUNC(narc_sync_clear), 0x01); - audio_sync |= 0x01; + state->audio_sync |= 0x01; logerror("Master sync = %02X\n", data); } @@ -568,8 +600,10 @@ static WRITE8_HANDLER( narc_slave_talkback_w ) static WRITE8_HANDLER( narc_slave_sync_w ) { + williams_audio_state *state = &audio; + space->machine().scheduler().timer_set(attotime::from_double(TIME_OF_74LS123(180000, 0.000001)), FUNC(narc_sync_clear), 0x02); - audio_sync |= 0x02; + state->audio_sync |= 0x02; logerror("Slave sync = %02X\n", data); } @@ -579,8 +613,10 @@ static WRITE8_HANDLER( narc_slave_sync_w ) NARC COMMUNICATIONS ****************************************************************************/ -void williams_narc_data_w(int data) +void williams_narc_data_w(running_machine &machine, int data) { + williams_audio_state *state = &audio; + device_t *sound_cpu = state->sound_cpu; address_space *space = sound_cpu->memory().space(AS_PROGRAM); soundlatch_w(space, 0, data & 0xff); @@ -588,13 +624,17 @@ void williams_narc_data_w(int data) if (!(data & 0x200)) { device_set_input_line(sound_cpu, M6809_IRQ_LINE, ASSERT_LINE); - williams_sound_int_state = 1; + state->sound_int_state = 1; } } -void williams_narc_reset_w(int state) +void williams_narc_reset_w(running_machine &machine, int state) { + williams_audio_state *sndstate = &audio; + device_t *sound_cpu = sndstate->sound_cpu; + device_t *soundalt_cpu = sndstate->soundalt_cpu; + /* going high halts the CPU */ if (state) { @@ -614,9 +654,11 @@ void williams_narc_reset_w(int state) } -int williams_narc_talkback_r(void) +int williams_narc_talkback_r(running_machine &machine) { - return audio_talkback | (audio_sync << 8); + williams_audio_state *state = &audio; + + return state->audio_talkback | (state->audio_sync << 8); } @@ -639,12 +681,16 @@ static WRITE8_DEVICE_HANDLER( adpcm_6295_bank_select_w ) static TIMER_CALLBACK( clear_irq_state ) { - williams_sound_int_state = 0; + williams_audio_state *state = &audio; + + state->sound_int_state = 0; } static READ8_HANDLER( adpcm_command_r ) { + williams_audio_state *state = &audio; + device_t *sound_cpu = state->sound_cpu; device_set_input_line(sound_cpu, M6809_IRQ_LINE, CLEAR_LINE); /* don't clear the external IRQ state for a short while; this allows the @@ -656,7 +702,8 @@ static READ8_HANDLER( adpcm_command_r ) static WRITE8_HANDLER( adpcm_talkback_w ) { - audio_talkback = data; + williams_audio_state *state = &audio; + state->audio_talkback = data; logerror("ADPCM Talkback = %02X\n", data); } @@ -666,21 +713,26 @@ static WRITE8_HANDLER( adpcm_talkback_w ) ADPCM COMMUNICATIONS ****************************************************************************/ -void williams_adpcm_data_w(int data) +void williams_adpcm_data_w(running_machine &machine, int data) { + williams_audio_state *state = &audio; + device_t *sound_cpu = state->sound_cpu; address_space *space = sound_cpu->memory().space(AS_PROGRAM); soundlatch_w(space, 0, data & 0xff); if (!(data & 0x200)) { device_set_input_line(sound_cpu, M6809_IRQ_LINE, ASSERT_LINE); - williams_sound_int_state = 1; + state->sound_int_state = 1; space->machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(100)); } } -void williams_adpcm_reset_w(int state) +void williams_adpcm_reset_w(running_machine &machine, int state) { + williams_audio_state *sndstate = &audio; + device_t *sound_cpu = sndstate->sound_cpu; + /* going high halts the CPU */ if (state) { @@ -695,7 +747,8 @@ void williams_adpcm_reset_w(int state) } -int williams_adpcm_sound_irq_r(void) +int williams_adpcm_sound_irq_r(running_machine &machine) { - return williams_sound_int_state; + williams_audio_state *state = &audio; + return state->sound_int_state; } diff --git a/src/mame/audio/williams.h b/src/mame/audio/williams.h index 1a79bbbb7df..8166fd4927d 100644 --- a/src/mame/audio/williams.h +++ b/src/mame/audio/williams.h @@ -10,14 +10,14 @@ MACHINE_CONFIG_EXTERN( williams_narc_sound ); void williams_cvsd_init(running_machine &machine); void williams_cvsd_data_w(running_machine &machine, int data); -void williams_cvsd_reset_w(int state); +void williams_cvsd_reset_w(running_machine &machine, int state); void williams_adpcm_init(running_machine &machine); -void williams_adpcm_data_w(int data); -void williams_adpcm_reset_w(int state); -int williams_adpcm_sound_irq_r(void); +void williams_adpcm_data_w(running_machine &machine, int data); +void williams_adpcm_reset_w(running_machine &machine, int state); +int williams_adpcm_sound_irq_r(running_machine &machine); void williams_narc_init(running_machine &machine); -void williams_narc_data_w(int data); -void williams_narc_reset_w(int state); -int williams_narc_talkback_r(void); +void williams_narc_data_w(running_machine &machine, int data); +void williams_narc_reset_w(running_machine &machine, int state); +int williams_narc_talkback_r(running_machine &machine); diff --git a/src/mame/drivers/atarigt.c b/src/mame/drivers/atarigt.c index 1cc3f4e3e61..43ceb25406c 100644 --- a/src/mame/drivers/atarigt.c +++ b/src/mame/drivers/atarigt.c @@ -204,7 +204,7 @@ static WRITE32_HANDLER( latch_w ) if (ACCESSING_BITS_16_23) { -// cage_reset_w(data & 0x00100000); + //cage_reset_w(space, data & 0x00100000); coin_counter_w(space->machine(), 0, data & 0x00080000); coin_counter_w(space->machine(), 1, data & 0x00010000); } @@ -238,9 +238,9 @@ static READ32_HANDLER( sound_data_r ) UINT32 result = 0; if (ACCESSING_BITS_0_15) - result |= cage_control_r(); + result |= cage_control_r(space->machine()); if (ACCESSING_BITS_16_31) - result |= main_from_cage_r(space) << 16; + result |= cage_main_r(space) << 16; return result; } @@ -250,7 +250,7 @@ static WRITE32_HANDLER( sound_data_w ) if (ACCESSING_BITS_0_15) cage_control_w(space->machine(), data); if (ACCESSING_BITS_16_31) - main_to_cage_w(data >> 16); + cage_main_w(space, data >> 16); } diff --git a/src/mame/drivers/exidy440.c b/src/mame/drivers/exidy440.c index 4336f28e792..8b2f7b74a42 100644 --- a/src/mame/drivers/exidy440.c +++ b/src/mame/drivers/exidy440.c @@ -345,8 +345,9 @@ static READ8_HANDLER( exidy440_input_port_3_r ) static READ8_HANDLER( sound_command_ack_r ) { + exidy440_state *state = space->machine().driver_data(); /* sound command acknowledgements come on bit 3 here */ - return exidy440_sound_command_ack() ? 0xf7 : 0xff; + return exidy440_sound_command_ack(state->m_custom) ? 0xf7 : 0xff; } @@ -359,7 +360,8 @@ static READ8_HANDLER( sound_command_ack_r ) static TIMER_CALLBACK( delayed_sound_command_w ) { - exidy440_sound_command(machine, param); + exidy440_state *state = machine.driver_data(); + exidy440_sound_command(state->m_custom, param); } @@ -447,8 +449,11 @@ static WRITE8_HANDLER( topsecex_yscroll_w ) static MACHINE_START( exidy440 ) { + exidy440_state *state = machine.driver_data(); /* the EEROM lives in the uppermost 8k of the top bank */ UINT8 *rom = machine.region("maincpu")->base(); + + state->m_custom = machine.device("custom"); machine.device("nvram")->set_base(&rom[0x10000 + 15 * 0x4000 + 0x2000], 0x2000); } diff --git a/src/mame/drivers/kinst.c b/src/mame/drivers/kinst.c index 0495b59e999..54d5d9fcf0a 100644 --- a/src/mame/drivers/kinst.c +++ b/src/mame/drivers/kinst.c @@ -335,7 +335,7 @@ static READ32_HANDLER( kinst_control_r ) case 2: /* $90 -- sound return */ result = input_port_read(space->machine(), portnames[offset]); result &= ~0x0002; - if (dcs_control_r() & 0x800) + if (dcs_control_r(space->machine()) & 0x800) result |= 0x0002; break; @@ -376,12 +376,12 @@ static WRITE32_HANDLER( kinst_control_w ) break; case 1: /* $88 - sound reset */ - dcs_reset_w(~data & 0x01); + dcs_reset_w(space->machine(), ~data & 0x01); break; case 2: /* $90 - sound control */ if (!(olddata & 0x02) && (state->m_control[offset] & 0x02)) - dcs_data_w(state->m_control[3]); + dcs_data_w(space->machine(), state->m_control[3]); break; case 3: /* $98 - sound data */ diff --git a/src/mame/drivers/m72.c b/src/mame/drivers/m72.c index 4b8af49515d..6532ed46852 100644 --- a/src/mame/drivers/m72.c +++ b/src/mame/drivers/m72.c @@ -453,8 +453,8 @@ static int find_sample(int num) static INTERRUPT_GEN(fake_nmi) { - address_space *space = device->memory().space(AS_PROGRAM); - int sample = m72_sample_r(space,0); + m72_state *state = device->machine().driver_data(); + int sample = m72_sample_r(state->m_audio,0); if (sample) m72_sample_w(device->machine().device("dac"),0,sample); } @@ -462,68 +462,77 @@ static INTERRUPT_GEN(fake_nmi) static WRITE16_HANDLER( bchopper_sample_trigger_w ) { + m72_state *state = space->machine().driver_data(); static const int a[6] = { 0x0000, 0x0010, 0x2510, 0x6510, 0x8510, 0x9310 }; - if (ACCESSING_BITS_0_7 && (data & 0xff) < 6) m72_set_sample_start(a[data & 0xff]); + if (ACCESSING_BITS_0_7 && (data & 0xff) < 6) m72_set_sample_start(state->m_audio, a[data & 0xff]); } static WRITE16_HANDLER( nspirit_sample_trigger_w ) { + m72_state *state = space->machine().driver_data(); static const int a[9] = { 0x0000, 0x0020, 0x2020, 0, 0x5720, 0, 0x7b60, 0x9b60, 0xc360 }; - if (ACCESSING_BITS_0_7 && (data & 0xff) < 9) m72_set_sample_start(a[data & 0xff]); + if (ACCESSING_BITS_0_7 && (data & 0xff) < 9) m72_set_sample_start(state->m_audio, a[data & 0xff]); } static WRITE16_HANDLER( imgfight_sample_trigger_w ) { + m72_state *state = space->machine().driver_data(); static const int a[7] = { 0x0000, 0x0020, 0x44e0, 0x98a0, 0xc820, 0xf7a0, 0x108c0 }; - if (ACCESSING_BITS_0_7 && (data & 0xff) < 7) m72_set_sample_start(a[data & 0xff]); + if (ACCESSING_BITS_0_7 && (data & 0xff) < 7) m72_set_sample_start(state->m_audio, a[data & 0xff]); } static WRITE16_HANDLER( loht_sample_trigger_w ) { + m72_state *state = space->machine().driver_data(); static const int a[7] = { 0x0000, 0x0020, 0, 0x2c40, 0x4320, 0x7120, 0xb200 }; - if (ACCESSING_BITS_0_7 && (data & 0xff) < 7) m72_set_sample_start(a[data & 0xff]); + if (ACCESSING_BITS_0_7 && (data & 0xff) < 7) m72_set_sample_start(state->m_audio, a[data & 0xff]); } static WRITE16_HANDLER( xmultiplm72_sample_trigger_w ) { + m72_state *state = space->machine().driver_data(); static const int a[3] = { 0x0000, 0x0020, 0x1a40 }; - if (ACCESSING_BITS_0_7 && (data & 0xff) < 3) m72_set_sample_start(a[data & 0xff]); + if (ACCESSING_BITS_0_7 && (data & 0xff) < 3) m72_set_sample_start(state->m_audio, a[data & 0xff]); } static WRITE16_HANDLER( dbreedm72_sample_trigger_w ) { + m72_state *state = space->machine().driver_data(); static const int a[9] = { 0x00000, 0x00020, 0x02c40, 0x08160, 0x0c8c0, 0x0ffe0, 0x13000, 0x15820, 0x15f40 }; - if (ACCESSING_BITS_0_7 && (data & 0xff) < 9) m72_set_sample_start(a[data & 0xff]); + if (ACCESSING_BITS_0_7 && (data & 0xff) < 9) m72_set_sample_start(state->m_audio, a[data & 0xff]); } static WRITE16_HANDLER( airduel_sample_trigger_w ) { + m72_state *state = space->machine().driver_data(); static const int a[16] = { 0x00000, 0x00020, 0x03ec0, 0x05640, 0x06dc0, 0x083a0, 0x0c000, 0x0eb60, 0x112e0, 0x13dc0, 0x16520, 0x16d60, 0x18ae0, 0x1a5a0, 0x1bf00, 0x1c340 }; - if (ACCESSING_BITS_0_7 && (data & 0xff) < 16) m72_set_sample_start(a[data & 0xff]); + if (ACCESSING_BITS_0_7 && (data & 0xff) < 16) m72_set_sample_start(state->m_audio, a[data & 0xff]); } static WRITE16_HANDLER( dkgenm72_sample_trigger_w ) { + m72_state *state = space->machine().driver_data(); static const int a[28] = { 0x00000, 0x00020, 0x01800, 0x02da0, 0x03be0, 0x05ae0, 0x06100, 0x06de0, 0x07260, 0x07a60, 0x08720, 0x0a5c0, 0x0c3c0, 0x0c7a0, 0x0e140, 0x0fb00, 0x10fa0, 0x10fc0, 0x10fe0, 0x11f40, 0x12b20, 0x130a0, 0x13c60, 0x14740, 0x153c0, 0x197e0, 0x1af40, 0x1c080 }; - if (ACCESSING_BITS_0_7 && (data & 0xff) < 28) m72_set_sample_start(a[data & 0xff]); + if (ACCESSING_BITS_0_7 && (data & 0xff) < 28) m72_set_sample_start(state->m_audio, a[data & 0xff]); } static WRITE16_HANDLER( gallop_sample_trigger_w ) { + m72_state *state = space->machine().driver_data(); static const int a[31] = { 0x00000, 0x00020, 0x00040, 0x01360, 0x02580, 0x04f20, 0x06240, 0x076e0, 0x08660, 0x092a0, 0x09ba0, 0x0a560, 0x0cee0, 0x0de20, 0x0e620, 0x0f1c0, 0x10200, 0x10220, 0x10240, 0x11380, 0x12760, 0x12780, 0x127a0, 0x13c40, 0x140a0, 0x16760, 0x17e40, 0x18ee0, 0x19f60, 0x1bbc0, 0x1cee0 }; - if (ACCESSING_BITS_0_7 && (data & 0xff) < 31) m72_set_sample_start(a[data & 0xff]); + if (ACCESSING_BITS_0_7 && (data & 0xff) < 31) m72_set_sample_start(state->m_audio, a[data & 0xff]); } @@ -998,7 +1007,7 @@ static ADDRESS_MAP_START( m72_portmap, AS_IO, 16 ) AM_RANGE(0x00, 0x01) AM_READ_PORT("IN0") AM_RANGE(0x02, 0x03) AM_READ_PORT("IN1") AM_RANGE(0x04, 0x05) AM_READ_PORT("DSW") - AM_RANGE(0x00, 0x01) AM_WRITE(m72_sound_command_w) + AM_RANGE(0x00, 0x01) AM_DEVWRITE("m72", m72_sound_command_w) AM_RANGE(0x02, 0x03) AM_WRITE(m72_port02_w) /* coin counters, reset sound cpu, other stuff? */ AM_RANGE(0x04, 0x05) AM_WRITE(m72_dmaon_w) AM_RANGE(0x06, 0x07) AM_WRITE(m72_irq_line_w) @@ -1014,7 +1023,7 @@ static ADDRESS_MAP_START( rtype2_portmap, AS_IO, 16 ) AM_RANGE(0x00, 0x01) AM_READ_PORT("IN0") AM_RANGE(0x02, 0x03) AM_READ_PORT("IN1") AM_RANGE(0x04, 0x05) AM_READ_PORT("DSW") - AM_RANGE(0x00, 0x01) AM_WRITE(m72_sound_command_w) + AM_RANGE(0x00, 0x01) AM_DEVWRITE("m72", m72_sound_command_w) AM_RANGE(0x02, 0x03) AM_WRITE(rtype2_port02_w) AM_RANGE(0x40, 0x43) AM_WRITENOP /* Interrupt controller, only written to at bootup */ AM_RANGE(0x80, 0x81) AM_WRITE(m72_scrolly1_w) @@ -1027,7 +1036,7 @@ static ADDRESS_MAP_START( poundfor_portmap, AS_IO, 16 ) AM_RANGE(0x02, 0x03) AM_READ_PORT("IN1") AM_RANGE(0x04, 0x05) AM_READ_PORT("DSW") AM_RANGE(0x08, 0x0f) AM_READ(poundfor_trackball_r) - AM_RANGE(0x00, 0x01) AM_WRITE(m72_sound_command_w) + AM_RANGE(0x00, 0x01) AM_DEVWRITE("m72", m72_sound_command_w) AM_RANGE(0x02, 0x03) AM_WRITE(rtype2_port02_w) AM_RANGE(0x40, 0x43) AM_WRITENOP /* Interrupt controller, only written to at bootup */ AM_RANGE(0x80, 0x81) AM_WRITE(m72_scrolly1_w) @@ -1040,7 +1049,7 @@ static ADDRESS_MAP_START( majtitle_portmap, AS_IO, 16 ) AM_RANGE(0x00, 0x01) AM_READ_PORT("IN0") AM_RANGE(0x02, 0x03) AM_READ_PORT("IN1") AM_RANGE(0x04, 0x05) AM_READ_PORT("DSW") - AM_RANGE(0x00, 0x01) AM_WRITE(m72_sound_command_w) + AM_RANGE(0x00, 0x01) AM_DEVWRITE("m72", m72_sound_command_w) AM_RANGE(0x02, 0x03) AM_WRITE(rtype2_port02_w) AM_RANGE(0x40, 0x43) AM_WRITENOP /* Interrupt controller, only written to at bootup */ AM_RANGE(0x80, 0x81) AM_WRITE(m72_scrolly1_w) @@ -1054,7 +1063,7 @@ static ADDRESS_MAP_START( hharry_portmap, AS_IO, 16 ) AM_RANGE(0x00, 0x01) AM_READ_PORT("IN0") AM_RANGE(0x02, 0x03) AM_READ_PORT("IN1") AM_RANGE(0x04, 0x05) AM_READ_PORT("DSW") - AM_RANGE(0x00, 0x01) AM_WRITE(m72_sound_command_w) + AM_RANGE(0x00, 0x01) AM_DEVWRITE("m72", m72_sound_command_w) AM_RANGE(0x02, 0x03) AM_WRITE(rtype2_port02_w) /* coin counters, reset sound cpu, other stuff? */ AM_RANGE(0x04, 0x05) AM_WRITE(m72_dmaon_w) AM_RANGE(0x06, 0x07) AM_WRITE(m72_irq_line_w) @@ -1069,7 +1078,7 @@ static ADDRESS_MAP_START( kengo_portmap, AS_IO, 16 ) AM_RANGE(0x00, 0x01) AM_READ_PORT("IN0") AM_RANGE(0x02, 0x03) AM_READ_PORT("IN1") AM_RANGE(0x04, 0x05) AM_READ_PORT("DSW") - AM_RANGE(0x00, 0x01) AM_WRITE(m72_sound_command_w) + AM_RANGE(0x00, 0x01) AM_DEVWRITE("m72", m72_sound_command_w) AM_RANGE(0x02, 0x03) AM_WRITE(rtype2_port02_w) AM_RANGE(0x80, 0x81) AM_WRITE(m72_scrolly1_w) AM_RANGE(0x82, 0x83) AM_WRITE(m72_scrollx1_w) @@ -1092,36 +1101,36 @@ static ADDRESS_MAP_START( rtype_sound_portmap, AS_IO, 8 ) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x00, 0x01) AM_DEVREADWRITE("ymsnd", ym2151_r, ym2151_w) AM_RANGE(0x02, 0x02) AM_READ(soundlatch_r) - AM_RANGE(0x06, 0x06) AM_WRITE(m72_sound_irq_ack_w) - AM_RANGE(0x84, 0x84) AM_READ(m72_sample_r) + AM_RANGE(0x06, 0x06) AM_DEVWRITE("m72", m72_sound_irq_ack_w) + AM_RANGE(0x84, 0x84) AM_DEVREAD("m72", m72_sample_r) ADDRESS_MAP_END static ADDRESS_MAP_START( sound_portmap, AS_IO, 8 ) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x00, 0x01) AM_DEVREADWRITE("ymsnd", ym2151_r, ym2151_w) AM_RANGE(0x02, 0x02) AM_READ(soundlatch_r) - AM_RANGE(0x06, 0x06) AM_WRITE(m72_sound_irq_ack_w) + AM_RANGE(0x06, 0x06) AM_DEVWRITE("m72", m72_sound_irq_ack_w) AM_RANGE(0x82, 0x82) AM_DEVWRITE("dac", m72_sample_w) - AM_RANGE(0x84, 0x84) AM_READ(m72_sample_r) + AM_RANGE(0x84, 0x84) AM_DEVREAD("m72", m72_sample_r) ADDRESS_MAP_END static ADDRESS_MAP_START( rtype2_sound_portmap, AS_IO, 8 ) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x00, 0x01) AM_DEVREADWRITE("ymsnd", ym2151_r, ym2151_w) AM_RANGE(0x80, 0x80) AM_READ(soundlatch_r) - AM_RANGE(0x80, 0x81) AM_WRITE(rtype2_sample_addr_w) + AM_RANGE(0x80, 0x81) AM_DEVWRITE("m72", rtype2_sample_addr_w) AM_RANGE(0x82, 0x82) AM_DEVWRITE("dac", m72_sample_w) - AM_RANGE(0x83, 0x83) AM_WRITE(m72_sound_irq_ack_w) - AM_RANGE(0x84, 0x84) AM_READ(m72_sample_r) + AM_RANGE(0x83, 0x83) AM_DEVWRITE("m72", m72_sound_irq_ack_w) + AM_RANGE(0x84, 0x84) AM_DEVREAD("m72", m72_sample_r) // AM_RANGE(0x87, 0x87) AM_WRITENOP /* ??? */ ADDRESS_MAP_END static ADDRESS_MAP_START( poundfor_sound_portmap, AS_IO, 8 ) ADDRESS_MAP_GLOBAL_MASK(0xff) - AM_RANGE(0x10, 0x13) AM_WRITE(poundfor_sample_addr_w) + AM_RANGE(0x10, 0x13) AM_DEVWRITE("m72", poundfor_sample_addr_w) AM_RANGE(0x40, 0x41) AM_DEVREADWRITE("ymsnd", ym2151_r, ym2151_w) AM_RANGE(0x42, 0x42) AM_READ(soundlatch_r) - AM_RANGE(0x42, 0x42) AM_WRITE(m72_sound_irq_ack_w) + AM_RANGE(0x42, 0x42) AM_DEVWRITE("m72", m72_sound_irq_ack_w) ADDRESS_MAP_END static ADDRESS_MAP_START( mcu_io_map, AS_IO, 8 ) @@ -1859,9 +1868,6 @@ static MACHINE_CONFIG_START( m72_base, m72_state ) MCFG_MACHINE_START(m72) MCFG_MACHINE_RESET(m72) - MCFG_SOUND_START(m72) - MCFG_SOUND_RESET(m72) - /* video hardware */ MCFG_GFXDECODE(m72) MCFG_PALETTE_LENGTH(512) @@ -1876,6 +1882,8 @@ static MACHINE_CONFIG_START( m72_base, m72_state ) /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") + MCFG_SOUND_ADD("m72", M72, 0); + MCFG_SOUND_ADD("ymsnd", YM2151, SOUND_CLOCK) MCFG_SOUND_CONFIG(ym2151_config) MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) @@ -1916,9 +1924,6 @@ static MACHINE_CONFIG_START( rtype, m72_state ) MCFG_MACHINE_START(m72) MCFG_MACHINE_RESET(m72) - MCFG_SOUND_START(m72) - MCFG_SOUND_RESET(m72) - /* video hardware */ MCFG_GFXDECODE(m72) MCFG_PALETTE_LENGTH(512) @@ -1933,6 +1938,8 @@ static MACHINE_CONFIG_START( rtype, m72_state ) /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") + MCFG_SOUND_ADD("m72", M72, 0); + MCFG_SOUND_ADD("ymsnd", YM2151, SOUND_CLOCK) MCFG_SOUND_CONFIG(ym2151_config) MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) @@ -1955,9 +1962,6 @@ static MACHINE_CONFIG_START( xmultipl, m72_state ) MCFG_MACHINE_START(m72) MCFG_MACHINE_RESET(xmultipl) - MCFG_SOUND_START(m72) - MCFG_SOUND_RESET(m72) - /* video hardware */ MCFG_GFXDECODE(m72) MCFG_PALETTE_LENGTH(512) @@ -1972,6 +1976,8 @@ static MACHINE_CONFIG_START( xmultipl, m72_state ) /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") + MCFG_SOUND_ADD("m72", M72, 0); + MCFG_SOUND_ADD("ymsnd", YM2151, SOUND_CLOCK) MCFG_SOUND_CONFIG(ym2151_config) MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) @@ -1998,9 +2004,6 @@ static MACHINE_CONFIG_START( xmultiplm72, m72_state ) MCFG_MACHINE_START(m72) MCFG_MACHINE_RESET(xmultipl) - MCFG_SOUND_START(m72) - MCFG_SOUND_RESET(m72) - /* video hardware */ MCFG_GFXDECODE(m72) MCFG_PALETTE_LENGTH(512) @@ -2015,6 +2018,8 @@ static MACHINE_CONFIG_START( xmultiplm72, m72_state ) /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") + MCFG_SOUND_ADD("m72", M72, 0); + MCFG_SOUND_ADD("ymsnd", YM2151, SOUND_CLOCK) MCFG_SOUND_CONFIG(ym2151_config) MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) @@ -2041,9 +2046,6 @@ static MACHINE_CONFIG_START( dbreed, m72_state ) MCFG_MACHINE_START(m72) MCFG_MACHINE_RESET(xmultipl) - MCFG_SOUND_START(m72) - MCFG_SOUND_RESET(m72) - /* video hardware */ MCFG_GFXDECODE(rtype2) MCFG_PALETTE_LENGTH(512) @@ -2058,6 +2060,8 @@ static MACHINE_CONFIG_START( dbreed, m72_state ) /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") + MCFG_SOUND_ADD("m72", M72, 0); + MCFG_SOUND_ADD("ymsnd", YM2151, SOUND_CLOCK) MCFG_SOUND_CONFIG(ym2151_config) MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) @@ -2084,9 +2088,6 @@ static MACHINE_CONFIG_START( dbreedm72, m72_state ) MCFG_MACHINE_START(m72) MCFG_MACHINE_RESET(xmultipl) - MCFG_SOUND_START(m72) - MCFG_SOUND_RESET(m72) - /* video hardware */ MCFG_GFXDECODE(m72) MCFG_PALETTE_LENGTH(512) @@ -2101,6 +2102,8 @@ static MACHINE_CONFIG_START( dbreedm72, m72_state ) /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") + MCFG_SOUND_ADD("m72", M72, 0); + MCFG_SOUND_ADD("ymsnd", YM2151, SOUND_CLOCK) MCFG_SOUND_CONFIG(ym2151_config) MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) @@ -2127,9 +2130,6 @@ static MACHINE_CONFIG_START( rtype2, m72_state ) MCFG_MACHINE_START(m72) MCFG_MACHINE_RESET(m72) - MCFG_SOUND_START(m72) - MCFG_SOUND_RESET(m72) - /* video hardware */ MCFG_GFXDECODE(rtype2) MCFG_PALETTE_LENGTH(512) @@ -2144,6 +2144,8 @@ static MACHINE_CONFIG_START( rtype2, m72_state ) /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") + MCFG_SOUND_ADD("m72", M72, 0); + MCFG_SOUND_ADD("ymsnd", YM2151, SOUND_CLOCK) MCFG_SOUND_CONFIG(ym2151_config) MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) @@ -2170,9 +2172,6 @@ static MACHINE_CONFIG_START( majtitle, m72_state ) MCFG_MACHINE_START(m72) MCFG_MACHINE_RESET(m72) - MCFG_SOUND_START(m72) - MCFG_SOUND_RESET(m72) - /* video hardware */ MCFG_GFXDECODE(majtitle) MCFG_PALETTE_LENGTH(512) @@ -2187,6 +2186,8 @@ static MACHINE_CONFIG_START( majtitle, m72_state ) /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") + MCFG_SOUND_ADD("m72", M72, 0); + MCFG_SOUND_ADD("ymsnd", YM2151, SOUND_CLOCK) MCFG_SOUND_CONFIG(ym2151_config) MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) @@ -2213,9 +2214,6 @@ static MACHINE_CONFIG_START( hharry, m72_state ) MCFG_MACHINE_START(m72) MCFG_MACHINE_RESET(xmultipl) - MCFG_SOUND_START(m72) - MCFG_SOUND_RESET(m72) - /* video hardware */ MCFG_GFXDECODE(rtype2) MCFG_PALETTE_LENGTH(512) @@ -2230,6 +2228,8 @@ static MACHINE_CONFIG_START( hharry, m72_state ) /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") + MCFG_SOUND_ADD("m72", M72, 0); + MCFG_SOUND_ADD("ymsnd", YM2151, SOUND_CLOCK) MCFG_SOUND_CONFIG(ym2151_config) MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) @@ -2256,9 +2256,6 @@ static MACHINE_CONFIG_START( hharryu, m72_state ) MCFG_MACHINE_START(m72) MCFG_MACHINE_RESET(xmultipl) - MCFG_SOUND_START(m72) - MCFG_SOUND_RESET(m72) - /* video hardware */ MCFG_GFXDECODE(rtype2) MCFG_PALETTE_LENGTH(512) @@ -2273,6 +2270,8 @@ static MACHINE_CONFIG_START( hharryu, m72_state ) /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") + MCFG_SOUND_ADD("m72", M72, 0); + MCFG_SOUND_ADD("ymsnd", YM2151, SOUND_CLOCK) MCFG_SOUND_CONFIG(ym2151_config) MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) @@ -2299,9 +2298,6 @@ static MACHINE_CONFIG_START( dkgenm72, m72_state ) MCFG_MACHINE_START(m72) MCFG_MACHINE_RESET(xmultipl) - MCFG_SOUND_START(m72) - MCFG_SOUND_RESET(m72) - /* video hardware */ MCFG_GFXDECODE(m72) MCFG_PALETTE_LENGTH(512) @@ -2316,6 +2312,8 @@ static MACHINE_CONFIG_START( dkgenm72, m72_state ) /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") + MCFG_SOUND_ADD("m72", M72, 0); + MCFG_SOUND_ADD("ymsnd", YM2151, SOUND_CLOCK) MCFG_SOUND_CONFIG(ym2151_config) MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) @@ -2342,9 +2340,6 @@ static MACHINE_CONFIG_START( poundfor, m72_state ) MCFG_MACHINE_START(m72) MCFG_MACHINE_RESET(m72) - MCFG_SOUND_START(m72) - MCFG_SOUND_RESET(m72) - /* video hardware */ MCFG_GFXDECODE(rtype2) MCFG_PALETTE_LENGTH(512) @@ -2359,6 +2354,8 @@ static MACHINE_CONFIG_START( poundfor, m72_state ) /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") + MCFG_SOUND_ADD("m72", M72, 0); + MCFG_SOUND_ADD("ymsnd", YM2151, SOUND_CLOCK) MCFG_SOUND_CONFIG(ym2151_config) MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) @@ -2385,9 +2382,6 @@ static MACHINE_CONFIG_START( cosmccop, m72_state ) MCFG_MACHINE_START(kengo) MCFG_MACHINE_RESET(kengo) - MCFG_SOUND_START(m72) - MCFG_SOUND_RESET(m72) - /* video hardware */ MCFG_GFXDECODE(rtype2) MCFG_PALETTE_LENGTH(512) @@ -2402,6 +2396,8 @@ static MACHINE_CONFIG_START( cosmccop, m72_state ) /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") + MCFG_SOUND_ADD("m72", M72, 0); + MCFG_SOUND_ADD("ymsnd", YM2151, SOUND_CLOCK) MCFG_SOUND_CONFIG(ym2151_config) MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) diff --git a/src/mame/drivers/m90.c b/src/mame/drivers/m90.c index 29b6de244e4..6ff58da5a5b 100644 --- a/src/mame/drivers/m90.c +++ b/src/mame/drivers/m90.c @@ -109,7 +109,7 @@ static ADDRESS_MAP_START( bomblord_main_cpu_map, AS_PROGRAM, 16 ) ADDRESS_MAP_END static ADDRESS_MAP_START( m90_main_cpu_io_map, AS_IO, 16 ) - AM_RANGE(0x00, 0x01) AM_WRITE(m72_sound_command_w) + AM_RANGE(0x00, 0x01) AM_DEVWRITE("m72", m72_sound_command_w) AM_RANGE(0x00, 0x01) AM_READ_PORT("P1_P2") AM_RANGE(0x02, 0x03) AM_WRITE(m90_coincounter_w) AM_RANGE(0x02, 0x03) AM_READ_PORT("SYSTEM") @@ -120,7 +120,7 @@ static ADDRESS_MAP_START( m90_main_cpu_io_map, AS_IO, 16 ) ADDRESS_MAP_END static ADDRESS_MAP_START( dynablsb_cpu_io_map, AS_IO, 16 ) - AM_RANGE(0x00, 0x01) AM_WRITE(m72_sound_command_w) + AM_RANGE(0x00, 0x01) AM_DEVWRITE("m72", m72_sound_command_w) AM_RANGE(0x00, 0x01) AM_READ_PORT("P1_P2") AM_RANGE(0x02, 0x03) AM_WRITE(m90_coincounter_w) AM_RANGE(0x02, 0x03) AM_READ_PORT("SYSTEM") @@ -142,19 +142,19 @@ static ADDRESS_MAP_START( m90_sound_cpu_io_map, AS_IO, 8 ) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x00, 0x01) AM_DEVREADWRITE("ymsnd", ym2151_r, ym2151_w) AM_RANGE(0x80, 0x80) AM_READ(soundlatch_r) - AM_RANGE(0x80, 0x81) AM_WRITE(rtype2_sample_addr_w) - AM_RANGE(0x82, 0x82) AM_DEVWRITE("dac", m72_sample_w) - AM_RANGE(0x83, 0x83) AM_WRITE(m72_sound_irq_ack_w) - AM_RANGE(0x84, 0x84) AM_READ(m72_sample_r) + AM_RANGE(0x80, 0x81) AM_DEVWRITE("m72", rtype2_sample_addr_w) + AM_RANGE(0x82, 0x82) AM_DEVWRITE("m72", m72_sample_w) + AM_RANGE(0x83, 0x83) AM_DEVWRITE("m72", m72_sound_irq_ack_w) + AM_RANGE(0x84, 0x84) AM_DEVREAD("m72", m72_sample_r) ADDRESS_MAP_END static ADDRESS_MAP_START( bbmanw_sound_io_map, AS_IO, 8 ) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x40, 0x41) AM_DEVREADWRITE("ymsnd", ym2151_r, ym2151_w) - AM_RANGE(0x42, 0x42) AM_READWRITE(soundlatch_r, m72_sound_irq_ack_w) + AM_RANGE(0x42, 0x42) AM_READ(soundlatch_r) AM_DEVWRITE("m72", m72_sound_irq_ack_w) // AM_RANGE(0x40, 0x41) AM_WRITE(rtype2_sample_addr_w) -// AM_RANGE(0x41, 0x41) AM_READ(m72_sample_r) -// AM_RANGE(0x42, 0x42) AM_DEVWRITE("dac", m72_sample_w) +// AM_RANGE(0x41, 0x41) AM_DEVREAD("m72", m72_sample_r) +// AM_RANGE(0x42, 0x42) AM_DEVWRITE("m72", m72_sample_w) ADDRESS_MAP_END /*****************************************************************************/ @@ -709,9 +709,6 @@ static MACHINE_CONFIG_START( m90, m90_state ) MCFG_CPU_VBLANK_INT_HACK(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */ /* IRQs are generated by main Z80 and YM2151 */ - MCFG_SOUND_START(m72) - MCFG_SOUND_RESET(m72) - /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -729,6 +726,8 @@ static MACHINE_CONFIG_START( m90, m90_state ) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") + MCFG_SOUND_ADD("m72", M72, 0) + MCFG_SOUND_ADD("ymsnd", YM2151, XTAL_3_579545MHz) /* verified on pcb */ MCFG_SOUND_CONFIG(ym2151_config) MCFG_SOUND_ROUTE(0, "mono", 0.15) diff --git a/src/mame/drivers/mcr68.c b/src/mame/drivers/mcr68.c index abb73830916..21a3fb32d9f 100644 --- a/src/mame/drivers/mcr68.c +++ b/src/mame/drivers/mcr68.c @@ -210,7 +210,7 @@ static WRITE16_HANDLER( archrivl_control_w ) { mcr68_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_control_word); - williams_cvsd_reset_w(~state->m_control_word & 0x0400); + williams_cvsd_reset_w(space->machine(), ~state->m_control_word & 0x0400); williams_cvsd_data_w(space->machine(), state->m_control_word & 0x3ff); } diff --git a/src/mame/drivers/metalmx.c b/src/mame/drivers/metalmx.c index 9cfcb4a70ad..b235d567a3d 100644 --- a/src/mame/drivers/metalmx.c +++ b/src/mame/drivers/metalmx.c @@ -351,9 +351,9 @@ static READ32_HANDLER( sound_data_r ) UINT32 result = 0; if (ACCESSING_BITS_0_15) - result |= cage_control_r(); + result |= cage_control_r(space->machine()); if (ACCESSING_BITS_16_31) - result |= main_from_cage_r(space) << 16; + result |= cage_main_r(space) << 16; return result; } @@ -362,7 +362,7 @@ static WRITE32_HANDLER( sound_data_w ) if (ACCESSING_BITS_0_15) cage_control_w(space->machine(), data); if (ACCESSING_BITS_16_31) - main_to_cage_w(data >> 16); + cage_main_w(space, data >> 16); } static void cage_irq_callback(running_machine &machine, int reason) diff --git a/src/mame/drivers/midvunit.c b/src/mame/drivers/midvunit.c index d927d3e28a4..f4ab27930d8 100644 --- a/src/mame/drivers/midvunit.c +++ b/src/mame/drivers/midvunit.c @@ -53,8 +53,8 @@ static MACHINE_START( midvunit ) static MACHINE_RESET( midvunit ) { midvunit_state *state = machine.driver_data(); - dcs_reset_w(1); - dcs_reset_w(0); + dcs_reset_w(machine, 1); + dcs_reset_w(machine, 0); memcpy(state->m_ram_base, machine.region("user1")->base(), 0x20000*4); machine.device("maincpu")->reset(); @@ -67,8 +67,8 @@ static MACHINE_RESET( midvunit ) static MACHINE_RESET( midvplus ) { midvunit_state *state = machine.driver_data(); - dcs_reset_w(1); - dcs_reset_w(0); + dcs_reset_w(machine, 1); + dcs_reset_w(machine, 0); memcpy(state->m_ram_base, machine.region("user1")->base(), 0x20000*4); machine.device("maincpu")->reset(); @@ -203,7 +203,7 @@ static WRITE32_HANDLER( midvunit_control_w ) watchdog_reset_w(space, 0, 0); /* bit 1 is the DCS sound reset */ - dcs_reset_w((~state->m_control_data >> 1) & 1); + dcs_reset_w(space->machine(), (~state->m_control_data >> 1) & 1); /* log anything unusual */ if ((olddata ^ state->m_control_data) & ~0x00e8) @@ -218,7 +218,7 @@ static WRITE32_HANDLER( crusnwld_control_w ) COMBINE_DATA(&state->m_control_data); /* bit 11 is the DCS sound reset */ - dcs_reset_w((~state->m_control_data >> 11) & 1); + dcs_reset_w(space->machine(), (~state->m_control_data >> 11) & 1); /* bit 9 is the watchdog */ if ((olddata ^ state->m_control_data) & 0x0200) @@ -235,7 +235,7 @@ static WRITE32_HANDLER( crusnwld_control_w ) static WRITE32_HANDLER( midvunit_sound_w ) { logerror("Sound W = %02X\n", data); - dcs_data_w(data & 0xff); + dcs_data_w(space->machine(), data & 0xff); } diff --git a/src/mame/drivers/midyunit.c b/src/mame/drivers/midyunit.c index e05cbb54830..e2ae740ccaf 100644 --- a/src/mame/drivers/midyunit.c +++ b/src/mame/drivers/midyunit.c @@ -152,19 +152,19 @@ static WRITE8_DEVICE_HANDLER( yawdim_oki_bank_w ) static CUSTOM_INPUT( narc_talkback_strobe_r ) { - return (williams_narc_talkback_r() >> 8) & 1; + return (williams_narc_talkback_r(field->port->machine()) >> 8) & 1; } static CUSTOM_INPUT( narc_talkback_data_r ) { - return williams_narc_talkback_r() & 0xff; + return williams_narc_talkback_r(field->port->machine()) & 0xff; } static CUSTOM_INPUT( adpcm_irq_state_r ) { - return williams_adpcm_sound_irq_r() & 1; + return williams_adpcm_sound_irq_r(field->port->machine()) & 1; } diff --git a/src/mame/drivers/seattle.c b/src/mame/drivers/seattle.c index a1d76435900..0a26d13d7dd 100644 --- a/src/mame/drivers/seattle.c +++ b/src/mame/drivers/seattle.c @@ -555,8 +555,8 @@ static MACHINE_RESET( seattle ) /* reset either the DCS2 board or the CAGE board */ if (machine.device("dcs2") != NULL) { - dcs_reset_w(1); - dcs_reset_w(0); + dcs_reset_w(machine, 1); + dcs_reset_w(machine, 0); } else if (machine.device("cage") != NULL) { diff --git a/src/mame/drivers/segag80r.c b/src/mame/drivers/segag80r.c index 88a22224d38..368f6e9d3a1 100644 --- a/src/mame/drivers/segag80r.c +++ b/src/mame/drivers/segag80r.c @@ -160,12 +160,6 @@ static MACHINE_START( g80r ) } -static MACHINE_RESET( pignewt ) -{ - sega_usb_reset(machine, 0x10); -} - - /************************************* * @@ -196,7 +190,7 @@ static WRITE8_HANDLER( vidram_w ) { segag80r_videoram_w(space, decrypt_ static WRITE8_HANDLER( monsterb_vidram_w ) { monsterb_videoram_w(space, decrypt_offset(space, offset), data); } static WRITE8_HANDLER( pignewt_vidram_w ) { pignewt_videoram_w(space, decrypt_offset(space, offset), data); } static WRITE8_HANDLER( sindbadm_vidram_w ) { sindbadm_videoram_w(space, decrypt_offset(space, offset), data); } -static WRITE8_HANDLER( usb_ram_w ) { sega_usb_ram_w(space, decrypt_offset(space, offset), data); } +static WRITE8_DEVICE_HANDLER( usb_ram_w ) { sega_usb_ram_w(device, decrypt_offset(device->machine().device("maincpu")->memory().space(AS_PROGRAM), offset), data); } @@ -916,7 +910,6 @@ static MACHINE_CONFIG_DERIVED( pignewt, g80r_base ) MCFG_PALETTE_LENGTH(64+64) /* sound boards */ - MCFG_MACHINE_RESET(pignewt) MCFG_FRAGMENT_ADD(sega_universal_sound_board) MACHINE_CONFIG_END @@ -1439,6 +1432,8 @@ static void monsterb_expand_gfx(running_machine &machine, const char *region) static DRIVER_INIT( astrob ) { segag80r_state *state = machine.driver_data(); + device_t *speech = machine.device("segaspeech"); + address_space *iospace = machine.device("maincpu")->memory().space(AS_IO); /* configure the 315-0062 security chip */ state->m_decrypt = segag80_security(62); @@ -1447,11 +1442,11 @@ static DRIVER_INIT( astrob ) state->m_background_pcb = G80_BACKGROUND_NONE; /* install speech board */ - machine.device("maincpu")->memory().space(AS_IO)->install_legacy_write_handler(0x38, 0x38, FUNC(sega_speech_data_w)); - machine.device("maincpu")->memory().space(AS_IO)->install_legacy_write_handler(0x3b, 0x3b, FUNC(sega_speech_control_w)); + iospace->install_legacy_write_handler(*speech, 0x38, 0x38, FUNC(sega_speech_data_w)); + iospace->install_legacy_write_handler(*speech, 0x3b, 0x3b, FUNC(sega_speech_control_w)); /* install Astro Blaster sound board */ - machine.device("maincpu")->memory().space(AS_IO)->install_legacy_write_handler(0x3e, 0x3f, FUNC(astrob_sound_w)); + iospace->install_legacy_write_handler(0x3e, 0x3f, FUNC(astrob_sound_w)); } @@ -1470,6 +1465,7 @@ static DRIVER_INIT( 005 ) static DRIVER_INIT( spaceod ) { segag80r_state *state = machine.driver_data(); + address_space *iospace = machine.device("maincpu")->memory().space(AS_IO); /* configure the 315-0063 security chip */ state->m_decrypt = segag80_security(63); @@ -1478,20 +1474,22 @@ static DRIVER_INIT( spaceod ) state->m_background_pcb = G80_BACKGROUND_SPACEOD; /* configure ports for the background board */ - machine.device("maincpu")->memory().space(AS_IO)->install_legacy_readwrite_handler(0x08, 0x0f, FUNC(spaceod_back_port_r), FUNC(spaceod_back_port_w)); + iospace->install_legacy_readwrite_handler(0x08, 0x0f, FUNC(spaceod_back_port_r), FUNC(spaceod_back_port_w)); /* install Space Odyssey sound board */ - machine.device("maincpu")->memory().space(AS_IO)->install_legacy_write_handler(0x0e, 0x0f, FUNC(spaceod_sound_w)); + iospace->install_legacy_write_handler(0x0e, 0x0f, FUNC(spaceod_sound_w)); /* install our wacky mangled ports */ - machine.device("maincpu")->memory().space(AS_IO)->install_legacy_read_handler(0xf8, 0xfb, FUNC(spaceod_mangled_ports_r)); - machine.device("maincpu")->memory().space(AS_IO)->install_legacy_read_handler(0xfc, 0xfc, FUNC(spaceod_port_fc_r)); + iospace->install_legacy_read_handler(0xf8, 0xfb, FUNC(spaceod_mangled_ports_r)); + iospace->install_legacy_read_handler(0xfc, 0xfc, FUNC(spaceod_port_fc_r)); } static DRIVER_INIT( monsterb ) { segag80r_state *state = machine.driver_data(); + address_space *iospace = machine.device("maincpu")->memory().space(AS_IO); + address_space *pgmspace = machine.device("maincpu")->memory().space(AS_PROGRAM); /* configure the 315-0082 security chip */ state->m_decrypt = segag80_security(82); @@ -1501,14 +1499,16 @@ static DRIVER_INIT( monsterb ) monsterb_expand_gfx(machine, "gfx1"); /* install background board handlers */ - machine.device("maincpu")->memory().space(AS_IO)->install_legacy_write_handler(0xb8, 0xbd, FUNC(monsterb_back_port_w)); - machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_write_handler(0xe000, 0xffff, FUNC(monsterb_vidram_w)); + iospace->install_legacy_write_handler(0xb8, 0xbd, FUNC(monsterb_back_port_w)); + pgmspace->install_legacy_write_handler(0xe000, 0xffff, FUNC(monsterb_vidram_w)); } static DRIVER_INIT( monster2 ) { segag80r_state *state = machine.driver_data(); + address_space *iospace = machine.device("maincpu")->memory().space(AS_IO); + address_space *pgmspace = machine.device("maincpu")->memory().space(AS_PROGRAM); /* configure the 315-5006 security chip */ spatter_decode(machine, "maincpu"); @@ -1519,15 +1519,18 @@ static DRIVER_INIT( monster2 ) monsterb_expand_gfx(machine, "gfx1"); /* install background board handlers */ - machine.device("maincpu")->memory().space(AS_IO)->install_legacy_write_handler(0xb4, 0xb5, FUNC(pignewt_back_color_w)); - machine.device("maincpu")->memory().space(AS_IO)->install_legacy_write_handler(0xb8, 0xbd, FUNC(pignewt_back_port_w)); - machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_write_handler(0xe000, 0xffff, FUNC(pignewt_vidram_w)); + iospace->install_legacy_write_handler(0xb4, 0xb5, FUNC(pignewt_back_color_w)); + iospace->install_legacy_write_handler(0xb8, 0xbd, FUNC(pignewt_back_port_w)); + pgmspace->install_legacy_write_handler(0xe000, 0xffff, FUNC(pignewt_vidram_w)); } static DRIVER_INIT( pignewt ) { segag80r_state *state = machine.driver_data(); + device_t *usbsnd = machine.device("usbsnd"); + address_space *iospace = machine.device("maincpu")->memory().space(AS_IO); + address_space *pgmspace = machine.device("maincpu")->memory().space(AS_PROGRAM); /* configure the 315-0063? security chip */ state->m_decrypt = segag80_security(63); @@ -1537,19 +1540,21 @@ static DRIVER_INIT( pignewt ) monsterb_expand_gfx(machine, "gfx1"); /* install background board handlers */ - machine.device("maincpu")->memory().space(AS_IO)->install_legacy_write_handler(0xb4, 0xb5, FUNC(pignewt_back_color_w)); - machine.device("maincpu")->memory().space(AS_IO)->install_legacy_write_handler(0xb8, 0xbd, FUNC(pignewt_back_port_w)); - machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_write_handler(0xe000, 0xffff, FUNC(pignewt_vidram_w)); + iospace->install_legacy_write_handler(0xb4, 0xb5, FUNC(pignewt_back_color_w)); + iospace->install_legacy_write_handler(0xb8, 0xbd, FUNC(pignewt_back_port_w)); + pgmspace->install_legacy_write_handler(0xe000, 0xffff, FUNC(pignewt_vidram_w)); /* install Universal sound board */ - machine.device("maincpu")->memory().space(AS_IO)->install_legacy_readwrite_handler(0x3f, 0x3f, FUNC(sega_usb_status_r), FUNC(sega_usb_data_w)); - machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_readwrite_handler(0xd000, 0xdfff, FUNC(sega_usb_ram_r), FUNC(usb_ram_w)); + iospace->install_legacy_readwrite_handler(*usbsnd, 0x3f, 0x3f, FUNC(sega_usb_status_r), FUNC(sega_usb_data_w)); + pgmspace->install_legacy_readwrite_handler(*usbsnd, 0xd000, 0xdfff, FUNC(sega_usb_ram_r), FUNC(usb_ram_w)); } static DRIVER_INIT( sindbadm ) { segag80r_state *state = machine.driver_data(); + address_space *iospace = machine.device("maincpu")->memory().space(AS_IO); + address_space *pgmspace = machine.device("maincpu")->memory().space(AS_PROGRAM); /* configure the encrypted Z80 */ sindbadm_decode(machine, "maincpu"); @@ -1559,8 +1564,8 @@ static DRIVER_INIT( sindbadm ) state->m_background_pcb = G80_BACKGROUND_SINDBADM; /* install background board handlers */ - machine.device("maincpu")->memory().space(AS_IO)->install_legacy_write_handler(0x40, 0x41, FUNC(sindbadm_back_port_w)); - machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_write_handler(0xe000, 0xffff, FUNC(sindbadm_vidram_w)); + iospace->install_legacy_write_handler(0x40, 0x41, FUNC(sindbadm_back_port_w)); + pgmspace->install_legacy_write_handler(0xe000, 0xffff, FUNC(sindbadm_vidram_w)); } diff --git a/src/mame/drivers/segag80v.c b/src/mame/drivers/segag80v.c index cf0f265084b..65d90c5b8d5 100644 --- a/src/mame/drivers/segag80v.c +++ b/src/mame/drivers/segag80v.c @@ -178,15 +178,6 @@ static MACHINE_START( g80v ) } -static MACHINE_RESET( g80v ) -{ - segag80v_state *state = machine.driver_data(); - /* if we have a Universal Sound Board, reset it here */ - if (state->m_has_usb) - sega_usb_reset(machine, 0x10); -} - - /************************************* * @@ -213,8 +204,7 @@ static WRITE8_HANDLER( mainram_w ) state->m_mainram[decrypt_offset(space, offset)] = data; } -static WRITE8_HANDLER( usb_ram_w ) { sega_usb_ram_w(space, decrypt_offset(space, offset), data); } - +static WRITE8_DEVICE_HANDLER( usb_ram_w ) { sega_usb_ram_w(device, decrypt_offset(device->machine().device("maincpu")->memory().space(AS_PROGRAM), offset), data); } static WRITE8_HANDLER( vectorram_w ) { segag80v_state *state = space->machine().driver_data(); @@ -919,7 +909,6 @@ static MACHINE_CONFIG_START( g80v_base, segag80v_state ) MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) MCFG_MACHINE_START(g80v) - MCFG_MACHINE_RESET(g80v) /* video hardware */ MCFG_SCREEN_ADD("screen", VECTOR) @@ -1318,7 +1307,7 @@ static DRIVER_INIT( elim2 ) state->m_decrypt = segag80_security(70); /* configure sound */ - state->m_has_usb = FALSE; + state->m_usb = NULL; iospace->install_legacy_write_handler(0x3e, 0x3e, FUNC(elim1_sh_w)); iospace->install_legacy_write_handler(0x3f, 0x3f, FUNC(elim2_sh_w)); } @@ -1333,7 +1322,7 @@ static DRIVER_INIT( elim4 ) state->m_decrypt = segag80_security(76); /* configure sound */ - state->m_has_usb = FALSE; + state->m_usb = NULL; iospace->install_legacy_write_handler(0x3e, 0x3e, FUNC(elim1_sh_w)); iospace->install_legacy_write_handler(0x3f, 0x3f, FUNC(elim2_sh_w)); @@ -1352,9 +1341,9 @@ static DRIVER_INIT( spacfury ) state->m_decrypt = segag80_security(64); /* configure sound */ - state->m_has_usb = FALSE; - iospace->install_legacy_write_handler(0x38, 0x38, FUNC(sega_speech_data_w)); - iospace->install_legacy_write_handler(0x3b, 0x3b, FUNC(sega_speech_control_w)); + state->m_usb = NULL; + iospace->install_legacy_write_handler(*machine.device("segaspeech"), 0x38, 0x38, FUNC(sega_speech_data_w)); + iospace->install_legacy_write_handler(*machine.device("segaspeech"), 0x3b, 0x3b, FUNC(sega_speech_control_w)); iospace->install_legacy_write_handler(0x3e, 0x3e, FUNC(spacfury1_sh_w)); iospace->install_legacy_write_handler(0x3f, 0x3f, FUNC(spacfury2_sh_w)); } @@ -1370,9 +1359,9 @@ static DRIVER_INIT( zektor ) state->m_decrypt = segag80_security(82); /* configure sound */ - state->m_has_usb = FALSE; - iospace->install_legacy_write_handler(0x38, 0x38, FUNC(sega_speech_data_w)); - iospace->install_legacy_write_handler(0x3b, 0x3b, FUNC(sega_speech_control_w)); + state->m_usb = NULL; + iospace->install_legacy_write_handler(*machine.device("segaspeech"), 0x38, 0x38, FUNC(sega_speech_data_w)); + iospace->install_legacy_write_handler(*machine.device("segaspeech"), 0x3b, 0x3b, FUNC(sega_speech_control_w)); iospace->install_legacy_write_handler(*ay, 0x3c, 0x3d, FUNC(ay8910_address_data_w)); iospace->install_legacy_write_handler(0x3e, 0x3e, FUNC(zektor1_sh_w)); iospace->install_legacy_write_handler(0x3f, 0x3f, FUNC(zektor2_sh_w)); @@ -1393,9 +1382,9 @@ static DRIVER_INIT( tacscan ) state->m_decrypt = segag80_security(76); /* configure sound */ - state->m_has_usb = TRUE; - iospace->install_legacy_readwrite_handler(0x3f, 0x3f, FUNC(sega_usb_status_r), FUNC(sega_usb_data_w)); - pgmspace->install_legacy_readwrite_handler(0xd000, 0xdfff, FUNC(sega_usb_ram_r), FUNC(usb_ram_w)); + state->m_usb = machine.device("segausb"); + iospace->install_legacy_readwrite_handler(*state->m_usb, 0x3f, 0x3f, FUNC(sega_usb_status_r), FUNC(sega_usb_data_w)); + pgmspace->install_legacy_readwrite_handler(*state->m_usb, 0xd000, 0xdfff, FUNC(sega_usb_ram_r), FUNC(usb_ram_w)); /* configure inputs */ iospace->install_legacy_write_handler(0xf8, 0xf8, FUNC(spinner_select_w)); @@ -1413,12 +1402,12 @@ static DRIVER_INIT( startrek ) state->m_decrypt = segag80_security(64); /* configure sound */ - state->m_has_usb = TRUE; - iospace->install_legacy_write_handler(0x38, 0x38, FUNC(sega_speech_data_w)); - iospace->install_legacy_write_handler(0x3b, 0x3b, FUNC(sega_speech_control_w)); + state->m_usb = machine.device("segausb"); + iospace->install_legacy_write_handler(*machine.device("segaspeech"), 0x38, 0x38, FUNC(sega_speech_data_w)); + iospace->install_legacy_write_handler(*machine.device("segaspeech"), 0x3b, 0x3b, FUNC(sega_speech_control_w)); - iospace->install_legacy_readwrite_handler(0x3f, 0x3f, FUNC(sega_usb_status_r), FUNC(sega_usb_data_w)); - pgmspace->install_legacy_readwrite_handler(0xd000, 0xdfff, FUNC(sega_usb_ram_r), FUNC(usb_ram_w)); + iospace->install_legacy_readwrite_handler(*state->m_usb, 0x3f, 0x3f, FUNC(sega_usb_status_r), FUNC(sega_usb_data_w)); + pgmspace->install_legacy_readwrite_handler(*state->m_usb, 0xd000, 0xdfff, FUNC(sega_usb_ram_r), FUNC(usb_ram_w)); /* configure inputs */ iospace->install_legacy_write_handler(0xf8, 0xf8, FUNC(spinner_select_w)); diff --git a/src/mame/drivers/shisen.c b/src/mame/drivers/shisen.c index d44dd4ae2af..a47740a466b 100644 --- a/src/mame/drivers/shisen.c +++ b/src/mame/drivers/shisen.c @@ -53,7 +53,7 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( shisen_io_map, AS_IO, 8 ) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x00, 0x00) AM_READWRITE(sichuan2_dsw1_r, sichuan2_coin_w) - AM_RANGE(0x01, 0x01) AM_READ_PORT("DSW2") AM_WRITE(m72_sound_command_byte_w) + AM_RANGE(0x01, 0x01) AM_READ_PORT("DSW2") AM_DEVWRITE("m72", m72_sound_command_byte_w) AM_RANGE(0x02, 0x02) AM_READ_PORT("P1") AM_WRITE(sichuan2_bankswitch_w) AM_RANGE(0x03, 0x03) AM_READ_PORT("P2") AM_RANGE(0x04, 0x04) AM_READ_PORT("COIN") @@ -68,10 +68,10 @@ static ADDRESS_MAP_START( shisen_sound_io_map, AS_IO, 8 ) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x00, 0x01) AM_DEVREADWRITE("ymsnd", ym2151_r, ym2151_w) AM_RANGE(0x80, 0x80) AM_READ(soundlatch_r) - AM_RANGE(0x80, 0x81) AM_WRITE(shisen_sample_addr_w) - AM_RANGE(0x82, 0x82) AM_DEVWRITE("dac", m72_sample_w) - AM_RANGE(0x83, 0x83) AM_WRITE(m72_sound_irq_ack_w) - AM_RANGE(0x84, 0x84) AM_READ(m72_sample_r) + AM_RANGE(0x80, 0x81) AM_DEVWRITE("m72", shisen_sample_addr_w) + AM_RANGE(0x82, 0x82) AM_DEVWRITE("m72", m72_sample_w) + AM_RANGE(0x83, 0x83) AM_DEVWRITE("m72", m72_sound_irq_ack_w) + AM_RANGE(0x84, 0x84) AM_DEVREAD("m72", m72_sample_r) ADDRESS_MAP_END @@ -222,10 +222,6 @@ static MACHINE_CONFIG_START( shisen, shisen_state ) MCFG_CPU_IO_MAP(shisen_sound_io_map) MCFG_CPU_VBLANK_INT_HACK(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */ /* IRQs are generated by main Z80 and YM2151 */ - - MCFG_SOUND_START(m72) - MCFG_SOUND_RESET(m72) - /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(55) @@ -243,6 +239,8 @@ static MACHINE_CONFIG_START( shisen, shisen_state ) /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") + MCFG_SOUND_ADD("m72", M72, 0) + MCFG_SOUND_ADD("ymsnd", YM2151, 3579545) MCFG_SOUND_CONFIG(ym2151_config) MCFG_SOUND_ROUTE(0, "lspeaker", 0.5) diff --git a/src/mame/drivers/vegas.c b/src/mame/drivers/vegas.c index 015c2f73538..06b3b591b1f 100644 --- a/src/mame/drivers/vegas.c +++ b/src/mame/drivers/vegas.c @@ -577,8 +577,8 @@ static MACHINE_RESET( vegas ) /* reset the DCS system if we have one */ if (machine.device("dcs2") != NULL || machine.device("dsio") != NULL || machine.device("denver") != NULL) { - dcs_reset_w(1); - dcs_reset_w(0); + dcs_reset_w(machine, 1); + dcs_reset_w(machine, 0); } /* initialize IRQ states */ @@ -1313,7 +1313,7 @@ static WRITE32_HANDLER( sio_irq_clear_w ) if (!(data & 0x01)) { midway_ioasic_reset(space->machine()); - dcs_reset_w(data & 0x01); + dcs_reset_w(space->machine(), data & 0x01); } /* they toggle bit 0x08 low to reset the VBLANK */ diff --git a/src/mame/drivers/vigilant.c b/src/mame/drivers/vigilant.c index ab5ab5c2bfc..faf8f1f8136 100644 --- a/src/mame/drivers/vigilant.c +++ b/src/mame/drivers/vigilant.c @@ -72,7 +72,7 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( vigilant_io_map, AS_IO, 8 ) ADDRESS_MAP_GLOBAL_MASK(0xff) - AM_RANGE(0x00, 0x00) AM_READ_PORT("IN0") AM_WRITE(m72_sound_command_byte_w) /* SD */ + AM_RANGE(0x00, 0x00) AM_READ_PORT("IN0") AM_DEVWRITE("m72", m72_sound_command_byte_w) /* SD */ AM_RANGE(0x01, 0x01) AM_READ_PORT("IN1") AM_WRITE(vigilant_out2_w) /* OUT2 */ AM_RANGE(0x02, 0x02) AM_READ_PORT("IN2") AM_RANGE(0x03, 0x03) AM_READ_PORT("DSW1") @@ -98,7 +98,7 @@ static ADDRESS_MAP_START( kikcubic_io_map, AS_IO, 8 ) AM_RANGE(0x02, 0x02) AM_READ_PORT("IN0") AM_RANGE(0x03, 0x03) AM_READ_PORT("IN1") AM_RANGE(0x04, 0x04) AM_READ_PORT("IN2") AM_WRITE(vigilant_bank_select_w) - AM_RANGE(0x06, 0x06) AM_WRITE(m72_sound_command_byte_w) + AM_RANGE(0x06, 0x06) AM_DEVWRITE("m72", m72_sound_command_byte_w) // AM_RANGE(0x07, 0x07) AM_WRITENOP /* ?? */ ADDRESS_MAP_END @@ -110,10 +110,10 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( sound_io_map, AS_IO, 8 ) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x00, 0x01) AM_DEVREADWRITE("ymsnd", ym2151_r, ym2151_w) - AM_RANGE(0x80, 0x81) AM_READWRITE(soundlatch_r, vigilant_sample_addr_w) /* STL / STH */ - AM_RANGE(0x82, 0x82) AM_DEVWRITE("dac", m72_sample_w) /* COUNT UP */ - AM_RANGE(0x83, 0x83) AM_WRITE(m72_sound_irq_ack_w) /* IRQ clear */ - AM_RANGE(0x84, 0x84) AM_READ(m72_sample_r) /* S ROM C */ + AM_RANGE(0x80, 0x81) AM_READ(soundlatch_r) AM_DEVWRITE("m72", vigilant_sample_addr_w) /* STL / STH */ + AM_RANGE(0x82, 0x82) AM_DEVWRITE("m72", m72_sample_w) /* COUNT UP */ + AM_RANGE(0x83, 0x83) AM_DEVWRITE("m72", m72_sound_irq_ack_w) /* IRQ clear */ + AM_RANGE(0x84, 0x84) AM_DEVREAD("m72", m72_sample_r) /* S ROM C */ ADDRESS_MAP_END static ADDRESS_MAP_START( buccanrs_sound_io_map, AS_IO, 8 ) @@ -121,10 +121,10 @@ static ADDRESS_MAP_START( buccanrs_sound_io_map, AS_IO, 8 ) AM_RANGE(0x00, 0x01) AM_DEVREADWRITE("ym1", ym2203_r, ym2203_w) AM_RANGE(0x02, 0x03) AM_DEVREADWRITE("ym2", ym2203_r, ym2203_w) AM_RANGE(0x80, 0x80) AM_READ(soundlatch_r) /* SDRE */ - AM_RANGE(0x80, 0x81) AM_WRITE(vigilant_sample_addr_w) /* STL / STH */ - AM_RANGE(0x82, 0x82) AM_DEVWRITE("dac", m72_sample_w) /* COUNT UP */ - AM_RANGE(0x83, 0x83) AM_WRITE(m72_sound_irq_ack_w) /* IRQ clear */ - AM_RANGE(0x84, 0x84) AM_READ(m72_sample_r) /* S ROM C */ + AM_RANGE(0x80, 0x81) AM_DEVWRITE("m72", vigilant_sample_addr_w) /* STL / STH */ + AM_RANGE(0x82, 0x82) AM_DEVWRITE("m72", m72_sample_w) /* COUNT UP */ + AM_RANGE(0x83, 0x83) AM_DEVWRITE("m72", m72_sound_irq_ack_w) /* IRQ clear */ + AM_RANGE(0x84, 0x84) AM_DEVREAD("m72", m72_sample_r) /* S ROM C */ ADDRESS_MAP_END @@ -526,9 +526,6 @@ static MACHINE_CONFIG_START( vigilant, vigilant_state ) MCFG_CPU_IO_MAP(sound_io_map) MCFG_CPU_VBLANK_INT_HACK(nmi_line_pulse,128) /* clocked by V1 */ /* IRQs are generated by main Z80 and YM2151 */ - MCFG_SOUND_START(m72) - MCFG_SOUND_RESET(m72) - /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(55) @@ -547,6 +544,8 @@ static MACHINE_CONFIG_START( vigilant, vigilant_state ) /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") + MCFG_SOUND_ADD("m72", M72, 0) + MCFG_SOUND_ADD("ymsnd", YM2151, 3579645) MCFG_SOUND_CONFIG(ym2151_config) MCFG_SOUND_ROUTE(0, "lspeaker", 0.55) @@ -570,9 +569,6 @@ static MACHINE_CONFIG_START( buccanrs, vigilant_state ) MCFG_CPU_IO_MAP(buccanrs_sound_io_map) MCFG_CPU_VBLANK_INT_HACK(nmi_line_pulse,128) /* clocked by V1 */ /* IRQs are generated by main Z80 and YM2151 */ - MCFG_SOUND_START(m72) - MCFG_SOUND_RESET(m72) - /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(55) @@ -591,6 +587,8 @@ static MACHINE_CONFIG_START( buccanrs, vigilant_state ) /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") + MCFG_SOUND_ADD("m72", M72, 0) + MCFG_SOUND_ADD("ym1", YM2203, 18432000/6) MCFG_SOUND_CONFIG(ym2203_config) MCFG_SOUND_ROUTE(0, "lspeaker", 0.35) @@ -630,9 +628,6 @@ static MACHINE_CONFIG_START( kikcubic, vigilant_state ) MCFG_CPU_IO_MAP(sound_io_map) MCFG_CPU_VBLANK_INT_HACK(nmi_line_pulse,128) /* clocked by V1 */ /* IRQs are generated by main Z80 and YM2151 */ - MCFG_SOUND_START(m72) - MCFG_SOUND_RESET(m72) - /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(55) @@ -651,6 +646,8 @@ static MACHINE_CONFIG_START( kikcubic, vigilant_state ) /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") + MCFG_SOUND_ADD("m72", M72, 0) + MCFG_SOUND_ADD("ymsnd", YM2151, 3579645) MCFG_SOUND_CONFIG(ym2151_config) MCFG_SOUND_ROUTE(0, "lspeaker", 0.55) diff --git a/src/mame/drivers/zaxxon.c b/src/mame/drivers/zaxxon.c index 4c7584c05c6..72fab15618b 100644 --- a/src/mame/drivers/zaxxon.c +++ b/src/mame/drivers/zaxxon.c @@ -334,13 +334,6 @@ static MACHINE_START( zaxxon ) } -static MACHINE_RESET( razmataz ) -{ - /* the timer value is unknown, but this seems to work well */ - sega_usb_reset(machine, 0x10); -} - - /************************************* * @@ -981,8 +974,6 @@ MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( razmataz, root ) - MCFG_MACHINE_RESET(razmataz) - /* video hardware */ MCFG_VIDEO_START(razmataz) MCFG_SCREEN_MODIFY("screen") @@ -1508,19 +1499,21 @@ static DRIVER_INIT( futspy ) static DRIVER_INIT( razmataz ) { zaxxon_state *state = machine.driver_data(); + address_space *pgmspace = machine.device("maincpu")->memory().space(AS_PROGRAM); + device_t *usbsnd = machine.device("usbsnd"); nprinces_decode(machine, "maincpu"); /* additional input ports are wired */ - machine.device("maincpu")->memory().space(AS_PROGRAM)->install_read_port(0xc004, 0xc004, 0, 0x18f3, "SW04"); - machine.device("maincpu")->memory().space(AS_PROGRAM)->install_read_port(0xc008, 0xc008, 0, 0x18f3, "SW08"); - machine.device("maincpu")->memory().space(AS_PROGRAM)->install_read_port(0xc00c, 0xc00c, 0, 0x18f3, "SW0C"); + pgmspace->install_read_port(0xc004, 0xc004, 0, 0x18f3, "SW04"); + pgmspace->install_read_port(0xc008, 0xc008, 0, 0x18f3, "SW08"); + pgmspace->install_read_port(0xc00c, 0xc00c, 0, 0x18f3, "SW0C"); /* unknown behavior expected here */ - machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_read_handler(0xc80a, 0xc80a, FUNC(razmataz_counter_r)); + pgmspace->install_legacy_read_handler(0xc80a, 0xc80a, FUNC(razmataz_counter_r)); /* connect the universal sound board */ - machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_readwrite_handler(0xe03c, 0xe03c, 0, 0x1f00, FUNC(sega_usb_status_r), FUNC(sega_usb_data_w)); + pgmspace->install_legacy_readwrite_handler(*usbsnd, 0xe03c, 0xe03c, 0, 0x1f00, FUNC(sega_usb_status_r), FUNC(sega_usb_data_w)); /* additional state saving */ state->save_item(NAME(state->m_razmataz_dial_pos)); @@ -1530,10 +1523,13 @@ static DRIVER_INIT( razmataz ) static DRIVER_INIT( ixion ) { + address_space *pgmspace = machine.device("maincpu")->memory().space(AS_PROGRAM); + device_t *usbsnd = machine.device("usbsnd"); + szaxxon_decode(machine, "maincpu"); /* connect the universal sound board */ - machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_readwrite_handler(0xe03c, 0xe03c, 0, 0x1f00, FUNC(sega_usb_status_r), FUNC(sega_usb_data_w)); + pgmspace->install_legacy_readwrite_handler(*usbsnd, 0xe03c, 0xe03c, 0, 0x1f00, FUNC(sega_usb_status_r), FUNC(sega_usb_data_w)); } diff --git a/src/mame/includes/exidy440.h b/src/mame/includes/exidy440.h index b2b0224bd14..51631d6000a 100644 --- a/src/mame/includes/exidy440.h +++ b/src/mame/includes/exidy440.h @@ -30,6 +30,7 @@ public: UINT8 m_palettebank_io; UINT8 m_palettebank_vis; UINT8 *m_spriteram; + device_t *m_custom; }; diff --git a/src/mame/includes/m72.h b/src/mame/includes/m72.h index c04f04039a1..62982fb1445 100644 --- a/src/mame/includes/m72.h +++ b/src/mame/includes/m72.h @@ -37,6 +37,7 @@ public: INT32 m_scrolly2; INT32 m_video_off; int m_majtitle_rowscroll; + device_t *m_audio; }; diff --git a/src/mame/includes/segag80v.h b/src/mame/includes/segag80v.h index a91c79e2f90..a70da5b18d5 100644 --- a/src/mame/includes/segag80v.h +++ b/src/mame/includes/segag80v.h @@ -13,7 +13,7 @@ public: : driver_device(machine, config) { } UINT8 *m_mainram; - UINT8 m_has_usb; + device_t *m_usb; UINT8 m_mult_data[2]; UINT16 m_mult_result; UINT8 m_spinner_select; diff --git a/src/mame/includes/vertigo.h b/src/mame/includes/vertigo.h index 8e6cfed6221..87c8b149199 100644 --- a/src/mame/includes/vertigo.h +++ b/src/mame/includes/vertigo.h @@ -85,6 +85,7 @@ public: UINT16 *m_vectorram; device_t *m_ttl74148; + device_t *m_custom; attotime m_irq4_time; UINT8 m_irq_state; UINT8 m_adc_result; diff --git a/src/mame/machine/midtunit.c b/src/mame/machine/midtunit.c index 13e4c1a5ee2..692f768fbb3 100644 --- a/src/mame/machine/midtunit.c +++ b/src/mame/machine/midtunit.c @@ -577,13 +577,13 @@ MACHINE_RESET( midtunit ) { case SOUND_ADPCM: case SOUND_ADPCM_LARGE: - williams_adpcm_reset_w(1); - williams_adpcm_reset_w(0); + williams_adpcm_reset_w(machine, 1); + williams_adpcm_reset_w(machine, 0); break; case SOUND_DCS: - dcs_reset_w(1); - dcs_reset_w(0); + dcs_reset_w(machine, 1); + dcs_reset_w(machine, 0); break; } } @@ -601,7 +601,7 @@ READ16_HANDLER( midtunit_sound_state_r ) /* logerror("%08X:Sound status read\n", cpu_get_pc(&space->device()));*/ if (chip_type == SOUND_DCS) - return dcs_control_r() >> 4; + return dcs_control_r(space->machine()) >> 4; if (fake_sound_state) { @@ -616,7 +616,7 @@ READ16_HANDLER( midtunit_sound_r ) logerror("%08X:Sound data read\n", cpu_get_pc(&space->device())); if (chip_type == SOUND_DCS) - return dcs_data_r() & 0xff; + return dcs_data_r(space->machine()) & 0xff; return ~0; } @@ -636,8 +636,8 @@ WRITE16_HANDLER( midtunit_sound_w ) { case SOUND_ADPCM: case SOUND_ADPCM_LARGE: - williams_adpcm_reset_w(~data & 0x100); - williams_adpcm_data_w(data & 0xff); + williams_adpcm_reset_w(space->machine(), ~data & 0x100); + williams_adpcm_data_w(space->machine(), data & 0xff); /* the games seem to check for $82 loops, so this should be just barely enough */ fake_sound_state = 128; @@ -645,8 +645,8 @@ WRITE16_HANDLER( midtunit_sound_w ) case SOUND_DCS: logerror("%08X:Sound write = %04X\n", cpu_get_pc(&space->device()), data); - dcs_reset_w(~data & 0x100); - dcs_data_w(data & 0xff); + dcs_reset_w(space->machine(), ~data & 0x100); + dcs_data_w(space->machine(), data & 0xff); /* the games seem to check for $82 loops, so this should be just barely enough */ fake_sound_state = 128; break; diff --git a/src/mame/machine/midwayic.c b/src/mame/machine/midwayic.c index 5fdcab9ed35..1e535e51345 100644 --- a/src/mame/machine/midwayic.c +++ b/src/mame/machine/midwayic.c @@ -820,7 +820,7 @@ void midway_ioasic_fifo_w(running_machine &machine, UINT16 data) if (LOG_FIFO) logerror("fifo_w(%04X): out of space!\n", data); } - dcs_fifo_notify(ioasic.fifo_bytes, FIFO_SIZE); + dcs_fifo_notify(machine, ioasic.fifo_bytes, FIFO_SIZE); } @@ -830,7 +830,7 @@ void midway_ioasic_fifo_full_w(running_machine &machine, UINT16 data) logerror("fifo_full_w(%04X)\n", data); ioasic.force_fifo_full = 1; update_ioasic_irq(machine); - dcs_fifo_notify(ioasic.fifo_bytes, FIFO_SIZE); + dcs_fifo_notify(machine, ioasic.fifo_bytes, FIFO_SIZE); } @@ -894,13 +894,13 @@ READ32_HANDLER( midway_ioasic_r ) result = 0; if (ioasic.has_dcs) { - result |= ((dcs_control_r() >> 4) ^ 0x40) & 0x00c0; + result |= ((dcs_control_r(space->machine()) >> 4) ^ 0x40) & 0x00c0; result |= ioasic_fifo_status_r(&space->device()) & 0x0038; - result |= dcs_data2_r() & 0xff00; + result |= dcs_data2_r(space->machine()) & 0xff00; } else if (ioasic.has_cage) { - result |= (cage_control_r() << 6) ^ 0x80; + result |= (cage_control_r(space->machine()) << 6) ^ 0x80; } else result |= 0x48; @@ -910,12 +910,12 @@ READ32_HANDLER( midway_ioasic_r ) result = 0; if (ioasic.has_dcs) { - result = dcs_data_r(); + result = dcs_data_r(space->machine()); if (ioasic.auto_ack) - dcs_ack_w(); + dcs_ack_w(space->machine()); } else if (ioasic.has_cage) - result = main_from_cage_r(space); + result = cage_main_r(space); else { static UINT16 val = 0; @@ -994,7 +994,7 @@ WRITE32_HANDLER( midway_ioasic_w ) /* sound reset? */ if (ioasic.has_dcs) { - dcs_reset_w(~newreg & 1); + dcs_reset_w(space->machine(), ~newreg & 1); } else if (ioasic.has_cage) { @@ -1012,13 +1012,13 @@ WRITE32_HANDLER( midway_ioasic_w ) case IOASIC_SOUNDOUT: if (ioasic.has_dcs) - dcs_data_w(newreg); + dcs_data_w(space->machine(), newreg); else if (ioasic.has_cage) - main_to_cage_w(newreg); + cage_main_w(space, newreg); break; case IOASIC_SOUNDIN: - dcs_ack_w(); + dcs_ack_w(space->machine()); /* acknowledge data read */ break; diff --git a/src/mame/machine/midwunit.c b/src/mame/machine/midwunit.c index b59e703de98..eb2109d7b2b 100644 --- a/src/mame/machine/midwunit.c +++ b/src/mame/machine/midwunit.c @@ -97,7 +97,7 @@ WRITE16_HANDLER( midwunit_io_w ) logerror("%08X:Control W @ %05X = %04X\n", cpu_get_pc(&space->device()), offset, data); /* bit 4 reset sound CPU */ - dcs_reset_w(newword & 0x10); + dcs_reset_w(space->machine(), newword & 0x10); /* bit 5 (active low) reset security chip */ midway_serial_pic_reset_w(newword & 0x20); @@ -378,8 +378,8 @@ MACHINE_RESET( midwunit ) int i; /* reset sound */ - dcs_reset_w(1); - dcs_reset_w(0); + dcs_reset_w(machine, 1); + dcs_reset_w(machine, 0); /* reset I/O shuffling */ for (i = 0; i < 16; i++) @@ -418,13 +418,13 @@ READ16_HANDLER( midwunit_sound_r ) { logerror("%08X:Sound read\n", cpu_get_pc(&space->device())); - return dcs_data_r() & 0xff; + return dcs_data_r(space->machine()) & 0xff; } READ16_HANDLER( midwunit_sound_state_r ) { - return dcs_control_r(); + return dcs_control_r(space->machine()); } @@ -441,6 +441,6 @@ WRITE16_HANDLER( midwunit_sound_w ) if (ACCESSING_BITS_0_7) { logerror("%08X:Sound write = %04X\n", cpu_get_pc(&space->device()), data); - dcs_data_w(data & 0xff); + dcs_data_w(space->machine(), data & 0xff); } } diff --git a/src/mame/machine/midxunit.c b/src/mame/machine/midxunit.c index 2826588c240..cae1181691a 100644 --- a/src/mame/machine/midxunit.c +++ b/src/mame/machine/midxunit.c @@ -104,7 +104,7 @@ WRITE16_HANDLER( midxunit_unknown_w ) int offs = offset / 0x40000; if (offs == 1 && ACCESSING_BITS_0_7) - dcs_reset_w(data & 2); + dcs_reset_w(space->machine(), data & 2); if (ACCESSING_BITS_0_7 && offset % 0x40000 == 0) logerror("%08X:midxunit_unknown_w @ %d = %02X\n", cpu_get_pc(&space->device()), offs, data & 0xff); @@ -274,7 +274,7 @@ WRITE16_HANDLER( midxunit_uart_w ) break; case 5: /* register 5 write seems to reset things */ - dcs_data_r(); + dcs_data_r(space->machine()); break; default: /* everyone else just stores themselves */ @@ -342,8 +342,8 @@ MACHINE_RESET( midxunit ) int i; /* reset sound */ - dcs_reset_w(1); - dcs_reset_w(0); + dcs_reset_w(machine, 1); + dcs_reset_w(machine, 0); /* reset I/O shuffling */ for (i = 0; i < 16; i++) @@ -392,13 +392,13 @@ READ16_HANDLER( midxunit_sound_r ) { logerror("%08X:Sound read\n", cpu_get_pc(&space->device())); - return dcs_data_r() & 0xff; + return dcs_data_r(space->machine()) & 0xff; } READ16_HANDLER( midxunit_sound_state_r ) { - return dcs_control_r(); + return dcs_control_r(space->machine()); } @@ -415,6 +415,6 @@ WRITE16_HANDLER( midxunit_sound_w ) if (ACCESSING_BITS_0_7) { logerror("%08X:Sound write = %04X\n", cpu_get_pc(&space->device()), data); - dcs_data_w(data & 0xff); + dcs_data_w(space->machine(), data & 0xff); } } diff --git a/src/mame/machine/midyunit.c b/src/mame/machine/midyunit.c index b8166ebd677..03d1c041b0d 100644 --- a/src/mame/machine/midyunit.c +++ b/src/mame/machine/midyunit.c @@ -178,8 +178,8 @@ static WRITE16_HANDLER( term2_sound_w ) if (offset == 0) state->m_term2_analog_select = (data >> 12) & 3; - williams_adpcm_reset_w((~data & 0x100) >> 1); - williams_adpcm_data_w(data); + williams_adpcm_reset_w(space->machine(), (~data & 0x100) >> 1); + williams_adpcm_data_w(space->machine(), data); } @@ -569,19 +569,19 @@ MACHINE_RESET( midyunit ) switch (state->m_chip_type) { case SOUND_NARC: - williams_narc_reset_w(1); - williams_narc_reset_w(0); + williams_narc_reset_w(machine, 1); + williams_narc_reset_w(machine, 0); break; case SOUND_CVSD: case SOUND_CVSD_SMALL: - williams_cvsd_reset_w(1); - williams_cvsd_reset_w(0); + williams_cvsd_reset_w(machine, 1); + williams_cvsd_reset_w(machine, 0); break; case SOUND_ADPCM: - williams_adpcm_reset_w(1); - williams_adpcm_reset_w(0); + williams_adpcm_reset_w(machine, 1); + williams_adpcm_reset_w(machine, 0); break; case SOUND_YAWDIM: @@ -612,18 +612,18 @@ WRITE16_HANDLER( midyunit_sound_w ) switch (state->m_chip_type) { case SOUND_NARC: - williams_narc_data_w(data); + williams_narc_data_w(space->machine(), data); break; case SOUND_CVSD_SMALL: case SOUND_CVSD: - williams_cvsd_reset_w((~data & 0x100) >> 8); + williams_cvsd_reset_w(space->machine(), (~data & 0x100) >> 8); williams_cvsd_data_w(space->machine(), (data & 0xff) | ((data & 0x200) >> 1)); break; case SOUND_ADPCM: - williams_adpcm_reset_w((~data & 0x100) >> 8); - williams_adpcm_data_w(data); + williams_adpcm_reset_w(space->machine(), (~data & 0x100) >> 8); + williams_adpcm_data_w(space->machine(), data); break; case SOUND_YAWDIM: diff --git a/src/mame/machine/vertigo.c b/src/mame/machine/vertigo.c index 54094fed0df..227676b45f2 100644 --- a/src/mame/machine/vertigo.c +++ b/src/mame/machine/vertigo.c @@ -169,7 +169,8 @@ WRITE16_HANDLER( vertigo_wsot_w ) static TIMER_CALLBACK( sound_command_w ) { - exidy440_sound_command(machine, param); + vertigo_state *state = machine.driver_data(); + exidy440_sound_command(state->m_custom, param); /* It is important that the sound cpu ACKs the sound command quickly. Otherwise the main CPU gives up with sound. Boosting @@ -188,7 +189,8 @@ WRITE16_HANDLER( vertigo_audio_w ) READ16_HANDLER( vertigo_sio_r ) { - return exidy440_sound_command_ack() ? 0xfc : 0xfd; + vertigo_state *state = space->machine().driver_data(); + return exidy440_sound_command_ack(state->m_custom) ? 0xfc : 0xfd; } @@ -202,6 +204,10 @@ READ16_HANDLER( vertigo_sio_r ) MACHINE_START( vertigo ) { vertigo_state *state = machine.driver_data(); + + state->m_custom = machine.device("custom"); + state->m_ttl74148 = machine.device("74148"); + state_save_register_global(machine, state->m_irq_state); state_save_register_global(machine, state->m_adc_result); state_save_register_global(machine, state->m_irq4_time); @@ -214,7 +220,6 @@ MACHINE_RESET( vertigo ) vertigo_state *state = machine.driver_data(); int i; - state->m_ttl74148 = machine.device("74148"); ttl74148_enable_input_w(state->m_ttl74148, 0); for (i = 0; i < 8; i++)