summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2019-04-06 21:22:57 +0200
committer hap <happppp@users.noreply.github.com>2019-04-06 21:23:15 +0200
commitcaa8d04cedddb816a2d0093ecfd544dc589640ed (patch)
treeed1b85ce89f7765eee5ce4626b100c416019431d
parentd890319806a9ed64215a55f2e52d077c0a56a33b (diff)
New softwarelist additions
----------- intellect02: Chess (4 levels) [hap, Berger]
-rw-r--r--hash/intellect02.xml17
-rw-r--r--src/devices/machine/i8255.cpp10
-rw-r--r--src/devices/machine/i8255.h2
-rw-r--r--src/mame/drivers/fidel_cc1.cpp1
-rw-r--r--src/mame/drivers/fidel_elite.cpp1
-rw-r--r--src/mame/drivers/hh_tms1k.cpp2
-rw-r--r--src/mame/drivers/intellect02.cpp60
-rw-r--r--src/mame/drivers/novag_diablo.cpp3
-rw-r--r--src/mame/layout/intellect02.lay6
9 files changed, 64 insertions, 38 deletions
diff --git a/hash/intellect02.xml b/hash/intellect02.xml
index 7868afb4859..c5edb7a8311 100644
--- a/hash/intellect02.xml
+++ b/hash/intellect02.xml
@@ -6,12 +6,23 @@
<!-- Intellect-02 Cartridges -->
<software name="chess">
- <description>Chess</description>
- <year>1985</year>
+ <description>Chess (3 levels)</description>
+ <year>1986</year>
<publisher>BREA Research Institute</publisher>
<part name="cart" interface="intellect02">
<dataarea name="rom" size="0x2000">
- <rom name="chess.bin" size="0x2000" crc="81691aac" sha1="2f358fd8f1f1b0d886a728155a01ce61f0d6c39b" offset="0x0000" />
+ <rom name="chess.bin" size="0x2000" crc="81691aac" sha1="2f358fd8f1f1b0d886a728155a01ce61f0d6c39b" offset="0x0000" /> <!-- КР568РЕ20003, 8612 -->
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="chess2">
+ <description>Chess (4 levels)</description>
+ <year>1989</year>
+ <publisher>BREA Research Institute</publisher>
+ <part name="cart" interface="intellect02">
+ <dataarea name="rom" size="0x2000">
+ <rom name="chess2.bin" size="0x2000" crc="7058e18f" sha1="f1e61eeb752aafbd3c9f4d288ee3e73cc9a74496" offset="0x0000" /> <!-- КР568РЕ2-0004, 8907 -->
</dataarea>
</part>
</software>
diff --git a/src/devices/machine/i8255.cpp b/src/devices/machine/i8255.cpp
index 9023e1ddd19..212eeda644f 100644
--- a/src/devices/machine/i8255.cpp
+++ b/src/devices/machine/i8255.cpp
@@ -229,6 +229,7 @@ i8255_device::i8255_device(const machine_config &mconfig, device_type type, cons
, m_out_pc_cb(*this)
, m_tri_pa_cb(*this)
, m_tri_pb_cb(*this)
+ , m_tri_pc_cb(*this)
, m_control(0)
, m_intr{ 0, 0 }
{
@@ -250,6 +251,7 @@ void i8255_device::device_resolve_objects()
m_out_pc_cb.resolve_safe();
m_tri_pa_cb.resolve_safe(0xff);
m_tri_pb_cb.resolve_safe(0xff);
+ m_tri_pc_cb.resolve_safe(0xff);
}
//-------------------------------------------------
@@ -522,8 +524,8 @@ void i8255_device::output_pc()
}
else
{
- // TTL inputs float high
- data |= 0xf0;
+ // TTL inputs floating
+ data |= m_tri_pc_cb(0) & 0xf0;
}
break;
@@ -560,8 +562,8 @@ void i8255_device::output_pc()
}
else
{
- // TTL inputs float high
- data |= b_mask;
+ // TTL inputs floating
+ data |= m_tri_pc_cb(0) & b_mask;
}
break;
diff --git a/src/devices/machine/i8255.h b/src/devices/machine/i8255.h
index 73dedb92712..44a4dc72e5f 100644
--- a/src/devices/machine/i8255.h
+++ b/src/devices/machine/i8255.h
@@ -57,6 +57,7 @@ public:
// output state when pins are in tri-state, default 0xff
auto tri_pa_callback() { return m_tri_pa_cb.bind(); }
auto tri_pb_callback() { return m_tri_pb_cb.bind(); }
+ auto tri_pc_callback() { return m_tri_pc_cb.bind(); }
uint8_t read(offs_t offset);
void write(offs_t offset, uint8_t data );
@@ -117,6 +118,7 @@ private:
devcb_read8 m_tri_pa_cb;
devcb_read8 m_tri_pb_cb;
+ devcb_read8 m_tri_pc_cb;
uint8_t m_control; // mode control word
uint8_t m_output[3]; // output latch
diff --git a/src/mame/drivers/fidel_cc1.cpp b/src/mame/drivers/fidel_cc1.cpp
index cfee2fdda67..b52763562d2 100644
--- a/src/mame/drivers/fidel_cc1.cpp
+++ b/src/mame/drivers/fidel_cc1.cpp
@@ -191,6 +191,7 @@ void cc1_state::cc1(machine_config &config)
m_ppi8255->out_pb_callback().set(FUNC(cc1_state::ppi_portb_w));
m_ppi8255->tri_pb_callback().set_constant(0);
m_ppi8255->out_pc_callback().set(FUNC(cc1_state::ppi_portc_w));
+ m_ppi8255->tri_pc_callback().set_constant(0);
TIMER(config, "delay").configure_generic(timer_device::expired_delegate());
diff --git a/src/mame/drivers/fidel_elite.cpp b/src/mame/drivers/fidel_elite.cpp
index 65dc0419162..516cdfc1171 100644
--- a/src/mame/drivers/fidel_elite.cpp
+++ b/src/mame/drivers/fidel_elite.cpp
@@ -358,6 +358,7 @@ void elite_state::eas(machine_config &config)
m_ppi8255->tri_pa_callback().set_constant(0);
m_ppi8255->in_pb_callback().set(FUNC(elite_state::ppi_portb_r));
m_ppi8255->out_pc_callback().set(FUNC(elite_state::ppi_portc_w));
+ m_ppi8255->tri_pc_callback().set_constant(0);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
diff --git a/src/mame/drivers/hh_tms1k.cpp b/src/mame/drivers/hh_tms1k.cpp
index 7847b2d0842..71bbe4d3801 100644
--- a/src/mame/drivers/hh_tms1k.cpp
+++ b/src/mame/drivers/hh_tms1k.cpp
@@ -10518,7 +10518,7 @@ CONS( 1979, f3in1, 0, 0, f3in1, f3in1, f3in1_state, emp
CONS( 1979, gpoker, 0, 0, gpoker, gpoker, gpoker_state, empty_init, "Gakken", "Poker (Gakken, 1979 version)", MACHINE_SUPPORTS_SAVE )
CONS( 1980, gjackpot, 0, 0, gjackpot, gjackpot, gjackpot_state, empty_init, "Gakken", "Jackpot: Gin Rummy & Black Jack", MACHINE_SUPPORTS_SAVE )
-CONS( 1981, ginv, 0, 0, ginv, ginv, ginv_state, empty_init, "Gakken", "Invader (Gakken, cyan version)", MACHINE_SUPPORTS_SAVE )
+CONS( 1980, ginv, 0, 0, ginv, ginv, ginv_state, empty_init, "Gakken", "Invader (Gakken, cyan version)", MACHINE_SUPPORTS_SAVE )
CONS( 1981, ginv1000, 0, 0, ginv1000, ginv1000, ginv1000_state, empty_init, "Gakken", "Galaxy Invader 1000", MACHINE_SUPPORTS_SAVE )
CONS( 1982, ginv2000, 0, 0, ginv2000, ginv2000, ginv2000_state, empty_init, "Gakken", "Invader 2000", MACHINE_SUPPORTS_SAVE )
COMP( 1983, fxmcr165, 0, 0, fxmcr165, fxmcr165, fxmcr165_state, empty_init, "Gakken", "FX-Micom R-165", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
diff --git a/src/mame/drivers/intellect02.cpp b/src/mame/drivers/intellect02.cpp
index 98d43091362..7cf0e1929fa 100644
--- a/src/mame/drivers/intellect02.cpp
+++ b/src/mame/drivers/intellect02.cpp
@@ -1,5 +1,6 @@
// license:BSD-3-Clause
// copyright-holders:hap
+// thanks-to:Alex_LG, Berger
/******************************************************************************
Интеллект-02 (Intellect-02) driver
@@ -10,7 +11,7 @@ it's assumed to have been designed by НИИ БРЭА (SRI BREA). First shown in
produced during around 1985-1992.
hardware notes:
-- КР580ВМ80А CPU (i8080A clone), speed unknown
+- КР580ВМ80А CPU (i8080A clone) @ 1.5MHz
- КР580ИК55 (i8255 clone)
- 1 KB RAM (8*КР565РУ2), cartridge port
- 4-digit 7seg panel, 2 leds, 16 buttons, game board above it
@@ -19,7 +20,8 @@ The chess/checkers board is detachable, with a board for Kalah underneath it.
The hardware is very similar to Fidelity Chess Challenger 3. Actually, one of the
first cartridges for this system, a Chess program, is a modified Chess Challenger 3 ROM.
-The chess engine was kept identical. (note: the "lose" LED is used for "check")
+The chess engine was kept identical. (note: the "lose" LED is used for "check" in this game)
+The 2nd(4-level) chess cartridge is completely different, not a CC3 clone.
Intellect-01 looks like it didn't get further than a prototype. It was a dedicated
chess computer, probably a clone of CC3.
@@ -34,8 +36,7 @@ keypad legend:
УИ - уровень игры (game level)
TODO:
-- identify ПП, УИ, 0, 9 buttons (only the chess program is dumped and it doesn't use them)
-- verify cpu speed
+- identify 0,9 buttons (unused on the chess games)
******************************************************************************/
@@ -44,8 +45,7 @@ TODO:
#include "cpu/i8085/i8085.h"
#include "machine/i8255.h"
#include "machine/timer.h"
-#include "sound/dac.h"
-#include "sound/volt_reg.h"
+#include "sound/beep.h"
#include "speaker.h"
#include "bus/generic/slot.h"
#include "bus/generic/carts.h"
@@ -64,9 +64,10 @@ public:
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_ppi8255(*this, "ppi8255"),
+ m_delay_update(*this, "delay_update"),
m_delay_display(*this, "delay_display_%u", 0),
m_keypad(*this, "IN.%u", 0),
- m_dac(*this, "dac"),
+ m_beeper(*this, "beeper"),
m_cart(*this, "cartslot"),
m_out_digit(*this, "digit%u", 0U),
m_out_led(*this, "led%u", 0U)
@@ -75,7 +76,7 @@ public:
// machine configs
void intel02(machine_config &config);
- // assume that reset button is tied to RESET pin
+ // reset button is tied directly to CPU RESET pin
DECLARE_INPUT_CHANGED_MEMBER(reset_button) { m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); }
protected:
@@ -85,9 +86,10 @@ private:
// devices/pointers
required_device<cpu_device> m_maincpu;
required_device<i8255_device> m_ppi8255;
+ required_device<timer_device> m_delay_update;
required_device_array<timer_device, 6> m_delay_display;
required_ioport_array<2> m_keypad;
- required_device<dac_bit_interface> m_dac;
+ required_device<beep_device> m_beeper;
required_device<generic_slot_device> m_cart;
output_finder<4> m_out_digit;
output_finder<2> m_out_led;
@@ -96,6 +98,7 @@ private:
// display stuff
void update_display();
+ TIMER_DEVICE_CALLBACK_MEMBER(delay_update) { update_display(); }
TIMER_DEVICE_CALLBACK_MEMBER(delay_display);
u8 m_digit_data;
@@ -177,9 +180,12 @@ TIMER_DEVICE_CALLBACK_MEMBER(intel02_state::delay_display)
READ8_MEMBER(intel02_state::input_r)
{
- // d0-d3: buttons through a priority encoder
- // d4-d7: buttons (direct)
- return (count_leading_zeros(m_keypad[0]->read()) - 17) | (~m_keypad[1]->read() << 4 & 0xf0);
+ // d0-d3: buttons through a maze of logic gates
+ // basically giving each button its own 4-bit scancode
+ u8 data = count_leading_zeros(m_keypad[0]->read()) - 17;
+
+ // d4: Vcc, d5-d7: buttons (direct)
+ return data | (~m_keypad[1]->read() << 4 & 0xf0);
}
WRITE8_MEMBER(intel02_state::digit_w)
@@ -199,17 +205,19 @@ WRITE8_MEMBER(intel02_state::control_w)
// they're strobed, so on falling edge, delay them going off to prevent flicker or stuck display
else if (BIT(m_led_select, i))
- m_delay_display[i]->adjust(attotime::from_msec(10), i);
+ m_delay_display[i]->adjust(attotime::from_msec(25), i);
}
m_led_select = data;
- update_display();
- // d6: unused?
- // it's a timer trigger on Chess Challenger 3
+ // don't update display immediately
+ if (!m_delay_update->enabled())
+ m_delay_update->adjust(attotime::from_usec(15));
+
+ // d6: N/C
- // d7: speaker out
- m_dac->write(BIT(data, 7));
+ // d7: enable beeper
+ m_beeper->set_state(BIT(data, 7));
}
@@ -238,7 +246,10 @@ void intel02_state::main_io(address_map &map)
static INPUT_PORTS_START( intel02 )
PORT_START("IN.0")
- PORT_BIT(0x003f, IP_ACTIVE_HIGH, IPT_UNKNOWN)
+ PORT_BIT(0x0007, IP_ACTIVE_HIGH, IPT_UNKNOWN)
+ PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("View Position") PORT_CODE(KEYCODE_V)
+ PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Game Level") PORT_CODE(KEYCODE_L)
+ PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_UNKNOWN)
PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H8") PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_H)
PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_G)
PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F6") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_F)
@@ -250,7 +261,7 @@ static INPUT_PORTS_START( intel02 )
PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_UNKNOWN)
PORT_START("IN.1")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Input") PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD)
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Game Select") PORT_CODE(KEYCODE_S)
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Erase") PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE)
@@ -268,18 +279,19 @@ INPUT_PORTS_END
void intel02_state::intel02(machine_config &config)
{
/* basic machine hardware */
- I8080A(config, m_maincpu, 2000000);
+ I8080A(config, m_maincpu, 1500000); // measured (no XTAL)
m_maincpu->set_addrmap(AS_PROGRAM, &intel02_state::main_map);
m_maincpu->set_addrmap(AS_IO, &intel02_state::main_io);
I8255(config, m_ppi8255);
m_ppi8255->in_pa_callback().set(FUNC(intel02_state::input_r));
- m_ppi8255->tri_pa_callback().set_constant(0);
m_ppi8255->out_pb_callback().set(FUNC(intel02_state::digit_w));
m_ppi8255->tri_pb_callback().set_constant(0);
m_ppi8255->out_pc_callback().set(FUNC(intel02_state::control_w));
+ m_ppi8255->tri_pc_callback().set_constant(0);
/* video hardware */
+ TIMER(config, m_delay_update).configure_generic(FUNC(intel02_state::delay_update));
for (int i = 0; i < 6; i++)
TIMER(config, m_delay_display[i]).configure_generic(FUNC(intel02_state::delay_display));
@@ -287,8 +299,8 @@ void intel02_state::intel02(machine_config &config)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25);
- VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+ BEEP(config, m_beeper, 3640); // measured, from RC circuit
+ m_beeper->add_route(ALL_OUTPUTS, "speaker", 0.25);
/* cartridge */
GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "intellect02", "bin");
diff --git a/src/mame/drivers/novag_diablo.cpp b/src/mame/drivers/novag_diablo.cpp
index dd370c74c6a..a1372734774 100644
--- a/src/mame/drivers/novag_diablo.cpp
+++ b/src/mame/drivers/novag_diablo.cpp
@@ -5,9 +5,6 @@
*
* novag_diablo.cpp, subdriver of machine/novagbase.cpp, machine/chessbase.cpp
-TODO:
-- hook up RS232 port correctly (when connected, I'm only getting "New Game")
-
*******************************************************************************
Novag Diablo 68000 overview:
diff --git a/src/mame/layout/intellect02.lay b/src/mame/layout/intellect02.lay
index da413b27e97..31a6dfd3980 100644
--- a/src/mame/layout/intellect02.lay
+++ b/src/mame/layout/intellect02.lay
@@ -26,7 +26,7 @@
<element name="text_b1"><text string="RESET"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="text_b2"><text string="SELECT"><color red="0.8" green="0.8" blue="0.8" /></text></element>
- <element name="text_b3"><text string="POS."><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_b3"><text string="V. POS."><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="text_b4"><text string="A1"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="text_b5"><text string="B2"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="text_b6"><text string="C3"><color red="0.8" green="0.8" blue="0.8" /></text></element>
@@ -86,7 +86,7 @@
<bezel element="button" inputtag="RESET" inputmask="0x01"><bounds x="8.5" y="22" width="3" height="2.5" /></bezel>
<bezel element="button" inputtag="IN.1" inputmask="0x04"><bounds x="12.86" y="22" width="3" height="2.5" /></bezel>
- <bezel element="button" inputtag="IN.x" inputmask="0x01"><bounds x="17.21" y="22" width="3" height="2.5" /></bezel>
+ <bezel element="button" inputtag="IN.0" inputmask="0x0008"><bounds x="17.21" y="22" width="3" height="2.5" /></bezel>
<bezel element="button" inputtag="IN.0" inputmask="0x2000"><bounds x="21.57" y="22" width="3" height="2.5" /></bezel>
<bezel element="button" inputtag="IN.0" inputmask="0x1000"><bounds x="25.93" y="22" width="3" height="2.5" /></bezel>
<bezel element="button" inputtag="IN.0" inputmask="0x0800"><bounds x="30.27" y="22" width="3" height="2.5" /></bezel>
@@ -95,7 +95,7 @@
<bezel element="button" inputtag="IN.1" inputmask="0x02"><bounds x="8.5" y="26.7" width="3" height="2.5" /></bezel>
<bezel element="button" inputtag="IN.1" inputmask="0x08"><bounds x="12.86" y="26.7" width="3" height="2.5" /></bezel>
- <bezel element="button" inputtag="IN.x" inputmask="0x01"><bounds x="17.21" y="26.7" width="3" height="2.5" /></bezel>
+ <bezel element="button" inputtag="IN.0" inputmask="0x0010"><bounds x="17.21" y="26.7" width="3" height="2.5" /></bezel>
<bezel element="button" inputtag="IN.0" inputmask="0x0100"><bounds x="21.57" y="26.7" width="3" height="2.5" /></bezel>
<bezel element="button" inputtag="IN.0" inputmask="0x0080"><bounds x="25.93" y="26.7" width="3" height="2.5" /></bezel>
<bezel element="button" inputtag="IN.0" inputmask="0x0040"><bounds x="30.27" y="26.7" width="3" height="2.5" /></bezel>