diff options
Diffstat (limited to 'src/mame/machine/simpsons.c')
-rw-r--r-- | src/mame/machine/simpsons.c | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/src/mame/machine/simpsons.c b/src/mame/machine/simpsons.c new file mode 100644 index 00000000000..1556b2359cf --- /dev/null +++ b/src/mame/machine/simpsons.c @@ -0,0 +1,146 @@ +#include "driver.h" +#include "video/konamiic.h" +#include "cpu/konami/konami.h" +#include "machine/eeprom.h" +#include "sound/k053260.h" + +/* from video */ +extern void simpsons_video_banking( int select ); +extern UINT8 *simpsons_xtraram; + +int simpsons_firq_enabled; + +/*************************************************************************** + + EEPROM + +***************************************************************************/ + +static int init_eeprom_count; + + +static struct EEPROM_interface eeprom_interface = +{ + 7, /* address bits */ + 8, /* data bits */ + "011000", /* read command */ + "011100", /* write command */ + 0, /* erase command */ + "0100000000000",/* lock command */ + "0100110000000" /* unlock command */ +}; + +NVRAM_HANDLER( simpsons ) +{ + if (read_or_write) + EEPROM_save(file); + else + { + EEPROM_init(&eeprom_interface); + + if (file) + { + init_eeprom_count = 0; + EEPROM_load(file); + } + else + init_eeprom_count = 10; + } +} + +READ8_HANDLER( simpsons_eeprom_r ) +{ + int res; + + res = (EEPROM_read_bit() << 4); + + res |= 0x20;//konami_eeprom_ack() << 5; /* add the ack */ + + res |= readinputport( 5 ) & 1; /* test switch */ + + if (init_eeprom_count) + { + init_eeprom_count--; + res &= 0xfe; + } + return res; +} + +WRITE8_HANDLER( simpsons_eeprom_w ) +{ + if ( data == 0xff ) + return; + + EEPROM_write_bit(data & 0x80); + EEPROM_set_cs_line((data & 0x08) ? CLEAR_LINE : ASSERT_LINE); + EEPROM_set_clock_line((data & 0x10) ? ASSERT_LINE : CLEAR_LINE); + + simpsons_video_banking( data & 3 ); + + simpsons_firq_enabled = data & 0x04; +} + +/*************************************************************************** + + Coin Counters, Sound Interface + +***************************************************************************/ + +WRITE8_HANDLER( simpsons_coin_counter_w ) +{ + /* bit 0,1 coin counters */ + coin_counter_w(0,data & 0x01); + coin_counter_w(1,data & 0x02); + /* bit 2 selects mono or stereo sound */ + /* bit 3 = enable char ROM reading through the video RAM */ + K052109_set_RMRD_line((data & 0x08) ? ASSERT_LINE : CLEAR_LINE); + /* bit 4 = INIT (unknown) */ + /* bit 5 = enable sprite ROM reading */ + K053246_set_OBJCHA_line((~data & 0x20) ? ASSERT_LINE : CLEAR_LINE); +} + +READ8_HANDLER( simpsons_sound_interrupt_r ) +{ + cpunum_set_input_line_and_vector( 1, 0, HOLD_LINE, 0xff ); + return 0x00; +} + +READ8_HANDLER( simpsons_sound_r ) +{ + return K053260_0_r(2 + offset); +} + + +/*************************************************************************** + + Banking, initialization + +***************************************************************************/ + +static void simpsons_banking( int lines ) +{ + memory_set_bank(1, lines & 0x3f); +} + +MACHINE_RESET( simpsons ) +{ + UINT8 *RAM = memory_region(REGION_CPU1); + + cpunum_set_info_fct(0, CPUINFO_PTR_KONAMI_SETLINES_CALLBACK, (genf *)simpsons_banking); + + paletteram = &RAM[0x88000]; + simpsons_xtraram = &RAM[0x89000]; + spriteram16 = (UINT16 *)&RAM[0x8a000]; + + simpsons_firq_enabled = 0; + + /* init the default banks */ + memory_configure_bank(1, 0, 64, memory_region(REGION_CPU1) + 0x10000, 0x2000); + memory_set_bank(1, 0); + + memory_configure_bank(2, 0, 2, memory_region(REGION_CPU2) + 0x10000, 0); + memory_configure_bank(2, 2, 6, memory_region(REGION_CPU2) + 0x10000, 0x4000); + memory_set_bank(2, 0); + + simpsons_video_banking( 0 ); +} |