savant: add redumped roms (nw)

This commit is contained in:
hap 2019-06-27 20:39:38 +02:00
parent 7b527e621f
commit 988a62c4f7

View File

@ -18,8 +18,7 @@ The display (both the LCD and the sensors) didn't last long, probably none exist
anymore in original working order.
TODO:
- doesn't work, Z80 side stops communicating and gets in an infinite loop
- hook up inputs
- get rid of m_wait_in hack when Z80 core accurately emulates WAIT pin
- internal artwork
******************************************************************************/
@ -101,6 +100,7 @@ private:
DECLARE_WRITE8_MEMBER(lcd_w);
DECLARE_READ8_MEMBER(input_r);
bool m_wait_in;
u8 m_inp_mux;
u8 m_databus;
u8 m_control;
@ -110,12 +110,14 @@ private:
void savant_state::machine_start()
{
// zerofill
m_wait_in = false;
m_inp_mux = 0;
m_databus = 0;
m_control = 0;
m_lcd_data = 0;
// register for savestates
save_item(NAME(m_wait_in));
save_item(NAME(m_inp_mux));
save_item(NAME(m_databus));
save_item(NAME(m_control));
@ -136,21 +138,24 @@ READ8_MEMBER(savant_state::nvram_r)
return m_nvram[offset] & 0xf;
}
READ8_MEMBER(savant_state::stall_r)
{
// TODO: seen in disasm
return 0;
}
WRITE8_MEMBER(savant_state::stall_w)
{
// any access to port C0 puts the Z80 into WAIT, sets BUSRQ, and sets MCU EXT INT
m_databus = data;
m_databus = offset >> 8;
m_psu->ext_int_w(1);
m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, ASSERT_LINE);
m_maincpu->set_input_line(Z80_INPUT_LINE_BUSRQ, ASSERT_LINE);
}
READ8_MEMBER(savant_state::stall_r)
{
m_wait_in = true;
stall_w(space, offset, 0);
// return value is databus (see control_w)
return 0;
}
READ8_MEMBER(savant_state::mcustatus_r)
{
// d0: MCU P1.2
@ -191,18 +196,22 @@ READ8_MEMBER(savant_state::control_r)
WRITE8_MEMBER(savant_state::control_w)
{
// d0: clear EXT INT, clear Z80 WAIT
if (~data & m_control & 1)
if (data & ~m_control & 1)
{
m_psu->ext_int_w(0);
m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE);
// hack to set Z80 A after IN A,($C0)
if (m_wait_in)
{
m_maincpu->set_state_int(Z80_A, m_databus);
m_wait_in = false;
}
}
// d1: clear Z80 BUSRQ
if (~data & m_control & 2)
{
//m_maincpu->set_state_int(Z80_A, m_databus);
if (data & ~m_control & 2)
m_maincpu->set_input_line(Z80_INPUT_LINE_BUSRQ, CLEAR_LINE);
}
// d2: return data for Z80
@ -242,14 +251,12 @@ READ8_MEMBER(savant_state::input_r)
if (BIT(m_inp_mux, i))
data |= m_board->read_rank(i);
data = bitswap<8>(data,0,1,2,3,7,6,5,4);
// read keypad
for (int i = 0; i < 3; i++)
if (BIT(m_control >> 5, i))
data |= m_inputs[i]->read();
return data;
return bitswap<8>(data,3,2,1,0,4,5,6,7);
}
@ -267,13 +274,12 @@ void savant_state::main_map(address_map &map)
void savant_state::main_io(address_map &map)
{
map.global_mask(0xff);
map(0xc0, 0xc0).mirror(0x38).rw(FUNC(savant_state::stall_r), FUNC(savant_state::stall_w));
map(0xc1, 0xc1).mirror(0x38).unmapw(); // clock
map(0xc2, 0xc2).mirror(0x38).unmapw(); // printer
map(0xc3, 0xc3).mirror(0x38).unmapr(); // printer
map(0xc4, 0xc4).mirror(0x38).r(FUNC(savant_state::mcustatus_r));
map(0xc5, 0xc5).mirror(0x38).unmapw(); // printer
map(0xc0, 0xc0).mirror(0x0038).select(0xff00).rw(FUNC(savant_state::stall_r), FUNC(savant_state::stall_w));
map(0xc1, 0xc1).mirror(0xff38).unmapw(); // clock
map(0xc2, 0xc2).mirror(0xff38).unmapw(); // printer
map(0xc3, 0xc3).mirror(0xff38).unmapr(); // printer
map(0xc4, 0xc4).mirror(0xff38).r(FUNC(savant_state::mcustatus_r));
map(0xc5, 0xc5).mirror(0xff38).unmapw(); // printer
}
void savant_state::mcu_map(address_map &map)
@ -297,34 +303,34 @@ void savant_state::mcu_io(address_map &map)
static INPUT_PORTS_START( savant )
PORT_START("IN.0")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1)
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2)
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3)
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4)
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5)
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6)
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7)
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8)
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Review")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("Print Board")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Sound on/off / Knight")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("Solve Mate")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("Show Moves")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("Form Size")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Best Move / Bishop")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("Clear Board")
PORT_START("IN.1")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q)
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W)
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E)
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R)
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T)
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y)
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U)
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I)
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("Trace Forward")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Print List")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Set Rate / Rook")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("Classic Game")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Return")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Auto Play")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Mate Alert / Queen")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("Change Color")
PORT_START("IN.2")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A)
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S)
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D)
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F)
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G)
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H)
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J)
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K)
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("Trace Back")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Print Moves")
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("Set Level / Pawn")
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("New Game")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("Go")
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("Hint")
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("Promote")
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("Set Up")
INPUT_PORTS_END
@ -385,9 +391,9 @@ void savant_state::savant(machine_config &config)
ROM_START( savant )
ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD("5605_1f_orange.u13", 0x0000, 0x2000, CRC(1feb8e29) SHA1(1c9a9f6ca7b02ea002ea9dc07b0870b3b0a4cdb9) ) // TMM2364
ROM_LOAD("5606_1g_white.u14", 0x2000, 0x2000, CRC(9d95cf14) SHA1(eb29774d05c2f17b54363417297e535b4217e222) ) // "
ROM_LOAD("5607_1e_blue.u15", 0x4000, 0x2000, CRC(131fb097) SHA1(2423d369cc9d9c62e6040e7c34941833f7ec7aa0) ) // "
ROM_LOAD("5605_1f_orange.u13", 0x0000, 0x2000, CRC(0f24fd37) SHA1(b9426b53623d2a98aa2b3099010a7579b0f51db5) ) // TMM2364
ROM_LOAD("5606_1g_white.u14", 0x2000, 0x2000, CRC(e8b2eddd) SHA1(5f148a3c1c2cd099bd19a48d972a01e5e26ef2ff) ) // "
ROM_LOAD("5607_1e_blue.u15", 0x4000, 0x2000, CRC(a07f845a) SHA1(e45218fdf955777e571a71ae9d501567b760a3c0) ) // "
// 3 more ROM sockets not populated(yellow, red, gold), manual mentions possible expansion
ROM_REGION( 0x0800, "mcu", 0 )