mirror of
https://github.com/holub/mame
synced 2025-04-16 05:24:54 +03:00
ondra: cleanup, added sound.
This commit is contained in:
parent
a80557b412
commit
7147a9a63d
@ -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",
|
||||
|
@ -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 )
|
||||
|
@ -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
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user