diff options
Diffstat (limited to 'src/mame/audio/gyruss.c')
-rw-r--r-- | src/mame/audio/gyruss.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/src/mame/audio/gyruss.c b/src/mame/audio/gyruss.c new file mode 100644 index 00000000000..92c0bdbddc1 --- /dev/null +++ b/src/mame/audio/gyruss.c @@ -0,0 +1,87 @@ +#include "driver.h" +#include "cpu/i8039/i8039.h" +#include "sound/flt_rc.h" + + + +/* The timer clock which feeds the upper 4 bits of */ +/* AY-3-8910 port A is based on the same clock */ +/* feeding the sound CPU Z80. It is a divide by */ +/* 10240, formed by a standard divide by 1024, */ +/* followed by a divide by 10 using a 4 bit */ +/* bi-quinary count sequence. (See LS90 data sheet */ +/* for an example). */ +/* */ +/* Bit 0 comes from the output of the divide by 1024 */ +/* 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 */ +/* Bit 1 comes from the QC output of the LS90 producing a sequence of */ +/* 0, 0, 1, 1, 0, 0, 1, 1, 1, 0 */ +/* Bit 2 comes from the QD output of the LS90 producing a sequence of */ +/* 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 */ +/* Bit 3 comes from the QA output of the LS90 producing a sequence of */ +/* 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 */ + +static int gyruss_timer[10] = +{ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x09, 0x0a, 0x0b, 0x0a, 0x0d +}; + +READ8_HANDLER( gyruss_portA_r ) +{ + /* need to protect from totalcycles overflow */ + static int last_totalcycles = 0; + + /* number of Z80 clock cycles to count */ + static int clock; + + int current_totalcycles; + + current_totalcycles = activecpu_gettotalcycles(); + clock = (clock + (current_totalcycles-last_totalcycles)) % 10240; + + last_totalcycles = current_totalcycles; + + return gyruss_timer[clock/1024]; +} + + + +static void filter_w(int chip,int data) +{ + int i; + + + for (i = 0;i < 3;i++) + { + int C; + + + C = 0; + if (data & 1) C += 47000; /* 47000pF = 0.047uF */ + if (data & 2) C += 220000; /* 220000pF = 0.22uF */ + data >>= 2; + filter_rc_set_RC(3*chip + i,FLT_RC_LOWPASS, 1000,2200,200,CAP_P(C)); + } +} + +WRITE8_HANDLER( gyruss_filter0_w ) +{ + filter_w(0,data); +} + +WRITE8_HANDLER( gyruss_filter1_w ) +{ + filter_w(1,data); +} + + +WRITE8_HANDLER( gyruss_sh_irqtrigger_w ) +{ + /* writing to this register triggers IRQ on the sound CPU */ + cpunum_set_input_line_and_vector(2,0,HOLD_LINE,0xff); +} + +WRITE8_HANDLER( gyruss_i8039_irq_w ) +{ + cpunum_set_input_line(3, 0, PULSE_LINE); +} |