New softwarelist additions

-----------
intellect02:
Chess (4 levels) [hap, Berger]
This commit is contained in:
hap 2019-04-06 21:22:57 +02:00
parent d890319806
commit caa8d04ced
9 changed files with 64 additions and 38 deletions

View File

@ -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>

View File

@ -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;

View File

@ -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

View File

@ -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());

View File

@ -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);

View File

@ -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 )

View File

@ -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));
// d7: speaker out
m_dac->write(BIT(data, 7));
// d6: N/C
// 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");

View File

@ -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:

View File

@ -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>