gambl186: enable payout, improve EEPROM behaviour a bit so Poker is somewhat playable [Peter Ferrie]

This commit is contained in:
Peter Ferrie 2015-05-07 23:42:28 -07:00
parent 7c03cff3a3
commit 1b1ea60108

View File

@ -36,11 +36,11 @@ In order to get the game to run, follow these steps:
1 1 X X 1 1 1 X X X 1 1 X 1 1 1 1 X 1 1 1 1 1 X 1 1 1 1 1 1 X 1 1 X X 1 1 1 X X X 1 1 X 1 1 1 1 X 1 1 1 1 1 X 1 1 1 1 1 1 X
(This is the "password" for the EEPROM. You have three attempts to get it correct, otherwise the service mode will restart) (This is the "password" for the EEPROM. You have three attempts to get it correct, otherwise the service mode will restart)
- if accepted, disable service mode DIP switch - if accepted, disable service mode DIP switch
- reset machine (press 'F3') - reset machine (press 'F3') (watchdog is not implemented)
- if another password prompt appears, just press 'X' 9 times
TODO: TODO:
- watchdog (service mode claims that there's one at the end of the aforementioned procedure); - fix the poker game (casino 10). EEPROM behaviour still buggy.
- fix the poker game (casino 10). seems lack of watchdog.
- sound; - sound;
- proper 3x D71055C emulation. - proper 3x D71055C emulation.
@ -115,41 +115,48 @@ READ16_MEMBER(gambl186_state::comms_r)
break; break;
} }
case 1: //unverified case 1:
case 3: //unverified
{ {
m_comms_expect = 8; m_comms_expect = 12;
m_comms_blocks = 2;
break; break;
} }
case 2: case 2:
{ {
m_comms_expect = 408; m_comms_expect = 408;
m_comms_data[401] = 0x34; //precalc
m_comms_blocks = 4; m_comms_blocks = 4;
break; break;
} }
case 3:
{
m_comms_expect = 7;
m_comms_blocks = 3;
break;
}
case 4: case 4:
{ {
m_comms_expect = 4; m_comms_expect = 2;
m_comms_blocks = 2;
break; break;
} }
case 5: //unverified case 5:
{ {
m_comms_expect = 7; m_comms_expect = 13;
m_comms_blocks = 5;
break; break;
} }
case 6: case 6:
{ {
m_comms_expect = 1003; m_comms_expect = 1003;
m_comms_data[1001] = 0xec; //precalc
break; break;
} }
default: //unverified default: //unknown
{ {
m_comms_expect = 1; m_comms_expect = 1;
} }
@ -158,36 +165,99 @@ READ16_MEMBER(gambl186_state::comms_r)
if (m_comms_ind < sizeof(m_comms_data)) if (m_comms_ind < sizeof(m_comms_data))
{ {
if ((m_comms_cmd == 4) && (m_comms_ind == 1) && !memcmp(m_comms_data, password, sizeof(password)))
{
m_comms_data[1] = 0x55;
m_comms_data[2] = 0x55;
}
retval = m_comms_data[m_comms_ind++];
if (m_comms_expect && !--m_comms_expect) if (m_comms_expect && !--m_comms_expect)
{ {
m_comms_ack = true;
if (m_comms_ind)
{
int i, sum;
for (i = 1, sum = 0; i < m_comms_ind; sum += m_comms_data[i++]);
m_comms_data[m_comms_ind] = (unsigned char) sum;
switch (m_comms_cmd)
{
case 1:
{
if (m_comms_blocks == 2)
{
m_comms_expect = 5;
}
else
{
m_comms_data[m_comms_ind] += 5; //compensate for ack
}
break;
}
case 2:
{
if (m_comms_blocks == 4)
{
m_comms_expect = 5;
}
else
{
m_comms_data[m_comms_ind] += 5; //compensate for ack
m_comms_expect = 3;
}
break;
}
case 3:
{
if (m_comms_blocks == 3)
{
m_comms_expect = 3;
}
else
{
m_comms_data[m_comms_ind] += 5; //compensate for ack
m_comms_expect = 5;
}
break;
}
case 5:
{
m_comms_expect = 3;
if (m_comms_blocks < 5)
{
m_comms_data[m_comms_ind] += 5; //compensate for ack
}
break;
}
default:
{
}
}
}
else if (m_comms_cmd == 4)
{
if (!memcmp(m_comms_data, password, sizeof(password)))
{
m_comms_data[1] = 0x55;
m_comms_data[2] = 0x55;
}
m_comms_expect = 2;
m_comms_ack = false;
}
if (!m_comms_blocks || !--m_comms_blocks) if (!m_comms_blocks || !--m_comms_blocks)
{ {
m_comms_cmd = 0xff; m_comms_cmd = 0xff;
} }
else if (m_comms_cmd == 2)
{
if (m_comms_blocks == 3)
{
m_comms_expect = 5;
m_comms_data[4] = 0x17; //precalc
}
else
{
m_comms_expect = 3;
m_comms_data[2] = 5; //precalc
}
}
m_comms_ack = true;
} }
retval = m_comms_data[m_comms_ind++];
} }
} }
} }
@ -330,7 +400,7 @@ static INPUT_PORTS_START( gambl186 )
PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_COIN6 ) PORT_CODE(KEYCODE_0) PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_COIN6 ) PORT_CODE(KEYCODE_0)
PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_COIN4 ) PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_COIN4 )
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Payout") PORT_CODE(KEYCODE_W)
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Service Key") PORT_CODE(KEYCODE_Q) PORT_TOGGLE PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Service Key") PORT_CODE(KEYCODE_Q) PORT_TOGGLE
PORT_START("IN2") PORT_START("IN2")