1 /***************************************************************************
2 
3 Appoooh memory map (preliminary)
4 Similar to Bank Panic
5 
6 driver by Tatsuyuki Satoh
7 
8 
9 0000-9fff ROM
10 a000-dfff BANKED ROM
11 e000-e7ff RAM
12 e800-efff RAM??
13 
14 write:
15 f000-f01f Sprite RAM #1
16 f020-f3ff Video  RAM #1
17 f420-f7ff Color  RAM #1
18 f800-f81f Sprite RAM #2
19 f820-fbff Video  RAM #2
20 fc20-ffff Color  RAM #2
21 
22 I/O
23 
24 read:
25 00  IN0
26 01  IN1
27 03  DSW
28 04  IN2
29 
30 write:
31 00  SN76496 #1
32 01  SN76496 #2
33 02  SN76496 #3
34 03  MSM5205 address write
35 04  bit 0   = NMI enable
36     bit 1   = flipscreen
37     bit 2-3 = ?
38     bit 4-5 = priority
39     bit 6   = bank rom select
40     bit 7   = ?
41 05  horizontal scroll ??
42 
43 Credits:
44 - Tatsuyuki Satoh: MAME driver
45 
46 ***************************************************************************/
47 
48 #include "driver.h"
49 #include "appoooh.h"
50 
51 static unsigned char *adpcmptr = 0;
52 static int appoooh_adpcm_data;
53 
appoooh_adpcm_int(int num)54 static void appoooh_adpcm_int(int num)
55 {
56 	if( adpcmptr )
57 	{
58 		if( appoooh_adpcm_data==-1)
59 		{
60 			appoooh_adpcm_data = *adpcmptr++;
61 			MSM5205_data_w(0,appoooh_adpcm_data >> 4);
62 			if(appoooh_adpcm_data==0x70)
63 			{
64 				adpcmptr = 0;
65 				MSM5205_reset_w(0,1);
66 			}
67 		}else{
68 			MSM5205_data_w(0,appoooh_adpcm_data & 0x0f );
69 			appoooh_adpcm_data =-1;
70 		}
71 	}
72 }
73 /* adpcm address write */
WRITE_HANDLER(appoooh_adpcm_w)74 static WRITE_HANDLER( appoooh_adpcm_w )
75 {
76 	unsigned char *RAM = memory_region(REGION_SOUND1);
77 	adpcmptr  = &RAM[data*256];
78 	MSM5205_reset_w(0,0);
79 	appoooh_adpcm_data=-1;
80 }
81 
82 
83 
MEMORY_READ_START(readmem)84 static MEMORY_READ_START( readmem )
85 	{ 0x0000, 0x9fff, MRA_ROM },
86 	{ 0xa000, 0xdfff, MRA_BANK1 },
87 	{ 0xe000, 0xe7ff, MRA_RAM },
88 	{ 0xe800, 0xefff, MRA_RAM }, /* RAM ? */
89 	{ 0xf000, 0xffff, MRA_RAM },
90 MEMORY_END
91 
92 static MEMORY_WRITE_START( writemem )
93 	{ 0x0000, 0xdfff, MWA_ROM },
94 	{ 0xe000, 0xe7ff, MWA_RAM },
95 	{ 0xe800, 0xefff, MWA_RAM }, /* RAM ? */
96 	{ 0xf000, 0xf01f, MWA_RAM, &spriteram  },
97 	{ 0xf020, 0xf3ff, appoooh_fg_videoram_w, &appoooh_fg_videoram },
98 	{ 0xf420, 0xf7ff, appoooh_fg_colorram_w, &appoooh_fg_colorram },
99 	{ 0xf800, 0xf81f, MWA_RAM, &spriteram_2 },
100 	{ 0xf820, 0xfbff, appoooh_bg_videoram_w, &appoooh_bg_videoram },
101 	{ 0xfc20, 0xffff, appoooh_bg_colorram_w, &appoooh_bg_colorram },
102 MEMORY_END
103 
104 static PORT_READ_START( readport )
105 	{ 0x00, 0x00, input_port_0_r },	/* IN0 */
106 	{ 0x01, 0x01, input_port_1_r },	/* IN1 */
107 	{ 0x03, 0x03, input_port_3_r },	/* DSW */
108 	{ 0x04, 0x04, input_port_2_r },	/* IN2 */
109 PORT_END
110 
111 static PORT_WRITE_START( writeport )
112 	{ 0x00, 0x00, SN76496_0_w },
113 	{ 0x01, 0x01, SN76496_1_w },
114 	{ 0x02, 0x02, SN76496_2_w },
115 	{ 0x03, 0x03, appoooh_adpcm_w },
116 	{ 0x04, 0x04, appoooh_out_w  },
117 	{ 0x05, 0x05, appoooh_scroll_w }, /* unknown */
118 PORT_END
119 
120 
121 
122 INPUT_PORTS_START( appoooh )
123 	PORT_START	/* IN0 */
124 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP | IPF_8WAY )
125 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_8WAY )
126 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN | IPF_8WAY )
127 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT | IPF_8WAY )
128 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 )
129 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_COIN1 )
130 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_COIN2 )
131 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON2 )
132 
133 	PORT_START	/* IN1 */
134 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP | IPF_8WAY | IPF_COCKTAIL )
135 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_COCKTAIL )
136 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN | IPF_8WAY | IPF_COCKTAIL )
137 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT | IPF_8WAY | IPF_COCKTAIL )
138 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 | IPF_COCKTAIL )
139 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START1 )
140 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_START2 )
141 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON2 | IPF_COCKTAIL )
142 
143 	PORT_START	/* IN2 */
144 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 )
145 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 | IPF_COCKTAIL )
146 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN3 )
147 	PORT_BIT( 0xf8, IP_ACTIVE_HIGH, IPT_UNKNOWN )	/* probably unused */
148 
149 	PORT_START	/* DSW */
150 	PORT_DIPNAME( 0x07, 0x00, DEF_STR( Coin_A ) )
151 	PORT_DIPSETTING(    0x03, DEF_STR( 4C_1C ) )
152 	PORT_DIPSETTING(    0x02, DEF_STR( 3C_1C ) )
153 	PORT_DIPSETTING(    0x01, DEF_STR( 2C_1C ) )
154 	PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) )
155 	PORT_DIPSETTING(    0x07, DEF_STR( 2C_3C ) )
156 	PORT_DIPSETTING(    0x04, DEF_STR( 1C_2C ) )
157 	PORT_DIPSETTING(    0x05, DEF_STR( 1C_3C ) )
158 	PORT_DIPSETTING(    0x06, DEF_STR( 1C_4C ) )
159 	PORT_DIPNAME( 0x18, 0x00, DEF_STR( Coin_B ) )
160 	PORT_DIPSETTING(    0x18, DEF_STR( 3C_1C ) )
161 	PORT_DIPSETTING(    0x10, DEF_STR( 2C_1C ) )
162 	PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) )
163 	PORT_DIPSETTING(    0x08, DEF_STR( 1C_2C ) )
164 	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Demo_Sounds ) )
165 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
166 	PORT_DIPSETTING(    0x20, DEF_STR( On ) )
167 	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Cabinet ) )
168 	PORT_DIPSETTING(    0x40, DEF_STR( Upright ) )
169 	PORT_DIPSETTING(    0x00, DEF_STR( Cocktail ) )
170 	PORT_DIPNAME( 0x80, 0x00, DEF_STR( Difficulty ) )
171 	PORT_DIPSETTING(    0x00, "Easy" )
172 	PORT_DIPSETTING(    0x80, "Hard" )
173 INPUT_PORTS_END
174 
175 
176 
177 static struct GfxLayout charlayout =
178 {
179 	8,8,	/* 8*8 characters */
180 	2048,	/* 2048 characters */
181 	3,	/* 3 bits per pixel */
182 	{ 2*2048*8*8, 1*2048*8*8, 0*2048*8*8 },	/* the bitplanes are separated */
183 	{ 7, 6, 5, 4, 3, 2, 1, 0 },
184 	{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
185 	8*8	/* every char takes 8 consecutive bytes */
186 };
187 
188 static struct GfxLayout spritelayout =
189 {
190 	16,16,	/* 8*8 characters */
191 	512,	/* 512 characters */
192 	3,	/* 3 bits per pixel */
193 	{ 2*2048*8*8, 1*2048*8*8, 0*2048*8*8 },	/* the bitplanes are separated */
194 	{ 7, 6, 5, 4, 3, 2, 1, 0 ,
195 	  8*8+7,8*8+6,8*8+5,8*8+4,8*8+3,8*8+2,8*8+1,8*8+0},
196 	{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
197 	  16*8, 17*8, 18*8, 19*8, 20*8, 21*8, 22*8, 23*8 },
198 	32*8	/* every char takes 8 consecutive bytes */
199 };
200 
201 static struct GfxDecodeInfo gfxdecodeinfo[] =
202 {
203 	{ REGION_GFX1, 0, &charlayout,        0, 32 },
204 	{ REGION_GFX2, 0, &charlayout,     32*8, 32 },
205 	{ REGION_GFX1, 0, &spritelayout,      0, 32 },
206 	{ REGION_GFX2, 0, &spritelayout,   32*8, 32 },
207 	{ -1 } /* end of array */
208 };
209 
210 
211 
212 static struct SN76496interface sn76496_interface =
213 {
214 	3,	/* 3 chips */
215 	{ 18432000/6, 18432000/6, 18432000/6 },	/* ??? */
216 	{ 30, 30, 30 }
217 };
218 
219 static struct MSM5205interface msm5205_interface =
220 {
221 	1,					/* 1 chip             */
222 	384000,				/* 384KHz             */
223 	{ appoooh_adpcm_int },/* interrupt function */
224 	{ MSM5205_S64_4B },	/* 6KHz               */
225 	{ 50 }
226 };
227 
228 
229 
230 static MACHINE_DRIVER_START( appoooh )
231 
232 	/* basic machine hardware */
233 	MDRV_CPU_ADD(Z80,18432000/6)	/* ??? the main xtal is 18.432 MHz */
234 	MDRV_CPU_MEMORY(readmem,writemem)
235 	MDRV_CPU_PORTS(readport,writeport)
236 	MDRV_CPU_VBLANK_INT(nmi_line_pulse,1)
237 
238 	MDRV_FRAMES_PER_SECOND(60)
239 	MDRV_VBLANK_DURATION(DEFAULT_60HZ_VBLANK_DURATION)
240 
241 	/* video hardware */
242 	MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
243 	MDRV_SCREEN_SIZE(32*8, 32*8)
244 	MDRV_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
245 	MDRV_GFXDECODE(gfxdecodeinfo)
246 	MDRV_PALETTE_LENGTH(32)
247 	MDRV_COLORTABLE_LENGTH(32*8+32*8)
248 
249 	MDRV_PALETTE_INIT(appoooh)
250 	MDRV_VIDEO_START(appoooh)
251 	MDRV_VIDEO_UPDATE(appoooh)
252 
253 	/* sound hardware */
254 	MDRV_SOUND_ADD(SN76496, sn76496_interface)
255 	MDRV_SOUND_ADD(MSM5205, msm5205_interface)
256 MACHINE_DRIVER_END
257 
258 
259 
260 /***************************************************************************
261 
262   Game driver(s)
263 
264 ***************************************************************************/
265 
266 ROM_START( appoooh )
267 	ROM_REGION( 0x14000, REGION_CPU1, 0 )	/* 64k for code + 16k bank */
268 	ROM_LOAD( "epr-5906.bin", 0x00000, 0x2000, CRC(fffae7fe) SHA1(b4bb60eb6331e503759bd963eafefa69331d6b86) )
269 	ROM_LOAD( "epr-5907.bin", 0x02000, 0x2000, CRC(57696cd6) SHA1(74a005d18d55fed9ece9b579d2e7e6619a47538b) )
270 	ROM_LOAD( "epr-5908.bin", 0x04000, 0x2000, CRC(4537cddc) SHA1(ecb71cab7b9269d713399987cbc45ff54735019f) )
271 	ROM_LOAD( "epr-5909.bin", 0x06000, 0x2000, CRC(cf82718d) SHA1(4408c468a422735ae8f69c03003157782f1a0210) )
272 	ROM_LOAD( "epr-5910.bin", 0x08000, 0x2000, CRC(312636da) SHA1(18817df6f2e480810726f7b11f289c59e712ee45) )
273 	ROM_LOAD( "epr-5911.bin", 0x0a000, 0x2000, CRC(0bc2acaa) SHA1(1ae904658ce9e44cdb79f0a13202aaff5c9f9480) ) /* bank0      */
274 	ROM_LOAD( "epr-5913.bin", 0x0c000, 0x2000, CRC(f5a0e6a7) SHA1(7fad534d1fba52078c4ea580ca7601fdd23cbfa6) ) /* a000-dfff  */
275 	ROM_LOAD( "epr-5912.bin", 0x10000, 0x2000, CRC(3c3915ab) SHA1(28b501bda992ac06b10dbb5f1f7d6009f2f5f48c) ) /* bank1     */
276 	ROM_LOAD( "epr-5914.bin", 0x12000, 0x2000, CRC(58792d4a) SHA1(8acdb0ebee5faadadd64bd64db1fdf881ee70333) ) /* a000-dfff */
277 
278 	ROM_REGION( 0x0c000, REGION_GFX1, ROMREGION_DISPOSE )
279 	ROM_LOAD( "epr-5895.bin", 0x00000, 0x4000, CRC(4b0d4294) SHA1(f9f4d928c76b32cbcbaf7bfd0ebec2d4dfc37566) )	/* playfield #1 chars */
280 	ROM_LOAD( "epr-5896.bin", 0x04000, 0x4000, CRC(7bc84d75) SHA1(36e98eaac1ba23ab842080205bdb5b76b888ddc2) )
281 	ROM_LOAD( "epr-5897.bin", 0x08000, 0x4000, CRC(745f3ffa) SHA1(03f5d1d567e786e7835defc6995d1b39aee2c28d) )
282 
283 	ROM_REGION( 0x0c000, REGION_GFX2, ROMREGION_DISPOSE )
284 	ROM_LOAD( "epr-5898.bin", 0x00000, 0x4000, CRC(cf01644d) SHA1(0cc1b7f7a3b33b0edf4e277e320467b19dfc5bc8) )	/* playfield #2 chars */
285 	ROM_LOAD( "epr-5899.bin", 0x04000, 0x4000, CRC(885ad636) SHA1(d040948f7cf030e4ab0f0509df23cb855e9c920c) )
286 	ROM_LOAD( "epr-5900.bin", 0x08000, 0x4000, CRC(a8ed13f3) SHA1(31c4a52fea8f26b4a79564c7e8443a88d43aee12) )
287 
288 	ROM_REGION( 0x0220, REGION_PROMS, 0 )
289 	ROM_LOAD( "pr5921.prm",   0x0000, 0x020, CRC(f2437229) SHA1(8fb4240142f4c77f820d7c153c22ff82f66aa7b1) ) 	/* palette */
290 	ROM_LOAD( "pr5922.prm",   0x0020, 0x100, CRC(85c542bf) SHA1(371d92fca2ae609a47d3a2ea349f14f30b846da8) ) 	/* charset #1 lookup table */
291 	ROM_LOAD( "pr5923.prm",   0x0120, 0x100, CRC(16acbd53) SHA1(e5791646730c6232efa2c0327b484472c47baf21) ) 	/* charset #2 lookup table */
292 
293 	ROM_REGION( 0xa000, REGION_SOUND1, 0 )	/* adpcm voice data */
294 	ROM_LOAD( "epr-5901.bin", 0x0000, 0x2000, CRC(170a10a4) SHA1(7b0c8427c69525cbcbe9f88b22b12aafb6949bfd) )
295 	ROM_LOAD( "epr-5902.bin", 0x2000, 0x2000, CRC(f6981640) SHA1(1a93913ecb64d1c459e5bbcc28c4ca3ea90f21e1) )
296 	ROM_LOAD( "epr-5903.bin", 0x4000, 0x2000, CRC(0439df50) SHA1(1f981c1867366fa57de25ff8f421c121d82d7321) )
297 	ROM_LOAD( "epr-5904.bin", 0x6000, 0x2000, CRC(9988f2ae) SHA1(f70786a46515feb92fe168fc6c4334ab105c05b2) )
298 	ROM_LOAD( "epr-5905.bin", 0x8000, 0x2000, CRC(fb5cd70e) SHA1(c2b069ca29b78b845d0c35c7f7452b70c93cb867) )
299 ROM_END
300 
301 
302 
303 GAME( 1984, appoooh, 0, appoooh, appoooh, 0, ROT0, "[Sanritsu] Sega", "Appoooh" )
304