New games added or promoted from NOT_WORKING status

---------------------------------------------------
Fireball [ANY]

eepromser: added support for X24C44 [ANY]
This commit is contained in:
R. Belmont 2014-05-03 20:53:28 +00:00
parent b8d93793ad
commit 83f63f8a6b
7 changed files with 1125 additions and 4 deletions

2
.gitattributes vendored
View File

@ -4505,6 +4505,7 @@ src/mame/drivers/fcrash.c svneol=native#text/plain
src/mame/drivers/feversoc.c svneol=native#text/plain
src/mame/drivers/fgoal.c svneol=native#text/plain
src/mame/drivers/finalizr.c svneol=native#text/plain
src/mame/drivers/fireball.c svneol=native#text/plain
src/mame/drivers/firebeat.c svneol=native#text/plain
src/mame/drivers/firefox.c svneol=native#text/plain
src/mame/drivers/firetrap.c svneol=native#text/plain
@ -6223,6 +6224,7 @@ src/mame/layout/f1gpstar.lay svneol=native#text/xml
src/mame/layout/fashion.lay svneol=native#text/xml
src/mame/layout/fhunter.lay svneol=native#text/xml
src/mame/layout/finallap.lay svneol=native#text/xml
src/mame/layout/fireball.lay svneol=native#text/plain
src/mame/layout/firebeat.lay svneol=native#text/xml
src/mame/layout/flicker.lay svneol=native#text/xml
src/mame/layout/fortecrd.lay svneol=native#text/xml

View File

