1 /* Main Event - SNK
2    driver by	David Haywood
3    		Tomasz Slanina
4 
5  ROM doesn't pass its internal checksum
6 
7 
8  Todo:
9   - fix controls (now you need to press button1 + direction for punch/block ) and DIPs
10   - verify position of status bars
11 
12 */
13 
14 #include "driver.h"
15 WRITE_HANDLER( snkwave_w );
16 
17 extern data8_t *me_fgram;
18 extern data8_t *me_bgram;
19 WRITE_HANDLER(me_c600_w);
20 WRITE_HANDLER(me_fgram_w);
21 WRITE_HANDLER(me_bgram_w);
22 READ_HANDLER(me_fgram_r);
23 READ_HANDLER(me_bgram_r);
24 VIDEO_START(mainsnk);
25 VIDEO_UPDATE(mainsnk);
26 
27 static int sound_cpu_ready;
28 static int sound_command;
29 static int sound_fetched;
30 
init_sound(int busy_bit)31 static void init_sound( int busy_bit )
32 {
33 	sound_cpu_ready = 1;
34 	sound_command = 0x00;
35 	sound_fetched = 1;
36 }
37 
WRITE_HANDLER(sound_command_w)38 static WRITE_HANDLER( sound_command_w )
39 {
40 	if( sound_fetched==0 ){
41 		log_cb(RETRO_LOG_DEBUG, LOGPRE "missed sound command: %02x\n", sound_command );
42 	}
43 
44 	sound_fetched = 0;
45 	sound_command = data;
46 	sound_cpu_ready = 0;
47 	cpu_set_irq_line(1, IRQ_LINE_NMI, PULSE_LINE);
48 }
49 
READ_HANDLER(sound_command_r)50 static READ_HANDLER( sound_command_r )
51 {
52 	sound_fetched = 1;
53 	return sound_command;
54 }
55 
READ_HANDLER(sound_ack_r)56 static READ_HANDLER( sound_ack_r )
57 {
58 	sound_cpu_ready = 1;
59 	return 0xff;
60 }
61 
READ_HANDLER(mainsnk_port_0_r)62 static READ_HANDLER( mainsnk_port_0_r )
63 {
64 	int result = input_port_0_r( 0 );
65 	if( !sound_cpu_ready ) result |= 0x20;
66 	return result;
67 }
68 
69 static struct AY8910interface ay8910_interface =
70 {
71 	2,
72 	2000000,
73 	{ 35,35 },
74 	{ 0 },
75 	{ 0 },
76 	{ 0 },
77 	{ 0 }
78 };
79 
MEMORY_READ_START(readmem)80 static MEMORY_READ_START( readmem )
81 	{ 0x0000, 0xbfff, MRA_ROM },
82 	{ 0xc000, 0xc000, mainsnk_port_0_r },
83 	{ 0xC100, 0xC100, input_port_1_r },
84 	{ 0xC200, 0xC200, input_port_2_r },
85 	{ 0xC300, 0xC300, input_port_3_r },
86 	{ 0xC500, 0xC500, input_port_4_r },
87 	{ 0xd800, 0xdbff, me_bgram_r },
88 	{ 0xdc00, 0xdfff, MRA_RAM },
89 	{ 0xe000, 0xe3ff, MRA_RAM },
90 	{ 0xe400, 0xe7ff, MRA_RAM },
91 	{ 0xe800, 0xebff, MRA_RAM },
92 	{ 0xec00, 0xefff, MRA_RAM },
93 	{ 0xf000, 0xf3ff, me_fgram_r },
94 	{ 0xf400, 0xf7ff, MRA_RAM },
95 	{ 0xf800, 0xfbff, MRA_RAM },
96 	{ 0xfc00, 0xffff, MRA_RAM },
97 MEMORY_END
98 
99 static MEMORY_WRITE_START( writemem )
100 	{ 0x0000, 0xbfff, MWA_ROM },
101 	{ 0xC600, 0xC600, me_c600_w },
102 	{ 0xc700, 0xc700, sound_command_w },
103 	{ 0xd800, 0xdbff, me_bgram_w, &me_bgram },
104 	{ 0xdc00, 0xdfff, MWA_RAM },
105 	{ 0xe000, 0xe3ff, MWA_RAM },
106 	{ 0xe400, 0xe7ff, MWA_RAM },
107 	{ 0xe800, 0xebff, MWA_RAM },
108 	{ 0xec00, 0xefff, MWA_RAM },
109 	{ 0xf000, 0xf3ff, me_fgram_w, &me_fgram },
110 	{ 0xf400, 0xf7ff, MWA_RAM },
111 MEMORY_END
112 
113 static MEMORY_READ_START( sound_readmem )
114 	{ 0x0000, 0x3fff, MRA_ROM },
115 	{ 0x8000, 0x87ff, MRA_RAM },
116 	{ 0xa000, 0xa000, sound_command_r },
117 	{ 0xc000, 0xc000, sound_ack_r },
118 
119 MEMORY_END
120 
121 static MEMORY_WRITE_START( sound_writemem )
122 	{ 0x0000, 0x3fff, MWA_ROM },
123 	{ 0x8000, 0x87ff, MWA_RAM },
124 	{ 0xe000, 0xe000, AY8910_control_port_0_w },
125 	{ 0xe001, 0xe001, AY8910_write_port_0_w },
126 	{ 0xe002, 0xe007, snkwave_w },
127 	{ 0xe008, 0xe008, AY8910_control_port_1_w },
128 	{ 0xe009, 0xe009, AY8910_write_port_1_w },
129 MEMORY_END
130 
131 static PORT_READ_START( readport_sound )
132 	{ 0x0000, 0x0000, MRA_NOP },
133 PORT_END
134 
135 INPUT_PORTS_START( mainsnk )
136 	PORT_START
137 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
138 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 )
139 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN3 )
140 	PORT_BIT( 0x08, IP_ACTIVE_LOW,  IPT_START1 )
141 	PORT_BIT( 0x10, IP_ACTIVE_LOW,  IPT_START2 )
142 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* sound CPU status */
143 	PORT_SERVICE( 0x80, IP_ACTIVE_LOW )
144 
145 	PORT_START
146 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP)
147 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  )
148 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  )
149 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT )
150 
151 	PORT_START
152 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_PLAYER2 )
153 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_PLAYER2 )
154 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_PLAYER2 )
155 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_PLAYER2 )
156 
157 	PORT_START
158 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) /* ?? */
159 
160 	PORT_START
161 	PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coinage ) )
162 	PORT_DIPSETTING(    0x01, DEF_STR( 3C_1C ) ) /* also 02,04 */
163 	PORT_DIPSETTING(    0x06, DEF_STR( 2C_1C ) )
164 	PORT_DIPSETTING(    0x07, DEF_STR( 1C_1C ) )
165 	PORT_DIPSETTING(    0x03, DEF_STR( 1C_2C ) )
166 	PORT_DIPSETTING(    0x05, DEF_STR( 1C_3C ) )
167 	PORT_DIPSETTING(    0x00, DEF_STR( Free_Play ) )
168 	PORT_DIPNAME( 0x60, 0x60, "Game mode" )
169 	PORT_DIPSETTING(    0x60, "Demo Sounds Off" )
170 	PORT_DIPSETTING(    0x20, "Demo Sounds On" )
171 	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
172 	PORT_DIPSETTING(    0x00, "Freeze" )
173 	PORT_DIPNAME( 0x08, 0x00, "SW 2-3" )
174 	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
175 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
176 	PORT_DIPNAME( 0x10, 0x00, "SW 2-4" ) /* $1ecf */
177 	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
178 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
179 	PORT_DIPNAME( 0x80, 0x00, "SW 2-7" )
180 	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
181 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
182 
183 INPUT_PORTS_END
184 
185 
186 static struct GfxLayout tile_layout =
187 {
188 	8,8,
189 	RGN_FRAC(1,1),
190 	4,
191 	{ 0, 1, 2, 3 },
192 	{ 4, 0, 12, 8, 20, 16, 28, 24},
193 	{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
194 	256
195 };
196 
197 
198 static struct GfxLayout sprite_layout =
199 {
200 	16,16,
201 	RGN_FRAC(1,3),
202 	3,
203 	{ RGN_FRAC(2,3),RGN_FRAC(1,3),RGN_FRAC(0,3) },
204 	{ 7,6,5,4,3,2,1,0, 15,14,13,12,11,10,9,8 },
205 	{ 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16,
206 		8*16, 9*16, 10*16, 11*16, 12*16, 13*16, 14*16, 15*16 },
207 	256
208 };
209 
210 static struct namco_interface snkwave_interface =
211 {
212 	24000,
213 	1,
214 	8,
215 	-1
216 };
217 
218 
219 static struct GfxDecodeInfo gfxdecodeinfo[] =
220 {
221 	{ REGION_GFX1, 0x0, &tile_layout,	0,  8 },
222 	{ REGION_GFX2, 0x0, &sprite_layout,	0, 16 },
223 	{ -1 }
224 };
225 
226 static MACHINE_DRIVER_START( mainsnk)
227 	MDRV_CPU_ADD(Z80, 3360000)
228 	MDRV_CPU_MEMORY(readmem,writemem)
229 	MDRV_CPU_VBLANK_INT(irq0_line_hold,1)
230 
231 	MDRV_CPU_ADD(Z80,4000000)
232 	MDRV_CPU_FLAGS(CPU_AUDIO_CPU)
233  	MDRV_CPU_MEMORY(sound_readmem,sound_writemem)
234  	MDRV_CPU_PORTS(readport_sound,0)
235 	MDRV_CPU_PERIODIC_INT(irq0_line_hold, 244)
236 
237 	MDRV_FRAMES_PER_SECOND(60.606060)
238 	MDRV_VBLANK_DURATION(DEFAULT_REAL_60HZ_VBLANK_DURATION)
239 	MDRV_GFXDECODE(gfxdecodeinfo)
240 	MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
241 	MDRV_SCREEN_SIZE(34*8, 32*8)
242 	MDRV_VISIBLE_AREA(0*8, 34*8-1, 0*8, 27*8-1)
243 	MDRV_PALETTE_LENGTH((16+2)*16)
244 
245 	MDRV_VIDEO_START(mainsnk)
246 	MDRV_VIDEO_UPDATE(mainsnk)
247 
248 	MDRV_SOUND_ADD(AY8910, ay8910_interface)
249 	MDRV_SOUND_ADD(NAMCO_15XX, snkwave_interface)
250 
251 
252 MACHINE_DRIVER_END
253 
254 
255 ROM_START( mainsnk)
256 	ROM_REGION( 0x10000, REGION_CPU1, 0 )
257 	ROM_LOAD( "snk.p01",      0x000000, 0x002000, CRC(00db1ca2) SHA1(efe83488cf88adc185e6024b8f6ad5f8ef7f4cfd) )
258 	ROM_LOAD( "snk.p02",      0x002000, 0x002000, CRC(df5c86b5) SHA1(e9c854524e3d8231c874314cdff321e66ec7f0c4) )
259 	ROM_LOAD( "snk.p03",      0x004000, 0x002000, CRC(5c2b7bca) SHA1(e02c72fcd029999b730abd91f07866418cfe6216) )
260 	ROM_LOAD( "snk.p04",      0x006000, 0x002000, CRC(68b4b2a1) SHA1(8f3abc826df93f0748151624066e956b9670bc9d) )
261 	ROM_LOAD( "snk.p05",      0x008000, 0x002000, CRC(580a29b4) SHA1(4a96af92d65f86aca7f3a70032b5e4dc29048483) )
262 	ROM_LOAD( "snk.p06",      0x00a000, 0x002000, CRC(5f8a60a2) SHA1(88a051e13d6b3bbd3606a4c4cc0395da07e0f109) )
263 
264 	ROM_REGION( 0x10000, REGION_CPU2, 0 )
265 	ROM_LOAD( "snk.p07",	0x0000, 0x4000, CRC(4208391e) SHA1(d110ca4ff9d21fe7813f04ec43c2c23471c6517f) )
266 
267 	ROM_REGION( 0x08000, REGION_GFX1, 0 )
268 	ROM_LOAD( "snk.p12",      0x000000, 0x002000, CRC(ecf87eb7) SHA1(83b8d19070d5930b306a0309ebba05b04c2abebf) )
269 	ROM_LOAD( "snk.p11",      0x002000, 0x002000, CRC(3f6bc5ba) SHA1(02e49f58f5d94117113b59037fa49b8897d05b4b) )
270 	ROM_LOAD( "snk.p10",      0x004000, 0x002000, CRC(b5147a96) SHA1(72641fadabd16f2de4f4cf6ff3ef07233de5ddfd) )
271 	ROM_LOAD( "snk.p09",      0x006000, 0x002000, CRC(0ebcf837) SHA1(7b93cdffd3b8d768b98bb01956114e4ff012d029) )
272 
273 	ROM_REGION( 0x12000, REGION_GFX2, 0 )
274 	ROM_LOAD( "snk.p13",      0x000000, 0x002000, CRC(2eb624a4) SHA1(157d7beb6ff0baa9276e388774a85996dc03821d) )
275 	ROM_LOAD( "snk.p16",      0x002000, 0x002000, CRC(dc502869) SHA1(024c868e8cd74c52f4787a19b9ad292b7a9dcc1c) )
276 	ROM_LOAD( "snk.p19",      0x004000, 0x002000, CRC(58d566a1) SHA1(1451b223ddb7c975b770f28af6c41775daaf95c1) )
277 	ROM_LOAD( "snk.p14",      0x006000, 0x002000, CRC(bb927d82) SHA1(ac7ae1850cf22b73e31c92b6f598fb057470a570) )
278 	ROM_LOAD( "snk.p17",      0x008000, 0x002000, CRC(66f60c32) SHA1(7a08d0a2c1804cdaad702a23ff33128d0b6d8084) )
279 	ROM_LOAD( "snk.p20",      0x00a000, 0x002000, CRC(d12c6333) SHA1(bed1a0aedaa8f6fe9c33f49b5da00ab1c9045ddd) )
280 	ROM_LOAD( "snk.p15",      0x00c000, 0x002000, CRC(d242486d) SHA1(0c24a3fdcb604b6231b75069c99009d68023bb8f) )
281 	ROM_LOAD( "snk.p18",      0x00e000, 0x002000, CRC(838b12a3) SHA1(a3444f9b2aeef70caa93e5f642cb6c3b75e88ea4) )
282 	ROM_LOAD( "snk.p21",      0x010000, 0x002000, CRC(8961a51e) SHA1(4f9d8358bc76118c4fab631ae73a02ab5aa0c036) )
283 
284 	ROM_REGION( 0x1800, REGION_PROMS, 0 )
285 	ROM_LOAD( "main3.bin",    0x000000, 0x000800, CRC(78b29dde) SHA1(c2f93cde6fd8bc175e9e0d38af41b7710d7f1c82) )
286 	ROM_LOAD( "main2.bin",    0x000800, 0x000800, CRC(7c314c93) SHA1(c6bd2a0eaf617448ef65dcbadced313b0d69ab88) )
287 	ROM_LOAD( "main1.bin",    0x001000, 0x000800, CRC(deb895c4) SHA1(f1281dcb3471d9627565706ff09ba72f09dc62a4) )
288 ROM_END
289 
290 GAME( 1984, mainsnk,      0,          mainsnk, mainsnk, 0,          ROT0, "SNK", "Main Event (1984)")
291