1
/**************************************************************************
5
Preliminary Driver by Steve Ellenoff & Peo
9
Pierpaolo Prazzoli, xx-07-2004
11
- fixed screen resolution
13
- added fake photo when you get the best score
14
- fixed service switches and coins
15
- added missing roms and the 2nd set
26
- fix sprites positions
28
RAM Location 9240: Controls what level you are on: 0-3 (for each scene)
30
-------------------------------------------------------------------------
45
rom W 18318 18318 rom 15 rom 14
47
8253 18318 18318 rom 05 rom 04
49
8253 18318 18318 rom 13 rom 12
51
TMS5200 18318 18318 rom 03 rom 02
83
DM81LS95 = TriState buffer
84
**************************************************************************/
87
#include "cpu/z80/z80.h"
88
#include "cpu/mcs48/mcs48.h"
89
#include "sound/tms5220.h"
90
#include "machine/nvram.h"
91
#include "includes/portrait.h"
93
static WRITE8_HANDLER( portrait_ctrl_w )
95
/* bits 4 and 5 are unknown */
97
coin_counter_w(space->machine(), 0, data & 0x01);
98
coin_counter_w(space->machine(), 1, data & 0x02);
99
coin_counter_w(space->machine(), 2, data & 0x04);
101
/* the 2 lamps near the camera */
102
set_led_status(space->machine(), 0, data & 0x08);
103
set_led_status(space->machine(), 1, data & 0x40);
105
/* shows the black and white photo from the camera */
106
output_set_value("photo", (data >> 7) & 1);
109
static WRITE8_HANDLER( portrait_positive_scroll_w )
111
portrait_state *state = space->machine().driver_data<portrait_state>();
112
state->m_scroll = data;
115
static WRITE8_HANDLER( portrait_negative_scroll_w )
117
portrait_state *state = space->machine().driver_data<portrait_state>();
118
state->m_scroll = - (data ^ 0xff);
121
static ADDRESS_MAP_START( portrait_map, AS_PROGRAM, 8 )
122
AM_RANGE(0x0000, 0x7fff) AM_ROM
123
AM_RANGE(0x8000, 0x87ff) AM_RAM_WRITE(portrait_bgvideo_write) AM_BASE_MEMBER(portrait_state, m_bgvideoram)
124
AM_RANGE(0x8800, 0x8fff) AM_RAM_WRITE(portrait_fgvideo_write) AM_BASE_MEMBER(portrait_state, m_fgvideoram)
125
AM_RANGE(0x9000, 0x91ff) AM_RAM AM_BASE_SIZE_MEMBER(portrait_state, m_spriteram, m_spriteram_size)
126
AM_RANGE(0x9200, 0x97ff) AM_RAM
127
AM_RANGE(0xa000, 0xa000) AM_WRITE(soundlatch_w)
128
AM_RANGE(0xa010, 0xa010) AM_WRITENOP // ?
129
AM_RANGE(0xa000, 0xa000) AM_READ_PORT("DSW1")
130
AM_RANGE(0xa004, 0xa004) AM_READ_PORT("DSW2")
131
AM_RANGE(0xa008, 0xa008) AM_READ_PORT("SYSTEM") AM_WRITE(portrait_ctrl_w)
132
AM_RANGE(0xa010, 0xa010) AM_READ_PORT("INPUTS")
133
AM_RANGE(0xa018, 0xa018) AM_READNOP AM_WRITE(portrait_positive_scroll_w)
134
AM_RANGE(0xa019, 0xa019) AM_WRITE(portrait_negative_scroll_w)
135
AM_RANGE(0xa800, 0xa83f) AM_RAM AM_SHARE("nvram")
136
AM_RANGE(0xffff, 0xffff) AM_READNOP
140
static ADDRESS_MAP_START( portrait_sound_map, AS_PROGRAM, 8 )
141
AM_RANGE(0x0000, 0x0fff) AM_ROM
145
static INPUT_PORTS_START( portrait )
147
PORT_DIPNAME( 0x0f, 0x08, DEF_STR( Coin_A ) )
148
PORT_DIPSETTING( 0x08, DEF_STR( 1C_1C ) )
149
PORT_DIPSETTING( 0x09, DEF_STR( 1C_2C ) )
150
PORT_DIPSETTING( 0x0a, DEF_STR( 1C_3C ) )
151
PORT_DIPSETTING( 0x0b, DEF_STR( 1C_4C ) )
152
PORT_DIPSETTING( 0x0c, DEF_STR( 1C_5C ) )
153
PORT_DIPSETTING( 0x0d, DEF_STR( 1C_7C ) )
154
PORT_DIPSETTING( 0x0e, "1 Coin / 10 Credits" )
155
PORT_DIPSETTING( 0x0f, "1 Coin / 12 Credits" )
156
PORT_DIPSETTING( 0x00, DEF_STR( 3C_1C ) )
157
PORT_DIPSETTING( 0x04, DEF_STR( 2C_1C ) )
158
PORT_DIPSETTING( 0x05, DEF_STR( 2C_3C ) )
159
PORT_DIPSETTING( 0x06, DEF_STR( 2C_5C ) )
160
PORT_DIPSETTING( 0x07, DEF_STR( 2C_7C ) )
161
PORT_DIPSETTING( 0x01, "3 Coins / 5 Credits" )
162
PORT_DIPSETTING( 0x02, "3 Coins / 7 Credits" )
163
PORT_DIPSETTING( 0x03, "3 Coins / 10 Credits" )
164
PORT_DIPNAME( 0x70, 0x40, DEF_STR( Coin_B ) )
165
PORT_DIPSETTING( 0x40, DEF_STR( 1C_1C ) )
166
PORT_DIPSETTING( 0x50, DEF_STR( 1C_2C ) )
167
PORT_DIPSETTING( 0x60, DEF_STR( 1C_5C ) )
168
PORT_DIPSETTING( 0x70, "1 Coin / 10 Credits" )
169
PORT_DIPSETTING( 0x00, DEF_STR( 3C_1C ) )
170
PORT_DIPSETTING( 0x10, DEF_STR( 2C_1C ) )
171
PORT_DIPSETTING( 0x20, DEF_STR( 2C_3C ) )
172
PORT_DIPSETTING( 0x30, DEF_STR( 2C_5C ) )
173
PORT_DIPNAME( 0x80, 0x00, "Service Coin" )
174
PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
175
PORT_DIPSETTING( 0x80, DEF_STR( 1C_2C ) )
178
PORT_DIPNAME( 0x01, 0x00, "Game Play" )
179
PORT_DIPSETTING( 0x00, "Normal Play" )
180
PORT_DIPSETTING( 0x01, "Freeplay (255 Cameras)" )
181
PORT_DIPNAME( 0x02, 0x00, "High Score" )
182
PORT_DIPSETTING( 0x00, "11.350 Points" )
183
PORT_DIPSETTING( 0x02, "1.350 Points" )
184
PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Lives ) )
185
PORT_DIPSETTING( 0x00, "2" )
186
PORT_DIPSETTING( 0x04, "3" )
187
PORT_DIPSETTING( 0x08, "4" )
188
PORT_DIPSETTING( 0x0c, "5" )
189
PORT_DIPNAME( 0x30, 0x30, "Extra Camera" )
190
PORT_DIPSETTING( 0x00, DEF_STR( None ) )
191
PORT_DIPSETTING( 0x10, "Every 10.000 Points" )
192
PORT_DIPSETTING( 0x20, "Every 20.000 Points" )
193
PORT_DIPSETTING( 0x30, "Every 30.000 Points" )
194
PORT_DIPNAME( 0x40, 0x00, "Ostrich Speed" )
195
PORT_DIPSETTING( 0x00, "Slow" )
196
PORT_DIPSETTING( 0x40, "Quick" )
197
PORT_DIPNAME( 0x80, 0x80, "Obstacles" )
198
PORT_DIPSETTING( 0x80, DEF_STR( No ) )
199
PORT_DIPSETTING( 0x00, DEF_STR( Yes ) )
202
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(2)
203
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(2)
204
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_IMPULSE(2)
205
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_TILT )
206
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START1 )
207
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 )
208
PORT_DIPNAME( 0x40, 0x40, "Service Switch 1" )
209
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
210
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
211
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
214
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY
215
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY
216
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY
217
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY
218
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
219
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE2 ) // hold during boot to clear the NVRAM
220
PORT_DIPNAME( 0x40, 0x40, "Service Switch 2" )
221
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
222
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
223
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
226
static const gfx_layout tile_layout =
228
16,16, /* tile width, height */
229
1024, /* number of characters */
230
3, /* bits per pixel */
231
{ 0x8000*8, 0x4000*8, 0x0000*8 }, /* bitplane offsets */
233
RGN_FRAC(1,2)+7, RGN_FRAC(1,2)+6, RGN_FRAC(1,2)+5, RGN_FRAC(1,2)+4,
234
RGN_FRAC(1,2)+3, RGN_FRAC(1,2)+2, RGN_FRAC(1,2)+1, RGN_FRAC(1,2)+0,
235
0, 1, 2, 3, 4, 5, 6, 7
237
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 8*9, 8*10, 8*11, 8*12, 8*13, 8*14, 8*15 },
238
8*16 /* character offset */
241
static GFXDECODE_START( portrait )
242
GFXDECODE_ENTRY( "gfx1", 0x00000, tile_layout, 0, 0x800/8 )
245
static MACHINE_CONFIG_START( portrait, portrait_state )
246
MCFG_CPU_ADD("maincpu", Z80, 4000000) /* 4 MHz ? */
247
MCFG_CPU_PROGRAM_MAP(portrait_map)
248
MCFG_CPU_VBLANK_INT("screen", irq0_line_hold)
250
MCFG_CPU_ADD("audiocpu", I8039, 3120000) /* ? */
251
MCFG_CPU_PROGRAM_MAP(portrait_sound_map)
254
MCFG_NVRAM_ADD_0FILL("nvram")
256
MCFG_SCREEN_ADD("screen", RASTER)
257
MCFG_SCREEN_REFRESH_RATE(50)
258
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
259
MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
260
MCFG_SCREEN_SIZE(64*8, 64*8)
261
MCFG_SCREEN_VISIBLE_AREA(0*8, 54*8-1, 0*8, 40*8-1)
262
MCFG_SCREEN_UPDATE(portrait)
264
MCFG_GFXDECODE(portrait)
265
MCFG_PALETTE_LENGTH(0x800)
266
MCFG_PALETTE_INIT(portrait)
268
MCFG_VIDEO_START(portrait)
271
MCFG_SPEAKER_STANDARD_MONO("mono")
273
MCFG_SOUND_ADD("tms", TMS5200, 640000)
274
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
278
ROM_START( portrait )
279
ROM_REGION( 0x10000, "maincpu", 0 ) /* 64k for the cpu */
280
ROM_LOAD( "prt-p0.bin", 0x0000, 0x2000, CRC(a21874fa) SHA1(3db863f465a35d7d14dd71b47aa7dfe7b39fccf0) )
281
ROM_LOAD( "prt-p1.bin", 0x2000, 0x2000, CRC(4d4d7793) SHA1(f828950ebbf285fc92c65f24421a20ceacef1cb9) )
282
ROM_LOAD( "prt-p2.bin", 0x4000, 0x2000, CRC(83d88c9c) SHA1(c876f72b66537a49620fa27a5cb8a4aecd378f0a) )
283
ROM_LOAD( "prt-p3.bin", 0x6000, 0x2000, CRC(bd32d007) SHA1(cdf814b00c22f9a4503fa54d43fb5781251b67a7) )
285
ROM_REGION( 0x1000, "audiocpu", 0 )
286
ROM_LOAD( "port_w.bin", 0x0000, 0x0800, CRC(d3a4e950) SHA1(0a399d43c7690d568874f3b1d55135f803fc223f) )
287
ROM_LOAD( "port_ma.bin", 0x0800, 0x0800, CRC(ee242e4f) SHA1(fb67e0d136927e04f4fa819f684c97b0d52ee48c) )
289
ROM_REGION( 0x20000, "gfx1", 0 )
290
ROM_LOAD( "port_00.a1", 0x00000, 0x2000, CRC(eb3e1c12) SHA1(2d38b66f52546b40553244c8a5c961279559f5b6) ) /*bit plane 1*/
291
ROM_LOAD( "port_10.b1", 0x02000, 0x2000, CRC(0f44e377) SHA1(1955f9f4deab2166f637f43c1f326bd65fc90f6a) ) /*bit plane 1*/
293
ROM_LOAD( "port_02.d1", 0x04000, 0x2000, CRC(bd93a3f9) SHA1(9cb479b8840cafd6043ff0cb9d5ca031dcd332ba) ) /*bit plane 2*/
294
ROM_LOAD( "port_12.e1", 0x06000, 0x2000, CRC(656b9f20) SHA1(c1907aba3d19be79d92cd73784b8e7ae94910da6) ) /*bit plane 2*/
296
ROM_LOAD( "port_04.g1", 0x08000, 0x2000, CRC(2a99feb5) SHA1(b373d2a2bd28aad6dd7a15a2166e03a8b7a34d9b) ) /*bit plane 3*/
297
ROM_LOAD( "port_14.g1", 0x0a000, 0x2000, CRC(224b7a58) SHA1(b84e70d22d1cab41e5773fc9daa2e4e55ec9d96e) ) /*bit plane 3*/
299
ROM_LOAD( "port_01.a2", 0x10000, 0x2000, CRC(70d27508) SHA1(d011f85b31bb3aa6f386e8e0edb91df10f4c4eb6) ) /*bit plane 1*/
300
ROM_LOAD( "port_11.b2", 0x12000, 0x2000, CRC(f498e395) SHA1(beb1d12433a350e5b773126de3f2803a9f5620c1) ) /*bit plane 1*/
302
ROM_LOAD( "port_03.d2", 0x14000, 0x2000, CRC(03d4153a) SHA1(7ce69ce6a101870dbfca1a9787fb1e660024bc02) ) /*bit plane 2*/
303
ROM_LOAD( "port_13.e2", 0x16000, 0x2000, CRC(10fa22b8) SHA1(e8f4c24fcdda0ce5e33bc600acd574a232a9bb21) ) /*bit plane 2*/
305
ROM_LOAD( "port_05.g2", 0x18000, 0x2000, CRC(43ea7951) SHA1(df0ae7fa802365979514063e1d67cdd45ecada90) ) /*bit plane 3*/
306
ROM_LOAD( "port_15.h2", 0x1a000, 0x2000, CRC(ab20b438) SHA1(ea5d60f6a9f06397bd0c6ee028b463c684090c01) ) /*bit plane 3*/
308
ROM_REGION( 0x0800, "user1", 0 ) // sound related?
309
ROM_LOAD( "port_sa.bin", 0x0000, 0x0800, CRC(50510897) SHA1(8af0f42699602a5b33500968c958e3784e03377f) )
311
ROM_REGION( 0x800, "tileattr", 0 ) // tile attributes
312
ROM_LOAD( "93z511.bin", 0x0000, 0x0800, CRC(d66d9036) SHA1(7a25efbd8f2f94a01aad9e2be9cb18da7b9ec1d1) )
314
ROM_REGION( 0x40, "proms", 0 ) // colors
315
ROM_LOAD( "port_pr1.bin", 0x00, 0x0020, CRC(1e2deabb) SHA1(8357e53dba26bca9bc5d7a25c715836f0b3700b9) )
316
ROM_LOAD( "port_pr2.n4", 0x20, 0x0020, CRC(008634f3) SHA1(7cde6b09ede672d562569866d944428198f2ba9c) )
319
ROM_START( portraita )
320
ROM_REGION( 0x10000, "maincpu", 0 ) /* 64k for the cpu */
321
ROM_LOAD( "portp0f.m1", 0x0000, 0x2000, CRC(333eace3) SHA1(8f02df09d8b50d7e37d5abf7d539624c59a7201e) )
322
ROM_LOAD( "portp0f.p1", 0x2000, 0x2000, CRC(fe258052) SHA1(f453eb05c68d61dfd644688732ff5c07366c68c0) )
323
ROM_LOAD( "portp2f.r1", 0x4000, 0x2000, CRC(bc0104d5) SHA1(7707b85cde2dc9bd95391d4e1dbed219c52618cd) )
324
ROM_LOAD( "portp3f.s1", 0x6000, 0x2000, CRC(3f5a3bdf) SHA1(cc4b5d24d0df0962b0cfd4d5c66baac5e4718237) )
326
ROM_REGION( 0x1000, "audiocpu", 0 )
327
ROM_LOAD( "port_w.bin", 0x0000, 0x0800, CRC(d3a4e950) SHA1(0a399d43c7690d568874f3b1d55135f803fc223f) )
328
ROM_LOAD( "port_ma.bin", 0x0800, 0x0800, CRC(ee242e4f) SHA1(fb67e0d136927e04f4fa819f684c97b0d52ee48c) )
330
ROM_REGION( 0x20000, "gfx1", ROMREGION_INVERT )
331
ROM_LOAD( "port_00.a1", 0x00000, 0x2000, CRC(eb3e1c12) SHA1(2d38b66f52546b40553244c8a5c961279559f5b6) ) /*bit plane 1*/
332
ROM_LOAD( "port_10.b1", 0x02000, 0x2000, CRC(0f44e377) SHA1(1955f9f4deab2166f637f43c1f326bd65fc90f6a) ) /*bit plane 1*/
333
ROM_LOAD( "port_02.d1", 0x04000, 0x2000, CRC(bd93a3f9) SHA1(9cb479b8840cafd6043ff0cb9d5ca031dcd332ba) ) /*bit plane 2*/
334
ROM_LOAD( "port_12.e1", 0x06000, 0x2000, CRC(656b9f20) SHA1(c1907aba3d19be79d92cd73784b8e7ae94910da6) ) /*bit plane 2*/
335
ROM_LOAD( "port_04.g1", 0x08000, 0x2000, CRC(2a99feb5) SHA1(b373d2a2bd28aad6dd7a15a2166e03a8b7a34d9b) ) /*bit plane 3*/
336
ROM_LOAD( "port_14.g1", 0x0a000, 0x2000, CRC(224b7a58) SHA1(b84e70d22d1cab41e5773fc9daa2e4e55ec9d96e) ) /*bit plane 3*/
338
ROM_LOAD( "port_01.a2", 0x10000, 0x2000, CRC(70d27508) SHA1(d011f85b31bb3aa6f386e8e0edb91df10f4c4eb6) ) /*bit plane 1*/
339
ROM_LOAD( "port_11.b2", 0x12000, 0x2000, CRC(f498e395) SHA1(beb1d12433a350e5b773126de3f2803a9f5620c1) ) /*bit plane 1*/
340
ROM_LOAD( "port_03.d2", 0x14000, 0x2000, CRC(03d4153a) SHA1(7ce69ce6a101870dbfca1a9787fb1e660024bc02) ) /*bit plane 2*/
341
ROM_LOAD( "port_13.e2", 0x16000, 0x2000, CRC(10fa22b8) SHA1(e8f4c24fcdda0ce5e33bc600acd574a232a9bb21) ) /*bit plane 2*/
342
ROM_LOAD( "port_05.g2", 0x18000, 0x2000, CRC(43ea7951) SHA1(df0ae7fa802365979514063e1d67cdd45ecada90) ) /*bit plane 3*/
343
ROM_LOAD( "port_15.h2", 0x1a000, 0x2000, CRC(ab20b438) SHA1(ea5d60f6a9f06397bd0c6ee028b463c684090c01) ) /*bit plane 3*/
345
ROM_REGION( 0x800, "tileattr", 0 ) // tile attributes (see notes)
346
ROM_LOAD( "93z511.bin", 0x0000, 0x0800, CRC(d66d9036) SHA1(7a25efbd8f2f94a01aad9e2be9cb18da7b9ec1d1) )
348
ROM_REGION( 0x40, "proms", 0 ) // colors
349
ROM_LOAD( "port_pr1.bin", 0x00, 0x0020, CRC(1e2deabb) SHA1(8357e53dba26bca9bc5d7a25c715836f0b3700b9) )
350
ROM_LOAD( "port_pr2.n4", 0x20, 0x0020, CRC(008634f3) SHA1(7cde6b09ede672d562569866d944428198f2ba9c) )
355
this appears to be divided into 2 0x400 banks
357
0x000 - 0x3ff relates to tiles 0x000-0x0ff
359
0x400 - 0x7ff relates to tiles 0x100-0x1ff, 0x200-0x2ff, and 0x300-0x3ff
361
every 2 tiles are somehow related to 8 bytes in the data
363
so tiles 0x00 and 0x01 use bytes 0x000-0x007
373
0xfe and 0xff use bytes 0x3f8-0x3ff
376
it's probably some kind of lookup table for the colours (6bpp = 8 colours, maybe every 2 tiles share the same 8 colours)
377
I guess either the bank (0/1) can be selected, or bank 0 is hardcoded to tiles 0x000-0x0ff (because tilemaps can use
378
these tiles too, so it's not a case of it being a sprite/tilemap lookup split)
380
anyway.. this is why the portraits logo is broken across 3 areas (0x1f2, 0x2f2, 0x3f2) so that they can share the same
381
attributes from this rom
387
GAME( 1983, portrait, 0, portrait, portrait, 0, ROT270, "Olympia", "Portraits (set 1)", GAME_NO_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_WRONG_COLORS )
388
GAME( 1983, portraita,portrait, portrait, portrait, 0, ROT270, "Olympia", "Portraits (set 2)", GAME_NO_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_WRONG_COLORS )