summaryrefslogblamecommitdiffstatshomepage
path: root/src/mame/machine/nl_gtrak10.cpp
blob: b5d1ac67127e131764dcb870df6b3333093df9c8 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13












                                                                            
                         













                                                               
                      



                          


                                     


















































































































































































































































































































































                                                                                                                                      
     







                               








                                                               

             
// license:BSD-3-Clause
// copyright-holders:Felipe Sanches

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

  Netlist (gtrak10) included from atarittl.cpp

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

#include "netlist/devices/net_lib.h"

//render a white square with the shape of the car window
//instead of drawing the actual car sprite graphics
//#define CAR_WINDOW_HACK

//generate a regular pattern of squares
// instead of the race track
//#define SIGNAL_RT_HACK
//#define SIGNAL_RT_HACK_XOR

NETLIST_START(gtrak10)

	SOLVER(Solver, 48000)
	PARAM(Solver.PARALLEL, 0) // Don't do parallel solvers
	PARAM(Solver.ACCURACY, 1e-4) // works and is sufficient
	PARAM(NETLIST.USE_DEACTIVATE, 1)

	ANALOG_INPUT(V5, 5)
	ALIAS(VCC, V5)

	TTL_INPUT(high, 1)
	TTL_INPUT(low, 0)

	NET_C(VCC, high.VCC, low.VCC)
	NET_C(GND, high.GND, low.GND)

	MAINCLOCK(CLOCK, 14318181)

	ALIAS(P, high)
	ALIAS(GROUND, low)

	// Horizontal Counters
	//     name,   CLK,   ENP, ENT,     CLRQ, LOADQ,      A,      B,      C,      D
	TTL_9316(L2, CLOCK,     P,   P, HRESET_Q,     P, GROUND, GROUND, GROUND, GROUND)
	TTL_9316(K2, CLOCK, L2.RC,   P, HRESET_Q,     P, GROUND, GROUND, GROUND, GROUND)
	//        name,   CLK, J, K,     CLRQ
	TTL_74107(K1_A, K2.RC, P, P, HRESET_Q)
	TTL_74107(K1_B,  256H, P, P,        P)
	TTL_7404_INVERT(unlabeled_F1_1, 16H)
	ALIAS(  1H,   L2.QA)
	ALIAS(  2H,   L2.QB)
	ALIAS(  4H,   L2.QC)
	ALIAS(  8H,   L2.QD)
	ALIAS( 16H,   K2.QA)
	ALIAS( 16H_Q, unlabeled_F1_1.Q)
	ALIAS( 32H,   K2.QB)
	ALIAS( 64H,   K2.QC)
	ALIAS(128H,   K2.QD)
	ALIAS(256H,   K1_A.Q)
	ALIAS(512H,   K1_B.Q)
	ALIAS(512H_Q, K1_B.QQ)

	// Horizontal Reset
	TTL_7408_AND(E2_A, 2H, 64H)
	ALIAS(2H_AND_64H, E2_A.Q)
	TTL_7410_NAND(J1_C, 2H_AND_64H, 128H, 256H) // 450th horizontal pixel (active low)
	ALIAS(450H_Q, J1_C.Q)
	//       name,   CLK,      D, CLRQ, PREQ
	TTL_7474(H1_A, CLOCK, 450H_Q,    P,    P)
	ALIAS(HRESET_Q, H1_A.Q)
	ALIAS(HRESET,   H1_A.QQ)

	// Vertical Counters
	//     name,   CLKA, CLKB,     R1,     R2
	TTL_7493(F3, HBLANK,   1V, VRESET, VRESET)
	TTL_7493(H2,     8V,  16V, VRESET, VRESET)
	TTL_7493(I2,   128V, 256V, VRESET, VRESET)
	ALIAS(  1V, F3.QA)
	ALIAS(  2V, F3.QB)
	ALIAS(  4V, F3.QC)
	ALIAS(  8V, F3.QD)
	ALIAS( 16V, H2.QA)
	ALIAS( 32V, H2.QB)
	ALIAS( 64V, H2.QC)
	ALIAS(128V, H2.QD)
	ALIAS(256V, I2.QA)
	ALIAS(512V, I2.QB)

	// Vertical Reset
	TTL_7408_AND(E2_B, 512V, 8V)
	ALIAS(520V, E2_B.Q) // 520th "half-line" (?)
	//       name,      CLK,    D, CLRQ, PREQ
	TTL_7474(H1_B, HRESET_Q, 520V,    P,    P)
	ALIAS(VRESET,   H1_B.Q)
	ALIAS(VRESET_Q, H1_B.QQ)

	// Horizontal Blank Flip-Flop:
	TTL_7402_NOR(F1_C, 32H, HBLANK_Q)
	TTL_7402_NOR(F1_B, HRESET, HBLANK)
	ALIAS(HBLANK,   F1_C.Q)
	ALIAS(HBLANK_Q, F1_B.Q)

	// Vertical Sync Flip-Flop:
	TTL_7402_NOR(F1_D, 8V, VSYNC_Q)
	TTL_7402_NOR(F1_A, VRESET, VSYNC)
	ALIAS(VSYNC,   F1_D.Q)
	ALIAS(VSYNC_Q, F1_A.Q)

	// Horizontal Sync = HBLANK & /HRESET & /512H
	TTL_7410_NAND(J1_B, HBLANK, HRESET_Q, 512H_Q)
	TTL_7404_INVERT(E1_E, HSYNC_Q)
	ALIAS(HSYNC,   E1_E.Q)
	ALIAS(HSYNC_Q, J1_B.Q)

	// Composite Sync = /HSYNC XOR /VSYNC
	TTL_7486_XOR(D2_B, HSYNC_Q, VSYNC)
	TTL_7404_INVERT(C2_C, COMP_SYNC)
	ALIAS(COMP_SYNC,   D2_B.Q)
	ALIAS(COMP_SYNC_Q, C2_C.Q)


	// VLd1 signal (vertical load one)
	// Used to address the ROM for the vertical positioning of the car image
	//       name,      CLK,      D, CLRQ,   PREQ
	TTL_7474(B1_B, VRESET_Q, GROUND,    P, VLd1_Q)
	TTL_7474(B1_A,    HSYNC, B1_B.Q,    P,      P)
	ALIAS(VLd1_Q, B1_A.Q)
	ALIAS(VLd1,   B1_A.QQ)


	// Ld1B signal (load one B):
	//       name,   CLK, D,    CLRQ,    PREQ
	TTL_7474(D1_A, 16H_Q, P, HSYNC_Q, VSYNC_Q)
	TTL_7404_INVERT(E1_D, Ld1B_Q)
	ALIAS(Ld1B,   E1_D.Q)
	ALIAS(Ld1B_Q, D1_A.Q)


	// HCOUNT signal:
	//        name, CLK,      J,        K,  CLRQ
	TTL_74107(L1_A,  1H,      P,  L1_B.QQ,  C9.2)
	TTL_74107(L1_B,  1H, L1_A.Q,   GROUND,  C9.2)
	CAP(C9, CAP_P(330))
	RES(R1, RES_R(330))
	RES(R2, RES_R(330))
	NET_C(C9.1, HSYNC_Q)
	NET_C(R1.1, V5)
	NET_C(C9.2, R1.2)
	NET_C(C9.2, R2.1)
	NET_C(R2.2, GROUND)
	ALIAS(HCOUNT, L1_A.QQ)


	// TODO: SPEED_PULSE
	// This signal is generated from one of the proprietary Atari chips.
	// Until we model that, I'll keep a place-holder here
	// corresponding to the typical frequency you'd see when the car is
	// running on the 3rd gear during gameplay.
	ALIAS(SPEED_PULSE, VRESET) //FIXME!


	// 1STOP_Q Signal:
	//       name,         CLK,      D,   CLRQ, PREQ
	TTL_7474(B2_A, SPEED_PULSE, ATRC_Q, A2_D.Q,    P)
	TTL_7474(B2_B,        VLd1, B2_A.Q,      P,    P)
	TTL_7400_NAND(A2_D, 1STOP_Q, VLd1)
	ALIAS(1STOP_Q, B2_B.Q)


	// TODO: ATRC signal:
	// ...
	ALIAS(ATRC,   GROUND) // FIXME!
	ALIAS(ATRC_Q,      P) // FIXME!


	// TODO: RESET1_Q signal:
	// ...
	ALIAS(RESET1_Q, P) // FIXME!


	// TODO: SCORE_DISP_Q signal:
	// ...
	ALIAS(SCORE_DISP_Q, GROUND) // FIXME!

	// Car direction (?)
	ALIAS(1D0, GROUND) // FIXME!
	ALIAS(1D1, GROUND) // FIXME!
	ALIAS(1D2, GROUND) // FIXME!
	ALIAS(1D3, GROUND) // FIXME!
	ALIAS(1D4, GROUND) // FIXME!

	// Car rotation (?)
	ALIAS(1R0, GROUND) // FIXME!
	ALIAS(1R1, GROUND) // FIXME!
	ALIAS(1R2, GROUND) // FIXME!
	ALIAS(1R3, GROUND) // FIXME!


	// ROM multiplexers:
	// --- Addresses 10 and 9 ---
	TTL_7400_NAND(L5_B, Ld1B_Q, SCORE_DISP_Q)
	TTL_7400_NAND(L5_C, Ld1B_Q, L5_D.Q) //labeled "[74]08" on schematics!
	TTL_7400_NAND(L5_D, GROUND, SCORE_DISP_Q)
	ALIAS(ABCD, L5_B.Q)

	// --- Addresses 8 and 7 ---
	//        name, C0, C1,  C2,   C3,      A,            B,      G)
	TTL_74153(H4_A, 1G, 2G, 1D3, 256V, H3_D.Q, SCORE_DISP_Q, GROUND)
	TTL_74153(H4_B, 1F, 2F, 1D2, 128V, H3_D.Q, SCORE_DISP_Q, GROUND)
	TTL_7402_NOR(H3_D, Ld1B, H3_C.Q)
	TTL_7402_NOR(H3_C, 512H, SCORE_DISP_Q)

	// --- Addresses 6 and 5 ---
	//        name,      C0,  C1,  C2, C3,    A,   B,      G)
	TTL_74153(J4_A,     64V, 1D1, 64V,  E, ABCD, ABG, GROUND)
	TTL_74153(J4_B, 1STOP_Q, 1D0, 32V,  D, ABCD, ABG, GROUND)
	TTL_7486_XOR(D2_A, VSYNC, J4_B.AY)

	// --- Addresses 3 and 2 ---
	//        name,  C0,    C1,   C2, C3,    A,   B,      G)
	TTL_74153(K4_A, 1R2,   1D4, 512H, 8V, ABCD, ABG, H3_B.Q)
	TTL_74153(K4_B, 1R1, 1PHI4, 256H, 4V, ABCD, ABG, H3_B.Q)

	// --- Address 4 ---
	TTL_7404_INVERT(E1_C, 32H)
	TTL_7400_NAND(F5_B, E1_C.Q, Ld1B)
	TTL_7402_NOR(H3_B, J4_B.AY, VSYNC_Q)
	TTL_7404_INVERT(L6_E, H3_B.Q)
	TTL_7410_NAND(H5_B, VSYNC, L6_E.Q, 1R3)
	TTL_7400_NAND(F5_A, 16V, ABG)
	TTL_7410_NAND(H5_C, F5_B.Q, H5_B.Q, F5_A.Q)

	// --- Addresses 0 and 1 ---
	//        name,  C0,    C1,   C2, C3,    A,   B,      G)
	TTL_74153(L4_A, 1R0, 1PHI3, 128V,  C, ABCD, ABG, H3_B.Q) // "128A" ?
	TTL_74153(L4_B, 1D0, 1PHI2,  64H,  B, ABCD, ABG, H3_B.Q)
	TTL_7402_NOR(H3_A, VLd1, Ld1B)
	ALIAS(ABG, H3_A.Q)

	// ROM AR (address read) Signal:
	TTL_7400_NAND(F5_D, HSYNC_Q, VLd1)
	TTL_7400_NAND(F5_C, F5_D.Q, 16H_Q)


	ALIAS(1A, GROUND) //FIXME!
	ALIAS(1B, GROUND) //FIXME!
	ALIAS(1C, GROUND) //FIXME!
	ALIAS(1D, GROUND) //FIXME!
	ALIAS(1E, GROUND) //FIXME!
	ALIAS(1F, GROUND) //FIXME!
	ALIAS(1G, GROUND) //FIXME!

	ALIAS(2B, GROUND) //FIXME!
	ALIAS(2C, GROUND) //FIXME!
	ALIAS(2D, GROUND) //FIXME!
	ALIAS(2E, GROUND) //FIXME!
	ALIAS(2F, GROUND) //FIXME!
	ALIAS(2G, GROUND) //FIXME!

	ALIAS(B, GROUND) //FIXME!
	ALIAS(C, GROUND) //FIXME!
	ALIAS(D, GROUND) //FIXME!
	ALIAS(E, GROUND) //FIXME!

	// Actual ROM chip is labeled 74186:
	//        name,     AR, OE1, OE2,      A0,      A1,      A2,      A3,     A4,     A5,      A6,      A7,      A8,     A9,  A10
	ROM_TMS4800(J5, F5_C.Q,   P,   P, L4_B.AY, L4_A.AY, K4_B.AY, K4_A.AY, H5_B.Q, D2_A.Q, J4_A.AY, H4_B.AY, H4_A.AY, L5_C.Q, ABCD)
	PARAM(J5.ROM, "gamedata")
	TTL_7404_INVERT(L6_D, J5.D7) ALIAS(DATA7, L6_D.Q)
	TTL_7404_INVERT(J6_C, J5.D6) ALIAS(DATA6, J6_C.Q)
	TTL_7404_INVERT(J6_B, J5.D5) ALIAS(DATA5, J6_B.Q)
	TTL_7404_INVERT(J6_A, J5.D4) ALIAS(DATA4, J6_A.Q)
	TTL_7404_INVERT(L6_F, J5.D3) ALIAS(DATA3, L6_F.Q)
	TTL_7404_INVERT(J6_F, J5.D2) ALIAS(DATA2, J6_F.Q)
	TTL_7404_INVERT(J6_E, J5.D1) ALIAS(DATA1, J6_E.Q) // Note: J6_E pin numbers on schematics seem wrong (11 and 12)
	TTL_7404_INVERT(J6_D, J5.D0) ALIAS(DATA0, J6_D.Q)

	#if 1 //I'm uncertain if we actually need these:
	RES( R7, RES_K(6.8)) NET_C( R7.1, GROUND) NET_C( R7.2, J5.D7)
	RES( R9, RES_K(6.8)) NET_C( R9.1, GROUND) NET_C( R9.2, J5.D6)
	RES(R11, RES_K(6.8)) NET_C(R11.1, GROUND) NET_C(R11.2, J5.D5)
	RES(R13, RES_K(6.8)) NET_C(R13.1, GROUND) NET_C(R13.2, J5.D4)
	RES(R14, RES_K(6.8)) NET_C(R14.1, GROUND) NET_C(R14.2, J5.D3)
	RES(R12, RES_K(6.8)) NET_C(R12.1, GROUND) NET_C(R12.2, J5.D2)
	RES(R10, RES_K(6.8)) NET_C(R10.1, GROUND) NET_C(R10.2, J5.D1)
	RES( R8, RES_K(6.8)) NET_C( R8.1, GROUND) NET_C( R8.2, J5.D0)
	#endif

	// ----------- Vertical positioning of the car -----------------
	//     name,     EQ, MRQ,    S0Q,    S1Q,    S2Q,    S3Q,    D0,    D1,    D2,    D3
	TTL_9314(H7, VLd1_Q,   P, GROUND, GROUND, GROUND, GROUND, DATA4, DATA5, DATA6, DATA7)
	//     name,    CLK,   ENP,   ENT,     CLRQ,  LOADQ,      A,      B,      C,      D
	TTL_9316(J7, HCOUNT,     P,     P, RESET1_Q, L5_A.Q,  H7.Q0,  H7.Q1,  H7.Q2,  H7.Q3)
	TTL_9316(K7, HCOUNT, J7.RC,     P, RESET1_Q, L5_A.Q,      P,      P,      P,      P)
	TTL_9316(L7, HCOUNT, J7.RC, K7.RC, RESET1_Q, L5_A.Q,      P, GROUND,      P,      P)
	TTL_7400_NAND(L5_A, J7.RC, L7.RC)
	ALIAS(1PHI2, J7.QB)
	ALIAS(1PHI3, J7.QC)
	ALIAS(1PHI4, J7.QD)

	// ------------ Horizontal positioning of the car ----------------------
	//     name,   CLK,   ENP,   ENT,      CLRQ, LOADQ,        A,      B,      C,      D
	TTL_9316(E7, CLOCK,     P,     P,  RESET1_Q,  D5_B.Q, F7_A.Q, F7_D.Q, F7_C.Q, D3_C.Q)
	TTL_9316(D7, CLOCK, E7.RC,     P,  RESET1_Q,  D5_B.Q,      P,      P,      P, GROUND)
	TTL_7400_NAND(D5_B, E7.RC, B6_D.Q)
	TTL_7404_INVERT(B6_D, H5_A.Q)
	TTL_7410_NAND(H5_A, D7.RC, D6_A.Q, D6_B.Q) //weird: should be D6_B.QQ according to schematics
	//        name,    CLK, J, K,     CLRQ
	TTL_74107(D6_A,  D7.RC, P, P, RESET1_Q)
	TTL_74107(D6_B, D6_A.Q, P, P, RESET1_Q)

	TTL_7400_NAND(D3_C, VLd1, DATA3)
	TTL_7408_AND(F7_C,  VLd1, DATA2)
	TTL_7408_AND(F7_D,  VLd1, DATA1)
	TTL_7408_AND(F7_A,  VLd1, DATA0)


	// Car window:
	// this flip-flop is incorrectly labeled "79" in the schematics
	//       name,   CLK,      D, CLRQ,  PREQ
	TTL_7474(A5_B, CLOCK, H5_A.Q,    P, L7.RC)
	ALIAS(CAR_WINDOW,   A5_B.Q)
	ALIAS(CAR_WINDOW_Q, A5_B.QQ)

	// ------------- Car1Video shift registers: -----------
	//      name,   CLK, CLK_INHIBIT_Q,   SH_LDQ,    SER,      A,     B,     C,     D,     E,     F,     G,     H
	TTL_74165(H6, CLOCK,    CAR_WINDOW,  HSYNC_Q,      P,  DATA0, DATA1, DATA2, DATA3, DATA4, DATA5, DATA6, DATA7)
	TTL_74165(F6, CLOCK,    CAR_WINDOW,     Ld1B,  H6.QH,  DATA0, DATA1, DATA2, DATA3, DATA4, DATA5, DATA6, DATA7)
	TTL_7408_AND(F7_B, F6.QHQ, CAR_WINDOW_Q)
