mephisto_academy: move to separate driver (nw)

This commit is contained in:
hap 2020-06-24 19:29:19 +02:00
parent 53765dacde
commit 776013e80c
13 changed files with 320 additions and 219 deletions

View File

@ -2455,6 +2455,7 @@ files {
createMESSProjects(_target, _subtarget, "hegener")
files {
MAME_DIR .. "src/mame/drivers/mephisto_academy.cpp",
MAME_DIR .. "src/mame/drivers/mephisto_berlin.cpp",
MAME_DIR .. "src/mame/drivers/mephisto_brikett.cpp",
MAME_DIR .. "src/mame/drivers/mephisto_glasgow.cpp",

View File

@ -204,8 +204,8 @@ void dominator_state::dominator(machine_config &config)
R65C02(config, m_maincpu, 4_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &dominator_state::main_map);
const attotime irq_period = attotime::from_hz(4_MHz_XTAL / 0x2000); // from 4020
m_maincpu->set_periodic_int(FUNC(dominator_state::nmi_line_pulse), irq_period);
const attotime nmi_period = attotime::from_hz(4_MHz_XTAL / 0x2000); // from 4020
m_maincpu->set_periodic_int(FUNC(dominator_state::nmi_line_pulse), nmi_period);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);

View File

@ -220,7 +220,8 @@ void eag_state::init_eag2100()
void eag_state::machine_reset()
{
fidel_clockdiv_state::machine_reset();
m_rombank->set_entry(0);
if (m_rombank != nullptr)
m_rombank->set_entry(0);
}

View File

@ -169,7 +169,7 @@ public:
vsc_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_irq_on(*this, "irq_on"),
m_nmi_on(*this, "nmi_on"),
m_z80pio(*this, "z80pio"),
m_ppi8255(*this, "ppi8255"),
m_board(*this, "board"),
@ -189,7 +189,7 @@ protected:
private:
// devices/pointers
required_device<cpu_device> m_maincpu;
required_device<timer_device> m_irq_on;
required_device<timer_device> m_nmi_on;
required_device<z80pio_device> m_z80pio;
required_device<i8255_device> m_ppi8255;
required_device<sensorboard_device> m_board;
@ -206,8 +206,8 @@ private:
void main_io_trampoline_w(offs_t offset, u8 data);
// periodic interrupts
template<int Line> TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(Line, ASSERT_LINE); }
template<int Line> TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(Line, CLEAR_LINE); }
template<int Line> TIMER_DEVICE_CALLBACK_MEMBER(nmi_on) { m_maincpu->set_input_line(Line, ASSERT_LINE); }
template<int Line> TIMER_DEVICE_CALLBACK_MEMBER(nmi_off) { m_maincpu->set_input_line(Line, CLEAR_LINE); }
// I/O handlers
void update_display();
@ -426,10 +426,10 @@ void vsc_state::vsc(machine_config &config)
m_maincpu->set_addrmap(AS_PROGRAM, &vsc_state::main_map);
m_maincpu->set_addrmap(AS_IO, &vsc_state::main_io);
const attotime irq_period = attotime::from_hz(600); // 555 timer, ideal frequency is 600Hz (measurement was 587Hz)
TIMER(config, m_irq_on).configure_periodic(FUNC(vsc_state::irq_on<INPUT_LINE_NMI>), irq_period);
m_irq_on->set_start_delay(irq_period - attotime::from_usec(845)); // active for 0.845ms (approx half)
TIMER(config, "irq_off").configure_periodic(FUNC(vsc_state::irq_off<INPUT_LINE_NMI>), irq_period);
const attotime nmi_period = attotime::from_hz(600); // 555 timer, ideal frequency is 600Hz (measurement was 587Hz)
TIMER(config, m_nmi_on).configure_periodic(FUNC(vsc_state::nmi_on<INPUT_LINE_NMI>), nmi_period);
m_nmi_on->set_start_delay(nmi_period - attotime::from_usec(845)); // active for 0.845ms (approx half)
TIMER(config, "nmi_off").configure_periodic(FUNC(vsc_state::nmi_off<INPUT_LINE_NMI>), nmi_period);
I8255(config, m_ppi8255);
m_ppi8255->out_pa_callback().set(FUNC(vsc_state::ppi_porta_w));

View File

@ -592,16 +592,16 @@ Notes:
- bosco: there appears to be a bug in the code at 0BB1, which handles communication
with the 06XX custom chip. First it saves in A' the command to write, then if a
transfer is still in progress it jups to 0BC1, does other things, then restores
transfer is still in progress it jumps to 0BC1, does other things, then restores
the command from A' and stores it in RAM. At that point (0BE1) it checks again if
a transfer is in progress. If the trasnfer has terminated, it jumps to 0BEB, which
a transfer is in progress. If the transfer has terminated, it jumps to 0BEB, which
restores the command from RAM, and jumps back to 0BBA to send the command. However,
the instruction at 0BBA is ex af,af', so the command is overwritten with garbage.
There's also an exx at 0BBB which seems unnecessary but that's harmless.
Anyway, what this bug means is that we must make sure that the 06XX generates NMIs
quickly enough to ensure that 0BB1 is usually not called with a transfer still is
progress. It doesn't seem possible to prevent it altogether though, so we can only
hope that the transfer doesn't terminate in the middle of the function.
progress. It doesn't seem possible to prevent it altogether though, so we can only
hope that the transfer doesn't terminate in the middle of the function.
- bosco: we have two dumps of the sound shape ROM, "prom.1d" and "bosco.spr". Music
changes a lot from one version to the other.