@ -752,6 +752,385 @@ WRITE_LINE_MEMBER(eeprom_serial_er5911_device::di_write) { base_di_write(state);
//**************************************************************************
// X24c44 DEVICE IMPLEMENTATION
//**************************************************************************
//-------------------------------------------------
// eeprom_serial_x24c44_device - constructor
//-------------------------------------------------
eeprom_serial_x24c44_device::eeprom_serial_x24c44_device(const machine_config &mconfig, device_type devtype, const char *name, const char *tag, device_t *owner, const char *shortname, const char *file)
: eeprom_serial_base_device(mconfig, devtype, name, tag, owner, shortname, file)
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void eeprom_serial_x24c44_device::device_start()
{
// if no command address bits set, just inherit from the address bits
if (m_command_address_bits == 0)
m_command_address_bits = m_address_bits;
// start the base class
eeprom_base_device::device_start();
INT16 i=0;
m_ram_length=0xf;
for (i=0;i<16;i++){
m_ram_data[i]=read(i); //autoreload at power up
}
m_reading=0;
m_store_latch=0;
// save the current state
save_item(NAME(m_state));
save_item(NAME(m_cs_state));
save_item(NAME(m_oe_state));
save_item(NAME(m_clk_state));
save_item(NAME(m_di_state));
save_item(NAME(m_locked));
save_item(NAME(m_bits_accum));
save_item(NAME(m_command_address_accum));
save_item(NAME(m_command));
save_item(NAME(m_address));
save_item(NAME(m_shift_register));
save_item(NAME(m_ram_data));
save_item(NAME(m_reading));
save_item(NAME(m_store_latch));
}
void eeprom_serial_x24c44_device::copy_eeprom_to_ram(){
UINT16 i=0;
LOG1(("EEPROM TO RAM COPY!!!\n"));
for (i=0;i<16;i++){
m_ram_data[i]=read(i);
}
m_store_latch=1;
}
void eeprom_serial_x24c44_device::copy_ram_to_eeprom(){
UINT16 i=0;
if (m_store_latch){
LOG1(("RAM TO EEPROM COPY\n"));
for (i=0;i<16;i++){
write(i, m_ram_data[i]);
}
m_store_latch=0;
}else{
LOG0(("Store command with store latch not set!\n"));
}
}
//-------------------------------------------------
// execute_command - execute a command once we
// have enough bits for one
//-------------------------------------------------
void eeprom_serial_x24c44_device::execute_command()
{
// parse into a generic command and reset the accumulator count
parse_command_and_address();
m_bits_accum = 0;
#if (VERBOSE_PRINTF > 0 || VERBOSE_LOGERROR > 0)
// for debugging purposes
static const struct { eeprom_command command; const char *string; } s_command_names[] =
{
{ COMMAND_INVALID, "Execute command: INVALID\n" },
{ COMMAND_READ, "Execute command:READ 0x%X\n" },
{ COMMAND_WRITE, "Execute command:WRITE 0x%X\n" },
{ COMMAND_ERASE, "Execute command:ERASE 0x%X\n" },
{ COMMAND_LOCK, "Execute command:LOCK\n" },
{ COMMAND_UNLOCK, "Execute command:UNLOCK\n" },
{ COMMAND_WRITEALL, "Execute command:WRITEALL\n" },
{ COMMAND_ERASEALL, "Execute command:ERASEALL\n" },
{ COMMAND_COPY_EEPROM_TO_RAM, "Execute command:COPY_EEPROM_TO_RAM\n" },
{ COMMAND_COPY_RAM_TO_EEPROM, "Execute command:COPY_RAM_TO_EEPROM\n" },
};
const char *command_string = s_command_names[0].string;
for (int index = 0; index < ARRAY_LENGTH(s_command_names); index++)
if (s_command_names[index].command == m_command)
command_string = s_command_names[index].string;
LOG1((command_string, m_address));
#endif
// each command advances differently
switch (m_command)
{
// advance to the READING_DATA state; data is fetched after first CLK
// reset the shift register to 0 to simulate the dummy 0 bit that happens prior
// to the first clock
// reset the shift register and wait for enough data to be clocked through
case COMMAND_WRITE:
m_shift_register = 0;
set_state(STATE_WAIT_FOR_DATA);
break;
// lock the chip; return to IN_RESET state
case COMMAND_LOCK:
m_locked = true;
m_store_latch=0;
set_state(STATE_IN_RESET);
break;
// unlock the chip; return to IN_RESET state
case COMMAND_UNLOCK:
m_locked = false;
m_store_latch=1;
set_state(STATE_IN_RESET);
break;
// copy eeprom to ram
case COMMAND_COPY_EEPROM_TO_RAM:
copy_eeprom_to_ram();
set_state(STATE_IN_RESET);
break;
// copy ram into eeprom
case COMMAND_COPY_RAM_TO_EEPROM:
copy_ram_to_eeprom();
set_state(STATE_IN_RESET);
break;
default:
throw emu_fatalerror("execute_command called with invalid command %d\n", m_command);
}
}
void eeprom_serial_x24c44_device::handle_event(eeprom_event event)
{
//UINT32 tmp=0;
#if (VERBOSE_PRINTF > 0 || VERBOSE_LOGERROR > 0)
// for debugging purposes
if ((event & EVENT_CS_RISING_EDGE) != 0) LOG2(("Event: CS rising\n"));
if ((event & EVENT_CS_FALLING_EDGE) != 0) LOG2(("Event: CS falling\n"));
if ((event & EVENT_CLK_RISING_EDGE) != 0)
{
if (m_state == STATE_WAIT_FOR_COMMAND || m_state == STATE_WAIT_FOR_DATA)
LOG2(("Event: CLK rising (%d, DI=%d)\n", m_bits_accum + 1, m_di_state));
else if (m_state == STATE_READING_DATA)
LOG2(("Event: CLK rising (%d, DO=%d)\n", m_bits_accum + 1, (m_shift_register >> 30) & 1));
else if (m_state == STATE_WAIT_FOR_START_BIT)
LOG2(("Event: CLK rising (%d)\n", m_di_state));
else
LOG2(("Event: CLK rising\n"));
}
if ((event & EVENT_CLK_FALLING_EDGE) != 0) LOG4(("Event: CLK falling\n"));
#endif
// switch off the current state
switch (m_state)
{
// CS is not asserted; wait for a rising CS to move us forward, ignoring all clocks
case STATE_IN_RESET:
if (event == EVENT_CS_RISING_EDGE)
set_state(STATE_WAIT_FOR_START_BIT);
break;
// CS is asserted; wait for rising clock with a 1 start bit; falling CS will reset us
// note that because each bit is written independently, it is possible for us to receive
// a false rising CLK edge at the exact same time as a rising CS edge; it appears we
// should ignore these edges (makes sense really)
case STATE_WAIT_FOR_START_BIT:
if (event == EVENT_CLK_RISING_EDGE && m_di_state == ASSERT_LINE && ready() && machine().time() > m_last_cs_rising_edge_time)
{
m_command_address_accum = m_bits_accum = 0;
set_state(STATE_WAIT_FOR_COMMAND);
}
else if (event == EVENT_CS_FALLING_EDGE)
set_state(STATE_IN_RESET);
break;
// CS is asserted; wait for a command to come through; falling CS will reset us
case STATE_WAIT_FOR_COMMAND:
if (event == EVENT_CLK_RISING_EDGE)
{
// if we have enough bits for a command + address, check it out
m_command_address_accum = (m_command_address_accum << 1) | m_di_state;
m_bits_accum=m_bits_accum+1;
if (m_bits_accum == 2 + m_command_address_bits){
//read command is only 2 bits all other are 3 bits!!!
parse_command_and_address_2_bit();
}
if (!m_reading){
if (m_bits_accum == 3 + m_command_address_bits){
execute_command();
}
}
}
else if (event == EVENT_CS_FALLING_EDGE)
set_state(STATE_IN_RESET);
break;
// CS is asserted; reading data, clock the shift register; falling CS will reset us
case STATE_READING_DATA:
if (event == EVENT_CLK_RISING_EDGE)
{
int bit_index = m_bits_accum++;
if (bit_index % m_data_bits == 0 && (bit_index == 0 || m_streaming_enabled)){
m_shift_register=m_ram_data[m_address];
//m_shift_register=BITSWAP16(m_shift_register,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
//m_shift_register=BITSWAP16(m_shift_register,7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8);
m_shift_register= BITSWAP16(m_shift_register,8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7);
m_shift_register=m_shift_register<<16;
LOG1(("read from RAM addr %02X data(from ram) %04X ,m_shift_register vale %04X \n",m_address,m_ram_data[m_address],m_shift_register));
}
else{
m_shift_register = (m_shift_register << 1) | 1;
}
}
else if (event == EVENT_CS_FALLING_EDGE)
{
set_state(STATE_IN_RESET);
m_reading=0;
if (m_streaming_enabled)
LOG1((" (%d cells read)\n", m_bits_accum / m_data_bits));
if (!m_streaming_enabled && m_bits_accum > m_data_bits + 1)
LOG1(("EEPROM: Overclocked read by %d bits\n", m_bits_accum - m_data_bits));
else if (m_streaming_enabled && m_bits_accum > m_data_bits + 1 && m_bits_accum % m_data_bits > 2)
LOG1(("EEPROM: Overclocked read by %d bits\n", m_bits_accum % m_data_bits));
else if (m_bits_accum < m_data_bits)
LOG1(("EEPROM: CS deasserted in READING_DATA after %d bits\n", m_bits_accum));
}
break;
// CS is asserted; waiting for data; clock data through until we accumulate enough; falling CS will reset us
case STATE_WAIT_FOR_DATA:
if (event == EVENT_CLK_RISING_EDGE)
{
m_shift_register = (m_shift_register << 1) | m_di_state;
if (++m_bits_accum == m_data_bits){
//m_shift_register=BITSWAP16(m_shift_register, 0, 1, 2, 3, 4, 5,6,7, 8, 9,10,11,12,13,14,15);
//m_shift_register=BITSWAP16(m_shift_register, 7, 6, 5, 4, 3, 2,1,0,15,14,13,12,11,10, 9, 8);
m_shift_register=BITSWAP16(m_shift_register,8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7);
m_ram_data[m_address]=m_shift_register;
LOG1(("write to RAM addr=%02X data=%04X\n",m_address,m_shift_register));
}
}
else if (event == EVENT_CS_FALLING_EDGE)
{
set_state(STATE_IN_RESET);
LOG1(("EEPROM: CS deasserted in STATE_WAIT_FOR_DATA after %d bits\n", m_bits_accum));
}
break;
// CS is asserted; waiting for completion; watch for CS falling
case STATE_WAIT_FOR_COMPLETION:
if (event == EVENT_CS_FALLING_EDGE)
set_state(STATE_IN_RESET);
break;
}
}
//-------------------------------------------------
// parse_command_and_address - extract the
// command and address from a bitstream
//-------------------------------------------------
void eeprom_serial_x24c44_device::parse_command_and_address()
{
//command is start_bit - 4bit_address - 3bit_command
// set the defaults
m_command = COMMAND_INVALID;
m_address = (m_command_address_accum >> 3) & 0x0f;
LOG1(("EEPROM: command= %04X, address %02X\n", m_command_address_accum& 0x07, m_address));
switch (m_command_address_accum & 0x07)
{
case 0: //reset write enable latch
LOG0(("Lock eeprom\n"));
m_command = COMMAND_LOCK; break;
case 3: //write data into ram
LOG0(("Write to ram\n"));
m_command = COMMAND_WRITE; break;
case 4: //set write enable latch
LOG0(("Unlock eeprom\n"));
m_command = COMMAND_UNLOCK; break;
case 1: //store ram data in eeprom
LOG0(("copy ram to eeprom\n"));
m_command = COMMAND_COPY_RAM_TO_EEPROM; break;
case 5: //reload eeprom data into ram
LOG0(("copy eeprom to ram\n"));
m_command = COMMAND_COPY_EEPROM_TO_RAM; break;
case 2: //reserved (Sleep on x2444)
m_command = COMMAND_INVALID;
break;
}
}
void eeprom_serial_x24c44_device::parse_command_and_address_2_bit()
{
if ((m_command_address_accum & 0x03) == 0x03){
m_command = COMMAND_READ;
m_address = ((m_command_address_accum >> 2) & 0x0f);
m_shift_register = 0;
set_state(STATE_READING_DATA);
LOG1(("parse command_and_address_2_bit found a read command\n"));
m_reading=1;
m_bits_accum=0;
}
// warn about out-of-range addresses
if (m_address >= (1 << m_address_bits))
LOG1(("EEPROM: out-of-range address 0x%X provided (maximum should be 0x%X)\n", m_address, (1 << m_address_bits) - 1));
}
//-------------------------------------------------
// do_read/ready_read - read handlers
//-------------------------------------------------
READ_LINE_MEMBER(eeprom_serial_x24c44_device::do_read) { return base_do_read(); }
//-------------------------------------------------
// cs_write/clk_write/di_write - write handlers
//-------------------------------------------------
WRITE_LINE_MEMBER(eeprom_serial_x24c44_device::cs_write) { base_cs_write(state); }
WRITE_LINE_MEMBER(eeprom_serial_x24c44_device::clk_write) { base_clk_write(state); }
WRITE_LINE_MEMBER(eeprom_serial_x24c44_device::di_write) { base_di_write(state); }
//**************************************************************************
// DERIVED TYPES
//**************************************************************************
@ -785,3 +1164,6 @@ DEFINE_SERIAL_EEPROM_DEVICE(93cxx, 93c86, 93C86, 8, 2048, 11)
// ER5911 has a separate ready pin, a reduced command set, and supports 8/16 bit out of the box
DEFINE_SERIAL_EEPROM_DEVICE(er5911, er5911, ER5911, 8, 128, 9)
DEFINE_SERIAL_EEPROM_DEVICE(er5911, er5911, ER5911, 16, 64, 8)
// X24c44 8 bit 32byte ram/eeprom combo
DEFINE_SERIAL_EEPROM_DEVICE(x24c44, x24c44, X24C44, 16, 16, 4)

View File

@ -56,6 +56,10 @@
#define MCFG_EEPROM_SERIAL_ER5911_16BIT_ADD(_tag) \
MCFG_DEVICE_ADD(_tag, EEPROM_SERIAL_ER5911_16BIT, 0)
// X24c44 16 bit ram/eeprom combo
#define MCFG_EEPROM_SERIAL_X24C44_ADD(_tag) \
MCFG_DEVICE_ADD(_tag, EEPROM_SERIAL_X24C44_16BIT, 0)
// optional enable for streaming reads
#define MCFG_EEPROM_SERIAL_ENABLE_STREAMING() \
eeprom_serial_base_device::static_enable_streaming(*device);
@ -100,7 +104,9 @@ protected:
COMMAND_LOCK,
COMMAND_UNLOCK,
COMMAND_WRITEALL,
COMMAND_ERASEALL
COMMAND_ERASEALL,
COMMAND_COPY_EEPROM_TO_RAM,
COMMAND_COPY_RAM_TO_EEPROM
};
// states
@ -125,8 +131,6 @@ protected:
// internal helpers
void set_state(eeprom_state newstate);
void handle_event(eeprom_event event);
void execute_command();
void execute_write_command();
// subclass helpers
@ -137,7 +141,10 @@ protected:
int base_ready_read();
// subclass overrides
virtual void handle_event(eeprom_event event);
virtual void parse_command_and_address() = 0;
virtual void execute_command();
// configuration state
UINT8 m_command_address_bits; // number of address bits in a command
@ -207,6 +214,41 @@ protected:
};
// ======================> eeprom_serial_x24c44_device
class eeprom_serial_x24c44_device : public eeprom_serial_base_device
{
//async recall not implemented
//async store not implemented
protected:
// construction/destruction
eeprom_serial_x24c44_device(const machine_config &mconfig, device_type devtype, const char *name, const char *tag, device_t *owner, const char *shortname, const char *file);
public:
// read handlers
DECLARE_READ_LINE_MEMBER(do_read); // DO
// write handlers
DECLARE_WRITE_LINE_MEMBER(cs_write); // CS signal (active high)
DECLARE_WRITE_LINE_MEMBER(clk_write); // CLK signal (active high)
DECLARE_WRITE_LINE_MEMBER(di_write); // DI
protected:
// subclass overrides
virtual void parse_command_and_address();
void handle_event(eeprom_event event);
virtual void parse_command_and_address_2_bit();
void execute_command();
void copy_ram_to_eeprom();
void copy_eeprom_to_ram();
void device_start();
UINT8 m_ram_length;
UINT16 m_ram_data[16];
UINT16 m_reading;
UINT8 m_store_latch;
};
//**************************************************************************
// DERIVED TYPES
@ -241,4 +283,6 @@ DECLARE_SERIAL_EEPROM_DEVICE(93cxx, 93c86, 93C86, 8)
DECLARE_SERIAL_EEPROM_DEVICE(er5911, er5911, ER5911, 8)
DECLARE_SERIAL_EEPROM_DEVICE(er5911, er5911, ER5911, 16)
// X24c44 8 bit 32byte ram/eeprom combo
DECLARE_SERIAL_EEPROM_DEVICE(x24c44, x24c44, X24C44, 16)
#endif

