mirror of
https://github.com/holub/mame
synced 2025-07-03 09:06:08 +03:00
gambl186: update communication with EEPROM [Peter Ferrie]
service mode works properly, game starts booting. still missing memory banking, so boot hangs.
This commit is contained in:
parent
f7ad401001
commit
86455d8771
@ -20,10 +20,15 @@ U3 Max691cpe
|
|||||||
|
|
||||||
U300 Nec D7759GC (10Mhz xtal near it)
|
U300 Nec D7759GC (10Mhz xtal near it)
|
||||||
|
|
||||||
TODO:
|
In order to get the game to run, follow these steps:
|
||||||
- No idea about how to surpass the "No Funzione" (sic) screen. According to the bad settings almost
|
- enable service mode
|
||||||
surely it wants EEPROM hooked up (i/o at 0x680/0x682?)
|
- run all of the tests (press '1' repeatedly to progress)
|
||||||
|
- at the "cancellare la memoria" prompt, press 'X' to allow it
|
||||||
|
- when the line of '*' appears, press the buttons in the following sequence:
|
||||||
|
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)
|
||||||
|
- if accepted, disable service mode DIP switch
|
||||||
|
- reset machine (press 'F3')
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@ -44,6 +49,10 @@ public:
|
|||||||
int m_comms_state;
|
int m_comms_state;
|
||||||
int m_comms_ind;
|
int m_comms_ind;
|
||||||
UINT8 m_comms_data[1002];
|
UINT8 m_comms_data[1002];
|
||||||
|
int m_comms_cmd;
|
||||||
|
int m_comms_expect;
|
||||||
|
int m_comms_blocks;
|
||||||
|
bool m_comms_ack;
|
||||||
|
|
||||||
DECLARE_READ16_MEMBER(comms_r);
|
DECLARE_READ16_MEMBER(comms_r);
|
||||||
DECLARE_WRITE16_MEMBER(comms_w);
|
DECLARE_WRITE16_MEMBER(comms_w);
|
||||||
@ -58,53 +67,161 @@ static ADDRESS_MAP_START( gambl186_map, AS_PROGRAM, 16, gambl186_state )
|
|||||||
AM_RANGE(0xc0000, 0xfffff) AM_ROM AM_REGION("ipl",0)
|
AM_RANGE(0xc0000, 0xfffff) AM_ROM AM_REGION("ipl",0)
|
||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
|
static const UINT8 password[] = {5, 2, 0, 3, 0, 0, 2, 4, 5, 6, 0x16};
|
||||||
|
|
||||||
READ16_MEMBER(gambl186_state::comms_r)
|
READ16_MEMBER(gambl186_state::comms_r)
|
||||||
{
|
{
|
||||||
|
UINT16 retval = 0;
|
||||||
|
|
||||||
if ((offset == 0) && ACCESSING_BITS_0_7) //port 680 == data
|
if ((offset == 0) && ACCESSING_BITS_0_7) //port 680 == data
|
||||||
{
|
{
|
||||||
if ((m_comms_state == 0x16) && (m_comms_ind < sizeof(m_comms_data)))
|
if (m_comms_state == 0x16) //read mode, just in case
|
||||||
{
|
{
|
||||||
return m_comms_data[m_comms_ind++];
|
if (!m_comms_ind && (m_comms_cmd == 0xff))
|
||||||
|
{
|
||||||
|
m_comms_cmd = m_comms_data[1];
|
||||||
|
|
||||||
|
switch (m_comms_cmd)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
{
|
||||||
|
m_comms_expect = 4;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 1: //unverified
|
||||||
|
case 3: //unverified
|
||||||
|
{
|
||||||
|
m_comms_expect = 8;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
m_comms_expect = 408;
|
||||||
|
m_comms_data[401] = 0x34; //precalc
|
||||||
|
m_comms_blocks = 4;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
{
|
||||||
|
m_comms_expect = 4;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 5: //unverified
|
||||||
|
{
|
||||||
|
m_comms_expect = 7;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 6:
|
||||||
|
{
|
||||||
|
m_comms_expect = 1003;
|
||||||
|
m_comms_data[1001] = 0xec; //precalc
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default: //unverified
|
||||||
|
{
|
||||||
|
m_comms_expect = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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_blocks || !--m_comms_blocks)
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (offset == 1) //port 681 == status
|
else if (offset == 1) //port 681 == status
|
||||||
{
|
{
|
||||||
if (m_comms_state == 0x16) //read mode?
|
if (m_comms_state == 0x16) //read mode
|
||||||
{
|
{
|
||||||
return 2;
|
retval = 2; //read ready
|
||||||
}
|
}
|
||||||
else if (m_comms_state == 0x31) //write mode?
|
else if (m_comms_state == 0x31) //write mode
|
||||||
{
|
{
|
||||||
return 4;
|
retval = 4; //write ready
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE16_MEMBER(gambl186_state::comms_w)
|
WRITE16_MEMBER(gambl186_state::comms_w)
|
||||||
{
|
{
|
||||||
if (offset == 0)
|
if (offset == 0)
|
||||||
{
|
{
|
||||||
if ((m_comms_state == 0x31) && (m_comms_ind < (sizeof(m_comms_data) - 2)))
|
if ((m_comms_state == 0x31) && (m_comms_ind < 1000))
|
||||||
{
|
{
|
||||||
m_comms_data[++m_comms_ind] = (UINT8) ~data;
|
if (!m_comms_ack || (data == 0x15)) //validation failure
|
||||||
|
{
|
||||||
|
if (m_comms_cmd == 6) //1000 bytes transfer
|
||||||
|
{
|
||||||
|
data = ~data;
|
||||||
|
}
|
||||||
|
else if (m_comms_ack)
|
||||||
|
{
|
||||||
|
m_comms_cmd = 0xfe;
|
||||||
|
m_comms_expect = 2;
|
||||||
|
data = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_comms_data[++m_comms_ind] = (UINT8) data;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_comms_ack = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (offset == 1)
|
else if (offset == 1)
|
||||||
{
|
{
|
||||||
if (m_comms_state != data)
|
if (m_comms_state != data) //detect transition
|
||||||
{
|
{
|
||||||
m_comms_ind = 0;
|
m_comms_ind = 0;
|
||||||
|
|
||||||
|
if (data == 0x4e) //reset
|
||||||
|
{
|
||||||
|
m_comms_data[0] = 5; //operation complete
|
||||||
|
m_comms_cmd = 0xff; //none
|
||||||
|
m_comms_expect = 0;
|
||||||
|
m_comms_blocks = 0;
|
||||||
|
m_comms_ack = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_comms_state = data;
|
m_comms_state = data;
|
||||||
|
|
||||||
if (data == 0x4e) //reset?
|
|
||||||
{
|
|
||||||
m_comms_data[0] = 5;
|
|
||||||
m_comms_data[sizeof(m_comms_data) - 1] = 0xec;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user