mirror of
https://github.com/holub/mame
synced 2025-05-09 07:41:50 +03:00
Technical changes to reel games. [James Wallace]
- Fixed lamp timing in MPU4 and laid groundwork for MPU3 support in the steppers (I've also cleared up the reel code in drivers). - Removed some unneeded timing code. - BwB support is here, but preliminary, it's mainly to show people how the CHR chip might work in those games.
This commit is contained in:
parent
8acf0fa5d3
commit
d34e8fa8f5
@ -220,8 +220,8 @@ static WRITE8_HANDLER( reel12_w )
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( stepper_update(0, data>>4) ) state->reel_changed |= 0x01;
|
||||
if ( stepper_update(1, data ) ) state->reel_changed |= 0x02;
|
||||
if ( stepper_update(0, (data>>4)&0x0f) ) state->reel_changed |= 0x01;
|
||||
if ( stepper_update(1, data&0x0f ) ) state->reel_changed |= 0x02;
|
||||
|
||||
if ( stepper_optic_state(0) ) state->optic_pattern |= 0x01;
|
||||
else state->optic_pattern &= ~0x01;
|
||||
@ -243,8 +243,8 @@ static WRITE8_HANDLER( reel34_w )
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( stepper_update(2, data>>4) ) state->reel_changed |= 0x04;
|
||||
if ( stepper_update(3, data ) ) state->reel_changed |= 0x08;
|
||||
if ( stepper_update(2, (data>>4)&0x0f) ) state->reel_changed |= 0x04;
|
||||
if ( stepper_update(3, data&0x0f ) ) state->reel_changed |= 0x08;
|
||||
|
||||
if ( stepper_optic_state(2) ) state->optic_pattern |= 0x04;
|
||||
else state->optic_pattern &= ~0x04;
|
||||
@ -260,8 +260,8 @@ static WRITE8_HANDLER( reel34_w )
|
||||
static WRITE8_HANDLER( reel56_w )
|
||||
{
|
||||
bfm_sc1_state *state = space->machine->driver_data<bfm_sc1_state>();
|
||||
if ( stepper_update(4, data>>4) ) state->reel_changed |= 0x10;
|
||||
if ( stepper_update(5, data ) ) state->reel_changed |= 0x20;
|
||||
if ( stepper_update(4, (data>>4)&0x0f) ) state->reel_changed |= 0x10;
|
||||
if ( stepper_update(5, data&0x0f ) ) state->reel_changed |= 0x20;
|
||||
|
||||
if ( stepper_optic_state(4) ) state->optic_pattern |= 0x10;
|
||||
else state->optic_pattern &= ~0x10;
|
||||
|
@ -570,8 +570,8 @@ static WRITE8_HANDLER( reel34_w )
|
||||
bfm_sc2_state *state = space->machine->driver_data<bfm_sc2_state>();
|
||||
state->reel34_latch = data;
|
||||
|
||||
if ( stepper_update(2, data ) ) state->reel_changed |= 0x04;
|
||||
if ( stepper_update(3, data>>4) ) state->reel_changed |= 0x08;
|
||||
if ( stepper_update(2, data&0x0f ) ) state->reel_changed |= 0x04;
|
||||
if ( stepper_update(3, (data>>4)&0x0f) ) state->reel_changed |= 0x08;
|
||||
|
||||
if ( stepper_optic_state(2) ) state->optic_pattern |= 0x04;
|
||||
else state->optic_pattern &= ~0x04;
|
||||
@ -589,8 +589,8 @@ static WRITE8_HANDLER( reel56_w )
|
||||
bfm_sc2_state *state = space->machine->driver_data<bfm_sc2_state>();
|
||||
state->reel56_latch = data;
|
||||
|
||||
if ( stepper_update(4, data ) ) state->reel_changed |= 0x10;
|
||||
if ( stepper_update(5, data>>4) ) state->reel_changed |= 0x20;
|
||||
if ( stepper_update(4, data&0x0f ) ) state->reel_changed |= 0x10;
|
||||
if ( stepper_update(5, (data>>4)&0x0f) ) state->reel_changed |= 0x20;
|
||||
|
||||
if ( stepper_optic_state(4) ) state->optic_pattern |= 0x10;
|
||||
else state->optic_pattern &= ~0x10;
|
||||
@ -2660,8 +2660,8 @@ static WRITE8_HANDLER( reel12_w )
|
||||
bfm_sc2_state *state = space->machine->driver_data<bfm_sc2_state>();
|
||||
state->reel12_latch = data;
|
||||
|
||||
if ( stepper_update(0, data ) ) state->reel_changed |= 0x01;
|
||||
if ( stepper_update(1, data>>4) ) state->reel_changed |= 0x02;
|
||||
if ( stepper_update(0, data&0x0f ) ) state->reel_changed |= 0x01;
|
||||
if ( stepper_update(1, (data>>4))&0x0f ) state->reel_changed |= 0x02;
|
||||
|
||||
if ( stepper_optic_state(0) ) state->optic_pattern |= 0x01;
|
||||
else state->optic_pattern &= ~0x01;
|
||||
|
@ -202,8 +202,8 @@ static READ8_HANDLER( irqlatch_r )
|
||||
static WRITE8_HANDLER( reel12_w )
|
||||
{
|
||||
bfmsys85_state *state = space->machine->driver_data<bfmsys85_state>();
|
||||
if ( stepper_update(0, data>>4) ) state->reel_changed |= 0x01;
|
||||
if ( stepper_update(1, data ) ) state->reel_changed |= 0x02;
|
||||
if ( stepper_update(0, (data>>4)&0x0f) ) state->reel_changed |= 0x01;
|
||||
if ( stepper_update(1, data&0x0f ) ) state->reel_changed |= 0x02;
|
||||
|
||||
if ( stepper_optic_state(0) ) state->optic_pattern |= 0x01;
|
||||
else state->optic_pattern &= ~0x01;
|
||||
@ -218,8 +218,8 @@ static WRITE8_HANDLER( reel12_w )
|
||||
static WRITE8_HANDLER( reel34_w )
|
||||
{
|
||||
bfmsys85_state *state = space->machine->driver_data<bfmsys85_state>();
|
||||
if ( stepper_update(2, data>>4) ) state->reel_changed |= 0x04;
|
||||
if ( stepper_update(3, data ) ) state->reel_changed |= 0x08;
|
||||
if ( stepper_update(2, (data>>4)&0x0f) ) state->reel_changed |= 0x04;
|
||||
if ( stepper_update(3, data&0x0f ) ) state->reel_changed |= 0x08;
|
||||
|
||||
if ( stepper_optic_state(2) ) state->optic_pattern |= 0x04;
|
||||
else state->optic_pattern &= ~0x04;
|
||||
|
@ -1183,7 +1183,7 @@ static WRITE16_HANDLER( jpmioawp_w )
|
||||
{
|
||||
for (i=0; i<2; i++)
|
||||
{
|
||||
stepper_update(i, (data >> (i + 4)& 0x0F ));
|
||||
stepper_update(i+4, (data >> (i + 4)& 0x0F ));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -27,19 +27,32 @@ See http://agemame.mameworld.info/techinfo/mpu4.php for Information.
|
||||
The MPU4 BOARD is the driver board, originally designed to run Fruit Machines made by the Barcrest Group, but later
|
||||
licensed to other firms as a general purpose unit (even some old Photo-Me booths used the unit).
|
||||
|
||||
This original board uses a ~1.72 Mhz 6809B CPU, and a number of PIA6821 chips for multiplexing inputs and the like.
|
||||
This board uses a ~1.72 Mhz 6809B CPU, and a number of PIA6821 chips for multiplexing inputs and the like.
|
||||
|
||||
A 6840PTM is used for internal timing, one of it's functions is to act with an AY8913 chip as a crude analogue sound device.
|
||||
(Data is transmitted through a PIA, with a square wave from the PTM being used as the alarm sound generator)
|
||||
To some extent, the hardware feels like a revision of the MPU3 design, integrating into the base unit features that were
|
||||
previously added through expansion ports. However, there is no backwards compatibility, and the entire memory map has been
|
||||
reworked.
|
||||
|
||||
Like MPU3, a 6840PTM is used for internal timing, and other miscellaneous control functions, including as a crude analogue sound device
|
||||
(a square wave from the PTM being used as the alarm sound generator). However, the main sound functionality is provided by
|
||||
dedicated hardware (an AY8913).
|
||||
|
||||
A MPU4 GAME CARD (cartridge) plugs into the MPU4 board containing the game, and a protection PAL (the 'characteriser').
|
||||
This PAL, as well as protecting the games, also controlled some of the lamp address matrix for many games, and acted as
|
||||
an anti-tampering device which helped to prevent the hacking of certain titles in a manner which broke UK gaming laws.
|
||||
|
||||
One of the advantages of the hardware setup was that the developer could change the nature of the game card
|
||||
up to a point, adding extra lamp support, different amounts of RAM, and (in many cases) an OKI MSM6376 or Yamaha synth chip
|
||||
and related PIA and PTM for improved audio (This was eventually made the only way to generate sound in MOD4 of the hardware,
|
||||
when the AY8913 was removed from the main board)
|
||||
Like MPU3, over the years developers have added more capabilities through the spare inputs and outputs provided. These provided
|
||||
support for more reels, lamps and LEDs through daughtercards.
|
||||
Several solutions were released depending on the manufacturer of the machine, all are emulated here.
|
||||
|
||||
In later revisions of the main board (MOD4 onwards), the AY8913 was removed entirely, as two official alternatives for sound had been produced.
|
||||
In one, a YM2413 is built into the gameboard, and in the other an OKI MSM6376 is interfaced with a PIA and PTM to allow sophisticated
|
||||
sampled sound.
|
||||
|
||||
The lamping and input handling side of the machine rely entirely on a column by column 'strobe' system, with lights and LEDs selected in turn.
|
||||
In the inputs there are two orange connectors (sampled every 8ms) and two black ones (sampled every 16ms), giving 32 multiplexed inputs.
|
||||
|
||||
In addition there are two auxiliary ports taht can be accessed separately to these and are bidirectional
|
||||
|
||||
--- Preliminary MPU4 Memorymap ---
|
||||
|
||||
@ -197,12 +210,15 @@ IRQ line connected to CPU
|
||||
1000-FFFF | R | D D D D D D D D | ROM (can be bank switched by 0x850 in 8 banks of 64 k ) (NV)
|
||||
-----------+---+-----------------+--------------------------------------------------------------------------
|
||||
|
||||
TODO: - Fix lamp timing, MAME doesn't update fast enough to see everything
|
||||
- Distinguish door switches using manual
|
||||
- Complete stubs for hoppers (needs slightly better 68681 emulation, and new 'hoppers' device)
|
||||
- Any reel using the remote meter drive (CB2) slips backwards due to timing mismatches, a better method
|
||||
is needed to combine the data. This eventually leads to spin alarms i.e Flo's move in Great Escape
|
||||
- Add a BwB game with characteriser.
|
||||
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*
|
||||
- Flo's move in Great Escape gives spin alarms - need a different opto setting for reverse spin reels?
|
||||
- Fix BwB characteriser, need to be able to calculate stabiliser bytes. Anyone fancy reading 6809 source?
|
||||
- Fix MSM6376 - We're triggering 'contact MAMEDEV' since we need all features of the chip,
|
||||
including dynamic sample rate adjustment and BEEP.
|
||||
***********************************************************************************************************/
|
||||
#include "emu.h"
|
||||
#include "machine/6821pia.h"
|
||||
@ -228,7 +244,7 @@ TODO: - Fix lamp timing, MAME doesn't update fast enough to see everything
|
||||
#define LOG_CHR_FULL(x) do { if (MPU4VERBOSE) logerror x; } while (0)
|
||||
#define LOG_IC3(x) do { if (MPU4VERBOSE) logerror x; } while (0)
|
||||
#define LOG_IC8(x) do { if (MPU4VERBOSE) logerror x; } while (0)
|
||||
#define LOG_SS(x) do { if (1) logerror x; } while (0)
|
||||
#define LOG_SS(x) do { if (MPU4VERBOSE) logerror x; } while (0)
|
||||
|
||||
#include "video/awpvid.h" //Fruit Machines Only
|
||||
#include "connect4.lh"
|
||||
@ -239,10 +255,6 @@ TODO: - Fix lamp timing, MAME doesn't update fast enough to see everything
|
||||
|
||||
static TIMER_CALLBACK( ic24_timeout );
|
||||
|
||||
/* 32 multiplexed inputs - but a further 8 possible per AUX.
|
||||
Two connectors 'orange' (sampled every 8ms) and 'black' (sampled every 16ms)
|
||||
Each connector carries two banks of eight inputs and two enable signals */
|
||||
|
||||
|
||||
static const UINT8 reel_mux_table[8]= {0,4,2,6,1,5,3,7};//include 7, although I don't think it's used
|
||||
static const UINT8 reel_mux_table7[8]= {3,1,5,6,4,2,0,7};
|
||||
@ -254,6 +266,7 @@ static const UINT8 reel_mux_table7[8]= {3,1,5,6,4,2,0,7};
|
||||
#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 NO_EXTENDER 0 /* As originally designed */
|
||||
#define SMALL_CARD 1
|
||||
@ -261,7 +274,6 @@ static const UINT8 reel_mux_table7[8]= {3,1,5,6,4,2,0,7};
|
||||
#define LARGE_CARD_B 3 // 96 Lamps, 16 LEDs - as used by BwB
|
||||
#define LARGE_CARD_C 4 //Identical to B, no built in LED support
|
||||
|
||||
|
||||
#define CARD_A 1
|
||||
#define CARD_B 2
|
||||
#define CARD_C 3
|
||||
@ -272,6 +284,7 @@ static const UINT8 reel_mux_table7[8]= {3,1,5,6,4,2,0,7};
|
||||
#define HOPPER_DUART_C 3
|
||||
#define HOPPER_NONDUART_A 4
|
||||
#define HOPPER_NONDUART_B 5
|
||||
|
||||
/* Lookup table for CHR data */
|
||||
|
||||
struct mpu4_chr_table
|
||||
@ -280,6 +293,7 @@ struct mpu4_chr_table
|
||||
UINT8 response;
|
||||
};
|
||||
|
||||
/* Video stuff */
|
||||
struct ef9369_t
|
||||
{
|
||||
UINT32 addr;
|
||||
@ -320,6 +334,7 @@ public:
|
||||
int IC23GA;
|
||||
int prot_col;
|
||||
int lamp_col;
|
||||
int init_col;
|
||||
int reel_flag;
|
||||
int ic23_active;
|
||||
int led_lamp;
|
||||
@ -330,9 +345,8 @@ public:
|
||||
int input_strobe;
|
||||
UINT8 lamp_strobe;
|
||||
UINT8 lamp_strobe2;
|
||||
UINT8 lamp_data;
|
||||
UINT8 led_strobe;
|
||||
UINT8 ay_data;
|
||||
UINT8 Lamps[224];
|
||||
int optic_pattern;
|
||||
int active_reel;
|
||||
int remote_meter;
|
||||
@ -343,10 +357,11 @@ public:
|
||||
int lamp_sense;
|
||||
int card_live;
|
||||
int led_extender;
|
||||
int bwb_bank;
|
||||
int hopper;
|
||||
const mpu4_chr_table* current_chr_table;
|
||||
UINT8 led_segs[40];
|
||||
|
||||
//Video
|
||||
UINT8 m6840_irq_state;
|
||||
UINT8 m6850_irq_state;
|
||||
UINT8 scn2674_irq_state;
|
||||
@ -423,74 +438,7 @@ with settings like this in the majority of cases.
|
||||
8 display enables (pins 10 - 17)
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/* Process lamp and LED data for output system */
|
||||
static void mpu4_draw_led(UINT8 id, UINT8 value)
|
||||
{
|
||||
output_set_digit_value(id,value);
|
||||
}
|
||||
|
||||
|
||||
static void draw_lamps(mpu4_state *state)
|
||||
{
|
||||
int i,j;
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
output_set_lamp_value((8*state->input_strobe)+i, (state->Lamps[(8*state->input_strobe)+i]));
|
||||
output_set_lamp_value((8*state->input_strobe)+i+64, (state->Lamps[(8*state->input_strobe)+i+64]));
|
||||
}
|
||||
if (state->lamp_extender)
|
||||
{
|
||||
for (j = 0; j < 6; j++)
|
||||
{
|
||||
output_set_lamp_value((6*state->input_strobe)+128+j, (state->Lamps[(6*state->input_strobe)+128+j]));
|
||||
output_set_lamp_value((6*state->input_strobe)+176+j, (state->Lamps[(6*state->input_strobe)+176+j]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void update_lamps(mpu4_state *state)
|
||||
{
|
||||
int i,j;
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
state->Lamps[(8*state->input_strobe)+i] = (state->lamp_strobe & (1 << i)) != 0;
|
||||
state->Lamps[(8*state->input_strobe)+i+64] = (state->lamp_strobe2 & (1 << i)) != 0;
|
||||
}
|
||||
|
||||
if (state->led_lamp)
|
||||
{
|
||||
/* Some games (like Connect 4) use 'programmable' LED displays, built from light display lines. */
|
||||
UINT8 pled_segs[2] = {0,0};
|
||||
|
||||
static const int lamps1[8] = { 106, 107, 108, 109, 104, 105, 110, 133 };
|
||||
static const int lamps2[8] = { 114, 115, 116, 117, 112, 113, 118, 119 };
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
if (output_get_lamp_value(lamps1[i])) pled_segs[0] |= (1 << i);
|
||||
if (output_get_lamp_value(lamps2[i])) pled_segs[1] |= (1 << i);
|
||||
}
|
||||
|
||||
mpu4_draw_led(8, pled_segs[0]);
|
||||
mpu4_draw_led(9, pled_segs[1]);
|
||||
}
|
||||
|
||||
draw_lamps(state);
|
||||
mpu4_draw_led(state->input_strobe, state->led_segs[state->input_strobe]);
|
||||
if (state->led_extender)
|
||||
{
|
||||
for (j = 0; j < 5; j++)
|
||||
{
|
||||
mpu4_draw_led(((8*state->input_strobe)+8+j), state->led_segs[((8*state->input_strobe)+8+j)]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void lamp_extend_small(mpu4_state *state, int data)
|
||||
static void lamp_extend_small(int data)
|
||||
{
|
||||
int lamp_strobe_ext,column,i;
|
||||
column = data & 0x07;
|
||||
@ -500,7 +448,7 @@ static void lamp_extend_small(mpu4_state *state, int data)
|
||||
{
|
||||
for (i = 0; i < 5; i++)
|
||||
{
|
||||
state->Lamps[(5*column)+i+128] = (lamp_strobe_ext & (1 << i)) != 0;
|
||||
output_set_lamp_value((5*column)+i+128,((lamp_strobe_ext & (1 << i)) != 0));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -529,7 +477,7 @@ static void lamp_extend_largea(mpu4_state *state, int data,int column,int active
|
||||
{
|
||||
for (i = 0; i < 6; i++)
|
||||
{
|
||||
state->Lamps[(lampbase)+i] = (data & (1 << i)) != 0;
|
||||
output_set_lamp_value(lampbase+i,(data & (1 << i)) != 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -561,10 +509,10 @@ static void lamp_extend_largebc(mpu4_state *state, int data,int column,int activ
|
||||
{
|
||||
for (i = 0; i < 6; i++)
|
||||
{
|
||||
state->Lamps[(lampbase)+i] = (data & (1 << i)) != 0;
|
||||
output_set_lamp_value(lampbase+i,(data & (1 << i)) != 0);
|
||||
}
|
||||
}
|
||||
state->last_b7 = byte7;
|
||||
state->last_b7 = byte7;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -574,32 +522,21 @@ static void lamp_extend_largebc(mpu4_state *state, int data,int column,int activ
|
||||
|
||||
static void led_write_latch(mpu4_state *state, int latch, int data, int column)
|
||||
{
|
||||
int diff;
|
||||
int diff,i;
|
||||
|
||||
diff = (latch ^ state->last_latch) & latch;
|
||||
column = 7 - column;
|
||||
column = 7 - column; // like main board, these are wired up in reverse
|
||||
data = ~data;//inverted?
|
||||
|
||||
if ( diff & 1 )
|
||||
for(i=0; i<5; i++)
|
||||
{
|
||||
state->led_segs[column] = data;
|
||||
}
|
||||
if ( diff & 2 )
|
||||
{
|
||||
state->led_segs[8+column] = data;
|
||||
}
|
||||
if ( diff & 4 )
|
||||
{
|
||||
state->led_segs[16+column] = data;
|
||||
}
|
||||
if ( diff & 8 )
|
||||
{
|
||||
state->led_segs[24+column] = data;
|
||||
}
|
||||
if ( diff & 16 )
|
||||
{
|
||||
state->led_segs[32+column] = data;
|
||||
if (diff & (1<<i))
|
||||
{
|
||||
column += (i*8);
|
||||
}
|
||||
}
|
||||
output_set_digit_value(column, data);
|
||||
|
||||
state->last_latch = diff;
|
||||
}
|
||||
|
||||
@ -614,7 +551,7 @@ static void update_meters(mpu4_state *state)
|
||||
// Change nothing
|
||||
break;
|
||||
case FIVE_REEL_5TO8:
|
||||
stepper_update(4, (data >> 4));
|
||||
stepper_update(4, ((data >> 4) & 0x0f));
|
||||
data = (data & 0x0F); //Strip reel data from meter drives, leaving active elements
|
||||
awp_draw_reel(4);
|
||||
break;
|
||||
@ -645,6 +582,9 @@ static void update_meters(mpu4_state *state)
|
||||
data = 0x00; //Strip all reel data from meter drives
|
||||
awp_draw_reel(0);
|
||||
break;
|
||||
case FLUTTERBOX: //The backbox fan assembly fits in a reel unit sized box, wired to the remote meter pin, so we can handle it here
|
||||
output_set_value("flutterbox", data & 0x80);
|
||||
data &= ~0x80; //Strip flutterbox data from meter drives
|
||||
}
|
||||
|
||||
MechMtr_update(7, (data & 0x80));
|
||||
@ -683,7 +623,7 @@ static MACHINE_RESET( mpu4 )
|
||||
|
||||
state->lamp_strobe = 0;
|
||||
state->lamp_strobe2 = 0;
|
||||
state->lamp_data = 0;
|
||||
state->led_strobe = 0;
|
||||
|
||||
state->IC23GC = 0;
|
||||
state->IC23GB = 0;
|
||||
@ -799,27 +739,64 @@ static const ptm6840_interface ptm_ic2_intf =
|
||||
static WRITE8_DEVICE_HANDLER( pia_ic3_porta_w )
|
||||
{
|
||||
mpu4_state *state = device->machine->driver_data<mpu4_state>();
|
||||
int i;
|
||||
LOG_IC3(("%s: IC3 PIA Port A Set to %2x (lamp strobes 1 - 9)\n", device->machine->describe_context(),data));
|
||||
|
||||
if(state->ic23_active)
|
||||
{
|
||||
state->lamp_strobe = data;
|
||||
{
|
||||
if (state->lamp_strobe != state->input_strobe)
|
||||
{
|
||||
// Because of the nature of the lamping circuit, there is an element of persistance
|
||||
// As a consequence, the lamp column data can change before the input strobe without
|
||||
// causing the relevant lamps to black out.
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
output_set_lamp_value((8*state->input_strobe)+i, ((data & (1 << i)) !=0));
|
||||
}
|
||||
state->lamp_strobe = state->input_strobe;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static WRITE8_DEVICE_HANDLER( pia_ic3_portb_w )
|
||||
{
|
||||
mpu4_state *state = device->machine->driver_data<mpu4_state>();
|
||||
int i;
|
||||
LOG_IC3(("%s: IC3 PIA Port B Set to %2x (lamp strobes 10 - 17)\n", device->machine->describe_context(),data));
|
||||
|
||||
if(state->ic23_active)
|
||||
{
|
||||
state->lamp_strobe2 = data;
|
||||
if (state->lamp_strobe2 != state->input_strobe)
|
||||
{
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
output_set_lamp_value((8*state->input_strobe)+i+64, ((data & (1 << i)) !=0));
|
||||
}
|
||||
state->lamp_strobe2 = state->input_strobe;
|
||||
}
|
||||
|
||||
if (state->led_lamp)
|
||||
{
|
||||
/* 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 */
|
||||
UINT8 pled_segs[2] = {0,0};
|
||||
|
||||
static const int lamps1[8] = { 106, 107, 108, 109, 104, 105, 110, 133 };
|
||||
static const int lamps2[8] = { 114, 115, 116, 117, 112, 113, 118, 119 };
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
if (output_get_lamp_value(lamps1[i])) pled_segs[0] |= (1 << i);
|
||||
if (output_get_lamp_value(lamps2[i])) pled_segs[1] |= (1 << i);
|
||||
}
|
||||
|
||||
output_set_digit_value(8,pled_segs[0]);
|
||||
output_set_digit_value(9,pled_segs[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static WRITE_LINE_DEVICE_HANDLER( pia_ic3_ca2_w )
|
||||
{
|
||||
mpu4_state *drvstate = device->machine->driver_data<mpu4_state>();
|
||||
@ -872,13 +849,13 @@ static void ic23_update(mpu4_state *state)
|
||||
if (state->IC23G1)
|
||||
{
|
||||
if ( state->IC23GA ) state->input_strobe |= 0x01;
|
||||
else state->input_strobe &= ~0x01;
|
||||
else state->input_strobe &= ~0x01;
|
||||
|
||||
if ( state->IC23GB ) state->input_strobe |= 0x02;
|
||||
else state->input_strobe &= ~0x02;
|
||||
else state->input_strobe &= ~0x02;
|
||||
|
||||
if ( state->IC23GC ) state->input_strobe |= 0x04;
|
||||
else state->input_strobe &= ~0x04;
|
||||
else state->input_strobe &= ~0x04;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -934,7 +911,13 @@ static WRITE8_DEVICE_HANDLER( pia_ic4_porta_w )
|
||||
if(state->ic23_active)
|
||||
{
|
||||
if (((state->lamp_extender == NO_EXTENDER)||(state->lamp_extender == SMALL_CARD)||(state->lamp_extender == LARGE_CARD_C))&& (state->led_extender == NO_EXTENDER))
|
||||
state->led_segs[state->input_strobe] = data;
|
||||
{
|
||||
if(state->led_strobe != state->input_strobe)
|
||||
{
|
||||
output_set_digit_value(7 - state->input_strobe,data);
|
||||
}
|
||||
state->led_strobe = state->input_strobe;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -955,7 +938,6 @@ static WRITE8_DEVICE_HANDLER( pia_ic4_portb_w )
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static READ8_DEVICE_HANDLER( pia_ic4_portb_r )
|
||||
{
|
||||
mpu4_state *state = device->machine->driver_data<mpu4_state>();
|
||||
@ -973,16 +955,16 @@ static READ8_DEVICE_HANDLER( pia_ic4_portb_r )
|
||||
if (!state->reel_mux)
|
||||
{
|
||||
if ( state->optic_pattern & 0x01 ) state->ic4_input_b |= 0x40; /* reel A tab */
|
||||
else state->ic4_input_b &= ~0x40;
|
||||
else state->ic4_input_b &= ~0x40;
|
||||
|
||||
if ( state->optic_pattern & 0x02 ) state->ic4_input_b |= 0x20; /* reel B tab */
|
||||
else state->ic4_input_b &= ~0x20;
|
||||
else state->ic4_input_b &= ~0x20;
|
||||
|
||||
if ( state->optic_pattern & 0x04 ) state->ic4_input_b |= 0x10; /* reel C tab */
|
||||
else state->ic4_input_b &= ~0x10;
|
||||
else state->ic4_input_b &= ~0x10;
|
||||
|
||||
if ( state->optic_pattern & 0x08 ) state->ic4_input_b |= 0x08; /* reel D tab */
|
||||
else state->ic4_input_b &= ~0x08;
|
||||
else state->ic4_input_b &= ~0x08;
|
||||
|
||||
}
|
||||
else
|
||||
@ -997,7 +979,7 @@ static READ8_DEVICE_HANDLER( pia_ic4_portb_r )
|
||||
}
|
||||
}
|
||||
if ( state->signal_50hz ) state->ic4_input_b |= 0x04; /* 50 Hz */
|
||||
else state->ic4_input_b &= ~0x04;
|
||||
else state->ic4_input_b &= ~0x04;
|
||||
|
||||
if (state->ic4_input_b & 0x02)
|
||||
{
|
||||
@ -1081,40 +1063,40 @@ static READ8_DEVICE_HANDLER( pia_ic5_porta_r )
|
||||
static WRITE8_DEVICE_HANDLER( pia_ic5_porta_w )
|
||||
{
|
||||
mpu4_state *state = device->machine->driver_data<mpu4_state>();
|
||||
device_t *pia_ic4 = device->machine->device("pia_ic5");
|
||||
device_t *pia_ic4 = device->machine->device("pia_ic4");
|
||||
if (state->hopper == HOPPER_NONDUART_A)
|
||||
{
|
||||
//hopper1_drive_sensor(data&0x10);
|
||||
}
|
||||
switch (state->lamp_extender)
|
||||
{
|
||||
case NO_EXTENDER:
|
||||
case NO_EXTENDER:
|
||||
if (state->led_extender == CARD_B)
|
||||
{
|
||||
led_write_latch(state, data & 0x1f, pia6821_get_output_a(pia_ic4),state->input_strobe);
|
||||
}
|
||||
else if ((state->led_extender != CARD_A)||(state->led_extender != NO_EXTENDER))
|
||||
{
|
||||
state->led_segs[(state->input_strobe+8)] = data;
|
||||
output_set_digit_value((state->input_strobe+8),data);
|
||||
}
|
||||
break;
|
||||
case SMALL_CARD:
|
||||
case SMALL_CARD:
|
||||
if(state->ic23_active)
|
||||
{
|
||||
lamp_extend_small(state, data);
|
||||
lamp_extend_small(data);
|
||||
}
|
||||
break;
|
||||
case LARGE_CARD_A:
|
||||
case LARGE_CARD_A:
|
||||
lamp_extend_largea(state,data,state->input_strobe,state->ic23_active);
|
||||
break;
|
||||
case LARGE_CARD_B:
|
||||
case LARGE_CARD_B:
|
||||
lamp_extend_largebc(state,data,state->input_strobe,state->ic23_active);
|
||||
if ((state->ic23_active) && state->card_live)
|
||||
{
|
||||
state->led_segs[(8*(state->last_b7 >>7))+state->input_strobe] = (~data);
|
||||
output_set_digit_value(((8*(state->last_b7 >>7))+state->input_strobe),~data);
|
||||
}
|
||||
break;
|
||||
case LARGE_CARD_C:
|
||||
case LARGE_CARD_C:
|
||||
lamp_extend_largebc(state,data,state->input_strobe,state->ic23_active);
|
||||
break;
|
||||
}
|
||||
@ -1134,6 +1116,76 @@ static WRITE8_DEVICE_HANDLER( pia_ic5_porta_w )
|
||||
awp_draw_reel(2);
|
||||
}
|
||||
|
||||
if (mame_stricmp(device->machine->gamedrv->name, "m_gmball") == 0)
|
||||
{
|
||||
/* The 'Gamball' device is a unique piece of mechanical equipment, designed to
|
||||
provide a truly fair hi-lo gamble for an AWP machine. Functionally, it consists of
|
||||
a ping-pong ball or similar enclosed in the machine's backbox, on a platform with 12
|
||||
holes. When the low 4 bytes of AUX1 are triggered, this fires the ball out from the
|
||||
hole it's currently in, to land in another. Landing in the same hole cause the machine to
|
||||
refire the ball. The ball detection is done by the high 4 bytes of AUX1.
|
||||
Here we call the MAME RNG, clamping it to 16 values, with the unused
|
||||
values effectively asking the machine to 'roll again'. We then trigger the switches corresponding to
|
||||
the correct number. This appears to be the best way of making the game fair, short of simulating
|
||||
the physics of a bouncing ball ;)*/
|
||||
if (data & 0x0f)
|
||||
{
|
||||
switch (device->machine->rand() & 0xf)
|
||||
{
|
||||
case 0x00:
|
||||
default:
|
||||
break;// stay where we are if we roll a zero, or roll more than 12
|
||||
case 0x01:
|
||||
state->aux1_input = (state->aux1_input & 0x0f);
|
||||
state->aux1_input|= 0x50;
|
||||
break;
|
||||
case 0x02:
|
||||
state->aux1_input = (state->aux1_input & 0x0f);
|
||||
state->aux1_input|= 0x90;
|
||||
break;
|
||||
case 0x03:
|
||||
state->aux1_input = (state->aux1_input & 0x0f);
|
||||
state->aux1_input|= 0x20;
|
||||
break;
|
||||
case 0x04:
|
||||
state->aux1_input = (state->aux1_input & 0x0f);
|
||||
state->aux1_input|= 0xb0;
|
||||
break;
|
||||
case 0x05:
|
||||
state->aux1_input = (state->aux1_input & 0x0f);
|
||||
state->aux1_input|= 0x00;
|
||||
break;
|
||||
case 0x06:
|
||||
state->aux1_input = (state->aux1_input & 0x0f);
|
||||
state->aux1_input|= 0x30;
|
||||
break;
|
||||
case 0x07:
|
||||
state->aux1_input = (state->aux1_input & 0x0f);
|
||||
state->aux1_input|= 0xa0;
|
||||
break;
|
||||
case 0x08:
|
||||
state->aux1_input = (state->aux1_input & 0x0f);
|
||||
state->aux1_input|= 0xd0;
|
||||
break;
|
||||
case 0x09:
|
||||
state->aux1_input = (state->aux1_input & 0x0f);
|
||||
state->aux1_input|= 0xd0;
|
||||
break;
|
||||
case 0x0a:
|
||||
state->aux1_input = (state->aux1_input & 0x0f);
|
||||
state->aux1_input|= 0x10;
|
||||
break;
|
||||
case 0xb:
|
||||
state->aux1_input = (state->aux1_input & 0x0f);
|
||||
state->aux1_input|= 0x80;
|
||||
break;
|
||||
case 0xc:
|
||||
state->aux1_input = (state->aux1_input & 0x0f);
|
||||
state->aux1_input|= 0x40;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static WRITE8_DEVICE_HANDLER( pia_ic5_portb_w )
|
||||
@ -1148,6 +1200,7 @@ static WRITE8_DEVICE_HANDLER( pia_ic5_portb_w )
|
||||
{
|
||||
// led_write_latch(state, data & 0x07, pia_get_output_a(pia_ic4),state->input_strobe)
|
||||
}
|
||||
|
||||
}
|
||||
static READ8_DEVICE_HANDLER( pia_ic5_portb_r )
|
||||
{
|
||||
@ -1546,7 +1599,7 @@ static const pia6821_interface pia_ic8_intf =
|
||||
DEVCB_LINE(cpu0_irq) /* IRQB */
|
||||
};
|
||||
|
||||
|
||||
// universal sampled sound program card PCB 683077
|
||||
// Sampled sound card, using a PIA and PTM for timing and data handling
|
||||
static WRITE8_DEVICE_HANDLER( pia_gb_porta_w )
|
||||
{
|
||||
@ -1604,6 +1657,16 @@ static WRITE_LINE_DEVICE_HANDLER( pia_gb_ca2_w )
|
||||
// reset line
|
||||
}
|
||||
|
||||
static WRITE_LINE_DEVICE_HANDLER( pia_gb_cb2_w )
|
||||
{
|
||||
mpu4_state *mstate = device->machine->driver_data<mpu4_state>();
|
||||
//Some BWB games use this to drive the bankswitching
|
||||
if (mstate->bwb_bank)
|
||||
{
|
||||
memory_set_bank(device->machine, "bank1",state);
|
||||
}
|
||||
}
|
||||
|
||||
static const pia6821_interface pia_ic4ss_intf =
|
||||
{
|
||||
DEVCB_NULL, /* port A in */
|
||||
@ -1615,7 +1678,7 @@ static const pia6821_interface pia_ic4ss_intf =
|
||||
DEVCB_HANDLER(pia_gb_porta_w), /* port A out */
|
||||
DEVCB_HANDLER(pia_gb_portb_w), /* port B out */
|
||||
DEVCB_LINE(pia_gb_ca2_w), /* line CA2 out */
|
||||
DEVCB_NULL, /* port CB2 out */
|
||||
DEVCB_LINE(pia_gb_cb2_w), /* line CB2 out */
|
||||
DEVCB_NULL, /* IRQA */
|
||||
DEVCB_NULL /* IRQB */
|
||||
};
|
||||
@ -1631,7 +1694,7 @@ freq = (1720000/((t3L+1)(t3H+1)))*[(t3H(T3L+1)+1)/(2(t1+1))]
|
||||
where [] means rounded up integer,
|
||||
t3L is the LSB of Clock 3,
|
||||
t3H is the MSB of Clock 3,
|
||||
and t1 is the figure added to clock 1.
|
||||
+and t1 is the initial value in clock 1.
|
||||
|
||||
The sample speed divisor is f/300
|
||||
*/
|
||||
@ -1989,18 +2052,7 @@ static INPUT_PORTS_START( gamball )
|
||||
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
|
||||
|
||||
PORT_START("AUX1")
|
||||
PORT_DIPNAME( 0x10, 0x00, "AUX105" )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x10, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x20, 0x00, "AUX106" )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x20, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x40, 0x00, "AUX107" )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x40, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x80, 0x00, "AUX108" )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
|
||||
PORT_BIT(0xFF, IP_ACTIVE_HIGH, IPT_SPECIAL)//Handled by Gamball unit
|
||||
|
||||
PORT_START("AUX2")
|
||||
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_SPECIAL)
|
||||
@ -2028,6 +2080,30 @@ static const stepper_interface barcrest_opto1_interface =
|
||||
0x00
|
||||
};
|
||||
|
||||
static const stepper_interface barcrest_opto2_interface =
|
||||
{
|
||||
BARCREST_48STEP_REEL,
|
||||
92,
|
||||
3,
|
||||
0x00
|
||||
};
|
||||
|
||||
static const stepper_interface barcrest_opto3_interface =
|
||||
{
|
||||
BARCREST_48STEP_REEL,
|
||||
0,
|
||||
5,
|
||||
0x00
|
||||
};
|
||||
|
||||
static const stepper_interface bwb_opto1_interface =
|
||||
{
|
||||
BARCREST_48STEP_REEL,
|
||||
96,
|
||||
3,
|
||||
0x00
|
||||
};
|
||||
|
||||
/* Common configurations */
|
||||
static void mpu4_config_common(running_machine *machine)
|
||||
{
|
||||
@ -2200,6 +2276,84 @@ static READ8_HANDLER( characteriser_r )
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
BwB Characteriser (CHR)
|
||||
|
||||
The BwB method of protection is considerably different to the Barcrest one, with any
|
||||
incorrect behaviour manifesting in ridiculously large payouts.
|
||||
|
||||
In fact, the software seems deliberately designed to mislead, but is (fortunately for
|
||||
us) prone to similar weaknesses that allow a per game solution.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
static WRITE8_HANDLER( bwb_characteriser_w )
|
||||
{
|
||||
mpu4_state *state = space->machine->driver_data<mpu4_state>();
|
||||
int x;
|
||||
int call=data;
|
||||
LOG_CHR_FULL(("%04x Characteriser write offset %02X data %02X \n", cpu_get_previouspc(space->cpu),offset,data));
|
||||
if (!state->current_chr_table)
|
||||
fatalerror("No Characteriser Table @ %04x\n", cpu_get_previouspc(space->cpu));
|
||||
|
||||
if (offset == 0)//initialisation is always at 0x800
|
||||
{
|
||||
{
|
||||
if (call == 0)
|
||||
{
|
||||
state->init_col =0;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (x = state->init_col; x < 64; x++)
|
||||
{
|
||||
if (state->current_chr_table[(x)].call == call)
|
||||
{
|
||||
state->init_col = x;
|
||||
LOG_CHR_FULL(("BwB Characteriser init column %02X\n",state->init_col));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (x = state->prot_col; x < 64;)
|
||||
{
|
||||
x++;
|
||||
if (state->current_chr_table[(x)].call == call)
|
||||
{
|
||||
state->prot_col = x;
|
||||
LOG_CHR(("BwB Characteriser init column %02X\n",state->prot_col));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static READ8_HANDLER( bwb_characteriser_r )
|
||||
{
|
||||
mpu4_state *state = space->machine->driver_data<mpu4_state>();
|
||||
if (!state->current_chr_table)
|
||||
fatalerror("No Characteriser Table @ %04x\n", cpu_get_previouspc(space->cpu));
|
||||
|
||||
LOG_CHR(("Characteriser read offset %02X \n",offset));
|
||||
|
||||
|
||||
if (offset ==0)
|
||||
{
|
||||
LOG_CHR(("Characteriser read data %02X \n",state->current_chr_table[state->init_col].response));
|
||||
return state->current_chr_table[state->init_col].response;
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_CHR(("Characteriser read BwB data %02X \n",state->current_chr_table[state->prot_col].response));
|
||||
return state->current_chr_table[state->prot_col].response;
|
||||
}
|
||||
}
|
||||
|
||||
static const mpu4_chr_table ccelbr_data[72] = {
|
||||
{0x00, 0x00},{0x1a, 0x84},{0x04, 0x8c},{0x10, 0xb8},{0x18, 0x74},{0x0f, 0x80},{0x13, 0x1c},{0x1b, 0xb4},
|
||||
{0x03, 0xd8},{0x07, 0x74},{0x17, 0x00},{0x1d, 0xd4},{0x36, 0xc8},{0x35, 0x78},{0x2b, 0xa4},{0x28, 0x4c},
|
||||
@ -2248,6 +2402,28 @@ static const mpu4_chr_table oldtmr_data[72] = {
|
||||
{0x00, 0x00},{0x01, 0x00},{0x04, 0x00},{0x09, 0x00},{0x10, 0x00},{0x19, 0x10},{0x24, 0x00},{0x31, 0x00}
|
||||
};
|
||||
|
||||
static const mpu4_chr_table blsbys_data[72] = {
|
||||
{0x00, 0x00},{0x00, 0x00},{0x00, 0x00},{0x00, 0x00},{0x00, 0x00},{0x00, 0x00},{0x2e, 0x36},{0x20, 0x42},
|
||||
{0x0f, 0x27},{0x24, 0x42},{0x3c, 0x09},{0x2c, 0x01},{0x01, 0x1d},{0x1d, 0x40},{0x40, 0xd2},{0xd2, 0x01},
|
||||
{0x01, 0xf9},{0xb1, 0x41},{0x41, 0x1c},{0x1c, 0x01},{0x01, 0xf9},{0x04, 0x54},{0x54, 0x02},{0x02, 0x00},
|
||||
{0x00, 0x00},{0x00, 0x2e},{0x2e, 0x20},{0x20, 0x0f},{0x0f, 0x24},{0x24, 0x3c},{0x3c, 0x39},{0x3c, 0xc9},
|
||||
{0xc9, 0x05},{0x05, 0x04},{0x04, 0x54},{0x54, 0x02},{0x02, 0x00},{0x00, 0x00},{0x00, 0x2e},{0x2e, 0x20},
|
||||
{0x20, 0x0f},{0x0f, 0x24},{0x24, 0x3c},{0x3c, 0x39},{0x3c, 0x36},{0x36, 0x00},{0x42, 0x04},{0x27, 0x04},
|
||||
{0x42, 0x0c},{0x09, 0x0c},{0x42, 0x1c},{0x27, 0x14},{0x42, 0x2c},{0x42, 0x5c},{0x09, 0x2c},
|
||||
//All this may be garbage - it never gets called, but is in the ROM (?)
|
||||
{0x0A, 0x00},
|
||||
{0x31, 0x20},{0x34, 0x90}, {0x1e, 0x40},{0x04, 0x90},{0x01, 0xe4},{0x0c, 0xf4},{0x18, 0x64},{0x19, 0x10},
|
||||
{0x00, 0x00},{0x01, 0x00},{0x04, 0x00},{0x09, 0x00},{0x10, 0x00},{0x19, 0x10},{0x24, 0x00},{0x31, 0x00}
|
||||
};
|
||||
|
||||
// set percentage and other options. 2e 20 0f
|
||||
// PAL Codes
|
||||
// 0 1 2 3 4 5 6 7 8
|
||||
// 42 2E 20 0F 24 3C 36 27 09
|
||||
// 6 0 7 0 8 0 7 0 0 8
|
||||
//request 36 42 27 42 09 42 27 42 42 09
|
||||
//verify 00 04 04 0C 0C 1C 14 2C 5C 2C
|
||||
|
||||
static DRIVER_INIT (m_oldtmr)
|
||||
{
|
||||
mpu4_state *state = machine->driver_data<mpu4_state>();
|
||||
@ -2294,6 +2470,20 @@ static DRIVER_INIT (m_grtecp)
|
||||
state->current_chr_table = grtecp_data;
|
||||
}
|
||||
|
||||
static DRIVER_INIT (m_blsbys)
|
||||
{
|
||||
mpu4_state *state = machine->driver_data<mpu4_state>();
|
||||
state->bwb_bank=1;
|
||||
state->reel_mux=FIVE_REEL_5TO8;
|
||||
|
||||
stepper_config(machine, 0, &bwb_opto1_interface);
|
||||
stepper_config(machine, 1, &bwb_opto1_interface);
|
||||
stepper_config(machine, 2, &bwb_opto1_interface);
|
||||
stepper_config(machine, 3, &bwb_opto1_interface);
|
||||
stepper_config(machine, 4, &bwb_opto1_interface);
|
||||
state->current_chr_table = blsbys_data;
|
||||
}
|
||||
|
||||
static DRIVER_INIT (mpu4tst2)
|
||||
{
|
||||
mpu4_state *state = machine->driver_data<mpu4_state>();
|
||||
@ -2325,14 +2515,12 @@ static TIMER_DEVICE_CALLBACK( gen_50hz )
|
||||
falling edges of the pulse are used means the timer actually gives a 100Hz
|
||||
oscillating signal.*/
|
||||
state->signal_50hz = state->signal_50hz?0:1;
|
||||
update_lamps(state);
|
||||
pia6821_ca1_w(timer.machine->device("pia_ic4"), state->signal_50hz); /* signal is connected to IC4 CA1 */
|
||||
|
||||
if (state->signal_50hz)
|
||||
{
|
||||
update_meters(state);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static ADDRESS_MAP_START( mod2_memmap, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
@ -2403,6 +2591,32 @@ static ADDRESS_MAP_START( mod4_oki_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
AM_RANGE(0x1000, 0xffff) AM_ROMBANK("bank1") // 64k paged ROM (4 pages)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
static ADDRESS_MAP_START( mpu4_bwb_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
AM_RANGE(0x0000, 0x07ff) AM_RAM AM_SHARE("nvram")
|
||||
|
||||
AM_RANGE(0x0800, 0x083F) AM_READWRITE(bwb_characteriser_r,bwb_characteriser_w)// Game selects a random value within this range
|
||||
|
||||
AM_RANGE(0x0850, 0x0850) AM_WRITE(bankswitch_w) // write bank (rom page select)
|
||||
|
||||
AM_RANGE(0x0858, 0x0858) AM_WRITE(bankswitch_w) // write bank (rom page select)
|
||||
AM_RANGE(0x0880, 0x0883) AM_DEVREADWRITE("pia_ic4ss", pia6821_r,pia6821_w) // PIA6821 on sampled sound board
|
||||
|
||||
AM_RANGE(0x08c0, 0x08c7) AM_DEVREADWRITE("ptm_ic3ss", ptm6840_read, ptm6840_write) // 6840PTM on sampled sound board
|
||||
|
||||
// AM_RANGE(0x08e0, 0x08e7) AM_READWRITE(68681_duart_r,68681_duart_w) //Runs hoppers
|
||||
|
||||
AM_RANGE(0x0900, 0x0907) AM_DEVREADWRITE("ptm_ic2", ptm6840_read, ptm6840_write)/* PTM6840 IC2 */
|
||||
|
||||
AM_RANGE(0x0a00, 0x0a03) AM_DEVREADWRITE("pia_ic3", pia6821_r, pia6821_w) /* PIA6821 IC3 */
|
||||
AM_RANGE(0x0b00, 0x0b03) AM_DEVREADWRITE("pia_ic4", pia6821_r, pia6821_w) /* PIA6821 IC4 */
|
||||
AM_RANGE(0x0c00, 0x0c03) AM_DEVREADWRITE("pia_ic5", pia6821_r, pia6821_w) /* PIA6821 IC5 */
|
||||
AM_RANGE(0x0d00, 0x0d03) AM_DEVREADWRITE("pia_ic6", pia6821_r, pia6821_w) /* PIA6821 IC6 */
|
||||
AM_RANGE(0x0e00, 0x0e03) AM_DEVREADWRITE("pia_ic7", pia6821_r, pia6821_w) /* PIA6821 IC7 */
|
||||
AM_RANGE(0x0f00, 0x0f03) AM_DEVREADWRITE("pia_ic8", pia6821_r, pia6821_w) /* PIA6821 IC8 */
|
||||
|
||||
AM_RANGE(0x1000, 0xffff) AM_ROMBANK("bank1") // 64k paged ROM (4 pages)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
// memory map for barcrest mpu4 board /////////////////////////////////////
|
||||
|
||||
static ADDRESS_MAP_START( dutch_memmap, ADDRESS_SPACE_PROGRAM, 8 )
|
||||
@ -2502,9 +2716,18 @@ static MACHINE_CONFIG_DERIVED( mpu4dutch, mod4oki )
|
||||
MCFG_MACHINE_START(mpu4dutch) // main mpu4 board initialisation
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
static MACHINE_CONFIG_DERIVED(bwboki, mod4oki )
|
||||
MCFG_CPU_MODIFY("maincpu")
|
||||
MCFG_CPU_PROGRAM_MAP(mpu4_bwb_map) // setup read and write memorymap
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
ROM_START( m_oldtmr )
|
||||
ROM_REGION( 0x10000, "maincpu", 0 )
|
||||
ROM_LOAD( "dot11.bin", 0x00000, 0x10000, CRC(da095666) SHA1(bc7654dc9da1f830a43f925db8079f27e18bb61e))
|
||||
|
||||
ROM_REGION( 0x200000, "msm6376", 0 )
|
||||
ROM_LOAD( "snd.p1", 0x000000, 0x080000, NO_DUMP )
|
||||
ROM_LOAD( "snd.p2", 0x080000, 0x080000, NO_DUMP )
|
||||
ROM_END
|
||||
|
||||
ROM_START( m_ccelbr )
|
||||
@ -2545,13 +2768,23 @@ ROM_START( m_grtecp )
|
||||
ROM_REGION( 0x200000, "msm6376", 0 )
|
||||
ROM_LOAD( "an2snd.p1", 0x000000, 0x080000, CRC(5394e9ae) SHA1(86ccd8531fc87f34d3c5482ba7e5a2c06ea69491) )
|
||||
ROM_LOAD( "an2snd.p2", 0x080000, 0x080000, CRC(109ace1f) SHA1(9f0e8065186beb61ed50fea834de2d91e68db953) )
|
||||
|
||||
ROM_END
|
||||
|
||||
ROM_START( m_blsbys )
|
||||
ROM_REGION( 0x40000, "maincpu", 0 )
|
||||
ROM_LOAD("bbprog.bin", 0x00000, 0x20000, CRC(c262cfda) SHA1(f004895e0dd3f8420683927915554e19e41bd20b))
|
||||
|
||||
ROM_REGION( 0x200000, "msm6376", 0 )
|
||||
ROM_LOAD( "bbsnd.p1", 0x000000, 0x080000, CRC(715c9e95) SHA1(6a0c9c63e56cfc21bf77cf29c1b844b8e0844c1e) )
|
||||
ROM_LOAD( "bbsnd.p2", 0x080000, 0x080000, CRC(594a87f8) SHA1(edfef7d08fab41fb5814c92930f08a565371eae1) )
|
||||
ROM_END
|
||||
|
||||
// year, name, parent, machine, input, init, monitor,company, fullname, flags
|
||||
GAME( 198?, m_oldtmr,0, mpu4dutch,mpu4, m_oldtmr, ROT0, "Barcrest", "Old Timer", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK )
|
||||
GAME( 198?, m_ccelbr,0, mpu4mod2, mpu4, m_ccelbr, ROT0, "Barcrest", "Club Celebration", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK )
|
||||
GAMEL(198?, m_gmball,0, mod4yam, gamball, m_gmball, ROT0, "Barcrest", "Gamball", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL,layout_gamball )//Mechanical ball launcher
|
||||
GAMEL(198?, m_grtecp,0, mod4oki, mpu4, m_grtecp, ROT0, "Barcrest", "Andy's Great Escape", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK,layout_mpu4ext )//5 reel meter mux
|
||||
GAMEL(198?, m_grtecp,0, mod4oki, mpu4, m_grtecp, ROT0, "Barcrest", "Andy's Great Escape", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK,layout_mpu4ext )//5 reel meter mux
|
||||
GAME(199?, m_blsbys,0, bwboki, mpu4, m_blsbys, ROT0, "Barcrest", "Blues Boys (Version 6)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK )
|
||||
|
||||
//SWP
|
||||
GAMEL(1989?,connect4, 0, mpu4mod2, connect4, connect4, ROT0, "Dolbeck Systems","Connect 4",GAME_IMPERFECT_GRAPHICS|GAME_REQUIRES_ARTWORK,layout_connect4 )
|
||||
|
@ -201,6 +201,8 @@ TODO:
|
||||
static READ16_HANDLER( characteriser16_r );
|
||||
static WRITE16_HANDLER( characteriser16_w );
|
||||
|
||||
static READ16_HANDLER( bwb_characteriser16_r );
|
||||
static WRITE16_HANDLER( bwb_characteriser16_w );
|
||||
|
||||
/*************************************
|
||||
*
|
||||
@ -232,7 +234,6 @@ static void update_mpu68_interrupts(running_machine *machine)
|
||||
}
|
||||
|
||||
/* Communications with 6809 board */
|
||||
/* Clock values are currently unknown, and are derived from the 68k board.*/
|
||||
|
||||
static READ_LINE_DEVICE_HANDLER( m6809_acia_rx_r )
|
||||
{
|
||||
@ -1945,7 +1946,7 @@ static MACHINE_RESET( mpu4_vid )
|
||||
|
||||
state->lamp_strobe = 0;
|
||||
state->lamp_strobe2 = 0;
|
||||
state->lamp_data = 0;
|
||||
state->led_strobe = 0;
|
||||
|
||||
state->IC23GC = 0;
|
||||
state->IC23GB = 0;
|
||||
@ -2035,9 +2036,10 @@ static ADDRESS_MAP_START( bwbvid_68k_map, ADDRESS_SPACE_PROGRAM, 16 )
|
||||
/* AM_RANGE(0xa00004, 0xa0000f) AM_READWRITE(mpu4_vid_unmap_r, mpu4_vid_unmap_w) */
|
||||
AM_RANGE(0xb00000, 0xb0000f) AM_READWRITE(mpu4_vid_scn2674_r, mpu4_vid_scn2674_w)
|
||||
AM_RANGE(0xc00000, 0xc1ffff) AM_READWRITE(mpu4_vid_vidram_r, mpu4_vid_vidram_w)
|
||||
AM_RANGE(0xe05000, 0xe05001) //AM_READWRITE(adpcm_r, adpcm_w) CHR ?
|
||||
AM_RANGE(0xe00000, 0xe00001) AM_DEVREADWRITE8("acia6850_1", acia6850_stat_r, acia6850_ctrl_w, 0xff)
|
||||
AM_RANGE(0xe00002, 0xe00003) AM_DEVREADWRITE8("acia6850_1", acia6850_data_r, acia6850_data_w, 0xff)
|
||||
AM_RANGE(0xe01000, 0xe0100f) AM_DEVREADWRITE8("6840ptm_68k", ptm6840_read, ptm6840_write, 0xff)
|
||||
//AM_RANGE(0xa00004, 0xa0000f) AM_READWRITE(bwb_characteriser16_r, bwb_characteriser16_w)//AM_READWRITE(adpcm_r, adpcm_w) CHR ?
|
||||
ADDRESS_MAP_END
|
||||
|
||||
static ADDRESS_MAP_START( bwbvid5_68k_map, ADDRESS_SPACE_PROGRAM, 16 )
|
||||
@ -2051,14 +2053,14 @@ static ADDRESS_MAP_START( bwbvid5_68k_map, ADDRESS_SPACE_PROGRAM, 16 )
|
||||
/* AM_RANGE(0xa00004, 0xa0000f) AM_READWRITE(mpu4_vid_unmap_r, mpu4_vid_unmap_w) */
|
||||
AM_RANGE(0xb00000, 0xb0000f) AM_READWRITE(mpu4_vid_scn2674_r, mpu4_vid_scn2674_w)
|
||||
AM_RANGE(0xc00000, 0xc1ffff) AM_READWRITE(mpu4_vid_vidram_r, mpu4_vid_vidram_w)
|
||||
AM_RANGE(0xe05000, 0xe05001) //AM_READWRITE(adpcm_r, adpcm_w) CHR ?
|
||||
AM_RANGE(0xe00000, 0xe00001) AM_DEVREADWRITE8("acia6850_1", acia6850_stat_r, acia6850_ctrl_w, 0xff)
|
||||
AM_RANGE(0xe00002, 0xe00003) AM_DEVREADWRITE8("acia6850_1", acia6850_data_r, acia6850_data_w, 0xff)
|
||||
AM_RANGE(0xe01000, 0xe0100f) AM_DEVREADWRITE8("6840ptm_68k", ptm6840_read, ptm6840_write, 0xff)
|
||||
AM_RANGE(0xe02000, 0xe02007) AM_DEVREADWRITE8("pia_ic4ss", pia6821_r, pia6821_w, 0xff)
|
||||
AM_RANGE(0xe03000, 0xe0300f) AM_DEVREADWRITE8("6840ptm_ic3ss", ptm6840_read, ptm6840_write, 0xff)
|
||||
AM_RANGE(0xa00004, 0xa0000f) AM_READWRITE(bwb_characteriser16_r, bwb_characteriser16_w)//AM_READWRITE(adpcm_r, adpcm_w) CHR ?
|
||||
ADDRESS_MAP_END
|
||||
//
|
||||
|
||||
/* Deal 'Em */
|
||||
/* Deal 'Em was designed as an enhanced gamecard, to fit into an existing MPU4 cabinet
|
||||
It's an unoffical addon, and does all its work through the existing 6809 CPU.
|
||||
@ -2297,16 +2299,15 @@ static TIMER_DEVICE_CALLBACK( scanline_timer_callback )
|
||||
{
|
||||
/* if (state->scn2674_display_enabled) ? */
|
||||
{
|
||||
state->scn2674_status_register |= 0x10;
|
||||
if (state->scn2674_irq_mask&0x10)
|
||||
{
|
||||
LOGSTUFF(("vblank irq\n"));
|
||||
state->scn2674_irq_state = 1;
|
||||
update_mpu68_interrupts(timer.machine);
|
||||
|
||||
state->scn2674_irq_register |= 0x10;
|
||||
update_mpu68_interrupts(timer.machine);
|
||||
}
|
||||
}
|
||||
state->scn2674_status_register |= 0x10;
|
||||
}
|
||||
|
||||
// printf("scanline %d\n",current_scanline);
|
||||
@ -2551,6 +2552,84 @@ static READ16_HANDLER( characteriser16_r )
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
BwB Characteriser (CHR)
|
||||
|
||||
The BwB method of protection is considerably different to the Barcrest one, with any
|
||||
incorrect behaviour manifesting in ridiculously large payouts.
|
||||
|
||||
In fact, the software seems deliberately designed to mislead, but is (fortunately for
|
||||
us) prone to similar weaknesses that allow a per game solution.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
static WRITE16_HANDLER( bwb_characteriser16_w )
|
||||
{
|
||||
mpu4_state *state = space->machine->driver_data<mpu4_state>();
|
||||
int x;
|
||||
int call=data &0xff;
|
||||
LOG_CHR_FULL(("%04x Characteriser write offset %02X data %02X \n", cpu_get_previouspc(space->cpu),offset,data));
|
||||
if (!state->current_chr_table)
|
||||
fatalerror("No Characteriser Table @ %04x\n", cpu_get_previouspc(space->cpu));
|
||||
|
||||
if (offset == 0)//initialisation is always at 0x800
|
||||
{
|
||||
{
|
||||
if (call == 0)
|
||||
{
|
||||
state->init_col =0;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (x = state->init_col; x < 64; x++)
|
||||
{
|
||||
if (state->current_chr_table[(x)].call == call)
|
||||
{
|
||||
state->init_col = x;
|
||||
LOG_CHR_FULL(("BwB Characteriser init column %02X\n",state->init_col));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (x = state->prot_col; x < 64;)
|
||||
{
|
||||
x++;
|
||||
if (state->current_chr_table[(x)].call == call)
|
||||
{
|
||||
state->prot_col = x;
|
||||
LOG_CHR(("BwB Characteriser init column %02X\n",state->prot_col));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static READ16_HANDLER( bwb_characteriser16_r )
|
||||
{
|
||||
mpu4_state *state = space->machine->driver_data<mpu4_state>();
|
||||
if (!state->current_chr_table)
|
||||
fatalerror("No Characteriser Table @ %04x\n", cpu_get_previouspc(space->cpu));
|
||||
|
||||
LOG_CHR(("Characteriser read offset %02X \n",offset));
|
||||
|
||||
|
||||
if (offset ==0)
|
||||
{
|
||||
LOG_CHR(("Characteriser read data %02X \n",state->current_chr_table[state->init_col].response));
|
||||
return state->current_chr_table[state->init_col].response;
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_CHR(("Characteriser read BwB data %02X \n",state->current_chr_table[state->prot_col].response));
|
||||
return state->current_chr_table[state->prot_col].response;
|
||||
}
|
||||
}
|
||||
|
||||
static const mpu4_chr_table adders_data[64] = {
|
||||
{0x00, 0x00}, {0x1A, 0x8C}, {0x04, 0x64}, {0x10, 0x84}, {0x18, 0x84}, {0x0F, 0xC4}, {0x13, 0x84}, {0x1B, 0x84},
|
||||
{0x03, 0x9C}, {0x07, 0xF4}, {0x17, 0x04}, {0x1D, 0xCC}, {0x36, 0x24}, {0x35, 0x84}, {0x2B, 0xC4}, {0x28, 0x94},
|
||||
@ -2694,6 +2773,20 @@ static const mpu4_chr_table quidgrid_data[64] = {
|
||||
{0x0D, 0x04}, {0x1F, 0x64}, {0x16, 0x24}, {0x05, 0x64}, {0x13, 0x24}, {0x1C, 0x64}, {0x02, 0x74}, {0x00, 0x00}
|
||||
};
|
||||
|
||||
static const mpu4_chr_table prizeinv_data[72] = {
|
||||
{0x00, 0x00},{0x00, 0x00},{0x00, 0x00},{0x00, 0x00},{0x00, 0x00},{0x00, 0x00},{0x2e, 0x36},{0x20, 0x42},
|
||||
{0x0f, 0x27},{0x24, 0x42},{0x3c, 0x09},{0x2c, 0x01},{0x01, 0x1d},{0x1d, 0x40},{0x40, 0xd2},{0xd2, 0x01},
|
||||
{0x01, 0xf9},{0xb1, 0x41},{0x41, 0x1c},{0x1c, 0x01},{0x01, 0xf9},{0x04, 0x54},{0x54, 0x02},{0x02, 0x00},
|
||||
{0x00, 0x00},{0x00, 0x2e},{0x2e, 0x20},{0x20, 0x0f},{0x0f, 0x24},{0x24, 0x3c},{0x3c, 0x39},{0x3c, 0xc9},
|
||||
{0xc9, 0x05},{0x05, 0x04},{0x04, 0x54},{0x54, 0x02},{0x02, 0x00},{0x00, 0x00},{0x00, 0x2e},{0x2e, 0x20},
|
||||
{0x20, 0x0f},{0x0f, 0x24},{0x24, 0x3c},{0x3c, 0x39},{0x3c, 0x36},{0x36, 0x00},{0x42, 0x04},{0x27, 0x04},
|
||||
{0x42, 0x0c},{0x09, 0x0c},{0x42, 0x1c},{0x27, 0x14},{0x42, 0x2c},{0x42, 0x5c},{0x09, 0x2c},
|
||||
//All this may be garbage - the ROM table seems endless
|
||||
{0x0A, 0x00},
|
||||
{0x31, 0x20},{0x34, 0x90}, {0x1e, 0x40},{0x04, 0x90},{0x01, 0xe4},{0x0c, 0xf4},{0x18, 0x64},{0x19, 0x10},
|
||||
{0x00, 0x00},{0x01, 0x00},{0x04, 0x00},{0x09, 0x00},{0x10, 0x00},{0x19, 0x10},{0x24, 0x00},{0x31, 0x00}
|
||||
};
|
||||
|
||||
static DRIVER_INIT (adders)
|
||||
{
|
||||
mpu4_state *state = machine->driver_data<mpu4_state>();
|
||||
@ -2721,12 +2814,14 @@ static DRIVER_INIT (crmaze2)
|
||||
static DRIVER_INIT (crmaze3)
|
||||
{
|
||||
mpu4_state *state = machine->driver_data<mpu4_state>();
|
||||
state->reel_mux = FLUTTERBOX;
|
||||
state->current_chr_table = crmaze3_data;
|
||||
}
|
||||
|
||||
static DRIVER_INIT (crmaze3a)
|
||||
{
|
||||
mpu4_state *state = machine->driver_data<mpu4_state>();
|
||||
state->reel_mux = FLUTTERBOX;
|
||||
state->current_chr_table = crmaze3a_data;
|
||||
}
|
||||
|
||||
@ -2745,7 +2840,6 @@ static DRIVER_INIT (mating)
|
||||
state->current_chr_table = mating_data;
|
||||
}
|
||||
|
||||
|
||||
static DRIVER_INIT (skiltrek)
|
||||
{
|
||||
mpu4_state *state = machine->driver_data<mpu4_state>();
|
||||
@ -2782,7 +2876,11 @@ static DRIVER_INIT (quidgrid)
|
||||
state->current_chr_table = quidgrid_data;
|
||||
}
|
||||
|
||||
|
||||
static DRIVER_INIT (prizeinv)
|
||||
{
|
||||
mpu4_state *state = machine->driver_data<mpu4_state>();
|
||||
state->current_chr_table = prizeinv_data;
|
||||
}
|
||||
|
||||
ROM_START( dealem )
|
||||
ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 )
|
||||
@ -3389,9 +3487,9 @@ GAME( 199?, quidgrid2d,quidgrid, mpu4_vid, mpu4, quidgrid, ROT0, "Barcrest"
|
||||
|
||||
/* Games below are newer BwB games and use their own BIOS ROMs and hardware setups*/
|
||||
GAME( 199?, vgpoker, 0, vgpoker, mpu4, 0, ROT0, "BwB", "Vegas Poker (prototype, release 2)", GAME_NOT_WORKING )
|
||||
GAME( 199?, prizeinv, 0, bwbvid, mpu4, 0, ROT0, "BwB", "Prize Space Invaders (20\" v1.1)", GAME_NOT_WORKING )
|
||||
GAME( 199?, blox, 0, bwbvid, mpu4, 0, ROT0, "BwB", "Blox (v2.0)", GAME_NOT_WORKING )
|
||||
GAME( 199?, bloxd, blox, bwbvid, mpu4, 0, ROT0, "BwB", "Blox (v2.0, Datapak)", GAME_NOT_WORKING )
|
||||
GAME( 1996, renoreel, 0, bwbvid5, mpu4, 0, ROT0, "BwB", "Reno Reels (20p/10GBP Cash, release A)", GAME_NOT_WORKING )
|
||||
GAME( 199?, redhtpkr, 0, bwbvid, mpu4, 0, ROT0, "BwB", "Red Hot Poker (20p/10GBP Cash, release 3)", GAME_NOT_WORKING )
|
||||
GAME( 199?, bwbtetrs, 0, bwbvid, mpu4, 0, ROT0, "BwB", "BwB Tetris v 2.2", GAME_NOT_WORKING )
|
||||
GAME( 199?, prizeinv, 0, bwbvid, mpu4, prizeinv, ROT0, "BwB", "Prize Space Invaders (20\" v1.1)", GAME_NOT_WORKING )
|
||||
GAME( 199?, blox, 0, bwbvid, mpu4, 0, ROT0, "BwB", "Blox (v2.0)", GAME_NOT_WORKING )
|
||||
GAME( 199?, bloxd, blox, bwbvid, mpu4, 0, ROT0, "BwB", "Blox (v2.0, Datapak)", GAME_NOT_WORKING )
|
||||
GAME( 1996, renoreel, 0, bwbvid5, mpu4, 0, ROT0, "BwB", "Reno Reels (20p/10GBP Cash, release A)", GAME_NOT_WORKING )
|
||||
GAME( 199?, redhtpkr, 0, bwbvid, mpu4, 0, ROT0, "BwB", "Red Hot Poker (20p/10GBP Cash, release 3)", GAME_NOT_WORKING )
|
||||
GAME( 199?, bwbtetrs, 0, bwbvid, mpu4, 0, ROT0, "BwB", "BwB Tetris v 2.2", GAME_NOT_WORKING )
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -11,6 +11,7 @@
|
||||
// 05-03-2004: Re-Animator //
|
||||
// //
|
||||
// TODO: add different types of stepper motors if needed //
|
||||
// Convert the tables to something more like the real thing //
|
||||
// someone who understands the device system may want to convert //
|
||||
// this //
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
@ -29,6 +30,7 @@ typedef struct _stepper
|
||||
const stepper_interface *intf;
|
||||
UINT8 pattern, /* coil pattern */
|
||||
old_pattern, /* old coil pattern */
|
||||
phase, /* motor phase */
|
||||
type; /* reel type */
|
||||
INT16 step_pos, /* step position 0 - max_steps */
|
||||
max_steps; /* maximum step position */
|
||||
@ -41,555 +43,41 @@ typedef struct _stepper
|
||||
} stepper;
|
||||
|
||||
static stepper step[MAX_STEPPERS];
|
||||
/* step table, use previouspattern::newpattern as index */
|
||||
static const int StarpointStepTab[] =
|
||||
{
|
||||
0, //0000->0000 0->0
|
||||
0, //0000->0001 0->1
|
||||
0, //0000->0010 0->2
|
||||
0, //0000->0011 0->3
|
||||
0, //0000->0100 0->4
|
||||
0, //0000->0101 0->5
|
||||
0, //0000->0110 0->6
|
||||
0, //0000->0111 0->7
|
||||
0, //0000->1000 0->8
|
||||
0, //0000->1001 0->9
|
||||
0, //0000->1010 0->A
|
||||
0, //0000->1011 0->B
|
||||
0, //0000->1100 0->C
|
||||
0, //0000->1101 0->D
|
||||
0, //0000->1110 0->E
|
||||
0, //0000->1111 0->F
|
||||
|
||||
0, //0001->0000 1->0
|
||||
0, //0001->0001 1->1
|
||||
0, //0001->0010 1->2
|
||||
0, //0001->0011 1->3
|
||||
-2,//0001->0100 1->4
|
||||
-1,//0001->0101 1->5
|
||||
0, //0001->0110 1->6
|
||||
0, //0001->0111 1->7
|
||||
2, //0001->1000 1->8
|
||||
1, //0001->1001 1->9
|
||||
0, //0001->1010 1->A
|
||||
0, //0001->1011 1->B
|
||||
0, //0001->1100 1->C
|
||||
0, //0001->1101 1->D
|
||||
0, //0001->1110 1->E
|
||||
0, //0001->1111 1->F
|
||||
|
||||
0, //0010->0000 2->0
|
||||
0, //0010->0001 2->1
|
||||
0, //0010->0010 2->2
|
||||
0, //0010->0011 2->3
|
||||
2, //0010->0100 2->4
|
||||
0, //0010->0101 2->5
|
||||
1, //0010->0110 2->6
|
||||
0, //0010->0111 2->7
|
||||
-2,//0010->1000 2->8
|
||||
0, //0010->1001 2->9
|
||||
-1,//0010->1010 2->A
|
||||
0, //0010->1011 2->B
|
||||
0, //0010->1100 2->C
|
||||
0, //0010->1101 2->D
|
||||
0, //0010->1110 2->E
|
||||
0, //0010->1111 2->F
|
||||
|
||||
0, //0011->0000 3->0
|
||||
0, //0011->0001 3->1
|
||||
0, //0011->0010 3->2
|
||||
0, //0011->0011 3->3
|
||||
0, //0011->0100 3->4
|
||||
0, //0011->0101 3->5
|
||||
0, //0011->0110 3->6
|
||||
0, //0011->0111 3->7
|
||||
0, //0011->1000 3->8
|
||||
0, //0011->1001 3->9
|
||||
0, //0011->1010 3->A
|
||||
0, //0011->1011 3->B
|
||||
0, //0011->1100 3->C
|
||||
0, //0011->1101 3->D
|
||||
0, //0011->1110 3->E
|
||||
0, //0011->1111 3->F
|
||||
|
||||
0, //0100->0000 4->0
|
||||
2, //0100->0001 4->1
|
||||
-2,//0100->0010 4->2
|
||||
0, //0100->0011 4->3
|
||||
0, //0100->0100 4->4
|
||||
1, //0100->0101 4->5
|
||||
-1,//0100->0110 4->6
|
||||
0, //0100->0111 4->7
|
||||
0, //0100->1000 4->8
|
||||
0, //0100->1001 4->9
|
||||
0, //0100->1010 4->A
|
||||
0, //0100->1011 4->B
|
||||
0, //0100->1100 4->C
|
||||
0, //0100->1101 4->D
|
||||
0, //0100->1110 4->E
|
||||
0, //0100->1111 4->F
|
||||
|
||||
0, //0101->0000 5->0
|
||||
1, //0101->0001 5->1
|
||||
0, //0101->0010 5->2
|
||||
0, //0101->0011 5->3
|
||||
-1,//0101->0100 5->4
|
||||
0, //0101->0101 5->5
|
||||
-2,//0101->0110 5->6
|
||||
0, //0101->0111 5->7
|
||||
0, //0101->1000 5->8
|
||||
2, //0101->1001 5->9
|
||||
0, //0101->1010 5->A
|
||||
0, //0101->1011 5->B
|
||||
0, //0101->1100 5->C
|
||||
0, //0101->1101 5->D
|
||||
0, //0101->1110 5->E
|
||||
0, //0101->1111 5->F
|
||||
|
||||
0, //0110->0000 6->0
|
||||
0, //0110->0001 6->1
|
||||
-1,//0110->0010 6->2
|
||||
0, //0110->0011 6->3
|
||||
1, //0110->0100 6->4
|
||||
2, //0110->0101 6->5
|
||||
0, //0110->0110 6->6
|
||||
0, //0110->0111 6->7
|
||||
0, //0110->1000 6->8
|
||||
0, //0110->1001 6->9
|
||||
-2,//0110->1010 6->A
|
||||
0, //0110->1011 6->B
|
||||
0, //0110->1100 6->C
|
||||
0, //0110->1101 6->D
|
||||
0, //0110->1110 6->E
|
||||
0, //0110->1111 6->F
|
||||
|
||||
0, //0111->0000 7->0
|
||||
0, //0111->0001 7->1
|
||||
0, //0111->0010 7->2
|
||||
0, //0111->0011 7->3
|
||||
0, //0111->0100 7->4
|
||||
0, //0111->0101 7->5
|
||||
0, //0111->0110 7->6
|
||||
0, //0111->0111 7->7
|
||||
0, //0111->1000 7->8
|
||||
0, //0111->1001 7->9
|
||||
0, //0111->1010 7->A
|
||||
0, //0111->1011 7->B
|
||||
0, //0111->1100 7->C
|
||||
0, //0111->1101 7->D
|
||||
0, //0111->1110 7->E
|
||||
0, //0111->1111 7->F
|
||||
|
||||
0, //1000->0000 8->0
|
||||
-2,//1000->0001 8->1
|
||||
2, //1000->0010 8->2
|
||||
0, //1000->0011 8->3
|
||||
0, //1000->0100 8->4
|
||||
0, //1000->0101 8->5
|
||||
0, //1000->0110 8->6
|
||||
0, //1000->0111 8->7
|
||||
0, //1000->1000 8->8
|
||||
-1,//1000->1001 8->9
|
||||
1, //1000->1010 8->A
|
||||
0, //1000->1011 8->B
|
||||
0, //1000->1100 8->C
|
||||
0, //1000->1101 8->D
|
||||
0, //1000->1110 8->E
|
||||
0, //1000->1111 8->F
|
||||
|
||||
0, //1001->0000 9->0
|
||||
-1,//1001->0001 9->1
|
||||
0, //1001->0010 9->2
|
||||
0, //1001->0011 9->3
|
||||
0, //1001->0100 9->4
|
||||
-2,//1001->0101 9->5
|
||||
0, //1001->0110 9->6
|
||||
0, //1001->0111 9->7
|
||||
1, //1001->1000 9->8
|
||||
0, //1001->1001 9->9
|
||||
2, //1001->1010 9->A
|
||||
0, //1001->1011 9->B
|
||||
0, //1001->1100 9->C
|
||||
0, //1001->1101 9->D
|
||||
0, //1001->1110 9->E
|
||||
0, //1001->1111 9->F
|
||||
|
||||
0, //1010->0000 A->0
|
||||
0, //1010->0001 A->1
|
||||
1, //1010->0010 A->2
|
||||
0, //1010->0011 A->3
|
||||
0, //1010->0100 A->4
|
||||
0, //1010->0101 A->5
|
||||
2, //1010->0110 A->6
|
||||
0, //1010->0111 A->7
|
||||
-1,//1010->1000 A->8
|
||||
-2,//1010->1001 A->9
|
||||
0, //1010->1010 A->A
|
||||
0, //1010->1011 A->B
|
||||
0, //1010->1100 A->C
|
||||
0, //1010->1101 A->D
|
||||
0, //1010->1110 A->E
|
||||
0, //1010->1111 A->F
|
||||
|
||||
0, //1011->0000 B->0
|
||||
0, //1011->0001 B->1
|
||||
0, //1011->0010 B->2
|
||||
0, //1011->0011 B->3
|
||||
0, //1011->0100 B->4
|
||||
0, //1011->0101 B->5
|
||||
0, //1011->0110 B->6
|
||||
0, //1011->0111 B->7
|
||||
0, //1011->1000 B->8
|
||||
0, //1011->1001 B->9
|
||||
0, //1011->1010 B->A
|
||||
0, //1011->1011 B->B
|
||||
0, //1011->1100 B->C
|
||||
0, //1011->1101 B->D
|
||||
0, //1011->1110 B->E
|
||||
0, //1011->1111 B->F
|
||||
|
||||
0, //1100->0000 C->0
|
||||
0, //1100->0001 C->1
|
||||
0, //1100->0010 C->2
|
||||
0, //1100->0011 C->3
|
||||
0, //1100->0100 C->4
|
||||
0, //1100->0101 C->5
|
||||
0, //1100->0110 C->6
|
||||
0, //1100->0111 C->7
|
||||
0, //1100->1000 C->8
|
||||
0, //1100->1001 C->9
|
||||
0, //1100->1010 C->A
|
||||
0, //1100->1011 C->B
|
||||
0, //1100->1100 C->C
|
||||
0, //1100->1101 C->D
|
||||
0, //1100->1110 C->E
|
||||
0, //1100->1111 C->F
|
||||
|
||||
0, //1101->0000 D->0
|
||||
0, //1101->0001 D->1
|
||||
0, //1101->0010 D->2
|
||||
0, //1101->0011 D->3
|
||||
0, //1101->0100 D->4
|
||||
0, //1101->0101 D->5
|
||||
0, //1101->0110 D->6
|
||||
0, //1101->0111 D->7
|
||||
0, //1101->1000 D->8
|
||||
0, //1101->1001 D->9
|
||||
0, //1101->1010 D->A
|
||||
0, //1101->1011 D->B
|
||||
0, //1101->1100 D->C
|
||||
0, //1101->1101 D->D
|
||||
0, //1101->1110 D->E
|
||||
0, //1101->1111 D->F
|
||||
|
||||
0, //1110->0000 E->0
|
||||
0, //1110->0001 E->1
|
||||
0, //1110->0010 E->2
|
||||
0, //1110->0011 E->3
|
||||
0, //1110->0100 E->4
|
||||
0, //1110->0101 E->5
|
||||
0, //1110->0110 E->6
|
||||
0, //1110->0111 E->7
|
||||
0, //1110->1000 E->8
|
||||
0, //1110->1001 E->9
|
||||
0, //1110->1010 E->A
|
||||
0, //1110->1011 E->B
|
||||
0, //1110->1100 E->C
|
||||
0, //1110->1101 E->D
|
||||
0, //1110->1110 E->E
|
||||
0, //1110->1111 E->F
|
||||
|
||||
0, //1111->0000 F->0
|
||||
0, //1111->0001 F->1
|
||||
0, //1111->0010 F->2
|
||||
0, //1111->0011 F->3
|
||||
0, //1111->0100 F->4
|
||||
0, //1111->0101 F->5
|
||||
0, //1111->0110 F->6
|
||||
0, //1111->0111 F->7
|
||||
0, //1111->1000 F->8
|
||||
0, //1111->1001 F->9
|
||||
0, //1111->1010 F->A
|
||||
0, //1111->1011 F->B
|
||||
0, //1111->1100 F->C
|
||||
0, //1111->1101 F->D
|
||||
0, //1111->1110 F->E
|
||||
0 //1111->1111 F->F
|
||||
/* step table, use active coils as row, phase as column */
|
||||
static const int StarpointStepTab[8][16] =
|
||||
{// 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 Phase
|
||||
{ 0, 0, 4, 0, 2, 1, 3, 0, -2, -1, -3, 0, 0, 0, 0, 0 },// 0
|
||||
{ 0, -1, 3, 0, 1, 0, 2, 0, -3, -2, 4, 0, 0, 0, 0, 0 },// 1
|
||||
{ 0, -2, 2, 0, 0, -1, 1, 0, 4, -3, 3, 0, 0, 0, 0, 0 },// 2
|
||||
{ 0, -3, 1, 0, -1, -2, 0, 0, 3, 4, 2, 0, 0, 0, 0, 0 },// 3
|
||||
{ 0, 4, 0, 0, -2, -3, -1, 0, 2, 3, 1, 0, 0, 0, 0, 0 },// 4
|
||||
{ 0, 3, -1, 0, -3, -4, -2, 0, 1, 2, 0, 0, 0, 0, 0, 0 },// 5
|
||||
{ 0, 2, -2, 0, 4, 3, -3, 0, 0, 1, -1, 0, 0, 0, 0, 0 },// 6
|
||||
{ 0, 1, -3, 0, 3, 2, -4, 0, -1, 0, -2, 0, 0, 0, 0, 0 },// 7
|
||||
};
|
||||
|
||||
static const int BarcrestStepTab[] =
|
||||
{
|
||||
0, //0000->0000 0->0
|
||||
0, //0000->0001 0->1
|
||||
0, //0000->0010 0->2
|
||||
2, //0000->0011 0->3
|
||||
0, //0000->0100 0->4
|
||||
0, //0000->0101 0->5
|
||||
0, //0000->0110 0->6
|
||||
0, //0000->0111 0->7
|
||||
0, //0000->1000 0->8
|
||||
0, //0000->1001 0->9
|
||||
0, //0000->1010 0->A
|
||||
0, //0000->1011 0->B
|
||||
0, //0000->1100 0->C
|
||||
0, //0000->1101 0->D
|
||||
0, //0000->1110 0->E
|
||||
0, //0000->1111 0->F
|
||||
static const int MPU3StepTab[8][4] =
|
||||
{// 00 01 10 11 Phase
|
||||
{ 2, 0, 0, -2, },// 0
|
||||
{ 0, 0, 0, 0, },// 1
|
||||
{ 0, -2, -2, 0, },// 2
|
||||
{ 0, 0, 0, 0, },// 3
|
||||
{-2, 0, 0, 2, },// 4
|
||||
{ 0, 0, 0, 0, },// 5
|
||||
{ 0, 2, -2, 0, },// 6
|
||||
{ 0, 0, 0, 0, },// 7
|
||||
};
|
||||
|
||||
0, //0001->0000 1->0
|
||||
0, //0001->0001 1->1
|
||||
0, //0001->0010 1->2
|
||||
1, //0001->0011 1->3
|
||||
0, //0001->0100 1->4
|
||||
0, //0001->0101 1->5
|
||||
0, //0001->0110 1->6
|
||||
0, //0001->0111 1->7
|
||||
0, //0001->1000 1->8
|
||||
-1,//0001->1001 1->9 -1,//1001->1000 9->8
|
||||
0, //0001->1010 1->A
|
||||
0, //0001->1011 1->B
|
||||
0, //0001->1100 1->C
|
||||
0, //0001->1101 1->D
|
||||
0, //0001->1110 1->E
|
||||
0, //0001->1111 1->F
|
||||
|
||||
0, //0010->0000 2->0
|
||||
0, //0010->0001 2->1
|
||||
0, //0010->0010 2->2
|
||||
-1,//0010->0011 2->3
|
||||
0, //0010->0100 2->4
|
||||
0, //0010->0101 2->5
|
||||
1, //0010->0110 2->6
|
||||
0, //0010->0111 2->7
|
||||
0, //0010->1000 2->8
|
||||
0, //0010->1001 2->9
|
||||
0, //0010->1010 2->A
|
||||
0, //0010->1011 2->B
|
||||
0, //0010->1100 2->C
|
||||
0, //0010->1101 2->D
|
||||
0, //0010->1110 2->E
|
||||
0, //0010->1111 2->F
|
||||
|
||||
0, //0011->0000 3->0
|
||||
-1,//0011->0001 3->1
|
||||
1, //0011->0010 3->2
|
||||
0, //0011->0011 3->3
|
||||
0, //0011->0100 3->4
|
||||
0, //0011->0101 3->5
|
||||
2, //0011->0110 3->6
|
||||
0, //0011->0111 3->7
|
||||
0, //0011->1000 3->8
|
||||
-2,//0011->1001 3->9
|
||||
0, //0011->1010 3->A
|
||||
0, //0011->1011 3->B
|
||||
0, //0011->1100 3->C
|
||||
0, //0011->1101 3->D
|
||||
0, //0011->1110 3->E
|
||||
0, //0011->1111 3->F
|
||||
|
||||
0, //0100->0000 4->0
|
||||
0, //0100->0001 4->1
|
||||
0, //0100->0010 4->2
|
||||
0, //0100->0011 4->3
|
||||
0, //0100->0100 4->4
|
||||
0, //0100->0101 4->5
|
||||
-1,//0100->0110 4->6
|
||||
0, //0100->0111 4->7
|
||||
0, //0100->1000 4->8
|
||||
0, //0100->1001 4->9
|
||||
0, //0100->1010 4->A
|
||||
0, //0100->1011 4->B
|
||||
1, //0100->1100 4->C
|
||||
0, //0100->1101 4->D
|
||||
0, //0100->1110 4->E
|
||||
0, //0100->1111 4->F
|
||||
|
||||
0, //0101->0000 5->0
|
||||
0, //0101->0001 5->1
|
||||
0, //0101->0010 5->2
|
||||
0, //0101->0011 5->3
|
||||
0, //0101->0100 5->4
|
||||
0, //0101->0101 5->5
|
||||
0, //0101->0110 5->6
|
||||
0, //0101->0111 5->7
|
||||
0, //0101->1000 5->8
|
||||
0, //0101->1001 5->9
|
||||
0, //0101->1010 5->A
|
||||
0, //0101->1011 5->B
|
||||
0, //0101->1100 5->C
|
||||
0, //0101->1101 5->D
|
||||
0, //0101->1110 5->E
|
||||
0, //0101->1111 5->F
|
||||
|
||||
0, //0110->0000 6->0
|
||||
0, //0110->0001 6->1
|
||||
-1,//0110->0010 6->2
|
||||
-2,//0110->0011 6->3
|
||||
1, //0110->0100 6->4
|
||||
0, //0110->0101 6->5
|
||||
0, //0110->0110 6->6
|
||||
0, //0110->0111 6->7
|
||||
0, //0110->1000 6->8
|
||||
0, //0110->1001 6->9
|
||||
0, //0110->1010 6->A
|
||||
0, //0110->1011 6->B
|
||||
2, //0110->1100 6->C
|
||||
0, //0110->1101 6->D
|
||||
0, //0110->1110 6->E
|
||||
0, //0110->1111 6->F
|
||||
|
||||
0, //0111->0000 7->0
|
||||
0, //0111->0001 7->1
|
||||
0, //0111->0010 7->2
|
||||
0, //0111->0011 7->3
|
||||
0, //0111->0100 7->4
|
||||
0, //0111->0101 7->5
|
||||
0, //0111->0110 7->6
|
||||
0, //0111->0111 7->7
|
||||
0, //0111->1000 7->8
|
||||
0, //0111->1001 7->9
|
||||
0, //0111->1010 7->A
|
||||
0, //0111->1011 7->B
|
||||
0, //0111->1100 7->C
|
||||
0, //0111->1101 7->D
|
||||
0, //0111->1110 7->E
|
||||
0, //0111->1111 7->F
|
||||
|
||||
0, //1000->0000 8->0
|
||||
0, //1000->0001 8->1
|
||||
0, //1000->0010 8->2
|
||||
0, //1000->0011 8->3
|
||||
0, //1000->0100 8->4
|
||||
0, //1000->0101 8->5
|
||||
0, //1000->0110 8->6
|
||||
0, //1000->0111 8->7
|
||||
0, //1000->1000 8->8
|
||||
1, //1000->1001 8->9
|
||||
0, //1000->1010 8->A
|
||||
0, //1000->1011 8->B
|
||||
-1,//1000->1100 8->C
|
||||
0, //1000->1101 8->D
|
||||
0, //1000->1110 8->E
|
||||
0, //1000->1111 8->F
|
||||
|
||||
0, //1001->0000 9->0
|
||||
1, //1001->0001 9->1
|
||||
0, //1001->0010 9->2
|
||||
2, //1001->0011 9->3
|
||||
0, //1001->0100 9->4
|
||||
0, //1001->0101 9->5
|
||||
0, //1001->0110 9->6
|
||||
0, //1001->0111 9->7
|
||||
-1,//1001->1000 9->8
|
||||
0, //1001->1001 9->9
|
||||
0, //1001->1010 9->A
|
||||
0, //1001->1011 9->B
|
||||
-2,//1001->1100 9->C
|
||||
0, //1001->1101 9->D
|
||||
0, //1001->1110 9->E
|
||||
0, //1001->1111 9->F
|
||||
|
||||
0, //1010->0000 A->0
|
||||
0, //1010->0001 A->1
|
||||
0, //1010->0010 A->2
|
||||
0, //1010->0011 A->3
|
||||
0, //1010->0100 A->4
|
||||
0, //1010->0101 A->5
|
||||
0, //1010->0110 A->6
|
||||
0, //1010->0111 A->7
|
||||
0, //1010->1000 A->8
|
||||
0, //1010->1001 A->9
|
||||
0, //1010->1010 A->A
|
||||
0, //1010->1011 A->B
|
||||
0, //1010->1100 A->C
|
||||
0, //1010->1101 A->D
|
||||
0, //1010->1110 A->E
|
||||
0, //1010->1111 A->F
|
||||
|
||||
0, //1011->0000 B->0
|
||||
0, //1011->0001 B->1
|
||||
0, //1011->0010 B->2
|
||||
0, //1011->0011 B->3
|
||||
0, //1011->0100 B->4
|
||||
0, //1011->0101 B->5
|
||||
0, //1011->0110 B->6
|
||||
0, //1011->0111 B->7
|
||||
0, //1011->1000 B->8
|
||||
0, //1011->1001 B->9
|
||||
0, //1011->1010 B->A
|
||||
0, //1011->1011 B->B
|
||||
0, //1011->1100 B->C
|
||||
0, //1011->1101 B->D
|
||||
0, //1011->1110 B->E
|
||||
0, //1011->1111 B->F
|
||||
|
||||
0, //1100->0000 C->0
|
||||
0, //1100->0001 C->1
|
||||
0, //1100->0010 C->2
|
||||
0, //1100->0011 C->3
|
||||
-1,//1100->0100 C->4
|
||||
0, //1100->0101 C->5
|
||||
-2,//1100->0110 C->6
|
||||
0, //1100->0111 C->7
|
||||
1, //1100->1000 C->8
|
||||
2, //1100->1001 C->9
|
||||
0, //1100->1010 C->A
|
||||
0, //1100->1011 C->B
|
||||
0, //1100->1100 C->C
|
||||
0, //1100->1101 C->D
|
||||
0, //1100->1110 C->E
|
||||
0, //1100->1111 C->F
|
||||
|
||||
0, //1101->0000 D->0
|
||||
0, //1101->0001 D->1
|
||||
0, //1101->0010 D->2
|
||||
0, //1101->0011 D->3
|
||||
0, //1101->0100 D->4
|
||||
0, //1101->0101 D->5
|
||||
0, //1101->0110 D->6
|
||||
0, //1101->0111 D->7
|
||||
0, //1101->1000 D->8
|
||||
0, //1101->1001 D->9
|
||||
0, //1101->1010 D->A
|
||||
0, //1101->1011 D->B
|
||||
0, //1101->1100 D->C
|
||||
0, //1101->1101 D->D
|
||||
0, //1101->1110 D->E
|
||||
0, //1101->1111 D->F
|
||||
|
||||
0, //1110->0000 E->0
|
||||
0, //1110->0001 E->1
|
||||
0, //1110->0010 E->2
|
||||
0, //1110->0011 E->3
|
||||
0, //1110->0100 E->4
|
||||
0, //1110->0101 E->5
|
||||
0, //1110->0110 E->6
|
||||
0, //1110->0111 E->7
|
||||
0, //1110->1000 E->8
|
||||
0, //1110->1001 E->9
|
||||
0, //1110->1010 E->A
|
||||
0, //1110->1011 E->B
|
||||
0, //1110->1100 E->C
|
||||
0, //1110->1101 E->D
|
||||
0, //1110->1110 E->E
|
||||
0, //1110->1111 E->F
|
||||
|
||||
0, //1111->0000 F->0
|
||||
0, //1111->0001 F->1
|
||||
0, //1111->0010 F->2
|
||||
0, //1111->0011 F->3
|
||||
0, //1111->0100 F->4
|
||||
0, //1111->0101 F->5
|
||||
0, //1111->0110 F->6
|
||||
0, //1111->0111 F->7
|
||||
0, //1111->1000 F->8
|
||||
0, //1111->1001 F->9
|
||||
0, //1111->1010 F->A
|
||||
0, //1111->1011 F->B
|
||||
0, //1111->1100 F->C
|
||||
0, //1111->1101 F->D
|
||||
0, //1111->1110 F->E
|
||||
0 //1111->1111 F->F
|
||||
static const int BarcrestStepTab[8][16] =
|
||||
{// 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 Phase
|
||||
{ 0, 1, 3, 2, -3, 0, 0, 0, -1, 0, 0, 0, -2, 0, 0, 0 },// 0
|
||||
{ 0, 0, 2, 1, 0, 0, 3, 0, -2, -1, 0, 0, -3, 0, 0, 0 },// 1
|
||||
{ 0, -1, 1, 0, 3, 0, 2, 0, -3, -2, 0, 0, 0, 0, 0, 0 },// 2
|
||||
{ 0, -2, 0, -1, 2, 0, 1, 0, 0, -3, 0, 0, 3, 0, 0, 0 },// 3
|
||||
{ 0, -3, -1, -2, 1, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0 },// 4
|
||||
{ 0, 0, -2, -3, 0, 0, -1, 0, 2, 3, 0, 0, 1, 0, 0, 0 },// 5
|
||||
{ 0, 3, -3, 0, -1, 0, -2, 0, 0, 2, 0, 0, 0, 0, 0, 0 },// 6
|
||||
{ 0, 2, 0, 3, -2, 0, -3, 0, 0, 1, 0, 0, -1, 0, 0, 0 },// 7
|
||||
};
|
||||
|
||||
/* useful interfaces */
|
||||
@ -615,14 +103,16 @@ void stepper_config(running_machine *machine, int which, const stepper_interface
|
||||
step[which].index_start = intf->index_start;/* location of first index value in half steps */
|
||||
step[which].index_end = intf->index_end; /* location of last index value in half steps */
|
||||
step[which].index_patt = intf->index_patt; /* hex value of coil pattern (0 if not needed)*/
|
||||
step[which].phase = 0;
|
||||
step[which].pattern = 0;
|
||||
step[which].old_pattern = 0;
|
||||
step[which].step_pos = 0;
|
||||
|
||||
switch ( step[which].type )
|
||||
{
|
||||
{ default:
|
||||
case STARPOINT_48STEP_REEL: /* STARPOINT RMxxx */
|
||||
case BARCREST_48STEP_REEL : /* Barcrest Reel unit */
|
||||
case MPU3_48STEP_REEL :
|
||||
step[which].max_steps = (48*2);
|
||||
break;
|
||||
case STARPOINT_144STEPS_DICE :/* STARPOINT 1DCU DICE mechanism */
|
||||
@ -633,6 +123,7 @@ void stepper_config(running_machine *machine, int which, const stepper_interface
|
||||
state_save_register_item(machine, "stepper", NULL, which, step[which].index_start);
|
||||
state_save_register_item(machine, "stepper", NULL, which, step[which].index_end);
|
||||
state_save_register_item(machine, "stepper", NULL, which, step[which].index_patt);
|
||||
state_save_register_item(machine, "stepper", NULL, which, step[which].phase);
|
||||
state_save_register_item(machine, "stepper", NULL, which, step[which].pattern);
|
||||
state_save_register_item(machine, "stepper", NULL, which, step[which].old_pattern);
|
||||
state_save_register_item(machine, "stepper", NULL, which, step[which].step_pos);
|
||||
@ -717,42 +208,40 @@ int stepper_update(int which, UINT8 pattern)
|
||||
{
|
||||
int changed = 0;
|
||||
|
||||
pattern &= 0x0F;
|
||||
|
||||
if ( step[which].pattern != pattern )
|
||||
{ /* pattern changed */
|
||||
int index,
|
||||
steps,
|
||||
int steps,
|
||||
pos;
|
||||
|
||||
if ( step[which].pattern )
|
||||
{
|
||||
step[which].old_pattern = step[which].pattern;
|
||||
}
|
||||
step[which].phase = (step[which].step_pos % 8);
|
||||
step[which].pattern = pattern;
|
||||
|
||||
index = (step[which].old_pattern << 4) | pattern;
|
||||
// index = (step[which].old_pattern << 4) | pattern;
|
||||
switch ( step[which].type )
|
||||
{
|
||||
default:
|
||||
case STARPOINT_48STEP_REEL : /* STARPOINT RMxxx */
|
||||
case STARPOINT_144STEPS_DICE : /* STARPOINT 1DCU DICE mechanism */
|
||||
steps = StarpointStepTab[ index ];
|
||||
steps = StarpointStepTab[step[which].phase][pattern];
|
||||
break;
|
||||
case BARCREST_48STEP_REEL : /* Barcrest reel units have different windings */
|
||||
steps = BarcrestStepTab[ index ];
|
||||
steps = BarcrestStepTab[step[which].phase][pattern];
|
||||
break;
|
||||
case MPU3_48STEP_REEL : /* Same unit as above, but different interface (2 active lines, not 4)*/
|
||||
steps = MPU3StepTab[step[which].phase][pattern];
|
||||
}
|
||||
#if 0 /* Assists with new index generation */
|
||||
if ( which ==0 )popmessage("which %d Index %d Steps %d Pattern Old %02X New %02X\n",which,index,steps,step[which].old_pattern,step[which].pattern);
|
||||
if ( which ==3 )logerror("which %d Index %d Steps %d Phase %d Pattern Old %02X New %02X\n",which,index,steps,(step[which].step_pos % 8),step[which].old_pattern,step[which].pattern);
|
||||
#endif
|
||||
|
||||
if ( steps )
|
||||
{
|
||||
pos = step[which].step_pos + steps;
|
||||
|
||||
if ( pos > step[which].max_steps ) pos -= step[which].max_steps;
|
||||
else if ( pos < 0 ) pos += step[which].max_steps;
|
||||
if ( pos < 0 ) pos += step[which].max_steps;
|
||||
|
||||
step[which].step_pos = pos;
|
||||
update_optic(which);
|
||||
|
@ -24,7 +24,7 @@
|
||||
#define STARPOINT_48STEP_REEL 0 /* STARPOINT RMXXX reel unit */
|
||||
#define BARCREST_48STEP_REEL 1 /* Barcrest bespoke reel unit */
|
||||
#define STARPOINT_144STEPS_DICE 2 /* STARPOINT 1DCU DICE mechanism */
|
||||
|
||||
#define MPU3_48STEP_REEL 3
|
||||
/*------------- Stepper motor interface structure -----------------*/
|
||||
|
||||
typedef struct _stepper_interface stepper_interface;
|
||||
|
@ -10640,6 +10640,7 @@ Other Sun games
|
||||
DRIVER( m_ccelbr )
|
||||
DRIVER( m_gmball )
|
||||
DRIVER( m_grtecp ) /* 199? */
|
||||
DRIVER( m_blsbys ) /* BwB */
|
||||
|
||||
/* MPU5 */
|
||||
DRIVER( m_honmon )
|
||||
|
Loading…
Reference in New Issue
Block a user