1 /***************************************************************************
2 
3 	Raster Elite Tickee Tickats hardware
4 
5 	driver by Aaron Giles
6 
7 	Games supported:
8 		* Tickee Tickats
9 
10 	Known bugs:
11 		* gun sometimes misfires
12 
13 ***************************************************************************/
14 
15 #include "driver.h"
16 #include "cpu/tms34010/tms34010.h"
17 #include "machine/ticket.h"
18 #include "vidhrdw/tlc34076.h"
19 #include "tickee.h"
20 
21 
22 data16_t *tickee_control;
23 
24 
25 static data16_t *code_rom;
26 
27 
28 /*************************************
29  *
30  *	Machine init
31  *
32  *************************************/
33 
MACHINE_INIT(tickee)34 static MACHINE_INIT( tickee )
35 {
36 	/* mirror the ROM into bank 1 */
37 	cpu_setbank(1, code_rom);
38 
39 	ticket_dispenser_init(100, 0, 1);
40 
41 	tlc34076_reset(6);
42 }
43 
44 
45 
46 /*************************************
47  *
48  *	Miscellaneous control bits
49  *
50  *************************************/
51 
READ_HANDLER(port1_r)52 static READ_HANDLER( port1_r )
53 {
54 	return input_port_1_r(offset) | (ticket_dispenser_0_r(0) >> 5) | (ticket_dispenser_1_r(0) >> 6);
55 }
56 
57 
58 
59 /*************************************
60  *
61  *	Miscellaneous control bits
62  *
63  *************************************/
64 
WRITE16_HANDLER(tickee_control_w)65 static WRITE16_HANDLER( tickee_control_w )
66 {
67 	data16_t olddata = tickee_control[offset];
68 
69 	/* offsets:
70 
71 		2 = palette flash (0 normally, 1 when trigger is pressed)
72 		3 = ticket motor (bit 3 = 0 for left motor, bit 2 = 0 for right motor)
73 		6 = lamps? (changing all the time)
74 	*/
75 
76 	COMBINE_DATA(&tickee_control[offset]);
77 
78 	if (offset == 3)
79 	{
80 		ticket_dispenser_0_w(0, (data & 8) << 4);
81 		ticket_dispenser_1_w(0, (data & 4) << 5);
82 	}
83 
84 	if (olddata != tickee_control[offset])
85 		log_cb(RETRO_LOG_DEBUG, LOGPRE "%08X:tickee_control_w(%d) = %04X (was %04X)\n", activecpu_get_pc(), offset, tickee_control[offset], olddata);
86 }
87 
88 
89 
90 /*************************************
91  *
92  *	Memory maps
93  *
94  *************************************/
95 
MEMORY_READ16_START(readmem)96 static MEMORY_READ16_START( readmem )
97 	{ TOBYTE(0x00000000), TOBYTE(0x003fffff), MRA16_RAM },
98 	{ TOBYTE(0x02000000), TOBYTE(0x02ffffff), MRA16_BANK1 },
99 	{ TOBYTE(0x04000000), TOBYTE(0x04003fff), MRA16_RAM },
100 	{ TOBYTE(0x04100000), TOBYTE(0x041000ff), tlc34076_lsb_r },
101 	{ TOBYTE(0x04200000), TOBYTE(0x0420000f), AY8910_read_port_0_lsb_r },
102 	{ TOBYTE(0x04200100), TOBYTE(0x0420010f), AY8910_read_port_1_lsb_r },
103 	{ TOBYTE(0x04400040), TOBYTE(0x0440004f), input_port_3_word_r },
104 	{ TOBYTE(0xc0000000), TOBYTE(0xc00001ff), tms34010_io_register_r },
105 	{ TOBYTE(0xff000000), TOBYTE(0xffffffff), MRA16_ROM },
106 MEMORY_END
107 
108 
109 static MEMORY_WRITE16_START( writemem )
110 	{ TOBYTE(0x00000000), TOBYTE(0x003fffff), MWA16_RAM, &tickee_vram },
111 	{ TOBYTE(0x04000000), TOBYTE(0x04003fff), MWA16_RAM, (data16_t **)&generic_nvram, &generic_nvram_size },
112 	{ TOBYTE(0x04100000), TOBYTE(0x041000ff), tlc34076_lsb_w },
113 	{ TOBYTE(0x04200000), TOBYTE(0x0420000f), AY8910_control_port_0_lsb_w },
114 	{ TOBYTE(0x04200010), TOBYTE(0x0420001f), AY8910_write_port_0_lsb_w },
115 	{ TOBYTE(0x04200100), TOBYTE(0x0420010f), AY8910_control_port_1_lsb_w },
116 	{ TOBYTE(0x04200110), TOBYTE(0x0420011f), AY8910_write_port_1_lsb_w },
117 	{ TOBYTE(0x04400000), TOBYTE(0x0440007f), tickee_control_w, &tickee_control },
118 	{ TOBYTE(0xc0000000), TOBYTE(0xc00001ff), tms34010_io_register_w },
119 	{ TOBYTE(0xc0000240), TOBYTE(0xc000025f), MWA16_NOP },		/* seems to be a bug in their code */
120 	{ TOBYTE(0xff000000), TOBYTE(0xffffffff), MWA16_ROM, &code_rom },
121 MEMORY_END
122 
123 
124 
125 /*************************************
126  *
127  *	Input ports
128  *
129  *************************************/
130 
131 INPUT_PORTS_START( tickee )
132 	PORT_START
133 	PORT_DIPNAME( 0x03, 0x01, "Game Time/Diff" )
134 	PORT_DIPSETTING(    0x03, "Very Fast/Very Easy" )
135 	PORT_DIPSETTING(    0x02, "Fast/Easy" )
136 	PORT_DIPSETTING(    0x01, "Average/Hard" )
137 	PORT_DIPSETTING(    0x00, "Slow/Very Hard" )
138 	PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ))
139 	PORT_DIPSETTING(    0x04, DEF_STR( Off ))
140 	PORT_DIPSETTING(    0x00, DEF_STR( On ))
141 	PORT_DIPNAME( 0x08, 0x00, "Last Box Tickets" )
142 	PORT_DIPSETTING(    0x00, "1" )
143 	PORT_DIPSETTING(    0x08, "25" )
144 	PORT_DIPNAME( 0x30, 0x30, DEF_STR( Unknown ))
145 	PORT_DIPSETTING(    0x30, "0" )
146 	PORT_DIPSETTING(    0x20, "1" )
147 	PORT_DIPSETTING(    0x10, "2" )
148 	PORT_DIPSETTING(    0x00, "3" )
149 	PORT_DIPNAME( 0xc0, 0x00, DEF_STR( Coinage ))
150 	PORT_DIPSETTING(    0x80, DEF_STR( 3C_1C ))
151 	PORT_DIPSETTING(    0x40, DEF_STR( 2C_1C ))
152 	PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ))
153 	PORT_DIPSETTING(    0xc0, DEF_STR( 1C_2C ))
154 
155 	PORT_START
156 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED )
157 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SPECIAL )	/* right ticket status */
158 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SPECIAL )	/* left ticket status */
159 	PORT_BIT( 0xf8, IP_ACTIVE_LOW, IPT_UNUSED )
160 
161 	PORT_START
162 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER1 )
163 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 )
164 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 )
165 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN2 )
166 	PORT_BIT( 0x30, IP_ACTIVE_LOW, IPT_UNUSED )
167 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE1 )
168 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
169 
170 	PORT_START
171 	PORT_SERVICE( 0x0001, IP_ACTIVE_LOW )
172 	PORT_BIT( 0xfffe, IP_ACTIVE_LOW, IPT_UNUSED )
173 
174 	PORT_START				/* fake analog X */
175 	PORT_ANALOG( 0xff, 0x80, IPT_LIGHTGUN_X, 50, 10, 0, 255 )
176 
177 	PORT_START				/* fake analog Y */
178 	PORT_ANALOG( 0xff, 0x80, IPT_LIGHTGUN_Y, 70, 10, 0, 255 )
179 
180 	PORT_START				/* fake analog X */
181 	PORT_ANALOG( 0xff, 0x80, IPT_LIGHTGUN_X | IPF_PLAYER2, 50, 10, 0, 255 )
182 
183 	PORT_START				/* fake analog Y */
184 	PORT_ANALOG( 0xff, 0x80, IPT_LIGHTGUN_Y | IPF_PLAYER2, 70, 10, 0, 255 )
185 INPUT_PORTS_END
186 
187 
188 
189 /*************************************
190  *
191  *	Sound interfaces
192  *
193  *************************************/
194 
195 static struct AY8910interface ay8910_interface =
196 {
197 	2,
198 	40000000/16,
199 	{ 50, 50 },
200 	{ input_port_0_r, port1_r },
201 	{ input_port_2_r, 0 },
202 	{ 0 },
203 	{ 0 }
204 };
205 
206 
207 
208 /*************************************
209  *
210  *	34010 configuration
211  *
212  *************************************/
213 
214 static struct tms34010_config cpu_config =
215 {
216 	0,								/* halt on reset */
217 	NULL,							/* generate interrupt */
218 	NULL,							/* write to shiftreg function */
219 	NULL,							/* read from shiftreg function */
220 	NULL,							/* display address changed */
221 	NULL							/* display interrupt callback */
222 };
223 
224 
225 
226 /*************************************
227  *
228  *	Machine drivers
229  *
230  *************************************/
231 
232 MACHINE_DRIVER_START( tickee )
233 
234 	/* basic machine hardware */
235 	MDRV_CPU_ADD(TMS34010, 40000000/TMS34010_CLOCK_DIVIDER)
MDRV_CPU_CONFIG(cpu_config)236 	MDRV_CPU_CONFIG(cpu_config)
237 	MDRV_CPU_MEMORY(readmem,writemem)
238 
239 	MDRV_FRAMES_PER_SECOND(60)
240 	MDRV_VBLANK_DURATION((1000000 * (232 - 200)) / (60 * 232))
241 
242 	MDRV_MACHINE_INIT(tickee)
243 	MDRV_NVRAM_HANDLER(generic_1fill)
244 
245 	/* video hardware */
246 	MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
247 	MDRV_SCREEN_SIZE(320, 200)
248 	MDRV_VISIBLE_AREA(0, 319, 0, 199)
249 
250 	MDRV_PALETTE_LENGTH(256)
251 
252 	MDRV_VIDEO_START(tickee)
253 	MDRV_VIDEO_UPDATE(tickee)
254 
255 	/* sound hardware */
256 	MDRV_SOUND_ADD(AY8910, ay8910_interface)
257 MACHINE_DRIVER_END
258 
259 
260 
261 /*************************************
262  *
263  *	ROM definitions
264  *
265  *************************************/
266 
267 ROM_START( tickee )
268 	ROM_REGION( TOBYTE(0x800000), REGION_CPU1, 0 )		/* 34010 dummy region */
269 
270 	ROM_REGION16_LE( 0x200000, REGION_USER1, ROMREGION_DISPOSE )	/* 34010 code */
271 	ROM_LOAD16_BYTE( "3.ic4",  0x000000, 0x80000, CRC(5b1e399c) SHA1(681608f06bbaf3d258e9f4768a8a6c5047ad08ec) )
272 	ROM_LOAD16_BYTE( "2.ic3",  0x000001, 0x80000, CRC(1b26d4bb) SHA1(40266ec0fe5897eba85072e5bb39973d34f97546) )
273 	ROM_LOAD16_BYTE( "1.ic2",  0x100000, 0x80000, CRC(f7f0309e) SHA1(4a93e0e203f5a340a56b770a40b9ab00e131644d) )
274 	ROM_LOAD16_BYTE( "4.ic5",  0x100001, 0x80000, CRC(ceb0f559) SHA1(61923fe09e1dfde1eaae297ccbc672bc74a70397) )
275 ROM_END
276 
277 
278 
279 /*************************************
280  *
281  *	Driver init
282  *
283  *************************************/
284 
285 static DRIVER_INIT( tickee )
286 {
287 	/* set up code ROMs */
288 	memcpy(code_rom, memory_region(REGION_USER1), memory_region_length(REGION_USER1));
289 }
290 
291 
292 
293 /*************************************
294  *
295  *	Game drivers
296  *
297  *************************************/
298 
299 GAME( 1994, tickee, 0, tickee, tickee, tickee, ROT0, "Raster Elite", "Tickee Tickats" )
300