summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--.gitattributes1
-rw-r--r--nl_examples/74123_mstable.c10
-rw-r--r--nl_examples/breakout.c1460
-rw-r--r--src/emu/netlist/analog/nld_solver.c70
-rw-r--r--src/emu/netlist/analog/nld_solver.h10
-rw-r--r--src/emu/netlist/devices/nld_74123.c31
-rw-r--r--src/emu/netlist/devices/nld_74123.h8
-rw-r--r--src/emu/netlist/nl_base.c2
-rw-r--r--src/emu/netlist/nl_base.h2
9 files changed, 1564 insertions, 30 deletions
diff --git a/.gitattributes b/.gitattributes
index 302d173a64d..9b829145cf7 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -368,6 +368,7 @@ nl_examples/74123_mstable.c svneol=native#text/plain
nl_examples/bjt.c svneol=native#text/plain
nl_examples/bjt_eb.c svneol=native#text/plain
nl_examples/bjt_eb_pnp.c svneol=native#text/plain
+nl_examples/breakout.c svneol=native#text/plain
nl_examples/cd4066.c svneol=native#text/plain
nl_examples/msx_mixer_stage.c svneol=native#text/plain
nl_examples/ne555_astable.c svneol=native#text/plain
diff --git a/nl_examples/74123_mstable.c b/nl_examples/74123_mstable.c
index 1cdd296e99a..ddb8955e033 100644
--- a/nl_examples/74123_mstable.c
+++ b/nl_examples/74123_mstable.c
@@ -20,10 +20,10 @@ NETLIST_START(74123_mstable)
/* Wiring up the 74123 */
- CLOCK(clk, 500)
+ CLOCK(clk, 50)
TTL_74123(mf)
- RES(R, 1000)
+ RES(R, 10000)
CAP(C, 1e-6)
NET_C(GND, mf.GND)
@@ -38,8 +38,8 @@ NETLIST_START(74123_mstable)
NET_C(mf.B, V5)
NET_C(mf.A, clk.Q)
- //LOG(logC, C.2)
- //LOG(logQ, mf.Q)
- //LOG(logX, clk.Q)
+ LOG(logC, C.2)
+ LOG(logQ, mf.Q)
+ LOG(logX, clk.Q)
NETLIST_END()
diff --git a/nl_examples/breakout.c b/nl_examples/breakout.c
new file mode 100644
index 00000000000..bd86132e9fe
--- /dev/null
+++ b/nl_examples/breakout.c
@@ -0,0 +1,1460 @@
+#include "netlist/nl_dice_compat.h"
+#include "netlist/devices/net_lib.h"
+#include "netlist/analog/nld_twoterm.h"
+
+//2 555 timers
+static Astable555Desc b2_555_desc(OHM(560.0), M_OHM(1.8), U_FARAD(0.1));
+
+static Mono555Desc c9_555_desc(OHM(47.0), U_FARAD(1.0)); // R33, C21
+
+//check these values
+//static Paddle1HorizontalDesc pad1_desc(15047.0, 47.0, &c9_555_desc);
+
+static CapacitorDesc c32_desc(U_FARAD(0.1));
+static CapacitorDesc c36_desc(N_FARAD(1.0)); //0.001uF = 1nF
+static CapacitorDesc c37_desc(P_FARAD(330.0));
+static BufferDesc pad_en_buf_desc(DELAY_NS(15.0), DELAY_NS(15.0)); // Prevents 12ns glitch on PAD_EN_n signal from resetting C9. TODO: is this accurate?
+
+#if 0
+static VIDEO_DESC( breakout )
+ VIDEO_RESISTANCE(1, K_OHM(0.0))
+ VIDEO_RESISTANCE(2, K_OHM(3.9))
+ VIDEO_RESISTANCE(3, K_OHM(3.9))
+ VIDEO_RESISTANCE(4, K_OHM(3.9))
+ VIDEO_RESISTANCE(5, K_OHM(3.9))
+ VIDEO_RESISTANCE(6, K_OHM(3.9))
+ //VIDEO_RESISTANCE(Video::HBLANK_PIN, K_OHM(0.0))
+ VIDEO_ORIENTATION(ROTATE_90)
+ VIDEO_CONTRAST(4.0)
+
+ // Values guessed based on screenshots. TODO: Make more accurate
+ // X, Y, W, H, R, G, B
+ VIDEO_OVERLAY( 15.570e-6, 0.0, 1.911e-6, -1.0, 0.80, 0.15, 0.05 ) // Red Bricks
+ VIDEO_OVERLAY( 17.481e-6, 0.0, 1.956e-6, -1.0, 0.95, 0.65, 0.05 ) // Amber Bricks
+ VIDEO_OVERLAY( 19.437e-6, 0.0, 1.956e-6, -1.0, 0.05, 0.65, 0.25 ) // Green Bricks
+ VIDEO_OVERLAY( 21.393e-6, 0.0, 1.955e-6, -1.0, 0.95, 0.95, 0.20 ) // Yellow Bricks
+ VIDEO_OVERLAY( 51.345e-6, 0.0, 1.956e-6, -1.0, 0.05, 0.65, 0.95 ) // Blue Paddle
+
+ // TODO: Different overlays for cocktail cabinet
+VIDEO_DESC_END
+
+static AUDIO_DESC( breakout )
+ AUDIO_RESISTANCE(1, K_OHM(47.0))
+ AUDIO_RESISTANCE(2, K_OHM(47.0))
+ AUDIO_RESISTANCE(3, K_OHM(47.0))
+ AUDIO_RESISTANCE(4, K_OHM(47.0))
+ AUDIO_GAIN(3.0)
+VIDEO_DESC_END
+#endif
+
+
+static Mono9602Desc n8_desc(K_OHM(33.0), U_FARAD(100.0), K_OHM(5.6), P_FARAD(0.0)); // No capacitor on 2nd 9602.
+static Mono9602Desc f3_desc(K_OHM(47.0), U_FARAD(1.0), K_OHM(47.0), U_FARAD(1.0));
+
+static Mono9602Desc a7_desc(K_OHM(68.0), U_FARAD(1.0), K_OHM(22.0), U_FARAD(10.0));
+static Mono9602Desc a8_desc(K_OHM(27.0), U_FARAD(1.0), K_OHM(27.0), U_FARAD(1.0));
+
+static Dipswitch53137Desc dipswitch1_desc("bonus_credit", "Bonus Credit", 3, "None", "100", "200", "300", "400", "500", "600", "700", "800");
+//static DipswitchDesc dipswitch2_desc("cabinet_type", "Cabinet Type", 0, "Normal", "Cocktail");
+//static DipswitchDesc dipswitch3_desc("coinage", "Coinage", 0, "1 Coin / 1 Credit", "1 Coin / 2 Credits");
+//static DipswitchDesc dipswitch4_desc("ball_count", "Ball Count", 0, "3", "5");
+
+CIRCUIT_LAYOUT( breakout )
+ CHIP("S1", 53137, &dipswitch1_desc)
+ CHIP("S2", DIPSWITCH, &dipswitch2_desc)
+ CHIP("S3", DIPSWITCH, &dipswitch3_desc)
+ CHIP("S4", DIPSWITCH, &dipswitch4_desc)
+
+ SOLVER(Solver, 48000)
+ PARAM(Solver.ACCURACY, 1e-7) // works and is sufficient
+ //CHIP("CLOCK", CLOCK_14_318_MHZ)
+ MAINCLOCK(Y1, 14318000.0)
+
+ ANALOG_INPUT(V5, 5)
+#define VCC "V5", Q
+#define GND "GND", Q
+
+ //CHIP("Y1", CLOCK_14_318_MHZ) //Y1
+
+ CHIP("C32", CAPACITOR, &c32_desc)
+ CHIP("C36", CAPACITOR, &c36_desc)
+ CHIP("C37", CAPACITOR, &c37_desc)
+ CHIP("PAD_EN_BUF", BUFFER, &pad_en_buf_desc)
+
+ CHIP("A3", 7474)
+ CHIP("A4", 7408)
+ CHIP("A5", 7400)
+ CHIP("A6", 7474)
+ CHIP("A7", 9602, &a7_desc)
+ CHIP("A8", 9602, &a8_desc)
+
+ CHIP("B2", 555_Astable, &b2_555_desc)
+ CHIP("B3", 7402)
+ CHIP("B4", 9316)
+ CHIP("B5", 74193)
+ CHIP("B6", 7400)
+ CHIP("B7", 9316)
+ CHIP("B8", 9316)
+ CHIP("B9", 7408)
+
+ CHIP("C2", 7400)
+ CHIP("C3", 7400)
+ CHIP("C4", 7486)
+ CHIP("C5", 7404)
+ CHIP("C6", 7486)
+ CHIP("C7", 9316)
+ CHIP("C8", 9316)
+ CHIP("C9", 555_Mono, &c9_555_desc)
+
+ CHIP("D2", 7432)
+ CHIP("D3", 7474)
+ CHIP("D4", 9316)
+ CHIP("D5", 7474)
+ CHIP("D6", 7408)
+ CHIP("D7", 7411)
+ CHIP("D8", 7400)
+// CHIP("D9", 4016) //quad bilateral switch
+
+ CHIP("E1", 7404)
+ CHIP("E2", 7486)
+ CHIP("E3", 7402)
+ CHIP("E4", 7432)
+ CHIP("E5", 7408)
+ CHIP("E6", 7474)
+ CHIP("E7", 7402)
+ CHIP("E8", 7474)
+ CHIP("E9", 7404)
+
+ CHIP("F1", 9316)
+ CHIP("F2", 7411)
+ CHIP("F3", 9602, &f3_desc)
+ CHIP("F4", 7474)
+ CHIP("F5", 7474)
+ CHIP("F6", 74193)
+ CHIP("F7", 74279)
+ CHIP("F8", 7474)
+ CHIP("F9", 7404)
+
+ CHIP("H1", 7437)
+ CHIP("H2", 7408)
+ CHIP("H3", 7427)
+ CHIP("H4", 7400)
+ CHIP("H5", 9312)
+ CHIP("H6", 9310)
+ CHIP("H7", 7408) //sometimes looks like N7 on schematic
+ CHIP("H8", 7474)
+ CHIP("H9", 7474)
+
+ CHIP("J1", 74175)
+ CHIP("J2", 7404)
+ CHIP("J3", 7402)
+ CHIP("J4", 9312)
+ CHIP("J5", 7448)
+ CHIP("J6", 9310)
+ CHIP("J7", 7420)
+ CHIP("J8", 74279)
+ CHIP("J9", 7410)
+
+ CHIP("K1", 9316)
+ CHIP("K2", 7486)
+ CHIP("K3", 7430)
+ CHIP("K4", 7408)
+ CHIP("K5", 9312)
+ CHIP("K6", 9310)
+ CHIP("K7", 7486)
+ CHIP("K8", 7474) //TODO: one more than bom?
+ CHIP("K9", 74107)
+
+ CHIP("L1", 9316)
+ CHIP("L2", 7486)
+ CHIP("L3", 82S16) //RAM
+ CHIP("L4", 7411)
+ CHIP("L5", 9312)
+ CHIP("L6", 9310)
+ CHIP("L7", 7486)
+ CHIP("L8", 74193)
+ CHIP("L9", 7400) //TODO: 1 more chip than on bom?
+
+ CHIP("M1", 9316)
+ CHIP("M2", 7483)
+ CHIP("M3", 7486)
+ CHIP("M4", 7410)
+ CHIP("M5", 9312)
+ CHIP("M6", 9310)
+ CHIP("M8", 7427)
+ CHIP("M9", 7404)
+
+ CHIP("N1", 9316)
+ CHIP("N2", 7483)
+ CHIP("N3", 7486)
+ CHIP("N4", 7411)
+ CHIP("N5", 9312)
+ CHIP("N6", 9310)
+ CHIP("N7", 7408) //sometimes looks like H7 on schematic
+ CHIP("N8", 9602, &n8_desc)
+ CHIP("N9", 74192)
+
+ //LM380 //speaker amplifier
+ //LM323 //regulator
+
+// CHIP("CREDIT_LIGHT1", LAMP)
+// CHIP("CREDIT_LIGHT2", LAMP)
+// CHIP("SERVE_LIGHT", LAMP)
+
+ CHIP("PAD1", PADDLE1_HORIZONTAL_INPUT, &pad1_desc)
+ PADDLE_CONNECTION("PAD1", "C9")
+
+ CHIP("LATCH", LATCH)
+ CHIP("COIN1", COIN_INPUT)
+
+ //CHIP("COIN2", COIN_INPUT)
+
+ CHIP("START", START_INPUT)
+
+ CHIP("SERVE", BUTTONS1_INPUT)
+
+ //TODO: coin2 and start 2
+
+ VIDEO(breakout)
+ AUDIO(breakout)
+
+#ifdef DEBUG
+ CHIP("LOG1", VCD_LOG, &vcd_log_desc)
+#endif
+
+ //HSYNC and VSYNC
+ #define H1_d "L1", 14
+ #define H2_d "L1", 13
+ #define H4_d "L1", 12
+ #define H8_d "L1", 11
+ #define H8_n "J2", 2
+ #define H16_d "K1", 14
+ #define H16_n "J2", 6
+ #define H32_d "K1", 13
+ #define H32_n "J2", 4
+ #define H64_d "K1", 12
+ #define H128_d "K1", 11
+
+ #define V1_d "M1", 14
+ #define V2_d "M1", 13
+ #define V4_d "M1", 12
+ #define V8_d "M1", 11
+ #define V16_d "N1", 14
+ #define V16_n "J2", 10
+ #define V32_d "N1", 13
+ #define V64_d "N1", 12
+ #define V64I "H7", 11
+ #define V64_n "M9", 10
+ #define V128_d "N1", 11
+
+ #define H1 "L2", 8
+ #define H2 "L2", 11
+ #define H4 "L2", 3
+ #define H8 "L2", 6
+ #define H16 "K2", 8
+ #define H32 "K2", 11
+ #define H64 "K2", 3
+ #define H128 "K2", 6
+
+ //#define V1
+ #define V2 "M3", 3
+ #define V4 "M3", 6
+ #define V8 "M3", 11
+ #define V16 "N3", 8
+ #define V32 "N3", 3
+ #define V64 "N3", 6
+ #define V128 "N3", 11
+
+ #define HSYNC "J1", 2
+ #define HSYNC_n "J1", 3
+ #define VSYNC "J1", 7
+ #define VSYNC_n "J1", 6
+ #define PSYNC "J1", 11
+ #define PSYNC_n "J1", 10
+ #define BSYNC "J1", 15
+ #define BSYNC_n "J1", 14
+
+ #define BALL "D7", 6
+ #define BALL_DISPLAY "A4", 6
+ #define PLAYFIELD "H4", 3
+ #define SCORE "D3", 5
+ #define VERT_TRIG_n "H1", 8
+
+ #define CLOCK "H1", 11
+ #define SCLOCK "K1", 15
+ #define CKBH "F1", 13
+
+ #define PAD_n "K3", 8
+ #define PAD_EN_n "C2", 8
+
+ //#define P VCC
+ #define P "V5", Q
+
+ #define COIN "L9", 6
+ #define COIN1_n "F8", 5
+ #define COIN2_n "H9", 5
+ #define CREDIT_1_OR_2 "L9", 3
+ #define CREDIT_1_OR_2_n "F9", 8
+ #define CREDIT2 "F9", 6
+ #define CREDIT2_n "M8", 8
+ #define CR_START1 "E8", 5
+ #define CR_START1_n "E8", 6 //Schematic shows E8.6 as positive CR_START1, but this can't be right?
+ #define CR_START2 "E8", 9
+ #define CR_START2_n "E8", 8
+ #define CSW1 "F9", 12
+ #define CSW2 "F9", 2
+
+ #define P2_CONDITIONAL "H1", 3
+ #define P2_CONDITIONAL_dash "H7", 8
+ #define PLAYER_2 "B4", 14
+ #define PLAYER_2_n "M9", 8
+
+ #define START_GAME "D8", 6
+ #define START_GAME1_n "M9", 4
+ #define START_GAME_n "M9", 6
+
+ #define BG1_n "K8", 9
+ #define BG1 "K8", 8
+ #define BG2_n "K8", 5
+ #define BG2 "K8", 6
+
+ #define FREE_GAME_TONE "N7", 3
+ #define BONUS_COIN "L9", 11
+
+ //#define Q "E9", 6
+ #define LAT_Q "E9", 6
+ #define Q_n "LATCH", 3
+ #define SBD_n "D2", 11
+
+ #define PLAY_CP "D2", 8
+ #define PLGM2_n "F7", 7
+ #define VB_HIT_n "A5", 6
+
+ #define SERVE_n "SERVE", 1
+ #define SERVE_WAIT "A3", 9
+ #define SERVE_WAIT_n "A3", 8
+
+ #define BRICK_DISPLAY "E3", 1
+ #define BRICK_HIT "E6", 5
+ #define BRICK_HIT_n "E6", 6
+
+ //#define EGL "A4", 3
+ #define EGL "C37" , 2
+ #define EGL_n "C5", 2
+
+ #define RAM_PLAYER1 "E7", 4
+ #define A1 "H6", 14
+ #define B1 "H6", 13
+ #define C1 "H6", 12
+ #define D1 "H6", 11
+ #define E1 "J6", 14
+ #define F1 "J6", 13
+ #define G1 "J6", 12
+ #define H01 "J6", 11
+ #define I1 "K6", 14
+ #define J1 "K6", 13
+ #define K1 "K6", 12
+ #define L1 "K6", 11
+ #define A2 "N6", 14
+ #define B2 "N6", 13
+ #define C2 "N6", 12
+ #define D2 "N6", 11
+ #define E2 "M6", 14
+ #define F2 "M6", 13
+ #define G2 "M6", 12
+ #define H02 "M6", 11 //TODO: better name for these signals
+ #define I2 "L6", 14
+ #define J2 "L6", 13
+ #define K2 "L6", 12
+ #define L2 "L6", 11
+
+ #define CX0 "C6", 11
+ #define CX1 "C6", 6
+ #define X0 "C5", 10
+ #define X1 "B6", 3
+ #define X2 "C6", 3
+ #define Y0 "B6", 11
+ #define Y1 "B6", 6
+ #define Y2 "A6", 6
+ #define DN "C4", 3
+ #define PC "D4", 12
+ #define PD "D4", 11
+ #define SU_n "D5", 8
+ #define V_SLOW "C5", 8
+
+ #define PLNR "E3", 4
+ #define SCI_n "H4", 6
+ #define SFL_n "E9", 12 //score flash
+ #define TOP_n "E9", 2
+
+ #define BP_HIT_n "A5", 8
+ #define BTB_HIT_n "C3", 3
+
+ #define SET_BRICKS "D3", 9
+ #define SET_BRICKS_n "D3", 8
+
+ #define BALL_A "B4", 13
+ #define BALL_B "B4", 12
+ #define BALL_C "B4", 11
+
+ #define FPD1 "F3", 10
+ #define FPD1_n "F3", 9
+ #define FPD2 "F3", 6
+ #define FPD2_n "F3", 7
+
+ #define COUNT "N7", 11
+ #define COUNT_1 "N7", 8
+ #define COUNT_2 "N7", 6
+
+ #define ATTRACT "E6", 8
+ #define ATTRACT_n "E6", 9
+
+ #define BRICK_SOUND "B8", 14
+ #define P_HIT_SOUND "B7", 12
+ #define VB_HIT_SOUND "B7", 11
+
+ #define LH_SIDE "J3", 13
+ #define RH_SIDE "H2", 3
+ #define TOP_BOUND "K4", 6
+
+// CONNECTION(CREDIT_1_OR_2, "CREDIT_LIGHT1", 1)
+// CONNECTION(CREDIT2, "CREDIT_LIGHT2", 1)
+// CONNECTION(SERVE_WAIT_n, "SERVE_LIGHT", 1)
+
+ //Audio
+ CONNECTION("M9", 2, "F6", 5)
+ CONNECTION("M9", 2, "F7", 15)
+ CONNECTION("F6", 13, "F7", 14)
+ CONNECTION(START_GAME_n, "F6", 11)
+ CONNECTION(P, "F6", 15)
+ CONNECTION(P, "F6", 1)
+ CONNECTION(P, "F6", 10)
+ CONNECTION(P, "F6", 9)
+ CONNECTION(GND, "F6", 14)
+ CONNECTION("F7", 13, "J9", 2)
+ CONNECTION(VSYNC, "J9", 1)
+ CONNECTION("A7", 9, "J9", 13)
+ CONNECTION("J9", 12, "F6", 4)
+ CONNECTION("J9", 12, "A7", 11)
+ CONNECTION(GND, "A7", 12)
+ CONNECTION(ATTRACT_n, "A7", 13)
+ CONNECTION("J9", 12, "A8", 11)
+ CONNECTION(GND, "A8", 12)
+ CONNECTION(ATTRACT_n, "A8", 13)
+ CONNECTION(VB_HIT_n, "A7", 5)
+ CONNECTION(GND, "A7", 4)
+ CONNECTION(ATTRACT_n, "A7", 3)
+ CONNECTION(BP_HIT_n, "A8", 5)
+ CONNECTION(GND, "A8", 4)
+ CONNECTION(ATTRACT_n, "A8", 3)
+ CONNECTION("A8", 6, "B9", 13)
+ CONNECTION(P_HIT_SOUND, "B9", 12)
+ CONNECTION("A8", 10, "B9", 10)
+ CONNECTION(BRICK_SOUND, "B9", 9)
+ CONNECTION("A7", 6, "B9", 4)
+ CONNECTION(VB_HIT_SOUND, "B9", 5)
+
+ CONNECTION(GND, "S1", 1)
+ CONNECTION(P, "S1", 2)
+ CONNECTION(GND, "S1", 4)
+ CONNECTION(P, "S1", 3)
+ CONNECTION(GND, "S1", 12)
+ CONNECTION(P, "S1", 11)
+ CONNECTION(GND, "S1", 9)
+ CONNECTION(P, "S1", 10)
+
+ //Free Game Selector
+ CONNECTION(I1, "K7", 2)
+ CONNECTION("S1", 15, "K7", 1)
+ CONNECTION(J1, "K7", 12)
+ CONNECTION("S1", 14, "K7", 13)
+ CONNECTION(K1, "K7", 5)
+ CONNECTION("S1", 6, "K7", 4)
+ CONNECTION(L1, "K7", 9)
+ CONNECTION("S1", 7, "K7", 10)
+
+ CONNECTION(I2, "L7", 2)
+ CONNECTION("S1", 15, "L7", 1)
+ CONNECTION(J2, "L7", 12)
+ CONNECTION("S1", 14, "L7", 13)
+ CONNECTION(K2, "L7", 5)
+ CONNECTION("S1", 6, "L7", 4)
+ CONNECTION(L2, "L7", 9)
+ CONNECTION("S1", 7, "L7", 10)
+
+
+ CONNECTION("K7", 3, "J7", 13)
+ CONNECTION("K7", 11, "J7", 12)
+ CONNECTION("K7", 6, "J7", 10)
+ CONNECTION("K7", 8, "J7", 9)
+
+ CONNECTION("L7", 3, "J7", 1)
+ CONNECTION("L7", 11, "J7", 2)
+ CONNECTION("L7", 6, "J7", 4)
+ CONNECTION("L7", 8, "J7", 5)
+
+ CONNECTION(START_GAME1_n, "J8", 12)
+ CONNECTION(BG1_n, "J8", 11)
+ CONNECTION("J7", 8, "J8", 10)
+
+ CONNECTION(START_GAME1_n, "J8", 2)
+ CONNECTION(BG2_n, "J8", 3)
+ CONNECTION("J7", 6, "J8", 1)
+
+ CONNECTION("J8", 9, "K8", 12)
+ CONNECTION(EGL, "K8", 11)
+ CONNECTION(P, "K8", 13)
+ CONNECTION(LAT_Q, "K8", 10)
+
+ CONNECTION("J8", 4, "K8", 2)
+ CONNECTION(EGL, "K8", 3)
+ CONNECTION(P, "K8", 1)
+ CONNECTION(LAT_Q, "K8", 4)
+
+ CONNECTION(P, "K9", 8)
+ CONNECTION("J8", 9, "K9", 9)
+ CONNECTION(GND, "K9", 11)
+ CONNECTION(HSYNC_n, "K9", 10)
+
+ CONNECTION(P, "K9", 1)
+ CONNECTION("J8", 4, "K9", 12)
+ CONNECTION(GND, "K9", 4)
+ CONNECTION(HSYNC_n, "K9", 13)
+
+ CONNECTION("K9", 6, "L9", 12)
+ CONNECTION("K9", 2, "L9", 13)
+
+ CONNECTION(P, "N8", 5)
+ CONNECTION(BONUS_COIN, "N8", 4)
+ CONNECTION(ATTRACT_n, "N8", 3)
+
+ CONNECTION(V4_d, "N7", 2)
+ CONNECTION("N8", 6, "N7", 1)
+ //
+ CONNECTION(GND, "M2", 13)
+ CONNECTION(V1_d, "M2", 10)
+ CONNECTION(V2_d, "M2", 8)
+ CONNECTION(V4_d, "M2", 3)
+ CONNECTION(V8_d, "M2", 1)
+ CONNECTION(GND, "M2", 11)
+ CONNECTION(P2_CONDITIONAL, "M2", 7)
+ CONNECTION(GND, "M2", 4)
+ CONNECTION(GND, "M2", 16)
+
+ CONNECTION("M2", 14, "N2", 13)
+ CONNECTION(V16_d, "N2", 10)
+ CONNECTION(V32_d, "N2", 8)
+ CONNECTION(V64_d, "N2", 3)
+ CONNECTION(V128_d, "N2", 1)
+ CONNECTION(GND, "N2", 11)
+ CONNECTION(P2_CONDITIONAL, "N2", 7)
+ CONNECTION(GND, "N2", 4)
+ CONNECTION(GND, "N2", 16)
+
+ CONNECTION("M2", 6, "M3", 2)
+ CONNECTION(P2_CONDITIONAL, "M3", 1)
+ CONNECTION("M2", 2, "M3", 5)
+ CONNECTION(P2_CONDITIONAL, "M3", 4)
+ CONNECTION("M2", 15, "M3", 12)
+ CONNECTION(P2_CONDITIONAL, "M3", 13)
+
+ CONNECTION(P2_CONDITIONAL, "N3", 10)
+ CONNECTION("N2", 9, "N3", 9)
+ CONNECTION(P2_CONDITIONAL, "N3", 1)
+ CONNECTION("N2", 6, "N3", 2)
+ CONNECTION(P2_CONDITIONAL, "N3", 4)
+ CONNECTION("N2", 2, "N3", 5)
+ CONNECTION(P2_CONDITIONAL, "N3", 13)
+ CONNECTION("N2", 15, "N3", 12)
+
+ CONNECTION(H1_d, "L2", 9)
+ CONNECTION(P2_CONDITIONAL, "L2", 10)
+ CONNECTION(H2_d, "L2", 12)
+ CONNECTION(P2_CONDITIONAL, "L2", 13)
+ CONNECTION(H4_d, "L2", 2)
+ CONNECTION(P2_CONDITIONAL, "L2", 1)
+ CONNECTION(H8_d, "L2", 5)
+ CONNECTION(P2_CONDITIONAL, "L2", 4)
+
+ CONNECTION(P2_CONDITIONAL, "K2", 10)
+ CONNECTION(H16_d, "K2", 9)
+ CONNECTION(P2_CONDITIONAL, "K2", 13)
+ CONNECTION(H32_d, "K2", 12)
+ CONNECTION(P2_CONDITIONAL, "K2", 1)
+ CONNECTION(H64_d, "K2", 2)
+ CONNECTION(P2_CONDITIONAL, "K2", 4)
+ CONNECTION(H128_d, "K2", 5)
+
+
+ CONNECTION(V64, "M9", 11)
+ CONNECTION(H16, "J2", 5)
+ CONNECTION(H32, "J2", 3)
+ CONNECTION(V16, "J2", 11)
+ CONNECTION(H8, "J2", 1)
+
+ CONNECTION(CLOCK, "J1", 9)
+ CONNECTION(SCLOCK, "J1", 4)
+ CONNECTION("N4", 6, "J1", 5)
+ CONNECTION(PAD_n, "J1", 12)
+ CONNECTION(BALL_DISPLAY, "J1", 13)
+ CONNECTION(P, "J1", 1)
+
+ CONNECTION(P, "K1", 1)
+ CONNECTION(P, "K1", 3)
+ CONNECTION(P, "K1", 4)
+ CONNECTION(P, "K1", 5)
+ CONNECTION(P, "K1", 6)
+ CONNECTION(P, "K1", 9)
+ CONNECTION(P, "K1", 10)
+ CONNECTION(CLOCK, "K1", 2)
+ CONNECTION("L1", 15, "K1", 7)
+
+ CONNECTION(P, "L1", 1)
+ CONNECTION(P, "L1", 3)
+ CONNECTION(GND, "L1", 4)
+ CONNECTION(P, "L1", 5)
+ CONNECTION(GND, "L1", 6)
+ CONNECTION(VERT_TRIG_n, "L1", 9)
+ CONNECTION(P, "L1", 10)
+ CONNECTION(CLOCK, "L1", 2)
+ CONNECTION(P, "L1", 7)
+
+ CONNECTION(P, "N1", 1)
+ CONNECTION(P, "N1", 10)
+ CONNECTION(P, "N1", 3)
+ CONNECTION(P, "N1", 4)
+ CONNECTION(P, "N1", 5)
+ CONNECTION(P, "N1", 6)
+ CONNECTION(P, "N1", 9)
+ CONNECTION(CLOCK, "N1", 2)
+ CONNECTION("H2", 6, "N1", 7)
+
+ CONNECTION("M1", 15, "H2", 5)
+ CONNECTION("L1", 15, "H2", 4)
+
+ CONNECTION(V128_d, "N4", 5)
+ CONNECTION(V64_d, "N4", 3)
+ CONNECTION(V32_d, "N4", 4)
+ CONNECTION("N4", 6, "H1", 10)
+ CONNECTION(VSYNC_n, "H1", 9)
+
+ CONNECTION(P, "M1", 1)
+ CONNECTION(GND, "M1", 3)
+ CONNECTION(GND, "M1", 4)
+ CONNECTION(P, "M1", 5)
+ CONNECTION(GND, "M1", 6)
+ CONNECTION(VERT_TRIG_n, "M1", 9)
+ CONNECTION(CLOCK, "M1", 2)
+ CONNECTION("L1", 15, "M1", 7)
+ CONNECTION("K1", 15, "M1", 10)
+
+
+ //9312 circuit
+ CONNECTION(PLAYER_2, "M9", 9)
+ CONNECTION(BALL_A, "C5", 5)
+ CONNECTION(BALL_A, "C4", 13)
+ CONNECTION(BALL_B, "C4", 12)
+ CONNECTION(BALL_A, "A4", 13)
+ CONNECTION(BALL_B, "A4", 12)
+ CONNECTION(BALL_C, "C4", 10)
+ CONNECTION("A4", 11, "C4", 9)
+
+ CONNECTION(A2, "N5", 1)
+ CONNECTION(E2, "N5", 2)
+ CONNECTION(I2, "N5", 3)
+ CONNECTION("C5", 6, "N5", 4)
+ CONNECTION(A1, "N5", 5)
+ CONNECTION(E1, "N5", 6)
+ CONNECTION(I1, "N5", 7)
+ CONNECTION(PLAYER_2_n, "N5", 9)
+ CONNECTION(H32_n, "N5", 10)
+ CONNECTION(V16, "N5", 11)
+ CONNECTION(V64, "N5", 12)
+ CONNECTION(V128, "N5", 13)
+
+ CONNECTION(B2, "M5", 1)
+ CONNECTION(F2, "M5", 2)
+ CONNECTION(J2, "M5", 3)
+ CONNECTION("C4", 11, "M5", 4)
+ CONNECTION(B1, "M5", 5)
+ CONNECTION(F1, "M5", 6)
+ CONNECTION(J1, "M5", 7)
+ CONNECTION(PLAYER_2, "M5", 9)
+ CONNECTION(H32_n, "M5", 10)
+ CONNECTION(V16, "M5", 11)
+ CONNECTION(V64, "M5", 12)
+ CONNECTION(V128, "M5", 13)
+
+ CONNECTION(C2, "L5", 1)
+ CONNECTION(G2, "L5", 2)
+ CONNECTION(K2, "L5", 3)
+ CONNECTION("C4", 8, "L5", 4)
+ CONNECTION(C1, "L5", 5)
+ CONNECTION(G1, "L5", 6)
+ CONNECTION(K1, "L5", 7)
+ CONNECTION(GND, "L5", 9)
+ CONNECTION(H32_n, "L5", 10)
+ CONNECTION(V16, "L5", 11)
+ CONNECTION(V64, "L5", 12)
+ CONNECTION(V128, "L5", 13)
+
+ CONNECTION(D2, "K5", 1)
+ CONNECTION(H02, "K5", 2)
+ CONNECTION(L2, "K5", 3)
+ CONNECTION(GND, "K5", 4)
+ CONNECTION(D1, "K5", 5)
+ CONNECTION(H01, "K5", 6)
+ CONNECTION(L1, "K5", 7)
+ CONNECTION(GND, "K5", 9)
+ CONNECTION(H32_n, "K5", 10)
+ CONNECTION(V16, "K5", 11)
+ CONNECTION(V64, "K5", 12)
+ CONNECTION(V128, "K5", 13)
+
+ CONNECTION(P, "J5", 4)
+ CONNECTION(P, "J5", 3)
+ CONNECTION("N5", 15, "J5", 7)
+ CONNECTION("M5", 15, "J5", 1)
+ CONNECTION("L5", 15, "J5", 2)
+ CONNECTION("K5", 15, "J5", 6)
+ CONNECTION(H32, "J5", 5)
+
+ CONNECTION("J5", 13, "H5", 1)
+ CONNECTION(GND, "H5", 2)
+ CONNECTION(GND, "H5", 3)
+ CONNECTION("J5", 14, "H5", 4)
+ CONNECTION(GND, "H5", 5)
+ CONNECTION(GND, "H5", 6)
+ CONNECTION("J5", 10, "H5", 7)
+ CONNECTION(GND, "H5", 9)
+
+ CONNECTION(V4, "K4", 12)
+ CONNECTION(V8, "K4", 13)
+
+ CONNECTION("K4", 11, "H5", 10)
+ CONNECTION(H2, "H5", 11)
+ CONNECTION(H4, "H5", 12)
+ CONNECTION(H8, "H5", 13)
+
+ CONNECTION(H2, "L4", 3)
+ CONNECTION(H4, "L4", 5)
+ CONNECTION(H8, "L4", 4)
+
+ CONNECTION("J5", 12 , "J4", 1)
+ CONNECTION("J5", 11, "J4", 2)
+ CONNECTION(GND, "J4", 3)
+ CONNECTION(GND, "J4", 4)
+ CONNECTION("J5", 15, "J4", 5)
+ CONNECTION("J5", 9, "J4", 6)
+ CONNECTION(GND, "J4", 7)
+ CONNECTION(GND, "J4", 9)
+ CONNECTION("L4", 6, "J4", 10)
+ CONNECTION(H8, "J4", 11)
+ CONNECTION(V4, "J4", 12)
+ CONNECTION(V8, "J4", 13)
+
+ CONNECTION("H5", 14, "H4", 13)
+ CONNECTION("J4", 14, "H4", 12)
+
+ //PADDLES
+ CONNECTION(ATTRACT_n, "B2", 4)
+
+ CONNECTION("B2", 3, "E9", 13)
+ CONNECTION(PLAYER_2_n, "M3", 9)
+ CONNECTION(V128, "M3", 10)
+ CONNECTION(H64, "J3", 8)
+ CONNECTION(H128, "J3", 9)
+ CONNECTION(V32, "E3", 5)
+ CONNECTION(V16_n, "E3", 6)
+
+ CONNECTION(SFL_n, "M8", 1)
+ CONNECTION("M3", 8, "M8", 2)
+ CONNECTION(PLNR, "M8", 13)
+ CONNECTION("J3", 10, "E9", 1)
+ CONNECTION(V64, "E2", 5)
+ CONNECTION(V32, "E2", 4)
+ CONNECTION(PLNR, "E2", 10)
+ CONNECTION(H16, "E2", 9)
+
+ CONNECTION("M8", 12, "M8", 3)
+ CONNECTION(TOP_n, "M8", 4)
+ CONNECTION(TOP_n, "M8", 5)
+ CONNECTION("H4", 11, "F2", 11)
+ CONNECTION("E2", 6, "F2", 10)
+ CONNECTION("E2", 8, "F2", 9)
+
+ CONNECTION("M8", 6, "H4", 5)
+ CONNECTION("F2", 8, "H4", 4)
+
+ CONNECTION(PAD_EN_n, "PAD_EN_BUF", 1)
+
+ CONNECTION("PAD_EN_BUF", 2, "C9", 4)
+ CONNECTION("PAD_EN_BUF", 2, "C9", 2)
+ CONNECTION(BTB_HIT_n, "C5", 3)
+ CONNECTION(P, "F5", 10)
+ CONNECTION(P, "F5", 12)
+ CONNECTION("C5", 4, "F5", 11)
+ CONNECTION(SERVE_WAIT_n, "F5", 13)
+ CONNECTION(H64, "E5", 13)
+ CONNECTION("F5", 9, "E5", 12)
+ CONNECTION(H128, "E5", 10)
+ CONNECTION("F5", 8, "E5", 9)
+ CONNECTION("E5", 11, "E4", 12)
+ CONNECTION("E5", 8, "E4", 13)
+ CONNECTION("E4", 11, "D4", 2)
+ CONNECTION(P, "D4", 3)
+ CONNECTION(P, "D4", 4)
+ CONNECTION(P, "D4", 5)
+ CONNECTION(P, "D4", 6)
+ CONNECTION(P, "D4", 9)
+ CONNECTION(P, "D4", 10)
+ CONNECTION("C3", 11, "D4", 7)
+ CONNECTION(VSYNC_n, "D4", 1)
+
+ CONNECTION("D4", 15, "E4", 10)
+ CONNECTION("H7", 6, "E4", 9)
+ CONNECTION("C9", 3, "H7", 5)
+ CONNECTION(PAD_EN_n, "H7", 4)
+ CONNECTION("E4", 8, "C3", 12)
+ CONNECTION(ATTRACT_n, "C3", 13)
+ CONNECTION(H8, "J3", 2)
+ CONNECTION(H32, "J3", 3)
+
+ CONNECTION("C3", 11, "K3", 12)
+ CONNECTION(H128, "K3", 5)
+ CONNECTION(H64, "K3", 6)
+ CONNECTION(H16, "K3", 11)
+ CONNECTION(H4, "K3", 4)
+ CONNECTION("J3", 1, "K3", 1)
+ CONNECTION(P, "K3", 3)
+ CONNECTION(P, "K3", 2)
+
+ CONNECTION(V16_d, "D7", 1)
+ CONNECTION(V64_d, "D7", 13)
+ CONNECTION(V128_d, "D7", 2)
+ CONNECTION("D7", 12, "H1", 4)
+ CONNECTION(V8_d, "H1", 5)
+ CONNECTION("H1", 6, "C2", 4)
+ CONNECTION("H1", 6, "C2", 5)
+ CONNECTION(V32_d, "J2", 9)
+ CONNECTION("J2", 8, "C2", 10)
+ CONNECTION("C2", 6, "C2", 9)
+
+
+ //SCORE
+ CONNECTION(SCI_n, "D3", 4)
+ CONNECTION(GND, "D3", 2)
+ CONNECTION(GND, "D3", 3)
+ CONNECTION(GND, "D3", 1)
+
+ //PLAYER2_CONDITIONAL
+ CONNECTION(PLAYER_2, "H7", 10)
+ CONNECTION(GND, "S2", 1)
+ CONNECTION(P, "S2", 2)
+ CONNECTION("S2", 3, "H7", 9)
+
+ //A-L 1 and 2
+ CONNECTION(SET_BRICKS_n, "B3", 2)
+ CONNECTION(H2, "B3", 3)
+ CONNECTION("B3", 1, "E7", 6)
+ CONNECTION(PLAYER_2, "E7", 5)
+ CONNECTION(P, "N6", 9)
+ CONNECTION(P, "M6", 9)
+ CONNECTION(P, "L6", 9)
+ CONNECTION(P, "H6", 9)
+ CONNECTION(P, "J6", 9)
+ CONNECTION(P, "K6", 9)
+
+ CONNECTION(P, "N6", 10)
+ CONNECTION(PLAYER_2, "N6", 7)
+ CONNECTION(COUNT_2, "N6", 2)
+ CONNECTION(START_GAME_n, "N6", 1)
+
+ CONNECTION("N6", 15, "M6", 10)
+ CONNECTION(PLAYER_2, "M6", 7)
+ CONNECTION(COUNT_2, "M6", 2)
+ CONNECTION(START_GAME_n, "M6", 1)
+
+ CONNECTION("M6", 15, "L6", 10)
+ CONNECTION(PLAYER_2, "L6", 7)
+ CONNECTION(COUNT_2, "L6", 2)
+ CONNECTION(START_GAME_n, "L6", 1)
+
+ CONNECTION(P, "H6", 10)
+ CONNECTION(RAM_PLAYER1, "H6", 7)
+ CONNECTION(COUNT_1, "H6", 2)
+ CONNECTION(START_GAME_n, "H6", 1)
+
+ CONNECTION("H6", 15, "J6", 10)
+ CONNECTION(RAM_PLAYER1, "J6", 7)
+ CONNECTION(COUNT_1, "J6", 2)
+ CONNECTION(START_GAME_n, "J6", 1)
+
+ CONNECTION("J6", 15, "K6", 10)
+ CONNECTION(RAM_PLAYER1, "K6", 7)
+ CONNECTION(COUNT_1, "K6", 2)
+ CONNECTION(START_GAME_n, "K6", 1)
+
+
+ //CX0 and CX1
+ CONNECTION(BRICK_HIT, "H2", 9)
+ CONNECTION(H16_n, "H2", 10)
+ CONNECTION(P, "D5", 10)
+ CONNECTION(P, "D5", 12)
+ CONNECTION("H2", 8, "D5", 11)
+ CONNECTION(SERVE_WAIT_n, "D5", 13)
+ CONNECTION(X0, "C6", 13)
+ CONNECTION("D5", 9, "C6", 12)
+ CONNECTION("D5", 9, "D6", 12)
+ CONNECTION(DN, "D6", 13)
+ CONNECTION("D6", 11, "C6", 4)
+ CONNECTION(X1, "C6", 5)
+
+ //COUNT1 and COUNT2
+ CONNECTION(P, "N8", 11)
+ CONNECTION(BRICK_HIT, "N8", 12)
+ CONNECTION(ATTRACT_n, "N8", 13)
+ CONNECTION("N8", 9, "N9", 11)
+ CONNECTION(P, "N9", 15)
+ CONNECTION(P, "N9", 5)
+
+ CONNECTION(COUNT, "N9", 4)
+ CONNECTION(START_GAME, "N9", 14)
+ CONNECTION(H8_n, "N9", 1)
+ CONNECTION(H16_n, "N9", 10)
+ CONNECTION(GND, "N9", 9)
+
+ CONNECTION("N9", 13, "N7", 13)
+ CONNECTION(SCLOCK, "N7", 12)
+
+ CONNECTION(PLAYER_2, "N7", 5)
+ CONNECTION(COUNT, "N7", 4)
+
+ CONNECTION(COUNT, "M9", 1)
+ CONNECTION(COUNT, "N7", 10)
+ CONNECTION(RAM_PLAYER1, "N7", 9)
+
+
+ //Ball Logic
+ CONNECTION(P, "C7", 1)
+ CONNECTION(P, "C7", 10)
+ CONNECTION(P, "C7", 7)
+ CONNECTION(CX0, "C7", 3)
+ CONNECTION(CX1, "C7", 4)
+ CONNECTION(X2, "C7", 5)
+ CONNECTION(GND, "C7", 6)
+ CONNECTION("D8", 8, "C7", 9)
+ CONNECTION("C7", 15, "C8", 7)
+ CONNECTION("C7", 11, "C8", 10)
+ CONNECTION("C7", 12, "D7", 10)
+ CONNECTION("C7", 13, "D7", 11)
+ CONNECTION(CLOCK, "C7", 2)
+
+ CONNECTION(P, "C8", 1)
+ CONNECTION(P, "C8", 3)
+ CONNECTION(P, "C8", 4)
+ CONNECTION(P, "C8", 5)
+ CONNECTION(P, "C8", 6)
+ CONNECTION(P, "C8", 9)
+ CONNECTION(CLOCK, "C8", 2)
+ CONNECTION("C8", 15, "B7", 7)
+ CONNECTION("C7", 15, "B7", 10)
+
+ CONNECTION(P, "B7", 1)
+ CONNECTION(Y0, "B7", 3)
+ CONNECTION(Y1, "B7", 4)
+ CONNECTION(Y2, "B7", 5)
+ CONNECTION(GND, "B7", 6)
+ CONNECTION("D8", 8, "B7", 9)
+ CONNECTION(CLOCK, "B7", 2)
+ CONNECTION("B7", 15, "B8", 7)
+
+ CONNECTION(VB_HIT_SOUND, "D7", 9)
+
+ CONNECTION(P, "B8", 1)
+ CONNECTION(P, "B8", 3)
+ CONNECTION(P, "B8", 4)
+ CONNECTION(P, "B8", 5)
+ CONNECTION(P, "B8", 6)
+ CONNECTION(P, "B8", 9)
+ CONNECTION("C8", 15, "B8", 10)
+ CONNECTION(CLOCK, "B8", 2)
+
+ CONNECTION("B8", 15, "D8", 10)
+ CONNECTION("B7", 15, "D8", 9)
+
+ CONNECTION("D7", 8, "D7", 5)
+ CONNECTION(P_HIT_SOUND, "D7", 4)
+ CONNECTION("B8", 15, "D7", 3)
+
+ //Clock Generator
+ CONNECTION(CKBH, "H1", 12)
+ CONNECTION("F1", 14, "H1", 13)
+ CONNECTION("F1", 15, "E1", 5)
+
+ CONNECTION(P, "F1", 1)
+ CONNECTION(P, "F1", 7)
+ CONNECTION(P, "F1", 10)
+ CONNECTION(GND, "F1", 3)
+ CONNECTION(P, "F1", 4)
+ CONNECTION(GND, "F1", 5)
+ CONNECTION(GND, "F1", 6)
+ CONNECTION("E1", 6, "F1", 9)
+ CONNECTION("Y1", 1, "F1", 2)
+
+ // RH and LH Sides
+ CONNECTION(V128, "N4", 1)
+ CONNECTION(V64, "N4", 2)
+ CONNECTION(V16, "N4", 13)
+ CONNECTION("N4", 12, "N4", 11)
+ CONNECTION(V8, "N4", 10)
+ CONNECTION(V4, "N4", 9)
+ CONNECTION("N4", 8, "H2", 2)
+ CONNECTION(V32, "H2", 1)
+ CONNECTION("N4", 8, "J2", 13)
+ CONNECTION("J2", 12, "J3", 11)
+ CONNECTION(V32, "J3", 12)
+
+ // Top Bound
+ CONNECTION(H128, "H3", 4)
+ CONNECTION(H64, "H3", 5)
+ CONNECTION(H32, "H3", 3)
+ CONNECTION("H3", 6, "L4", 9)
+ CONNECTION(H16, "L4", 10)
+ CONNECTION(H8, "L4", 11)
+ CONNECTION("L4", 8, "K4", 5)
+ CONNECTION(VSYNC_n, "K4", 4)
+
+ //Cabinet type
+
+ // Coin Circuit
+ CONNECTION("COIN1", 1, "F9", 13)
+
+ CONNECTION(CSW1, "F9", 11)
+ //CONNECTION("F9", 10, "F9", 13) //TODO: causes lots of bouncing, commented out since this trace is not implemented in gotcha
+
+ CONNECTION(V64, "H7", 12)
+ CONNECTION(V64, "H7", 13)
+
+ CONNECTION(CSW1, "F8", 10)
+ CONNECTION("F9", 10, "F8", 12)
+ CONNECTION(V64I, "F8", 11)
+ CONNECTION(P, "F8", 13)
+ CONNECTION(P, "F8", 1)
+ CONNECTION(V64I, "F8", 3)
+ CONNECTION("F8", 9, "F8", 2)
+ CONNECTION(CSW1, "F8", 4)
+
+ CONNECTION("F8", 6, "H8", 12)
+ CONNECTION(P, "H8", 10)
+ CONNECTION(V16_d, "H8", 11)
+ CONNECTION(P, "H8", 13)
+ CONNECTION("H8", 9, "J8", 15)
+ CONNECTION("H8", 9, "J9", 9)
+ CONNECTION(V16_d, "J8", 14)
+ CONNECTION("J8", 13, "J9", 10)
+ CONNECTION(P, "S3", 1)
+ CONNECTION(V4_d, "S3", 2)
+ CONNECTION("S3", 3, "J9", 11)
+
+ CONNECTION("J9", 8, "L9", 5)
+ CONNECTION("J9", 6, "L9", 4)
+
+ //COIN2 circuit
+ //CONNECTION("COIN2", 1, "F9", 1)
+ CONNECTION(GND, "F9", 1) //TODO: coin2 not implemented
+
+ CONNECTION(CSW2, "F9", 3)
+ CONNECTION(CSW2, "H9", 10)
+ CONNECTION("F9", 4, "H9", 12)
+ CONNECTION(V64_n, "H9", 11)
+ CONNECTION(V64_n, "H9", 3)
+ CONNECTION(P, "H9", 13)
+ CONNECTION("H9", 9, "H9", 2)
+ CONNECTION(CSW2, "H9", 4)
+ CONNECTION(P, "H9", 1)
+
+ CONNECTION(P, "H8", 4)
+ CONNECTION("H9", 6, "H8", 2)
+ CONNECTION(V16_d, "H8", 3)
+ CONNECTION(P, "H8", 1)
+ CONNECTION("H8", 5, "J8", 6)
+ CONNECTION(V16_d, "J8", 5)
+ CONNECTION(P, "J9", 3)
+ CONNECTION("H8", 5, "J9", 5)
+ CONNECTION("J8", 7, "J9", 4)
+
+ CONNECTION(P2_CONDITIONAL_dash, "E9", 9)
+ CONNECTION("E9", 8, "H1", 1)
+ CONNECTION("E9", 8, "H1", 2)
+
+ //Start2 Input
+ CONNECTION("START", 2, "E9", 11)
+ CONNECTION("E9", 10, "E8", 12)
+ CONNECTION(P, "E8", 10)
+ CONNECTION(V64I, "E8", 11)
+
+ CONNECTION(V128_d, "F7", 2)
+ CONNECTION(V128_d, "F7", 3)
+ CONNECTION(CREDIT2_n, "F7", 1)
+ CONNECTION(ATTRACT_n, "E7", 12)
+ CONNECTION("F7", 4, "E7", 11)
+ CONNECTION("E7", 13, "E8", 13)
+
+ //Start1 Input
+ CONNECTION("START", 1, "E9", 3)
+ CONNECTION("E9", 4, "E8", 2)
+ CONNECTION(P, "E8", 4)
+ CONNECTION(V64_d, "E8", 3)
+
+
+ CONNECTION(CREDIT_1_OR_2_n, "E7", 2)
+ CONNECTION(ATTRACT_n, "E7", 3)
+ CONNECTION("E7", 1, "E8", 1)
+
+ CONNECTION(CR_START1_n, "D8", 4) // Schematic shows CR_START1 ?
+ CONNECTION(CR_START2_n, "D8", 5)
+
+
+ CONNECTION(START_GAME, "M9", 3)
+ CONNECTION(START_GAME, "M9", 5)
+
+ CONNECTION(V32, "D6", 4)
+ CONNECTION(ATTRACT, "D6", 5)
+ CONNECTION(P, "E6", 10)
+ CONNECTION(START_GAME, "E6", 12)
+ CONNECTION("D6", 6, "E6", 11)
+ CONNECTION("D6", 3, "E6", 13)
+
+ //TODO: hows this whole latch stuff work? what about Q_n going to COIN1_n and COIN2_n
+ CONNECTION(CREDIT_1_OR_2_n, "D8", 13)
+ CONNECTION(EGL, "D8", 12)
+ CONNECTION("LATCH", 1, "D8", 11) //set
+ CONNECTION("LATCH", 2, COIN1_n) //reset
+ //CONNECTION("LATCH", 3, COIN2_n) //set //TODO: coin2 here
+ CONNECTION( "LATCH", 3, "E9", 5) //output
+
+
+ CONNECTION(LAT_Q, "D6", 1)
+ CONNECTION(EGL_n, "D6", 2)
+
+ //Serve
+ CONNECTION(H64, "J3", 6)
+ CONNECTION(H32, "J3", 5)
+ CONNECTION("J3", 4, "L4", 13)
+ CONNECTION(H128, "L4", 2)
+ CONNECTION(H16, "L4", 1)
+
+ CONNECTION(BALL_DISPLAY, "H2", 13)
+ CONNECTION(H128, "H2", 12)
+ CONNECTION("H2", 11, "C3", 9)
+ CONNECTION(HSYNC, "C3", 10)
+ CONNECTION("C3", 8, "B3", 5)
+ CONNECTION(H8_d, "B3", 6)
+ CONNECTION("B3", 4, "C3", 4)
+ CONNECTION(H4, "C3", 5)
+ CONNECTION("C3", 6, "A4", 9)
+ CONNECTION(START_GAME1_n, "A4", 10)
+
+ CONNECTION(SERVE_WAIT_n, "D2", 13)
+
+ CONNECTION(SERVE_n, "D2", 12)
+ CONNECTION(SERVE_n, "A3", 4)
+ CONNECTION(P, "A3", 2)
+ CONNECTION(ATTRACT, "A3", 3)
+ CONNECTION(SERVE_WAIT, "A3", 1)
+
+ CONNECTION(BALL, "E1", 13)
+ CONNECTION("E1", 12, "B3", 8)
+ CONNECTION("A3", 6, "B3", 9)
+ CONNECTION("B3", 10, "B3", 11)
+ CONNECTION(SERVE_WAIT_n, "B3", 12)
+ CONNECTION("B3", 13, "A3", 12)
+ CONNECTION("A4", 8, "A3", 10)
+ CONNECTION("L4", 12, "A3", 11)
+ CONNECTION(P, "A3", 13)
+
+ //Set Bricks
+ CONNECTION(P, "D3", 10)
+ CONNECTION(P, "D3", 12)
+ CONNECTION(START_GAME, "D3", 11)
+ CONNECTION(SERVE_n, "D3", 13)
+
+ //Playfield
+ CONNECTION(LH_SIDE, "H3", 1)
+ CONNECTION(TOP_BOUND, "H3", 13)
+ CONNECTION(RH_SIDE, "H3", 2)
+ CONNECTION("H3", 12, "H4", 2)
+ CONNECTION("E1", 2, "C36", 1)
+ CONNECTION("C36", 2, "H4", 1)
+
+ CONNECTION(BALL_DISPLAY, "A5", 10)
+ CONNECTION(PSYNC, "A5", 9)
+ CONNECTION(BSYNC, "C3", 2)
+ CONNECTION(TOP_BOUND, "C3", 1)
+
+ CONNECTION(PC, "C4", 4)
+ CONNECTION(PD, "C4", 5)
+ CONNECTION(BP_HIT_n, "C5", 13)
+ CONNECTION(PD, "A5", 1)
+ CONNECTION("C5", 12, "A5", 2)
+ CONNECTION(BSYNC, "A5", 5)
+ CONNECTION(VSYNC, "A5", 4)
+
+ CONNECTION("C5", 12, "A5", 13)
+ CONNECTION("A5", 3, "A5", 12)
+
+ CONNECTION(BRICK_HIT, "D5", 3)
+ CONNECTION("E5", 3, "D5", 1)
+ CONNECTION("D5", 6, "D5", 2)
+ CONNECTION(BP_HIT_n, "D5", 4)
+
+ CONNECTION(P, "A6", 10)
+ CONNECTION("C4", 6, "A6", 12)
+ CONNECTION(BP_HIT_n, "A6", 11)
+ CONNECTION(P, "A6", 13)
+
+ CONNECTION("A5", 3, "A6", 4)
+ CONNECTION(V16_d, "A6", 2)
+ CONNECTION(VB_HIT_n, "A6", 3)
+ CONNECTION("A5", 11, "A6", 1)
+
+ CONNECTION(P2_CONDITIONAL, "C6", 1)
+ CONNECTION("D5", 5, "C6", 2)
+ CONNECTION("D5", 6, "C4", 2)
+ CONNECTION(P2_CONDITIONAL, "C4", 1)
+
+ CONNECTION(V_SLOW, "B6", 12)
+ CONNECTION("A6", 8, "B6", 13)
+ CONNECTION(V_SLOW, "C6", 10)
+ CONNECTION("A6", 5, "C6", 9)
+
+ CONNECTION(Y0, "B6", 4)
+ CONNECTION("C6", 8, "B6", 5)
+
+ CONNECTION(X2, "D6", 10)
+ CONNECTION("B6", 8, "D6", 9)
+ CONNECTION("B5", 7, "B6", 9)
+ CONNECTION("B5", 6, "B6", 10)
+ CONNECTION(X0, "B6", 1)
+ CONNECTION(X2, "B6", 2)
+
+ CONNECTION("B5", 6, "C5", 11)
+ CONNECTION("B5", 7, "C5", 9)
+
+ CONNECTION(SU_n, "B5", 11)
+ CONNECTION(P, "B5", 15)
+ CONNECTION(P, "B5", 1)
+ CONNECTION(P, "B5", 10)
+ CONNECTION(P, "B5", 9)
+ CONNECTION(P, "B5", 4)
+ CONNECTION("D6", 8, "B5", 5)
+ CONNECTION(SERVE_WAIT, "B5", 14)
+
+ CONNECTION(BTB_HIT_n, "E5", 1)
+ CONNECTION(SBD_n, "E5", 2)
+
+ CONNECTION(BP_HIT_n, "E5", 4)
+ CONNECTION(BTB_HIT_n, "E5", 5)
+ CONNECTION("E5", 6, "F7", 11)
+ CONNECTION("E5", 6, "F7", 12)
+ CONNECTION(BRICK_HIT_n, "F7", 10)
+ CONNECTION("F7", 9, "C2", 2)
+ CONNECTION(BALL_DISPLAY, "C2", 1)
+ CONNECTION("L3", 6, "E3", 11)
+ CONNECTION("C2", 3, "E3", 12)
+
+ CONNECTION(SET_BRICKS_n, "E6", 4)
+ CONNECTION("E3", 13, "E6", 2)
+ CONNECTION(CKBH, "E6", 3)
+ CONNECTION("E3", 13, "D2", 2)
+ CONNECTION(SET_BRICKS, "D2", 1)
+ CONNECTION("D2", 3, "E6", 1)
+
+ CONNECTION(BRICK_DISPLAY, "E1", 1)
+ CONNECTION(H1, "K4", 9)
+ CONNECTION(H2, "K4", 10)
+ CONNECTION("K4", 8, "E3", 2)
+ CONNECTION("L3", 6, "E3", 3)
+
+ CONNECTION(ATTRACT_n, "C2", 13)
+ CONNECTION(SET_BRICKS_n, "C2", 12)
+ CONNECTION("C2", 11, "H3", 10)
+ CONNECTION(FPD1, "H3", 9)
+ CONNECTION(FPD2, "H3", 11)
+ CONNECTION("H3", 8, "E1", 3)
+ CONNECTION("E1", 4, "C32", 1)
+ CONNECTION("C32", 2, "L3", 13)
+ CONNECTION(H4, "L3", 2)
+ CONNECTION(H8, "L3", 1)
+ CONNECTION(H16, "L3", 15)
+ CONNECTION(V32, "L3", 14)
+ CONNECTION(V64, "L3", 7)
+ CONNECTION(V128, "L3", 9)
+ CONNECTION(V16, "L3", 10)
+ CONNECTION(RAM_PLAYER1, "L3", 11)
+ CONNECTION(H32, "L3", 3)
+ CONNECTION(H128, "L3", 4)
+ CONNECTION("H4", 8, "L3", 5)
+
+ CONNECTION(V2, "M4", 5)
+ CONNECTION(V4, "M4", 4)
+ CONNECTION(V8, "M4", 3)
+ CONNECTION("M4", 6, "H4", 9)
+ CONNECTION(VSYNC_n, "K4", 2)
+ CONNECTION(H64, "K4", 1)
+ CONNECTION("K4", 3, "H4", 10)
+ CONNECTION(FPD1_n, "F2", 13)
+ CONNECTION(BRICK_HIT_n, "F2", 2)
+ CONNECTION(FPD2_n, "F2", 1)
+
+ CONNECTION("F2", 12, "L3", 12)
+
+ //FPD circuits
+ CONNECTION(K2, "M4", 2)
+ CONNECTION(G2, "M4", 13)
+ CONNECTION(D2, "M4", 1)
+ CONNECTION(K1, "M4", 9)
+ CONNECTION(G1, "M4", 10)
+ CONNECTION(D1, "M4", 11)
+ CONNECTION(BP_HIT_n, "E4", 2)
+ CONNECTION("M4", 12, "E4", 1)
+ CONNECTION(BP_HIT_n, "E4", 4)
+ CONNECTION("M4", 8, "E4", 5)
+
+ CONNECTION(P, "F4", 4)
+ CONNECTION(P, "F4", 2)
+ CONNECTION("E4", 3, "F4", 3)
+ CONNECTION(START_GAME1_n, "F4", 1)
+
+ CONNECTION(P, "F4", 10)
+ CONNECTION(P, "F4", 12)
+ CONNECTION("E4", 6, "F4", 11)
+ CONNECTION(START_GAME1_n, "F4", 13)
+
+ CONNECTION("F4", 6, "F3", 5)
+ CONNECTION(GND, "F3", 4)
+ CONNECTION("F4", 8, "F3", 11)
+ CONNECTION(GND, "F3", 12)
+
+ CONNECTION(P, "F3", 3)
+ CONNECTION(P, "F3", 13)
+
+
+ //CREDIT_COUNTER
+ CONNECTION(BONUS_COIN, "E7", 8)
+ CONNECTION(COIN, "E7", 9)
+ CONNECTION(CR_START1_n, "H7", 2)
+ CONNECTION(V8, "D8", 1)
+ CONNECTION(CR_START2, "D8", 2)
+ CONNECTION("D8", 3, "H7", 1)
+
+ CONNECTION("L8", 12, "L8", 11) // not on schematic, on rollover load 16, keeps you from losing all credits
+ CONNECTION(P, "L8", 15)
+ CONNECTION(P, "L8", 1)
+ CONNECTION(P, "L8", 10)
+ CONNECTION(P, "L8", 9)
+ CONNECTION("E7", 10, "L8", 5)
+ CONNECTION("H7", 3, "L8", 4)
+
+ CONNECTION(LAT_Q, "L9", 10)
+ CONNECTION("L8", 13, "L9", 9)
+ CONNECTION("L9", 8, "L8", 14)
+ CONNECTION("L8", 7, "M8", 9)
+ CONNECTION("L8", 6, "M8", 10)
+ CONNECTION("L8", 2, "M8", 11)
+ CONNECTION("L8", 3, "M9", 13)
+
+ CONNECTION(CREDIT2_n, "F9", 5)
+ CONNECTION(CREDIT2_n, "L9", 2)
+ CONNECTION("M9", 12, "L9", 1)
+ CONNECTION(CREDIT_1_OR_2, "F9", 9)
+
+ //PLGM2_n
+ CONNECTION(CR_START1_n, "F7", 6)
+ CONNECTION(CR_START2_n, "F7", 5)
+
+ //PLAY_CP
+ CONNECTION(PLGM2_n, "F2", 5)
+ CONNECTION(PLAYER_2, "F2", 4)
+ CONNECTION(H1, "F2", 3)
+
+ CONNECTION(P, "F5", 4)
+ CONNECTION(P, "F5", 2)
+ CONNECTION(SERVE_WAIT, "F5", 3)
+ CONNECTION(H128, "F5", 1)
+ CONNECTION("F2", 6, "D2", 9)
+ CONNECTION("F5", 5, "D2", 10)
+
+ //EGL
+ CONNECTION(P, "B4", 10)
+ CONNECTION(P, "B4", 7)
+ CONNECTION(P, "B4", 9)
+ CONNECTION(PLAY_CP, "B4", 2)
+
+ CONNECTION(EGL, "C5", 1)
+
+
+
+ CONNECTION(START_GAME1_n, "B4", 1)
+ CONNECTION(BALL_A, "A4", 2)
+ CONNECTION(BALL_B, "S4", 1)
+ CONNECTION(BALL_C, "S4", 2)
+ CONNECTION("S4", 3, "A4", 1)
+ CONNECTION("A4", 3, "C37", 1)
+
+ CONNECTION(SERVE_WAIT_n, "A4", 5)
+ CONNECTION(BALL, "A4", 4)
+
+ // Ball Circuit
+
+
+ // Video Summing
+ CONNECTION(V16_d, "D2", 4)
+ CONNECTION(V8_d, "D2", 5)
+ CONNECTION("D2", 6, "E3", 8)
+ CONNECTION(VSYNC_n, "E3", 9)
+ CONNECTION(HSYNC_n, "E2", 12)
+ CONNECTION("E3", 10, "E2", 13)
+ CONNECTION(PSYNC, "B9", 1)
+ CONNECTION(VSYNC_n, "B9", 2)
+
+ //CONNECTION("VIDEO", 1, "E2", 11)
+ CONNECTION("VIDEO", 2, PLAYFIELD)
+ CONNECTION("VIDEO", 3, BSYNC)
+ CONNECTION("VIDEO", 4, SCORE)
+ CONNECTION("VIDEO", 5, "B9", 3)
+ //CONNECTION("VIDEO", 6, P)
+
+ CONNECTION("VIDEO", Video::HBLANK_PIN, HSYNC)
+ CONNECTION("VIDEO", Video::VBLANK_PIN, "E3", 10)
+
+
+ // Audio Summing
+ CONNECTION("AUDIO", 1, "B9", 11)
+ CONNECTION("AUDIO", 2, "B9", 8)
+ CONNECTION("AUDIO", 3, FREE_GAME_TONE)
+ CONNECTION("AUDIO", 4, "B9", 6)
+
+
+#ifdef DEBUG
+ // RAM access
+ /*CONNECTION("LOG1", 3, H4) //A
+ CONNECTION("LOG1", 4, H8) //B
+ CONNECTION("LOG1", 5, H16) //C
+ CONNECTION("LOG1", 6, V32) //D
+ CONNECTION("LOG1", 7, V64) //E
+ CONNECTION("LOG1", 8, V128) //F
+ CONNECTION("LOG1", 9, V16) //G
+ CONNECTION("LOG1", 10, RAM_PLAYER1) //H
+ CONNECTION("LOG1", 11, H32) //I
+ CONNECTION("LOG1", 12, H128) //J
+ CONNECTION("LOG1", 13, "H4", 8) //K
+ CONNECTION("LOG1", 14, "E1", 4) //L
+ CONNECTION("LOG1", 15, "F2", 12) //M
+ CONNECTION("LOG1", 16, "L3", 6)*/ //N
+#endif
+
+ CIRCUIT_LAYOUT_END
+};
+
diff --git a/src/emu/netlist/analog/nld_solver.c b/src/emu/netlist/analog/nld_solver.c
index 8248b75ec9c..7ede33a2664 100644
--- a/src/emu/netlist/analog/nld_solver.c
+++ b/src/emu/netlist/analog/nld_solver.c
@@ -18,6 +18,19 @@
#define SOLVER_VERBOSE_OUT(x) do {} while (0)
//#define SOLVER_VERBOSE_OUT(x) printf x
+ATTR_COLD netlist_matrix_solver_t::netlist_matrix_solver_t()
+: m_owner(NULL)
+{
+}
+
+ATTR_COLD netlist_matrix_solver_t::~netlist_matrix_solver_t()
+{
+#if NEW_INPUT
+ for (int i = 0; i < m_inps.count(); i++)
+ delete m_inps[i];
+#endif
+}
+
ATTR_COLD void netlist_matrix_solver_t::setup(netlist_net_t::list_t &nets, NETLIB_NAME(solver) &aowner)
{
m_owner = &aowner;
@@ -66,10 +79,24 @@ ATTR_COLD void netlist_matrix_solver_t::setup(netlist_net_t::list_t &nets, NETLI
NL_VERBOSE_OUT(("Added terminal\n"));
break;
case netlist_terminal_t::INPUT:
- if (!m_inps.contains(p))
- m_inps.add(p);
- NL_VERBOSE_OUT(("Added input\n"));
- break;
+ {
+#if NEW_INPUT
+ // FIXME: multiple outputs per net ...
+ netlist_analog_output_t *m = new netlist_analog_output_t();
+ m->init_object(*this, this->name() + "." + pstring::sprintf("m%d", m_inps.count()));
+ //register_output("m", *m);
+ m_inps.add(m);
+ m->m_proxied_net = &p->net();
+ m->net().register_con(*p);
+ // FIXME: repeated
+ m->net().rebuild_list();
+#else
+ if (!m_inps.contains(p))
+ m_inps.add(p)
+#endif
+ NL_VERBOSE_OUT(("Added input\n"));
+ }
+ break;
default:
owner().netlist().error("unhandled element found\n");
break;
@@ -81,6 +108,18 @@ ATTR_COLD void netlist_matrix_solver_t::setup(netlist_net_t::list_t &nets, NETLI
ATTR_HOT void netlist_matrix_solver_t::update_inputs()
{
+
+#if NEW_INPUT
+ // avoid recursive calls. Inputs are updated outside this call
+ for (netlist_analog_output_t * const *p = m_inps.first(); p != NULL; p = m_inps.next(p))
+ if ((*p)->m_proxied_net->m_last_Analog != (*p)->m_proxied_net->m_cur_Analog)
+ (*p)->set_Q((*p)->m_proxied_net->m_cur_Analog);
+ for (netlist_analog_output_t * const *p = m_inps.first(); p != NULL; p = m_inps.next(p))
+ {
+ if ((*p)->m_proxied_net->m_last_Analog != (*p)->m_proxied_net->m_cur_Analog)
+ (*p)->m_proxied_net->m_last_Analog = (*p)->m_proxied_net->m_cur_Analog;
+ }
+#else
for (netlist_core_terminal_t * const *p = m_inps.first(); p != NULL; p = m_inps.next(p))
{
if ((*p)->net().m_last_Analog != (*p)->net().m_cur_Analog)
@@ -93,6 +132,7 @@ ATTR_HOT void netlist_matrix_solver_t::update_inputs()
if ((*p)->net().m_last_Analog != (*p)->net().m_cur_Analog)
(*p)->net().m_last_Analog = (*p)->net().m_cur_Analog;
}
+#endif
}
@@ -156,14 +196,15 @@ ATTR_HOT bool netlist_matrix_solver_t::solve()
netlist_time now = owner().netlist().time();
netlist_time delta = now - m_last_step;
- if (delta < netlist_time::from_nsec(1)) // always update capacitors
- delta = netlist_time::from_nsec(1);
- {
- NL_VERBOSE_OUT(("Step!\n"));
- /* update all terminals for new time step */
- m_last_step = now;
- step(delta);
- }
+ // We are already up to date. Avoid oscillations.
+ if (delta < netlist_time::from_nsec(1))
+ return true;
+
+ NL_VERBOSE_OUT(("Step!\n"));
+ /* update all terminals for new time step */
+ m_last_step = now;
+ //printf("usecs: %f\n", delta.as_double()*1000000.0);
+ step(delta);
if (is_dynamic())
{
@@ -832,11 +873,12 @@ ATTR_COLD void NETLIB_NAME(solver)::post_start()
ms->m_params.m_nr_loops = m_nr_loops.Value();
ms->m_params.m_nt_sync_delay = m_sync_delay.Value();
- ms->setup(groups[i], *this);
register_sub(*ms, pstring::sprintf("Solver %d",m_mat_solvers.count()));
- m_mat_solvers.add(ms);
+ ms->setup(groups[i], *this);
+
+ m_mat_solvers.add(ms);
netlist().log("Solver %s", ms->name().cstr());
netlist().log(" # %d ==> %d nets %s", i, groups[i].count(), (*(*groups[i].first())->m_core_terms.first())->name().cstr());
diff --git a/src/emu/netlist/analog/nld_solver.h b/src/emu/netlist/analog/nld_solver.h
index 0a2c1788a46..5d592cbd0f5 100644
--- a/src/emu/netlist/analog/nld_solver.h
+++ b/src/emu/netlist/analog/nld_solver.h
@@ -9,6 +9,8 @@
#include "../nl_setup.h"
#include "../nl_base.h"
+#define NEW_INPUT (1)
+
// ----------------------------------------------------------------------------------------
// Macros
// ----------------------------------------------------------------------------------------
@@ -40,8 +42,8 @@ public:
typedef netlist_list_t<netlist_matrix_solver_t *> list_t;
typedef netlist_core_device_t::list_t dev_list_t;
- netlist_matrix_solver_t() : m_owner(NULL) {}
- virtual ~netlist_matrix_solver_t() {}
+ ATTR_COLD netlist_matrix_solver_t();
+ ATTR_COLD virtual ~netlist_matrix_solver_t();
ATTR_COLD virtual void setup(netlist_net_t::list_t &nets, NETLIB_NAME(solver) &owner);
@@ -75,7 +77,11 @@ protected:
netlist_net_t::list_t m_nets;
dev_list_t m_dynamic;
+#if NEW_INPUT
+ netlist_list_t<netlist_analog_output_t *> m_inps;
+#else
netlist_core_terminal_t::list_t m_inps;
+#endif
dev_list_t m_steps;
netlist_time m_last_step;
diff --git a/src/emu/netlist/devices/nld_74123.c b/src/emu/netlist/devices/nld_74123.c
index 5a40f51987a..aef93f6ab06 100644
--- a/src/emu/netlist/devices/nld_74123.c
+++ b/src/emu/netlist/devices/nld_74123.c
@@ -6,7 +6,7 @@
#include "nld_74123.h"
#define R_OFF (1E20)
-#define R_ON (1)
+#define R_ON (m_RI.Value())
NETLIB_START(74123)
{
@@ -27,20 +27,36 @@ NETLIB_START(74123)
register_subalias("C", m_RN.m_N);
register_subalias("RC", m_RN.m_P);
+ register_param("K", m_K, 0.4);
+ register_param("RI", m_RI, 400.0); // around 250 for HC series, 400 on LS/TTL, estimated from datasheets
+
connect(m_RN.m_P, m_RP.m_N);
connect(m_CV, m_RN.m_P);
save(NAME(m_last_trig));
save(NAME(m_state));
+ save(NAME(m_KP));
+
+ m_KP = 1.0 / (1.0 + exp(m_K.Value()));
}
NETLIB_UPDATE(74123)
{
- // FIXME: CLR!
-
const netlist_sig_t m_trig = (INPLOGIC(m_A) ^ 1) & INPLOGIC(m_B) & INPLOGIC(m_CLRQ);
- if (!m_last_trig && m_trig)
+ if (!INPLOGIC(m_CLRQ))
+ {
+ OUTLOGIC(m_Q, 0, NLTIME_FROM_NS(10));
+ OUTLOGIC(m_QQ, 1, NLTIME_FROM_NS(10));
+ /* quick charge until trigger */
+ /* FIXME: SGS datasheet shows quick charge to 5V,
+ * though schematics indicate quick charge to Vhigh only.
+ */
+ m_RP.set_R(R_ON);
+ m_RN.set_R(R_OFF);
+ m_state = 2; //charging (quick)
+ }
+ else if (!m_last_trig && m_trig)
{
// FIXME: Timing!
OUTLOGIC(m_Q, 1, NLTIME_FROM_NS(10));
@@ -54,7 +70,8 @@ NETLIB_UPDATE(74123)
if (m_state == 1)
{
- if (INPANALOG(m_CV) < 1.3)
+ const double vLow = m_KP * TERMANALOG(m_RP.m_P);
+ if (INPANALOG(m_CV) < vLow)
{
m_RN.set_R(R_OFF);
m_state = 2; // charging
@@ -62,8 +79,10 @@ NETLIB_UPDATE(74123)
}
else if (m_state == 2)
{
- if (INPANALOG(m_CV) > 3.7)
+ const double vHigh = TERMANALOG(m_RP.m_P) * (1.0 - m_KP);
+ if (INPANALOG(m_CV) > vHigh)
{
+ m_RP.set_R(R_OFF);
OUTLOGIC(m_Q, 0, NLTIME_FROM_NS(10));
OUTLOGIC(m_QQ, 1, NLTIME_FROM_NS(10));
m_state = 0; // waiting
diff --git a/src/emu/netlist/devices/nld_74123.h b/src/emu/netlist/devices/nld_74123.h
index 67a313d9846..6a81b9bac7c 100644
--- a/src/emu/netlist/devices/nld_74123.h
+++ b/src/emu/netlist/devices/nld_74123.h
@@ -3,7 +3,7 @@
/*
* nld_74123.h
*
- * 74123: PRECISION TIMERS
+ * 74123: Dual Retriggerable One-Shot with Clear and Complementary Outputs
*
* +--------------+
* A1 |1 ++ 16| VCC
@@ -43,8 +43,12 @@ public:
netlist_analog_input_t m_CV;
- netlist_sig_t m_last_trig;
+ netlist_sig_t m_last_trig;
UINT8 m_state;
+ double m_KP;
+
+ netlist_param_double_t m_K;
+ netlist_param_double_t m_RI;
);
diff --git a/src/emu/netlist/nl_base.c b/src/emu/netlist/nl_base.c
index a64fb784a9e..b274bde868b 100644
--- a/src/emu/netlist/nl_base.c
+++ b/src/emu/netlist/nl_base.c
@@ -841,7 +841,7 @@ ATTR_HOT void netlist_analog_output_t::set_Q(const double newQ)
if (newQ != net().m_new_Analog)
{
net().m_new_Analog = newQ;
- net().push_to_queue(NLTIME_FROM_NS(0));
+ net().push_to_queue(NLTIME_FROM_NS(1));
}
}
diff --git a/src/emu/netlist/nl_base.h b/src/emu/netlist/nl_base.h
index 1664d98b54e..cd820bf1c27 100644
--- a/src/emu/netlist/nl_base.h
+++ b/src/emu/netlist/nl_base.h
@@ -723,6 +723,8 @@ public:
ATTR_HOT void set_Q(const double newQ);
+ netlist_net_t *m_proxied_net; // only for proxy nets in analog input logic
+
};
// ----------------------------------------------------------------------------------------