summaryrefslogblamecommitdiffstatshomepage
path: root/src/emu/sound/sn76477.h
blob: c00c2d6ba4a9af2d22a9ce3f91b97e4998bc899e (plain) (tree)


































                                                                               



                     
 
                     
                           








                                                                               
                        


































                                                                               
                                                                                              




                                                  
                                                                                             
                                                                                                   

                                                   








                                                                                                                     

                                                                                    
                                                                                                             

                                                                                                       









                                                                       

                                                   

                                                            
 
                                       
                                                                                                     





















                                                                                                                                 
 
                         
/*****************************************************************************

    Texas Instruments SN76477 emulator

    SN76477 pin layout. There is a corresponding interface variable with the
    same name. The only exception is noise_clock which must be programmatically
    set.  The other pins have programmatic equivalents as well.
    The name of the function is SN76477_<pinname>_w.
    All capacitor functions can also specify a fixed voltage on the cap.
    The name of this function is SN76477_<pinname>_voltage_w

                      +-------------------+
          envelope_1  | 1      | |      28|  envelope_2
                      | 2 GND   -       27|  mixer_c
         noise_clock  | 3               26|  mixer_a
     noise_clock_res  | 4               25|  mixer_b
    noise_filter_res  | 5               24|  one_shot_res
    noise_filter_cap  | 6               23|  one_shot_cap
           decay_res  | 7               22|  vco
    attack_decay_cap  | 8               21|  slf_cap
              enable o| 9               20|  slf_res
          attack_res  |10               19|  pitch_voltage
       amplitude_res  |11               18|  vco_res
        feedback_res  |12               17|  vco_cap
                      |13 OUTPUT        16|  vco_voltage
                      |14 Vcc   +5V OUT 15|
                      +-------------------+

    All resistor values in Ohms
    All capacitor values in Farads
    Use RES_K, RES_M and CAP_U, CAP_N, CAP_P macros in rescap.h to convert
    magnitudes, eg. 220k = RES_K(220), 47nF = CAP_N(47)

 *****************************************************************************/

#pragma once

#ifndef __SN76477_H__
#define __SN76477_H__

#include "devlegcy.h"
#include "machine/rescap.h"



/*****************************************************************************
 *
 *  Interface definition
 *
 *****************************************************************************/

struct sn76477_interface
{
	double noise_clock_res;
	double noise_filter_res;
	double noise_filter_cap;
	double decay_res;
	double attack_decay_cap;
	double attack_res;
	double amplitude_res;
	double feedback_res;
	double vco_voltage;
	double vco_cap;
	double vco_res;
	double pitch_voltage;
	double slf_res;
	double slf_cap;
	double one_shot_cap;
	double one_shot_res;
	UINT32 vco;
	UINT32 mixer_a;
	UINT32 mixer_b;
	UINT32 mixer_c;
	UINT32 envelope_1;
	UINT32 envelope_2;
	UINT32 enable;
};



/*****************************************************************************
 *
 *  Functions to set a pin's value
 *
 *****************************************************************************/

/* these functions take 0 or 1 as a logic input */
WRITE_LINE_DEVICE_HANDLER( sn76477_enable_w );      /* active LO, 0 = enabled, 1 = disabled */
WRITE_LINE_DEVICE_HANDLER( sn76477_mixer_a_w );
WRITE_LINE_DEVICE_HANDLER( sn76477_mixer_b_w );
WRITE_LINE_DEVICE_HANDLER( sn76477_mixer_c_w );
WRITE_LINE_DEVICE_HANDLER( sn76477_envelope_1_w );
WRITE_LINE_DEVICE_HANDLER( sn76477_envelope_2_w );
WRITE_LINE_DEVICE_HANDLER( sn76477_vco_w );         /* 0 = external, 1 = controlled by SLF */
WRITE_LINE_DEVICE_HANDLER( sn76477_noise_clock_w ); /* noise clock write, if noise_clock_res = 0 */

/* these functions take a resistor value in Ohms */
void sn76477_one_shot_res_w(device_t *device, double data);
void sn76477_slf_res_w(device_t *device, double data);
void sn76477_vco_res_w(device_t *device, double data);
void sn76477_noise_clock_res_w(device_t *device, double data);  /* = 0 if the noise gen is clocked via noise_clock */
void sn76477_noise_filter_res_w(device_t *device, double data);
void sn76477_decay_res_w(device_t *device, double data);
void sn76477_attack_res_w(device_t *device, double data);
void sn76477_amplitude_res_w(device_t *device, double data);
void sn76477_feedback_res_w(device_t *device, double data);

/* these functions take a capacitor value in Farads or the voltage on it in Volts */
#define SN76477_EXTERNAL_VOLTAGE_DISCONNECT   (-1.0)    /* indicates that the voltage is internally computed,
                                                           can be used in all the functions that take a
                                                           voltage on a capacitor */
void sn76477_one_shot_cap_w(device_t *device, double data);
void sn76477_one_shot_cap_voltage_w(device_t *device, double data);
void sn76477_slf_cap_w(device_t *device, double data);
void sn76477_slf_cap_voltage_w(device_t *device, double data);
void sn76477_vco_cap_w(device_t *device, double data);
void sn76477_vco_cap_voltage_w(device_t *device, double data);
void sn76477_noise_filter_cap_w(device_t *device, double data);
void sn76477_noise_filter_cap_voltage_w(device_t *device, double data);
void sn76477_attack_decay_cap_w(device_t *device, double data);
void sn76477_attack_decay_cap_voltage_w(device_t *device, double data);

/* these functions take a voltage value in Volts */
void sn76477_vco_voltage_w(device_t *device, double data);
void sn76477_pitch_voltage_w(device_t *device, double data);

class sn76477_device : public device_t,
									public device_sound_interface
{
public:
	sn76477_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
	~sn76477_device() { global_free(m_token); }

	// access to legacy token
	void *token() const { assert(m_token != NULL); return m_token; }
protected:
	// device-level overrides
	virtual void device_config_complete();
	virtual void device_start();
	virtual void device_stop();

	// sound stream update overrides
	virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples);
private:
	// internal state
	void *m_token;
};

extern const device_type SN76477;


#endif/* __SN76477_H__ */