summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/isa/sblaster.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/isa/sblaster.h')
-rw-r--r--src/devices/bus/isa/sblaster.h375
1 files changed, 181 insertions, 194 deletions
diff --git a/src/devices/bus/isa/sblaster.h b/src/devices/bus/isa/sblaster.h
index 3c4b75b6655..8411a35acac 100644
--- a/src/devices/bus/isa/sblaster.h
+++ b/src/devices/bus/isa/sblaster.h
@@ -1,258 +1,245 @@
// license:BSD-3-Clause
// copyright-holders:R. Belmont, Miodrag Milanovic
-#pragma once
+#ifndef MAME_BUS_ISA_SBLASTER_H
+#define MAME_BUS_ISA_SBLASTER_H
-#ifndef __ISA_SOUND_BLASTER_H__
-#define __ISA_SOUND_BLASTER_H__
+#pragma once
-#include "bus/midi/midi.h"
#include "isa.h"
-#include "sound/dac.h"
+#include "bus/midi/midi.h"
#include "bus/pc_joy/pc_joy.h"
#include "sound/3812intf.h"
+#include "sound/dac.h"
#include "sound/saa1099.h"
-#define SIXTEENBIT 0x01
-#define STEREO 0x02
-#define SIGNED 0x04
-#define ADPCM2 0x08
-#define ADPCM3 0x10
-#define ADPCM4 0x20
-
-#define IRQ_DMA8 0x01
-#define IRQ_DMA16 0x02
-#define IRQ_MPU 0x04
-#define IRQ_ALL 0xff
-
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
-struct sb8_dsp_state
-{
- uint8_t reset_latch;
- uint8_t rbuf_status;
- uint8_t wbuf_status;
- uint8_t fifo[16],fifo_ptr;
- uint8_t fifo_r[52],fifo_r_ptr;
- uint16_t version;
- uint8_t test_reg;
- uint8_t speaker_on;
- bool dma_no_irq;
- uint32_t prot_count;
- int32_t prot_value;
- uint32_t frequency;
- uint32_t adc_freq;
- uint32_t dma_length, dma_transferred;
- uint32_t adc_length, adc_transferred;
- uint8_t dma_autoinit;
- uint8_t data[128], d_wptr, d_rptr;
- bool dma_timer_started;
- bool dma_throttled;
- uint8_t flags;
- uint8_t irq_active;
- bool adpcm_new_ref;
- uint8_t adpcm_ref;
- uint8_t adpcm_step;
- uint8_t adpcm_count;
-};
-
-struct sb8_mixer
-{
- uint8_t status;
- uint8_t main_vol;
- uint8_t dac_vol;
- uint8_t fm_vol;
- uint8_t mic_vol;
- uint8_t in_filter;
- uint8_t stereo_sel;
- uint8_t cd_vol;
- uint8_t line_vol;
-};
-
-struct sb16_mixer
-{
- uint8_t data;
- uint8_t status;
- uint8_t main_vol[2];
- uint8_t dac_vol[2];
- uint8_t fm_vol[2];
- uint8_t cd_vol[2];
- uint8_t line_vol[2];
- uint8_t mic_vol;
- uint8_t pc_speaker_vol;
- uint8_t output_ctl;
- uint8_t input_ctl[2];
- uint8_t input_gain[2];
- uint8_t output_gain[2];
- uint8_t agc;
- uint8_t treble[2];
- uint8_t bass[2];
-};
-
// ======================> sb_device (parent)
class sb_device :
public device_t, public device_serial_interface
{
public:
- // construction/destruction
- sb_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, const char *name, const char *shortname, const char *source);
-
- required_device<dac_16bit_r2r_device> m_ldac;
- required_device<dac_16bit_r2r_device> m_rdac;
- required_device<pc_joy_device> m_joy;
- required_device<midi_port_device> m_mdout;
- required_ioport m_config;
-
- void process_fifo(uint8_t cmd);
- void queue(uint8_t data);
- void queue_r(uint8_t data);
- uint8_t dequeue_r();
-
- DECLARE_READ8_MEMBER(dsp_reset_r);
- DECLARE_WRITE8_MEMBER(dsp_reset_w);
- DECLARE_READ8_MEMBER(dsp_data_r);
- DECLARE_WRITE8_MEMBER(dsp_data_w);
- DECLARE_READ8_MEMBER(dsp_rbuf_status_r);
- DECLARE_READ8_MEMBER(dsp_wbuf_status_r);
- DECLARE_WRITE8_MEMBER(dsp_rbuf_status_w);
- DECLARE_WRITE8_MEMBER(dsp_cmd_w);
-
- DECLARE_WRITE_LINE_MEMBER( midi_rx_w ) { device_serial_interface::rx_w((uint8_t)state); }
+ void process_fifo(uint8_t cmd);
+ void queue(uint8_t data);
+ void queue_r(uint8_t data);
+ uint8_t dequeue_r();
+
+ DECLARE_READ8_MEMBER(dsp_reset_r);
+ DECLARE_WRITE8_MEMBER(dsp_reset_w);
+ DECLARE_READ8_MEMBER(dsp_data_r);
+ DECLARE_WRITE8_MEMBER(dsp_data_w);
+ DECLARE_READ8_MEMBER(dsp_rbuf_status_r);
+ DECLARE_READ8_MEMBER(dsp_wbuf_status_r);
+ DECLARE_WRITE8_MEMBER(dsp_rbuf_status_w);
+ DECLARE_WRITE8_MEMBER(dsp_cmd_w);
+
+ DECLARE_WRITE_LINE_MEMBER( midi_rx_w ) { device_serial_interface::rx_w((uint8_t)state); }
protected:
- // device-level overrides
- virtual void device_start() override;
- virtual void device_reset() override;
- uint8_t dack_r(int line);
- void dack_w(int line, uint8_t data);
- virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
- virtual void drq16_w(int state) { }
- virtual void drq_w(int state) { }
- virtual void irq_w(int state, int source) { }
- virtual void mixer_reset() {}
- void adpcm_decode(uint8_t sample, int size);
-
- // serial overrides
- virtual void rcv_complete() override; // Rx completed receiving byte
- virtual void tra_complete() override; // Tx completed sending byte
- virtual void tra_callback() override; // Tx send bit
-
- static const int MIDI_RING_SIZE = 2048;
-
- struct sb8_dsp_state m_dsp;
- uint8_t m_dack_out;
- void xmit_char(uint8_t data);
- bool m_onebyte_midi, m_uart_midi, m_uart_irq, m_mpu_midi;
- int m_rx_waiting, m_tx_waiting;
- uint8_t m_recvring[MIDI_RING_SIZE];
- uint8_t m_xmitring[MIDI_RING_SIZE];
- int m_xmit_read, m_xmit_write;
- int m_recv_read, m_recv_write;
- bool m_tx_busy;
-
- emu_timer *m_timer;
+ struct sb8_dsp_state
+ {
+ uint8_t reset_latch;
+ uint8_t rbuf_status;
+ uint8_t wbuf_status;
+ uint8_t fifo[16],fifo_ptr;
+ uint8_t fifo_r[52],fifo_r_ptr;
+ uint16_t version;
+ uint8_t test_reg;
+ uint8_t speaker_on;
+ bool dma_no_irq;
+ uint32_t prot_count;
+ int32_t prot_value;
+ uint32_t frequency;
+ uint32_t adc_freq;
+ uint32_t dma_length, dma_transferred;
+ uint32_t adc_length, adc_transferred;
+ uint8_t dma_autoinit;
+ uint8_t data[128], d_wptr, d_rptr;
+ bool dma_timer_started;
+ bool dma_throttled;
+ uint8_t flags;
+ uint8_t irq_active;
+ bool adpcm_new_ref;
+ uint8_t adpcm_ref;
+ uint8_t adpcm_step;
+ uint8_t adpcm_count;
+ };
+
+ struct sb8_mixer
+ {
+ uint8_t status;
+ uint8_t main_vol;
+ uint8_t dac_vol;
+ uint8_t fm_vol;
+ uint8_t mic_vol;
+ uint8_t in_filter;
+ uint8_t stereo_sel;
+ uint8_t cd_vol;
+ uint8_t line_vol;
+ };
+
+ struct sb16_mixer
+ {
+ uint8_t data;
+ uint8_t status;
+ uint8_t main_vol[2];
+ uint8_t dac_vol[2];
+ uint8_t fm_vol[2];
+ uint8_t cd_vol[2];
+ uint8_t line_vol[2];
+ uint8_t mic_vol;
+ uint8_t pc_speaker_vol;
+ uint8_t output_ctl;
+ uint8_t input_ctl[2];
+ uint8_t input_gain[2];
+ uint8_t output_gain[2];
+ uint8_t agc;
+ uint8_t treble[2];
+ uint8_t bass[2];
+ };
+
+ // construction/destruction
+ sb_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ uint8_t dack_r(int line);
+ void dack_w(int line, uint8_t data);
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+ virtual void drq16_w(int state) { }
+ virtual void drq_w(int state) { }
+ virtual void irq_w(int state, int source) { }
+ virtual void mixer_reset() {}
+ void adpcm_decode(uint8_t sample, int size);
+
+ // serial overrides
+ virtual void rcv_complete() override; // Rx completed receiving byte
+ virtual void tra_complete() override; // Tx completed sending byte
+ virtual void tra_callback() override; // Tx send bit
+
+ static constexpr unsigned MIDI_RING_SIZE = 2048;
+
+ required_device<dac_16bit_r2r_device> m_ldac;
+ required_device<dac_16bit_r2r_device> m_rdac;
+ required_device<pc_joy_device> m_joy;
+ required_device<midi_port_device> m_mdout;
+ required_ioport m_config;
+
+ struct sb8_dsp_state m_dsp;
+ uint8_t m_dack_out;
+ void xmit_char(uint8_t data);
+ bool m_onebyte_midi, m_uart_midi, m_uart_irq, m_mpu_midi;
+ int m_rx_waiting, m_tx_waiting;
+ uint8_t m_recvring[MIDI_RING_SIZE];
+ uint8_t m_xmitring[MIDI_RING_SIZE];
+ int m_xmit_read, m_xmit_write;
+ int m_recv_read, m_recv_write;
+ bool m_tx_busy;
+
+ emu_timer *m_timer;
};
class sb8_device : public sb_device,
public device_isa8_card_interface
{
public:
- // construction/destruction
- sb8_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, const char *name, const char *shortname, const char *source);
-
- DECLARE_READ8_MEMBER(ym3812_16_r);
- DECLARE_WRITE8_MEMBER(ym3812_16_w);
- virtual ioport_constructor device_input_ports() const override;
+ DECLARE_READ8_MEMBER(ym3812_16_r);
+ DECLARE_WRITE8_MEMBER(ym3812_16_w);
+ virtual ioport_constructor device_input_ports() const override;
protected:
- virtual void device_start() override;
- virtual void drq_w(int state) override;
- virtual void irq_w(int state, int source) override;
- virtual uint8_t dack_r(int line) override { return sb_device::dack_r(line); }
- virtual void dack_w(int line, uint8_t data) override { sb_device::dack_w(line, data); }
+ // construction/destruction
+ sb8_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ virtual void device_start() override;
+ virtual void drq_w(int state) override;
+ virtual void irq_w(int state, int source) override;
+ virtual uint8_t dack_r(int line) override { return sb_device::dack_r(line); }
+ virtual void dack_w(int line, uint8_t data) override { sb_device::dack_w(line, data); }
private:
- required_device<ym3812_device> m_ym3812;
+ required_device<ym3812_device> m_ym3812;
};
class isa8_sblaster1_0_device : public sb8_device
{
public:
- // construction/destruction
- isa8_sblaster1_0_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ // construction/destruction
+ isa8_sblaster1_0_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- // optional information overrides
- virtual machine_config_constructor device_mconfig_additions() const override;
+ // optional information overrides
+ virtual machine_config_constructor device_mconfig_additions() const override;
- DECLARE_READ8_MEMBER(saa1099_16_r);
- DECLARE_WRITE8_MEMBER(saa1099_1_16_w);
- DECLARE_WRITE8_MEMBER(saa1099_2_16_w);
+ DECLARE_READ8_MEMBER(saa1099_16_r);
+ DECLARE_WRITE8_MEMBER(saa1099_1_16_w);
+ DECLARE_WRITE8_MEMBER(saa1099_2_16_w);
protected:
- // device-level overrides
- virtual void device_start() override;
+ // device-level overrides
+ virtual void device_start() override;
private:
- // internal state
- required_device<saa1099_device> m_saa1099_1;
- required_device<saa1099_device> m_saa1099_2;
-
+ // internal state
+ required_device<saa1099_device> m_saa1099_1;
+ required_device<saa1099_device> m_saa1099_2;
};
class isa8_sblaster1_5_device : public sb8_device
{
public:
- // construction/destruction
- isa8_sblaster1_5_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ // construction/destruction
+ isa8_sblaster1_5_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- // optional information overrides
- virtual machine_config_constructor device_mconfig_additions() const override;
+ // optional information overrides
+ virtual machine_config_constructor device_mconfig_additions() const override;
protected:
- // device-level overrides
- virtual void device_start() override;
+ // device-level overrides
+ virtual void device_start() override;
};
class sb16_device : public sb_device,
public device_isa16_card_interface
{
public:
- // construction/destruction
- sb16_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, const char *name, const char *shortname, const char *source);
- DECLARE_READ8_MEMBER(mpu401_r);
- DECLARE_WRITE8_MEMBER(mpu401_w);
- DECLARE_READ8_MEMBER(mixer_r);
- DECLARE_WRITE8_MEMBER(mixer_w);
- virtual ioport_constructor device_input_ports() const override;
+ DECLARE_READ8_MEMBER(mpu401_r);
+ DECLARE_WRITE8_MEMBER(mpu401_w);
+ DECLARE_READ8_MEMBER(mixer_r);
+ DECLARE_WRITE8_MEMBER(mixer_w);
+ virtual ioport_constructor device_input_ports() const override;
protected:
- virtual void device_start() override;
- virtual uint16_t dack16_r(int line) override;
- virtual uint8_t dack_r(int line) override { return sb_device::dack_r(line); }
- virtual void dack_w(int line, uint8_t data) override { sb_device::dack_w(line, data); }
- virtual void dack16_w(int line, uint16_t data) override;
- virtual void drq16_w(int state) override;
- virtual void drq_w(int state) override;
- virtual void irq_w(int state, int source) override;
- virtual void mixer_reset() override;
- void mixer_set();
- virtual void rcv_complete() override; // Rx completed receiving byte
+ // construction/destruction
+ sb16_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+ virtual void device_start() override;
+ virtual uint16_t dack16_r(int line) override;
+ virtual uint8_t dack_r(int line) override { return sb_device::dack_r(line); }
+ virtual void dack_w(int line, uint8_t data) override { sb_device::dack_w(line, data); }
+ virtual void dack16_w(int line, uint16_t data) override;
+ virtual void drq16_w(int state) override;
+ virtual void drq_w(int state) override;
+ virtual void irq_w(int state, int source) override;
+ virtual void mixer_reset() override;
+ void mixer_set();
+ virtual void rcv_complete() override; // Rx completed receiving byte
private:
- struct sb16_mixer m_mixer;
+ struct sb16_mixer m_mixer;
};
class isa16_sblaster16_device : public sb16_device
{
public:
- // construction/destruction
- isa16_sblaster16_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ // construction/destruction
+ isa16_sblaster16_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- // optional information overrides
- virtual machine_config_constructor device_mconfig_additions() const override;
+ // optional information overrides
+ virtual machine_config_constructor device_mconfig_additions() const override;
protected:
- // device-level overrides
- virtual void device_start() override;
+ // device-level overrides
+ virtual void device_start() override;
};
// device type definition
-extern const device_type ISA8_SOUND_BLASTER_1_0;
-extern const device_type ISA8_SOUND_BLASTER_1_5;
-extern const device_type ISA16_SOUND_BLASTER_16;
+DECLARE_DEVICE_TYPE(ISA8_SOUND_BLASTER_1_0, isa8_sblaster1_0_device)
+DECLARE_DEVICE_TYPE(ISA8_SOUND_BLASTER_1_5, isa8_sblaster1_5_device)
+DECLARE_DEVICE_TYPE(ISA16_SOUND_BLASTER_16, isa16_sblaster16_device)
-#endif /* __ISA_SOUND_BLASTER_H__ */
+#endif // MAME_BUS_ISA_SBLASTER_H