summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/isa/sblaster.h
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2017-05-07 23:18:47 +1000
committer Vas Crabb <vas@vastheman.com>2017-05-14 21:44:11 +1000
commit0f0d39ef81562c75e79176dd3bebb1e491ca39d5 (patch)
tree201cee7fdf55ee800f83859a92efd2cfe66cf2b3 /src/devices/bus/isa/sblaster.h
parente6c4be2b4d71c7a6c95be0bae111eb416ff0f9e7 (diff)
Move static data out of devices into the device types. This is a significant change, so please pay attention.
The core changes are: * Short name, full name and source file are no longer members of device_t, they are part of the device type * MACHINE_COFIG_START no longer needs a driver class * MACHINE_CONFIG_DERIVED_CLASS is no longer necessary * Specify the state class you want in the GAME/COMP/CONS line * The compiler will work out the base class where the driver init member is declared * There is one static device type object per driver rather than one per machine configuration Use DECLARE_DEVICE_TYPE or DECLARE_DEVICE_TYPE_NS to declare device type. * DECLARE_DEVICE_TYPE forward-declares teh device type and class, and declares extern object finders. * DECLARE_DEVICE_TYPE_NS is for devices classes in namespaces - it doesn't forward-declare the device type. Use DEFINE_DEVICE_TYPE or DEFINE_DEVICE_TYPE_NS to define device types. * These macros declare storage for the static data, and instantiate the device type and device finder templates. The rest of the changes are mostly just moving stuff out of headers that shouldn't be there, renaming stuff for consistency, and scoping stuff down where appropriate. Things I've actually messed with substantially: * More descriptive names for a lot of devices * Untangled the fantasy sound from the driver state, which necessitates breaking up sound/flip writes * Changed DECO BSMT2000 ready callback into a device delegate * Untangled Microprose 3D noise from driver state * Used object finders for CoCo multipak, KC85 D002, and Irem sound subdevices * Started to get TI-99 stuff out of the TI-990 directory and arrange bus devices properly * Started to break out common parts of Samsung ARM SoC devices * Turned some of FM, SID, SCSP DSP, EPIC12 and Voodoo cores into something resmbling C++ * Tried to make Z180 table allocation/setup a bit safer * Converted generic keyboard/terminal to not use WRITE8 - space/offset aren't relevant * Dynamically allocate generic terminal buffer so derived devices (e.g. teleprinter) can specify size * Imporved encapsulation of Z80DART channels * Refactored the SPC7110 bit table generator loop to make it more readable * Added wrappers for SNES PPU operations so members can be made protected * Factored out some boilerplate for YM chips with PSG * toaplan2 gfx * stic/intv resolution * Video System video * Out Run/Y-board sprite alignment * GIC video hookup * Amstrad CPC ROM box members * IQ151 ROM cart region * MSX cart IRQ callback resolution time * SMS passthrough control devices starting subslots I've smoke-tested several drivers, but I've probably missed something. Things I've missed will likely blow up spectacularly with failure to bind errors and the like. Let me know if there's more subtle breakage (could have happened in FM or Voodoo). And can everyone please, please try to keep stuff clean. In particular, please stop polluting the global namespace. Keep things out of headers that don't need to be there, and use things that can be scoped down rather than macros. It feels like an uphill battle trying to get this stuff under control while more of it's added.
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