#ifdef CAR_WINDOW_HACK
	ALIAS(CAR1VIDEO, CAR_WINDOW_Q)
#else
	ALIAS(CAR1VIDEO, F7_B.Q)
#endif
	TTL_7404_INVERT(L6_A, CAR1VIDEO)
	ALIAS(CAR1VIDEO_Q, L6_A.Q)


	// --------------- Hack ----------------------
	// This is a signal only used for debugging.
	// It generates a pattern of squares on the screen.
	// CAR1VIDEO = not(16H & 16V | VBLANK | HBLANK)

#ifdef SIGNAL_RT_HACK
#ifdef SIGNAL_RT_HACK_XOR
	TTL_7486_XOR(16H_xor_16V, 16H, 16V)
	TTL_7402_NOR(nor, 16H_xor_16V, BLANK)
#else
	TTL_7408_AND(16H_and_16V, 16H, 16V)
	TTL_7402_NOR(nor, 16H_and_16V, BLANK)
#endif
	TTL_7432_OR(BLANK, HBLANK, VRESET)
	ALIAS(RT, nor.Q)
#else
	ALIAS(RT, GROUND) //FIXME!
#endif

	ALIAS(FINISH_LINE, GROUND) //FIXME!
	ALIAS(SLICK_Q, P) //FIXME!

	// ------------- Video Mixer -----------------
	RES(R63, RES_K(1))
	RES(R73, RES_R(330))
	RES(R64, RES_R(330))
	RES(R74, RES_R(330))
	RES(R66, RES_R(330))
	RES(R65, RES_K(4.7))

	NET_C(V5, R63.1)
	NET_C(COMP_SYNC, R73.1)
	NET_C(CAR1VIDEO, R64.1)
	NET_C(FINISH_LINE, R74.1)
	NET_C(RT, R66.1)
	NET_C(SLICK_Q, R65.1)

#if 0
	CAP(C44, CAP_U(10))
	NET_C(C44.1, R63.2)
	NET_C(C44.1, R73.2)
	NET_C(C44.1, R64.2)
	NET_C(C44.1, R74.2)
	NET_C(C44.1, R66.2)
	NET_C(C44.1, R65.2)
	ALIAS(VIDEO_OUT, C44.2)
#else
	// A capacitor just kills performance completely
	RES(RVID, RES_K(10))
	NET_C(GND, RVID.2)

	NET_C(RVID.1, R63.2, R73.2, R64.2, R74.2, R66.2, R65.2)

	ALIAS(VIDEO_OUT, RVID.1)
#endif

NETLIST_END()