View File

@ -0,0 +1,177 @@
// license:BSD-3-Clause
// copyright-holders:Sandro Ronco, hap
// thanks-to:yoyo_chessboard
/***************************************************************************
Mephisto Academy
Hardware notes:
- PCB label HGS 10 130 01
- VL65NC02-04PC, 4.91Mhz XTAL
- 2*32KB ROM(TC57256AD-12), 1st ROM half-empty
- 8KB battery-backed RAM(TC5564APL-15)
- HD44100H, HD44780, 2*16 chars LCD screen
- magnets chessboard with leds, 8 tri-color leds, beeper
Since the program is on an external module, it appears it was meant to be
a modular chesscomputer. However, no extra modules were sold separately.
Module PCB is the same as Super Mondial II College, label HGS 10 116 05.
***************************************************************************/
#include "emu.h"
#include "cpu/m6502/m65c02.h"
#include "machine/74259.h"
#include "machine/nvram.h"
#include "machine/mmboard.h"
#include "video/mmdisplay2.h"
#include "video/pwm.h"
#include "mephisto_academy.lh"
class academy_state : public driver_device
{
public:
academy_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_board(*this, "board")
, m_led_pwm(*this, "led_pwm")
, m_outlatch(*this, "outlatch")
, m_keys(*this, "KEY")
{ }
void academy(machine_config &config);
private:
required_device<cpu_device> m_maincpu;
required_device<mephisto_board_device> m_board;
required_device<pwm_display_device> m_led_pwm;
required_device<hc259_device> m_outlatch;
required_ioport m_keys;
void main_map(address_map &map);
void led_w(u8 data);
u8 input_r();
};
/******************************************************************************
I/O
******************************************************************************/
void academy_state::led_w(u8 data)
{
// d0-d3: keypad led select
// d4-d7: keypad led data
m_led_pwm->matrix(data & 0xf, ~data >> 4 & 0xf);
}
u8 academy_state::input_r()
{
// 74259 Q1 selects keypad
u8 data = m_outlatch->q1_r() ? 0 : m_keys->read();
return ~m_board->input_r() | data;
}
/******************************************************************************
Address Maps
******************************************************************************/
void academy_state::main_map(address_map &map)
{
map(0x0000, 0x1fff).ram().share("nvram");
map(0x2400, 0x2400).r(FUNC(academy_state::input_r));
map(0x2800, 0x2800).w(m_board, FUNC(mephisto_board_device::mux_w));
map(0x2c00, 0x2c00).w(m_board, FUNC(mephisto_board_device::led_w));
map(0x3000, 0x3007).w("outlatch", FUNC(hc259_device::write_d7));
map(0x3400, 0x3400).w(FUNC(academy_state::led_w));
map(0x3800, 0x3801).rw("display:hd44780", FUNC(hd44780_device::read), FUNC(hd44780_device::write));
map(0x4000, 0xffff).rom();
}
/******************************************************************************
Input Ports
******************************************************************************/
static INPUT_PORTS_START( academy )
PORT_START("KEY")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("TRAIN") PORT_CODE(KEYCODE_T)
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("INFO") PORT_CODE(KEYCODE_I)
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("MEM") PORT_CODE(KEYCODE_M)
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS") PORT_CODE(KEYCODE_O)
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LEV") PORT_CODE(KEYCODE_L)
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("FCT") PORT_CODE(KEYCODE_F)
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("ENT") PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_F1) // combine for NEW GAME
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_F1) // "
INPUT_PORTS_END
/******************************************************************************
Machine Configs
******************************************************************************/
void academy_state::academy(machine_config &config)
{
/* basic machine hardware */
M65C02(config, m_maincpu, 4.9152_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &academy_state::main_map);
const attotime nmi_period = attotime::from_hz(4.9152_MHz_XTAL / (1 << 13));
m_maincpu->set_periodic_int(FUNC(academy_state::nmi_line_pulse), nmi_period);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
HC259(config, m_outlatch); // SN74HC259N
m_outlatch->parallel_out_cb().set("display:dac", FUNC(dac_byte_interface::write)).rshift(2).mask(0x03);
MEPHISTO_SENSORS_BOARD(config, "board");
MEPHISTO_DISPLAY_MODULE2(config, "display"); // internal
PWM_DISPLAY(config, m_led_pwm).set_size(4, 4);
config.set_default_layout(layout_mephisto_academy);
}
/******************************************************************************
ROM Definitions
******************************************************************************/
ROM_START( academy )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("acad4000.bin", 0x0000, 0x8000, CRC(9c5affdb) SHA1(621d16227e49b0f46ce58ce15107bae23abacadc) )
ROM_LOAD("acad8000.bin", 0x8000, 0x8000, CRC(a967922b) SHA1(1327903ff89bf96d72c930c400f367ae19e3ec68) )
ROM_END
ROM_START( academyg )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("academy_16k_6.3.89", 0x0000, 0x8000, CRC(e242dd6f) SHA1(95d3668b478a93a5d62304d58ef135f848b7d2cf) )
ROM_LOAD("academy_32k_6.3.89", 0x8000, 0x8000, CRC(e313d084) SHA1(ced5712d34fcc81bedcd741b7ac9e2ba17bf5235) )
ROM_END
ROM_START( academyga )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("academy_16k_04.10.88", 0x0000, 0x8000, CRC(89055eaa) SHA1(4b3045a75b9107737db39a8c9ab9c15ec6b0ead6) )
ROM_LOAD("academy_32k_04.10.88", 0x8000, 0x8000, CRC(478155db) SHA1(d363ab6d5bc0f47a6cdfa5132b77535ef8da8256) )
ROM_END
/***************************************************************************
Game Drivers
***************************************************************************/
/* YEAR, NAME, PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS */
CONS( 1989, academy, 0, 0, academy, academy, academy_state, empty_init, "Hegener + Glaser", "Mephisto Academy (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1989, academyg, academy, 0, academy, academy, academy_state, empty_init, "Hegener + Glaser", "Mephisto Academy (German, 06-03-89)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1989, academyga, academy, 0, academy, academy, academy_state, empty_init, "Hegener + Glaser", "Mephisto Academy (German, 04-10-88)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )

View File

@ -1,5 +1,6 @@
// license:BSD-3-Clause
// copyright-holders:Sandro Ronco
// copyright-holders:Sandro Ronco, hap
// thanks-to:yoyo_chessboard
/**************************************************************************************************
Mephisto Modena
@ -24,10 +25,10 @@ Hold Pawn + Knight buttons at boot for test mode.
#include "mephisto_modena.lh"
class mephisto_modena_state : public driver_device
class modena_state : public driver_device
{
public:
mephisto_modena_state(const machine_config &mconfig, device_type type, const char *tag)
modena_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_board(*this, "board")
@ -52,21 +53,21 @@ private:
void modena_mem(address_map &map);
uint8_t input_r();
void digits_w(uint8_t data);
void io_w(uint8_t data);
void led_w(uint8_t data);
u8 input_r();
void digits_w(u8 data);
void io_w(u8 data);
void led_w(u8 data);
void update_display();
TIMER_DEVICE_CALLBACK_MEMBER(nmi_on) { m_maincpu->set_input_line(M6502_NMI_LINE, ASSERT_LINE); }
TIMER_DEVICE_CALLBACK_MEMBER(nmi_off) { m_maincpu->set_input_line(M6502_NMI_LINE, CLEAR_LINE); }
uint8_t m_board_mux = 0xff;
uint8_t m_digits_idx = 0;
uint8_t m_io_ctrl = 0;
u8 m_board_mux = 0xff;
u8 m_digits_idx = 0;
u8 m_io_ctrl = 0;
};
void mephisto_modena_state::machine_start()
void modena_state::machine_start()
{
m_digits.resolve();
@ -80,14 +81,14 @@ void mephisto_modena_state::machine_start()
I/O
******************************************************************************/
void mephisto_modena_state::update_display()
void modena_state::update_display()
{
m_display->matrix(m_io_ctrl >> 1 & 7, ~m_board_mux);
}
uint8_t mephisto_modena_state::input_r()
u8 modena_state::input_r()
{
uint8_t data = 0;
u8 data = 0;
// read buttons
if (~m_io_ctrl & 1)
@ -101,14 +102,14 @@ uint8_t mephisto_modena_state::input_r()
return data;
}
void mephisto_modena_state::led_w(uint8_t data)
void modena_state::led_w(u8 data)
{
// d0-d7: chessboard mux, led data
m_board_mux = data;
update_display();
}
void mephisto_modena_state::io_w(uint8_t data)
void modena_state::io_w(u8 data)
{
// d0: button select
// d1-d3: led select
@ -119,7 +120,7 @@ void mephisto_modena_state::io_w(uint8_t data)
m_dac->write(BIT(data, 6));
}
void mephisto_modena_state::digits_w(uint8_t data)
void modena_state::digits_w(u8 data)
{
m_digits[m_digits_idx] = data ^ ((m_io_ctrl & 0x10) ? 0xff : 0x00);
m_digits_idx = (m_digits_idx + 1) & 3;
@ -131,13 +132,13 @@ void mephisto_modena_state::digits_w(uint8_t data)
Address Maps
******************************************************************************/
void mephisto_modena_state::modena_mem(address_map &map)
void modena_state::modena_mem(address_map &map)
{
map(0x0000, 0x1fff).ram().share("nvram");
map(0x4000, 0x4000).w(FUNC(mephisto_modena_state::digits_w));
map(0x5000, 0x5000).w(FUNC(mephisto_modena_state::led_w));
map(0x6000, 0x6000).w(FUNC(mephisto_modena_state::io_w));
map(0x7000, 0x7000).r(FUNC(mephisto_modena_state::input_r));
map(0x4000, 0x4000).w(FUNC(modena_state::digits_w));
map(0x5000, 0x5000).w(FUNC(modena_state::led_w));
map(0x6000, 0x6000).w(FUNC(modena_state::io_w));
map(0x7000, 0x7000).r(FUNC(modena_state::input_r));
map(0x7f00, 0x7fff).nopr(); // dummy read on 6502 absolute X page wrap
map(0x8000, 0xffff).rom().region("maincpu", 0);
}
@ -166,15 +167,17 @@ INPUT_PORTS_END
Machine Configs
******************************************************************************/
void mephisto_modena_state::modena(machine_config &config)
void modena_state::modena(machine_config &config)
{
/* basic machine hardware */
M65C02(config, m_maincpu, XTAL(4'194'304)); // W65C02SP or RP65C02G
m_maincpu->set_addrmap(AS_PROGRAM, &mephisto_modena_state::modena_mem);
M65C02(config, m_maincpu, 4.194304_MHz_XTAL); // W65C02SP or RP65C02G
m_maincpu->set_addrmap(AS_PROGRAM, &modena_state::modena_mem);
timer_device &nmi_on(TIMER(config, "nmi_on"));
nmi_on.configure_periodic(FUNC(mephisto_modena_state::nmi_on), attotime::from_hz(XTAL(4'194'304) / (1 << 13)));
nmi_on.set_start_delay(attotime::from_hz(XTAL(4'194'304) / (1 << 13)) - attotime::from_usec(975)); // active for 975us
TIMER(config, "nmi_off").configure_periodic(FUNC(mephisto_modena_state::nmi_off), attotime::from_hz(XTAL(4'194'304) / (1 << 13)));
const attotime nmi_period = attotime::from_hz(4.194304_MHz_XTAL / (1 << 13));
nmi_on.configure_periodic(FUNC(modena_state::nmi_on), nmi_period);
nmi_on.set_start_delay(nmi_period - attotime::from_usec(975)); // active for 975us
TIMER(config, "nmi_off").configure_periodic(FUNC(modena_state::nmi_off), nmi_period);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@ -220,7 +223,7 @@ ROM_END
Game driver(s)
***************************************************************************/
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
CONS( 1992, modena, 0, 0, modena, modena, mephisto_modena_state, empty_init, "Hegener + Glaser", "Mephisto Modena (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1992, modenaa, modena, 0, modena, modena, mephisto_modena_state, empty_init, "Hegener + Glaser", "Mephisto Modena (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1992, modenab, modena, 0, modena, modena, mephisto_modena_state, empty_init, "Hegener + Glaser", "Mephisto Modena (set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
CONS( 1992, modena, 0, 0, modena, modena, modena_state, empty_init, "Hegener + Glaser", "Mephisto Modena (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1992, modenaa, modena, 0, modena, modena, modena_state, empty_init, "Hegener + Glaser", "Mephisto Modena (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1992, modenab, modena, 0, modena, modena, modena_state, empty_init, "Hegener + Glaser", "Mephisto Modena (set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )

View File

@ -1,5 +1,5 @@
// license:BSD-3-Clause
// copyright-holders:Sandro Ronco
// copyright-holders:Sandro Ronco, hap
// thanks-to:Berger
/***************************************************************************
@ -51,9 +51,9 @@ protected:
void mondial68k_mem(address_map &map);
void lcd_s_w(u32 data);
void input_mux_w(uint8_t data);
void board_mux_w(uint8_t data);
uint8_t inputs_r();
void input_mux_w(u8 data);
void board_mux_w(u8 data);
u8 inputs_r();
void update_display();
required_device<cpu_device> m_maincpu;
@ -63,8 +63,8 @@ protected:
required_ioport_array<4> m_inputs;
output_finder<4> m_digits;
uint8_t m_input_mux = 0xff;
uint8_t m_board_mux = 0xff;
u8 m_input_mux = 0xff;
u8 m_board_mux = 0xff;
};
@ -94,14 +94,14 @@ void mondial68k_state::lcd_s_w(u32 data)
m_digits[i] = bitswap<8>((data & 0x7fffffff) >> (8 * i), 7,4,5,0,1,2,3,6);
}
void mondial68k_state::board_mux_w(uint8_t data)
void mondial68k_state::board_mux_w(u8 data)
{
// d0-d7: chessboard mux, led data
m_board_mux = data;
update_display();
}
void mondial68k_state::input_mux_w(uint8_t data)
void mondial68k_state::input_mux_w(u8 data)
{
// d0-d3: button mux
// d6,d7: led select
@ -109,9 +109,9 @@ void mondial68k_state::input_mux_w(uint8_t data)
update_display();
}
uint8_t mondial68k_state::inputs_r()
u8 mondial68k_state::inputs_r()
{
uint8_t data = 0x00;
u8 data = 0x00;
// read buttons
for (int i=0; i<4; i++)

View File

@ -25,7 +25,6 @@ TODO:
#include "speaker.h"
// internal artwork
#include "mephisto_academy.lh"
#include "mephisto_milano.lh"
#include "mephisto_polgar.lh"
@ -99,32 +98,6 @@ private:
uint8_t m_led_latch;
};
class mephisto_academy_state : public mephisto_polgar_state
{
public:
mephisto_academy_state(const machine_config &mconfig, device_type type, const char *tag)
: mephisto_polgar_state(mconfig, type, tag)
, m_board(*this, "board")
, m_leds(*this, "led%u", 100U)
{ }
INTERRUPT_GEN_MEMBER(academy_irq);
DECLARE_WRITE_LINE_MEMBER(academy_nmi_w);
void academy_led_w(uint8_t data);
uint8_t academy_input_r();
void academy(machine_config &config);
void academy_mem(address_map &map);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
private:
required_device<mephisto_board_device> m_board;
output_finder<16> m_leds;
bool m_enable_nmi;
};
uint8_t mephisto_polgar_state::polgar_keys_r(offs_t offset)
{
return (BIT(m_keys->read(), offset) << 7) | 0x7f;
@ -217,50 +190,6 @@ void mephisto_milano_state::milano_mem(address_map &map)
}
INTERRUPT_GEN_MEMBER(mephisto_academy_state::academy_irq)
{
if (m_enable_nmi)
device.execute().pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
WRITE_LINE_MEMBER(mephisto_academy_state::academy_nmi_w)
{
m_enable_nmi = state;
}
void mephisto_academy_state::academy_led_w(uint8_t data)
{
for(int i=0; i<4; i++)
for(int j=0; j<4; j++)
{
if (BIT(data, i))
m_leds[j * 4 + i] = BIT(data, 4 + j) ? 0 : 1;
}
}
uint8_t mephisto_academy_state::academy_input_r()
{
uint8_t data;
if (m_board->mux_r() == 0xff)
data = m_keys->read();
else
data = m_board->input_r();
return data ^ 0xff;
}
void mephisto_academy_state::academy_mem(address_map &map)
{
map(0x0000, 0x1fff).ram().share("nvram");
map(0x2400, 0x2400).r(FUNC(mephisto_academy_state::academy_input_r));
map(0x2800, 0x2800).w(m_board, FUNC(mephisto_board_device::mux_w));
map(0x2c00, 0x2c00).w(m_board, FUNC(mephisto_board_device::led_w));
map(0x3000, 0x3007).w("outlatch", FUNC(hc259_device::write_d7));
map(0x3400, 0x3400).w(FUNC(mephisto_academy_state::academy_led_w));
map(0x3800, 0x3801).rw("display:hd44780", FUNC(hd44780_device::read), FUNC(hd44780_device::write));
map(0x4000, 0xffff).rom();
}
static INPUT_PORTS_START( polgar )
PORT_START("KEY")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Trn") PORT_CODE(KEYCODE_T)
@ -290,16 +219,6 @@ void mephisto_milano_state::machine_reset()
m_led_latch = 0;
}
void mephisto_academy_state::machine_start()
{
m_leds.resolve();
}
void mephisto_academy_state::machine_reset()
{
m_enable_nmi = true;
}
void mephisto_polgar_state::polgar(machine_config &config)
{
M65C02(config, m_maincpu, XTAL(4'915'200)); // RP65C02G
@ -363,18 +282,6 @@ void mephisto_milano_state::milano(machine_config &config)
config.set_default_layout(layout_mephisto_milano);
}
void mephisto_academy_state::academy(machine_config &config)
{
polgar(config); // CPU: VL65NC02-04PC, 4.9152Mhz
m_maincpu->set_addrmap(AS_PROGRAM, &mephisto_academy_state::academy_mem);
hc259_device &outlatch(HC259(config.replace(), "outlatch"));
outlatch.q_out_cb<1>().set(FUNC(mephisto_academy_state::academy_nmi_w));
outlatch.q_out_cb<2>().set("display:dac", FUNC(dac_byte_interface::write));
config.set_default_layout(layout_mephisto_academy);
}
ROM_START( polgar )
ROM_REGION( 0x10000, "maincpu", 0 )
@ -405,24 +312,6 @@ ROM_START( mrisc2 )
ROM_LOAD("risc_2.31", 0x00000, 0x20000, CRC(9ecf9cd3) SHA1(7bfc628183037a172242c9589f15aca218d8fb12) )
ROM_END
ROM_START( academy )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("acad4000.bin", 0x4000, 0x4000, CRC(ee1222b5) SHA1(98541d87755a7186b69b9723cc4adbd07f20f0e2) )
ROM_LOAD("acad8000.bin", 0x8000, 0x8000, CRC(a967922b) SHA1(1327903ff89bf96d72c930c400f367ae19e3ec68) )
ROM_END
ROM_START( academyg )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("academy_16k_6.3.89", 0x4000, 0x4000, CRC(900a0001) SHA1(174a6bc3bde55994c603e232fcb45fccd62f11f6) )
ROM_LOAD("academy_32k_6.3.89", 0x8000, 0x8000, CRC(e313d084) SHA1(ced5712d34fcc81bedcd741b7ac9e2ba17bf5235) )
ROM_END
ROM_START( academyga )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("academy_16k_04.10.88", 0x4000, 0x4000, CRC(fb4d83c4) SHA1(f5132042c3b5a17c173f81eaa57e313ff0bb848e) )
ROM_LOAD("academy_32k_04.10.88", 0x8000, 0x8000, CRC(478155db) SHA1(d363ab6d5bc0f47a6cdfa5132b77535ef8da8256) )
ROM_END
ROM_START( milano )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD("milano102.bin", 0x0000, 0x10000, CRC(0e9c8fe1) SHA1(e9176f42d86fe57e382185c703c7eff7e63ca711) )
@ -452,10 +341,6 @@ CONS( 1992, mrisc, 0, 0, mrisc, polgar, mephisto_risc_state,
CONS( 1994, mrisc2, mrisc, 0, mrisc, polgar, mephisto_risc_state, empty_init, "Hegener + Glaser / Tasc", "Mephisto Risc II", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
// not modular boards
CONS( 1989, academy, 0, 0, academy, polgar, mephisto_academy_state, empty_init, "Hegener + Glaser", "Mephisto Academy (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1989, academyg, academy, 0, academy, polgar, mephisto_academy_state, empty_init, "Hegener + Glaser", "Mephisto Academy (German, 06-03-89)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1989, academyga, academy, 0, academy, polgar, mephisto_academy_state, empty_init, "Hegener + Glaser", "Mephisto Academy (German, 04-10-88)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1991, milano, 0, 0, milano, polgar, mephisto_milano_state, empty_init, "Hegener + Glaser", "Mephisto Milano (v1.02)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1991, milanoa, milano, 0, milano, polgar, mephisto_milano_state, empty_init, "Hegener + Glaser", "Mephisto Milano (v1.01)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1993, nshort, milano, 0, milano, polgar, mephisto_milano_state, empty_init, "Hegener + Glaser", "Mephisto Nigel Short", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )

View File

@ -199,8 +199,8 @@ void star_state::sstar28k(machine_config &config)
M6502(config, m_maincpu, 2000000); // no XTAL
m_maincpu->set_addrmap(AS_PROGRAM, &star_state::sstar28k_map);
const attotime irq_period = attotime::from_hz(2000000 / 0x2000); // 4020 Q13
m_maincpu->set_periodic_int(FUNC(star_state::nmi_line_pulse), irq_period);
const attotime nmi_period = attotime::from_hz(2000000 / 0x2000); // 4020 Q13
m_maincpu->set_periodic_int(FUNC(star_state::nmi_line_pulse), nmi_period);
SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS);
m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess));
@ -224,8 +224,8 @@ void star_state::tstar432(machine_config &config)
R65C02(config.replace(), m_maincpu, 4_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &star_state::tstar432_map);
const attotime irq_period = attotime::from_hz(4_MHz_XTAL / 0x4000); // 4020 Q14
m_maincpu->set_periodic_int(FUNC(star_state::nmi_line_pulse), irq_period);
const attotime nmi_period = attotime::from_hz(4_MHz_XTAL / 0x4000); // 4020 Q14
m_maincpu->set_periodic_int(FUNC(star_state::nmi_line_pulse), nmi_period);
config.set_default_layout(layout_saitek_tstar432);
@ -242,8 +242,8 @@ void star_state::sstar36k(machine_config &config)
M6502(config.replace(), m_maincpu, 2_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &star_state::tstar432_map);
const attotime irq_period = attotime::from_hz(2_MHz_XTAL / 0x2000); // 4020 Q13
m_maincpu->set_periodic_int(FUNC(star_state::nmi_line_pulse), irq_period);
const attotime nmi_period = attotime::from_hz(2_MHz_XTAL / 0x2000); // 4020 Q13
m_maincpu->set_periodic_int(FUNC(star_state::nmi_line_pulse), nmi_period);
}

View File

@ -3,7 +3,21 @@
license:CC0
-->
<mamelayout version="2">
<!-- define elements -->
<element name="ledo">
<disk><color red="0.1" green="0.1" blue="0.1" /></disk>
</element>
<element name="ledr" defstate="0">
<disk state="0"><color red="0" green="0" blue="0" /></disk>
<disk state="1"><color red="1" green="0" blue="0" /></disk>
</element>
<element name="ledg" defstate="0">
<disk state="0"><color red="0" green="0" blue="0" /></disk>
<disk state="1"><color red="0" green="1" blue="0" /></disk>
</element>
<element name="led" defstate="0">
<disk state="0">
<color red="0.20" green="0.0" blue="0.0" />
@ -389,47 +403,65 @@ license:CC0
</group>
<group name="panel">
<bounds left="0" right="75.25" top="0" bottom="8.5" />
<bounds left="0" right="100" top="0" bottom="10" />
<bezel element="text_lcd"><bounds x="1" y="6.5" width="24" height="1.7" /></bezel>
<group ref="lcd"><bounds x="1" y="0" width="23.55" height="6.25" /></group>
<bezel name="led100" element="led"> <bounds x="29.1" y="0.1" width="1.3" height="1.3" /> </bezel>
<bezel name="led101" element="led"> <bounds x="35.1" y="0.1" width="1.3" height="1.3" /> </bezel>
<bezel name="led102" element="led"> <bounds x="41.1" y="0.1" width="1.3" height="1.3" /> </bezel>
<bezel name="led103" element="led"> <bounds x="47.1" y="0.1" width="1.3" height="1.3" /> </bezel>
<bezel name="led108" element="led"> <bounds x="54.1" y="0.1" width="1.3" height="1.3" /> </bezel>
<bezel name="led109" element="led"> <bounds x="60.1" y="0.1" width="1.3" height="1.3" /> </bezel>
<bezel name="led114" element="led"> <bounds x="66.1" y="0.1" width="1.3" height="1.3" /> </bezel>
<bezel name="led115" element="led"> <bounds x="72.1" y="0.1" width="1.3" height="1.3" /> </bezel>
<bezel element="text_train"> <bounds x="29.25" y="2" width="5" height="1.5" /> </bezel>
<bezel element="text_info"> <bounds x="35.25" y="2" width="5" height="1.5" /> </bezel>
<bezel element="text_mem"> <bounds x="41.25" y="2" width="5" height="1.5" /> </bezel>
<bezel element="text_pos"> <bounds x="47.25" y="2" width="5" height="1.5" /> </bezel>
<bezel element="text_lev"> <bounds x="53.25" y="2" width="5" height="1.5" /> </bezel>
<bezel element="text_fct"> <bounds x="59.25" y="2" width="5" height="1.5" /> </bezel>
<bezel element="text_ent"> <bounds x="67.25" y="2" width="5" height="1.5" /> </bezel>
<bezel element="text_cl"> <bounds x="74.25" y="2" width="3" height="1.5" /> </bezel>
<bezel element="text_train"> <bounds x="27.25" y="2" width="5" height="1.5" /> </bezel>
<bezel element="text_info"> <bounds x="33.25" y="2" width="5" height="1.5" /> </bezel>
<bezel element="text_mem"> <bounds x="39.25" y="2" width="5" height="1.5" /> </bezel>
<bezel element="text_pos"> <bounds x="45.25" y="2" width="5" height="1.5" /> </bezel>
<bezel element="text_lev"> <bounds x="52.25" y="2" width="5" height="1.5" /> </bezel>
<bezel element="text_fct"> <bounds x="58.25" y="2" width="5" height="1.5" /> </bezel>
<bezel element="text_ent"> <bounds x="64.25" y="2" width="5" height="1.5" /> </bezel>
<bezel element="text_cl"> <bounds x="71.25" y="2" width="3" height="1.5" /> </bezel>
<bezel element="text_p6"> <bounds x="29.25" y="6.5" width="5" height="1.5" /> </bezel>
<bezel element="text_p5"> <bounds x="35.25" y="6.5" width="5" height="1.5" /> </bezel>
<bezel element="text_p4"> <bounds x="41.25" y="6.5" width="5" height="1.5" /> </bezel>
<bezel element="text_p3"> <bounds x="47.25" y="6.5" width="5" height="1.5" /> </bezel>
<bezel element="text_p2"> <bounds x="53.25" y="6.5" width="5" height="1.5" /> </bezel>
<bezel element="text_p1"> <bounds x="59.25" y="6.5" width="5" height="1.5" /> </bezel>
<bezel element="text_newgame"> <bounds x="68.25" y="6.70" width="9" height="1.5" /> </bezel>
<bezel element="text_black"> <bounds x="67" y="0" width="2" height="1.3" /> </bezel>
<bezel element="text_white"> <bounds x="73" y="0" width="2" height="1.3" /> </bezel>
<bezel element="text_p6"> <bounds x="27.25" y="6.5" width="5" height="1.5" /> </bezel>
<bezel element="text_p5"> <bounds x="33.25" y="6.5" width="5" height="1.5" /> </bezel>
<bezel element="text_p4"> <bounds x="39.25" y="6.5" width="5" height="1.5" /> </bezel>
<bezel element="text_p3"> <bounds x="45.25" y="6.5" width="5" height="1.5" /> </bezel>
<bezel element="text_p2"> <bounds x="52.25" y="6.5" width="5" height="1.5" /> </bezel>
<bezel element="text_p1"> <bounds x="58.25" y="6.5" width="5" height="1.5" /> </bezel>
<bezel element="text_newgame"> <bounds x="65.25" y="6.70" width="9" height="1.5" /> </bezel>
<bezel element="text_black"> <bounds x="64" y="0" width="2" height="1.3" /> </bezel>
<bezel element="text_white"> <bounds x="70" y="0" width="2" height="1.3" /> </bezel>
<bezel element="hlb" inputtag="KEY" inputmask="0x01"> <bounds x="31" y="3.75" width="1.5" height="2.5" /> </bezel>
<bezel element="hlb" inputtag="KEY" inputmask="0x02"> <bounds x="37" y="3.75" width="1.5" height="2.5" /> </bezel>
<bezel element="hlb" inputtag="KEY" inputmask="0x04"> <bounds x="43" y="3.75" width="1.5" height="2.5" /> </bezel>
<bezel element="hlb" inputtag="KEY" inputmask="0x08"> <bounds x="49" y="3.75" width="1.5" height="2.5" /> </bezel>
<bezel element="hlb" inputtag="KEY" inputmask="0x10"> <bounds x="55" y="3.75" width="1.5" height="2.5" /> </bezel>
<bezel element="hlb" inputtag="KEY" inputmask="0x20"> <bounds x="61" y="3.75" width="1.5" height="2.5" /> </bezel>
<bezel element="hlbr" inputtag="KEY" inputmask="0x40"> <bounds x="69" y="3.75" width="1.5" height="2.5" /> </bezel>
<bezel element="hlbr" inputtag="KEY" inputmask="0x80"> <bounds x="75" y="3.75" width="1.5" height="2.5" /> </bezel>
<bezel element="hlb" inputtag="KEY" inputmask="0x01"> <bounds x="29" y="3.75" width="1.5" height="2.5" /> </bezel>
<bezel element="hlb" inputtag="KEY" inputmask="0x02"> <bounds x="35" y="3.75" width="1.5" height="2.5" /> </bezel>
<bezel element="hlb" inputtag="KEY" inputmask="0x04"> <bounds x="41" y="3.75" width="1.5" height="2.5" /> </bezel>
<bezel element="hlb" inputtag="KEY" inputmask="0x08"> <bounds x="47" y="3.75" width="1.5" height="2.5" /> </bezel>
<bezel element="hlb" inputtag="KEY" inputmask="0x10"> <bounds x="54" y="3.75" width="1.5" height="2.5" /> </bezel>
<bezel element="hlb" inputtag="KEY" inputmask="0x20"> <bounds x="60" y="3.75" width="1.5" height="2.5" /> </bezel>
<bezel element="hlbr" inputtag="KEY" inputmask="0x40"> <bounds x="66" y="3.75" width="1.5" height="2.5" /> </bezel>
<bezel element="hlbr" inputtag="KEY" inputmask="0x80"> <bounds x="72" y="3.75" width="1.5" height="2.5" /> </bezel>
<element ref="ledo"><bounds x="31.1" y="0.1" width="1.3" height="1.3" /></element>
<element ref="ledo"><bounds x="37.1" y="0.1" width="1.3" height="1.3" /></element>
<element ref="ledo"><bounds x="43.1" y="0.1" width="1.3" height="1.3" /></element>
<element ref="ledo"><bounds x="49.1" y="0.1" width="1.3" height="1.3" /></element>
<element ref="ledo"><bounds x="55.1" y="0.1" width="1.3" height="1.3" /></element>
<element ref="ledo"><bounds x="61.1" y="0.1" width="1.3" height="1.3" /></element>
<element ref="ledo"><bounds x="69.1" y="0.1" width="1.3" height="1.3" /></element>
<element ref="ledo"><bounds x="75.1" y="0.1" width="1.3" height="1.3" /></element>
<element name="0.0" ref="ledr" blend="add"><bounds x="31.1" y="0.1" width="1.3" height="1.3" /></element>
<element name="1.0" ref="ledr" blend="add"><bounds x="37.1" y="0.1" width="1.3" height="1.3" /></element>
<element name="2.0" ref="ledr" blend="add"><bounds x="43.1" y="0.1" width="1.3" height="1.3" /></element>
<element name="3.0" ref="ledr" blend="add"><bounds x="49.1" y="0.1" width="1.3" height="1.3" /></element>
<element name="0.2" ref="ledr" blend="add"><bounds x="55.1" y="0.1" width="1.3" height="1.3" /></element>
<element name="1.2" ref="ledr" blend="add"><bounds x="61.1" y="0.1" width="1.3" height="1.3" /></element>
<element name="2.2" ref="ledr" blend="add"><bounds x="69.1" y="0.1" width="1.3" height="1.3" /></element>
<element name="3.2" ref="ledr" blend="add"><bounds x="75.1" y="0.1" width="1.3" height="1.3" /></element>
<element name="0.1" ref="ledg" blend="add"><bounds x="31.1" y="0.1" width="1.3" height="1.3" /></element>
<element name="1.1" ref="ledg" blend="add"><bounds x="37.1" y="0.1" width="1.3" height="1.3" /></element>
<element name="2.1" ref="ledg" blend="add"><bounds x="43.1" y="0.1" width="1.3" height="1.3" /></element>
<element name="3.1" ref="ledg" blend="add"><bounds x="49.1" y="0.1" width="1.3" height="1.3" /></element>
<element name="0.3" ref="ledg" blend="add"><bounds x="55.1" y="0.1" width="1.3" height="1.3" /></element>
<element name="1.3" ref="ledg" blend="add"><bounds x="61.1" y="0.1" width="1.3" height="1.3" /></element>
<element name="2.3" ref="ledg" blend="add"><bounds x="69.1" y="0.1" width="1.3" height="1.3" /></element>
<element name="3.3" ref="ledg" blend="add"><bounds x="75.1" y="0.1" width="1.3" height="1.3" /></element>
</group>
@ -439,7 +471,7 @@ license:CC0
<bounds left="0" right="100" top="0" bottom="98" />
<element ref="background"><bounds x="13" y="0" width="87" height="98" /></element>
<!-- chessboard coords -->
<!-- chessboard coords -->
<bezel element="white"><bounds x="16.5" y="2.5" width="81" height="81" /></bezel>
<bezel element="text_8"><bounds x="13.7" y="7" width="2" height="2" /></bezel>
<bezel element="text_7"><bounds x="13.7" y="17" width="2" height="2" /></bezel>
@ -459,9 +491,8 @@ license:CC0
<bezel element="text_g"><bounds x="81" y="84.5" width="2" height="2" /></bezel>
<bezel element="text_h"><bounds x="91" y="84.5" width="2" height="2" /></bezel>
<!-- LCD panel -->
<group ref="panel"><bounds x="18" y="88" width="75.25" height="8.5" /></group>
<!-- LCD panel -->
<group ref="panel"><bounds x="18" y="88" width="100" height="10" /></group>
<group ref="sb_board"><bounds x="17" y="3" width="80" height="80" /></group>
<group ref="sb_ui"><bounds x="1.5" y="3" width="10" height="80" /></group>

View File

@ -22219,6 +22219,11 @@ mekd5 // 1980 Motorola Evaluation Kit
crzyddz2 // 2006 Sealy
menghong // 2004? Sealy
@source:mephisto_academy.cpp
academy
academyg
academyga
@source:mephisto_berlin.cpp
berl16 // 1992 Mephisto Berlin 68000
berl16a // 1992 Mephisto Berlin 68000
@ -22326,9 +22331,6 @@ polgar10 // 1990 Mephisto Polgar 10MHz
polgar101 // 1990 Mephisto Polgar 10MHz
mrisc // 1992 Mephisto RISC 1MB
mrisc2 // 1994 Mephisto RISC II
academy // 1989 Mephisto Academy
academyg // 1989 Mephisto Academy
academyga // 1989 Mephisto Academy
milano // 1991 Mephisto Milano
milanoa // 1991 Mephisto Milano
nshort // 1993 Mephisto Nigel Short

View File

@ -532,6 +532,7 @@ mekd2.cpp
mekd3.cpp
mekd4.cpp
mekd5.cpp
mephisto_academy.cpp
mephisto_berlin.cpp
mephisto_brikett.cpp
mephisto_glasgow.cpp