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