summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--scripts/target/mame/mess.lua3
-rw-r--r--src/mame/drivers/rc702.cpp391
-rw-r--r--src/mame/mame.lst5
-rw-r--r--src/mame/mess.flt1
4 files changed, 398 insertions, 2 deletions
diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua
index 923bf4f1f12..62a2c7e5251 100644
--- a/scripts/target/mame/mess.lua
+++ b/scripts/target/mame/mess.lua
@@ -2515,6 +2515,7 @@ files {
createMESSProjects(_target, _subtarget, "regnecentralen")
files {
+ MAME_DIR .. "src/mame/drivers/rc702.cpp",
MAME_DIR .. "src/mame/drivers/rc759.cpp",
}
@@ -3320,6 +3321,7 @@ files {
MAME_DIR .. "src/mame/drivers/ms9540.cpp",
MAME_DIR .. "src/mame/drivers/mstation.cpp",
MAME_DIR .. "src/mame/drivers/mt735.cpp",
+ MAME_DIR .. "src/mame/drivers/mvme350.cpp",
MAME_DIR .. "src/mame/drivers/mx2178.cpp",
MAME_DIR .. "src/mame/drivers/mycom.cpp",
MAME_DIR .. "src/mame/drivers/myvision.cpp",
@@ -3378,7 +3380,6 @@ files {
MAME_DIR .. "src/mame/includes/xor100.h",
MAME_DIR .. "src/mame/drivers/xavix.cpp",
MAME_DIR .. "src/mame/drivers/zorba.cpp",
- MAME_DIR .. "src/mame/drivers/mvme350.cpp",
}
end
diff --git a/src/mame/drivers/rc702.cpp b/src/mame/drivers/rc702.cpp
new file mode 100644
index 00000000000..3878daf432d
--- /dev/null
+++ b/src/mame/drivers/rc702.cpp
@@ -0,0 +1,391 @@
+// license:BSD-3-Clause
+// copyright-holders:Robbbert
+/******************************************************************************************************************
+
+Regnecentralen Piccolo RC702
+
+2016-09-10 Skeleton driver
+
+Undumped prom at IC55 type 74S287
+
+ToDo:
+- Everything
+
+
+****************************************************************************************************************/
+
+#include "emu.h"
+#include "cpu/z80/z80.h"
+#include "machine/upd765.h"
+#include "cpu/z80/z80daisy.h"
+#include "machine/z80pio.h"
+#include "machine/z80dart.h"
+#include "machine/z80ctc.h"
+#include "machine/am9517a.h"
+#include "machine/7474.h"
+#include "bus/rs232/rs232.h"
+#include "machine/clock.h"
+#include "video/i8275.h"
+#include "machine/keyboard.h"
+#include "sound/beep.h"
+
+
+
+class rc702_state : public driver_device
+{
+public:
+ rc702_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_palette(*this, "palette")
+ , m_maincpu(*this, "maincpu")
+ , m_sio1(*this, "sio1")
+ , m_ctc1(*this, "ctc1")
+ , m_pio(*this, "pio")
+ , m_dma(*this, "dma")
+ , m_beep(*this, "beeper")
+ , m_7474(*this, "7474")
+ , m_fdc(*this, "fdc")
+ , m_floppy0(*this, "fdc:0")
+ {
+ }
+
+ DECLARE_DRIVER_INIT(rc702);
+ DECLARE_MACHINE_RESET(rc702);
+ DECLARE_READ8_MEMBER(memory_read_byte);
+ DECLARE_WRITE8_MEMBER(memory_write_byte);
+ DECLARE_WRITE8_MEMBER(port14_w);
+ DECLARE_WRITE8_MEMBER(port18_w);
+ DECLARE_WRITE8_MEMBER(port1c_w);
+ DECLARE_WRITE_LINE_MEMBER(crtc_drq_w);
+ DECLARE_WRITE_LINE_MEMBER(crtc_irq_w);
+ DECLARE_WRITE_LINE_MEMBER(busreq_w);
+ DECLARE_WRITE_LINE_MEMBER(clock_w);
+ DECLARE_WRITE_LINE_MEMBER(zc0_w);
+ DECLARE_WRITE_LINE_MEMBER(tc_w);
+ DECLARE_WRITE_LINE_MEMBER(q_w);
+ DECLARE_WRITE_LINE_MEMBER(qbar_w);
+ I8275_DRAW_CHARACTER_MEMBER(display_pixels);
+ DECLARE_WRITE8_MEMBER(kbd_put);
+
+private:
+ UINT8 *m_charmap;
+ bool m_q_state;
+ bool m_qbar_state;
+ bool m_drq_state;
+ UINT16 m_beepcnt;
+ required_device<palette_device> m_palette;
+ required_device<cpu_device> m_maincpu;
+ required_device<z80dart_device> m_sio1;
+ required_device<z80ctc_device> m_ctc1;
+ required_device<z80pio_device> m_pio;
+ required_device<am9517a_device> m_dma;
+ required_device<beep_device> m_beep;
+ required_device<ttl7474_device> m_7474;
+ required_device<upd765a_device> m_fdc;
+ required_device<floppy_connector> m_floppy0;
+};
+
+
+static ADDRESS_MAP_START(rc702_mem, AS_PROGRAM, 8, rc702_state)
+ AM_RANGE(0x0000, 0x07ff) AM_READ_BANK("bankr0") AM_WRITE_BANK("bankw0")
+ AM_RANGE(0x0800, 0xffff) AM_RAM
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START(rc702_io, AS_IO, 8, rc702_state)
+ ADDRESS_MAP_GLOBAL_MASK(0xff)
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x00, 0x01) AM_DEVREADWRITE("crtc", i8275_device, read, write)
+ AM_RANGE(0x04, 0x05) AM_DEVICE("fdc", upd765a_device, map)
+ AM_RANGE(0x08, 0x0b) AM_DEVREADWRITE("sio1", z80dart_device, ba_cd_r, ba_cd_w)
+ AM_RANGE(0x0c, 0x0f) AM_DEVREADWRITE("ctc1", z80ctc_device, read, write)
+ AM_RANGE(0x10, 0x13) AM_DEVREADWRITE("pio", z80pio_device, read, write)
+ AM_RANGE(0x14, 0x17) AM_READ_PORT("DSW") AM_WRITE(port14_w) // motors
+ AM_RANGE(0x18, 0x1b) AM_WRITE(port18_w) // memory banking
+ AM_RANGE(0x1c, 0x1f) AM_WRITE(port1c_w) // sound
+ AM_RANGE(0xf0, 0xff) AM_DEVREADWRITE("dma", am9517a_device, read, write)
+ADDRESS_MAP_END
+
+/* Input ports */
+static INPUT_PORTS_START( rc702 )
+ PORT_START("DSW")
+ PORT_DIPNAME( 0x01, 0x00, "S01")
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ))
+ PORT_DIPSETTING( 0x00, DEF_STR( On ))
+ PORT_DIPNAME( 0x02, 0x00, "S02")
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ))
+ PORT_DIPSETTING( 0x00, DEF_STR( On ))
+ PORT_DIPNAME( 0x04, 0x00, "S03")
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ))
+ PORT_DIPSETTING( 0x00, DEF_STR( On ))
+ PORT_DIPNAME( 0x08, 0x00, "S04")
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ))
+ PORT_DIPSETTING( 0x00, DEF_STR( On ))
+ PORT_DIPNAME( 0x10, 0x00, "S05")
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ))
+ PORT_DIPSETTING( 0x00, DEF_STR( On ))
+ PORT_DIPNAME( 0x20, 0x00, "S06")
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ))
+ PORT_DIPSETTING( 0x00, DEF_STR( On ))
+ PORT_DIPNAME( 0x40, 0x00, "S07")
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ))
+ PORT_DIPSETTING( 0x00, DEF_STR( On ))
+ PORT_DIPNAME( 0x80, 0x00, "Minifloppy") // also need to switch frequencies to fdc
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ))
+ PORT_DIPSETTING( 0x00, DEF_STR( On ))
+INPUT_PORTS_END
+
+MACHINE_RESET_MEMBER( rc702_state, rc702 )
+{
+ membank("bankr0")->set_entry(0); // point at rom
+ membank("bankw0")->set_entry(0); // always write to ram
+ m_beepcnt = 0xffff;
+ m_maincpu->reset();
+}
+
+WRITE_LINE_MEMBER( rc702_state::q_w )
+{
+ m_q_state = state;
+
+ if (m_q_state && m_drq_state)
+ m_dma->dreq3_w(1);
+ else
+ m_dma->dreq3_w(0);
+}
+
+WRITE_LINE_MEMBER( rc702_state::qbar_w )
+{
+ m_qbar_state = state;
+
+ if (m_qbar_state && m_drq_state)
+ m_dma->dreq2_w(1);
+ else
+ m_dma->dreq2_w(0);
+}
+
+WRITE_LINE_MEMBER( rc702_state::crtc_drq_w )
+{
+ m_drq_state = state;
+
+ if (m_q_state && m_drq_state)
+ m_dma->dreq3_w(1);
+ else
+ m_dma->dreq3_w(0);
+
+ if (m_qbar_state && m_drq_state)
+ m_dma->dreq2_w(1);
+ else
+ m_dma->dreq2_w(0);
+}
+
+WRITE_LINE_MEMBER( rc702_state::tc_w )
+{
+ m_fdc->tc_w(state);
+}
+
+WRITE8_MEMBER( rc702_state::port14_w )
+{
+ floppy_image_device *floppy = m_floppy0->get_device();
+ m_fdc->set_floppy(floppy);
+ floppy->mon_w(!BIT(data, 0));
+}
+
+WRITE8_MEMBER( rc702_state::port18_w )
+{
+ membank("bankr0")->set_entry(1); // replace roms with ram
+}
+
+WRITE8_MEMBER( rc702_state::port1c_w )
+{
+ m_beep->set_state(1);
+ m_beepcnt = 0x3000;
+}
+
+static const rgb_t our_palette[3] = {
+ rgb_t(0x00, 0x00, 0x00), // black
+ rgb_t(0xa0, 0xa0, 0xa0), // white
+ rgb_t(0xff, 0xff, 0xff) // highlight
+};
+
+DRIVER_INIT_MEMBER( rc702_state, rc702 )
+{
+ UINT8 *main = memregion("maincpu")->base();
+
+ membank("bankr0")->configure_entry(1, &main[0x0000]);
+ membank("bankr0")->configure_entry(0, &main[0x10000]);
+ membank("bankw0")->configure_entry(0, &main[0x0000]);
+ m_charmap = memregion("chargen")->base();
+ m_palette->set_pen_colors(0, our_palette, ARRAY_LENGTH(our_palette));
+}
+
+I8275_DRAW_CHARACTER_MEMBER( rc702_state::display_pixels )
+{
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
+ UINT8 pixels = m_charmap[(linecount & 15) | (charcode << 4)];
+
+ if (vsp)
+ pixels = 0;
+
+ if (lten)
+ pixels = 0xff;
+
+ if (rvv)
+ pixels ^= 0xff;
+
+ bitmap.pix32(y, x++) = palette[BIT(pixels, 1) ? (hlgt ? 2 : 1) : 0];
+ bitmap.pix32(y, x++) = palette[BIT(pixels, 2) ? (hlgt ? 2 : 1) : 0];
+ bitmap.pix32(y, x++) = palette[BIT(pixels, 3) ? (hlgt ? 2 : 1) : 0];
+ bitmap.pix32(y, x++) = palette[BIT(pixels, 4) ? (hlgt ? 2 : 1) : 0];
+ bitmap.pix32(y, x++) = palette[BIT(pixels, 5) ? (hlgt ? 2 : 1) : 0];
+ bitmap.pix32(y, x++) = palette[BIT(pixels, 6) ? (hlgt ? 2 : 1) : 0];
+ bitmap.pix32(y, x++) = palette[BIT(pixels, 7) ? (hlgt ? 2 : 1) : 0];
+}
+
+// Baud rate generator. All inputs are 0.614MHz.
+WRITE_LINE_MEMBER( rc702_state::clock_w )
+{
+ m_ctc1->trg0(state);
+ m_ctc1->trg1(state);
+ if (m_beepcnt == 0)
+ m_beep->set_state(0);
+ if (m_beepcnt < 0xfe00)
+ m_beepcnt--;
+}
+
+WRITE_LINE_MEMBER( rc702_state::zc0_w )
+{
+ m_sio1->txca_w(state);
+ m_sio1->rxca_w(state);
+}
+
+WRITE_LINE_MEMBER( rc702_state::crtc_irq_w )
+{
+ m_7474->clear_w(0);
+ m_ctc1->trg2(1);
+ m_7474->clear_w(1);
+ m_ctc1->trg2(0);
+}
+
+WRITE_LINE_MEMBER( rc702_state::busreq_w )
+{
+// since our Z80 has no support for BUSACK, we assume it is granted immediately
+ m_maincpu->set_input_line(Z80_INPUT_LINE_BUSRQ, state);
+ m_dma->hack_w(state); // tell dma that bus has been granted
+}
+
+READ8_MEMBER( rc702_state::memory_read_byte )
+{
+ address_space& prog_space = m_maincpu->space(AS_PROGRAM);
+ return prog_space.read_byte(offset);
+}
+
+WRITE8_MEMBER( rc702_state::memory_write_byte )
+{
+ address_space& prog_space = m_maincpu->space(AS_PROGRAM);
+ prog_space.write_byte(offset, data);
+}
+
+static const z80_daisy_config daisy_chain_intf[] =
+{
+ { "ctc1" },
+ { "sio1" },
+ { "pio" },
+ { nullptr }
+};
+
+WRITE8_MEMBER( rc702_state::kbd_put )
+{
+ m_pio->pa_w(space, 0, data);
+ m_pio->strobe_a(0);
+ m_pio->strobe_a(1);
+}
+
+static SLOT_INTERFACE_START( floppies )
+ SLOT_INTERFACE( "drive0", FLOPPY_525_QD )
+SLOT_INTERFACE_END
+
+static MACHINE_CONFIG_START( rc702, rc702_state )
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", Z80, XTAL_8MHz / 2)
+ MCFG_CPU_PROGRAM_MAP(rc702_mem)
+ MCFG_CPU_IO_MAP(rc702_io)
+ MCFG_Z80_DAISY_CHAIN(daisy_chain_intf)
+
+ MCFG_MACHINE_RESET_OVERRIDE(rc702_state, rc702)
+
+ MCFG_DEVICE_ADD("ctc_clock", CLOCK, 614000)
+ MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(rc702_state, clock_w))
+
+ MCFG_DEVICE_ADD("ctc1", Z80CTC, XTAL_8MHz / 2)
+ MCFG_Z80CTC_ZC0_CB(WRITELINE(rc702_state, zc0_w))
+ MCFG_Z80CTC_ZC1_CB(DEVWRITELINE("sio1", z80dart_device, rxtxcb_w))
+
+ MCFG_Z80DART_ADD("sio1", XTAL_8MHz / 2, 0, 0, 0, 0 )
+ MCFG_Z80DART_OUT_INT_CB(INPUTLINE("maincpu", INPUT_LINE_IRQ0))
+
+ MCFG_DEVICE_ADD("pio", Z80PIO, XTAL_8MHz / 2)
+ MCFG_Z80PIO_OUT_INT_CB(INPUTLINE("maincpu", INPUT_LINE_IRQ0))
+// MCFG_Z80PIO_OUT_PB_CB(WRITE8(rc702_state, portxx_w)) // parallel port
+
+ MCFG_DEVICE_ADD("dma", AM9517A, XTAL_8MHz / 2)
+ MCFG_I8237_OUT_HREQ_CB(WRITELINE(rc702_state, busreq_w))
+ MCFG_I8237_OUT_EOP_CB(WRITELINE(rc702_state, tc_w))
+ MCFG_I8237_IN_MEMR_CB(READ8(rc702_state, memory_read_byte))
+ MCFG_I8237_OUT_MEMW_CB(WRITE8(rc702_state, memory_write_byte))
+ MCFG_I8237_IN_IOR_1_CB(DEVREAD8("fdc", upd765a_device, mdma_r))
+ MCFG_I8237_OUT_IOW_1_CB(DEVWRITE8("fdc", upd765a_device, mdma_w))
+ MCFG_I8237_OUT_IOW_2_CB(DEVWRITE8("crtc", i8275_device, dack_w))
+ MCFG_I8237_OUT_IOW_3_CB(DEVWRITE8("crtc", i8275_device, dack_w))
+
+ MCFG_UPD765A_ADD("fdc", true, true)
+ MCFG_UPD765_INTRQ_CALLBACK(DEVWRITELINE("ctc1", z80ctc_device, trg3))
+ MCFG_UPD765_DRQ_CALLBACK(DEVWRITELINE("dma", am9517a_device, dreq1_w))
+ MCFG_FLOPPY_DRIVE_ADD("fdc:0", floppies, "drive0", floppy_image_device::default_floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+
+ /* Keyboard */
+ MCFG_DEVICE_ADD("keyboard", GENERIC_KEYBOARD, 0)
+ MCFG_GENERIC_KEYBOARD_CB(WRITE8(rc702_state, kbd_put))
+
+ MCFG_DEVICE_ADD("7474", TTL7474, 0)
+ MCFG_7474_COMP_OUTPUT_CB(WRITELINE(rc702_state, q_w))
+ MCFG_7474_COMP_OUTPUT_CB(WRITELINE(rc702_state, qbar_w))
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(50)
+ MCFG_SCREEN_SIZE(272*2, 200+4*8)
+ MCFG_SCREEN_VISIBLE_AREA(0, 272*2-1, 0, 200-1)
+ MCFG_SCREEN_UPDATE_DEVICE("crtc", i8275_device, screen_update)
+
+ MCFG_DEVICE_ADD("crtc", I8275, 11640000/7)
+ MCFG_I8275_CHARACTER_WIDTH(7)
+ MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(rc702_state, display_pixels)
+ MCFG_I8275_IRQ_CALLBACK(WRITELINE(rc702_state, crtc_irq_w))
+ MCFG_I8275_DRQ_CALLBACK(WRITELINE(rc702_state, crtc_drq_w))
+ MCFG_PALETTE_ADD("palette", 3)
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("beeper", BEEP, 1000)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+MACHINE_CONFIG_END
+
+
+/* ROM definition */
+ROM_START( rc702 )
+ ROM_REGION( 0x10800, "maincpu", 0 )
+ ROM_LOAD( "roa375.ic66", 0x10000, 0x0800, CRC(034cf9ea) SHA1(306af9fc779e3d4f51645ba04f8a99b11b5e6084) ) // rc702_boot
+
+ ROM_REGION( 0x14000, "user1", 0 ) // not connected up yet
+ ROM_LOAD( "rob357.rom", 0x0000, 0x0800, CRC(dcf84a48) SHA1(7190d3a898bcbfa212178a4d36afc32bbbc166ef) ) // rc703_boot
+ ROM_LOAD( "rob358.rom", 0x0800, 0x0800, CRC(254aa89e) SHA1(5fb1eb8df1b853b931e670a2ff8d062c1bd8d6bc) ) // rc700_boot
+
+ ROM_REGION( 0x1000, "chargen", 0 )
+ ROM_LOAD( "roa296.rom", 0x0000, 0x0800, CRC(7d7e4548) SHA1(efb8b1ece5f9eeca948202a6396865f26134ff2f) ) // char
+ ROM_LOAD( "roa327.rom", 0x0800, 0x0800, CRC(bed7ddb0) SHA1(201ae9e4ac3812577244b9c9044fadd04fb2b82f) ) // semi_gfx
+ROM_END
+
+/* Driver */
+
+/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
+COMP( 1979, rc702, 0, 0, rc702, rc702, rc702_state, rc702, "Regnecentralen", "RC702 Piccolo", MACHINE_NOT_WORKING )
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 664bef6f2fd..99c77799035 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -4,7 +4,7 @@
mame.lst
- This is automaticaly generated file, that should be manually updated when
+ This is not automatically generated file, and should be manually updated when
new driver is added. From time to time we will auto update comments
according to meta-data from source files.
@@ -31352,6 +31352,9 @@ rbislando // B22 (c) 1987 Taito Corporation
@source:rbmk.cpp
rbmk // (c) 1995 GMS
+@source:rc702.cpp
+rc702 // 1979 RC702
+
@source:rc759.cpp
rc759 // 1984 RC759
diff --git a/src/mame/mess.flt b/src/mame/mess.flt
index 7f29d7691d5..df13c2c4920 100644
--- a/src/mame/mess.flt
+++ b/src/mame/mess.flt
@@ -493,6 +493,7 @@ radio86.cpp
rainbow.cpp
rambo.cpp
ravens.cpp
+rc702.cpp
rc759.cpp
rd100.cpp
rd110.cpp