calomega.cpp general improvements... [Roberto Fresca, Grull Osgo]

- The PIAs set for each MACHINE_CONFIG were made independent.
 - All the PIAs lines were adapted according to the needs of each platform.
 - All the interrupts were set/placed as indicated in the schematics (903/905).
 - A global hopper was added, currently assigned to platform 906-III,
    but it can be used by other platforms.
 - Worked proper inputs for system 903: Cal Omega - Game 15.7 (Double-Draw Poker).
    The game was promoted to WORKING.
 - Worked proper inputs for system 905: Cal Omega - Game 15.9 (Wild Double-Up).
    The game was promoted to WORKING.

Machines promoted to working
----------------------------
Cal Omega - Game 15.7 (Double-Draw Poker). [Roberto Fresca, Grull Osgo]
Cal Omega - Game 15.9 (Wild Double-Up). [Roberto Fresca, Grull Osgo]
This commit is contained in:
RobertoFresca 2021-04-25 01:17:47 +02:00
parent 96247d322c
commit db9e4f9449
2 changed files with 408 additions and 53 deletions

View File

@ -443,6 +443,20 @@
--------------
[2021-04-24]
General improvements...
- The PIAs set for each MACHINE_CONFIG were made independent.
- All the PIAs lines were adapted according to the needs of each platform.
- All the interrupts were set/placed as indicated in the schematics (903/905).
- A global hopper was added, currently assigned to platform 906-III,
but it can be used by other platforms.
- Worked proper inputs for system 903: Cal Omega - Game 15.7 (Double-Draw Poker).
The game was promoted to WORKING.
- Worked proper inputs for system 905: Cal Omega - Game 15.9 (Wild Double-Up).
The game was promoted to WORKING.
[2021-04-21]
906-III improvements...
@ -705,7 +719,13 @@ uint8_t calomega_state::s903_mux_port_r()
void calomega_state::s903_mux_w(uint8_t data)
{
m_s903_mux_data = data ^ 0xff; // inverted
// bit 7 - bit 6 -bit 5 -bit 4 -> Mux. Scan Lines
m_s903_mux_data = data ^ 0xf0; // inverted
// bit 0 - bit 1 -> Hopper
m_hopper->motor_w(BIT(~data, 0) && BIT(~data, 1));
// bit2 - bit3 -> No connected
}
uint8_t calomega_state::s905_mux_port_r()
@ -723,7 +743,17 @@ uint8_t calomega_state::s905_mux_port_r()
void calomega_state::s905_mux_w(uint8_t data)
{
m_s905_mux_data = data ^ 0xff; // inverted
// Lower nibble
m_s905_mux_data = data ^ 0x0f; // inverted
/* Upper nibble
PIA_1_PB_4 - N.C.
PIA_1_PB_5 - Hopper1.
PIA_1_PB_6 - Hopper2.
PIA_1_PB_7 - Lockout.
*/
m_hopper->motor_w(BIT(~data, 5) && BIT(~data, 6));
m_lockout = BIT(data, 7);
}
@ -742,11 +772,16 @@ void calomega_state::pia0_aout_w(uint8_t data)
void calomega_state::pia0_bout_w(uint8_t data)
{
//logerror("PIA0: Port B out: %02X\n", data);
// Meters???...M1-M5
m_diverter = BIT(data, 3);
m_lockout = BIT(data, 5);
m_hopper->motor_w(BIT(~data, 6) && BIT(~data, 7));
// if(m_hopper) popmessage("HOPPER : %x", data);
}
uint8_t calomega_state::pia1_ain_r()
{
//popmessage("hopper out: %x", m_in0_1->read() & 0x80);
switch( m_s905_mux_data & 0x03 ) // bits 0-3
{
case 0x00: return m_in0_0->read();
@ -760,14 +795,14 @@ uint8_t calomega_state::pia1_ain_r()
uint8_t calomega_state::pia1_bin_r()
{
//logerror("PIA1: Port B in\n");
// logerror("PIA1: Port B in\n");
return 0xff;
}
void calomega_state::pia1_aout_w(uint8_t data)
{
m_s905_mux_data = data >> 6;
//logerror("PIA1: Port A out (906-III mux): %02X\n", m_s905_mux_data);
// logerror("PIA1: Port A out (906-III mux): %02X\n", m_s905_mux_data);
}
void calomega_state::pia1_bout_w(uint8_t data)
@ -794,36 +829,68 @@ void calomega_state::pia1_bout_w(uint8_t data)
m_lamps[6] = BIT(~data, 6); // L7 (unknown)
m_lamps[7] = BIT(~data, 7); // L8 (unknown)
//logerror("PIA1: Port B out: %02X\n", data);
// logerror("PIA1: Port B out: %02X\n", data);
}
TIMER_DEVICE_CALLBACK_MEMBER( calomega_state::timer_a )
TIMER_DEVICE_CALLBACK_MEMBER( calomega_state::timer_0 )
{
m_timera =! m_timera;
m_pia[1]->ca1_w(m_timera);
m_timer = !m_timer;
m_pia[0]->ca1_w(m_timer);
m_pia[0]->read(1); //CRA
// logerror("Timer_0 event : state=%d\n", m_timer);
}
TIMER_DEVICE_CALLBACK_MEMBER( calomega_state::timer_1 )
{
m_timer = !m_timer;
m_pia[1]->cb1_w(m_timer);
// logerror("Timer_1 event (TIMER) : state=%d\n", m_timer);
}
TIMER_DEVICE_CALLBACK_MEMBER( calomega_state::timer_2 )
{
m_timer =! m_timer;
m_pia[1]->ca1_w(m_timer);
m_pia[1]->read(1); // CRA
//logerror("Timer_A event : state=%d\n", m_timera);
// logerror("Timer_2 event : state=%d\n", m_timer);
}
READ_LINE_MEMBER(calomega_state::timera_r)
READ_LINE_MEMBER(calomega_state::timer_r)
{
//logerror("Timer_A read : state=%d\n", m_timera);
return m_timera;
// logerror("timer_1 read : state=%d\n", m_timer);
return m_timer;
}
WRITE_LINE_MEMBER(calomega_state::vblank_w)
WRITE_LINE_MEMBER(calomega_state::vblank0_w)
{
m_vblank = state;
m_pia[0]->read(0);
m_pia[0]->read(0);
m_pia[1]->cb1_w(state);
// m_pia[1]->read(3); // CRB
// logerror("V_BLANK_0 event : state=%d\n", m_vblank);
}
WRITE_LINE_MEMBER(calomega_state::vblank1_w)
{
m_vblank = state;
m_pia[0]->read(2);
m_pia[0]->cb1_w(state);
// logerror("V_BLANK_1 event (sale ): state=%d\n", m_vblank);
}
WRITE_LINE_MEMBER(calomega_state::vblank2_w)
{
m_vblank = state;
m_pia[1]->read(0);
m_pia[1]->read(0);
m_pia[1]->cb1_w(state);
m_pia[1]->read(3); // CRB
//logerror("V_BLANK event : state=%d\n", m_vblank);
// logerror("V_BLANK_2 event : state=%d\n", m_vblank);
}
READ_LINE_MEMBER(calomega_state::vblank_r)
{
//logerror("V_BLANK read : state=%d\n", m_vblank);
// logerror("V_BLANK read : state=%d\n", m_vblank);
return m_vblank;
}
@ -831,9 +898,29 @@ WRITE_LINE_MEMBER(calomega_state::pia1_cb2_w)
{
// Output to L9
m_lamps[8] = ~state; // L9 (Door?)
//logerror("PIA1: CB2: %02X\n", state);
// logerror("PIA1: CB2: %02X\n", state);
}
// Dummy callbacks
uint8_t calomega_state::dummy_pia_r()
{
return 0xff;
}
void calomega_state::dummy_pia_w(uint8_t data)
{
m_pia_data = data;
}
READ_LINE_MEMBER(calomega_state::dummy_pia_line_r)
{
return false;
}
WRITE_LINE_MEMBER(calomega_state::dummy_pia_line_w)
{
}
/******** Lamps debug ********
@ -1300,7 +1387,8 @@ static INPUT_PORTS_START( gdrwpkrd )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("IN0-1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT )
//PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT )
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("hopper", ticket_dispenser_device, line_r)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_GAMBLE_DOOR ) PORT_NAME("Door Open")
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Test Mode") // in some games you need to open the door first
@ -2065,6 +2153,178 @@ static INPUT_PORTS_START( comg128 )
PORT_DIPSETTING( 0x00, "50Hz." )
INPUT_PORTS_END
static INPUT_PORTS_START( comg157 )
PORT_START("IN0-0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(2) PORT_NAME("Coin-In A")
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_GAMBLE_D_UP ) PORT_NAME("Double")
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_DEAL ) PORT_NAME("Deal / Draw")
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_POKER_CANCEL ) PORT_NAME("Cancel")
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("IN0-1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(2) PORT_NAME("Coin-In B")
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_CODE(KEYCODE_9) PORT_NAME("Data / Audit")
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Test Mode")
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("IN0-2")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POKER_HOLD1 ) PORT_NAME("Discard 1")
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_POKER_HOLD2 ) PORT_NAME("Discard 2")
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_POKER_HOLD3 ) PORT_NAME("Discard 3")
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_POKER_HOLD4 ) PORT_NAME("Discard 4")
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_POKER_HOLD5 ) PORT_NAME("Discard 5")
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("IN0-3")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_T) PORT_NAME("Tilt")
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_GAMBLE_BET ) PORT_NAME("Play (Bet)")
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_GAMBLE_TAKE )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_HIGH ) PORT_NAME("Big")
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_GAMBLE_LOW ) PORT_NAME("Small")
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
/* SW1-5 should be wired to PIA0 portA, bit 6.
SW1-6 should be wired to H-POL.
SW1-7 should be wired to V-POL.
*/
PORT_START("SW1") // settings (PIA1), SW2 in schematics
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) // L6
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) // L7
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) // L8
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) // L9
PORT_DIPNAME( 0x30, 0x00, "Minimum Winning Hand") PORT_DIPLOCATION("SW2:1,2")
PORT_DIPSETTING( 0x00, "Jacks or Better" )
PORT_DIPSETTING( 0x20, "Queens or Better" )
PORT_DIPSETTING( 0x30, "Kings or Better" )
PORT_DIPSETTING( 0x10, "Pair of Aces" )
PORT_DIPNAME( 0xC0, 0x80, "Maximum Bet") PORT_DIPLOCATION("SW2:3,4")
PORT_DIPSETTING( 0x00, "1" )
PORT_DIPSETTING( 0x80, "10" )
PORT_DIPSETTING( 0xC0, "20" )
PORT_DIPSETTING( 0x40, "50" )
PORT_START("SW2") // baud (serial 6850-4024), SW1 in schematics
PORT_DIPNAME( 0x3f, 0x08, "Baud Rate" ) PORT_DIPLOCATION("SW1:1,2,3,4,5,6")
PORT_DIPSETTING( 0x01, "300" )
PORT_DIPSETTING( 0x02, "600" )
PORT_DIPSETTING( 0x04, "1200" )
PORT_DIPSETTING( 0x08, "2400" )
PORT_DIPSETTING( 0x10, "4800" )
PORT_DIPSETTING( 0x20, "9600" )
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:7")
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:8")
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_START("SW3") // unknown (ay8912), SW3 in schematics
PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:1")
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:2")
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:3")
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:4")
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:5")
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:6")
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:7")
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:8")
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
INPUT_PORTS_END
static INPUT_PORTS_START( comg159 )
PORT_START("IN0-0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POKER_HOLD1 ) PORT_NAME("Discard 1")
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_POKER_HOLD2 ) PORT_NAME("Discard 2")
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_POKER_HOLD3 ) PORT_NAME("Discard 3")
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_POKER_HOLD4 ) PORT_NAME("Discard 4")
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_POKER_HOLD5 ) PORT_NAME("Discard 5")
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("IN0-1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_BET ) PORT_NAME("Play (Bet)")
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_GAMBLE_DEAL ) PORT_NAME("Deal / Draw")
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Settings (%)") PORT_CODE(KEYCODE_8)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Clr Data") PORT_CODE(KEYCODE_0)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Audit") PORT_CODE(KEYCODE_9)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Test")
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("IN0-2")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POKER_CANCEL ) PORT_NAME("Cancel")
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_GAMBLE_STAND ) PORT_NAME("Stand")
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_NAME("Coin-In A") PORT_IMPULSE(2)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_NAME("Coin-In B") PORT_IMPULSE(2)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("IN0-3")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Tilt") PORT_CODE(KEYCODE_T)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_GAMBLE_TAKE )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_GAMBLE_D_UP ) PORT_NAME("Double")
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_HIGH ) PORT_NAME("Big")
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_GAMBLE_LOW ) PORT_NAME("Small")
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
// For System 905, SW1 uses the whole PIA1 portA.
PORT_START("SW1") // settings (PIA1)
PORT_DIPNAME( 0x01, 0x01, "Game Type" ) PORT_DIPLOCATION("SW1:1")
PORT_DIPSETTING( 0x01, "Hold" )
PORT_DIPSETTING( 0x00, "Discard" )
PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:2")
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:3")
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:4")
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x30, 0x30, "Pay Table" ) PORT_DIPLOCATION("SW1:5,6")
PORT_DIPSETTING( 0x30, "250/100/25/10/8/5/4/3/2/1" )
PORT_DIPSETTING( 0x20, "500/200/40/10/8/5/4/3/2/1" )
PORT_DIPSETTING( 0x00, "500/250/50/20/8/6/4/3/2/1" )
PORT_DIPSETTING( 0x10, "500/250/50/25/10/8/5/3/2/1" )
PORT_DIPNAME( 0xc0, 0xc0, "Low Winning Pair" ) PORT_DIPLOCATION("SW1:7,8")
PORT_DIPSETTING( 0x00, "Jacks" )
PORT_DIPSETTING( 0x80, "Queens" )
PORT_DIPSETTING( 0xc0, "Kings" )
PORT_DIPSETTING( 0x40, "Aces" )
INPUT_PORTS_END
static INPUT_PORTS_START( elgrande )
PORT_START("IN0-0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(2)
@ -2361,7 +2621,8 @@ static INPUT_PORTS_START( stand906 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("IN0-1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) PORT_IMPULSE(2) PORT_NAME("Coin Out")
//PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) PORT_IMPULSE(10) PORT_NAME("Coin Out")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("hopper", ticket_dispenser_device, line_r)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_CODE(KEYCODE_H) PORT_NAME("Hopper Weight") PORT_TOGGLE
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_GAMBLE_DOOR ) PORT_NAME("Door") PORT_TOGGLE
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_CODE(KEYCODE_9) PORT_NAME("Menu")
@ -2370,6 +2631,7 @@ static INPUT_PORTS_START( stand906 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("IN0-2")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POKER_HOLD1 ) PORT_NAME("Discard 1")
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_POKER_HOLD2 ) PORT_NAME("Discard 2")
@ -2898,27 +3160,37 @@ void calomega_state::sys903(machine_config &config)
// basic machine hardware
M6502(config, m_maincpu, CPU_CLOCK); // confirmed
m_maincpu->set_addrmap(AS_PROGRAM, &calomega_state::sys903_map);
m_maincpu->set_vblank_int("screen", FUNC(calomega_state::irq0_line_hold));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
PIA6821(config, m_pia[0], 0);
m_pia[0]->readpa_handler().set(FUNC(calomega_state::s903_mux_port_r));
m_pia[0]->readpb_handler().set(FUNC(calomega_state::dummy_pia_r)); // Debug: some dipsw maybe???
m_pia[0]->writepa_handler().set(FUNC(calomega_state::dummy_pia_w)); // Debug: to assign lamps/counters/solenids/hopper????
m_pia[0]->writepb_handler().set(FUNC(calomega_state::lamps_903a_w));
m_pia[0]->readca1_handler().set(FUNC(calomega_state::timer_r)); // Timer Interrupt Ack. (CPU -> PIA)
m_pia[0]->irqa_handler().set_inputline("maincpu", M6502_IRQ_LINE); // Timer Interrupt Event. (PIA -> CPU)
PIA6821(config, m_pia[1], 0);
m_pia[1]->readpa_handler().set_ioport("SW1");
m_pia[1]->readpb_handler().set(FUNC(calomega_state::dummy_pia_r)); // Debug: so much need to read????? :)
m_pia[1]->writepa_handler().set(FUNC(calomega_state::lamps_903b_w));
m_pia[1]->writepb_handler().set(FUNC(calomega_state::s903_mux_w));
m_pia[1]->writepb_handler().set(FUNC(calomega_state::s903_mux_w)); // Mux. Scan Lines.(Upper nibble) - Hopper b0-b1 (Lower Nibble).
m_pia[1]->ca2_handler().set(FUNC(calomega_state::dummy_pia_line_w)); //
m_pia[1]->cb2_handler().set(FUNC(calomega_state::dummy_pia_line_w)); //
m_pia[1]->readcb1_handler().set(FUNC(calomega_state::vblank_r)); // V_BLANK Interrupt Ack. (CPU -> PIA)
m_pia[1]->irqb_handler().set_inputline("maincpu", M6502_IRQ_LINE); // V_BLANK Interrupt Event. (PIA -> CPU)
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_vblank_time(ATTOSECONDS_IN_USEC(100));
screen.set_size((39+1)*8, (31+1)*8); // Taken from MC6845 init, registers 00 & 04. Normally programmed with (value-1).
screen.set_visarea(0*8, 32*8-1, 0*8, 31*8-1); // Taken from MC6845 init, registers 01 & 06.
screen.set_screen_update(FUNC(calomega_state::screen_update_calomega));
screen.screen_vblank().set(FUNC(calomega_state::vblank0_w));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_calomega);
PALETTE(config, m_palette, FUNC(calomega_state::calomega_palette), 256);
@ -2939,6 +3211,10 @@ void calomega_state::sys903(machine_config &config)
clock_device &aciabaud(CLOCK(config, "aciabaud", UART_CLOCK));
aciabaud.signal_handler().set(FUNC(calomega_state::write_acia_clock));
TIMER(config, "timer_0").configure_periodic(FUNC(calomega_state::timer_0), attotime::from_hz(550*2)); // (time*2) - Each timer pulse -> half period
HOPPER(config, m_hopper, attotime::from_msec(50), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH );
}
@ -2966,14 +3242,38 @@ void calomega_state::sys905(machine_config &config)
m_maincpu->set_addrmap(AS_PROGRAM, &calomega_state::sys905_map);
m_pia[0]->readpa_handler().set(FUNC(calomega_state::s905_mux_port_r));
m_pia[0]->writepb_handler().set(FUNC(calomega_state::lamps_905_w));
// video hardware
screen_device &screen(SCREEN(config.replace(), "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(100));
screen.set_size((39+1)*8, (31+1)*8); // Taken from MC6845 init, registers 00 & 04. Normally programmed with (value-1).
screen.set_visarea(0*8, 32*8-1, 0*8, 31*8-1); // Taken from MC6845 init, registers 01 & 06.
screen.set_screen_update(FUNC(calomega_state::screen_update_calomega));
m_pia[1]->writepb_handler().set(FUNC(calomega_state::s905_mux_w));
screen.screen_vblank().set(FUNC(calomega_state::vblank1_w));
PIA6821(config.replace(), m_pia[0], 0);
m_pia[0]->readpa_handler().set(FUNC(calomega_state::s905_mux_port_r)); // Mux. Button read.
m_pia[0]->writepa_handler().set(FUNC(calomega_state::dummy_pia_w)); // Bit 7 & 6 as output. (Watchdog & Bat. Test control) - Ignored
m_pia[0]->writepb_handler().set(FUNC(calomega_state::lamps_905_w)); // Full Lamps - OK.
m_pia[0]->readcb1_handler().set(FUNC(calomega_state::vblank_r)); // V_BLANK Interrupt Ack. (CPU -> PIA)
m_pia[0]->cb2_handler().set(FUNC(calomega_state::dummy_pia_line_w)); // No connected (from schematics).
m_pia[0]->irqb_handler().set_inputline("maincpu", M6502_IRQ_LINE); // V_BLANK Interrupt Event. (PIA -> CPU)
PIA6821(config.replace(), m_pia[1], 0);
m_pia[1]->readpa_handler().set_ioport("SW1"); // Full port.
//m_pia[1]->readpb_handler().set(FUNC(calomega_state::dummy_pia_r)); // Debug: so much need to read????? :)
//m_pia[1]->writepa_handler().set(FUNC(calomega_state::dummy_pia_w)); // Debug: to assign lamps/counters/solenids/hopper????
m_pia[1]->writepb_handler().set(FUNC(calomega_state::s905_mux_w)); // Mux. Scan Lines.(Lower Nibble). Hopper & Coin Lockout (Upper nibble).
m_pia[1]->readcb1_handler().set(FUNC(calomega_state::timer_r)); // Timer Interrupt Ack. (CPU -> PIA)
m_pia[1]->cb2_handler().set(FUNC(calomega_state::dummy_pia_line_w)); // No connected (from schematics).
m_pia[1]->irqb_handler().set_inputline("maincpu", M6502_IRQ_LINE); // Timer Interrupt Event. (PIA -> CPU)
// sound hardware
subdevice<ay8912_device>("ay8912")->port_a_read_callback().set_constant(0);
TIMER(config.replace(), "timer_0").configure_periodic(FUNC(calomega_state::timer_1), attotime::from_hz(520*2)); // (time*2) - Each timer pulse -> half period
config.device_remove("acia6850_0");
config.device_remove("aciabaud");
}
@ -2985,7 +3285,6 @@ void calomega_state::sys906(machine_config &config)
// basic machine hardware
R65C02(config.replace(), m_maincpu, CPU_CLOCK); // confirmed
m_maincpu->set_addrmap(AS_PROGRAM, &calomega_state::sys906_map);
// m_maincpu->sync_cb().set(FUNC(calomega_state::cpu_sync));
screen_device &screen(SCREEN(config.replace(), "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
@ -2994,22 +3293,25 @@ void calomega_state::sys906(machine_config &config)
screen.set_visarea(0*8, 32*8-1, 0*8, 31*8-1); // Taken from MC6845 init, registers 01 & 06.
screen.set_screen_update(FUNC(calomega_state::screen_update_calomega));
screen.screen_vblank().set(FUNC(calomega_state::vblank_w));
m_pia[0]->readpa_handler().set_ioport("SW1");
m_pia[0]->readpb_handler().set(FUNC(calomega_state::pia0_bin_r));
m_pia[0]->writepa_handler().set(FUNC(calomega_state::pia0_aout_w));
m_pia[0]->writepb_handler().set(FUNC(calomega_state::pia0_bout_w));
screen.screen_vblank().set(FUNC(calomega_state::vblank2_w));
PIA6821(config.replace(), m_pia[0], 0);
m_pia[0]->readpa_handler().set_ioport("SW1"); // Bit 7 - CGBANK ???? input?-output?
//m_pia[0]->readpb_handler().set(FUNC(calomega_state::pia0_bin_r)); // No inputs on port_B
m_pia[0]->ca2_handler().set(FUNC(calomega_state::dummy_pia_line_w)); // Ignored
m_pia[0]->cb2_handler().set(FUNC(calomega_state::dummy_pia_line_w)); // Diverter
m_pia[0]->writepa_handler().set(FUNC(calomega_state::pia0_aout_w)); // Bit 7 - CGBANK ???? input?-output?
m_pia[0]->writepb_handler().set(FUNC(calomega_state::pia0_bout_w)); // Meters ??? (M1-M5), coils, hopper
m_pia[1]->readpa_handler().set(FUNC(calomega_state::pia1_ain_r));
PIA6821(config.replace(), m_pia[1], 0);
m_pia[1]->readpa_handler().set(FUNC(calomega_state::pia1_ain_r)); // Mux. Button read.
m_pia[1]->readpb_handler().set(FUNC(calomega_state::pia1_bin_r));
m_pia[1]->readca1_handler().set(FUNC(calomega_state::timera_r));
m_pia[1]->readcb1_handler().set(FUNC(calomega_state::vblank_r));
m_pia[1]->writepa_handler().set(FUNC(calomega_state::pia1_aout_w));
m_pia[1]->writepb_handler().set(FUNC(calomega_state::pia1_bout_w));
m_pia[1]->cb2_handler().set(FUNC(calomega_state::pia1_cb2_w));
m_pia[1]->irqa_handler().set_inputline("maincpu", M6502_IRQ_LINE);
m_pia[1]->irqb_handler().set_inputline("maincpu", M6502_IRQ_LINE);
m_pia[1]->readca1_handler().set(FUNC(calomega_state::timer_r)); // Timer Interrupt Ack. (CPU -> PIA)
m_pia[1]->readcb1_handler().set(FUNC(calomega_state::vblank_r)); // V_BLANK Interrupt Ack. (CPU -> PIA)
m_pia[1]->writepa_handler().set(FUNC(calomega_state::pia1_aout_w)); // Mux. Scan lines
m_pia[1]->writepb_handler().set(FUNC(calomega_state::pia1_bout_w)); // Lamps 1 to 8
m_pia[1]->cb2_handler().set(FUNC(calomega_state::pia1_cb2_w)); // V_BLANK interrupt line input (from Vertical Synch)
m_pia[1]->irqa_handler().set_inputline("maincpu", M6502_IRQ_LINE); // Timer Interrupt Event. (PIA -> CPU)
m_pia[1]->irqb_handler().set_inputline("maincpu", M6502_IRQ_LINE); // V_BLANK Interrupt Event. (PIA -> CPU)
m_gfxdecode->set_info(gfx_sys906);
@ -3018,7 +3320,7 @@ void calomega_state::sys906(machine_config &config)
ay8912.port_a_read_callback().set_ioport("SW2"); // from schematics
ay8912.add_route(ALL_OUTPUTS, "mono", 0.75);
TIMER(config, "timer_a").configure_periodic(FUNC(calomega_state::timer_a), attotime::from_hz(610));
TIMER(config.replace(), "timer_0").configure_periodic(FUNC(calomega_state::timer_2), attotime::from_hz(380*2)); // (time*2) - Each timer pulse -> half period
}
@ -4116,6 +4418,39 @@ void calomega_state::init_pokeriwc()
PRGROM[0x8000] = 0xa2; // Checksum flag. No changes for now.
}
void calomega_state::init_any()
{
uint8_t *PRGROM = memregion( "maincpu" )->base();
PRGROM[0x2e30] = 0xe0; //fix bad dump
PRGROM[0x2e31] = 0x12;
PRGROM[0x2e32] = 0x90;
PRGROM[0x2e33] = 0xf2;
PRGROM[0x2e34] = 0xad;
PRGROM[0x2e35] = 0xc4;
PRGROM[0x2e36] = 0x08;
PRGROM[0x2e37] = 0x29;
PRGROM[0x2e38] = 0x80;
PRGROM[0x2e39] = 0xd0;
PRGROM[0x2e3a] = 0x13;
PRGROM[0x2e3b] = 0xa0;
PRGROM[0x2e3c] = 0x00;
PRGROM[0x2e3d] = 0xa2;
PRGROM[0x2e3e] = 0x04;
PRGROM[0x2e3f] = 0xb9;
PRGROM[0x2e40] = 0x61;
PRGROM[0x2dd6] = 0x10;
PRGROM[0x2dd7] = 0x99;
PRGROM[0x2dd8] = 0x60;
PRGROM[0x2dd9] = 0x11;
PRGROM[0x2ddd] = 0x99;
}
/*************************************************
* Game Drivers *
@ -4124,7 +4459,7 @@ void calomega_state::init_pokeriwc()
// YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS */
GAME( 1981, comg074, 0, sys903, comg074, calomega_state, init_sys903, ROT0, "Cal Omega Inc.", "Cal Omega - Game 7.4 (Gaming Poker, W.Export)", MACHINE_SUPPORTS_SAVE )
GAME( 1981, comg076, 0, sys903, comg076, calomega_state, init_sys903, ROT0, "Cal Omega Inc.", "Cal Omega - Game 7.6 (Arcade Poker)", MACHINE_SUPPORTS_SAVE )
GAME( 1981, comg079, 0, sys903, comg076, calomega_state, init_sys903, ROT0, "Cal Omega Inc.", "Cal Omega - Game 7.9 (Arcade Poker)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) /* bad dump */
GAME( 1981, comg079, 0, sys903, comg076, calomega_state, init_any , ROT0, "Cal Omega Inc.", "Cal Omega - Game 7.9 (Arcade Poker)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) /* bad dump */
GAME( 1981, comg080, 0, sys903, arcadebj, calomega_state, init_comg080, ROT0, "Cal Omega Inc.", "Cal Omega - Game 8.0 (Arcade Black Jack)", MACHINE_SUPPORTS_SAVE ) /* bad dump */
GAME( 1981, comg094, 0, sys903, stand903, calomega_state, init_sys903, ROT0, "Cal Omega Inc.", "Cal Omega - Game 9.4 (Keno)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
GAME( 1982, comg107, 0, sys903, stand903, calomega_state, init_sys903, ROT0, "Cal Omega Inc.", "Cal Omega - Game 10.7c (Big Game)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
@ -4134,8 +4469,8 @@ GAME( 1982, comg127, 0, sys903, stand903, calomega_state, init_sys903,
GAME( 1982, comg128, 0, sys903, comg128, calomega_state, init_sys903, ROT0, "Cal Omega Inc.", "Cal Omega - Game 12.8 (Arcade Game)", MACHINE_SUPPORTS_SAVE )
GAME( 1982, comg134, 0, sys903, stand903, calomega_state, init_sys903, ROT0, "Cal Omega Inc.", "Cal Omega - Game 13.4 (Nudge Bingo)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
GAME( 1982, comg145, 0, sys903, stand903, calomega_state, init_sys903, ROT0, "Cal Omega Inc.", "Cal Omega - Game 14.5 (Pixels)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
GAME( 1983, comg157, 0, sys903, stand903, calomega_state, init_sys903, ROT0, "Cal Omega Inc.", "Cal Omega - Game 15.7 (Double-Draw Poker)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
GAME( 1983, comg159, 0, sys905, stand905, calomega_state, init_sys905, ROT0, "Cal Omega Inc.", "Cal Omega - Game 15.9 (Wild Double-Up)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
GAME( 1983, comg157, 0, sys903, comg157, calomega_state, init_sys903, ROT0, "Cal Omega Inc.", "Cal Omega - Game 15.7 (Double-Draw Poker)", MACHINE_SUPPORTS_SAVE )
GAME( 1983, comg159, 0, sys905, comg159, calomega_state, init_sys905, ROT0, "Cal Omega Inc.", "Cal Omega - Game 15.9 (Wild Double-Up)", MACHINE_SUPPORTS_SAVE )
GAME( 1983, comg164, 0, sys903, stand903, calomega_state, init_sys903, ROT0, "Cal Omega Inc.", "Cal Omega - Game 16.4 (Keno)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) /* incomplete dump */
GAME( 1983, comg168, 0, sys903, stand903, calomega_state, init_sys903, ROT0, "Cal Omega Inc.", "Cal Omega - Game 16.8 (Keno)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
GAME( 1983, comg172, 0, sys905, stand905, calomega_state, init_sys905, ROT0, "Cal Omega Inc.", "Cal Omega - Game 17.2 (Double Double Poker)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )

View File

@ -13,6 +13,7 @@
#include "machine/6821pia.h"
#include "machine/6850acia.h"
#include "machine/clock.h"
#include "machine/ticket.h"
#include "sound/ay8910.h"
#include "video/mc6845.h"
#include "screen.h"
@ -33,6 +34,7 @@ public:
m_palette(*this, "palette"),
m_videoram(*this, "videoram"),
m_colorram(*this, "colorram"),
m_hopper(*this, "hopper"),
m_in0(*this, "IN0"),
m_in0_0(*this, "IN0-0"),
m_in0_1(*this, "IN0-1"),
@ -51,7 +53,7 @@ public:
void init_comg5108();
void init_cas21iwc();
void init_pokeriwc();
void init_any();
void sys905(machine_config &config);
void s903mod(machine_config &config);
@ -72,23 +74,35 @@ private:
uint8_t pia0_bin_r();
void pia0_aout_w(uint8_t data);
void pia0_bout_w(uint8_t data);
TIMER_DEVICE_CALLBACK_MEMBER(timer_a);
DECLARE_READ_LINE_MEMBER(timera_r);
DECLARE_READ_LINE_MEMBER(vblank_r);
DECLARE_WRITE_LINE_MEMBER(pia1_cb2_w);
uint8_t pia1_ain_r();
uint8_t pia1_bin_r();
uint8_t dummy_pia_r();
void pia1_aout_w(uint8_t data);
void pia1_bout_w(uint8_t data);
void lamps_903a_w(uint8_t data);
void lamps_903b_w(uint8_t data);
void lamps_905_w(uint8_t data);
DECLARE_WRITE_LINE_MEMBER(vblank_w);
void dummy_pia_w(uint8_t data);
DECLARE_READ_LINE_MEMBER(timer_r);
DECLARE_READ_LINE_MEMBER(vblank_r);
DECLARE_READ_LINE_MEMBER(dummy_pia_line_r);
DECLARE_WRITE_LINE_MEMBER(pia1_cb2_w);
DECLARE_WRITE_LINE_MEMBER(vblank0_w);
DECLARE_WRITE_LINE_MEMBER(vblank1_w);
DECLARE_WRITE_LINE_MEMBER(vblank2_w);
DECLARE_WRITE_LINE_MEMBER(dummy_pia_line_w);
DECLARE_WRITE_LINE_MEMBER(write_acia_tx);
DECLARE_WRITE_LINE_MEMBER(write_acia_clock);
DECLARE_WRITE_LINE_MEMBER(update_aciabaud_scale);
TIMER_DEVICE_CALLBACK_MEMBER(timer_0);
TIMER_DEVICE_CALLBACK_MEMBER(timer_1);
TIMER_DEVICE_CALLBACK_MEMBER(timer_2);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
uint32_t screen_update_calomega(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void calomega_palette(palette_device &palette) const;
@ -105,8 +119,11 @@ private:
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_colorram;
required_device<ticket_dispenser_device> m_hopper;
optional_ioport m_in0;
optional_ioport m_in0_0;
@ -117,9 +134,12 @@ private:
optional_ioport m_sw2;
output_finder<9> m_lamps;
uint8_t m_vblank, m_timera, m_tx_line;
uint8_t m_vblank, m_timer, m_tx_line;
int m_s903_mux_data;
int m_s905_mux_data;
int m_pia_data;
bool m_lockout = false;
bool m_diverter;
tilemap_t *m_bg_tilemap;
};