diff options
-rw-r--r-- | scripts/target/mame/mess.lua | 3 | ||||
-rw-r--r-- | src/mame/drivers/rc702.cpp | 391 | ||||
-rw-r--r-- | src/mame/mame.lst | 5 | ||||
-rw-r--r-- | src/mame/mess.flt | 1 |
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 |