summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/machine/74123.h
blob: 1338c4e825d29e0031716c178aef5bec8738a51f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*****************************************************************************

    74123 monoflop emulator

    There are 2 monoflops per chips.

    Pin out:

              +--------+
          B1  |1 | | 16|  Vcc
          A1 o|2  -  15|  RCext1
      Clear1 o|3     14|  Cext1
    *Output1 o|4     13|  Output1
     Output2  |5     12|o *Output2
       Cext2  |6     11|o Clear2
      RCext2  |7     10|  B2
         GND  |8      9|o A2
              +--------+

    All resistor values in Ohms.
    All capacitor values in Farads.


    Truth table:

    C   A   B | Q  /Q
    ----------|-------
    L   X   X | L   H
    X   H   X | L   H
    X   X   L | L   H
    H   L  _- |_-_ -_-
    H  -_   H |_-_ -_-
    _-  L   H |_-_ -_-
    ------------------
    C   = clear
    L   = LO (0)
    H   = HI (1)
    X   = any state
    _-  = raising edge
    -_  = falling edge
    _-_ = positive pulse
    -_- = negative pulse

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

#pragma once

#ifndef __TTL74123_H__
#define __TTL74123_H__

#include "emu.h"



/***************************************************************************
    DEVICE CONFIGURATION MACROS
***************************************************************************/

#define MCFG_TTL74123_ADD(_tag, _config) \
	MCFG_DEVICE_ADD(_tag, TTL74123, 0) \
	MCFG_DEVICE_CONFIG(_config)

/* constants for the different ways the cap/res can be connected.
   This determines the formula for calculating the pulse width */
#define TTL74123_NOT_GROUNDED_NO_DIODE		(1)
#define TTL74123_NOT_GROUNDED_DIODE			(2)
#define TTL74123_GROUNDED					(3)


/***************************************************************************
    TYPE DEFINITIONS
***************************************************************************/


// ======================> ttl74123_interface

struct ttl74123_interface
{
    int m_connection_type;  /* the hook up type - one of the constants above */
    double m_res;           /* resistor connected to RCext */
    double m_cap;           /* capacitor connected to Cext and RCext */
    int m_a;                /* initial/constant value of the A pin */
    int m_b;                /* initial/constant value of the B pin */
    int m_clear;            /* initial/constant value of the Clear pin */
    write8_device_func  m_output_changed_cb;
};



// ======================> ttl74123_device

class ttl74123_device :  public device_t,
						 public ttl74123_interface
{
public:
    // construction/destruction
    ttl74123_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);

    void a_w(UINT8 data);
    void b_w(UINT8 data);
    void clear_w(UINT8 data);
    void reset_w();

protected:
    // device-level overrides
    virtual void device_config_complete();
    virtual void device_start();
    virtual void device_reset();
    virtual void device_post_load() { }
    virtual void device_clock_changed() { }

    static TIMER_CALLBACK( output_callback );
    static TIMER_CALLBACK( clear_callback );

private:

    int timer_running();
    void start_pulse();
    void output(INT32 param);
    void set_output();
    attotime compute_duration();
    void clear();

    emu_timer *m_timer;
};


// device type definition
extern const device_type TTL74123;



/***************************************************************************
    PROTOTYPES
***************************************************************************/

WRITE8_DEVICE_HANDLER( ttl74123_a_w );
WRITE8_DEVICE_HANDLER( ttl74123_b_w );
WRITE8_DEVICE_HANDLER( ttl74123_clear_w );
WRITE8_DEVICE_HANDLER( ttl74123_reset_w ); /* reset the latch */

#endif