From db7e370bd8c7b2653c8c149776eafb80c9478d01 Mon Sep 17 00:00:00 2001 From: Roberto Fresca Date: Wed, 5 Dec 2018 23:06:03 +0100 Subject: New working machines -------------------- Super Ball (Version EC-3.50 N322) [Grull Osgo] Super Ball (Version EC-3.50 N165) [Grull Osgo] --- scripts/target/mame/arcade.lua | 1 + src/mame/arcade.flt | 1 + src/mame/drivers/rulechan.cpp | 845 +++++++++++++++++++++++++++++++++++++++++ src/mame/layout/rulechan.lay | 459 ++++++++++++++++++++++ src/mame/mame.lst | 4 + 5 files changed, 1310 insertions(+) create mode 100644 src/mame/drivers/rulechan.cpp create mode 100644 src/mame/layout/rulechan.lay diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua index 628ed456a37..4dce34bce63 100644 --- a/scripts/target/mame/arcade.lua +++ b/scripts/target/mame/arcade.lua @@ -4796,6 +4796,7 @@ files { MAME_DIR .. "src/mame/drivers/re900.cpp", MAME_DIR .. "src/mame/drivers/rgum.cpp", MAME_DIR .. "src/mame/drivers/roul.cpp", + MAME_DIR .. "src/mame/drivers/rulechan.cpp", MAME_DIR .. "src/mame/drivers/savquest.cpp", MAME_DIR .. "src/mame/drivers/sanremo.cpp", MAME_DIR .. "src/mame/drivers/sanremmg.cpp", diff --git a/src/mame/arcade.flt b/src/mame/arcade.flt index 2f75379a9d9..8f88f0f84fa 100644 --- a/src/mame/arcade.flt +++ b/src/mame/arcade.flt @@ -997,6 +997,7 @@ route16.cpp rowamet.cpp royalmah.cpp rpunch.cpp +rulechan.cpp runaway.cpp rungun.cpp s11.cpp diff --git a/src/mame/drivers/rulechan.cpp b/src/mame/drivers/rulechan.cpp new file mode 100644 index 00000000000..5eac5855c19 --- /dev/null +++ b/src/mame/drivers/rulechan.cpp @@ -0,0 +1,845 @@ +// license:BSD-3-Clause +// copyright-holders: Grull Osgo. +/******************************************************************** + + Electrochance. + 6-player Electromechanical Roulette. + + Copyright 199x by Electro Chance. + Industria Argentina. + + Driver by Grull Osgo. + + 2 sets dumped: + +********************************************************************* + + PCB specs: Hardware not available + +********************************************************************* + + Edge Connector: + + + Solder side | | Components + -----------------|--|----------------- + +5Vcc |01| GND + +5Vcc |02| -5Vcc + Player 2 |03| Player 1 + Player 4 |04| Player 3 + Player 6 |06| Player 5 + |07| + |08| Left + Right |09| Down + Credits IN |10| Credits OUT + Bet |11| Up + |12| + |13| + |14| + |15| + |16| + |17| + |18| +5VCC + Counter IN |19| + |20| Counter OUT + Operator Key |21| + |22| Programming + |23| + Green |24| Sync + Blue |25| Red + +12Vcc |26| Speaker + +5Vcc |27| GND + +5Vcc |28| GND + + DIP Switches: + + .---------------------------------------+-----+-----+-----+-----+-----+-----+-----+-----. + | DIP Switches | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | + +---------------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+ + +---------------------------------------+-----+-----------------------------------------+ + | Reset total No | OFF | | + | (Full Reset) Si | ON | | + '---------------------------------------+-----+-----+-----------------------------------+ + | Repite No | | OFF | | + | Si | | ON | | + +---------------------------------------+-----+-----+-----+-----------------------------+ + | Demo No | | | OFF | | + | Si | | | ON | | + +---------------------------------------+-----+-----+-----+-----+-----------------------+ + | Acceso a Pagina No | | OFF | | + | (settings access) Si | | ON | | + +---------------------------------------+-----------------+-----+-----+-----------------+ + | Test plato No | | OFF | | + | Si | | ON | | + +---------------------------------------+-----------------------+-----+-----+-----------+ + | Inmovilizar No | | OFF | | + | Si | | ON | | + +---------------------------------------+-----------------------------+-----+-----+-----+ + | Doble cero No | | OFF | | + | (Jackpot program) Si | | ON | | + +---------------------------------------+-----------------------------------+-----+-----+ + | Castellano No | | OFF | + | Si | | ON | + +---------------------------------------+-----------------------------------------+-----+ + +********************************************************************* + + Game Initialization + ------------------- + (You must enable "LAMPS" layout for this procedure) + + When the game runs by the very first time (no nvram yet), it will + complain about "DATA ERROR" in a blue message window. After a few + seconds, it will bring up another red window with the "HARD ERROR 02" + message. + + So, we must initialize the game following the next instructions: + + 1.- Toggle on "Operator Key" (turn to green). + 2.- Press once "Page Key". It will show a green window titled + "CONTROL ADMINISTRATIVO" and a message with a security token. + 3.- Press again "Page Key". It will bring up a new window where we + must type a password. At this time, in the layout, under the + roulette leds will appear the password we need (six numeric digits). + 4.- Ingress the required paswword using the credits in (IN1....IN6) + and credits out (OUT1...OUT6) buttons following the key assignment + indications located under the password field. + Use the "E" button to finish once all numbers were typed. + Use the "B" button clear last digit typed, in case of mistake. + 5.- Once finished that, and the the game will reboot and will be + ready to play. Also, password showed on layout will dissapear. + + In case that, by unknown reason, the game asks for + "CONTROL ADMINISTRATIVO" again, follow the instructions starting + from step "1". After that we will can play again. +*********************************************************************/ + + +/********************************************************************* + + Dev notes: + + Again, this driver was written based on a couple of ROM dumps and a + lot of reverse engineering, with no harware available, but guessing + that this firmware and hardware are similar to others well known + roulettes like Lucky Ball, Lucky Roulette, Corona, Re900, etc... + + The most exciting part of this work was discover that this game runs + with an electromechanical roulette, not a tipical LED roulette. It + added an extra challenge to the work, wich implies a full develop + of an electromechanical part simulation, objective that finally + could be reached. + + Surprisingly, this game firmware includes a full communications + module, accesible via RS232 serial interface, that let the users + some useful things like reconfigure hardware and game options or + get different kinds of reports, like accounting, statistics and + many other technical items. All this tasks are performed from a + PC running a D.O.S. program provided by the maker and fortunately + still available. Even more, there is another stand alone D.O.S. + software provided by the maker, and also still available, to get + the passwords needed when hardware fails or administrative tasks + are required. + + Another interesting thing found on this game is that it can be + configured for a single or a double zero roulette, depending on + what kind of roulette has attached. + +*********************************************************************/ + +#define CPU_CLOCK XTAL(8'000'000) +#define VID_CLOCK XTAL(10'730'000) +#define TMS_CLOCK XTAL(1'750'000) +#define VDP_MEM 0x20000 // 4x 4464 (64K x 4 DRAM) + +#include +#include "emu.h" +#include "cpu/z80/z80.h" +#include "machine/nvram.h" +#include "machine/eepromser.h" +#include "machine/timer.h" +#include "video/v9938.h" +#include "sound/ay8910.h" +#include "screen.h" +#include "speaker.h" +#include "rulechan.lh" + +#define BIT2 BIT(m_p30,2) +#define BIT3 BIT(m_p30,3) +#define BIT4 BIT(m_p30,4) +#define BIT5 BIT(m_p30,5) + +#define SND_FLG 0xf009 +#define RAM_PSW 0xf078 + +#define BALLIN (m_ballin>=2) +#define MOTORON (m_p32!=0xf0) +#define LEDNOTNUM (m_led!=m_num) + +class rulechan_state : public driver_device +{ +public: + rulechan_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_v9938(*this, "v9938") + , m_maincpu(*this, "maincpu") + , m_eeprom(*this, "eeprom") + , m_aux(*this, "AUX") + , m_dsw(*this, "DSW") + , m_tty(*this, "TTY") + , m_keymx(*this, "IN%u", 0) + , m_lamps(*this, "lamp%u", 0U) + , m_digits(*this, "digit%u", 0U) + { } + + void rulechan(machine_config &config); + void rulechan_init(); + +private: + + DECLARE_READ8_MEMBER(port0_r); + DECLARE_WRITE8_MEMBER(port0_w); + DECLARE_READ8_MEMBER(port2_r); + DECLARE_READ8_MEMBER(port3_r); + DECLARE_READ8_MEMBER(port30_r); + DECLARE_READ8_MEMBER(port31_r); + DECLARE_WRITE8_MEMBER(port31_w); + DECLARE_WRITE8_MEMBER(port32_w); + DECLARE_READ8_MEMBER(port40_r); + DECLARE_WRITE8_MEMBER(port40_w); + DECLARE_READ8_MEMBER(port41_r); + DECLARE_READ8_MEMBER(psg_portA_r); + DECLARE_READ8_MEMBER(psg_portB_r); + + TIMER_DEVICE_CALLBACK_MEMBER( ball_speed ); + TIMER_DEVICE_CALLBACK_MEMBER( wheel_speed ); + + uint8_t m_sline; + uint8_t m_stat; + uint8_t m_p30; + uint8_t m_p31; + uint8_t m_p32; + uint8_t m_step; + uint8_t m_updn2; + uint8_t m_updn3; + uint8_t m_updn4; + uint8_t m_num; + uint8_t m_spin; + uint8_t m_tspin; + uint8_t d_spin; + uint8_t m_ballin; + uint8_t m_led; + uint32_t m_lastk=0; + uint8_t m_pass[6]; + uint8_t m_sndsrt[10]= { 0x0a, 0x0e, 0x06, 0x0a, 0x0b, 0x48, 0x0c, 0x00, 0x0d, 0x01 }; + + required_device m_v9938; + required_device m_maincpu; + required_device m_eeprom; + required_ioport m_aux; + required_ioport m_dsw; + required_ioport m_tty; + required_ioport_array<6> m_keymx; + + void main_io(address_map &map); + void main_map(address_map &map); + void sound_sort(); + void sound_off(); + + virtual void machine_start() override { m_lamps.resolve(); m_digits.resolve(); } + output_finder<63> m_lamps; + output_finder<6> m_digits; +}; + +/* BCD to Seven Segment Decoder */ + +static uint8_t dec_7seg(int data) +{ + uint8_t segment; + switch (data) + { + case 0: segment = 0x3f; break; + case 1: segment = 0x06; break; + case 2: segment = 0x5b; break; + case 3: segment = 0x4f; break; + case 4: segment = 0x66; break; + case 5: segment = 0x6d; break; + case 6: segment = 0x7d; break; + case 7: segment = 0x07; break; + case 8: segment = 0x7f; break; + case 9: segment = 0x6f; break; + default: segment = 0x00; + } + + return segment; +} + +/************************************** +* Memory Map * +**************************************/ + +void rulechan_state::main_map(address_map &map) +{ + map(0x0000, 0xdfff).rom(); + map(0xe000, 0xffff).ram().share("nvram"); +} + +void rulechan_state::main_io(address_map &map) +{ + map.global_mask(0xff); + + map(0x00, 0x00).rw(FUNC(rulechan_state::port0_r),FUNC(rulechan_state::port0_w)); /* Matrix scan line selector - Must be 0xf0 at power up */ + map(0x01, 0x01).portw("EEPROMOUT"); /* eeprom ok */ + map(0x02, 0x02).r(FUNC(rulechan_state::port2_r)); /* Matriz button read */ + map(0x03, 0x03).r(FUNC(rulechan_state::port3_r)); + map(0x10, 0x11).w("ay8910", FUNC(ay8910_device::address_data_w)); /* sound ok */ + map(0x12, 0x12).r("ay8910", FUNC(ay8910_device::data_r)); /* ports ok */ + map(0x20, 0x23).rw(m_v9938, FUNC(v9938_device::read), FUNC(v9938_device::write)); /* video ok */ + map(0x30, 0x30).r(FUNC(rulechan_state::port30_r)); /* wheel control */ + map(0x31, 0x31).rw(FUNC(rulechan_state::port31_r),FUNC(rulechan_state::port31_w)); /* wheel control - read: Must be 0x00 at power up*/ + map(0x32, 0x32).w(FUNC(rulechan_state::port32_w)); /* wheel control */ + map(0x40, 0x40).rw(FUNC(rulechan_state::port40_r),FUNC(rulechan_state::port40_w)); /* RS232 - tty console - Data Unknown serial device */ + map(0x41, 0x41).r(FUNC(rulechan_state::port41_r)); /* RS232 - tty console - Status Unknown serial device */ + map(0x42, 0x43).nopr().nopw(); + map(0x60, 0x60).nopw(); /* Watchdog */ +} + +/**************** +* Read Handlers * +****************/ + +READ8_MEMBER(rulechan_state::port0_r) +{ + return 0xf0; +} + +READ8_MEMBER(rulechan_state::port2_r) +{ + return m_keymx[m_sline]->read(); +} + +READ8_MEMBER(rulechan_state::port3_r) +{ + return 0xff; +} + +/****************************** + Port 30 - Wheel control * +* bit 2 - ball detector * +* bit 3 - step detector * +* bit 4 - Zero detector * +* bit 5 - Ball in shotter * +******************************/ + +READ8_MEMBER(rulechan_state::port30_r) +{ + return m_p30; +} + +READ8_MEMBER(rulechan_state::port31_r) +{ + return 0x00; +} + +/********************** +* Port 40h * +* serial data port * +**********************/ + +READ8_MEMBER(rulechan_state::port40_r) +{ + uint8_t retval; + uint32_t inp; + inp=m_tty->read(); + switch (inp) + { + case 0x00000001:retval=0x31;break; + case 0x00000002:retval=0x32;break; + case 0x00000004:retval=0x33;break; + case 0x00000008:retval=0x34;break; + case 0x00000010:retval=0x35;break; + case 0x00000020:retval=0x36;break; + case 0x00000040:retval=0x37;break; + case 0x00000080:retval=0x38;break; + case 0x00000100:retval=0x39;break; + case 0x00000200:retval=0x30;break; + case 0x00000400:retval=0x0d;break; + case 0x00000800:retval=0x3a;break; + case 0x00001000:retval=0x08;break; + case 0x00002000:retval=0x20;break; + case 0x00004000:retval=0x52;break; + case 0x00008000:retval=0x53;break; + case 0x00010000:retval=0x54;break; + case 0x00020000:retval=0x56;break; + case 0x00040000:retval=0x4b;break; + case 0x00080000:retval=0x57;break; + case 0x00100000:retval=0x55;break; + case 0x00200000:retval=0x58;break; + case 0x00400000:retval=0x4e;break; + case 0x00800000:retval=0x59;break; + case 0x01000000:retval=0x5a;break; + case 0x02000000:retval=0x51;break; + case 0x04000000:retval=0x6c;break; + case 0x08000000:retval=0x48;break; + case 0x10000000:retval=0x49;break; + case 0x20000000:retval=0x4a;break; + case 0x40000000:retval=0x4f;break; + case 0x80000000:retval=0x70;break; + default: retval=0; + } + m_stat &= 0xf7; /* down rx enable */ + m_stat|= 0x10; /* up tx enable */ + if (inp) m_lastk = inp; + return retval; +} + +/********************** +* Port 41h * +* serial port status * +* bit 3 = rx ready * +* bit 4 - tx ready * +***********************/ + +READ8_MEMBER(rulechan_state::port41_r) /* console port status- bit 3 = rx ready / bit 4 - tx ready */ +{ + uint32_t keys; + keys=m_tty->read(); + if(!keys) { m_stat&=0xf7; m_lastk=0;} + else + if(keys == m_lastk) m_stat&=0xf7; + else m_stat|=0x08; + return m_stat; +} + +READ8_MEMBER(rulechan_state::psg_portA_r) +{ + m_lamps[60] = (BIT(m_aux->read(), 3))?0:1; /* Show Operator Key via layout lamp */ + m_lamps[61] = (BIT(m_aux->read(), 7))?0:1; /* Show Page Key via layout lamp */ + return m_aux->read(); /* Operator Key read */ +} + +READ8_MEMBER(rulechan_state::psg_portB_r) +{ + return m_dsw->read(); /* DipSw read */ +} + +/*********************** +* Write Handlers * +***********************/ + +WRITE8_MEMBER(rulechan_state::port0_w) +{ + m_sline = data & 0x07; /* Matrix scan line selector */ + if (m_sline>5) m_sline=0; +} + +/**************************************** + Port 31 - Wheel driver * +* bit 1 - Port 32 Data Latch impulse * +* bit 4 - ball drop control * +* bit 7 - ball shooter * +****************************************/ + +WRITE8_MEMBER(rulechan_state::port31_w) +{ + m_p31=data; + if( BIT(m_p31,4)) { m_p30|=0x20; m_ballin=0;} /* Drop ball....ball in shooter */ + if(BIT(m_p31,7)) /* Shoot ball */ + { + m_p30&=0xdf; /* ball out.... */ + m_num = machine().rand() % 37; /* sort winning number */ + //logerror("shooting ball 2d\n", m_num); + } +} + +/**************************************** + Port 32h - Motor Control * +* * +* data latch for speed control ... * +* * +****************************************/ + +WRITE8_MEMBER(rulechan_state::port32_w) +{ + m_p32=data; +} + +/********************** +* Port 40h * +* serial data port * +**********************/ + +WRITE8_MEMBER(rulechan_state::port40_w) +{ + printf("%c",data); /* Serial data out - Console */ +} + +/************************************************ +* Extra Sound - Roulette spinning ball * +************************************************/ + +void rulechan_state::sound_off() +{ + m_maincpu->space(AS_IO).write_byte(0x10, 0x07); + m_maincpu->space(AS_IO).write_byte(0x11, m_maincpu->space(AS_PROGRAM).read_byte(SND_FLG) | 0x20); + m_maincpu->space(AS_IO).write_byte(0x10, 0x0e); +} + +void rulechan_state::sound_sort() +{ + for (int i=0;i<5;i++) + { + m_maincpu->space(AS_IO).write_byte(0x10, m_sndsrt[(2*i)]); + m_maincpu->space(AS_IO).write_byte(0x11, m_sndsrt[(2*i)+1]); + } + m_maincpu->space(AS_IO).write_byte(0x10, 0x07); + m_maincpu->space(AS_IO).write_byte(0x11, m_maincpu->space(AS_PROGRAM).read_byte(SND_FLG) & 0xdf); + m_maincpu->space(AS_IO).write_byte(0x10, 0x0e); +} + +/*********************** +* Wheel Simulation * +***********************/ +TIMER_DEVICE_CALLBACK_MEMBER(rulechan_state::wheel_speed) +{ + if(m_step==0) + { + if((BIT4) & (m_updn4==0)) + { + m_p30&=0xef; + m_updn4=1; + //logerror("1:port_p30:- Reset bit 4 pulse start -%2x cont_pasos:%2d\n",m_p30, m_step); + return; + } + + if((!BIT4) & (m_updn4==1)) + { + m_p30|=0x10; + + //logerror("2:port_p30:- Set bit 4 -%2x cont_pasos:%2d\n",m_p30, m_step); + return; + } + + if((BIT4) & (m_updn4==1)) + { + m_updn4=0; + m_step++; + //logerror("3:port_p30:-end mark for reset bit 4 -%2x cont_pasos:%2d\n",m_p30, m_step); + return; + } + } + else + { + + if(BIT3 & (m_updn3==0)) + { + m_p30&=0xf7; + //logerror("4:port_p30:-reset bit 3 -%2x cont_pasos:%2d\n",m_p30, m_step); + return; + } + + if(!BIT3 & (m_updn3==0)) + { + if(!BIT2) + { + m_p30|= 0x04; + //logerror("5:port_p30:-set bit 2 -%2x cont_pasos:%2d\n",m_p30, m_step); + return; + } + else + { + if((m_step-1==m_num) & (m_updn2==0)) + { + if(!BIT5) /* ball in pocket? */ + { + m_p30&= 0xfb; + m_updn2=1; + m_ballin++; + logerror("Ball In Pocket m_num:%2x\n", m_num); + return; + } + } + } + m_updn2=0; + m_updn3=1; + } + if(!BIT3 & (m_updn3==1)) + { + m_p30|=0x08; + m_updn3=0; + m_step++; + if (m_step==39){ m_step=0;m_p30|=0x1c;} + //logerror("6:port_p30:-set bit 3 -%2x cont_pasos:%2d \n",m_p30, m_step); + return; + } + } +} + +/*********************** +* Ball Simulation * +***********************/ + +TIMER_DEVICE_CALLBACK_MEMBER(rulechan_state::ball_speed) +{ + if(MOTORON) + { + if(d_spin==0) + { + m_tspin++; + d_spin=m_spin; + if(BALLIN) m_tspin=37; /* braking ball once per number step */ + if(m_tspin==37) { m_tspin=0; m_spin++; d_spin=m_spin;} /* braking ball once per round */ + if( (!BALLIN) | (LEDNOTNUM & BALLIN ) ) + { + m_led++;if(m_led==37) m_led=0; + for (int i=0;i<37;i++) m_lamps[i+20] = (m_led==i) ? 1:0; /* update roulette led lamps */ + sound_sort(); + } + } + else + { + d_spin--; /* burn cycles */ + sound_off(); + } + } + else + { + for (int i=0;i<37;i++) m_lamps[i+20] = (m_num==i) ? 1:0; + m_spin=d_spin=m_tspin=m_ballin=0; + } +/* Ball simulation finished */ + +/* if needed, get pass and shows it on layout*/ + m_pass[0]= m_maincpu->space(AS_PROGRAM).read_byte(RAM_PSW); + if((m_pass[0]<=0x39)& (m_pass[0]>=0x30)) + { + for(int i=0;i<6;i++) + { + m_pass[i]= m_maincpu->space(AS_PROGRAM).read_byte(RAM_PSW+i); + m_lamps[10+i] = dec_7seg(m_pass[i] - 0x30); + } + } + else + for(int i=0;i<6;i++) m_lamps[10+i] = dec_7seg(0xff); +} + +/************************************** +* Input Ports * +**************************************/ + +static INPUT_PORTS_START( rulechan ) + + PORT_START("IN0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("P1 Key-In") PORT_CODE(KEYCODE_1) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("P1 Key-Out") PORT_CODE(KEYCODE_Z) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON3 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON4 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON5 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON6 ) + + PORT_START("IN1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("P2 Key-In") PORT_CODE(KEYCODE_2) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("P2 Key-Out") PORT_CODE(KEYCODE_X) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("P3 Key-In") PORT_CODE(KEYCODE_3) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("P3 Key-Out") PORT_CODE(KEYCODE_C) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN3") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("P4 Key-In") PORT_CODE(KEYCODE_4) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("P4 Key-Out") PORT_CODE(KEYCODE_V) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN4") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("P5 Key-In") PORT_CODE(KEYCODE_5) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("P5 Key-Out") PORT_CODE(KEYCODE_B) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Bet") PORT_CODE(KEYCODE_LCONTROL) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Down") PORT_CODE(KEYCODE_DOWN) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Up") PORT_CODE(KEYCODE_UP) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Left") PORT_CODE(KEYCODE_LEFT) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("Right") PORT_CODE(KEYCODE_RIGHT) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN5") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("P6 Key-In") PORT_CODE(KEYCODE_6) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("P6 Key-Out") PORT_CODE(KEYCODE_N) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("AUX") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Tilt 1") PORT_CODE(KEYCODE_7) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Tilt 2") PORT_CODE(KEYCODE_8) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_TOGGLE PORT_CODE(KEYCODE_0) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read) /* bit 6 is EEPROM data */ + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_CODE(KEYCODE_9) + + PORT_START("TTY") + PORT_BIT( 0x000000001, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("1") PORT_CODE(KEYCODE_1_PAD) + PORT_BIT( 0x000000002, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("2") PORT_CODE(KEYCODE_2_PAD) + PORT_BIT( 0x000000004, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("3") PORT_CODE(KEYCODE_3_PAD) + PORT_BIT( 0x000000008, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("4") PORT_CODE(KEYCODE_4_PAD) + PORT_BIT( 0x000000010, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("5") PORT_CODE(KEYCODE_5_PAD) + PORT_BIT( 0x000000020, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("6") PORT_CODE(KEYCODE_6_PAD) + PORT_BIT( 0x000000040, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("7") PORT_CODE(KEYCODE_7_PAD) + PORT_BIT( 0x000000080, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("8") PORT_CODE(KEYCODE_8_PAD) + PORT_BIT( 0x000000100, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("9") PORT_CODE(KEYCODE_9_PAD) + PORT_BIT( 0x000000200, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("0") PORT_CODE(KEYCODE_0_PAD) + PORT_BIT( 0x000000400, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("EN") PORT_CODE(KEYCODE_ENTER) + PORT_BIT( 0x000000800, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(":") PORT_CODE(KEYCODE_COLON) + PORT_BIT( 0x000001000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("BS") PORT_CODE(KEYCODE_BACKSPACE) + PORT_BIT( 0x000002000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("SP") PORT_CODE(KEYCODE_SPACE) + PORT_BIT( 0x000004000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("R") PORT_CODE(KEYCODE_R) + PORT_BIT( 0x000008000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("S") PORT_CODE(KEYCODE_S) + PORT_BIT( 0x000010000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("T") PORT_CODE(KEYCODE_T) + PORT_BIT( 0x000020000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("V") PORT_CODE(KEYCODE_M) + PORT_BIT( 0x000040000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("K") PORT_CODE(KEYCODE_K) + PORT_BIT( 0x000080000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("W") PORT_CODE(KEYCODE_W) + PORT_BIT( 0x000100000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("U") PORT_CODE(KEYCODE_U) + PORT_BIT( 0x000200000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("X") PORT_CODE(KEYCODE_D) + PORT_BIT( 0x000400000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("N") PORT_CODE(KEYCODE_F) + PORT_BIT( 0x000800000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) + PORT_BIT( 0x001000000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Z") PORT_CODE(KEYCODE_A) + PORT_BIT( 0x002000000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) + PORT_BIT( 0x004000000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("l") PORT_CODE(KEYCODE_L) + PORT_BIT( 0x008000000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("H") PORT_CODE(KEYCODE_H) + PORT_BIT( 0x010000000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("I") PORT_CODE(KEYCODE_I) + PORT_BIT( 0x020000000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("J") PORT_CODE(KEYCODE_J) + PORT_BIT( 0x040000000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("O") PORT_CODE(KEYCODE_O) + PORT_BIT( 0x080000000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("p") PORT_CODE(KEYCODE_RCONTROL) + + PORT_START("DSW") + PORT_DIPNAME( 0x01, 0x01, "Borrado Total" ) PORT_DIPLOCATION("DSW:1") + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, "Repite" ) PORT_DIPLOCATION("DSW:2") + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, "Demo" ) PORT_DIPLOCATION("DSW:3") + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, "Acceso" ) PORT_DIPLOCATION("DSW:4") + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, "Test de Plato" ) PORT_DIPLOCATION("DSW:5") + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, "Inmoviliza" ) PORT_DIPLOCATION("DSW:6") + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, "Doble Cero" ) PORT_DIPLOCATION("DSW:7") + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, "Castellano" ) PORT_DIPLOCATION("DSW:8") + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_START( "EEPROMOUT" ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, di_write) /* bit 3 is data (active high) */ + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, clk_write) /* bit 4 is clock (active high) */ + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, cs_write) /* bit 5 is cs */ + +INPUT_PORTS_END + +/************************************** +* Machine Driver * +**************************************/ + +MACHINE_CONFIG_START(rulechan_state::rulechan) + + /* basic machine hardware */ + Z80(config, m_maincpu, CPU_CLOCK); + m_maincpu->set_addrmap(AS_PROGRAM, &rulechan_state::main_map); + m_maincpu->set_addrmap(AS_IO, &rulechan_state::main_io); + m_maincpu->set_periodic_int(FUNC(rulechan_state::irq0_line_hold), attotime::from_hz(120)); + + /* nvram */ + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); + + /* eeprom */ + EEPROM_93C46_8BIT(config, "eeprom"); + + MCFG_TIMER_DRIVER_ADD_PERIODIC("ball_speed", rulechan_state, ball_speed, attotime::from_hz(60)) + MCFG_TIMER_DRIVER_ADD_PERIODIC("wheel_speed", rulechan_state, wheel_speed, attotime::from_hz(60)) + + /* video hardware */ + v9938_device &v9938(V9938(config, "v9938", VID_CLOCK)); + v9938.set_screen_ntsc("screen"); + v9938.set_vram_size(VDP_MEM); + //v9938.int_cb().set_inputline("maincpu", 0); + SCREEN(config, "screen", SCREEN_TYPE_RASTER); + + /* sound hardware */ + SPEAKER(config, "mono").front_center(); + ay8910_device &ay_re900(AY8910(config, "ay8910", TMS_CLOCK)); /* From TMS9128NL - Pin 37 (GROMCLK) */ + ay_re900.port_a_read_callback().set(FUNC(rulechan_state::psg_portA_r)); + ay_re900.port_b_read_callback().set(FUNC(rulechan_state::psg_portB_r)); + ay_re900.add_route(ALL_OUTPUTS, "mono", 0.5); + +MACHINE_CONFIG_END + +/************************************** +* ROM Load * +**************************************/ + +ROM_START( rulechan ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "eprom322", 0x00000, 0x10000, CRC(a78e106f) SHA1(23e25ca60296e8002df9b9cf16ad8fe8a1e6c93b) ) + ROM_REGION(0x80, "eeprom", 0) + ROM_LOAD( "eeprom.322", 0x0000, 0x0080, CRC(ded905d2) SHA1(999e8e54a31a232092c4345434b93358226d1144) ) + +ROM_END + +ROM_START( rulechab ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "eprom165", 0x00000, 0x10000, CRC(1669f266) SHA1(14e70b91e260e3bc338870936954e09c182fe591) ) + ROM_REGION(0x80, "eeprom", 0) + ROM_LOAD( "eeprom.165", 0x0000, 0x0080, CRC(042ac516) SHA1(a32d82acb438cceda0f03b58be6977eeb589836c) ) +ROM_END + +/************************ +* Driver Init * +************************/ +void rulechan_state::rulechan_init() +{ + m_p30=0x3c; + m_p32=0Xf0; /* Motor off at startup */ + m_step=0; + m_stat=0; + m_updn2=0; + m_updn3=0; + m_updn4=0; +} + +/************************************** +* Game Driver(s) * +**************************************/ + +// YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS LAYOUT +GAMEL(1991, rulechan, 0, rulechan, rulechan, rulechan_state, rulechan_init, ROT0, "ElectroChance", "Super Ball (Version EC-3.50 N322)", MACHINE_SUPPORTS_SAVE, layout_rulechan) +GAMEL(1991, rulechab, 0, rulechan, rulechan, rulechan_state, rulechan_init, ROT0, "ElectroChance", "Super Ball (Version EC-3.50 N165)", MACHINE_SUPPORTS_SAVE, layout_rulechan) + diff --git a/src/mame/layout/rulechan.lay b/src/mame/layout/rulechan.lay new file mode 100644 index 00000000000..8aa58259373 --- /dev/null +++ b/src/mame/layout/rulechan.lay @@ -0,0 +1,459 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 1f306f90b3b..62d298040a7 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -33375,6 +33375,10 @@ rt1715w // qwak // (proto) (c) 1982 runaway // (proto) (c) 1982 +@source:rulechan.cpp +rulechan // 1992 ElectroChance +rulechab // 1992 ElectroChance + @source:rungun.cpp rungun // GX247 (c) 1993 (World) runguna // GX247 (c) 1993 (World) -- cgit v1.2.3