ondra: cleanup, added sound.

This commit is contained in:
Robbbert 2020-07-05 04:21:07 +10:00
parent a80557b412
commit 7147a9a63d
5 changed files with 235 additions and 217 deletions

View File

@ -3776,7 +3776,6 @@ files {
MAME_DIR .. "src/mame/drivers/ondra.cpp",
MAME_DIR .. "src/mame/includes/ondra.h",
MAME_DIR .. "src/mame/machine/ondra.cpp",
MAME_DIR .. "src/mame/video/ondra.cpp",
MAME_DIR .. "src/mame/drivers/pmd85.cpp",
MAME_DIR .. "src/mame/includes/pmd85.h",
MAME_DIR .. "src/mame/machine/pmd85.cpp",

View File

@ -1,119 +1,153 @@
// license:BSD-3-Clause
// copyright-holders:Miodrag Milanovic
/***************************************************************************
/*****************************************************************************
Ondra driver by Miodrag Milanovic
Ondra driver by Miodrag Milanovic
08/09/2008 Preliminary driver.
2008-09-08 Preliminary driver.
****************************************************************************/
ToDo:
- Paste/Natural keyboard are useless because 3rd modifier key is not supported.
- Add 2x i8253 pits which are part of the video timing circuit. They are not
connected to the data bus, and are always selected.
- The video is somewhat similar to the standard super80, in that the CPU is
turned off by BUSRQ about half the time, so that the video can be drawn
without causing snow. The CPU can gain full control by disabling the video.
- Sound is a speaker connected to a multivibrator circuit. There are 3 diodes
from this circuit to allow a choice of 7 frequencies. We have used a buzzer
with selected arbitrary frequencies, not having any idea what they should be.
- Ondrav doesn't seem to accept any commands, only producing KOD 1 followed
by halt. You have to press Esc before trying again.
- Cassette not working. Doesn't load from softlist, and don't know how to save.
******************************************************************************/
#include "emu.h"
#include "includes/ondra.h"
#include "cpu/z80/z80.h"
#include "imagedev/cassette.h"
#include "machine/ram.h"
#include "emupal.h"
#include "screen.h"
#include "softlist.h"
#include "speaker.h"
/* Address maps */
void ondra_state::ondra_mem(address_map &map)
void ondra_state::mem_map(address_map &map)
{
map(0x0000, 0x3fff).bankrw("bank1");
map(0x4000, 0xdfff).bankrw("bank2");
map(0xe000, 0xffff).bankrw("bank3");
}
void ondra_state::ondra_io(address_map &map)
void ondra_state::io_map(address_map &map)
{
map.global_mask(0x0b);
//map.global_mask(0x0b);
map.unmap_value_high();
map(0x03, 0x03).w(FUNC(ondra_state::ondra_port_03_w));
//map(0x09, 0x09).w(FUNC(ondra_state::ondra_port_09_w);
//map(0x0a, 0x0a).w(FUNC(ondra_state::ondra_port_0a_w);
map(0x03, 0x03).mirror(0xff00).w(FUNC(ondra_state::port03_w));
//map(0x09, 0x09).mirror(0xff00).r(FUNC(ondra_state::port09_r));
map(0x0a, 0x0a).mirror(0xff00).w(FUNC(ondra_state::port0a_w));
}
/* Input ports */
static INPUT_PORTS_START( ondra )
PORT_START("LINE0")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("R") PORT_CODE(KEYCODE_R)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("W") PORT_CODE(KEYCODE_W)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("T") PORT_CODE(KEYCODE_T)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q)
PORT_BIT(0xE0, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("R 4 $") PORT_CODE(KEYCODE_R) PORT_CHAR('R') PORT_CHAR('r') PORT_CHAR('4') PORT_CHAR('$')
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E 3 #") PORT_CODE(KEYCODE_E) PORT_CHAR('E') PORT_CHAR('e') PORT_CHAR('3') PORT_CHAR('#')
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("W 2 \"") PORT_CODE(KEYCODE_W) PORT_CHAR('W') PORT_CHAR('w') PORT_CHAR('2') PORT_CHAR('\"')
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("T 5 %") PORT_CODE(KEYCODE_T) PORT_CHAR('T') PORT_CHAR('t') PORT_CHAR('5') PORT_CHAR('%')
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Q 1 !") PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') PORT_CHAR('q') PORT_CHAR('1') PORT_CHAR('!')
PORT_START("LINE1")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("S") PORT_CODE(KEYCODE_S)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G") PORT_CODE(KEYCODE_G)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A)
PORT_BIT(0xE0, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F ^") PORT_CODE(KEYCODE_F) PORT_CHAR('F') PORT_CHAR('f') PORT_CHAR('^')
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D =") PORT_CODE(KEYCODE_D) PORT_CHAR('D') PORT_CHAR('d') PORT_CHAR('=')
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("S +") PORT_CODE(KEYCODE_S) PORT_CHAR('S') PORT_CHAR('s') PORT_CHAR('+')
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G _") PORT_CODE(KEYCODE_G) PORT_CHAR('G') PORT_CHAR('g') PORT_CHAR('_')
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A -") PORT_CODE(KEYCODE_A) PORT_CHAR('A') PORT_CHAR('a') PORT_CHAR('-')
PORT_START("LINE2")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("X") PORT_CODE(KEYCODE_X)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("V") PORT_CODE(KEYCODE_V)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Shift") PORT_CODE(KEYCODE_RSHIFT)
PORT_BIT(0xE0, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C :") PORT_CODE(KEYCODE_C) PORT_CHAR('C') PORT_CHAR('c') PORT_CHAR(':')
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("X /") PORT_CODE(KEYCODE_X) PORT_CHAR('X') PORT_CHAR('x') PORT_CHAR('/')
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Z *") PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') PORT_CHAR('z') PORT_CHAR('*')
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("V ;") PORT_CODE(KEYCODE_V) PORT_CHAR('V') PORT_CHAR('v') PORT_CHAR(';')
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Shift") PORT_CODE(KEYCODE_RSHIFT) //PORT_CHAR(UCHAR_SHIFT_3) not supported yet
PORT_START("LINE3")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0xE0, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("LINE4")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("0-9") PORT_CODE(KEYCODE_RALT)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("0-9") PORT_CODE(KEYCODE_RALT) PORT_CHAR(UCHAR_SHIFT_2)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("CS") PORT_CODE(KEYCODE_LALT)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("UpCase") PORT_CODE(KEYCODE_LSHIFT)
PORT_BIT(0xE0, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("UpCase") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
PORT_START("LINE5")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("J") PORT_CODE(KEYCODE_J)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("K") PORT_CODE(KEYCODE_K)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("L") PORT_CODE(KEYCODE_L)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("H") PORT_CODE(KEYCODE_H)
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("J >") PORT_CODE(KEYCODE_J) PORT_CHAR('J') PORT_CHAR('j') PORT_CHAR('>')
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("K [") PORT_CODE(KEYCODE_K) PORT_CHAR('K') PORT_CHAR('k') PORT_CHAR('[')
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("L ]") PORT_CODE(KEYCODE_L) PORT_CHAR('L') PORT_CHAR('l') PORT_CHAR(']')
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("H <") PORT_CODE(KEYCODE_H) PORT_CHAR('H') PORT_CHAR('h') PORT_CHAR('<')
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER)
PORT_BIT(0xE0, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("LINE6")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("U") PORT_CODE(KEYCODE_U)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("O") PORT_CODE(KEYCODE_O)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Y") PORT_CODE(KEYCODE_Y)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("P") PORT_CODE(KEYCODE_P)
PORT_BIT(0xE0, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("U 7 \'") PORT_CODE(KEYCODE_U) PORT_CHAR('U') PORT_CHAR('u') PORT_CHAR('7') PORT_CHAR('\'')
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("I 8 (") PORT_CODE(KEYCODE_I) PORT_CHAR('I') PORT_CHAR('i') PORT_CHAR('8') PORT_CHAR('(')
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("O 9 )") PORT_CODE(KEYCODE_O) PORT_CHAR('O') PORT_CHAR('o') PORT_CHAR('9') PORT_CHAR(')')
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Y 6 &") PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') PORT_CHAR('y') PORT_CHAR('6') PORT_CHAR('&')
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("P 0 @") PORT_CODE(KEYCODE_P) PORT_CHAR('P') PORT_CHAR('p') PORT_CHAR('0') PORT_CHAR('@')
PORT_START("LINE7")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("N") PORT_CODE(KEYCODE_N)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M)
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("N ,") PORT_CODE(KEYCODE_N) PORT_CHAR('N') PORT_CHAR('n') PORT_CHAR(',')
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("M .") PORT_CODE(KEYCODE_M) PORT_CHAR('M') PORT_CHAR('m') PORT_CHAR('.')
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Up") PORT_CODE(KEYCODE_UP)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B ?") PORT_CODE(KEYCODE_B) PORT_CHAR('B') PORT_CHAR('b') PORT_CHAR('?')
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL)
PORT_BIT(0xE0, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("LINE8")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Left") PORT_CODE(KEYCODE_LEFT)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Down") PORT_CODE(KEYCODE_DOWN)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Right") PORT_CODE(KEYCODE_RIGHT)
PORT_BIT(0xE0, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("LINE9")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(JOYCODE_Y_DOWN_SWITCH) PORT_PLAYER(1)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(JOYCODE_X_LEFT_SWITCH) PORT_PLAYER(1)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(JOYCODE_Y_UP_SWITCH) PORT_PLAYER(1)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_CODE(KEYCODE_0_PAD) PORT_CODE(JOYCODE_BUTTON1) PORT_PLAYER(1)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT)PORT_CODE(KEYCODE_6_PAD) PORT_CODE(JOYCODE_X_RIGHT_SWITCH) PORT_PLAYER(1)
PORT_BIT(0xE0, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("NMI")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("NMI") PORT_CODE(KEYCODE_ESC)
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("NMI") PORT_CODE(KEYCODE_ESC) PORT_CHANGED_MEMBER(DEVICE_SELF, ondra_state, nmi_button, 0)
INPUT_PORTS_END
INPUT_CHANGED_MEMBER(ondra_state::nmi_button)
{
m_maincpu->set_input_line(INPUT_LINE_NMI, newval ? ASSERT_LINE : CLEAR_LINE);
}
u32 ondra_state::screen_update_ondra(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
u8 *r = m_ram->pointer();
u8 code1=0,code2=0;
int y, x, b;
int Vaddr = 0x2800;
for (x = 0; x < 40; x++)
{
for (y = 127; y >=0; y--)
{
if (m_video_enable)
{
code1 = r[0xd700 + Vaddr + 0x80];
code2 = r[0xd700 + Vaddr + 0x00];
}
for (b = 0; b < 8; b++)
{
bitmap.pix16(2*y, x*8+b) = ((code1 << b) & 0x80) ? 1 : 0;
bitmap.pix16(2*y+1, x*8+b) = ((code2 << b) & 0x80) ? 1 : 0;
}
Vaddr++;
}
Vaddr = (Vaddr - 128) - 256;
}
return 0;
}
WRITE_LINE_MEMBER(ondra_state::vblank_irq)
{
if (state)
@ -124,9 +158,9 @@ WRITE_LINE_MEMBER(ondra_state::vblank_irq)
void ondra_state::ondra(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, 2000000);
m_maincpu->set_addrmap(AS_PROGRAM, &ondra_state::ondra_mem);
m_maincpu->set_addrmap(AS_IO, &ondra_state::ondra_io);
Z80(config, m_maincpu, 8_MHz_XTAL / 4);
m_maincpu->set_addrmap(AS_PROGRAM, &ondra_state::mem_map);
m_maincpu->set_addrmap(AS_IO, &ondra_state::io_map);
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
@ -140,12 +174,13 @@ void ondra_state::ondra(machine_config &config)
PALETTE(config, "palette", palette_device::MONOCHROME);
// sound hardware
SPEAKER(config, "mono").front_center();
BEEP(config, m_beep, 950); // guess
m_beep->add_route(ALL_OUTPUTS, "mono", 0.25);
CASSETTE(config, m_cassette);
m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_ENABLED);
m_cassette->add_route(ALL_OUTPUTS, "mono", 0.05);
m_cassette->set_interface("ondra_cass");
@ -158,31 +193,31 @@ void ondra_state::ondra(machine_config &config)
/* ROM definition */
ROM_START( ondrat )
ROM_REGION( 0x14000, "maincpu", ROMREGION_ERASEFF )
ROM_LOAD( "tesla_a.rom", 0x10000, 0x0800, CRC(6d56b815) SHA1(7feb4071d5142e4c2f891747b75fa4d48ccad262) )
ROM_COPY( "maincpu", 0x10000, 0x10800, 0x0800 )
ROM_COPY( "maincpu", 0x10000, 0x11000, 0x0800 )
ROM_COPY( "maincpu", 0x10000, 0x11800, 0x0800 )
ROM_LOAD( "tesla_b.rom", 0x12000, 0x0800, CRC(5f145eaa) SHA1(c1eac68b13fedc4d0d6f98b15e2a5397f0139dc3) )
ROM_COPY( "maincpu", 0x10000, 0x12800, 0x0800 )
ROM_COPY( "maincpu", 0x10000, 0x13000, 0x0800 )
ROM_COPY( "maincpu", 0x10000, 0x13800, 0x0800 )
ROM_REGION( 0x4000, "maincpu", ROMREGION_ERASEFF )
ROM_LOAD( "tesla_a.d22", 0x0000, 0x0800, CRC(6d56b815) SHA1(7feb4071d5142e4c2f891747b75fa4d48ccad262) )
ROM_LOAD( "tesla_b.d21", 0x2000, 0x0800, CRC(5f145eaa) SHA1(c1eac68b13fedc4d0d6f98b15e2a5397f0139dc3) )
ROM_REGION( 0x0040, "proms", 0 )
ROM_LOAD( "mh74188.d27", 0x0000, 0x0040, CRC(7faceafe) SHA1(597f867e38b1c66d4622662cb01b3aefa680f234) )
ROM_END
ROM_START( ondrav )
ROM_REGION( 0x14000, "maincpu", ROMREGION_ERASEFF )
ROM_LOAD( "vili_a.rom", 0x10000, 0x0800, CRC(76932657) SHA1(1f3700f670f158e4bed256aed751e2c1331a28e8) )
ROM_COPY( "maincpu", 0x10000, 0x10800, 0x0800 )
ROM_COPY( "maincpu", 0x10000, 0x11000, 0x0800 )
ROM_COPY( "maincpu", 0x10000, 0x11800, 0x0800 )
ROM_LOAD( "vili_b.rom", 0x12000, 0x0800, CRC(03a6073f) SHA1(66f198e63f473e09350bcdbb10fe0cf440111bec) )
ROM_COPY( "maincpu", 0x10000, 0x12800, 0x0800 )
ROM_COPY( "maincpu", 0x10000, 0x13000, 0x0800 )
ROM_COPY( "maincpu", 0x10000, 0x13800, 0x0800 )
ROM_REGION( 0x4000, "maincpu", ROMREGION_ERASEFF )
ROM_LOAD( "vili_a.d22", 0x0000, 0x0800, CRC(76932657) SHA1(1f3700f670f158e4bed256aed751e2c1331a28e8) )
ROM_RELOAD(0x0800, 0x0800)
ROM_RELOAD(0x1000, 0x0800)
ROM_RELOAD(0x1800, 0x0800)
ROM_LOAD( "vili_b.d21", 0x2000, 0x0800, CRC(03a6073f) SHA1(66f198e63f473e09350bcdbb10fe0cf440111bec) )
ROM_RELOAD(0x2800, 0x0800)
ROM_RELOAD(0x3000, 0x0800)
ROM_RELOAD(0x3800, 0x0800)
ROM_REGION( 0x0040, "proms", 0 )
ROM_LOAD( "mh74188.d27", 0x0000, 0x0040, CRC(7faceafe) SHA1(597f867e38b1c66d4622662cb01b3aefa680f234) )
ROM_END
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
COMP( 1989, ondrat, 0, 0, ondra, ondra, ondra_state, empty_init, "Tesla", "Ondra", 0 )
COMP( 1989, ondrav, ondrat, 0, ondra, ondra, ondra_state, empty_init, "ViLi", "Ondra ViLi", 0 )
COMP( 1989, ondrat, 0, 0, ondra, ondra, ondra_state, empty_init, "Tesla", "Ondra", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
COMP( 1989, ondrav, ondrat, 0, ondra, ondra, ondra_state, empty_init, "ViLi", "Ondra ViLi", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )

View File

@ -11,63 +11,57 @@
#pragma once
#include "imagedev/cassette.h"
#include "sound/beep.h"
#include "machine/ram.h"
class ondra_state : public driver_device
{
public:
ondra_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_video_enable(0),
m_bank1_status(0),
m_bank2_status(0),
m_nmi_check_timer(nullptr),
m_maincpu(*this, "maincpu"),
m_cassette(*this, "cassette"),
m_ram(*this, RAM_TAG),
m_region_maincpu(*this, "maincpu"),
m_bank1(*this, "bank1"),
m_bank2(*this, "bank2"),
m_bank3(*this, "bank3"),
m_lines(*this, "LINE%u", 0),
m_nmi(*this, "NMI")
{
}
ondra_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_cassette(*this, "cassette")
, m_ram(*this, RAM_TAG)
, m_rom(*this, "maincpu")
, m_bank1(*this, "bank1")
, m_bank2(*this, "bank2")
, m_bank3(*this, "bank3")
, m_beep(*this, "beeper")
, m_io_keyboard(*this, "LINE%u", 0U)
{ }
void ondra(machine_config &config);
DECLARE_INPUT_CHANGED_MEMBER(nmi_button);
private:
uint8_t ondra_keyboard_r(offs_t offset);
void ondra_port_03_w(uint8_t data);
void ondra_port_09_w(uint8_t data);
void ondra_port_0a_w(uint8_t data);
uint32_t screen_update_ondra(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
u8 keyboard_r(offs_t offset);
void port03_w(u8 data);
u8 port09_r();
void port0a_w(u8 data);
u32 screen_update_ondra(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(vblank_irq);
TIMER_CALLBACK_MEMBER(nmi_check_callback);
void ondra_io(address_map &map);
void ondra_mem(address_map &map);
void io_map(address_map &map);
void mem_map(address_map &map);
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
void ondra_update_banks();
void update_banks();
uint8_t m_video_enable;
uint8_t m_bank1_status;
uint8_t m_bank2_status;
emu_timer *m_nmi_check_timer;
bool m_video_enable;
u8 m_bank_status;
u8 m_bank_old;
required_device<cpu_device> m_maincpu;
required_device<cassette_image_device> m_cassette;
required_device<ram_device> m_ram;
required_memory_region m_region_maincpu;
required_memory_region m_rom;
required_memory_bank m_bank1;
required_memory_bank m_bank2;
required_memory_bank m_bank3;
required_ioport_array<10> m_lines;
required_ioport m_nmi;
required_device<beep_device> m_beep;
required_ioport_array<10> m_io_keyboard;
};
#endif // MAME_INCLUDES_ONDRA_H

View File

@ -12,81 +12,118 @@
#include "emu.h"
#include "includes/ondra.h"
#include "cpu/z80/z80.h"
uint8_t ondra_state::ondra_keyboard_r(offs_t offset)
u8 ondra_state::keyboard_r(offs_t offset)
{
uint8_t retVal = 0x00;
u8 data = 0x60;
offset &= 15;
double const valcas = m_cassette->input();
if (valcas < 0.00)
retVal |= 0x80;
data |= (m_cassette->input() < 0.00) ? 0x80: 0;
if ((offset & 0x0f) < m_lines.size())
retVal |= m_lines[offset & 0x0f]->read();
if (offset < m_io_keyboard.size())
data |= (m_io_keyboard[offset]->read() & 0x1f);
else
retVal |= 0x1f;
data |= 0x1f;
return retVal;
return data;
}
void ondra_state::ondra_update_banks()
void ondra_state::update_banks()
{
address_space &space = m_maincpu->space(AS_PROGRAM);
uint8_t *mem = m_region_maincpu->base();
u8 *m = m_rom->base();
u8 *r = m_ram->pointer();
if (m_bank1_status==0) {
space.unmap_write(0x0000, 0x3fff);
m_bank1->set_base(mem + 0x010000);
} else {
space.install_write_bank(0x0000, 0x3fff, "bank1");
m_bank1->set_base(m_ram->pointer() + 0x0000);
}
m_bank2->set_base(m_ram->pointer() + 0x4000);
if (m_bank2_status==0) {
space.install_readwrite_bank(0xe000, 0xffff, "bank3");
m_bank3->set_base(m_ram->pointer() + 0xe000);
} else {
space.unmap_write(0xe000, 0xffff);
space.install_read_handler (0xe000, 0xffff, read8sm_delegate(*this, FUNC(ondra_state::ondra_keyboard_r)));
}
}
void ondra_state::ondra_port_03_w(uint8_t data)
{
m_video_enable = data & 1;
m_bank1_status = (data >> 1) & 1;
m_bank2_status = (data >> 2) & 1;
ondra_update_banks();
m_cassette->output(((data >> 3) & 1) ? -1.0 : +1.0);
}
void ondra_state::ondra_port_09_w(uint8_t data)
{
}
void ondra_state::ondra_port_0a_w(uint8_t data)
{
}
TIMER_CALLBACK_MEMBER(ondra_state::nmi_check_callback)
{
if ((m_nmi->read() & 1) == 1)
if (BIT(m_bank_status, 0) != BIT(m_bank_old, 0))
{
m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
if (BIT(m_bank_status, 0))
{
space.install_write_bank(0x0000, 0x3fff, "bank1");
m_bank1->set_base(r);
}
else
{
space.unmap_write(0x0000, 0x3fff);
m_bank1->set_base(m);
}
}
if (BIT(m_bank_status, 1) != BIT(m_bank_old, 1))
{
if (BIT(m_bank_status, 1))
{
space.unmap_write(0xe000, 0xffff);
space.install_read_handler (0xe000, 0xffff, read8sm_delegate(*this, FUNC(ondra_state::keyboard_r)));
}
else
{
space.install_readwrite_bank(0xe000, 0xffff, "bank3");
m_bank3->set_base(r + 0xe000);
}
}
m_bank_old = m_bank_status;
}
/*
0 - video on/off
1 - banking
2 - banking
3 - cassette out
4 - A0 on pits
5 - A1 on pits */
void ondra_state::port03_w(u8 data)
{
if (BIT(data, 1, 2) != m_bank_status)
{
m_bank_status = BIT(data, 1, 2);
update_banks();
}
m_video_enable = BIT(data, 0);
m_cassette->output(BIT(data, 3) ? -1.0 : +1.0);
}
// external connection
u8 ondra_state::port09_r()
{
return 0xff;
}
/*
0 - a LED next to keyboard
1 - a LED next to keyboard
2 - external
3 - external
4 - cassette relay
5 - speaker
6 - speaker
7 - speaker */
void ondra_state::port0a_w(u8 data)
{
static u16 tones[8] = { 0, 110, 156, 220, 311, 440, 622, 880 }; // a guess
m_cassette->change_state(BIT(data,4) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
u16 tone = tones[BIT(data, 5, 3)];
m_beep->set_state(tone? 1 : 0);
if (tone)
m_beep->set_clock(tone);
}
void ondra_state::machine_reset()
{
m_bank1_status = 0;
m_bank2_status = 0;
ondra_update_banks();
m_beep->set_state(0);
m_video_enable = 0;
m_bank_status = 0;
m_bank_old = 0xff;
update_banks();
m_bank2->set_base(m_ram->pointer() + 0x4000);
}
void ondra_state::machine_start()
{
m_nmi_check_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(ondra_state::nmi_check_callback), this));
m_nmi_check_timer->adjust(attotime::from_hz(10), 0, attotime::from_hz(10));
save_item(NAME(m_video_enable));
save_item(NAME(m_bank_status));
save_item(NAME(m_bank_old));
}

View File

@ -1,47 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Miodrag Milanovic
/***************************************************************************
Ondra driver by Miodrag Milanovic
08/09/2008 Preliminary driver.
****************************************************************************/
#include "emu.h"
#include "includes/ondra.h"
#include "machine/ram.h"
void ondra_state::video_start()
{
m_video_enable = 0;
}
uint32_t ondra_state::screen_update_ondra(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
uint8_t code1,code2;
int y, x, b;
int Vaddr = 0x2800;
if (m_video_enable==1) {
for (x = 0; x < 40; x++)
{
for (y = 127; y >=0; y--)
{
code1 = m_ram->pointer()[0xd700 + Vaddr + 0x80];
code2 = m_ram->pointer()[0xd700 + Vaddr + 0x00];
for (b = 0; b < 8; b++)
{
bitmap.pix16(2*y, x*8+b) = ((code1 << b) & 0x80) ? 1 : 0;
bitmap.pix16(2*y+1, x*8+b) = ((code2 << b) & 0x80) ? 1 : 0;
}
Vaddr++;
}
Vaddr = (Vaddr - 128) - 256;
}
}
return 0;
}