diff options
Diffstat (limited to 'src/mame/audio/senjyo.c')
-rw-r--r-- | src/mame/audio/senjyo.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/src/mame/audio/senjyo.c b/src/mame/audio/senjyo.c new file mode 100644 index 00000000000..1eb6f21d0de --- /dev/null +++ b/src/mame/audio/senjyo.c @@ -0,0 +1,88 @@ +#include "driver.h" +#include "machine/z80pio.h" +#include "machine/z80ctc.h" +#include "sound/samples.h" +#include <math.h> + + +/* z80 pio */ +static void pio_interrupt(int state) +{ + cpunum_set_input_line(1, 0, state); +} + +static z80pio_interface pio_intf = +{ + pio_interrupt, + 0, + 0 +}; + +/* z80 ctc */ +static void ctc_interrupt (int state) +{ + cpunum_set_input_line(1, 0, state); +} + +static z80ctc_interface ctc_intf = +{ + 0, /* clock (filled in from the CPU 0 clock */ + NOTIMER_2, /* timer disables */ + ctc_interrupt, /* interrupt handler */ + z80ctc_0_trg1_w, /* ZC/TO0 callback */ + 0, /* ZC/TO1 callback */ + 0 /* ZC/TO2 callback */ +}; + + +/* single tone generator */ +#define SINGLE_LENGTH 10000 +#define SINGLE_DIVIDER 8 + +static INT16 *_single; +static int single_rate = 1000; +static int single_volume = 0; + + +WRITE8_HANDLER( senjyo_volume_w ) +{ + single_volume = data & 0x0f; + sample_set_volume(0,single_volume / 15.0); +} + + +static TIMER_CALLBACK( senjyo_sh_update ) +{ + /* ctc2 timer single tone generator frequency */ + attotime period = z80ctc_getperiod (0, 2); + if (attotime_compare(period, attotime_zero) != 0 ) + single_rate = ATTOSECONDS_TO_HZ(period.attoseconds); + else + single_rate = 0; + + sample_set_freq(0,single_rate); +} + + +void senjyo_sh_start(void) +{ + int i; + + /* z80 ctc init */ + ctc_intf.baseclock = Machine->drv->cpu[1].clock; + z80ctc_init (0, &ctc_intf); + + /* z80 pio init */ + z80pio_init (0, &pio_intf); + + _single = (INT16 *)auto_malloc(SINGLE_LENGTH*2); + + for (i = 0;i < SINGLE_LENGTH;i++) /* freq = ctc2 zco / 8 */ + _single[i] = ((i/SINGLE_DIVIDER)&0x01)*127*256; + + /* CTC2 single tone generator */ + sample_set_volume(0,0); + sample_start_raw(0,_single,SINGLE_LENGTH,single_rate,1); + + timer_pulse(attotime_make(0, Machine->screen[0].refresh), 0, senjyo_sh_update); +} |