summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/machine/7474.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/machine/7474.c')
-rw-r--r--src/emu/machine/7474.c173
1 files changed, 173 insertions, 0 deletions
diff --git a/src/emu/machine/7474.c b/src/emu/machine/7474.c
new file mode 100644
index 00000000000..700bb7bb879
--- /dev/null
+++ b/src/emu/machine/7474.c
@@ -0,0 +1,173 @@
+/*****************************************************************************
+
+ 7474 positive-edge-triggered D-type flip-flop with preset, clear and
+ complementary outputs. There are 2 flip-flops per chips
+
+
+ Pin layout and functions to access pins:
+
+ clear_w [1] /1CLR VCC [14]
+ d_w [2] 1D /2CLR [13] clear_w
+ clock_w [3] 1CLK 2D [12] d_w
+ preset_w [4] /1PR 2CLK [11] clock_w
+ output_r [5] 1Q /2PR [10] preset_w
+ output_comp_r [6] /1Q 2Q [9] output_r
+ [7] GND /2Q [8] output_comp_r
+
+
+ Truth table (all logic levels indicate the actual voltage on the line):
+
+ INPUTS | OUTPUTS
+ |
+ PR CLR CLK D | Q /Q
+ --------------+-------
+ 1 L H X X | H L
+ 2 H L X X | L H
+ 3 L L X X | H H (Note 1)
+ 4 H H _- X | D /D
+ 5 H H L X | Q0 /Q0
+ --------------+-------
+ L = lo (0)
+ H = hi (1)
+ X = any state
+ _- = raising edge
+ Q0 = previous state
+
+ Note 1: Non-stable configuration
+
+*****************************************************************************/
+
+#include "driver.h"
+#include "7474.h"
+
+
+#define MAX_TTL7474 12
+
+struct TTL7474
+{
+ /* callback */
+ void (*output_cb)(void);
+
+ /* inputs */
+ UINT8 clear; /* pin 1/13 */
+ UINT8 preset; /* pin 4/10 */
+ UINT8 clock; /* pin 3/11 */
+ UINT8 d; /* pin 2/12 */
+
+ /* outputs */
+ UINT8 output; /* pin 5/9 */
+ UINT8 output_comp; /* pin 6/8 */
+
+ /* internal */
+ UINT8 last_clock;
+ UINT8 last_output;
+ UINT8 last_output_comp;
+};
+
+static struct TTL7474 chips[MAX_TTL7474];
+
+
+void TTL7474_update(int which)
+{
+ if (!chips[which].preset && chips[which].clear) /* line 1 in truth table */
+ {
+ chips[which].output = 1;
+ chips[which].output_comp = 0;
+ }
+ else if (chips[which].preset && !chips[which].clear) /* line 2 in truth table */
+ {
+ chips[which].output = 0;
+ chips[which].output_comp = 1;
+ }
+ else if (!chips[which].preset && !chips[which].clear) /* line 3 in truth table */
+ {
+ chips[which].output = 1;
+ chips[which].output_comp = 1;
+ }
+ else if (!chips[which].last_clock && chips[which].clock) /* line 4 in truth table */
+ {
+ chips[which].output = chips[which].d;
+ chips[which].output_comp = !chips[which].d;
+ }
+
+ chips[which].last_clock = chips[which].clock;
+
+
+ /* call callback if any of the outputs changed */
+ if ( chips[which].output_cb &&
+ ((chips[which].output != chips[which].last_output) ||
+ (chips[which].output_comp != chips[which].last_output_comp)))
+ {
+ chips[which].last_output = chips[which].output;
+ chips[which].last_output_comp = chips[which].output_comp;
+
+ chips[which].output_cb();
+ }
+}
+
+
+void TTL7474_clear_w(int which, int data)
+{
+ chips[which].clear = data ? 1 : 0;
+}
+
+void TTL7474_preset_w(int which, int data)
+{
+ chips[which].preset = data ? 1 : 0;
+}
+
+void TTL7474_clock_w(int which, int data)
+{
+ chips[which].clock = data ? 1 : 0;
+}
+
+void TTL7474_d_w(int which, int data)
+{
+ chips[which].d = data ? 1 : 0;
+}
+
+
+int TTL7474_output_r(int which)
+{
+ return chips[which].output;
+}
+
+int TTL7474_output_comp_r(int which)
+{
+ return chips[which].output_comp;
+}
+
+
+void TTL7474_config(int which, const struct TTL7474_interface *intf)
+{
+ struct TTL7474 *chip = &chips[which];
+
+ if (which >= MAX_TTL7474)
+ {
+ logerror("Only %d 7474's are supported at this time.\n", MAX_TTL7474);
+ return;
+ }
+
+
+ chip->output_cb = (intf ? intf->output_cb : 0);
+
+ /* all inputs are open first */
+ chip->clear = 1;
+ chip->preset = 1;
+ chip->clock = 1;
+ chip->d = 1;
+
+ chip->last_clock = 1;
+ chip->last_output = -1;
+ chip->last_output_comp = -1;
+
+ state_save_register_item("ttl7474", which, chip->clear);
+ state_save_register_item("ttl7474", which, chip->preset);
+ state_save_register_item("ttl7474", which, chip->clock);
+ state_save_register_item("ttl7474", which, chip->d);
+ state_save_register_item("ttl7474", which, chip->output);
+ state_save_register_item("ttl7474", which, chip->output_comp);
+ state_save_register_item("ttl7474", which, chip->last_clock);
+ state_save_register_item("ttl7474", which, chip->last_output);
+ state_save_register_item("ttl7474", which, chip->last_output_comp);
+}