1 /*
2 
3   Cross Pang (c)1998 F2 System
4 
5   No Copyright Notice is displayed in the game however the following page
6   lists it as being by F2 System, Released April 1998
7   http://www.f2.co.kr/eng/f2system/intro5.asp
8 
9   The sample rom says 'Oksan' (Oksan made Pass, its unclear how they are
10   related to this game)
11 
12   The game uses an U6612 sound chip which is YM3812 compatible.
13 
14   Audio Test isn't correct when a sound is tested, instead musics are right.
15 
16   The alpha effect is a guess, it might be something more simple like flicker
17 
18 driver by Pierpaolo Prazzoli
19 some bits by David Haywood
20 
21 */
22 
23 #include "driver.h"
24 #include "vidhrdw/generic.h"
25 
26 extern data16_t *crospang_bg_videoram,*crospang_fg_videoram;
27 
28 extern VIDEO_START( crospang );
29 extern VIDEO_UPDATE( crospang );
30 
31 extern WRITE16_HANDLER ( crospang_fg_scrolly_w );
32 extern WRITE16_HANDLER ( crospang_bg_scrolly_w );
33 extern WRITE16_HANDLER ( crospang_fg_scrollx_w );
34 extern WRITE16_HANDLER ( crospang_bg_scrollx_w );
35 extern WRITE16_HANDLER ( crospang_fg_videoram_w );
36 extern WRITE16_HANDLER ( crospang_bg_videoram_w );
37 
WRITE16_HANDLER(crospang_soundlatch_w)38 static WRITE16_HANDLER ( crospang_soundlatch_w )
39 {
40 	if(ACCESSING_LSB)
41 	{
42 		soundlatch_w(0,data & 0xff);
43 	}
44 }
45 
46 /* main cpu */
47 
MEMORY_READ16_START(crospang_readmem)48 static MEMORY_READ16_START( crospang_readmem )
49     { 0x000000, 0x03ffff, MRA16_ROM },
50 	{ 0x120000, 0x1207ff, MRA16_RAM },
51 	{ 0x122000, 0x1227ff, MRA16_RAM },
52 	{ 0x200000, 0x2005ff, MRA16_RAM },
53 	{ 0x210000, 0x2107ff, MRA16_RAM },
54 	{ 0x280000, 0x280001, input_port_0_word_r },
55 	{ 0x280002, 0x280003, input_port_1_word_r },
56 	{ 0x280004, 0x280005, input_port_2_word_r },
57 	{ 0x320000, 0x32ffff, MRA16_RAM },
58 MEMORY_END
59 
60 static MEMORY_WRITE16_START( crospang_writemem )
61     { 0x000000, 0x03ffff, MWA16_ROM },
62 	{ 0x100000, 0x100001, MWA16_NOP },
63 	{ 0x100002, 0x100003, crospang_fg_scrolly_w },
64 	{ 0x100004, 0x100005, crospang_bg_scrollx_w },
65 	{ 0x100006, 0x100007, crospang_bg_scrolly_w },
66 	{ 0x100008, 0x100009, crospang_fg_scrollx_w },
67 	{ 0x10000e, 0x10000f, MWA16_NOP },
68 	{ 0x120000, 0x1207ff, crospang_fg_videoram_w, &crospang_fg_videoram },
69 	{ 0x122000, 0x1227ff, crospang_bg_videoram_w, &crospang_bg_videoram },
70 	{ 0x200000, 0x2005ff, paletteram16_xRRRRRGGGGGBBBBB_word_w, &paletteram16 },
71 	{ 0x210000, 0x2107ff, MWA16_RAM, &spriteram16, &spriteram_size },
72 	{ 0x270000, 0x270001, crospang_soundlatch_w },
73 	{ 0x320000, 0x32ffff, MWA16_RAM },
74 MEMORY_END
75 
76 /* sound cpu */
77 
78 static MEMORY_READ_START( crospang_sound_readmem )
79     { 0x0000, 0xbfff, MRA_ROM },
80 	{ 0xc000, 0xc7ff, MRA_RAM },
81 MEMORY_END
82 
83 static MEMORY_WRITE_START( crospang_sound_writemem )
84     { 0x0000, 0xbfff, MWA_ROM },
85 	{ 0xc000, 0xc7ff, MWA_RAM },
86 MEMORY_END
87 
88 static PORT_READ_START( crospang_sound_readport )
89     { 0x00, 0x00, YM3812_status_port_0_r },
90 	{ 0x02, 0x02, OKIM6295_status_0_r },
91 	{ 0x06, 0x06, soundlatch_r },
92 PORT_END
93 
94 static PORT_WRITE_START( crospang_sound_writeport )
95     { 0x00, 0x00, YM3812_control_port_0_w },
96 	{ 0x01, 0x01, YM3812_write_port_0_w },
97 	{ 0x02, 0x02, OKIM6295_data_0_w },
98 PORT_END
99 
100 INPUT_PORTS_START( crospang )
101 	PORT_START	/* Inputs */
102 	PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP	 | IPF_4WAY | IPF_PLAYER1 )
103 	PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN	 | IPF_4WAY | IPF_PLAYER1 )
104 	PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT	 | IPF_4WAY | IPF_PLAYER1 )
105 	PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT	 | IPF_4WAY | IPF_PLAYER1 )
106 	PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER1 )
107 	PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER1 )
108 	PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN )
109 	PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_START1 )
110 	PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP	 | IPF_4WAY | IPF_PLAYER2 )
111 	PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN   | IPF_4WAY | IPF_PLAYER2 )
112 	PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT	 | IPF_4WAY | IPF_PLAYER2 )
113 	PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT  | IPF_4WAY | IPF_PLAYER2 )
114 	PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 )
115 	PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 )
116 	PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN )
117 	PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_START2 )
118 
119 	PORT_START	/* Coins */
120 	PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNKNOWN )
121 	PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_COIN1 )
122 	PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_COIN2 )
123 	PORT_BIT( 0xfc00, IP_ACTIVE_LOW, IPT_UNKNOWN )
124 
125 	PORT_START	/* DSW */
126 	PORT_DIPNAME( 0x0003, 0x0002, DEF_STR( Coinage ) )
127 	PORT_DIPSETTING(      0x0000, DEF_STR( 3C_1C ) )
128 	PORT_DIPSETTING(      0x0001, DEF_STR( 2C_1C ) )
129 	PORT_DIPSETTING(      0x0002, DEF_STR( 1C_1C ) )
130 	PORT_DIPSETTING(      0x0003, DEF_STR( 1C_2C ) )
131 	PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
132 	PORT_DIPSETTING(      0x0004, DEF_STR( Off ) )
133 	PORT_DIPSETTING(      0x0000, DEF_STR( On ) )
134 	PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
135 	PORT_DIPSETTING(      0x0008, DEF_STR( Off ) )
136 	PORT_DIPSETTING(      0x0000, DEF_STR( On ) )
137 	PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
138 	PORT_DIPSETTING(      0x0010, DEF_STR( Off ) )
139 	PORT_DIPSETTING(      0x0000, DEF_STR( On ) )
140 	PORT_DIPNAME( 0x0020, 0x0020, "Number of Powers" )
141 	PORT_DIPSETTING(      0x0000, "1" )
142 	PORT_DIPSETTING(      0x0020, "2" )
143 	PORT_DIPNAME( 0x00c0, 0x00c0, "Extra Balls" )
144 	PORT_DIPSETTING(      0x00c0, "1" )
145 	PORT_DIPSETTING(      0x0080, "2" )
146 	PORT_DIPSETTING(      0x0040, "3" )
147 	PORT_DIPSETTING(      0x0000, "4" )
148 	PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
149 	PORT_DIPSETTING(      0x0100, DEF_STR( Off ) )
150 	PORT_DIPSETTING(      0x0000, DEF_STR( On ) )
151 	PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
152 	PORT_DIPSETTING(      0x0200, DEF_STR( Off ) )
153 	PORT_DIPSETTING(      0x0000, DEF_STR( On ) )
154 	PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
155 	PORT_DIPSETTING(      0x0400, DEF_STR( Off ) )
156 	PORT_DIPSETTING(      0x0000, DEF_STR( On ) )
157 	PORT_DIPNAME( 0x1800, 0x1800, "Minimum Balls per Row" )
158 	PORT_DIPSETTING(      0x1800, "3" )
159 	PORT_DIPSETTING(      0x1000, "4" )
160 	PORT_DIPSETTING(      0x0800, "5" )
161 	PORT_DIPSETTING(      0x0000, "6" )
162 	PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
163 	PORT_DIPSETTING(      0x2000, DEF_STR( Off ) )
164 	PORT_DIPSETTING(      0x0000, DEF_STR( On ) )
165 	PORT_SERVICE( 0x4000, IP_ACTIVE_LOW )
166 	PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
167 	PORT_DIPSETTING(      0x8000, DEF_STR( Off ) )
168 	PORT_DIPSETTING(      0x0000, DEF_STR( On ) )
169 INPUT_PORTS_END
170 
171 static struct GfxLayout layout_16x16x4a =
172 {
173 	16,16,
174 	RGN_FRAC(1,4),
175 	4,
176 	{ RGN_FRAC(0,4),RGN_FRAC(1,4),RGN_FRAC(2,4),RGN_FRAC(3,4) },
177 	{ 128,129,130,131,132,133,134,135, 0,1,2,3,4,5,6,7 },
178 	{ 8*0, 8*1, 8*2, 8*3, 8*4, 8*5, 8*6, 8*7, 8*8, 8*9, 8*10, 8*11, 8*12, 8*13, 8*14, 8*15 },
179 	8*32
180 };
181 
182 static struct GfxLayout layout_16x16x4 =
183 {
184 	16,16,
185 	RGN_FRAC(1,4),
186 	4,
187 	{ RGN_FRAC(2,4),RGN_FRAC(0,4),RGN_FRAC(3,4),RGN_FRAC(1,4) },
188 	{ 0,1,2,3,4,5,6,7, 128,129,130,131,132,133,134,135 },
189 	{ 8*0, 8*1, 8*2, 8*3, 8*4, 8*5, 8*6, 8*7, 8*8, 8*9, 8*10, 8*11, 8*12, 8*13, 8*14, 8*15 },
190 	8*32
191 };
192 
193 static struct GfxDecodeInfo gfxdecodeinfo[] =
194 {
195 	{ REGION_GFX1, 0, &layout_16x16x4a, 0, 0x10 }, // [0] Sprites
196 	{ REGION_GFX2, 0, &layout_16x16x4,  0, 0x30 }, // [1] Tiles
197 	{ -1 }
198 };
199 
irqhandler(int linestate)200 static void irqhandler(int linestate)
201 {
202 	cpu_set_irq_line(1,0,linestate);
203 }
204 
205 static struct YM3812interface ym3812_interface =
206 {
207 	1,
208 	14318180/4,
209 	{ 100 },		/* volume */
210 	{ irqhandler },	/* IRQ Line */
211 };
212 
213 static struct OKIM6295interface okim6295_interface =
214 {
215 	1,
216 	{ 6000 },	/* ? guess */
217 	{ REGION_SOUND1 },
218 	{ 100 }
219 };
220 
221 static MACHINE_DRIVER_START( crospang )
222 
223 	/* basic machine hardware */
224 	MDRV_CPU_ADD(M68000, 14318180/2)
225 	MDRV_CPU_MEMORY(crospang_readmem,crospang_writemem)
226 	MDRV_CPU_VBLANK_INT(irq6_line_hold,1)
227 
228 	MDRV_CPU_ADD(Z80, 14318180/4)
229 	MDRV_CPU_FLAGS(CPU_AUDIO_CPU)
230 	MDRV_CPU_MEMORY(crospang_sound_readmem,crospang_sound_writemem)
231 	MDRV_CPU_PORTS(crospang_sound_readport,crospang_sound_writeport)
232 
233 	MDRV_FRAMES_PER_SECOND(60)
234 	MDRV_VBLANK_DURATION(DEFAULT_60HZ_VBLANK_DURATION)
235 
236 	/* video hardware */
237 	MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_RGB_DIRECT)
238 	MDRV_SCREEN_SIZE(64*8, 64*8)
239 	MDRV_VISIBLE_AREA(0, 40*8-1, 0, 30*8-1)
240 
241 	MDRV_PALETTE_LENGTH(0x300)
242 	MDRV_GFXDECODE(gfxdecodeinfo)
243 
244 	MDRV_VIDEO_START(crospang)
245 	MDRV_VIDEO_UPDATE(crospang)
246 
247 	/* sound hardware */
248 	MDRV_SOUND_ADD(YM3812, ym3812_interface)
249 	MDRV_SOUND_ADD(OKIM6295, okim6295_interface)
250 MACHINE_DRIVER_END
251 
252 
253 ROM_START( crospang )
254 	ROM_REGION( 0x40000, REGION_CPU1, 0 ) /* 68k */
255 	ROM_LOAD16_BYTE( "p1.bin", 0x00001, 0x20000, CRC(0bcbbaad) SHA1(807f07be340d7af0aad8d49461b5a7f0221ea3b7) )
256 	ROM_LOAD16_BYTE( "p2.bin", 0x00000, 0x20000, CRC(0947d204) SHA1(35e7e277c51888a66d305994bf05c3f6bfc3c29e) )
257 
258 	ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* z80  */
259 	ROM_LOAD( "s1.bin", 0x00000, 0x10000, CRC(d61a224c) SHA1(5cd1b2d136ad58ab550c7ba135558d6c8a4cd8f6) )
260 
261 	ROM_REGION( 0x20000, REGION_SOUND1, 0 ) /* samples */
262 	ROM_LOAD( "s2.bin", 0x00000, 0x20000, CRC(9f9ecd22) SHA1(631ffe14018ba39658c435b8ecb23b19a14569ee) ) // sample rom contains oksan?
263 
264 	ROM_REGION( 0x200000, REGION_GFX1, 0 ) /* sprites */
265 	ROM_LOAD( "rom6.bin", 0x000000, 0x80000, CRC(9c633082) SHA1(18b8591b695ee429c9c9855d8cbba6249a4bd809) )
266 	ROM_LOAD( "rom5.bin", 0x080000, 0x80000, CRC(53a34dc5) SHA1(2e5cf8093bf507e81d7447736b7727c3fd20c471) )
267 	ROM_LOAD( "rom4.bin", 0x100000, 0x80000, CRC(9a91d494) SHA1(1c6280f662f1cf53f7f6defb7e215da75b573fdf) )
268 	ROM_LOAD( "rom3.bin", 0x180000, 0x80000, CRC(cc6e1fce) SHA1(eb5b3ca7222f48916dc6206f987b2669fe7e7c6b) )
269 
270 	ROM_REGION( 0x80000, REGION_GFX2, 0 ) /* bg tiles */
271 	ROM_LOAD( "rom1.bin", 0x00000, 0x40000, CRC(905042bb) SHA1(ed5b97e88d24e55f8fcfaaa34251582976cb2527) )
272 	ROM_LOAD( "rom2.bin", 0x40000, 0x40000, CRC(bc4381e9) SHA1(af0690c253bead3448db5ec8fb258d8284646e89) )
273 ROM_END
274 
275 
276 GAME( 1998, crospang, 0, crospang, crospang, 0, ROT0, "F2 System", "Cross Pang" )
277