mpu4vid.cpp: Added inputs and layout for Strike it Lucky, corrected inputs for Adders and Ladders.

mpu4.cpp: Added support for simple LED extender used by MPU4Video games.
This commit is contained in:
James Wallace 2020-07-14 09:19:16 +01:00
parent 36ae40b4aa
commit c665001905
7 changed files with 638 additions and 45 deletions

View File

@ -1,6 +1,6 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
/* these are the MPU4 set listings / set specific code, for hardware emulation see mpu4hw.c */
/* these are the MPU4 set listings / set specific code, for hardware emulation see machine/mpu4.cpp */
/* todo: driver inits (basic hw reel, protection configs etc.) should probably be moved here
once the actual code for them is cleaned up and can be put into neater structures

View File

@ -170,7 +170,7 @@ TODO:
- Get the BwB games running
* They have a slightly different 68k memory map. The 6850 is at e00000 and the 6840 is at e01000
They appear to hang on the handshake with the MPU4 board
- EF9369 colour palette is still wrong in test modes.
- Layouts needed for the other working games, and DIP switches need checking/altering (no test mode?)
***********************************************************************************************************/
#include "emu.h"
#include "includes/mpu4.h"
@ -201,6 +201,7 @@ TODO:
#include "crmaze2p.lh"
#include "crmaze4p.lh"
#include "v4addlad.lh"
#include "v4strike.lh"
class mpu4vid_state : public mpu4_state
@ -1102,10 +1103,10 @@ static INPUT_PORTS_START( adders )
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_INTERLOCK) PORT_NAME("Cashbox Door") PORT_CODE(KEYCODE_Q) PORT_TOGGLE
PORT_START("BLACK2")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON6) PORT_NAME("C")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON8) PORT_NAME("C")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_BUTTON7) PORT_NAME("B")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_BUTTON8) PORT_NAME("A")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_BUTTON9) PORT_NAME("Continue")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_BUTTON6) PORT_NAME("A")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_BUTTON5) PORT_NAME("Continue")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_START1)
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_UNUSED)
@ -1238,6 +1239,120 @@ static INPUT_PORTS_START( v4tetris )
INPUT_PORTS_END
static INPUT_PORTS_START( strike )
PORT_START("ORANGE1")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON8) PORT_NAME("Freeze")
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON9) PORT_NAME("Go On!")
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_START("ORANGE2")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_START("BLACK1")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_SERVICE) PORT_NAME("Play")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_BUTTON3) PORT_NAME("Green (Left)")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_NAME("Yellow (Left)")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_NAME("Red (Left)")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_SERVICE) PORT_NAME("Test Button") PORT_CODE(KEYCODE_W)
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_SERVICE) PORT_NAME("Refill Key") PORT_CODE(KEYCODE_R) PORT_TOGGLE
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_INTERLOCK) PORT_NAME("Cashbox Door") PORT_CODE(KEYCODE_Q) PORT_TOGGLE
PORT_START("BLACK2")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_BUTTON7) PORT_NAME("Help")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_BUTTON6) PORT_NAME("Green (Right)")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_BUTTON5) PORT_NAME("Yellow (Right)")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_BUTTON4) PORT_NAME("Red (Right)")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_GAMBLE_PAYOUT) PORT_NAME("Collect")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_START1)
PORT_START("DIL1")
PORT_DIPNAME( 0x01, 0x00, "DIL101" ) PORT_DIPLOCATION("DIL1:01")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x01, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x00, "DIL102" ) PORT_DIPLOCATION("DIL1:02")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x02, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x00, "DIL103" ) PORT_DIPLOCATION("DIL1:03")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x04, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x00, "DIL104" ) PORT_DIPLOCATION("DIL1:04")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x08, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x00, "DIL105" ) PORT_DIPLOCATION("DIL1:05")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x10, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x00, "DIL106" ) PORT_DIPLOCATION("DIL1:06")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x20, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x00, "DIL107" ) PORT_DIPLOCATION("DIL1:07")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x40, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x00, "DIL108" ) PORT_DIPLOCATION("DIL1:08")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
PORT_START("DIL2")
PORT_DIPNAME( 0x01, 0x00, "1 Pound for change" ) PORT_DIPLOCATION("DIL2:01")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x01, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x00, "DIL202" ) PORT_DIPLOCATION("DIL2:02")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x02, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x00, "DIL203" ) PORT_DIPLOCATION("DIL2:03")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x04, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x00, "Attract mode inhibit" ) PORT_DIPLOCATION("DIL2:04")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x08, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x00, "DIL205" ) PORT_DIPLOCATION("DIL2:05")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x10, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x00, "Coin alarm inhibit" ) PORT_DIPLOCATION("DIL2:06")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x20, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x00, "DIL207" ) PORT_DIPLOCATION("DIL2:07")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x40, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x00, "Single coin entry" ) PORT_DIPLOCATION("DIL2:08")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
PORT_START("AUX1")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_START("AUX2")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_CUSTOM)
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_CUSTOM)
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_CUSTOM)
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_CUSTOM)
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_COIN1) PORT_NAME("10p")//PORT_IMPULSE(5)
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_COIN2) PORT_NAME("20p")//PORT_IMPULSE(5)
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_COIN3) PORT_NAME("50p")//PORT_IMPULSE(5)
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_COIN4) PORT_NAME("100p")//PORT_IMPULSE(5)
INPUT_PORTS_END
WRITE_LINE_MEMBER(mpu4vid_state::mpu_video_reset)
{
m_ptm->reset();
@ -1339,7 +1454,6 @@ void mpu4vid_state::bwbvid_68k_map(address_map &map)
map(0xc00000, 0xc1ffff).rw(FUNC(mpu4vid_state::mpu4_vid_vidram_r), FUNC(mpu4vid_state::mpu4_vid_vidram_w)).share("vid_vidram");
map(0xe00000, 0xe00003).rw(m_acia_1, FUNC(acia6850_device::read), FUNC(acia6850_device::write)).umask16(0x00ff);
map(0xe01000, 0xe0100f).rw(m_ptm, FUNC(ptm6840_device::read), FUNC(ptm6840_device::write)).umask16(0x00ff);
//map(0xe05000, 0xe05001).rw(FUNC(mpu4vid_state::bwb_characteriser16_r), FUNC(mpu4vid_state::bwb_characteriser16_w)); // CHR
}
void mpu4vid_state::bwbvid5_68k_map(address_map &map)
@ -1360,7 +1474,7 @@ void mpu4vid_state::bwbvid5_68k_map(address_map &map)
map(0xe02000, 0xe02007).rw("pia_ic4ss", FUNC(pia6821_device::read), FUNC(pia6821_device::write)).umask16(0xff00); //Seems odd...
map(0xe03000, 0xe0300f).r("ptm_ic3ss", FUNC(ptm6840_device::read)).umask16(0xff00); // 6840PTM on sampled sound board
map(0xe03000, 0xe0300f).w(FUNC(mpu4vid_state::ic3ss_vid_w)).umask16(0xff00); // 6840PTM on sampled sound board
map(0xe04000, 0xe0400f).rw(FUNC(mpu4vid_state::bwb_characteriser_r), FUNC(mpu4vid_state::bwb_characteriser_w)).umask16(0x00ff); //.rw(FUNC(mpu4vid_state::adpcm_r), FUNC(mpu4vid_state::adpcm_w)); CHR ?
map(0xe04000, 0xe0400f).rw(FUNC(mpu4vid_state::bwb_characteriser_r), FUNC(mpu4vid_state::bwb_characteriser_w)).umask16(0x00ff); // CHR ?
}
/* TODO: Fix up MPU4 map*/
@ -1903,6 +2017,7 @@ void mpu4vid_state::init_timemchn()
void mpu4vid_state::init_strikeit()
{
m_led_extender = SIMPLE_CARD;
m_reels = 0;//currently no hybrid games
m_current_chr_table = nullptr;
m_4ktable = memregion( "video_prot" )->base();
@ -4028,7 +4143,7 @@ GAMEL( 1994, v4cmaze3c, v4cmaze3, crmaze, crmaze, mpu4vid_state, init_v4c
GAMEL( 1994, v4cmaze3a, v4cmaze3, crmaze, crmaze, mpu4vid_state, init_crmaze3a, ROT0, "Barcrest","The Crystal Maze Team Challenge (v1.2, AMLD) (MPU4 Video)",GAME_FLAGS,layout_crmaze4p )//SWP 0.7
//Year is a guess, based on the use of the 'Coin Man' logo
GAME( 1996?,v4mate, v4bios, mating, mating, mpu4vid_state, init_mating, ROT0, "Barcrest","The Mating Game (v0.4) (MPU4 Video)",GAME_FLAGS )//SWP 0.2 /* Using crmaze controls for now, cabinet has trackball */
GAME( 1996?,v4mate, v4bios, mating, mating, mpu4vid_state, init_mating, ROT0, "Barcrest","The Mating Game (v0.4) (MPU4 Video)",GAME_FLAGS )//SWP 0.2
GAME( 1996?,v4mated, v4mate, mating, mating, mpu4vid_state, init_mating, ROT0, "Barcrest","The Mating Game (v0.4, Datapak) (MPU4 Video)",GAME_FLAGS )//SWP 0.2D
/* Quiz games - Questions decoded */
@ -4037,10 +4152,10 @@ GAMEL( 1989, v4addlad, v4bios, mpu4_vid_strike, adders, mpu4vid_state,
GAMEL( 1989, v4addladd, v4addlad, mpu4_vid_strike, adders, mpu4vid_state, init_strikeit, ROT0, "Barcrest","Adders and Ladders (v2.1d) (MPU4 Video)",GAME_FLAGS,layout_v4addlad )
GAMEL( 1989, v4addlad20, v4addlad, mpu4_vid_strike, adders, mpu4vid_state, init_strikeit, ROT0, "Barcrest","Adders and Ladders (v2.0) (MPU4 Video)",GAME_FLAGS,layout_v4addlad )
GAME( 199?, v4strike, v4bios, mpu4_vid_strike, mpu4, mpu4vid_state, init_strikeit, ROT0, "Barcrest","Strike it Lucky (v0.5) (MPU4 Video)",GAME_FLAGS )
GAME( 199?, v4striked, v4strike, mpu4_vid_strike, mpu4, mpu4vid_state, init_strikeit, ROT0, "Barcrest","Strike it Lucky (v0.5, Datapak) (MPU4 Video)",GAME_FLAGS )
GAME( 199?, v4strike2, v4strike, mpu4_vid_strike, mpu4, mpu4vid_state, init_strikeit, ROT0, "Barcrest","Strike it Lucky (v0.53) (MPU4 Video)",GAME_FLAGS )
GAME( 199?, v4strike2d, v4strike, mpu4_vid_strike, mpu4, mpu4vid_state, init_strikeit, ROT0, "Barcrest","Strike it Lucky (v0.53, Datapak) (MPU4 Video)",GAME_FLAGS )
GAMEL( 199?, v4strike, v4bios, mpu4_vid_strike, strike, mpu4vid_state, init_strikeit, ROT0, "Barcrest","Strike it Lucky (v0.5) (MPU4 Video)",GAME_FLAGS,layout_v4strike )
GAMEL( 199?, v4striked, v4strike, mpu4_vid_strike, strike, mpu4vid_state, init_strikeit, ROT0, "Barcrest","Strike it Lucky (v0.5, Datapak) (MPU4 Video)",GAME_FLAGS,layout_v4strike )
GAMEL( 199?, v4strike2, v4strike, mpu4_vid_strike, strike, mpu4vid_state, init_strikeit, ROT0, "Barcrest","Strike it Lucky (v0.53) (MPU4 Video)",GAME_FLAGS,layout_v4strike )
GAMEL( 199?, v4strike2d, v4strike, mpu4_vid_strike, strike, mpu4vid_state, init_strikeit, ROT0, "Barcrest","Strike it Lucky (v0.53, Datapak) (MPU4 Video)",GAME_FLAGS,layout_v4strike )
GAME( 199?, v4barqst, v4bios, mpu4_vid_strike, mpu4, mpu4vid_state, init_strikeit, ROT0, "Barcrest","Barquest (v2.6) (MPU4 Video)",GAME_FLAGS )
GAME( 199?, v4barqstd, v4barqst, mpu4_vid_strike, mpu4, mpu4vid_state, init_strikeit, ROT0, "Barcrest","Barquest (v2.6d) (MPU4 Video)",GAME_FLAGS )

View File

@ -60,7 +60,7 @@ static const uint8_t bwb_chr_table_common[10]= {0x00,0x04,0x04,0x0c,0x0c,0x1c,0x
#define SIX_REEL_1TO8 4 // Two reels on the meter drives
#define SIX_REEL_5TO8 5 // Like FIVE_REEL_5TO8, but with an extra reel elsewhere
#define SEVEN_REEL 6 // Mainly club machines, significant reworking of reel hardware
#define FLUTTERBOX 7 // Will you start the fans, please! A fan using a reel mux-like setup, but not actually a reel
#define FLUTTERBOX 7 // A fan feature using a reel mux-like setup, but not actually a reel
//Lamp extension
#define NO_EXTENDER 0 // As originally designed
@ -73,6 +73,8 @@ static const uint8_t bwb_chr_table_common[10]= {0x00,0x04,0x04,0x0c,0x0c,0x1c,0x
#define CARD_A 1
#define CARD_B 2
#define CARD_C 3
#define SIMPLE_CARD 4
//Hopper info
#define TUBES 0
@ -159,6 +161,7 @@ public:
void init_m4_led_a();
void init_m4_led_b();
void init_m4_led_c();
void init_m4_led_simple();
void init_m4_andycp10c();
void init_m_blsbys();
void init_m_oldtmr();
@ -232,7 +235,7 @@ protected:
void mpu4_memmap(address_map &map);
void lamp_extend_small(int data);
void lamp_extend_large(int data,int column,int active);
void led_write_latch(int latch, int data, int column);
void led_write_extender(int latch, int data, int column);
void update_meters();
void ic23_update();
void ic24_output(int data);

View File

@ -46,7 +46,7 @@ license:CC0
</element>
<view name="Monitor and Lamps">
<bezel name="lamp41" element="ESCAPE">
<bezel name="lamp41" element="ESCAPE" inputtag="BLACK2" inputmask="0x40">
<bounds x="514" y="267" width="30" height="30" />
</bezel>
<bezel name="P1" element="P1">

View File

@ -59,7 +59,7 @@ license:CC0
</element>
<view name="Monitor and Lamps">
<bezel name="lamp41" element="ESCAPE">
<bezel name="lamp41" element="ESCAPE" inputtag="BLACK2" inputmask="0x40">
<bounds x="514" y="267" width="30" height="30" />
</bezel>
<bezel name="P1" element="P1">

View File

@ -0,0 +1,465 @@
<?xml version="1.0"?>
<!--
license:CC0
-->
<mamelayout version="2">
<element name="GEMS" defstate="0">
<text string="GEMS" state="0">
<color red="1.0" green="1.0" blue="1.0" />
<bounds x="0" y="0" width="16" height="7" />
</text>
<text string="FOR" state="0">
<color red="1.0" green="1.0" blue="1.0" />
<bounds x="0" y="8" width="16" height="7" />
</text>
</element>
<element name="FREEZE" defstate="0">
<rect state ="0">
<bounds x="0" y="0" width="20" height="10" />
<color red="0.0" green="0.0" blue="0.2" />
</rect>
<text string="FREEZE">
<color red="1.0" green="1.0" blue="1.0" />
<bounds x="0" y="0" width="16" height="7" />
</text>
<rect state ="1">
<bounds x="0" y="0" width="20" height="10" />
<color red="0.0" green="0.0" blue="1.0" />
</rect>
</element>
<element name="GO" defstate="0">
<rect state ="0">
<bounds x="0" y="0" width="20" height="10" />
<color red="0.2" green="0.2" blue="0.0" />
</rect>
<text string="GO ON">
<color red="1.0" green="1.0" blue="1.0" />
<bounds x="0" y="0" width="16" height="7" />
</text>
<rect state ="1">
<bounds x="0" y="0" width="20" height="10" />
<color red="0.8" green="0.8" blue="0.0" />
</rect>
</element>
<element name="FREEGAME">
<text string="FREE">
<color red="1.0" green="1.0" blue="1.0" />
<bounds x="0" y="0" width="16" height="7" />
</text>
<text string="GAME">
<color red="1.0" green="1.0" blue="1.0" />
<bounds x="0" y="8" width="16" height="7" />
</text>
</element>
<element name="50P" defstate="0">
<text string="50p" state="0">
<color red="1.0" green="1.0" blue="1.0" />
<bounds x="0" y="0" width="16" height="16" />
</text>
</element>
<element name="£1" defstate="0">
<text string="£1" state="0">
<color red="1.0" green="1.0" blue="1.0" />
<bounds x="0" y="0" width="16" height="16" />
</text>
</element>
<element name="£2" defstate="0">
<text string="£2" state="0">
<color red="1.0" green="1.0" blue="1.0" />
<bounds x="0" y="0" width="16" height="16" />
</text>
</element>
<element name="£3" defstate="0">
<text string="£3" state="0">
<color red="1.0" green="1.0" blue="1.0" />
<bounds x="0" y="0" width="16" height="16" />
</text>
</element>
<element name="£4" defstate="0">
<text string="£4" state="0">
<color red="1.0" green="1.0" blue="1.0" />
<bounds x="0" y="0" width="16" height="16" />
</text>
</element>
<element name="£5" defstate="0">
<text string="£5" state="0">
<color red="1.0" green="1.0" blue="1.0" />
<bounds x="0" y="0" width="16" height="16" />
</text>
</element>
<element name="£6" defstate="0">
<text string="£6" state="0">
<color red="1.0" green="1.0" blue="1.0" />
<bounds x="0" y="0" width="16" height="16" />
</text>
</element>
<element name="£10" defstate="0">
<text string="£10" state="0">
<color red="1.0" green="1.0" blue="1.0" />
<bounds x="0" y="0" width="16" height="16" />
</text>
</element>
<element name="£20" defstate="0">
<text string="£20" state="0">
<color red="1.0" green="1.0" blue="1.0" />
<bounds x="0" y="0" width="16" height="16" />
</text>
</element>
<element name="TRAIL1" defstate="0">
<rect state ="0">
<bounds x="0" y="0" width="252" height="16" />
<color red="0.2" green="0.2" blue="0.2" />
</rect>
<rect state ="1">
<bounds x="0" y="0" width="252" height="16" />
<color red="1.0" green="1.0" blue="1.0" />
</rect>
</element>
<element name="TRAIL2" defstate="0">
<rect state ="0">
<bounds x="0" y="0" width="80" height="16" />
<color red="0.0" green="0.2" blue="0.0" />
</rect>
<rect state ="1">
<bounds x="0" y="0" width="80" height="16" />
<color red="0.0" green="1.0" blue="0.3" />
</rect>
</element>
<element name="TRAIL3" defstate="0">
<rect state ="0">
<bounds x="0" y="0" width="80" height="16" />
<color red="0.2" green="0.2" blue="0.0" />
</rect>
<rect state ="1">
<bounds x="0" y="0" width="80" height="16" />
<color red="1.0" green="1.0" blue="0.0" />
</rect>
</element>
<element name="TRAIL4" defstate="0">
<rect state ="0">
<bounds x="0" y="0" width="80" height="16" />
<color red="0.2" green="0.0" blue="0.0" />
</rect>
<rect state ="1">
<bounds x="0" y="0" width="80" height="16" />
<color red="1.0" green="0.0" blue="0.0" />
</rect>
</element>
<element name="RED" defstate="0">
<rect state ="0">
<bounds x="0" y="0" width="20" height="10" />
<color red="0.5" green="0.0" blue="0.0" />
</rect>
<rect state ="1">
<bounds x="0" y="0" width="20" height="10" />
<color red="1.0" green="0.0" blue="0.0" />
</rect>
</element>
<element name="YELLOW" defstate="0">
<rect state ="0">
<bounds x="0" y="0" width="20" height="10" />
<color red="0.5" green="0.5" blue="0.0" />
</rect>
<rect state ="1">
<bounds x="0" y="0" width="20" height="10" />
<color red="1.0" green="1.0" blue="0.0" />
</rect>
</element>
<element name="GREEN" defstate="0">
<rect state ="0">
<bounds x="0" y="0" width="20" height="10" />
<color red="0.0" green="0.5" blue="0.0" />
</rect>
<rect state ="1">
<bounds x="0" y="0" width="20" height="10" />
<color red="0.0" green="1.0" blue="0.0" />
</rect>
</element>
<element name="PASS" defstate="0">
<rect state ="0">
<bounds x="0" y="0" width="20" height="10" />
<color red="0.0" green="0.0" blue="0.2" />
</rect>
<text string="PASS">
<color red="0.0" green="0.0" blue="0.0" />
<bounds x="2" y="2" width="16" height="8" />
</text>
<rect state ="1">
<bounds x="0" y="0" width="20" height="10" />
<color red="0.0" green="0.3" blue="1.0" />
</rect>
</element>
<element name="GET" defstate="0">
<text string="COLLECT" state="0">
<color red="0.1" green="0.1" blue="0.1" />
<bounds x="0" y="0" width="16" height="8" />
</text>
<text string="COLLECT" state="1">
<color red="1" green="0.1" blue="0.1" />
<bounds x="0" y="0" width="16" height="8" />
</text>
</element>
<element name="COLLECT" defstate="0">
<rect state ="0">
<bounds x="0" y="0" width="16" height="10" />
<color red="0.5" green="0.2" blue="0.0" />
</rect>
<text string="COLLECT" state="0">
<color red="0.1" green="0.1" blue="0.1" />
<bounds x="0" y="0" width="16" height="8" />
</text>
<rect state ="1">
<bounds x="0" y="0" width="16" height="10" />
<color red="1.0" green="0.4" blue="0.0" />
</rect>
<text string="COLLECT" state="1">
<color red="0.1" green="0.1" blue="0.1" />
<bounds x="0" y="0" width="16" height="8" />
</text>
</element>
<element name="START" defstate="0">
<rect state ="0">
<bounds x="0" y="0" width="16" height="10" />
<color red="0.0" green="0.3" blue="0.1" />
</rect>
<text string="START" state="0">
<color red="0.0" green="0.0" blue="0.0" />
<bounds x="0" y="0" width="16" height="8" />
</text>
<rect state ="1">
<bounds x="0" y="0" width="16" height="10" />
<color red="0.0" green="1.0" blue="0.3" />
</rect>
<text string="START" state="1">
<color red="0.0" green="0.0" blue="0.0" />
<bounds x="0" y="0" width="16" height="8" />
</text>
</element>
<element name="HELP" defstate="0">
<rect state ="0">
<bounds x="0" y="0" width="20" height="10" />
<color red="0.0" green="0.0" blue="0.0" />
</rect>
<text string="HELP" state="0">
<color red="0.2" green="0.2" blue="0.2" />
<bounds x="2" y="2" width="16" height="8" />
</text>
<rect state ="1">
<bounds x="0" y="0" width="20" height="10" />
<color red="0.0" green="0.0" blue="0.0" />
</rect>
<text string="HELP" state="1">
<color red="1.0" green="1.0" blue="1.0" />
<bounds x="2" y="2" width="16" height="8" />
</text>
</element>
<element name="PLAY" defstate="0">
<rect state ="0">
<bounds x="0" y="0" width="20" height="10" />
<color red="0.0" green="0.0" blue="0.3" />
</rect>
<text string="PLAY">
<color red="0.2" green="0.2" blue="0.2" />
<bounds x="2" y="2" width="16" height="8" />
</text>
<rect state ="1">
<bounds x="0" y="0" width="20" height="10" />
<color red="0.0" green="0.0" blue="1.0" />
</rect>
</element>
<element name="digit" defstate="0">
<led7seg>
<color red="1.0" green="0.0" blue="0.0" />
</led7seg>
</element>
<view name="Monitor and Lamps">
<bezel name="lamp85" element="TRAIL1">
<bounds x="50" y="10" width="252" height="60" />
</bezel>
<bezel name="lamp85" element="TRAIL2">
<bounds x="252" y="10" width="80" height="60" />
</bezel>
<bezel name="lamp85" element="TRAIL3">
<bounds x="332" y="10" width="80" height="60" />
</bezel>
<bezel name="lamp85" element="TRAIL4">
<bounds x="412" y="10" width="80" height="60" />
</bezel>
<bezel name="digit14" element="digit">
<bounds x="100" y="10" width="40" height="60" />
</bezel>
<bezel name="digit15" element="digit">
<bounds x="140" y="10" width="40" height="60" />
</bezel>
<bezel name="lamp85" element="GET">
<bounds x="50" y="10" width="50" height="60" />
</bezel>
<bezel name="GEMS" element="GEMS">
<bounds x="180" y="10" width="72" height="60" />
</bezel>
<bezel name="£5" element="£5">
<bounds x="252" y="10" width="80" height="60" />
</bezel>
<bezel name="£10" element="£10">
<bounds x="332" y="10" width="80" height="60" />
</bezel>
<bezel name="£20" element="£20">
<bounds x="412" y="10" width="80" height="60" />
</bezel>
<bezel name="lamp93" element="TRAIL1">
<bounds x="50" y="70" width="252" height="60" />
</bezel>
<bezel name="lamp93" element="TRAIL2">
<bounds x="252" y="70" width="80" height="60" />
</bezel>
<bezel name="lamp93" element="TRAIL3">
<bounds x="332" y="70" width="80" height="60" />
</bezel>
<bezel name="lamp93" element="TRAIL4">
<bounds x="412" y="70" width="80" height="60" />
</bezel>
<bezel name="digit12" element="digit">
<bounds x="100" y="70" width="40" height="60" />
</bezel>
<bezel name="digit13" element="digit">
<bounds x="140" y="70" width="40" height="60" />
</bezel>
<bezel name="lamp93" element="GET">
<bounds x="50" y="70" width="50" height="60" />
</bezel>
<bezel name="GEMS" element="GEMS">
<bounds x="180" y="70" width="72" height="60" />
</bezel>
<bezel name="£2" element="£2">
<bounds x="252" y="70" width="80" height="60" />
</bezel>
<bezel name="£4" element="£4">
<bounds x="332" y="70" width="80" height="60" />
</bezel>
<bezel name="£6" element="£6">
<bounds x="412" y="70" width="80" height="60" />
</bezel>
<bezel name="lamp101" element="TRAIL1">
<bounds x="50" y="130" width="252" height="60" />
</bezel>
<bezel name="lamp101" element="TRAIL2">
<bounds x="252" y="130" width="80" height="60" />
</bezel>
<bezel name="lamp101" element="TRAIL3">
<bounds x="332" y="130" width="80" height="60" />
</bezel>
<bezel name="lamp101" element="TRAIL4">
<bounds x="412" y="130" width="80" height="60" />
</bezel>
<bezel name="digit10" element="digit">
<bounds x="100" y="130" width="40" height="60" />
</bezel>
<bezel name="digit11" element="digit">
<bounds x="140" y="130" width="40" height="60" />
</bezel>
<bezel name="lamp101" element="GET">
<bounds x="50" y="130" width="50" height="60" />
</bezel>
<bezel name="GEMS" element="GEMS">
<bounds x="180" y="130" width="72" height="60" />
</bezel>
<bezel name="£1" element="£1">
<bounds x="252" y="130" width="80" height="60" />
</bezel>
<bezel name="£2" element="£2">
<bounds x="332" y="130" width="80" height="60" />
</bezel>
<bezel name="£3" element="£3">
<bounds x="412" y="130" width="80" height="60" />
</bezel>
<bezel name="lamp109" element="TRAIL1">
<bounds x="50" y="190" width="252" height="60" />
</bezel>
<bezel name="lamp109" element="TRAIL2">
<bounds x="252" y="190" width="80" height="60" />
</bezel>
<bezel name="lamp109" element="TRAIL3">
<bounds x="332" y="190" width="80" height="60" />
</bezel>
<bezel name="lamp109" element="TRAIL4">
<bounds x="412" y="190" width="80" height="60" />
</bezel>
<bezel name="digit8" element="digit">
<bounds x="100" y="190" width="40" height="60" />
</bezel>
<bezel name="digit9" element="digit">
<bounds x="140" y="190" width="40" height="60" />
</bezel>
<bezel name="lamp109" element="GET">
<bounds x="50" y="190" width="50" height="60" />
</bezel>
<bezel name="GEMS" element="GEMS">
<bounds x="180" y="190" width="72" height="60" />
</bezel>
<bezel name="FREEGAME" element="FREEGAME">
<bounds x="252" y="190" width="80" height="60" />
</bezel>
<bezel name="50P" element="50P">
<bounds x="332" y="190" width="80" height="60" />
</bezel>
<bezel name="£1" element="£1">
<bounds x="412" y="190" width="80" height="60" />
</bezel>
<bezel name="lamp25" element="COLLECT" inputtag="BLACK2" inputmask="0x40">
<bounds x="0" y="310" width="48" height="50" />
</bezel>
<bezel name="lamp32" element="RED" inputtag="BLACK1" inputmask="0x10">
<bounds x="0" y="360" width="48" height="50" />
</bezel>
<bezel name="lamp34" element="YELLOW" inputtag="BLACK1" inputmask="0x08">
<bounds x="0" y="410" width="48" height="50" />
</bezel>
<bezel name="lamp41" element="GREEN" inputtag="BLACK1" inputmask="0x04">
<bounds x="0" y="460" width="48" height="50" />
</bezel>
<bezel name="lamp48" element="PLAY" inputtag="BLACK1" inputmask="0x02">
<bounds x="0" y="510" width="48" height="50" />
</bezel>
<bezel name="lamp24" element="START" inputtag="BLACK2" inputmask="0x80">
<bounds x="560" y="310" width="48" height="50" />
</bezel>
<bezel name="lamp26" element="RED" inputtag="BLACK2" inputmask="0x10">
<bounds x="560" y="360" width="48" height="50" />
</bezel>
<bezel name="lamp33" element="YELLOW" inputtag="BLACK2" inputmask="0x08">
<bounds x="560" y="410" width="48" height="50" />
</bezel>
<bezel name="lamp40" element="GREEN" inputtag="BLACK2" inputmask="0x04">
<bounds x="560" y="460" width="48" height="50" />
</bezel>
<bezel name="lamp42" element="HELP" inputtag="BLACK2" inputmask="0x02">
<bounds x="564" y="510" width="48" height="50" />
</bezel>
<bezel name="lamp51" element="FREEZE" inputtag="ORANGE1" inputmask="0x10">
<bounds x="250" y="560" width="50" height="50" />
</bezel>
<bezel name="lamp35" element="GO" inputtag="ORANGE1" inputmask="0x40">
<bounds x="300" y="560" width="50" height="50" />
</bezel>
<screen index="0">
<bounds x="50" y="260" width="504" height="296" />
</screen>
</view>
</mamelayout>

View File

@ -23,6 +23,7 @@
This is the core driver, no video specific stuff should go in here.
This driver holds all the mechanical games.
Old logs shown here from pre-GIT days:
06-2011: Fixed boneheaded interface glitch that was causing samples to not be cancelled correctly.
Added the ability to read each segment of an LED display separately, this may be necessary for some
games that use them as surrogate lamp lines.
@ -251,9 +252,8 @@ To change between them, follow these instructions:
TODO: - Distinguish door switches using manual
- Complete stubs for hoppers (needs slightly better 68681 emulation, and new 'hoppers' device emulation)
- It seems that the MPU4 core program relies on some degree of persistence when switching strobes and handling
writes to the various hardware ports. This explains the occasional lamping/LED blackout and switching bugs
For now, we're ignoring any extra writes to strobes, as the alternative is to assign a timer to *everything* and
start modelling the individual hysteresis curves of filament lamps.
writes to the various hardware ports. This explains the occasional lamping/LED blackout and switching bugs.
Ideally, this needs converting to the PWM device, but that will be a complex job with this many outputs.
- Fix BwB characteriser, need to be able to calculate stabiliser bytes. Anyone fancy reading 6809 source?
- Strange bug in Andy's Great Escape - Mystery nudge sound effect is not played, mpu4 latches in silence instead (?)
@ -300,7 +300,7 @@ void mpu4_state::lamp_extend_small(int data)
if (m_lamp_strobe_ext_persistence == 0)
{
//One write to reset the drive lines, one with the data, one to clear the lines, so only the 2nd write does anything
//Once again, lamp persistences would take care of this, but we can't do that
//TODO: PWM
for (i = 0; i < 5; i++)
{
m_lamps[(8*column)+i+128] = BIT(lamp_ext_data, i);
@ -334,7 +334,7 @@ void mpu4_state::lamp_extend_large(int data,int column,int active)
if (m_lamp_strobe_ext != column)
{
for (i = 0; i < 8; i++)
{//CHECK, this includes bit 7
{//CHECK, this includes bit 7, which seems wrong
m_lamps[(8*column)+i+128+lampbase] = BIT(data, i);
}
m_lamp_strobe_ext = column;
@ -348,27 +348,25 @@ void mpu4_state::lamp_extend_large(int data,int column,int active)
}
}
void mpu4_state::led_write_latch(int latch, int data, int column)
void mpu4_state::led_write_extender(int latch, int data, int starting_column)
{
int diff,i,j;
int diff,i,j, ext_strobe;
diff = (latch ^ m_last_latch) & latch;
column = 7 - column; // like main board, these are wired up in reverse
data = ~data;//inverted drive lines?
ext_strobe = (7 - starting_column) * 8;
data = ~data;//invert drive lines
for (i=0; i<5; i++)
{
// FIXME: this doesn't look like it could possibly be correct - it can produce 0..17 but with lots of aliasing
if (diff & (1<<i))
{
column += i;
for (j=0; j<8; j++)
{
m_mpu4leds[(ext_strobe + i) | j], BIT(data, j);
}
m_digits[(ext_strobe + i)] = data;
}
}
for (j=0; j<8; j++)
{
m_mpu4leds[(column << 3) | j], BIT(data, j);
}
m_digits[column << 3] = data; // FIXME should this really be so sparse?
m_last_latch = diff;
}
@ -465,12 +463,10 @@ MACHINE_RESET_MEMBER(mpu4_state,mpu4)
m_chr_value = 0;
{
if (m_numbanks)
m_bank1->set_entry(m_numbanks);
if (m_numbanks)
m_bank1->set_entry(m_numbanks);
m_maincpu->reset();
}
m_maincpu->reset();
}
@ -512,7 +508,6 @@ void mpu4_state::bankswitch_w(uint8_t data)
{
// printf("bankswitch_w %02x\n", data);
// m_pageset is never even set??
m_pageval = (data & 0x03);
m_bank1->set_entry((m_pageval + (m_pageset ? 4 : 0)) & m_numbanks);
}
@ -528,8 +523,6 @@ void mpu4_state::bankset_w(uint8_t data)
{
// printf("bankset_w %02x\n", data);
// m_pageset is never even set??
m_pageval = (data - 2);//writes 2 and 3, to represent 0 and 1 - a hangover from the half page design?
m_bank1->set_entry((m_pageval + (m_pageset ? 4 : 0)) & m_numbanks);
}
@ -605,7 +598,6 @@ void mpu4_state::pia_ic3_portb_w(uint8_t data)
{
/* Some games (like Connect 4) use 'programmable' LED displays, built from light display lines in section 2. */
/* These are mostly low-tech machines, where such wiring proved cheaper than an extender card */
/* TODO: replace this with 'segment' lamp masks, to make it more generic */
uint8_t pled_segs[2] = {0,0};
static const int lamps1[8] = { 106, 107, 108, 109, 104, 105, 110, 111 };
@ -874,7 +866,7 @@ void mpu4_state::pia_ic5_porta_w(uint8_t data)
case NO_EXTENDER:
if (m_led_extender == CARD_B)
{
led_write_latch(data & 0x1f, m_pia4->a_output(),m_input_strobe);
led_write_extender(data & 0x1f, m_pia4->a_output(),m_input_strobe);
}
else if ((m_led_extender != CARD_A) && (m_led_extender != NO_EXTENDER))
{
@ -1029,10 +1021,22 @@ void mpu4_state::pia_ic5_portb_w(uint8_t data)
}
if (m_led_extender == CARD_A)
{
led_write_latch(data & 0x07, m_pia4->a_output(),m_input_strobe);
led_write_extender(data & 0x07, m_pia4->a_output(),m_input_strobe);
}
else if (m_led_extender == SIMPLE_CARD)
{
if(m_led_strobe != m_input_strobe)
{
for(int i=0; i<8; i++)
{
m_mpu4leds[( ( (7 - m_input_strobe) + 8) << 3) | i] = BIT(m_pia4->a_output(), i);
}
m_digits[(7 - m_input_strobe) + 8] = m_pia4->a_output();
}
m_led_strobe = m_input_strobe;
}
}
uint8_t mpu4_state::pia_ic5_portb_r()
{
if (m_hopper == HOPPER_NONDUART_B)
@ -1398,6 +1402,7 @@ WRITE_LINE_MEMBER(mpu4_state::pia_gb_cb2_w)
if (m_bwb_bank)
{
//printf("pia_gb_cb2_w %d\n", state);
//m_pageset?
m_pageval = state;
m_bank1->set_entry((m_pageval + (m_pageset ? 4 : 0)) & m_numbanks);
}
@ -2380,6 +2385,11 @@ void mpu4_state::init_m4_led_c()
m_led_extender = CARD_C;
}
void mpu4_state::init_m4_led_simple()
{
m_led_extender = SIMPLE_CARD;
}
//TODO: Replace with standard six reels once sets are sorted out - is really six_reel_std
void mpu4_state::init_m4altreels()
{
@ -3130,7 +3140,7 @@ void mpu4_state::mod4oki(machine_config &config)
mpu4_common2(config);
mpu4_std_6reel(config);
OKIM6376(config, m_msm6376, 128000); //16KHz sample Can also be 85430 at 10.5KHz and 64000 at 8KHz
OKIM6376(config, m_msm6376, 128000); //Adjusted by IC3, default to 16KHz sample. Can also be 85430 at 10.5KHz and 64000 at 8KHz
m_msm6376->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
m_msm6376->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
}