summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/emu/sound/ics2115.h
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/emu/sound/ics2115.h')
-rw-r--r--trunk/src/emu/sound/ics2115.h162
1 files changed, 162 insertions, 0 deletions
diff --git a/trunk/src/emu/sound/ics2115.h b/trunk/src/emu/sound/ics2115.h
new file mode 100644
index 00000000000..79fc0061276
--- /dev/null
+++ b/trunk/src/emu/sound/ics2115.h
@@ -0,0 +1,162 @@
+#pragma once
+
+#ifndef __ICS2115_H__
+#define __ICS2115_H__
+
+
+//**************************************************************************
+// INTERFACE CONFIGURATION MACROS
+//**************************************************************************
+
+#define MCFG_ICS2115_ADD(_tag, _clock, _irqf) \
+ MCFG_DEVICE_ADD(_tag, ICS2115, _clock) \
+ MCFG_IRQ_FUNC(_irqf) \
+
+#define MCFG_ICS2115_REPLACE(_tag, _clock, _irqf) \
+ MCFG_DEVICE_REPLACE(_tag, ICS2115, _clock) \
+ MCFG_IRQ_FUNC(_irqf)
+
+#define MCFG_IRQ_FUNC(_irqf) \
+ ics2115_device::static_set_irqf(*device, _irqf); \
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+struct ics2115_voice {
+ struct {
+ INT32 left;
+ UINT32 acc, start, end;
+ UINT16 fc;
+ UINT8 ctl, saddr;
+ } osc;
+
+ struct {
+ INT32 left;
+ UINT32 add;
+ UINT32 start, end;
+ UINT32 acc;
+ UINT16 regacc;
+ UINT8 incr;
+ UINT8 pan, mode;
+ } vol;
+
+ union {
+ struct {
+ UINT8 ulaw : 1;
+ UINT8 stop : 1; //stops wave + vol envelope
+ UINT8 eightbit : 1;
+ UINT8 loop : 1;
+ UINT8 loop_bidir : 1;
+ UINT8 irq : 1;
+ UINT8 invert : 1;
+ UINT8 irq_pending: 1;
+ //IRQ on variable?
+ };
+ UINT8 value;
+ } osc_conf;
+
+ union {
+ struct {
+ UINT8 done : 1; //indicates ramp has stopped
+ UINT8 stop : 1; //stops the ramp
+ UINT8 rollover : 1; //rollover (TODO)
+ UINT8 loop : 1;
+ UINT8 loop_bidir : 1;
+ UINT8 irq : 1; //enable IRQ generation
+ UINT8 invert : 1; //invert direction
+ UINT8 irq_pending: 1; //(read only) IRQ pending
+ //noenvelope == (done | disable)
+ };
+ UINT8 value;
+ } vol_ctrl;
+
+ //Possibly redundant state. => improvements of wavetable logic
+ //may lead to its elimination.
+ union {
+ struct {
+ UINT8 on : 1;
+ UINT8 ramp : 7; // 100 0000 = 0x40 maximum
+ };
+ UINT8 value;
+ } state;
+
+ bool playing();
+ int update_volume_envelope();
+ int update_oscillator();
+ void update_ramp();
+};
+
+// ======================> ics2115_device
+
+class ics2115_device : public device_t, public device_sound_interface
+{
+public:
+ // construction/destruction
+ ics2115_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // inline configuration helpers
+ static void static_set_irqf(device_t &device, void (*irqf)(device_t *device, int state));
+
+ static READ8_DEVICE_HANDLER(read);
+ static WRITE8_DEVICE_HANDLER(write);
+ //UINT8 read(offs_t offset);
+ //void write(offs_t offset, UINT8 data);
+ static TIMER_CALLBACK(timer_cb_0);
+ static TIMER_CALLBACK(timer_cb_1);
+
+ sound_stream *m_stream;
+
+ static const UINT16 revision = 0x1;
+
+protected:
+
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+ // internal callbacks
+ void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples);
+
+ // internal state
+ void (*m_irq_cb)(device_t *device, int state);
+
+ UINT8 *m_rom;
+ INT16 m_ulaw[256];
+ UINT16 m_volume[4096];
+ static const int volume_bits = 15;
+
+ ics2115_voice m_voice[32];
+ struct {
+ UINT8 scale, preset;
+ emu_timer *timer;
+ UINT64 period; /* in nsec */
+ } m_timer[2];
+
+ UINT8 m_active_osc;
+ UINT8 m_osc_select;
+ UINT8 m_reg_select;
+ UINT8 m_irq_enabled, m_irq_pending;
+ bool m_irq_on;
+
+ //Unknown variable, seems to be effected by 0x12. Further investigation
+ //Required.
+ UINT8 m_vmode;
+
+ //internal register helper functions
+ UINT16 reg_read();
+ void reg_write(UINT8 data, bool msb);
+ void recalc_timer(int timer);
+ void keyon();
+ void recalc_irq();
+
+ //stream helper functions
+ int fill_output(ics2115_voice& voice, stream_sample_t *outputs[2], int samples);
+ stream_sample_t get_sample(ics2115_voice& voice);
+};
+
+
+// device type definition
+extern const device_type ICS2115;
+
+#endif /* __ICS2115_H__ */