1 // license:BSD-3-Clause
2 // copyright-holders:Roberto Fresca
3 /**********************************************************************************
4
5 FOUR ROSES.
6
7 Driver by Roberto Fresca.
8
9
10 ***********************************************************************************
11
12
13 The hardware is composed by:
14
15 CPU: 1x R65C02P2 (main) at 2MHz.
16 1x EP87C750EBPN (8-bit microcontroller family 1K/64 OTP ROM, low pin count)
17
18 Sound: 1x WF19054 (AY-3-8910 compatible) at 2MHz.
19 1x TDA2003 (audio amp).
20
21 Video: 1x HD46505 (CRT controller)
22 I/O: Custom logic.
23
24 RAM: 1x Elite MT LP62256E-70LL (32Kx8 SRAM, 70ns)
25 NVRAM: 1x Elite MT LP6264D-70LL (8Kx8 SRAM, 70ns)
26 ROMs: 1x TMS27C512 (10).
27 1x TMS27C256 (20).
28 1x M27C4001 (30).
29 1x M27C512 (4.10).
30
31 PLDs: 1x PALCE22V10H (read protected)
32
33 Clock: 1x 16MHz Crystal.
34
35 Other: 1x JAMMA edge connector.
36 1x trimmer (volume).
37 1x 8 DIP switches bank (SW1).
38 1x 4 DIP switches bank (SW2).
39 3x pushbutton (SW3-statistic, SW4-management, SW5-ricarica).
40 1x battery.
41
42
43 GENERAL NOTES:
44
45 - The game is based on Funworld/Tab/CMC games, but the hardware is completely different.
46 It has more complex improvements (encryption, MCU, banks, etc...)
47 - The program ROM is encrypted.
48 - The color palettes are stored in a normal ROM.
49
50
51 ***********************************************************************************
52
53
54 Memory Map
55 ----------
56
57 $0000 - $7FFF Still unknown...
58 $8000 - $FFFF ROM Space.
59
60
61 ***********************************************************************************
62
63
64 Connectors, DIPs and instructions,
65 from original datasheet...
66
67 ---------------------|--|-----------------
68 Components | | solder
69 ---------------------|--|-----------------
70 GND |01| GND
71 GND |02| GND
72 Ricarica |03| +12V. Lamp.
73 Remote |04| +5V. Lamp.
74 Cancel / Play Take |05| Lamp Cancel (Play Take)
75 Start |06| Lamp Start
76 Hold 5 / Half Take |07| Lamp Hold 5 / Half Take
77 Hold 1 |08| Lamp Hold 1
78 Hold 2 / Small |09| Lamp Hold 2 / Small
79 Hold 4 / Big |10| Lamp Hold 4 / Big
80 Hold 3 |11| Lamp Hold 3
81 Ticket sensor |12| Ticket drive
82 Coin 1 A |13| Coin 2 B
83 Management |14| (n/c)
84 GND |15| Statistic
85 Blue |16| Sync
86 Red |17| Green
87 Hopper sensor |18| GND
88 Speaker (+) |19| Speaker (-)
89 Hopper drive |20| Charge Counter
90 Factory Counter |21| Discharge Counter
91 +5V. Counter |22| +12V. Counter
92 +12V. |23| +12V.
93 (n/c) |24| (n/c)
94 +5V. |25| +5V.
95 +5V. |26| +5V.
96 GND |27| GND
97 GND |28| GND
98
99
100 ------------------------------------------------------------
101 DIP SW.#1 1 2 3 4 5 6 7 8
102 ------------------------------------------------------------
103 Remote 10 OFF
104 Remote 100 ON
105 Hopper OFF OFF
106 Ticket ON OFF
107 Ticket + hopper OFF ON
108 Ticket + hopper ON ON
109 CoinA: 1 coin 1 credit OFF OFF
110 CoinA: 1 coin 5 credits OFF ON
111 CoinA: 1 coin 2 credits ON OFF
112 CoinA: 1 coin 10 credits ON ON
113 CoinB: A x1 OFF
114 CoinB: A x10 ON
115 Skills without consuming 1 coin OFF
116 Skills consuming 1 coin ON
117 Select with cards OFF
118 Select without cards ON
119 ------------------------------------------------------------
120
121 --------------------------------------------
122 DIP SW.#2 1 2 3 4
123 --------------------------------------------
124 Game with cards OFF OFF
125 Game with balls ON OFF
126 Game with roses OFF ON
127 Game allow choose ON ON
128 View YES OFF
129 View NO ON
130 Normal Points Table OFF
131 Points Table in Super Game ON
132 --------------------------------------------
133
134
135 Instructions:
136 =============
137
138 Turn on the machine getting STATISTIC & MANAGEMENT buttons pressed.
139
140 STATISTICS = Show credits in/out.
141 To cancel statistics press CANCEL for some seconds.
142
143 MANAGEMENT = Settings.
144 The following menu will show up:
145
146 HOLD3 = Verify In/Out, even when the stats were cleared.
147 HOLD2 + HOLD4 = Modify maximum bet, pressing HOLD1.
148 Modify minimum bet, pressing HOLD2.
149 Modify percentage (1, 2, 3, 4), pressing HOLD3.
150
151 Press START to exit from programming mode.
152
153
154 ***********************************************************************************
155
156 [2008/12/12]
157 - Initial release.
158 - Added technical notes.
159
160
161 *** TO DO ***
162
163 - Decrypt the program ROMs.
164 - Fix memory map.
165 - Fix GFX decode.
166 - Fix color decode routines.
167 - Proper inputs.
168 - MCU simulation.
169 - Dump/decap the MCU.
170
171
172 ***********************************************************************************/
173
174
175 #include "emu.h"
176 #include "includes/funworld.h"
177
178 #include "cpu/m6502/m65c02.h"
179 #include "machine/nvram.h"
180 #include "sound/ay8910.h"
181 #include "video/mc6845.h"
182
183 #include "screen.h"
184 #include "speaker.h"
185
186
187 #define MASTER_CLOCK XTAL(16'000'000)
188
189 class _4roses_state : public funworld_state
190 {
191 public:
_4roses_state(const machine_config & mconfig,device_type type,const char * tag)192 _4roses_state(const machine_config &mconfig, device_type type, const char *tag)
193 : funworld_state(mconfig, type, tag)
194 , m_maincpu(*this, "maincpu")
195 {
196 }
197
198 void driver_init() override;
199 void _4roses(machine_config &config);
200
201 protected:
202 required_device<cpu_device> m_maincpu;
203
204 private:
205 uint8_t _4roses_opcode_r(offs_t offset);
206
207 void _4roses_map(address_map &map);
208 void _4roses_opcodes_map(address_map &map);
209 };
210
211 class rugby_state : public _4roses_state
212 {
213 public:
rugby_state(const machine_config & mconfig,device_type type,const char * tag)214 rugby_state(const machine_config &mconfig, device_type type, const char *tag)
215 : _4roses_state(mconfig, type, tag)
216 {
217 }
218
219 void driver_init() override;
220 void rugby(machine_config &config);
221
222 private:
223 uint8_t rugby_opcode_r(offs_t offset);
224
225 void rugby_map(address_map &map);
226 void rugby_opcodes_map(address_map &map);
227 };
228
229 /**********************
230 * Read/Write Handlers *
231 **********************/
232
233
234
235 /*************************
236 * Memory map information *
237 *************************/
238
_4roses_map(address_map & map)239 void _4roses_state::_4roses_map(address_map &map)
240 {
241 map(0x0000, 0x07ff).ram(); // .share("nvram");
242 map(0x0c00, 0x0c00).r("ay8910", FUNC(ay8910_device::data_r));
243 map(0x0c00, 0x0c01).w("ay8910", FUNC(ay8910_device::address_data_w));
244 map(0x0e00, 0x0e00).w("crtc", FUNC(mc6845_device::address_w));
245 map(0x0e01, 0x0e01).rw("crtc", FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w));
246 map(0x4000, 0x4fff).ram().w(FUNC(_4roses_state::funworld_videoram_w)).share("videoram");
247 map(0x5000, 0x5fff).ram().w(FUNC(_4roses_state::funworld_colorram_w)).share("colorram");
248 map(0x6000, 0xffff).rom().region("maincpu", 0x6000);
249 }
250
_4roses_opcode_r(offs_t offset)251 uint8_t _4roses_state::_4roses_opcode_r(offs_t offset)
252 {
253 uint8_t data = m_maincpu->space(AS_PROGRAM).read_byte(offset);
254
255 switch (offset & 0x7c00)
256 {
257 case 0x6000:
258 data = bitswap<8>(data ^ 0x68, 4, 3, 2, 1, 0, 7, 6, 5);
259 break;
260
261 case 0x6400:
262 data = bitswap<8>(data ^ 0x3f, 3, 4, 2, 5, 1, 6, 0, 7);
263 break;
264
265 case 0x6800:
266 data = bitswap<8>(data ^ 0x6a, 7, 0, 2, 1, 4, 3, 6, 5);
267 break;
268
269 case 0x6c00:
270 data = bitswap<8>(data ^ 0x5e, 6, 1, 4, 5, 2, 3, 0, 7);
271 break;
272
273 case 0x7000:
274 data = bitswap<8>(data ^ 0x34, 3, 7, 2, 6, 1, 5, 0, 4);
275 break;
276
277 case 0x7400:
278 data = bitswap<8>(data ^ 0x43, 7, 2, 5, 0, 6, 1, 3, 4);
279 break;
280 }
281
282 return data;
283 }
284
_4roses_opcodes_map(address_map & map)285 void _4roses_state::_4roses_opcodes_map(address_map &map)
286 {
287 map(0x0000, 0x7fff).r(FUNC(_4roses_state::_4roses_opcode_r));
288 map(0x8000, 0xffff).rom().region("maincpu", 0x8000);
289 }
290
rugby_map(address_map & map)291 void rugby_state::rugby_map(address_map &map)
292 {
293 map(0x0000, 0x07ff).ram(); // .share("nvram");
294 map(0x0c00, 0x0c00).r("ay8910", FUNC(ay8910_device::data_r));
295 map(0x0c00, 0x0c01).w("ay8910", FUNC(ay8910_device::address_data_w));
296 map(0x0e00, 0x0e00).w("crtc", FUNC(mc6845_device::address_w));
297 map(0x0e01, 0x0e01).rw("crtc", FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w));
298 map(0x2000, 0xffff).rom().region("maincpu", 0x2000);
299 map(0x6000, 0x6fff).ram().w(FUNC(rugby_state::funworld_videoram_w)).share("videoram");
300 map(0x7000, 0x7fff).ram().w(FUNC(rugby_state::funworld_colorram_w)).share("colorram");
301 }
302
rugby_opcode_r(offs_t offset)303 uint8_t rugby_state::rugby_opcode_r(offs_t offset)
304 {
305 uint8_t data = m_maincpu->space(AS_PROGRAM).read_byte(offset);
306 if ((offset >> 12) == 4)
307 data = bitswap<8>(data ^ 0xae, 2, 3, 0, 5, 6, 4, 7, 1);
308 return data;
309 }
310
rugby_opcodes_map(address_map & map)311 void rugby_state::rugby_opcodes_map(address_map &map)
312 {
313 map(0x0000, 0x7fff).r(FUNC(rugby_state::rugby_opcode_r));
314 map(0x8000, 0xffff).rom().region("maincpu", 0x8000);
315 }
316
317 /*
318 Unknown R/W
319 -----------
320
321
322 */
323
324
325 /*************************
326 * Input ports *
327 *************************/
328
329 static INPUT_PORTS_START( 4roses )
330 PORT_START("IN0")
331 PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("0-1") PORT_CODE(KEYCODE_1)
332 PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("0-2") PORT_CODE(KEYCODE_2)
333 PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("0-3") PORT_CODE(KEYCODE_3)
334 PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("0-4") PORT_CODE(KEYCODE_4)
335 PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("0-5") PORT_CODE(KEYCODE_5)
336 PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("0-6") PORT_CODE(KEYCODE_6)
337 PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("0-7") PORT_CODE(KEYCODE_7)
338 PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("0-8") PORT_CODE(KEYCODE_8)
339
340 PORT_START("IN1")
341 PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("1-1") PORT_CODE(KEYCODE_Q)
342 PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("1-2") PORT_CODE(KEYCODE_W)
343 PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("1-3") PORT_CODE(KEYCODE_E)
344 PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("1-4") PORT_CODE(KEYCODE_R)
345 PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("1-5") PORT_CODE(KEYCODE_T)
346 PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("1-6") PORT_CODE(KEYCODE_Y)
347 PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("1-7") PORT_CODE(KEYCODE_U)
348 PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("1-8") PORT_CODE(KEYCODE_I)
349
350 PORT_START("IN2")
351 PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("2-1") PORT_CODE(KEYCODE_A)
352 PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("2-2") PORT_CODE(KEYCODE_S)
353 PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("2-3") PORT_CODE(KEYCODE_D)
354 PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("2-4") PORT_CODE(KEYCODE_F)
355 PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("2-5") PORT_CODE(KEYCODE_G)
356 PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("2-6") PORT_CODE(KEYCODE_H)
357 PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("2-7") PORT_CODE(KEYCODE_J)
358 PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("2-8") PORT_CODE(KEYCODE_K)
359
360 PORT_START("IN3")
361 PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("3-1") PORT_CODE(KEYCODE_Z)
362 PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("3-2") PORT_CODE(KEYCODE_X)
363 PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("3-3") PORT_CODE(KEYCODE_C)
364 PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("3-4") PORT_CODE(KEYCODE_V)
365 PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("3-5") PORT_CODE(KEYCODE_B)
366 PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("3-6") PORT_CODE(KEYCODE_N)
367 PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("3-7") PORT_CODE(KEYCODE_M)
368 PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("3-8") PORT_CODE(KEYCODE_L)
369
370 PORT_START("SW1")
371 PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) )
372 PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
373 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
374 PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
375 PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
376 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
377 PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
378 PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
379 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
380 PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
381 PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
382 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
383 PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
384 PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
385 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
386 PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
387 PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
388 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
389 PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
390 PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
391 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
392 PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
393 PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
394 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
395
396 PORT_START("SW2") /* this bank is x4 DIP switches */
397 PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) )
398 PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
399 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
400 PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
401 PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
402 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
403 PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
404 PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
405 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
406 PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
407 PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
408 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
409 PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
410 PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
411 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
412 PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
413 PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
414 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
415 PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
416 PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
417 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
418 PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
419 PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
420 PORT_DIPSETTING( 0x00, DEF_STR( On ) )
421 INPUT_PORTS_END
422
423
424 /*************************
425 * Graphics Layouts *
426 *************************/
427
428 static const gfx_layout charlayout =
429 {
430 /* WRONG... Must be changed */
431 4,
432 8,
433 // 0x1000,
434 RGN_FRAC(1,2),
435 4,
436 // { 0, 4, 0x8000*8, 0x8000*8+4 },
437 { RGN_FRAC(0,2), RGN_FRAC(0,2) + 4, RGN_FRAC(1,2), RGN_FRAC(1,2) + 4 },
438 { 3, 2, 1, 0 },
439 { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
440 8*4*2
441 };
442
443
444 /******************************
445 * Graphics Decode Information *
446 ******************************/
447
448 static GFXDECODE_START( gfx_4roses )
449 GFXDECODE_ENTRY( "gfx1", 0x0000, charlayout, 0, 16 )
450 GFXDECODE_END
451
452
453 /**************************
454 * Machine Drivers *
455 **************************/
456
_4roses(machine_config & config)457 void _4roses_state::_4roses(machine_config &config)
458 {
459 /* basic machine hardware */
460 M65C02(config, m_maincpu, MASTER_CLOCK/8); /* 2MHz, guess */
461 m_maincpu->set_addrmap(AS_PROGRAM, &_4roses_state::_4roses_map);
462 m_maincpu->set_addrmap(AS_OPCODES, &_4roses_state::_4roses_opcodes_map);
463
464 // NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
465
466 /* video hardware */
467
468 screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
469 screen.set_refresh_hz(60);
470 screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
471 screen.set_size((124+1)*4, (30+1)*8); /* guess. taken from funworld games */
472 screen.set_visarea(0*4, 96*4-1, 0*8, 29*8-1); /* guess. taken from funworld games */
473 screen.set_screen_update(FUNC(_4roses_state::screen_update_funworld));
474
475 GFXDECODE(config, m_gfxdecode, "palette", gfx_4roses);
476
477 PALETTE(config, "palette", FUNC(_4roses_state::funworld_palette), 0x1000);
478
479 mc6845_device &crtc(MC6845(config, "crtc", MASTER_CLOCK/8)); /* 2MHz, guess */
480 crtc.set_screen("screen");
481 crtc.set_show_border_area(false);
482 crtc.set_char_width(4);
483 //crtc.out_vsync_callback().set_inputline(m_maincpu, INPUT_LINE_NMI);
484
485 /* sound hardware */
486 SPEAKER(config, "mono").front_center();
487
488 AY8910(config, "ay8910", MASTER_CLOCK/8).add_route(ALL_OUTPUTS, "mono", 2.5); /* 2MHz, guess */
489 }
490
rugby(machine_config & config)491 void rugby_state::rugby(machine_config &config)
492 {
493 _4roses(config);
494
495 m_maincpu->set_addrmap(AS_PROGRAM, &rugby_state::rugby_map);
496 m_maincpu->set_addrmap(AS_OPCODES, &rugby_state::rugby_opcodes_map);
497 }
498
499
500 /*************************
501 * Rom Load *
502 *************************/
503
504 ROM_START( 4roses )
505 ROM_REGION( 0x10000, "maincpu", 0 ) /* encrypted program ROM...*/
CRC(e94440e9)506 ROM_LOAD( "4.10.u32", 0x00000, 0x10000, CRC(e94440e9) SHA1(b2f81ba79f1f40ed35e45fd80c17eb8529ccdb4c) )
507
508 ROM_REGION( 0x0400, "mcu", 0 ) /* protected... no dump available */
509 ROM_LOAD( "ep87c750ebpn_no_dump.u41", 0x0000, 0x0400, NO_DUMP )
510
511 ROM_REGION( 0x80000, "gfx1", 0 )
512 ROM_LOAD( "30.u17", 0x00000, 0x80000, CRC(daefacc2) SHA1(5896e9da06fde39770fcdc585881b8c689b34369) )
513
514 ROM_REGION( 0x18000, "proms", 0 )
515 ROM_LOAD( "20.u43", 0x00000, 0x08000, CRC(f206b4d3) SHA1(dfee226a9e01ddacf09995ec4e027b0ed4dffe7e) )
516 ROM_LOAD( "10.u39", 0x08000, 0x10000, CRC(87dcf9c5) SHA1(b289527b8d9db1e91adf85b53233415c6969f4d4) )
517
518 ROM_REGION( 0x02dd, "plds", 0 )
519 ROM_LOAD( "palce22v10h.u29", 0x0000, 0x02dd, BAD_DUMP CRC(5c4e9024) SHA1(e9d1e4df3d79c21f4ce053a84bb7b7a43d650f91) )
520 ROM_END
521
522 ROM_START( 4rosesa )
523 ROM_REGION( 0x10000, "maincpu", 0 ) /* encrypted program ROM...*/
524 ROM_LOAD( "4.u15", 0x00000, 0x10000, CRC(66bb5b67) SHA1(438371c3918f0a285cb19caa650739df9fb24800) )
525
526 ROM_REGION( 0x0400, "mcu", 0 ) /* protected... no dump available */
527 ROM_LOAD( "ep87c750ebpn_no_dump.u41", 0x0000, 0x0400, NO_DUMP )
528
529 ROM_REGION( 0x80000, "gfx1", 0 )
530 ROM_LOAD( "30.u17", 0x00000, 0x80000, CRC(daefacc2) SHA1(5896e9da06fde39770fcdc585881b8c689b34369) )
531
532 ROM_REGION( 0x20000, "proms", 0 )
533 ROM_LOAD( "20.ub5", 0x00000, 0x10000, CRC(01cc8b15) SHA1(f8e1fa7c0a4ae35debf8eecde31471049308cd60) )
534 ROM_LOAD( "10.ua5", 0x10000, 0x10000, CRC(87dcf9c5) SHA1(b289527b8d9db1e91adf85b53233415c6969f4d4) )
535
536 ROM_REGION( 0x02dd, "plds", 0 )
537 ROM_LOAD( "palce22v10h.u29", 0x0000, 0x02dd, BAD_DUMP CRC(5c4e9024) SHA1(e9d1e4df3d79c21f4ce053a84bb7b7a43d650f91) )
538 ROM_END
539
540 /*
541 2x 6821
542 6845
543 AY-3-8910
544
545 no cpu... cpu seem a 44 plcc chip with name scratched off...
546
547 pcb is almost the same as "Four Roses"
548 */
549 ROM_START( rugby )
550 ROM_REGION( 0x10000, "maincpu", 0 ) /* encrypted program ROM...*/
551 ROM_LOAD( "rugby1.u15", 0x00000, 0x10000, CRC(6ac45fa7) SHA1(dba936d236d57172e56143a9858e5052009e4346) )
552
553 ROM_REGION( 0x0400, "mcu", 0 ) /* protected... no dump available */
554 ROM_LOAD( "ep87c750ebpn_no_dump.u41", 0x0000, 0x0400, NO_DUMP )
555
556 ROM_REGION( 0x80000, "gfx1", 0 )
557 ROM_LOAD( "rugby2.u17", 0x00000, 0x40000, CRC(822eb316) SHA1(8568f5a67f6a54858841e6832dc987f72dd911e2) )
558 ROM_LOAD( "rugby3.u18", 0x40000, 0x40000, CRC(536c56c1) SHA1(a7812f0a854c5138fb7412d656de128ff094010f) )
559
560 ROM_REGION( 0x10000, "proms", 0 )
561 ROM_LOAD( "rugby4.u5", 0x00000, 0x10000, CRC(dc1eb4cd) SHA1(fb7b933a6e4307ee693c4f4bb3630b98a0c60f16) )
562 ROM_END
563
564
565 /**************************
566 * Driver Initialization *
567 **************************/
568
569 void _4roses_state::driver_init()
570 {
571 uint8_t *rom = memregion("maincpu")->base();
572 for (offs_t addr = 0x8000; addr < 0x10000; addr++)
573 rom[addr] = bitswap<8>(rom[addr] ^ 0xca, 6, 5, 4, 3, 2, 1, 0, 7);
574 }
575
driver_init()576 void rugby_state::driver_init()
577 {
578 uint8_t *rom = memregion("maincpu")->base();
579 for (offs_t addr = 0x8000; addr < 0x10000; addr++)
580 rom[addr] = bitswap<8>(rom[addr], 6, 7, 4, 5, 2, 3, 0, 1);
581 }
582
583
584 /*************************
585 * Game Drivers *
586 *************************/
587
588 /* YEAR NAME PARENT MACHINE INPUT CLASS INIT ROT COMPANY FULLNAME FLAGS */
589 GAME( 1999, 4roses, 0, _4roses, 4roses, _4roses_state, driver_init, ROT0, "<unknown>", "Four Roses (encrypted, set 1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_WRONG_COLORS | MACHINE_UNEMULATED_PROTECTION | MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
590 GAME( 1999, 4rosesa, 4roses, _4roses, 4roses, _4roses_state, driver_init, ROT0, "<unknown>", "Four Roses (encrypted, set 2)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_WRONG_COLORS | MACHINE_UNEMULATED_PROTECTION | MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
591 GAME( 1999, rugby, 0, rugby, 4roses, rugby_state, driver_init, ROT0, "C.M.C.", "Rugby? (four roses hardware)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_WRONG_COLORS | MACHINE_UNEMULATED_PROTECTION | MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
592