544
src/mame/drivers/fireball.c Normal file
View File

@ -0,0 +1,544 @@
/***********************************************************************************
fireball.c
Mechanical game where you have a gun shooting rubber balls.
some pics here
http://www.schausteller.de/anzeigenmarkt/euro-ball-66634.html
TODO
-NEVER sends store command to Eeprom so all change are lost
************************************************************************************/
#include "emu.h"
#include "cpu/mcs51/mcs51.h"
#include "sound/ay8910.h"
#include "fireball.lh"
#include "machine/eepromser.h"
/****************************
* LOG defines *
****************************/
#define LOG_DISPLAY 0
#define LOG_DISPLAY2 0
#define LOG_INPUT 0
#define LOG_AY8912 0
#define LOG_P1 0
#define LOG_P3 0
#define LOG_OUTPUT 0
/****************************
* Clock defines *
****************************/
#define CPU_CLK XTAL_11_0592MHz
#define AY_CLK XTAL_11_0592MHz/8
class fireball_state : public driver_device
{
public:
fireball_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_ay(*this, "aysnd"),
m_eeprom(*this, "eeprom")
{ }
UINT8 m_p1_data;
UINT8 m_p3_data;
UINT8 int_timing;
UINT8 int_data;
UINT8 ay_data;
UINT8 to_ay_data;
UINT8 m_display_data;
DECLARE_WRITE8_MEMBER(io_00_w);
DECLARE_READ8_MEMBER(io_00_r);
DECLARE_WRITE8_MEMBER(io_02_w);
DECLARE_READ8_MEMBER(io_02_r);
DECLARE_WRITE8_MEMBER(io_04_w);
DECLARE_READ8_MEMBER(io_04_r);
DECLARE_WRITE8_MEMBER(io_06_w);
DECLARE_READ8_MEMBER(io_06_r);
DECLARE_READ8_MEMBER(p1_r);
DECLARE_WRITE8_MEMBER(p1_w);
DECLARE_READ8_MEMBER(p3_r);
DECLARE_WRITE8_MEMBER(p3_w);
TIMER_DEVICE_CALLBACK_MEMBER(int_0);
protected:
// devices
required_device<cpu_device> m_maincpu;
required_device<ay8912_device> m_ay;
required_device<eeprom_serial_x24c44_device> m_eeprom;
// driver_device overrides
virtual void machine_reset();
private:
};
/****************************
* Read/Write Handlers *
****************************/
READ8_MEMBER(fireball_state::io_00_r)
{
UINT8 tmp=0;
tmp=ioport("X2-4")->read();
if (LOG_INPUT)
logerror("return %02X from 0x00\n",tmp);
return tmp;
}
WRITE8_MEMBER(fireball_state::io_00_w)
{
m_display_data= m_display_data&0x7f;
if (LOG_DISPLAY)
logerror("write to 0x00 IO %02X, m_display_data= %01X\n",data,m_display_data);
switch (data&0x0f)
{
case 1: output_set_digit_value(2, m_display_data);
break;
case 2: output_set_digit_value(1, m_display_data);
break;
case 4: output_set_digit_value(4, m_display_data);
break;
case 8: output_set_digit_value(3, m_display_data);
break;
}
if (LOG_OUTPUT)
logerror("write to 0x00 IO (X11-X11A) %02X\n",data&0xf0);
output_set_value("Hopper1", BIT(data, 4));
output_set_value("Hopper2", BIT(data, 5));
output_set_value("Hopper3", BIT(data, 6));
}
READ8_MEMBER(fireball_state::io_02_r)
{
UINT8 tmp=0;
tmp=ioport("X6-8")->read();
if (LOG_INPUT)
logerror("return %02X from 0x02\n",tmp);
return tmp;
}
WRITE8_MEMBER(fireball_state::io_02_w)
{
if (LOG_OUTPUT)
logerror("write to 0x00 IO (X7-X9) %02X\n",data);
output_set_value("GameOver", BIT(data, 0));
output_set_value("Title", BIT(data, 1));
output_set_value("Credit", BIT(data, 2));
output_set_value("SS", BIT(data, 3));
output_set_value("C_LOCK", BIT(~data, 4));
output_set_value("SV", BIT(data, 5));
output_set_value("FBV", BIT(data, 6));
output_set_value("RV", BIT(data, 7));
}
READ8_MEMBER(fireball_state::io_04_r)
{ //contraves per mod prog
UINT8 tmp=0;
tmp=ioport("X10-12")->read();
if (LOG_INPUT)
logerror("return %02X from 0x04\n",tmp);
return tmp;
}
WRITE8_MEMBER(fireball_state::io_04_w)
{//display data
if (LOG_DISPLAY)
logerror("display datat write %02X\n",data);
m_display_data=data;
}
READ8_MEMBER(fireball_state::io_06_r)
{
if (LOG_AY8912)
logerror("read from 0x06 IO\n");
return 0xbe;
//bit 0x01 is NC
//bit 0x40 is used to detect is the unit is powerd up!!! related to eeprom store?
}
WRITE8_MEMBER(fireball_state::io_06_w)
{
if (LOG_AY8912)
logerror("write to 0x06 data =%02X\n",data);
to_ay_data= data;
if (LOG_DISPLAY2)
logerror("On board display write %02X\n",UINT8(~(data&0xff)));
output_set_digit_value(7, UINT8(~(data&0xff)));
}
READ8_MEMBER(fireball_state::p1_r)
{
UINT8 tmp=0;
tmp=(m_p1_data&0xfe)|(m_eeprom->do_read());
if (LOG_P1)
logerror("readP1 port data %02X\n",tmp&0x01);
return tmp;
}
WRITE8_MEMBER(fireball_state::p1_w)
{
//eeprom x24c44/ay8912/system stuff...
//bit0 goes to eeprom pin 3 and 4 (0x01) Data_in and Data_out
//bit1 goes to eeprom pin 1 (0x02) CE Hi active
//bit2 goes to eeprom pin 2 (0x04) SK Clock
//bit3 goes to dis/thr input of a ne555 that somehow reset the 8031... TODO
//bit4 goes to ay8912 pin bc1 (0x10)
//bit5 goes to ay8912 pin bdir (0x20)
//bit6 goes to TODO
//bit7 goes to TODO
if (LOG_AY8912){
if(( data&0x30) != (m_p1_data&0x30)){
logerror("write ay8910 controll bc1= %02X bdir= %02X\n",data&0x10, data&0x20);
}
}
m_eeprom->di_write(data & 0x01);
m_eeprom->clk_write((data & 0x04) ? ASSERT_LINE : CLEAR_LINE);
m_eeprom->cs_write((data & 0x02) ? ASSERT_LINE : CLEAR_LINE);
if (LOG_P1){
if(( data&0xc8) != (m_p1_data&0xc8)){
logerror("Unkonow P1 data changed, old data %02X, new data %02X\n",m_p1_data,data);
}
}
//AY 3-8912 data write/read
if (data & 0x20){ //bdir
//write to ay8912
if (LOG_AY8912)
logerror("write to 0x06 bdir=1\n");
if(data & 0x10){
//address_w
if (LOG_AY8912)
logerror("write to 0x06 bc1=1\n");
m_ay->address_w(space,0,to_ay_data );
if (LOG_AY8912)
logerror("AY8912 address latch write=%02X\n",to_ay_data);
}else{
//data_w
if (LOG_AY8912)
logerror("write to 0x06 bc1=0\n");
m_ay->data_w(space,0,to_ay_data );
if (LOG_AY8912)
logerror("AY8912 data write=%02X\n",to_ay_data);
}
}else{
if (LOG_AY8912)
logerror("write to 0x06 bdir=0\n");
ay_data=m_ay->data_r(space,0);
}
m_p1_data=data;
}
READ8_MEMBER(fireball_state::p3_r)
{
UINT8 ret = 0xfb | ((int_data&1)<<2);
if (LOG_P3)
logerror("read P3 port data = %02X\n",ret);
return ret;
}
WRITE8_MEMBER(fireball_state::p3_w)
{
if (LOG_P3)
logerror("write to P3 port data=%02X\n",data);
m_p3_data=data;
}
/*************************
* Memory Map Information *
*************************/
static ADDRESS_MAP_START( fireball_map, AS_PROGRAM, 8, fireball_state )
AM_RANGE(0x0000, 0x1fff) AM_ROM
ADDRESS_MAP_END
static ADDRESS_MAP_START( fireball_io_map, AS_IO, 8, fireball_state )
AM_RANGE(0x00, 0x01)AM_READWRITE(io_00_r,io_00_w)
AM_RANGE(0x02, 0x03)AM_READWRITE(io_02_r,io_02_w)
AM_RANGE(0x04, 0x05)AM_READWRITE(io_04_r,io_04_w)
AM_RANGE(0x06, 0x07)AM_READWRITE(io_06_r,io_06_w)
//internal port
AM_RANGE(MCS51_PORT_P1, MCS51_PORT_P1) AM_READWRITE(p1_r, p1_w)
AM_RANGE(MCS51_PORT_P3, MCS51_PORT_P3) AM_READWRITE(p3_r, p3_w)
ADDRESS_MAP_END
/*************************
* Input Ports *
*************************/
static INPUT_PORTS_START( fireball )
PORT_START("X2-4")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_Q) PORT_NAME("100 Points")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_W) PORT_NAME("100 Points second input")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_E) PORT_NAME("200 Points")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_R) PORT_NAME("300 Points")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_T) PORT_NAME("400 Points")
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_Y) PORT_NAME("500 Points")
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_U) PORT_NAME("600 Points")
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_I) PORT_NAME("800 Points")
PORT_START("X6-8")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_A) PORT_NAME("Empty Hopper A") //activeLow to fool the game code...
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_S) PORT_NAME("Empty Hopper B")//at least one hopper must be full
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_D) PORT_NAME("Empty Hopper C")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_Z) PORT_NAME("Programming Button")
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_X) PORT_NAME("Confirm Value")
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_C) PORT_NAME("All Options Default value")
PORT_START("X10-12")
PORT_DIPNAME( 0xff, 0x00, "Programming Value" )
PORT_DIPSETTING( 0x00, "00" ) //0
PORT_DIPSETTING( 0x01, "01" )
PORT_DIPSETTING( 0x02, "02" )
PORT_DIPSETTING( 0x03, "03" )
PORT_DIPSETTING( 0x04, "04" )
PORT_DIPSETTING( 0x05, "05" )
PORT_DIPSETTING( 0x06, "06" )
PORT_DIPSETTING( 0x07, "07" )
PORT_DIPSETTING( 0x08, "08" )
PORT_DIPSETTING( 0x09, "09" )
PORT_DIPSETTING( 0x10, "10" ) //10
PORT_DIPSETTING( 0x11, "11" )
PORT_DIPSETTING( 0x12, "12" )
PORT_DIPSETTING( 0x13, "13" )
PORT_DIPSETTING( 0x14, "14" )
PORT_DIPSETTING( 0x15, "15" )
PORT_DIPSETTING( 0x16, "16" )
PORT_DIPSETTING( 0x17, "17" )
PORT_DIPSETTING( 0x18, "18" )
PORT_DIPSETTING( 0x19, "19" )
PORT_DIPSETTING( 0x20, "20" ) //20
PORT_DIPSETTING( 0x21, "21" )
PORT_DIPSETTING( 0x22, "22" )
PORT_DIPSETTING( 0x23, "23" )
PORT_DIPSETTING( 0x24, "24" )
PORT_DIPSETTING( 0x25, "25" )
PORT_DIPSETTING( 0x26, "26" )
PORT_DIPSETTING( 0x27, "27" )
PORT_DIPSETTING( 0x28, "28" )
PORT_DIPSETTING( 0x29, "29" )
PORT_DIPSETTING( 0x30, "30" ) //30
PORT_DIPSETTING( 0x31, "31" )
PORT_DIPSETTING( 0x32, "32" )
PORT_DIPSETTING( 0x33, "33" )
PORT_DIPSETTING( 0x34, "34" )
PORT_DIPSETTING( 0x35, "35" )
PORT_DIPSETTING( 0x36, "36" )
PORT_DIPSETTING( 0x37, "37" )
PORT_DIPSETTING( 0x38, "38" )
PORT_DIPSETTING( 0x39, "39" )
PORT_DIPSETTING( 0x40, "40" ) //40
PORT_DIPSETTING( 0x41, "41" )
PORT_DIPSETTING( 0x42, "42" )
PORT_DIPSETTING( 0x43, "43" )
PORT_DIPSETTING( 0x44, "44" )
PORT_DIPSETTING( 0x45, "45" )
PORT_DIPSETTING( 0x46, "46" )
PORT_DIPSETTING( 0x47, "47" )
PORT_DIPSETTING( 0x48, "48" )
PORT_DIPSETTING( 0x49, "49" )
PORT_DIPSETTING( 0x50, "50" ) //50
PORT_DIPSETTING( 0x51, "51" )
PORT_DIPSETTING( 0x52, "52" )
PORT_DIPSETTING( 0x53, "53" )
PORT_DIPSETTING( 0x54, "54" )
PORT_DIPSETTING( 0x55, "55" )
PORT_DIPSETTING( 0x56, "56" )
PORT_DIPSETTING( 0x57, "57" )
PORT_DIPSETTING( 0x58, "58" )
PORT_DIPSETTING( 0x59, "59" )
PORT_DIPSETTING( 0x60, "60" ) //60
PORT_DIPSETTING( 0x61, "61" )
PORT_DIPSETTING( 0x62, "62" )
PORT_DIPSETTING( 0x63, "63" )
PORT_DIPSETTING( 0x64, "64" )
PORT_DIPSETTING( 0x65, "65" )
PORT_DIPSETTING( 0x66, "66" )
PORT_DIPSETTING( 0x67, "67" )
PORT_DIPSETTING( 0x68, "68" )
PORT_DIPSETTING( 0x69, "69" )
PORT_DIPSETTING( 0x70, "70" ) //70
PORT_DIPSETTING( 0x71, "71" )
PORT_DIPSETTING( 0x72, "72" )
PORT_DIPSETTING( 0x73, "73" )
PORT_DIPSETTING( 0x74, "74" )
PORT_DIPSETTING( 0x75, "75" )
PORT_DIPSETTING( 0x76, "76" )
PORT_DIPSETTING( 0x77, "77" )
PORT_DIPSETTING( 0x78, "78" )
PORT_DIPSETTING( 0x79, "79" )
PORT_DIPSETTING( 0x80, "80" ) //80
PORT_DIPSETTING( 0x81, "81" )
PORT_DIPSETTING( 0x82, "82" )
PORT_DIPSETTING( 0x83, "83" )
PORT_DIPSETTING( 0x84, "84" )
PORT_DIPSETTING( 0x85, "85" )
PORT_DIPSETTING( 0x86, "86" )
PORT_DIPSETTING( 0x87, "87" )
PORT_DIPSETTING( 0x88, "88" )
PORT_DIPSETTING( 0x89, "89" )
PORT_DIPSETTING( 0x90, "90" ) //90
PORT_DIPSETTING( 0x91, "91" )
PORT_DIPSETTING( 0x92, "92" )
PORT_DIPSETTING( 0x93, "93" )
PORT_DIPSETTING( 0x94, "94" )
PORT_DIPSETTING( 0x95, "95" )
PORT_DIPSETTING( 0x96, "96" )
PORT_DIPSETTING( 0x97, "97" )
PORT_DIPSETTING( 0x98, "98" )
PORT_DIPSETTING( 0x99, "99" )
INPUT_PORTS_END
/******************************
* machine reset *
******************************/
void fireball_state::machine_reset()
{
int_timing=1;
output_set_digit_value(5, 0x3f);
output_set_digit_value(6, 0x3f);
output_set_value("Hopper1", 0);
output_set_value("Hopper2", 0);
output_set_value("Hopper3", 0);
output_set_value("GameOver", 0);
output_set_value("Title", 0);
output_set_value("Credit", 0);
output_set_value("SS", 0);
output_set_value("C_LOCK", 0);
output_set_value("SV", 0);
output_set_value("FBV", 0);
output_set_value("RV", 0);
}
/******************************
* AY 3-8910 *
******************************/
static const ay8910_interface ay8912_interface =
{
AY8910_LEGACY_OUTPUT,
AY8910_DEFAULT_LOADS,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};
/*************************
* INT callback *
*************************/
TIMER_DEVICE_CALLBACK_MEMBER( fireball_state::int_0 )
{
/* toggle the INT0 line on the CPU */
if (int_timing==1){
//logerror("INT set\n");
m_maincpu->set_input_line(MCS51_INT0_LINE, ASSERT_LINE);
int_data=1;
}
if (int_timing==2){
//logerror("INT clear\n");
m_maincpu->set_input_line(MCS51_INT0_LINE, CLEAR_LINE);
int_data=0;
}
if (int_timing==5){
int_timing=0;
}
int_timing++;
}
/*************************
* Machine Drivers *
*************************/
static MACHINE_CONFIG_START( fireball, fireball_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", I8031, CPU_CLK) //
MCFG_CPU_PROGRAM_MAP(fireball_map)
MCFG_CPU_IO_MAP(fireball_io_map)
MCFG_TIMER_DRIVER_ADD_PERIODIC("int_0", fireball_state, int_0, attotime::from_hz(555)) //9ms from scope reading 111Hz take care of this in the handler
MCFG_EEPROM_SERIAL_X24C44_ADD("eeprom")
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("aysnd", AY8912, AY_CLK)
MCFG_SOUND_CONFIG(ay8912_interface)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
/* Video */
MCFG_DEFAULT_LAYOUT(layout_fireball)
MACHINE_CONFIG_END
/*************************
* Rom Load *
*************************/
ROM_START(fireball)
ROM_REGION(0x10000, "maincpu", 0)
ROM_LOAD("euroball-89-07-13-c026.bin", 0x0000, 0x2000, CRC(cab3fc1c) SHA1(bcf0d17e26f2d9f5e20bda258728c989ea138702))
ROM_REGION( 0x20, "eeprom", 0 ) // default eeprom must have some specific value at 0x03 at least
ROM_LOAD( "fireball.nv", 0x0000, 0x020, CRC(1d0f5f0f) SHA1(8e68fcd8782f39ed3b1df6162db9be83cb3335e4) ) //default setting
ROM_END
/*************************
* Game Drivers *
*************************/
/* YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS*/
GAME( 1989, fireball, 0, fireball, fireball, driver_device, 0, ROT0, "Valco", "Fireball", GAME_MECHANICAL ) //1989 by rom name

View File

@ -0,0 +1,143 @@
<!-- fireball.lay -->
<!-- 2014-01-15: Initial version. -->
<mamelayout version="2">
<element name="digit" defstate="0">
<led7seg>
<color red="1.0" green="0.25" blue="0.0" />
</led7seg>
</element>
<element name="red_led">
<rect>
<color red="1.0" green="0.0" blue="0.0" />
</rect>
</element>
<element name="background">
<rect>
<bounds left="0" top="0" right="1" bottom="1" />
<color red="0.0" green="0.0" blue="0.0" />
</rect>
</element>
<element name="P0"><text string="Score"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P1"><text string="Ball"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P2"><text string="On board"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P3"><text string="Token payout 1"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P4"><text string="Token payout 2"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P5"><text string="Token payout 3"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P6"><text string="Title"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P7"><text string="Game Over"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P8"><text string="Credit"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P9"><text string="Super Shot"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P10"><text string="Coin Lock Out"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P11"><text string="Shot Valve"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P12"><text string="Feed Back Valve"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P13"><text string="Return Valve"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<view name="Default Layout">
<!-- Background -->
<backdrop element="background">
<bounds left="0" top="20" right="360" bottom="150" />
</backdrop>
<!-- LEDs -->
<!-- Player Score -->
<bezel name="digit1" element="digit">
<bounds left="10" top="45" right="44" bottom="84" />
</bezel>
<bezel name="digit2" element="digit">
<bounds left="54" top="45" right="88" bottom="84" />
</bezel>
<bezel name="digit5" element="digit">
<bounds left="98" top="45" right="132" bottom="84" />
</bezel>
<bezel name="digit6" element="digit">
<bounds left="142" top="45" right="176" bottom="84" />
</bezel>
<!-- Balls -->
<bezel name="digit3" element="digit">
<bounds left="230" top="45" right="264" bottom="84" />
</bezel>
<bezel name="digit4" element="digit">
<bounds left="274" top="45" right="308" bottom="84" />
</bezel>
<!-- Onboard -->
<bezel name="digit7" element="digit">
<bounds left="330" top="65" right="350" bottom="84" />
</bezel>
<!-- Game Lamp -->
<bezel name="Hopper1" element="red_led">
<bounds x="10" y="110" width="30" height="5" />
</bezel>
<bezel name="Hopper2" element="red_led">
<bounds x="50" y="110" width="30" height="5" />
</bezel>
<bezel name="Hopper3" element="red_led">
<bounds x="90" y="110" width="30" height="5" />
</bezel>
<bezel name="Title" element="red_led">
<bounds x="10" y="140" width="30" height="5" />
</bezel>
<bezel name="GameOver" element="red_led">
<bounds x="50" y="140" width="30" height="5" />
</bezel>
<bezel name="Credit" element="red_led">
<bounds x="90" y="140" width="30" height="5" />
</bezel>
<bezel name="SS" element="red_led">
<bounds x="130" y="140" width="30" height="5" />
</bezel>
<bezel name="C_LOCK" element="red_led">
<bounds x="170" y="140" width="30" height="5" />
</bezel>
<bezel name="SV" element="red_led">
<bounds x="210" y="140" width="30" height="5" />
</bezel>
<bezel name="FBV" element="red_led">
<bounds x="250" y="140" width="30" height="5" />
</bezel>
<bezel name="RV" element="red_led">
<bounds x="290" y="140" width="30" height="5" />
</bezel>
<bezel element="P0"><bounds left="71" right="115" top="30" bottom="42" /></bezel>
<bezel element="P1"><bounds left="247" right="288" top="30" bottom="42" /></bezel>
<bezel element="P2"><bounds left="330" right="350" top="50" bottom="62" /></bezel>
<bezel element="P3"><bounds left="10" right="40" top="90" bottom="104" /></bezel>
<bezel element="P4"><bounds left="50" right="80" top="90" bottom="104" /></bezel>
<bezel element="P5"><bounds left="90" right="120" top="90" bottom="104" /></bezel>
<bezel element="P6"><bounds left="10" right="40" top="120" bottom="134" /></bezel>
<bezel element="P7"><bounds left="50" right="80" top="120" bottom="134" /></bezel>
<bezel element="P8"><bounds left="90" right="120" top="120" bottom="134" /></bezel>
<bezel element="P9"><bounds left="130" right="160" top="120" bottom="134" /></bezel>
<bezel element="P10"><bounds left="170" right="200" top="120" bottom="134" /></bezel>
<bezel element="P11"><bounds left="210" right="240" top="120" bottom="134" /></bezel>
<bezel element="P12"><bounds left="250" right="280" top="120" bottom="134" /></bezel>
<bezel element="P13"><bounds left="290" right="320" top="120" bottom="134" /></bezel>
</view>
</mamelayout>

View File

@ -31294,4 +31294,7 @@ arac6000
number1 // 1996 San Remo Games
gluck2 // 1992 Yung Yu / CYE
// Valco fireball
fireball
amusco // 1987, Amusco.

View File

@ -2243,6 +2243,7 @@ $(MAMEOBJ)/misc.a: \
$(DRIVERS)/esripsys.o $(VIDEO)/esripsys.o \
$(DRIVERS)/ettrivia.o \
$(DRIVERS)/extrema.o \
$(DRIVERS)/fireball.o \
$(DRIVERS)/flipjack.o \
$(DRIVERS)/flower.o $(AUDIO)/flower.o $(VIDEO)/flower.o \
$(DRIVERS)/fortecar.o \
@ -2416,7 +2417,7 @@ $(MAMEOBJ)/misc.a: \
$(DRIVERS)/wms.o \
$(DRIVERS)/xtom3d.o \
$(DRIVERS)/xyonix.o $(VIDEO)/xyonix.o \
#-------------------------------------------------
# layout dependencies
@ -2564,6 +2565,8 @@ $(DRIVERS)/ecoinf2.o: $(LAYOUT)/ecoinf2.lh
$(DRIVERS)/ecoinf3.o: $(LAYOUT)/ecoinf3.lh
$(DRIVERS)/fireball.o: $(LAYOUT)/fireball.lh
$(DRIVERS)/firebeat.o: $(LAYOUT)/firebeat.lh
$(DRIVERS)/firetrk.o: $(LAYOUT)/superbug.lh