New not working driver WIP (nw)

RC702
This commit is contained in:
Robbbert 2016-09-12 11:18:46 +10:00
parent 051f58226d
commit d9de85ed95
4 changed files with 398 additions and 2 deletions

View File

@ -2515,6 +2515,7 @@ files {
createMESSProjects(_target, _subtarget, "regnecentralen") createMESSProjects(_target, _subtarget, "regnecentralen")
files { files {
MAME_DIR .. "src/mame/drivers/rc702.cpp",
MAME_DIR .. "src/mame/drivers/rc759.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/ms9540.cpp",
MAME_DIR .. "src/mame/drivers/mstation.cpp", MAME_DIR .. "src/mame/drivers/mstation.cpp",
MAME_DIR .. "src/mame/drivers/mt735.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/mx2178.cpp",
MAME_DIR .. "src/mame/drivers/mycom.cpp", MAME_DIR .. "src/mame/drivers/mycom.cpp",
MAME_DIR .. "src/mame/drivers/myvision.cpp", MAME_DIR .. "src/mame/drivers/myvision.cpp",
@ -3378,7 +3380,6 @@ files {
MAME_DIR .. "src/mame/includes/xor100.h", MAME_DIR .. "src/mame/includes/xor100.h",
MAME_DIR .. "src/mame/drivers/xavix.cpp", MAME_DIR .. "src/mame/drivers/xavix.cpp",
MAME_DIR .. "src/mame/drivers/zorba.cpp", MAME_DIR .. "src/mame/drivers/zorba.cpp",
MAME_DIR .. "src/mame/drivers/mvme350.cpp",
} }
end end

391
src/mame/drivers/rc702.cpp Normal file
View File

@ -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 )

View File

@ -4,7 +4,7 @@
mame.lst 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 new driver is added. From time to time we will auto update comments
according to meta-data from source files. according to meta-data from source files.
@ -31352,6 +31352,9 @@ rbislando // B22 (c) 1987 Taito Corporation
@source:rbmk.cpp @source:rbmk.cpp
rbmk // (c) 1995 GMS rbmk // (c) 1995 GMS
@source:rc702.cpp
rc702 // 1979 RC702
@source:rc759.cpp @source:rc759.cpp
rc759 // 1984 RC759 rc759 // 1984 RC759

View File

@ -493,6 +493,7 @@ radio86.cpp
rainbow.cpp rainbow.cpp
rambo.cpp rambo.cpp
ravens.cpp ravens.cpp
rc702.cpp
rc759.cpp rc759.cpp
rd100.cpp rd100.cpp
rd110.cpp rd110.cpp