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