mirror of
https://github.com/holub/mame
synced 2025-04-22 16:31:49 +03:00
New not working machine added
------------- Savant [hap, Berger, Sean Riddle]
This commit is contained in:
parent
ffe04a3f08
commit
60924e1222
@ -2820,6 +2820,7 @@ createMESSProjects(_target, _subtarget, "novag")
|
||||
files {
|
||||
MAME_DIR .. "src/mame/drivers/novag_mk1.cpp",
|
||||
MAME_DIR .. "src/mame/drivers/novag_mk2.cpp",
|
||||
MAME_DIR .. "src/mame/drivers/novag_savant.cpp",
|
||||
MAME_DIR .. "src/mame/drivers/ssystem3.cpp",
|
||||
MAME_DIR .. "src/mame/includes/ssystem3.h",
|
||||
MAME_DIR .. "src/mame/video/ssystem3.cpp",
|
||||
|
@ -50,7 +50,7 @@ f3853_device::f3853_device(const machine_config &mconfig, device_type type, cons
|
||||
m_int_vector(0),
|
||||
m_prescaler(31),
|
||||
m_priority_line(false),
|
||||
m_external_interrupt_line(true)
|
||||
m_external_interrupt_line(false)
|
||||
{ }
|
||||
|
||||
f3853_device::f3853_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
|
||||
@ -210,7 +210,7 @@ TIMER_CALLBACK_MEMBER(f3853_device::timer_callback)
|
||||
|
||||
WRITE_LINE_MEMBER(f3853_device::ext_int_w)
|
||||
{
|
||||
if (m_external_interrupt_line && !state && m_external_int_enable)
|
||||
if (!m_external_interrupt_line && state && m_external_int_enable)
|
||||
{
|
||||
m_request_flipflop = true;
|
||||
}
|
||||
@ -387,6 +387,20 @@ WRITE8_MEMBER(f3856_device::write)
|
||||
// f38t56_device-specific handlers
|
||||
//-------------------------------------------------
|
||||
|
||||
READ8_MEMBER(f38t56_device::read)
|
||||
{
|
||||
switch (offset & 3)
|
||||
{
|
||||
// interrupt: sense ext int pin
|
||||
case 2:
|
||||
return (m_external_interrupt_line) ? 0 : 0x80;
|
||||
|
||||
// other: same as 3856
|
||||
default:
|
||||
return f3856_device::read(space, offset);
|
||||
}
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(f38t56_device::write)
|
||||
{
|
||||
switch (offset & 3)
|
||||
|
@ -169,6 +169,7 @@ class f38t56_device : public f3856_device
|
||||
public:
|
||||
f38t56_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
virtual DECLARE_READ8_MEMBER(read) override;
|
||||
virtual DECLARE_WRITE8_MEMBER(write) override;
|
||||
};
|
||||
|
||||
|
@ -51,7 +51,6 @@ sensorboard_device::sensorboard_device(const machine_config &mconfig, const char
|
||||
m_custom_spawn_cb(*this),
|
||||
m_custom_output_cb(*this)
|
||||
{
|
||||
memset(m_inistate, 0, ARRAY_LENGTH(m_inistate));
|
||||
m_magnets = false;
|
||||
m_inductive = false;
|
||||
m_ui_enabled = 3;
|
||||
@ -71,7 +70,7 @@ sensorboard_device::sensorboard_device(const machine_config &mconfig, const char
|
||||
void sensorboard_device::device_start()
|
||||
{
|
||||
// resolve handlers
|
||||
m_custom_init_cb.resolve_safe(0);
|
||||
m_custom_init_cb.resolve_safe();
|
||||
m_custom_sensor_cb.resolve_safe(0);
|
||||
m_custom_spawn_cb.resolve();
|
||||
m_custom_output_cb.resolve();
|
||||
@ -83,9 +82,8 @@ void sensorboard_device::device_start()
|
||||
m_out_count.resolve();
|
||||
}
|
||||
|
||||
// custom init (meant for setting m_inistate)
|
||||
m_custom_init_cb();
|
||||
memcpy(m_curstate, m_inistate, m_height * m_width);
|
||||
clear_board();
|
||||
m_custom_init_cb(1);
|
||||
memcpy(m_history[0], m_curstate, m_height * m_width);
|
||||
|
||||
for (int i = 0; i < m_maxspawn; i++)
|
||||
@ -128,7 +126,6 @@ void sensorboard_device::device_start()
|
||||
save_item(NAME(m_ui_enabled));
|
||||
|
||||
save_item(NAME(m_curstate));
|
||||
save_item(NAME(m_inistate));
|
||||
save_item(NAME(m_history));
|
||||
|
||||
save_item(NAME(m_uselect));
|
||||
@ -139,7 +136,7 @@ void sensorboard_device::device_start()
|
||||
save_item(NAME(m_sensordelay));
|
||||
}
|
||||
|
||||
int sensorboard_device::preset_chess()
|
||||
void sensorboard_device::preset_chess(int state)
|
||||
{
|
||||
// set chessboard start position
|
||||
|
||||
@ -150,24 +147,22 @@ int sensorboard_device::preset_chess()
|
||||
// 5 = white queen 11 = black queen
|
||||
// 6 = white king 12 = black king
|
||||
|
||||
write_init(0, 0, 4);
|
||||
write_init(7, 0, 4);
|
||||
write_init(1, 0, 2);
|
||||
write_init(6, 0, 2);
|
||||
write_init(2, 0, 3);
|
||||
write_init(5, 0, 3);
|
||||
write_init(3, 0, 5);
|
||||
write_init(4, 0, 6);
|
||||
write_piece(0, 0, 4);
|
||||
write_piece(7, 0, 4);
|
||||
write_piece(1, 0, 2);
|
||||
write_piece(6, 0, 2);
|
||||
write_piece(2, 0, 3);
|
||||
write_piece(5, 0, 3);
|
||||
write_piece(3, 0, 5);
|
||||
write_piece(4, 0, 6);
|
||||
|
||||
for (int x = 0; x < 8; x++)
|
||||
{
|
||||
write_init(x, 1, 1);
|
||||
write_init(x, 6, 7);
|
||||
write_init(x, 7, read_init(x, 0) + 6);
|
||||
write_piece(x, 1, 1);
|
||||
write_piece(x, 6, 7);
|
||||
write_piece(x, 7, read_piece(x, 0) + 6);
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
||||
// note that for inductive boards, 2 additional callbacks are needed:
|
||||
// additional init_cb() for reassigning the piece ids for initial board state
|
||||
// spawn_cb() for checking if a piece is available and reassigning the piece id
|
||||
@ -177,6 +172,9 @@ void sensorboard_device::device_reset()
|
||||
{
|
||||
cancel_sensor();
|
||||
cancel_hand();
|
||||
|
||||
clear_board();
|
||||
m_custom_init_cb(0);
|
||||
refresh();
|
||||
}
|
||||
|
||||
@ -416,7 +414,7 @@ INPUT_CHANGED_MEMBER(sensorboard_device::ui_spawn)
|
||||
return;
|
||||
|
||||
u8 pos = (u8)(uintptr_t)param;
|
||||
if (pos >= m_maxspawn)
|
||||
if (pos > m_maxspawn)
|
||||
return;
|
||||
|
||||
cancel_sensor();
|
||||
@ -506,16 +504,14 @@ INPUT_CHANGED_MEMBER(sensorboard_device::ui_init)
|
||||
if (!newval)
|
||||
return;
|
||||
|
||||
u8 select = (u8)(uintptr_t)param;
|
||||
u8 init = (u8)(uintptr_t)param;
|
||||
cancel_sensor();
|
||||
cancel_hand();
|
||||
|
||||
// clear board
|
||||
memset(m_curstate, 0, m_height * m_width);
|
||||
clear_board();
|
||||
|
||||
// reset to initial position
|
||||
if (select)
|
||||
memcpy(m_curstate, m_inistate, m_height * m_width);
|
||||
if (init)
|
||||
m_custom_init_cb(0);
|
||||
|
||||
refresh();
|
||||
}
|
||||
|
@ -32,12 +32,12 @@ public:
|
||||
sensorboard_device &set_ui_enable(bool b) { if (!b) m_maxspawn = 0; m_ui_enabled = (b) ? 3 : 0; return *this; } // enable UI inputs
|
||||
sensorboard_device &set_mod_enable(bool b) { if (b) m_ui_enabled |= 1; else m_ui_enabled &= 2; return *this; } // enable modifier keys
|
||||
|
||||
auto init_cb() { return m_custom_init_cb.bind(); }
|
||||
auto init_cb() { return m_custom_init_cb.bind(); } // for setting pieces starting position
|
||||
auto sensor_cb() { return m_custom_sensor_cb.bind(); } // x = offset & 0xf, y = offset >> 4 & 0xf
|
||||
auto spawn_cb() { return m_custom_spawn_cb.bind(); } // spawnpoint/piece = offset, retval = new piece id
|
||||
auto output_cb() { return m_custom_output_cb.bind(); } // pos = offset(A8 for ui/board, A9 for count), id = data
|
||||
|
||||
int preset_chess(); // init_cb() preset for chessboards
|
||||
void preset_chess(int state); // init_cb() preset for chessboards
|
||||
|
||||
// read sensors
|
||||
u8 read_sensor(u8 x, u8 y);
|
||||
@ -47,8 +47,7 @@ public:
|
||||
// handle board state
|
||||
u8 read_piece(u8 x, u8 y) { return m_curstate[y * m_width + x]; }
|
||||
void write_piece(u8 x, u8 y, u8 id) { m_curstate[y * m_width + x] = id; }
|
||||
u8 read_init(u8 x, u8 y) { return m_inistate[y * m_width + x]; }
|
||||
void write_init(u8 x, u8 y, u8 id) { m_inistate[y * m_width + x] = id; } // for setting initial board state
|
||||
void clear_board() { memset(m_curstate, 0, ARRAY_LENGTH(m_curstate)); }
|
||||
|
||||
void refresh();
|
||||
|
||||
@ -85,7 +84,7 @@ private:
|
||||
required_ioport_array<10> m_inp_rank;
|
||||
required_ioport m_inp_ui;
|
||||
|
||||
devcb_read_line m_custom_init_cb;
|
||||
devcb_write_line m_custom_init_cb;
|
||||
devcb_read8 m_custom_sensor_cb;
|
||||
devcb_read8 m_custom_spawn_cb;
|
||||
devcb_write16 m_custom_output_cb;
|
||||
@ -105,7 +104,6 @@ private:
|
||||
u8 m_ui_enabled;
|
||||
|
||||
u8 m_curstate[0x100];
|
||||
u8 m_inistate[0x100];
|
||||
u8 m_history[1000][0x100];
|
||||
|
||||
u8 m_uselect;
|
||||
|
@ -73,7 +73,7 @@ protected:
|
||||
class hlcd0539_device : public hlcd0538_device
|
||||
{
|
||||
public:
|
||||
hlcd0539_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
|
||||
hlcd0539_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
|
||||
};
|
||||
|
||||
|
||||
|
@ -535,7 +535,7 @@ void microterm_f8_state::act5a(machine_config &config)
|
||||
AY51013(config, m_uart);
|
||||
m_uart->read_si_callback().set(m_io, FUNC(rs232_port_device::rxd_r));
|
||||
m_uart->write_so_callback().set("txd", FUNC(input_merger_device::in_w<0>));
|
||||
m_uart->write_dav_callback().set("smi", FUNC(f3853_device::ext_int_w)).invert();
|
||||
m_uart->write_dav_callback().set("smi", FUNC(f3853_device::ext_int_w));
|
||||
m_uart->set_auto_rdav(true);
|
||||
|
||||
RS232_PORT(config, m_io, default_rs232_devices, nullptr);
|
||||
|
409
src/mame/drivers/novag_savant.cpp
Normal file
409
src/mame/drivers/novag_savant.cpp
Normal file
@ -0,0 +1,409 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:hap
|
||||
// thanks-to:Berger
|
||||
/******************************************************************************
|
||||
|
||||
Novag Savant, chess computer with touchscreen. It was followed by Savant II and
|
||||
Savant Royale on similar hardware. The chess engine is MyChess by David Kittinger.
|
||||
|
||||
Hardware overview:
|
||||
- Zilog Z80B @ 6MHz
|
||||
- 24KB ROM(3*TMM2364) + sockets for expansion (populated in Savant II)
|
||||
- 4KB RAM(8*MM2114N-2L), 256x4 battery-backed RAM(MWS5101)
|
||||
- Fairchild 3870 @ 4MHz (2KB internal ROM)
|
||||
- HLCD0538, HLCD0539, LCD screen with 8*8 touch-sensitive overlay
|
||||
- external ports for optional chess clock and printer
|
||||
|
||||
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
|
||||
- internal artwork
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "cpu/f8/f8.h"
|
||||
#include "machine/f3853.h"
|
||||
#include "video/hlcd0538.h"
|
||||
#include "video/pwm.h"
|
||||
#include "machine/sensorboard.h"
|
||||
#include "machine/nvram.h"
|
||||
#include "sound/dac.h"
|
||||
#include "sound/volt_reg.h"
|
||||
#include "screen.h"
|
||||
#include "speaker.h"
|
||||
|
||||
// internal artwork
|
||||
//#include "novag_savant.lh" // clickable
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
class savant_state : public driver_device
|
||||
{
|
||||
public:
|
||||
savant_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
driver_device(mconfig, type, tag),
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_mcu(*this, "mcu"),
|
||||
m_psu(*this, "psu"),
|
||||
m_lcd1(*this, "lcd1"),
|
||||
m_lcd2(*this, "lcd2"),
|
||||
m_display(*this, "display"),
|
||||
m_board(*this, "board"),
|
||||
m_dac(*this, "dac"),
|
||||
m_nvram(*this, "nvram"),
|
||||
m_inputs(*this, "IN.%u", 0)
|
||||
{ }
|
||||
|
||||
// machine drivers
|
||||
void savant(machine_config &config);
|
||||
|
||||
protected:
|
||||
virtual void machine_start() override;
|
||||
|
||||
private:
|
||||
// devices/pointers
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<cpu_device> m_mcu;
|
||||
required_device<f38t56_device> m_psu;
|
||||
required_device<hlcd0538_device> m_lcd1;
|
||||
required_device<hlcd0539_device> m_lcd2;
|
||||
required_device<pwm_display_device> m_display;
|
||||
required_device<sensorboard_device> m_board;
|
||||
required_device<dac_bit_interface> m_dac;
|
||||
required_shared_ptr<u8> m_nvram;
|
||||
required_ioport_array<3> m_inputs;
|
||||
|
||||
// address maps
|
||||
void main_map(address_map &map);
|
||||
void main_io(address_map &map);
|
||||
void mcu_map(address_map &map);
|
||||
void mcu_io(address_map &map);
|
||||
|
||||
// I/O handlers
|
||||
DECLARE_READ8_MEMBER(nvram_r);
|
||||
DECLARE_READ8_MEMBER(stall_r);
|
||||
DECLARE_WRITE8_MEMBER(stall_w);
|
||||
DECLARE_READ8_MEMBER(mcustatus_r);
|
||||
|
||||
DECLARE_WRITE64_MEMBER(lcd1_output_w);
|
||||
DECLARE_WRITE64_MEMBER(lcd2_output_w);
|
||||
|
||||
DECLARE_READ8_MEMBER(databus_r);
|
||||
DECLARE_WRITE8_MEMBER(databus_w);
|
||||
DECLARE_READ8_MEMBER(control_r);
|
||||
DECLARE_WRITE8_MEMBER(control_w);
|
||||
DECLARE_WRITE8_MEMBER(lcd_w);
|
||||
DECLARE_READ8_MEMBER(input_r);
|
||||
|
||||
u8 m_inp_mux;
|
||||
u8 m_databus;
|
||||
u8 m_control;
|
||||
u64 m_lcd_data;
|
||||
};
|
||||
|
||||
void savant_state::machine_start()
|
||||
{
|
||||
// zerofill
|
||||
m_inp_mux = 0;
|
||||
m_databus = 0;
|
||||
m_control = 0;
|
||||
m_lcd_data = 0;
|
||||
|
||||
// register for savestates
|
||||
save_item(NAME(m_inp_mux));
|
||||
save_item(NAME(m_databus));
|
||||
save_item(NAME(m_control));
|
||||
save_item(NAME(m_lcd_data));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Devices, I/O
|
||||
******************************************************************************/
|
||||
|
||||
// Z80 side
|
||||
|
||||
READ8_MEMBER(savant_state::nvram_r)
|
||||
{
|
||||
// nvram is only d0-d3
|
||||
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_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::mcustatus_r)
|
||||
{
|
||||
// d0: MCU P1.2
|
||||
return BIT(~m_control, 2);
|
||||
}
|
||||
|
||||
|
||||
// 3870 side
|
||||
|
||||
WRITE64_MEMBER(savant_state::lcd1_output_w)
|
||||
{
|
||||
// uses C1-C24
|
||||
m_lcd_data = m_lcd_data << 24 | (data >> 8 & 0xffffff);
|
||||
m_display->matrix(data & 0xff, m_lcd_data);
|
||||
}
|
||||
|
||||
WRITE64_MEMBER(savant_state::lcd2_output_w)
|
||||
{
|
||||
// uses C6-C32
|
||||
m_lcd_data = data >> 5 & 0x7ffffff;
|
||||
}
|
||||
|
||||
READ8_MEMBER(savant_state::databus_r)
|
||||
{
|
||||
return ~m_databus;
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(savant_state::databus_w)
|
||||
{
|
||||
m_databus = ~data;
|
||||
}
|
||||
|
||||
READ8_MEMBER(savant_state::control_r)
|
||||
{
|
||||
return m_control;
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(savant_state::control_w)
|
||||
{
|
||||
// d0: clear EXT INT, clear Z80 WAIT
|
||||
if (~data & m_control & 1)
|
||||
{
|
||||
m_psu->ext_int_w(0);
|
||||
m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE);
|
||||
}
|
||||
|
||||
// d1: clear Z80 BUSRQ
|
||||
if (~data & m_control & 2)
|
||||
{
|
||||
//m_maincpu->set_state_int(Z80_A, m_databus);
|
||||
m_maincpu->set_input_line(Z80_INPUT_LINE_BUSRQ, CLEAR_LINE);
|
||||
}
|
||||
|
||||
// d2: return data for Z80
|
||||
|
||||
// d3: speaker out
|
||||
m_dac->write(BIT(data, 3));
|
||||
|
||||
// d4: LCD pins
|
||||
m_lcd2->lcd_w(BIT(~data, 4));
|
||||
m_lcd1->lcd_w(BIT(~data, 4));
|
||||
|
||||
// d5-d7: keypad mux
|
||||
|
||||
m_control = data;
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(savant_state::lcd_w)
|
||||
{
|
||||
// d0: HLCD0538 data
|
||||
// d4: HLCD0539 data
|
||||
m_lcd1->data_w(BIT(~data, 0));
|
||||
m_lcd2->data_w(BIT(~data, 4));
|
||||
|
||||
// STROBE pin to LCD chips CLK
|
||||
m_lcd1->clk_w(1); m_lcd1->clk_w(0);
|
||||
m_lcd2->clk_w(1); m_lcd2->clk_w(0);
|
||||
|
||||
// also touchscreen input mux
|
||||
m_inp_mux = bitswap<8>(data,7,3,6,2,5,1,4,0);
|
||||
}
|
||||
|
||||
READ8_MEMBER(savant_state::input_r)
|
||||
{
|
||||
u8 data = 0;
|
||||
|
||||
// read touchscreen
|
||||
for (int i = 0; i < 8; i++)
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Address Maps
|
||||
******************************************************************************/
|
||||
|
||||
void savant_state::main_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x5fff).rom();
|
||||
map(0xc000, 0xcfff).ram();
|
||||
map(0xd000, 0xd0ff).mirror(0x0300).ram().r(FUNC(savant_state::nvram_r)).share("nvram");
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
void savant_state::mcu_map(address_map &map)
|
||||
{
|
||||
map.global_mask(0x7ff);
|
||||
map(0x0000, 0x07ff).rom();
|
||||
}
|
||||
|
||||
void savant_state::mcu_io(address_map &map)
|
||||
{
|
||||
map(0x00, 0x00).rw(FUNC(savant_state::databus_r), FUNC(savant_state::databus_w));
|
||||
map(0x01, 0x01).rw(FUNC(savant_state::control_r), FUNC(savant_state::control_w));
|
||||
map(0x04, 0x07).rw(m_psu, FUNC(f38t56_device::read), FUNC(f38t56_device::write));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Input Ports
|
||||
******************************************************************************/
|
||||
|
||||
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_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_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)
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Machine Drivers
|
||||
******************************************************************************/
|
||||
|
||||
void savant_state::savant(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
Z80(config, m_maincpu, 6_MHz_XTAL);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &savant_state::main_map);
|
||||
m_maincpu->set_addrmap(AS_IO, &savant_state::main_io);
|
||||
|
||||
F8(config, m_mcu, 4_MHz_XTAL/2);
|
||||
m_mcu->set_addrmap(AS_PROGRAM, &savant_state::mcu_map);
|
||||
m_mcu->set_addrmap(AS_IO, &savant_state::mcu_io);
|
||||
m_mcu->set_irq_acknowledge_callback("psu", FUNC(f38t56_device::int_acknowledge));
|
||||
|
||||
F38T56(config, m_psu, 4_MHz_XTAL/2);
|
||||
m_psu->set_int_vector(0x20);
|
||||
m_psu->int_req_callback().set_inputline(m_mcu, F8_INPUT_LINE_INT_REQ);
|
||||
m_psu->write_a().set(FUNC(savant_state::lcd_w));
|
||||
m_psu->read_b().set(FUNC(savant_state::input_r));
|
||||
|
||||
config.m_perfect_cpu_quantum = subtag("mcu");
|
||||
|
||||
SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS);
|
||||
m_board->set_ui_enable(false); // no chesspieces
|
||||
m_board->set_delay(attotime::never);
|
||||
|
||||
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
|
||||
|
||||
/* video hardware */
|
||||
HLCD0538(config, m_lcd1).write_cols().set(FUNC(savant_state::lcd1_output_w));
|
||||
HLCD0539(config, m_lcd2).write_cols().set(FUNC(savant_state::lcd2_output_w));
|
||||
|
||||
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG));
|
||||
screen.set_refresh_hz(60);
|
||||
screen.set_size(958, 1080);
|
||||
screen.set_visarea_full();
|
||||
|
||||
PWM_DISPLAY(config, m_display).set_size(8, 24+27);
|
||||
//config.set_default_layout(layout_novag_savant);
|
||||
|
||||
/* 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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
ROM Definitions
|
||||
******************************************************************************/
|
||||
|
||||
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) ) // "
|
||||
// 3 more ROM sockets not populated(yellow, red, gold), manual mentions possible expansion
|
||||
|
||||
ROM_REGION( 0x0800, "mcu", 0 )
|
||||
ROM_LOAD("sl90547.u29", 0x0000, 0x0800, CRC(6fbf2aa0) SHA1(18e673ba5b806b397dd3d350525b5467c25a0d94) )
|
||||
|
||||
ROM_REGION( 763850, "screen", 0)
|
||||
ROM_LOAD("savant.svg", 0, 763850, CRC(f29a5ca4) SHA1(9fabfb86e6235057b60232e987872a645ee4112e) )
|
||||
ROM_END
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Drivers
|
||||
******************************************************************************/
|
||||
|
||||
// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
|
||||
CONS( 1981, savant, 0, 0, savant, savant, savant_state, empty_init, "Novag", "Savant", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
|
@ -314,7 +314,7 @@ WRITE_LINE_MEMBER( vidbrain_state::ext_int_w )
|
||||
{
|
||||
if (state)
|
||||
{
|
||||
m_smi->ext_int_w(0);
|
||||
m_smi->ext_int_w(1);
|
||||
}
|
||||
}
|
||||
|
||||
@ -362,7 +362,7 @@ READ8_MEMBER(vidbrain_state::memory_read_byte)
|
||||
void vidbrain_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
|
||||
{
|
||||
m_uv->ext_int_w(0);
|
||||
m_smi->ext_int_w(1);
|
||||
m_smi->ext_int_w(0);
|
||||
}
|
||||
|
||||
|
||||
|
@ -10,6 +10,7 @@
|
||||
<element name="red"><rect><color red="0.75" green="0.15" blue="0.2" /></rect></element>
|
||||
<element name="blue"><rect><color red="0.15" green="0.2" blue="0.75" /></rect></element>
|
||||
<element name="blueb"><rect><color red="0.07" green="0.01" blue="0.25" /></rect></element>
|
||||
<element name="blueb2"><rect><color red="0.12" green="0.03" blue="0.4" /></rect></element>
|
||||
|
||||
<element name="redd">
|
||||
<rect><color red="0.5" green="0.1" blue="0.15" /></rect>
|
||||
@ -33,8 +34,9 @@
|
||||
</element>
|
||||
|
||||
<element name="text_switch" defstate="0">
|
||||
<text string="POWER SWITCH: ON" align="1" state="0"><color red="0.3" green="0.3" blue="0.3" /></text>
|
||||
<text string="POWER SWITCH: SAVE" align="1" state="1"><color red="0.3" green="0.3" blue="0.3" /></text>
|
||||
<rect><color red="0.12" green="0.03" blue="0.4" /></rect>
|
||||
<text string="POWER SWITCH: ON" align="1" state="0"><color red="0.4" green="0.4" blue="0.55" /></text>
|
||||
<text string="POWER SWITCH: SAVE" align="1" state="1"><color red="0.4" green="0.4" blue="0.55" /></text>
|
||||
</element>
|
||||
|
||||
<element name="text_l0"><text string="MOVE"><color red="0.8" green="0.8" blue="0.8" /></text></element>
|
||||
@ -142,19 +144,20 @@
|
||||
|
||||
<!-- build screen -->
|
||||
|
||||
<view name="Internal Layout (Full)">
|
||||
<bounds left="-1" right="182.5" top="-1" bottom="96" />
|
||||
<group ref="display"><bounds x="0" y="0" width="86" height="94.434" /></group>
|
||||
|
||||
<bezel element="blueb2"><bounds x="88" y="0" width="95" height="53" /></bezel>
|
||||
<bezel element="blueb"><bounds x="88" y="44" width="95" height="53" /></bezel>
|
||||
<bezel element="blackb"><bounds x="91" y="47" width="95" height="53" /></bezel>
|
||||
<group ref="buttons"><bounds x="93" y="48.634" width="87.8" height="45.8" /></group>
|
||||
|
||||
<bezel element="text_switch" inputtag="IN.3" inputmask="0x01"><bounds x="91" y="2" width="24" height="2.7" /></bezel>
|
||||
</view>
|
||||
|
||||
<view name="Internal Layout (Screen)">
|
||||
<group ref="display"><bounds x="0" y="0" width="86" height="94.434" /></group>
|
||||
</view>
|
||||
|
||||
<view name="Internal Layout (Full)">
|
||||
<bounds left="-1" right="185" top="-1" bottom="96" />
|
||||
<group ref="display"><bounds x="0" y="0" width="86" height="94.434" /></group>
|
||||
|
||||
<bezel element="blueb"><bounds x="89" y="43" width="97" height="53" /></bezel>
|
||||
<bezel element="blackb"><bounds x="92" y="46" width="97" height="53" /></bezel>
|
||||
<group ref="buttons"><bounds x="95" y="48.634" width="87.8" height="45.8" /></group>
|
||||
|
||||
<bezel element="text_switch" inputtag="IN.3" inputmask="0x01"><bounds x="95" y="38" width="24" height="2.7" /></bezel>
|
||||
</view>
|
||||
|
||||
</mamelayout>
|
||||
|
@ -30964,6 +30964,9 @@ ccmk2 // Chess Champion MK II
|
||||
nocto //
|
||||
npresto //
|
||||
|
||||
@source:novag_savant.cpp
|
||||
savant //
|
||||
|
||||
@source:novag_scon.cpp
|
||||
supercon //
|
||||
|
||||
|
@ -544,6 +544,7 @@ novag_diablo.cpp
|
||||
novag_mk1.cpp
|
||||
novag_mk2.cpp
|
||||
novag_presto.cpp
|
||||
novag_savant.cpp
|
||||
novag_scon.cpp
|
||||
novag_sexpert.cpp
|
||||
o2.cpp
|
||||
|
Loading…
Reference in New Issue
Block a user