diff options
Diffstat (limited to 'src/mame/audio/cyberbal.c')
-rw-r--r-- | src/mame/audio/cyberbal.c | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/src/mame/audio/cyberbal.c b/src/mame/audio/cyberbal.c new file mode 100644 index 00000000000..d2614c71563 --- /dev/null +++ b/src/mame/audio/cyberbal.c @@ -0,0 +1,166 @@ +/*************************************************************************** + + Cyberball 68000 sound simulator + +****************************************************************************/ + +#include "driver.h" +#include "machine/atarigen.h" +#include "sound/dac.h" +#include "includes/cyberbal.h" +#include <math.h> + + +static UINT8 *bank_base; +static UINT8 fast_68k_int, io_68k_int; +static UINT8 sound_data_from_68k, sound_data_from_6502; +static UINT8 sound_data_from_68k_ready, sound_data_from_6502_ready; + + +static void update_sound_68k_interrupts(void); + + + +void cyberbal_sound_reset(void) +{ + /* reset the sound system */ + bank_base = &memory_region(REGION_CPU2)[0x10000]; + memory_set_bankptr(8, &bank_base[0x0000]); + fast_68k_int = io_68k_int = 0; + sound_data_from_68k = sound_data_from_6502 = 0; + sound_data_from_68k_ready = sound_data_from_6502_ready = 0; +} + + + +/************************************* + * + * 6502 Sound Interface + * + *************************************/ + +READ8_HANDLER( cyberbal_special_port3_r ) +{ + int temp = readinputport(3); + if (!(readinputport(0) & 0x8000)) temp ^= 0x80; + if (atarigen_cpu_to_sound_ready) temp ^= 0x40; + if (atarigen_sound_to_cpu_ready) temp ^= 0x20; + return temp; +} + + +READ8_HANDLER( cyberbal_sound_6502_stat_r ) +{ + int temp = 0xff; + if (sound_data_from_6502_ready) temp ^= 0x80; + if (sound_data_from_68k_ready) temp ^= 0x40; + return temp; +} + + +WRITE8_HANDLER( cyberbal_sound_bank_select_w ) +{ + memory_set_bankptr(8, &bank_base[0x1000 * ((data >> 6) & 3)]); + coin_counter_w(1, (data >> 5) & 1); + coin_counter_w(0, (data >> 4) & 1); + cpunum_set_input_line(3, INPUT_LINE_RESET, (data & 0x08) ? CLEAR_LINE : ASSERT_LINE); + if (!(data & 0x01)) sndti_reset(SOUND_YM2151, 0); + +} + + +READ8_HANDLER( cyberbal_sound_68k_6502_r ) +{ + sound_data_from_68k_ready = 0; + return sound_data_from_68k; +} + + +WRITE8_HANDLER( cyberbal_sound_68k_6502_w ) +{ + sound_data_from_6502 = data; + sound_data_from_6502_ready = 1; + + if (!io_68k_int) + { + io_68k_int = 1; + update_sound_68k_interrupts(); + } +} + + + +/************************************* + * + * 68000 Sound Interface + * + *************************************/ + +static void update_sound_68k_interrupts(void) +{ + int newstate = 0; + + if (fast_68k_int) + newstate |= 6; + if (io_68k_int) + newstate |= 2; + + if (newstate) + cpunum_set_input_line(3, newstate, ASSERT_LINE); + else + cpunum_set_input_line(3, 7, CLEAR_LINE); +} + + +INTERRUPT_GEN( cyberbal_sound_68k_irq_gen ) +{ + if (!fast_68k_int) + { + fast_68k_int = 1; + update_sound_68k_interrupts(); + } +} + + +WRITE16_HANDLER( cyberbal_io_68k_irq_ack_w ) +{ + if (io_68k_int) + { + io_68k_int = 0; + update_sound_68k_interrupts(); + } +} + + +READ16_HANDLER( cyberbal_sound_68k_r ) +{ + int temp = (sound_data_from_6502 << 8) | 0xff; + + sound_data_from_6502_ready = 0; + + if (sound_data_from_6502_ready) temp ^= 0x08; + if (sound_data_from_68k_ready) temp ^= 0x04; + return temp; +} + + +WRITE16_HANDLER( cyberbal_sound_68k_w ) +{ + if (ACCESSING_MSB) + { + sound_data_from_68k = (data >> 8) & 0xff; + sound_data_from_68k_ready = 1; + } +} + + +WRITE16_HANDLER( cyberbal_sound_68k_dac_w ) +{ + DAC_data_16_w((offset >> 3) & 1, (((data >> 3) & 0x800) | ((data >> 2) & 0x7ff)) << 4); + + if (fast_68k_int) + { + fast_68k_int = 0; + update_sound_68k_interrupts(); + } +} |