summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/devices/bus/a2bus/agat7ports.cpp18
-rw-r--r--src/devices/bus/acorn/atom/discpack.cpp11
-rw-r--r--src/devices/bus/acorn/system/fdc.cpp9
-rw-r--r--src/devices/bus/bbc/1mhzbus/1mhzbus.cpp70
-rw-r--r--src/devices/bus/bbc/1mhzbus/1mhzbus.h58
-rw-r--r--src/devices/bus/bbc/1mhzbus/beebsid.cpp67
-rw-r--r--src/devices/bus/bbc/1mhzbus/beebsid.h6
-rw-r--r--src/devices/bus/bbc/1mhzbus/cfa3000opt.cpp22
-rw-r--r--src/devices/bus/bbc/1mhzbus/cfa3000opt.h5
-rw-r--r--src/devices/bus/bbc/1mhzbus/opus3.cpp93
-rw-r--r--src/devices/bus/bbc/1mhzbus/opus3.h10
-rw-r--r--src/devices/bus/bbc/analogue/analogue.cpp28
-rw-r--r--src/devices/bus/bbc/analogue/analogue.h38
-rw-r--r--src/devices/bus/bbc/analogue/bitstik.cpp143
-rw-r--r--src/devices/bus/bbc/analogue/bitstik.h75
-rw-r--r--src/devices/bus/bbc/analogue/cfa3000a.cpp2
-rw-r--r--src/devices/bus/bbc/analogue/joystick.cpp2
-rw-r--r--src/devices/bus/bbc/fdc/acorn.cpp158
-rw-r--r--src/devices/bus/bbc/fdc/acorn.h11
-rw-r--r--src/devices/bus/bbc/fdc/ams.cpp146
-rw-r--r--src/devices/bus/bbc/fdc/ams.h61
-rw-r--r--src/devices/bus/bbc/fdc/cumana.cpp105
-rw-r--r--src/devices/bus/bbc/fdc/cumana.h8
-rw-r--r--src/devices/bus/bbc/fdc/cv1797.cpp86
-rw-r--r--src/devices/bus/bbc/fdc/cv1797.h6
-rw-r--r--src/devices/bus/bbc/fdc/fdc.cpp56
-rw-r--r--src/devices/bus/bbc/fdc/fdc.h47
-rw-r--r--src/devices/bus/bbc/fdc/microware.cpp176
-rw-r--r--src/devices/bus/bbc/fdc/microware.h68
-rw-r--r--src/devices/bus/bbc/fdc/opus.cpp82
-rw-r--r--src/devices/bus/bbc/fdc/opus.h15
-rw-r--r--src/devices/bus/bbc/fdc/watford.cpp164
-rw-r--r--src/devices/bus/bbc/fdc/watford.h20
-rw-r--r--src/devices/bus/bbc/joyport/joyport.cpp12
-rw-r--r--src/devices/bus/bbc/joyport/joyport.h33
-rw-r--r--src/devices/bus/bbc/tube/tube.cpp44
-rw-r--r--src/devices/bus/bbc/tube/tube.h38
-rw-r--r--src/devices/bus/bbc/tube/tube_6502.cpp21
-rw-r--r--src/devices/bus/bbc/tube/tube_65c102.cpp21
-rw-r--r--src/devices/bus/bbc/tube/tube_80286.cpp29
-rw-r--r--src/devices/bus/bbc/tube/tube_arm.cpp22
-rw-r--r--src/devices/bus/bbc/tube/tube_z80.cpp29
-rw-r--r--src/devices/bus/bbc/userport/userport.h30
-rw-r--r--src/devices/bus/generic/slot.h12
-rw-r--r--src/devices/bus/isa/com.cpp18
-rw-r--r--src/devices/bus/isa/myb3k_com.cpp9
-rw-r--r--src/devices/bus/isa/p1_sound.cpp8
-rw-r--r--src/devices/bus/rs232/hlemouse.cpp691
-rw-r--r--src/devices/bus/rs232/hlemouse.h221
-rw-r--r--src/devices/bus/rs232/ser_mouse.cpp267
-rw-r--r--src/devices/bus/rs232/ser_mouse.h84
-rw-r--r--src/devices/bus/sbus/sbus.cpp2
-rw-r--r--src/devices/bus/sunkbd/hlekbd.cpp17
-rw-r--r--src/devices/bus/sunkbd/hlekbd.h6
-rw-r--r--src/devices/bus/sunkbd/sunkbd.cpp108
-rw-r--r--src/devices/bus/sunkbd/sunkbd.h11
-rw-r--r--src/devices/bus/sunmouse/hlemouse.cpp314
-rw-r--r--src/devices/bus/sunmouse/hlemouse.h82
-rw-r--r--src/devices/bus/sunmouse/sunmouse.cpp184
-rw-r--r--src/devices/bus/sunmouse/sunmouse.h84
-rw-r--r--src/devices/cpu/nec/v53.cpp12
-rw-r--r--src/devices/cpu/psx/psx.cpp8
-rw-r--r--src/devices/cpu/psx/sio.h25
-rw-r--r--src/devices/cpu/sparc/mb86901.cpp13
-rw-r--r--src/devices/cpu/sparc/sparcdefs.h1
-rw-r--r--src/devices/cpu/sparc/sparcv8ops.ipp2
-rw-r--r--src/devices/machine/i8251.cpp35
-rw-r--r--src/devices/machine/i8251.h15
-rw-r--r--src/devices/machine/i8271.cpp18
-rw-r--r--src/devices/machine/i8271.h2
-rw-r--r--src/devices/machine/nscsi_bus.cpp5
-rw-r--r--src/devices/machine/nscsi_hd.cpp28
-rw-r--r--src/devices/machine/timekpr.cpp12
-rw-r--r--src/devices/machine/tube.h27
-rw-r--r--src/devices/sound/2608intf.cpp24
-rw-r--r--src/devices/sound/2608intf.h11
-rw-r--r--src/devices/sound/2610intf.cpp48
-rw-r--r--src/devices/sound/2610intf.h17
-rw-r--r--src/devices/sound/8950intf.cpp13
-rw-r--r--src/devices/sound/8950intf.h10
-rw-r--r--src/devices/sound/fm.cpp70
-rw-r--r--src/devices/sound/fm.h11
-rw-r--r--src/devices/sound/fmopl.cpp8
-rw-r--r--src/devices/sound/fmopl.h4
-rw-r--r--src/devices/sound/ymdeltat.cpp32
-rw-r--r--src/devices/sound/ymdeltat.h5
-rw-r--r--src/devices/video/scn2674.cpp17
-rw-r--r--src/emu/diserial.h24
-rw-r--r--src/emu/render.cpp50
-rw-r--r--src/emu/xtal.cpp2
-rw-r--r--src/lib/formats/acorn_dsk.cpp4
-rw-r--r--src/mame/audio/dsbz80.cpp3
-rw-r--r--src/mame/audio/segam1audio.cpp3
-rw-r--r--src/mame/drivers/a7150.cpp3
-rw-r--r--src/mame/drivers/alphatpx.cpp6
-rw-r--r--src/mame/drivers/alphatro.cpp3
-rw-r--r--src/mame/drivers/ampex210.cpp27
-rw-r--r--src/mame/drivers/amust.cpp6
-rw-r--r--src/mame/drivers/att4425.cpp3
-rw-r--r--src/mame/drivers/b2m.cpp6
-rw-r--r--src/mame/drivers/bbc.cpp744
-rw-r--r--src/mame/drivers/bingoc.cpp24
-rw-r--r--src/mame/drivers/bw2.cpp3
-rw-r--r--src/mame/drivers/cgc7900.cpp6
-rw-r--r--src/mame/drivers/cit101.cpp18
-rw-r--r--src/mame/drivers/cit220.cpp3
-rw-r--r--src/mame/drivers/compis.cpp18
-rw-r--r--src/mame/drivers/decwritr.cpp5
-rw-r--r--src/mame/drivers/duet16.cpp3
-rw-r--r--src/mame/drivers/dvk_ksm.cpp6
-rw-r--r--src/mame/drivers/ec7915.cpp3
-rw-r--r--src/mame/drivers/ecoinfr.cpp3
-rw-r--r--src/mame/drivers/einstein.cpp3
-rw-r--r--src/mame/drivers/elwro800.cpp18
-rw-r--r--src/mame/drivers/excali64.cpp3
-rw-r--r--src/mame/drivers/facit4440.cpp2
-rw-r--r--src/mame/drivers/fanucspmg.cpp12
-rw-r--r--src/mame/drivers/fb01.cpp3
-rw-r--r--src/mame/drivers/fk1.cpp3
-rw-r--r--src/mame/drivers/fmtowns.cpp7
-rw-r--r--src/mame/drivers/h8.cpp6
-rw-r--r--src/mame/drivers/hh_sm510.cpp3
-rw-r--r--src/mame/drivers/hp64k.cpp14
-rw-r--r--src/mame/drivers/ibm6580.cpp6
-rw-r--r--src/mame/drivers/ibmpcjr.cpp9
-rw-r--r--src/mame/drivers/icebox.cpp6
-rw-r--r--src/mame/drivers/imds2.cpp6
-rw-r--r--src/mame/drivers/imsai.cpp6
-rw-r--r--src/mame/drivers/ipc.cpp6
-rw-r--r--src/mame/drivers/irisha.cpp3
-rw-r--r--src/mame/drivers/isbc.cpp12
-rw-r--r--src/mame/drivers/isbc8010.cpp3
-rw-r--r--src/mame/drivers/isbc8030.cpp3
-rw-r--r--src/mame/drivers/kyocera.cpp3
-rw-r--r--src/mame/drivers/mbc200.cpp6
-rw-r--r--src/mame/drivers/mc1502.cpp3
-rw-r--r--src/mame/drivers/meritum.cpp3
-rw-r--r--src/mame/drivers/mfabfz.cpp9
-rw-r--r--src/mame/drivers/mice.cpp6
-rw-r--r--src/mame/drivers/microdec.cpp6
-rw-r--r--src/mame/drivers/model1.cpp24
-rw-r--r--src/mame/drivers/model2.cpp8
-rw-r--r--src/mame/drivers/model3.cpp8
-rw-r--r--src/mame/drivers/ms6102.cpp3
-rw-r--r--src/mame/drivers/multi8.cpp3
-rw-r--r--src/mame/drivers/namcos2.cpp68
-rw-r--r--src/mame/drivers/nc.cpp6
-rw-r--r--src/mame/drivers/neogeo.cpp89
-rw-r--r--src/mame/drivers/nforcepc.cpp92
-rw-r--r--src/mame/drivers/ngen.cpp26
-rw-r--r--src/mame/drivers/octopus.cpp3
-rw-r--r--src/mame/drivers/okean240.cpp6
-rw-r--r--src/mame/drivers/opwolf.cpp47
-rw-r--r--src/mame/drivers/pc.cpp3
-rw-r--r--src/mame/drivers/pc100.cpp3
-rw-r--r--src/mame/drivers/pc6001.cpp9
-rw-r--r--src/mame/drivers/pc8001.cpp3
-rw-r--r--src/mame/drivers/pc8401a.cpp3
-rw-r--r--src/mame/drivers/pc8801.cpp3
-rw-r--r--src/mame/drivers/pc9801.cpp3
-rw-r--r--src/mame/drivers/pcat_dyn.cpp4
-rw-r--r--src/mame/drivers/pcipc.cpp29
-rw-r--r--src/mame/drivers/pcw16.cpp4
-rw-r--r--src/mame/drivers/peoplepc.cpp6
-rw-r--r--src/mame/drivers/pg685.cpp12
-rw-r--r--src/mame/drivers/pimps.cpp6
-rw-r--r--src/mame/drivers/poly88.cpp3
-rw-r--r--src/mame/drivers/pp01.cpp3
-rw-r--r--src/mame/drivers/psx.cpp24
-rw-r--r--src/mame/drivers/pwrview.cpp3
-rw-r--r--src/mame/drivers/px8.cpp3
-rw-r--r--src/mame/drivers/qtsbc.cpp9
-rw-r--r--src/mame/drivers/rainbow.cpp12
-rw-r--r--src/mame/drivers/sage2.cpp6
-rw-r--r--src/mame/drivers/sbrain.cpp6
-rw-r--r--src/mame/drivers/scopus.cpp3
-rw-r--r--src/mame/drivers/sdk80.cpp3
-rw-r--r--src/mame/drivers/sdk86.cpp3
-rw-r--r--src/mame/drivers/seattlecmp.cpp3
-rw-r--r--src/mame/drivers/segam1.cpp3
-rw-r--r--src/mame/drivers/seibucats.cpp6
-rw-r--r--src/mame/drivers/selz80.cpp3
-rw-r--r--src/mame/drivers/sg1000.cpp3
-rw-r--r--src/mame/drivers/sm1800.cpp3
-rw-r--r--src/mame/drivers/sm7238.cpp9
-rw-r--r--src/mame/drivers/softbox.cpp3
-rw-r--r--src/mame/drivers/sun3.cpp73
-rw-r--r--src/mame/drivers/sun3x.cpp4
-rw-r--r--src/mame/drivers/sun4.cpp177
-rw-r--r--src/mame/drivers/sys9002.cpp10
-rw-r--r--src/mame/drivers/taitogn.cpp52
-rw-r--r--src/mame/drivers/tandy2k.cpp2
-rw-r--r--src/mame/drivers/tim100.cpp6
-rw-r--r--src/mame/drivers/trs80.cpp3
-rw-r--r--src/mame/drivers/tsispch.cpp3
-rw-r--r--src/mame/drivers/unior.cpp3
-rw-r--r--src/mame/drivers/v100.cpp8
-rw-r--r--src/mame/drivers/v102.cpp3
-rw-r--r--src/mame/drivers/v1050.cpp8
-rw-r--r--src/mame/drivers/v550.cpp3
-rw-r--r--src/mame/drivers/vector4.cpp9
-rw-r--r--src/mame/drivers/vectrix.cpp3
-rw-r--r--src/mame/drivers/vgmplay.cpp183
-rw-r--r--src/mame/drivers/video21.cpp7
-rw-r--r--src/mame/drivers/vixen.cpp3
-rw-r--r--src/mame/drivers/vk100.cpp6
-rw-r--r--src/mame/drivers/votrpss.cpp3
-rw-r--r--src/mame/drivers/vp122.cpp3
-rw-r--r--src/mame/drivers/vt100.cpp5
-rw-r--r--src/mame/drivers/xor100.cpp6
-rw-r--r--src/mame/drivers/zn.cpp182
-rw-r--r--src/mame/drivers/zorba.cpp9
-rw-r--r--src/mame/includes/bbc.h8
-rw-r--r--src/mame/includes/model1.h6
-rw-r--r--src/mame/includes/nforcepc.h47
-rw-r--r--src/mame/machine/bbc.cpp73
-rw-r--r--src/mame/machine/cat702.h5
-rw-r--r--src/mame/machine/mbc55x.cpp8
-rw-r--r--src/mame/machine/model1.cpp2
-rw-r--r--src/mame/machine/model1io2.cpp4
-rw-r--r--src/mame/machine/pk8020.cpp28
-rw-r--r--src/mame/machine/pmd85.cpp13
-rw-r--r--src/mame/machine/znmcu.h25
-rw-r--r--src/mame/mame.lst14
-rw-r--r--src/mame/video/model1.cpp2
-rw-r--r--src/mame/video/pcd.cpp75
-rw-r--r--src/mame/video/pcd.h10
-rw-r--r--src/osd/modules/render/d3d/d3dhlsl.cpp2
228 files changed, 4960 insertions, 2600 deletions
diff --git a/src/devices/bus/a2bus/agat7ports.cpp b/src/devices/bus/a2bus/agat7ports.cpp
index aee242fb6fb..a2d8e8b81cc 100644
--- a/src/devices/bus/a2bus/agat7ports.cpp
+++ b/src/devices/bus/a2bus/agat7ports.cpp
@@ -122,14 +122,7 @@ uint8_t a2bus_agat7_ports_device::read_c0nx(uint8_t offset)
break;
case 8:
- if (offset & 1)
- {
- data = m_d10->status_r(machine().dummy_space(), 0);
- }
- else
- {
- data = m_d10->data_r(machine().dummy_space(), 0);
- }
+ data = m_d10->read(offset & 1);
break;
}
@@ -150,14 +143,7 @@ void a2bus_agat7_ports_device::write_c0nx(uint8_t offset, uint8_t data)
break;
case 8:
- if (offset & 1)
- {
- m_d10->control_w(machine().dummy_space(), 0, data);
- }
- else
- {
- m_d10->data_w(machine().dummy_space(), 0, data);
- }
+ m_d10->write(offset & 1, data);
break;
}
}
diff --git a/src/devices/bus/acorn/atom/discpack.cpp b/src/devices/bus/acorn/atom/discpack.cpp
index 8d795e5ac4b..63a29d403f1 100644
--- a/src/devices/bus/acorn/atom/discpack.cpp
+++ b/src/devices/bus/acorn/atom/discpack.cpp
@@ -34,7 +34,7 @@ static void atom_floppies(device_slot_interface &device)
ROM_START( discpack )
ROM_REGION(0x1000, "dos_rom", 0)
- ROM_LOAD("dosrom.ic18", 0x0000, 0x1000, CRC(c431a9b7) SHA1(71ea0a4b8d9c3caf9718fc7cc279f4306a23b39c))
+ ROM_LOAD("dosrom.ic15", 0x0000, 0x1000, CRC(c431a9b7) SHA1(71ea0a4b8d9c3caf9718fc7cc279f4306a23b39c))
ROM_END
//-------------------------------------------------
@@ -43,14 +43,12 @@ ROM_END
void atom_discpack_device::device_add_mconfig(machine_config &config)
{
- I8271(config, m_fdc, 0);
+ I8271(config, m_fdc, 4_MHz_XTAL / 2);
m_fdc->intrq_wr_callback().set(FUNC(atom_discpack_device::fdc_intrq_w));
m_fdc->hdl_wr_callback().set(FUNC(atom_discpack_device::motor_w));
m_fdc->opt_wr_callback().set(FUNC(atom_discpack_device::side_w));
- FLOPPY_CONNECTOR(config, m_floppy[0], atom_floppies, "525sssd", atom_discpack_device::floppy_formats);
- m_floppy[0]->enable_sound(true);
- FLOPPY_CONNECTOR(config, m_floppy[1], atom_floppies, nullptr, atom_discpack_device::floppy_formats);
- m_floppy[1]->enable_sound(true);
+ FLOPPY_CONNECTOR(config, m_floppy[0], atom_floppies, "525sssd", atom_discpack_device::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, m_floppy[1], atom_floppies, nullptr, atom_discpack_device::floppy_formats).enable_sound(true);
}
@@ -102,6 +100,7 @@ WRITE_LINE_MEMBER(atom_discpack_device::motor_w)
{
if (m_floppy[0]->get_device()) m_floppy[0]->get_device()->mon_w(!state);
if (m_floppy[1]->get_device()) m_floppy[1]->get_device()->mon_w(!state);
+ m_fdc->ready_w(!state);
}
WRITE_LINE_MEMBER(atom_discpack_device::side_w)
diff --git a/src/devices/bus/acorn/system/fdc.cpp b/src/devices/bus/acorn/system/fdc.cpp
index 61fd022f335..398736eab9e 100644
--- a/src/devices/bus/acorn/system/fdc.cpp
+++ b/src/devices/bus/acorn/system/fdc.cpp
@@ -42,14 +42,12 @@ static void acorn_floppies(device_slot_interface &device)
void acorn_fdc_device::device_add_mconfig(machine_config &config)
{
- I8271(config, m_fdc, 0);
+ I8271(config, m_fdc, 4_MHz_XTAL / 2);
m_fdc->intrq_wr_callback().set(FUNC(acorn_fdc_device::bus_nmi_w));
m_fdc->hdl_wr_callback().set(FUNC(acorn_fdc_device::motor_w));
m_fdc->opt_wr_callback().set(FUNC(acorn_fdc_device::side_w));
- FLOPPY_CONNECTOR(config, m_floppy[0], acorn_floppies, "525qd", acorn_fdc_device::floppy_formats);
- m_floppy[0]->enable_sound(true);
- FLOPPY_CONNECTOR(config, m_floppy[1], acorn_floppies, "525qd", acorn_fdc_device::floppy_formats);
- m_floppy[1]->enable_sound(true);
+ FLOPPY_CONNECTOR(config, m_floppy[0], acorn_floppies, "525qd", acorn_fdc_device::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, m_floppy[1], acorn_floppies, "525qd", acorn_fdc_device::floppy_formats).enable_sound(true);
}
@@ -99,6 +97,7 @@ WRITE_LINE_MEMBER(acorn_fdc_device::motor_w)
{
if (m_floppy[0]->get_device()) m_floppy[0]->get_device()->mon_w(!state);
if (m_floppy[1]->get_device()) m_floppy[1]->get_device()->mon_w(!state);
+ m_fdc->ready_w(!state);
}
WRITE_LINE_MEMBER(acorn_fdc_device::side_w)
diff --git a/src/devices/bus/bbc/1mhzbus/1mhzbus.cpp b/src/devices/bus/bbc/1mhzbus/1mhzbus.cpp
index 6fa2407aae7..06458b4d748 100644
--- a/src/devices/bus/bbc/1mhzbus/1mhzbus.cpp
+++ b/src/devices/bus/bbc/1mhzbus/1mhzbus.cpp
@@ -33,16 +33,6 @@ device_bbc_1mhzbus_interface::device_bbc_1mhzbus_interface(const machine_config
}
-//-------------------------------------------------
-// ~device_bbc_1mhzbus_interface - destructor
-//-------------------------------------------------
-
-device_bbc_1mhzbus_interface::~device_bbc_1mhzbus_interface()
-{
-}
-
-
-
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
@@ -62,15 +52,6 @@ bbc_1mhzbus_slot_device::bbc_1mhzbus_slot_device(const machine_config &mconfig,
//-------------------------------------------------
-// bbc_1mhzbus_slot_device - destructor
-//-------------------------------------------------
-
-bbc_1mhzbus_slot_device::~bbc_1mhzbus_slot_device()
-{
-}
-
-
-//-------------------------------------------------
// device_validity_check -
//-------------------------------------------------
@@ -107,10 +88,40 @@ void bbc_1mhzbus_slot_device::device_reset()
{
}
-WRITE_LINE_MEMBER(bbc_1mhzbus_slot_device::rst_w)
+//-------------------------------------------------
+// read
+//-------------------------------------------------
+
+READ8_MEMBER(bbc_1mhzbus_slot_device::fred_r)
+{
+ if (m_card)
+ return m_card->fred_r(space, offset);
+ else
+ return 0xff;
+}
+
+READ8_MEMBER(bbc_1mhzbus_slot_device::jim_r)
+{
+ if (m_card)
+ return m_card->jim_r(space, offset);
+ else
+ return 0xff;
+}
+
+//-------------------------------------------------
+// write
+//-------------------------------------------------
+
+WRITE8_MEMBER(bbc_1mhzbus_slot_device::fred_w)
+{
+ if (m_card)
+ m_card->fred_w(space, offset, data);
+}
+
+WRITE8_MEMBER(bbc_1mhzbus_slot_device::jim_w)
{
if (m_card)
- m_card->rst_w(state);
+ m_card->jim_w(space, offset, data);
}
//-------------------------------------------------
@@ -122,6 +133,7 @@ WRITE_LINE_MEMBER(bbc_1mhzbus_slot_device::rst_w)
//#include "teletext.h"
//#include "ieee488.h"
//#include "m5000.h"
+//#include "scsi.h"
//#include "multiform.h"
#include "opus3.h"
//#include "ramdisc.h"
@@ -135,15 +147,17 @@ void bbc_1mhzbus_devices(device_slot_interface &device)
{
// device.option_add("teletext", BBC_TELETEXT); /* Acorn ANE01 Teletext Adapter */
// device.option_add("ieee488", BBC_IEEE488); /* Acorn ANK01 IEEE488 Interface */
-// device.option_add("m500", BBC_M500); /* Acorn ANV02 Music 500 */
+ //device.option_add("m500", BBC_M500); /* Acorn ANV02 Music 500 */
+ //device.option_add("awdd", BBC_AWDD); /* Acorn Winchester 110/130 */
+//..device.option_add("twdd", BBC_TWDD); /* Technomatic Winchester (Akhter Host Adaptor + ABD4070 */
// device.option_add("m2000", BBC_M2000); /* Hybrid Music 2000 MIDI Interface */
-// device.option_add("m3000", BBC_M3000); /* Hybrid Music 3000 Expander */
-// device.option_add("m5000", BBC_M5000); /* Hybrid Music 5000 Synthesiser */
-// device.option_add("multiform", BBC_MULTIFORM); /* Technomatic Multiform Z80 */
+ //device.option_add("m3000", BBC_M3000); /* Hybrid Music 3000 Expander */
+ //device.option_add("m5000", BBC_M5000); /* Hybrid Music 5000 Synthesiser */
+ //device.option_add("multiform", BBC_MULTIFORM); /* Technomatic Multiform Z80 */
device.option_add("opus3", BBC_OPUS3); /* Opus Challenger 3 */
-// device.option_add("ramdisc", BBC_RAMDISC); /* Morley Electronics RAM Disc */
-// device.option_add("graduate", BBC_GRADUATE); /* The Torch Graduate G400/G800 */
+ //device.option_add("ramdisc", BBC_RAMDISC); /* Morley Electronics RAM Disc */
+ //device.option_add("graduate", BBC_GRADUATE); /* The Torch Graduate G400/G800 */
device.option_add("beebsid", BBC_BEEBSID); /* BeebSID */
-// device.option_add("prisma3", BBC_PRISMA3); /* PRISMA-3 - Millipede 1989 */
+ //device.option_add("prisma3", BBC_PRISMA3); /* PRISMA-3 - Millipede 1989 */
device.option_add("cfa3000opt", CFA3000_OPT); /* Henson CFA 3000 Option Board */
}
diff --git a/src/devices/bus/bbc/1mhzbus/1mhzbus.h b/src/devices/bus/bbc/1mhzbus/1mhzbus.h
index 15e4721e556..c1229718494 100644
--- a/src/devices/bus/bbc/1mhzbus/1mhzbus.h
+++ b/src/devices/bus/bbc/1mhzbus/1mhzbus.h
@@ -80,33 +80,6 @@
//**************************************************************************
-// CONSTANTS
-//**************************************************************************
-
-#define BBC_1MHZBUS_SLOT_TAG "1mhzbus"
-
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_BBC_1MHZBUS_SLOT_ADD(_tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, BBC_1MHZBUS_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-#define MCFG_BBC_PASSTHRU_1MHZBUS_SLOT_ADD() \
- MCFG_BBC_1MHZBUS_SLOT_ADD(BBC_1MHZBUS_SLOT_TAG, bbc_1mhzbus_devices, nullptr) \
- MCFG_BBC_1MHZBUS_SLOT_IRQ_HANDLER(WRITELINE(DEVICE_SELF_OWNER, bbc_1mhzbus_slot_device, irq_w)) \
- MCFG_BBC_1MHZBUS_SLOT_NMI_HANDLER(WRITELINE(DEVICE_SELF_OWNER, bbc_1mhzbus_slot_device, nmi_w))
-
-#define MCFG_BBC_1MHZBUS_SLOT_IRQ_HANDLER(_devcb) \
- downcast<bbc_1mhzbus_slot_device &>(*device).set_irq_handler(DEVCB_##_devcb);
-
-#define MCFG_BBC_1MHZBUS_SLOT_NMI_HANDLER(_devcb) \
- downcast<bbc_1mhzbus_slot_device &>(*device).set_nmi_handler(DEVCB_##_devcb);
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -118,14 +91,27 @@ class bbc_1mhzbus_slot_device : public device_t, public device_slot_interface
{
public:
// construction/destruction
- bbc_1mhzbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual ~bbc_1mhzbus_slot_device();
+ template <typename T>
+ bbc_1mhzbus_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&slot_options, const char *default_option)
+ : bbc_1mhzbus_slot_device(mconfig, tag, owner)
+ {
+ option_reset();
+ slot_options(*this);
+ set_default_option(default_option);
+ set_fixed(false);
+ }
+
+ bbc_1mhzbus_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0);
// callbacks
- template <class Object> devcb_base &set_irq_handler(Object &&cb) { return m_irq_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_nmi_handler(Object &&cb) { return m_nmi_handler.set_callback(std::forward<Object>(cb)); }
+ auto irq_handler() { return m_irq_handler.bind(); }
+ auto nmi_handler() { return m_nmi_handler.bind(); }
+
+ virtual DECLARE_READ8_MEMBER(fred_r);
+ virtual DECLARE_WRITE8_MEMBER(fred_w);
+ virtual DECLARE_READ8_MEMBER(jim_r);
+ virtual DECLARE_WRITE8_MEMBER(jim_w);
- DECLARE_WRITE_LINE_MEMBER( rst_w );
DECLARE_WRITE_LINE_MEMBER( irq_w ) { m_irq_handler(state); }
DECLARE_WRITE_LINE_MEMBER( nmi_w ) { m_nmi_handler(state); }
@@ -148,10 +134,10 @@ private:
class device_bbc_1mhzbus_interface : public device_slot_card_interface
{
public:
- // construction/destruction
- virtual ~device_bbc_1mhzbus_interface();
-
- virtual DECLARE_WRITE_LINE_MEMBER(rst_w) { }
+ virtual DECLARE_READ8_MEMBER(fred_r) { return 0xff; }
+ virtual DECLARE_WRITE8_MEMBER(fred_w) { }
+ virtual DECLARE_READ8_MEMBER(jim_r) { return 0xff; }
+ virtual DECLARE_WRITE8_MEMBER(jim_w) { }
protected:
device_bbc_1mhzbus_interface(const machine_config &mconfig, device_t &device);
diff --git a/src/devices/bus/bbc/1mhzbus/beebsid.cpp b/src/devices/bus/bbc/1mhzbus/beebsid.cpp
index c2e9509b658..1906914840b 100644
--- a/src/devices/bus/bbc/1mhzbus/beebsid.cpp
+++ b/src/devices/bus/bbc/1mhzbus/beebsid.cpp
@@ -13,13 +13,6 @@
//**************************************************************************
-// MACROS / CONSTANTS
-//**************************************************************************
-
-#define MOS8580_TAG "mos8580"
-
-
-//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
@@ -30,13 +23,16 @@ DEFINE_DEVICE_TYPE(BBC_BEEBSID, bbc_beebsid_device, "beebsid", "BeebSID")
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(bbc_beebsid_device::device_add_mconfig)
+void bbc_beebsid_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD(MOS8580_TAG, MOS8580, XTAL(16'000'000) / 16)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
+ MOS8580(config, m_sid, 16_MHz_XTAL / 16);
+ m_sid->add_route(ALL_OUTPUTS, "speaker", 1.0);
- MCFG_BBC_PASSTHRU_1MHZBUS_SLOT_ADD()
-MACHINE_CONFIG_END
+ BBC_1MHZBUS_SLOT(config, m_1mhzbus, bbc_1mhzbus_devices, nullptr);
+ m_1mhzbus->irq_handler().set(DEVICE_SELF_OWNER, FUNC(bbc_1mhzbus_slot_device::irq_w));
+ m_1mhzbus->nmi_handler().set(DEVICE_SELF_OWNER, FUNC(bbc_1mhzbus_slot_device::nmi_w));
+}
//**************************************************************************
@@ -50,7 +46,8 @@ MACHINE_CONFIG_END
bbc_beebsid_device::bbc_beebsid_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, BBC_BEEBSID, tag, owner, clock),
device_bbc_1mhzbus_interface(mconfig, *this),
- m_sid(*this, MOS8580_TAG)
+ m_1mhzbus(*this, "1mhzbus"),
+ m_sid(*this, "mos8580")
{
}
@@ -61,7 +58,47 @@ bbc_beebsid_device::bbc_beebsid_device(const machine_config &mconfig, const char
void bbc_beebsid_device::device_start()
{
- address_space& space = machine().device("maincpu")->memory().space(AS_PROGRAM);
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+READ8_MEMBER(bbc_beebsid_device::fred_r)
+{
+ uint8_t data = 0xff;
- space.install_readwrite_handler(0xfc20, 0xfc3f, read8_delegate(FUNC(mos8580_device::read), (mos8580_device*)m_sid), write8_delegate(FUNC(mos8580_device::write), (mos8580_device*)m_sid));
+ if (offset >= 0x20 && offset < 0x40)
+ {
+ data = m_sid->read(space, offset);
+ }
+
+ data &= m_1mhzbus->fred_r(space, offset);
+
+ return data;
+}
+
+WRITE8_MEMBER(bbc_beebsid_device::fred_w)
+{
+ if (offset >= 0x20 && offset < 0x40)
+ {
+ m_sid->write(space, offset, data);
+ }
+
+ m_1mhzbus->fred_w(space, offset, data);
+}
+
+READ8_MEMBER(bbc_beebsid_device::jim_r)
+{
+ uint8_t data = 0xff;
+
+ data &= m_1mhzbus->jim_r(space, offset);
+
+ return data;
+}
+
+WRITE8_MEMBER(bbc_beebsid_device::jim_w)
+{
+ m_1mhzbus->jim_w(space, offset, data);
}
diff --git a/src/devices/bus/bbc/1mhzbus/beebsid.h b/src/devices/bus/bbc/1mhzbus/beebsid.h
index 30e20bf07d7..d78d5486c10 100644
--- a/src/devices/bus/bbc/1mhzbus/beebsid.h
+++ b/src/devices/bus/bbc/1mhzbus/beebsid.h
@@ -34,7 +34,13 @@ protected:
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override;
+ virtual DECLARE_READ8_MEMBER(fred_r) override;
+ virtual DECLARE_WRITE8_MEMBER(fred_w) override;
+ virtual DECLARE_READ8_MEMBER(jim_r) override;
+ virtual DECLARE_WRITE8_MEMBER(jim_w) override;
+
private:
+ required_device<bbc_1mhzbus_slot_device> m_1mhzbus;
required_device<mos8580_device> m_sid;
};
diff --git a/src/devices/bus/bbc/1mhzbus/cfa3000opt.cpp b/src/devices/bus/bbc/1mhzbus/cfa3000opt.cpp
index 63f2229b27a..0946d9cdf82 100644
--- a/src/devices/bus/bbc/1mhzbus/cfa3000opt.cpp
+++ b/src/devices/bus/bbc/1mhzbus/cfa3000opt.cpp
@@ -91,26 +91,20 @@ cfa3000_opt_device::cfa3000_opt_device(const machine_config &mconfig, const char
void cfa3000_opt_device::device_start()
{
- address_space& space = machine().device("maincpu")->memory().space(AS_PROGRAM);
- m_slot = dynamic_cast<bbc_1mhzbus_slot_device *>(owner());
-
- space.install_read_handler(0xfcc2, 0xfcc2, read8_delegate(FUNC(cfa3000_opt_device::option_r), this));
}
-//-------------------------------------------------
-// device_reset - device-specific reset
-//-------------------------------------------------
-
-void cfa3000_opt_device::device_reset()
-{
-}
-
//**************************************************************************
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(cfa3000_opt_device::option_r)
+READ8_MEMBER(cfa3000_opt_device::fred_r)
{
- return m_opt->read();
+ uint8_t data = 0xff;
+
+ if (offset == 0xc2)
+ {
+ data = m_opt->read();
+ }
+ return data;
}
diff --git a/src/devices/bus/bbc/1mhzbus/cfa3000opt.h b/src/devices/bus/bbc/1mhzbus/cfa3000opt.h
index e372a14b51b..5a4e413754b 100644
--- a/src/devices/bus/bbc/1mhzbus/cfa3000opt.h
+++ b/src/devices/bus/bbc/1mhzbus/cfa3000opt.h
@@ -28,16 +28,15 @@ public:
// construction/destruction
cfa3000_opt_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_READ8_MEMBER(option_r);
-
protected:
// device-level overrides
virtual void device_start() override;
- virtual void device_reset() override;
// optional information overrides
virtual ioport_constructor device_input_ports() const override;
+ virtual DECLARE_READ8_MEMBER(fred_r) override;
+
private:
required_ioport m_opt;
};
diff --git a/src/devices/bus/bbc/1mhzbus/opus3.cpp b/src/devices/bus/bbc/1mhzbus/opus3.cpp
index ed204430bbe..0b39d5993ff 100644
--- a/src/devices/bus/bbc/1mhzbus/opus3.cpp
+++ b/src/devices/bus/bbc/1mhzbus/opus3.cpp
@@ -70,11 +70,11 @@ ROM_START( opus3 )
ROM_REGION(0x4000, "dfs_rom", 0)
ROM_DEFAULT_BIOS("ch103")
ROM_SYSTEM_BIOS(0, "ch100", "Challenger 1.00")
- ROMX_LOAD("ch100.rom", 0x0000, 0x4000, CRC(740a8335) SHA1(f3c75c21bcd7d4a4dfff922fd287230dcdb91d0e), ROM_BIOS(0))
+ ROMX_LOAD("chal100.rom", 0x0000, 0x4000, CRC(740a8335) SHA1(f3c75c21bcd7d4a4dfff922fd287230dcdb91d0e), ROM_BIOS(0))
ROM_SYSTEM_BIOS(1, "ch101", "Challenger 1.01")
- ROMX_LOAD("ch101.rom", 0x0000, 0x4000, CRC(2f64503d) SHA1(37ee3f20bed50555720703b279f62aab0ed28922), ROM_BIOS(1))
+ ROMX_LOAD("chal101.rom", 0x0000, 0x4000, CRC(2f64503d) SHA1(37ee3f20bed50555720703b279f62aab0ed28922), ROM_BIOS(1))
ROM_SYSTEM_BIOS(2, "ch103", "Challenger 1.03")
- ROMX_LOAD("ch103.rom", 0x0000, 0x4000, CRC(98367cf4) SHA1(eca3631aa420691f96b72bfdf2e9c2b613e1bf33), ROM_BIOS(2))
+ ROMX_LOAD("chal103.rom", 0x0000, 0x4000, CRC(98367cf4) SHA1(eca3631aa420691f96b72bfdf2e9c2b613e1bf33), ROM_BIOS(2))
ROM_END
//-------------------------------------------------
@@ -86,8 +86,9 @@ void bbc_opus3_device::device_add_mconfig(machine_config &config)
/* fdc */
WD1770(config, m_fdc, 16_MHz_XTAL / 2);
m_fdc->drq_wr_callback().set(FUNC(bbc_opus3_device::fdc_drq_w));
+
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies, "525qd", floppy_formats).enable_sound(true);
- FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies, "525qd", floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies, nullptr, floppy_formats).enable_sound(true);
/* ram disk */
RAM(config, m_ramdisk).set_default_size("512K").set_extra_options("256K").set_default_value(0);
@@ -113,7 +114,8 @@ bbc_opus3_device::bbc_opus3_device(const machine_config &mconfig, const char *ta
m_ramdisk(*this, "ramdisk"),
m_fdc(*this, "wd1770"),
m_floppy0(*this, "wd1770:0"),
- m_floppy1(*this, "wd1770:1")
+ m_floppy1(*this, "wd1770:1"),
+ m_ramdisk_page(0)
{
}
@@ -123,13 +125,6 @@ bbc_opus3_device::bbc_opus3_device(const machine_config &mconfig, const char *ta
void bbc_opus3_device::device_start()
{
- address_space& space = machine().device("maincpu")->memory().space(AS_PROGRAM);
- m_slot = dynamic_cast<bbc_1mhzbus_slot_device *>(owner());
-
- space.install_readwrite_handler(0xfcf8, 0xfcfb, read8sm_delegate(FUNC(wd1770_device::read), m_fdc.target()), write8sm_delegate(FUNC(wd1770_device::write), m_fdc.target()));
- space.install_write_handler(0xfcfc, 0xfcfc, WRITE8_DELEGATE(bbc_opus3_device, wd1770l_write));
- space.install_write_handler(0xfcfe, 0xfcff, WRITE8_DELEGATE(bbc_opus3_device, page_w));
- space.install_readwrite_handler(0xfd00, 0xfdff, READ8_DELEGATE(bbc_opus3_device, ramdisk_r), WRITE8_DELEGATE(bbc_opus3_device, ramdisk_w));
}
//-------------------------------------------------
@@ -146,24 +141,57 @@ void bbc_opus3_device::device_reset()
// IMPLEMENTATION
//**************************************************************************
-WRITE8_MEMBER(bbc_opus3_device::wd1770l_write)
+READ8_MEMBER(bbc_opus3_device::fred_r)
{
- floppy_image_device *floppy = nullptr;
+ uint8_t data = 0xff;
- // bit 1, 2: drive select
- if (BIT(data, 1)) floppy = m_floppy0->get_device();
- if (BIT(data, 2)) floppy = m_floppy1->get_device();
- m_fdc->set_floppy(floppy);
-
- // bit 0: side select
- if (floppy)
- floppy->ss_w(BIT(data, 0));
+ switch (offset)
+ {
+ case 0xf8:
+ case 0xf9:
+ case 0xfa:
+ case 0xfb:
+ data = m_fdc->read(offset & 0x03);
+ break;
+ }
+ return data;
+}
- // bit 4: interrupt enabled
- m_fdc_ie = BIT(data, 4);
+WRITE8_MEMBER(bbc_opus3_device::fred_w)
+{
+ floppy_image_device *floppy = nullptr;
- // bit 5: density
- m_fdc->dden_w(BIT(data, 5));
+ switch (offset)
+ {
+ case 0xf8:
+ case 0xf9:
+ case 0xfa:
+ case 0xfb:
+ m_fdc->write(offset & 0x03, data);
+ break;
+ case 0xfc:
+ // bit 1, 2: drive select
+ if (BIT(data, 1)) floppy = m_floppy0->get_device();
+ if (BIT(data, 2)) floppy = m_floppy1->get_device();
+ m_fdc->set_floppy(floppy);
+
+ // bit 0: side select
+ if (floppy)
+ floppy->ss_w(BIT(data, 0));
+
+ // bit 4: interrupt enabled
+ m_fdc_ie = BIT(data, 4);
+
+ // bit 5: density
+ m_fdc->dden_w(BIT(data, 5));
+ break;
+ case 0xfe:
+ m_ramdisk_page = (m_ramdisk_page & 0x00ff) | (data << 8);
+ break;
+ case 0xff:
+ m_ramdisk_page = (m_ramdisk_page & 0xff00) | (data << 0);
+ break;
+ }
}
WRITE_LINE_MEMBER(bbc_opus3_device::fdc_drq_w)
@@ -173,16 +201,7 @@ WRITE_LINE_MEMBER(bbc_opus3_device::fdc_drq_w)
m_slot->nmi_w((m_fdc_drq && m_fdc_ie) ? ASSERT_LINE : CLEAR_LINE);
}
-WRITE8_MEMBER(bbc_opus3_device::page_w)
-{
- switch (offset)
- {
- case 0x00: m_ramdisk_page = (m_ramdisk_page & 0x00ff) | (data << 8); break;
- case 0x01: m_ramdisk_page = (m_ramdisk_page & 0xff00) | (data << 0); break;
- }
-}
-
-READ8_MEMBER(bbc_opus3_device::ramdisk_r)
+READ8_MEMBER(bbc_opus3_device::jim_r)
{
if ((m_ramdisk_page << 8) < m_ramdisk->size())
return m_ramdisk->read((m_ramdisk_page << 8) + offset);
@@ -190,7 +209,7 @@ READ8_MEMBER(bbc_opus3_device::ramdisk_r)
return 0xff;
}
-WRITE8_MEMBER(bbc_opus3_device::ramdisk_w)
+WRITE8_MEMBER(bbc_opus3_device::jim_w)
{
if ((m_ramdisk_page << 8) < m_ramdisk->size())
m_ramdisk->write((m_ramdisk_page << 8) + offset, data);
diff --git a/src/devices/bus/bbc/1mhzbus/opus3.h b/src/devices/bus/bbc/1mhzbus/opus3.h
index 826906a584f..1e3e1a4065d 100644
--- a/src/devices/bus/bbc/1mhzbus/opus3.h
+++ b/src/devices/bus/bbc/1mhzbus/opus3.h
@@ -28,11 +28,6 @@ public:
// construction/destruction
bbc_opus3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_WRITE8_MEMBER(wd1770l_write);
- DECLARE_WRITE8_MEMBER(page_w);
- DECLARE_READ8_MEMBER(ramdisk_r);
- DECLARE_WRITE8_MEMBER(ramdisk_w);
-
protected:
// device-level overrides
virtual void device_start() override;
@@ -42,6 +37,11 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual DECLARE_READ8_MEMBER(fred_r) override;
+ virtual DECLARE_WRITE8_MEMBER(fred_w) override;
+ virtual DECLARE_READ8_MEMBER(jim_r) override;
+ virtual DECLARE_WRITE8_MEMBER(jim_w) override;
+
private:
DECLARE_FLOPPY_FORMATS(floppy_formats);
diff --git a/src/devices/bus/bbc/analogue/analogue.cpp b/src/devices/bus/bbc/analogue/analogue.cpp
index 226bc69bf0f..facc1a827bc 100644
--- a/src/devices/bus/bbc/analogue/analogue.cpp
+++ b/src/devices/bus/bbc/analogue/analogue.cpp
@@ -33,15 +33,6 @@ device_bbc_analogue_interface::device_bbc_analogue_interface(const machine_confi
}
-//-------------------------------------------------
-// ~device_bbc_analogue_interface - destructor
-//-------------------------------------------------
-
-device_bbc_analogue_interface::~device_bbc_analogue_interface()
-{
-}
-
-
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
@@ -52,7 +43,9 @@ device_bbc_analogue_interface::~device_bbc_analogue_interface()
bbc_analogue_slot_device::bbc_analogue_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, BBC_ANALOGUE_SLOT, tag, owner, clock),
- device_slot_interface(mconfig, *this)
+ device_slot_interface(mconfig, *this),
+ m_card(nullptr),
+ m_lpstb_handler(*this)
{
}
@@ -71,8 +64,12 @@ void bbc_analogue_slot_device::device_validity_check(validity_checker &valid) co
void bbc_analogue_slot_device::device_start()
{
device_t *const carddev = get_card_device();
- if (carddev && !dynamic_cast<device_bbc_analogue_interface *>(carddev))
+ m_card = dynamic_cast<device_bbc_analogue_interface *>(get_card_device());
+ if (carddev && !m_card)
osd_printf_error("Card device %s (%s) does not implement device_bbc_analogue_interface\n", carddev->tag(), carddev->name());
+
+ // resolve callbacks
+ m_lpstb_handler.resolve_safe();
}
uint8_t bbc_analogue_slot_device::ch_r(int channel)
@@ -107,6 +104,9 @@ void bbc_analogue_slot_device::device_reset()
// slot devices
#include "joystick.h"
+#include "bitstik.h"
+//#include "lightpen.h"
+//#include "micromike.h"
//#include "quinkey.h"
#include "cfa3000a.h"
@@ -114,7 +114,11 @@ void bbc_analogue_slot_device::device_reset()
void bbc_analogue_devices(device_slot_interface &device)
{
device.option_add("acornjoy", BBC_ACORNJOY); /* Acorn ANH01 Joysticks */
+ device.option_add("bitstik1", BBC_BITSTIK1); /* Acorn ANF04 Bitstik */
+ device.option_add("bitstik2", BBC_BITSTIK2); /* Robocom Bitstik 2 */
+ //device.option_add("lightpen", BBC_LIGHTPEN); /* RH Electronics Lightpen */
+ //device.option_add("micromike", BBC_MICROMIKE); /* Micro Mike */
device.option_add("voltmace3b", BBC_VOLTMACE3B); /* Voltmace Delta 3b "Twin" Joysticks */
-// device.option_add("quinkey", BBC_QUINKEY); /* Microwriter Quinkey */
+ //device.option_add("quinkey", BBC_QUINKEY); /* Microwriter Quinkey */
device.option_add("cfa3000a", CFA3000_ANLG); /* Hanson CFA 3000 Analogue */
}
diff --git a/src/devices/bus/bbc/analogue/analogue.h b/src/devices/bus/bbc/analogue/analogue.h
index 6e9cc8a9eae..d8aec89e012 100644
--- a/src/devices/bus/bbc/analogue/analogue.h
+++ b/src/devices/bus/bbc/analogue/analogue.h
@@ -34,21 +34,6 @@
//**************************************************************************
-// CONSTANTS
-//**************************************************************************
-
-#define BBC_ANALOGUE_SLOT_TAG "analogue"
-
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_BBC_ANALOGUE_SLOT_ADD(_tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, BBC_ANALOGUE_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -60,7 +45,22 @@ class bbc_analogue_slot_device : public device_t, public device_slot_interface
{
public:
// construction/destruction
- bbc_analogue_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ bbc_analogue_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&slot_options, const char *default_option)
+ : bbc_analogue_slot_device(mconfig, tag, owner)
+ {
+ option_reset();
+ slot_options(*this);
+ set_default_option(default_option);
+ set_fixed(false);
+ }
+
+ bbc_analogue_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0);
+
+ // callbacks
+ auto lpstb_handler() { return m_lpstb_handler.bind(); }
+
+ DECLARE_WRITE_LINE_MEMBER(lpstb_w) { m_lpstb_handler(state); }
uint8_t ch_r(int channel);
uint8_t pb_r();
@@ -72,6 +72,9 @@ protected:
virtual void device_reset() override;
device_bbc_analogue_interface *m_card;
+
+private:
+ devcb_write_line m_lpstb_handler;
};
@@ -80,9 +83,6 @@ protected:
class device_bbc_analogue_interface : public device_slot_card_interface
{
public:
- // construction/destruction
- virtual ~device_bbc_analogue_interface();
-
virtual uint8_t ch_r(int channel) { return 0x00; };
virtual uint8_t pb_r() { return 0x30; };
diff --git a/src/devices/bus/bbc/analogue/bitstik.cpp b/src/devices/bus/bbc/analogue/bitstik.cpp
new file mode 100644
index 00000000000..42d8fff9504
--- /dev/null
+++ b/src/devices/bus/bbc/analogue/bitstik.cpp
@@ -0,0 +1,143 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Acorn ANF04 Bitstik
+
+ http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/Acorn_BitStik.html
+
+ Robocom Bitstik 2
+
+**********************************************************************/
+
+#include "emu.h"
+#include "bitstik.h"
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(BBC_BITSTIK1, bbc_bitstik1_device, "bbc_bitstik1", "Acorn Bitstik")
+DEFINE_DEVICE_TYPE(BBC_BITSTIK2, bbc_bitstik2_device, "bbc_bitstik2", "Robo Bitstik 2")
+
+//-------------------------------------------------
+// ROM( bitstik )
+//-------------------------------------------------
+
+ROM_START(bitstik1)
+ ROM_REGION(0x4000, "rom", 0)
+ ROM_LOAD("bitstik1.rom", 0x0000, 0x2000, CRC(a3c539f8) SHA1(c6f2cf2f6d1e48819a8381c6a1c97ca8fa5ab117))
+ ROM_RELOAD(0x2000, 0x2000)
+ROM_END
+
+ROM_START(bitstik2)
+ ROM_REGION(0x4000, "rom", 0)
+ ROM_LOAD("bitstik2.rom", 0x0000, 0x2000, CRC(a2b5a743) SHA1(4d0040af6bdc6a587e42d4aa36d528b768cf9549))
+ ROM_RELOAD(0x2000, 0x2000)
+ROM_END
+
+//-------------------------------------------------
+// INPUT_PORTS( bitstik )
+//-------------------------------------------------
+
+static INPUT_PORTS_START(bitstik)
+ PORT_START("CHANNEL0")
+ PORT_BIT(0xff, 0x00, IPT_AD_STICK_X) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(200) PORT_NAME("AD Stick X") PORT_REVERSE
+
+ PORT_START("CHANNEL1")
+ PORT_BIT(0xff, 0x00, IPT_AD_STICK_Y) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(200) PORT_NAME("AD Stick Y") PORT_REVERSE
+
+ PORT_START("CHANNEL2")
+ PORT_BIT(0xff, 0x00, IPT_AD_STICK_Z) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(200) PORT_NAME("AD Stick Z") PORT_REVERSE
+
+ PORT_START("CHANNEL3")
+ PORT_BIT(0xff, IP_ACTIVE_HIGH, IPT_BUTTON3) PORT_NAME("Right Button - Release")
+
+ PORT_START("BUTTONS")
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("Top Button - Execute")
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_NAME("Left Button - Confirm")
+INPUT_PORTS_END
+
+//-------------------------------------------------
+// input_ports - device-specific input ports
+//-------------------------------------------------
+
+ioport_constructor bbc_bitstik_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(bitstik);
+}
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+const tiny_rom_entry *bbc_bitstik1_device::device_rom_region() const
+{
+ return ROM_NAME(bitstik1);
+}
+
+const tiny_rom_entry *bbc_bitstik2_device::device_rom_region() const
+{
+ return ROM_NAME(bitstik2);
+}
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// bbc_bitstik_device - constructor
+//-------------------------------------------------
+
+bbc_bitstik_device::bbc_bitstik_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, type, tag, owner, clock),
+ device_bbc_analogue_interface(mconfig, *this),
+ m_channel(*this, "CHANNEL%u", 0),
+ m_buttons(*this, "BUTTONS"),
+ m_rom(*this, "rom")
+{
+}
+
+bbc_bitstik1_device::bbc_bitstik1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ bbc_bitstik_device(mconfig, BBC_BITSTIK1, tag, owner, clock)
+{
+}
+
+bbc_bitstik2_device::bbc_bitstik2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ bbc_bitstik_device(mconfig, BBC_BITSTIK2, tag, owner, clock)
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void bbc_bitstik_device::device_start()
+{
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void bbc_bitstik_device::device_reset()
+{
+ machine().root_device().membank("bank4")->configure_entry(13, memregion("rom")->base());
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+uint8_t bbc_bitstik_device::ch_r(int channel)
+{
+ return m_channel[channel]->read();
+}
+
+uint8_t bbc_bitstik_device::pb_r()
+{
+ return m_buttons->read() & 0x30;
+}
diff --git a/src/devices/bus/bbc/analogue/bitstik.h b/src/devices/bus/bbc/analogue/bitstik.h
new file mode 100644
index 00000000000..3319bfe0c2e
--- /dev/null
+++ b/src/devices/bus/bbc/analogue/bitstik.h
@@ -0,0 +1,75 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Acorn ANF04 Bitstik
+
+ http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/Acorn_BitStik.html
+
+ Robocom Bitstik 2
+
+**********************************************************************/
+
+
+#ifndef MAME_BUS_BBC_ANALOGUE_BITSTIK_H
+#define MAME_BUS_BBC_ANALOGUE_BITSTIK_H
+
+#pragma once
+
+
+#include "analogue.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> bbc_bitstik_device
+
+class bbc_bitstik_device :
+ public device_t,
+ public device_bbc_analogue_interface
+{
+protected:
+ // construction/destruction
+ bbc_bitstik_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // optional information overrides
+ virtual ioport_constructor device_input_ports() const override;
+
+ virtual uint8_t ch_r(int channel) override;
+ virtual uint8_t pb_r() override;
+
+private:
+ required_ioport_array<4> m_channel;
+ required_ioport m_buttons;
+ required_memory_region m_rom;
+};
+
+class bbc_bitstik1_device : public bbc_bitstik_device
+{
+public:
+ bbc_bitstik1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ virtual const tiny_rom_entry *device_rom_region() const override;
+};
+
+class bbc_bitstik2_device : public bbc_bitstik_device
+{
+public:
+ bbc_bitstik2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ virtual const tiny_rom_entry *device_rom_region() const override;
+};
+
+// device type definition
+DECLARE_DEVICE_TYPE(BBC_BITSTIK1, bbc_bitstik1_device)
+DECLARE_DEVICE_TYPE(BBC_BITSTIK2, bbc_bitstik2_device)
+
+
+#endif // MAME_BUS_BBC_ANALOGUE_BITSTIK_H
diff --git a/src/devices/bus/bbc/analogue/cfa3000a.cpp b/src/devices/bus/bbc/analogue/cfa3000a.cpp
index da163200c2c..0dfd692df12 100644
--- a/src/devices/bus/bbc/analogue/cfa3000a.cpp
+++ b/src/devices/bus/bbc/analogue/cfa3000a.cpp
@@ -96,5 +96,5 @@ uint8_t cfa3000_anlg_device::ch_r(int channel)
uint8_t cfa3000_anlg_device::pb_r()
{
- return m_buttons->read();
+ return m_buttons->read() & 0x30;
}
diff --git a/src/devices/bus/bbc/analogue/joystick.cpp b/src/devices/bus/bbc/analogue/joystick.cpp
index e67abff9e22..a6e37ebb3ba 100644
--- a/src/devices/bus/bbc/analogue/joystick.cpp
+++ b/src/devices/bus/bbc/analogue/joystick.cpp
@@ -130,5 +130,5 @@ uint8_t bbc_joystick_device::ch_r(int channel)
uint8_t bbc_joystick_device::pb_r()
{
- return m_buttons->read();
+ return m_buttons->read() & 0x30;
}
diff --git a/src/devices/bus/bbc/fdc/acorn.cpp b/src/devices/bus/bbc/fdc/acorn.cpp
index 21d4f710637..e2ae28fdf0c 100644
--- a/src/devices/bus/bbc/fdc/acorn.cpp
+++ b/src/devices/bus/bbc/fdc/acorn.cpp
@@ -100,15 +100,15 @@ ROM_START( acorn1770 )
ROM_DEFAULT_BIOS("dfs223")
// Acorn
ROM_SYSTEM_BIOS(0, "dfs210", "Acorn DFS 2.10")
- ROMX_LOAD("dfs v2.10,1985,acorn.bin", 0x0000, 0x4000, CRC(4f828787) SHA1(112a315e1598cb4db2abcfe9d89fcd97444b276d), ROM_BIOS(0))
+ ROMX_LOAD("dfs v2.10,acorn.rom", 0x0000, 0x4000, CRC(4f828787) SHA1(112a315e1598cb4db2abcfe9d89fcd97444b276d), ROM_BIOS(0))
ROM_SYSTEM_BIOS(1, "dfs220", "Acorn DFS 2.20")
- ROMX_LOAD("dfs v2.20,1986,acorn.bin", 0x0000, 0x4000, CRC(2844001e) SHA1(d72f11af35756ac648095ba1992211cf6741dd80), ROM_BIOS(1))
+ ROMX_LOAD("dfs v2.20,acorn.rom", 0x0000, 0x4000, CRC(2844001e) SHA1(d72f11af35756ac648095ba1992211cf6741dd80), ROM_BIOS(1))
ROM_SYSTEM_BIOS(2, "dfs223", "Acorn DFS 2.23")
- ROMX_LOAD("dfs v2.23,1986,acorn.bin", 0x0000, 0x4000, CRC(7891f9b7) SHA1(0d7ed0b0b3852cb61970ada1993244f2896896aa), ROM_BIOS(2))
+ ROMX_LOAD("dfs v2.23,acorn.rom", 0x0000, 0x4000, CRC(7891f9b7) SHA1(0d7ed0b0b3852cb61970ada1993244f2896896aa), ROM_BIOS(2))
ROM_SYSTEM_BIOS(3, "dfs225", "Acorn DFS 2.25")
- ROMX_LOAD("dfs v2.25,1986,acorn.bin", 0x0000, 0x4000, CRC(f855a75b) SHA1(f11271748e6303c60182955e5fa478624b616fcf), ROM_BIOS(3))
+ ROMX_LOAD("dfs v2.25,acorn.rom", 0x0000, 0x4000, CRC(f855a75b) SHA1(f11271748e6303c60182955e5fa478624b616fcf), ROM_BIOS(3))
ROM_SYSTEM_BIOS(4, "dfs226", "Acorn DFS 2.26")
- ROMX_LOAD("dfs v2.26,1986,acorn.bin", 0x0000, 0x4000, CRC(5ae33e94) SHA1(cf2ebc422a8d24ec6f1a0320520c38a0e704109a), ROM_BIOS(4))
+ ROMX_LOAD("dfs v2.26,acorn.rom", 0x0000, 0x4000, CRC(5ae33e94) SHA1(cf2ebc422a8d24ec6f1a0320520c38a0e704109a), ROM_BIOS(4))
// Advanced Computer Products
ROM_SYSTEM_BIOS(5, "acp108", "Advanced 1770 DFS 1.08")
ROMX_LOAD("advanced 1770 dfs 1.08,acp.rom", 0x0000, 0x4000, CRC(eb0eaa34) SHA1(d16ba3c8ed5e5ab6af62aad13a8e567b1c3639c2), ROM_BIOS(5))
@@ -121,21 +121,23 @@ ROM_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-void bbc_acorn8271_device::device_add_mconfig(machine_config & config)
+void bbc_acorn8271_device::device_add_mconfig(machine_config &config)
{
- I8271(config, m_fdc, 0);
+ I8271(config, m_fdc, 16_MHz_XTAL / 8);
m_fdc->intrq_wr_callback().set(FUNC(bbc_acorn8271_device::fdc_intrq_w));
m_fdc->hdl_wr_callback().set(FUNC(bbc_acorn8271_device::motor_w));
m_fdc->opt_wr_callback().set(FUNC(bbc_acorn8271_device::side_w));
+
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", bbc_acorn8271_device::floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", bbc_acorn8271_device::floppy_formats).enable_sound(true);
}
-void bbc_acorn1770_device::device_add_mconfig(machine_config & config)
+void bbc_acorn1770_device::device_add_mconfig(machine_config &config)
{
- WD1770(config, m_fdc, XTAL(16'000'000) / 2);
+ WD1770(config, m_fdc, 16_MHz_XTAL / 2);
m_fdc->intrq_wr_callback().set(FUNC(bbc_acorn1770_device::fdc_intrq_w));
m_fdc->drq_wr_callback().set(FUNC(bbc_acorn1770_device::fdc_drq_w));
+
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", bbc_acorn8271_device::floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", bbc_acorn8271_device::floppy_formats).enable_sound(true);
}
@@ -160,22 +162,23 @@ const tiny_rom_entry *bbc_acorn1770_device::device_rom_region() const
//-------------------------------------------------
bbc_acorn8271_device::bbc_acorn8271_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, BBC_ACORN8271, tag, owner, clock),
- device_bbc_fdc_interface(mconfig, *this),
- m_dfs_rom(*this, "dfs_rom"),
- m_fdc(*this, "i8271"),
- m_floppy0(*this, "i8271:0"),
- m_floppy1(*this, "i8271:1")
+ : device_t(mconfig, BBC_ACORN8271, tag, owner, clock)
+ , device_bbc_fdc_interface(mconfig, *this)
+ , m_dfs_rom(*this, "dfs_rom")
+ , m_fdc(*this, "i8271")
+ , m_floppy0(*this, "i8271:0")
+ , m_floppy1(*this, "i8271:1")
{
}
bbc_acorn1770_device::bbc_acorn1770_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, BBC_ACORN1770, tag, owner, clock),
- device_bbc_fdc_interface(mconfig, *this),
- m_dfs_rom(*this, "dfs_rom"),
- m_fdc(*this, "wd1770"),
- m_floppy0(*this, "wd1770:0"),
- m_floppy1(*this, "wd1770:1")
+ : device_t(mconfig, BBC_ACORN1770, tag, owner, clock)
+ , device_bbc_fdc_interface(mconfig, *this)
+ , m_dfs_rom(*this, "dfs_rom")
+ , m_fdc(*this, "wd1770")
+ , m_floppy0(*this, "wd1770:0")
+ , m_floppy1(*this, "wd1770:1")
+ , m_drive_control(0)
{
}
@@ -186,24 +189,11 @@ bbc_acorn1770_device::bbc_acorn1770_device(const machine_config &mconfig, const
void bbc_acorn8271_device::device_start()
{
- device_t* cpu = machine().device("maincpu");
- address_space& space = cpu->memory().space(AS_PROGRAM);
- m_slot = dynamic_cast<bbc_fdc_slot_device *>(owner());
-
- space.install_device(0xfe80, 0xfe83, *m_fdc, &i8271_device::map);
- space.install_readwrite_handler(0xfe84, 0xfe9f, READ8_DEVICE_DELEGATE(m_fdc, i8271_device, data_r), WRITE8_DEVICE_DELEGATE(m_fdc, i8271_device, data_w));
}
void bbc_acorn1770_device::device_start()
{
- device_t* cpu = machine().device("maincpu");
- address_space& space = cpu->memory().space(AS_PROGRAM);
- m_slot = dynamic_cast<bbc_fdc_slot_device *>(owner());
-
- space.install_readwrite_handler(0xfe80, 0xfe83, READ8_DELEGATE(bbc_acorn1770_device, wd1770l_read), WRITE8_DELEGATE(bbc_acorn1770_device, wd1770l_write));
- space.install_readwrite_handler(0xfe84, 0xfe9f, read8sm_delegate(FUNC(wd1770_device::read), m_fdc.target()), write8sm_delegate(FUNC(wd1770_device::write), m_fdc.target()));
-
- m_drive_control = 0xfe;
+ save_item(NAME(m_drive_control));
}
//-------------------------------------------------
@@ -213,13 +203,13 @@ void bbc_acorn1770_device::device_start()
void bbc_acorn8271_device::device_reset()
{
machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base());
-
- m_fdc->soft_reset();
}
void bbc_acorn1770_device::device_reset()
{
machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base());
+
+ m_drive_control = 0xfe;
}
@@ -227,10 +217,38 @@ void bbc_acorn1770_device::device_reset()
// IMPLEMENTATION
//**************************************************************************
+READ8_MEMBER(bbc_acorn8271_device::read)
+{
+ uint8_t data;
+
+ if (offset & 0x04)
+ {
+ data = m_fdc->data_r(space , 0);
+ }
+ else
+ {
+ data = m_fdc->read(space, offset & 0x03);
+ }
+ return data;
+}
+
+WRITE8_MEMBER(bbc_acorn8271_device::write)
+{
+ if (offset & 0x04)
+ {
+ m_fdc->data_w(space, 0, data);
+ }
+ else
+ {
+ m_fdc->write(space, offset & 0x03, data);
+ }
+}
+
WRITE_LINE_MEMBER(bbc_acorn8271_device::motor_w)
{
if (m_floppy0->get_device()) m_floppy0->get_device()->mon_w(!state);
if (m_floppy1->get_device()) m_floppy1->get_device()->mon_w(!state);
+ m_fdc->ready_w(!state);
}
WRITE_LINE_MEMBER(bbc_acorn8271_device::side_w)
@@ -245,39 +263,59 @@ WRITE_LINE_MEMBER(bbc_acorn8271_device::fdc_intrq_w)
}
-READ8_MEMBER(bbc_acorn1770_device::wd1770l_read)
+READ8_MEMBER(bbc_acorn1770_device::read)
{
- return m_drive_control;
+ uint8_t data = 0xff;
+
+ if (offset & 0x04)
+ {
+ data = m_fdc->read(offset & 0x03);
+ }
+ else
+ {
+ data = m_drive_control;
+ }
+ return data;
}
-WRITE8_MEMBER(bbc_acorn1770_device::wd1770l_write)
+WRITE8_MEMBER(bbc_acorn1770_device::write)
{
- floppy_image_device *floppy = nullptr;
-
- m_drive_control = data;
-
- // bit 0, 1: drive select
- if (BIT(data, 0)) floppy = m_floppy0->get_device();
- if (BIT(data, 1)) floppy = m_floppy1->get_device();
- m_fdc->set_floppy(floppy);
-
- // bit 2: side select
- if (floppy)
- floppy->ss_w(BIT(data, 2));
-
- // bit 3: density
- m_fdc->dden_w(BIT(data, 3));
-
- // bit 5: reset
- if (!BIT(data, 5)) m_fdc->soft_reset();
+ if (offset & 0x04)
+ {
+ m_fdc->write(offset & 0x03, data);
+ }
+ else
+ {
+ floppy_image_device *floppy = nullptr;
+
+ m_drive_control = data;
+
+ // bit 0, 1: drive select
+ if (BIT(data, 0)) floppy = m_floppy0->get_device();
+ if (BIT(data, 1)) floppy = m_floppy1->get_device();
+ m_fdc->set_floppy(floppy);
+
+ // bit 2: side select
+ if (floppy)
+ floppy->ss_w(BIT(data, 2));
+
+ // bit 3: density
+ m_fdc->dden_w(BIT(data, 3));
+
+ // bit 4: interrupt enabled
+ m_fdc_ie = !BIT(data, 4);
+
+ // bit 5: reset
+ if (!BIT(data, 5)) m_fdc->soft_reset();
+ }
}
WRITE_LINE_MEMBER(bbc_acorn1770_device::fdc_intrq_w)
{
- m_slot->intrq_w(state);
+ m_slot->intrq_w((state && m_fdc_ie) ? ASSERT_LINE : CLEAR_LINE);
}
WRITE_LINE_MEMBER(bbc_acorn1770_device::fdc_drq_w)
{
- m_slot->drq_w(state);
+ m_slot->drq_w((state && m_fdc_ie) ? ASSERT_LINE : CLEAR_LINE);
}
diff --git a/src/devices/bus/bbc/fdc/acorn.h b/src/devices/bus/bbc/fdc/acorn.h
index 85323e1fb6a..4e2993f1016 100644
--- a/src/devices/bus/bbc/fdc/acorn.h
+++ b/src/devices/bus/bbc/fdc/acorn.h
@@ -25,7 +25,6 @@
class bbc_acorn8271_device :
public device_t,
public device_bbc_fdc_interface
-
{
public:
// construction/destruction
@@ -42,6 +41,9 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual DECLARE_READ8_MEMBER(read) override;
+ virtual DECLARE_WRITE8_MEMBER(write) override;
+
private:
DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
DECLARE_WRITE_LINE_MEMBER(motor_w);
@@ -56,7 +58,6 @@ private:
class bbc_acorn1770_device :
public device_t,
public device_bbc_fdc_interface
-
{
public:
// construction/destruction
@@ -71,9 +72,10 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual DECLARE_READ8_MEMBER(read) override;
+ virtual DECLARE_WRITE8_MEMBER(write) override;
+
private:
- DECLARE_READ8_MEMBER(wd1770l_read);
- DECLARE_WRITE8_MEMBER(wd1770l_write);
DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
@@ -83,6 +85,7 @@ private:
optional_device<floppy_connector> m_floppy1;
int m_drive_control;
+ int m_fdc_ie;
};
diff --git a/src/devices/bus/bbc/fdc/ams.cpp b/src/devices/bus/bbc/fdc/ams.cpp
new file mode 100644
index 00000000000..2afc7c969a2
--- /dev/null
+++ b/src/devices/bus/bbc/fdc/ams.cpp
@@ -0,0 +1,146 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ AMS 3" Microdrive Disc System
+
+**********************************************************************/
+
+
+#include "emu.h"
+#include "ams.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(BBC_AMS3, bbc_ams3_device, "bbc_ams3", "AMS 3&quot; Microdrive Disc System")
+
+
+//-------------------------------------------------
+// MACHINE_DRIVER( ams3 )
+//-------------------------------------------------
+
+FLOPPY_FORMATS_MEMBER( bbc_ams3_device::floppy_formats )
+ FLOPPY_ACORN_SSD_FORMAT
+FLOPPY_FORMATS_END
+
+ROM_START( ams3 )
+ ROM_REGION(0x8000, "dfs_rom", 0)
+ ROM_LOAD("dfs098.rom", 0x0000, 0x2000, CRC(90852e7d) SHA1(6df3552d5426f3a4625b9a0c7829bdba03f05e84))
+ ROM_RELOAD( 0x2000, 0x2000)
+ ROM_LOAD("amsdisc.rom", 0x4000, 0x1000, CRC(93876595) SHA1(a9d9123667e65334b28b8588b09642478653e356))
+ ROM_RELOAD( 0x5000, 0x1000)
+ ROM_RELOAD( 0x6000, 0x1000)
+ ROM_RELOAD( 0x7000, 0x1000)
+ROM_END
+
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void bbc_ams3_device::device_add_mconfig(machine_config &config)
+{
+ I8271(config, m_fdc, 16_MHz_XTAL / 8);
+ m_fdc->intrq_wr_callback().set(FUNC(bbc_ams3_device::fdc_intrq_w));
+ m_fdc->hdl_wr_callback().set(FUNC(bbc_ams3_device::motor_w));
+ m_fdc->opt_wr_callback().set(FUNC(bbc_ams3_device::side_w));
+ // Hitachi HFD 305S
+ FLOPPY_CONNECTOR(config, m_floppy0, "3dsdd", FLOPPY_3_DSDD, true, bbc_ams3_device::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, m_floppy1, "3dsdd", FLOPPY_3_DSDD, false, bbc_ams3_device::floppy_formats).enable_sound(true);
+}
+
+
+const tiny_rom_entry *bbc_ams3_device::device_rom_region() const
+{
+ return ROM_NAME( ams3 );
+}
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// bbc_ams3_device - constructor
+//-------------------------------------------------
+
+bbc_ams3_device::bbc_ams3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, BBC_AMS3, tag, owner, clock)
+ , device_bbc_fdc_interface(mconfig, *this)
+ , m_dfs_rom(*this, "dfs_rom")
+ , m_fdc(*this, "i8271")
+ , m_floppy0(*this, "i8271:0")
+ , m_floppy1(*this, "i8271:1")
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void bbc_ams3_device::device_start()
+{
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void bbc_ams3_device::device_reset()
+{
+ machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base() + 0x0000);
+ machine().root_device().membank("bank4")->configure_entry(13, memregion("dfs_rom")->base() + 0x4000);
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+READ8_MEMBER(bbc_ams3_device::read)
+{
+ uint8_t data;
+
+ if (offset & 0x04)
+ {
+ data = m_fdc->data_r(space , 0);
+ }
+ else
+ {
+ data = m_fdc->read(space, offset & 0x03);
+ }
+ return data;
+}
+
+WRITE8_MEMBER(bbc_ams3_device::write)
+{
+ if (offset & 0x04)
+ {
+ m_fdc->data_w(space, 0, data);
+ }
+ else
+ {
+ m_fdc->write(space, offset & 0x03, data);
+ }
+}
+
+WRITE_LINE_MEMBER(bbc_ams3_device::motor_w)
+{
+ if (m_floppy0->get_device()) m_floppy0->get_device()->mon_w(!state);
+ if (m_floppy1->get_device()) m_floppy1->get_device()->mon_w(!state);
+ m_fdc->ready_w(!state);
+}
+
+WRITE_LINE_MEMBER(bbc_ams3_device::side_w)
+{
+ if (m_floppy0->get_device()) m_floppy0->get_device()->ss_w(state);
+ if (m_floppy1->get_device()) m_floppy1->get_device()->ss_w(state);
+}
+
+WRITE_LINE_MEMBER(bbc_ams3_device::fdc_intrq_w)
+{
+ m_slot->intrq_w(state);
+}
diff --git a/src/devices/bus/bbc/fdc/ams.h b/src/devices/bus/bbc/fdc/ams.h
new file mode 100644
index 00000000000..acdb077b3f6
--- /dev/null
+++ b/src/devices/bus/bbc/fdc/ams.h
@@ -0,0 +1,61 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ AMS 3" Microdrive Disc System
+
+**********************************************************************/
+
+
+#ifndef MAME_BUS_BBC_FDC_AMS_H
+#define MAME_BUS_BBC_FDC_AMS_H
+
+#pragma once
+
+#include "fdc.h"
+#include "machine/i8271.h"
+#include "formats/acorn_dsk.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class bbc_ams3_device :
+ public device_t,
+ public device_bbc_fdc_interface
+{
+public:
+ // construction/destruction
+ bbc_ams3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ DECLARE_FLOPPY_FORMATS(floppy_formats);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+ virtual DECLARE_READ8_MEMBER(read) override;
+ virtual DECLARE_WRITE8_MEMBER(write) override;
+
+private:
+ DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
+ DECLARE_WRITE_LINE_MEMBER(motor_w);
+ DECLARE_WRITE_LINE_MEMBER(side_w);
+
+ required_memory_region m_dfs_rom;
+ required_device<i8271_device> m_fdc;
+ required_device<floppy_connector> m_floppy0;
+ optional_device<floppy_connector> m_floppy1;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(BBC_AMS3, bbc_ams3_device)
+
+
+#endif // MAME_BUS_BBC_FDC_AMS_H
diff --git a/src/devices/bus/bbc/fdc/cumana.cpp b/src/devices/bus/bbc/fdc/cumana.cpp
index 5639fef1976..4de4c9df704 100644
--- a/src/devices/bus/bbc/fdc/cumana.cpp
+++ b/src/devices/bus/bbc/fdc/cumana.cpp
@@ -65,6 +65,7 @@ void bbc_cumana1_device::device_add_mconfig(machine_config &config)
m_fdc->intrq_wr_callback().set(FUNC(bbc_cumanafdc_device::fdc_intrq_w));
m_fdc->drq_wr_callback().set(FUNC(bbc_cumanafdc_device::fdc_drq_w));
m_fdc->hld_wr_callback().set(FUNC(bbc_cumanafdc_device::motor_w));
+
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
}
@@ -75,6 +76,7 @@ void bbc_cumana2_device::device_add_mconfig(machine_config &config)
m_fdc->intrq_wr_callback().set(FUNC(bbc_cumanafdc_device::fdc_intrq_w));
m_fdc->drq_wr_callback().set(FUNC(bbc_cumanafdc_device::fdc_drq_w));
m_fdc->hld_wr_callback().set(FUNC(bbc_cumanafdc_device::motor_w));
+
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
}
@@ -104,7 +106,8 @@ bbc_cumanafdc_device::bbc_cumanafdc_device(const machine_config &mconfig, device
m_fdc(*this, "mb8877a"),
m_floppy0(*this, "mb8877a:0"),
m_floppy1(*this, "mb8877a:1"),
- m_dfs_rom(*this, "dfs_rom")
+ m_dfs_rom(*this, "dfs_rom"),
+ m_drive_control(0)
{
}
@@ -127,12 +130,7 @@ bbc_cumana2_device::bbc_cumana2_device(const machine_config &mconfig, const char
void bbc_cumanafdc_device::device_start()
{
- device_t* cpu = machine().device("maincpu");
- address_space& space = cpu->memory().space(AS_PROGRAM);
- m_slot = dynamic_cast<bbc_fdc_slot_device *>(owner());
-
- space.install_readwrite_handler(0xfe80, 0xfe83, READ8_DELEGATE(bbc_cumanafdc_device, ctrl_r), WRITE8_DELEGATE(bbc_cumanafdc_device, ctrl_w));
- space.install_readwrite_handler(0xfe84, 0xfe9f, read8sm_delegate(FUNC(mb8877_device::read), m_fdc.target()), write8sm_delegate(FUNC(mb8877_device::write), m_fdc.target()));
+ save_item(NAME(m_drive_control));
}
//-------------------------------------------------
@@ -142,8 +140,6 @@ void bbc_cumanafdc_device::device_start()
void bbc_cumanafdc_device::device_reset()
{
machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base());
-
- m_fdc->soft_reset();
}
@@ -151,47 +147,66 @@ void bbc_cumanafdc_device::device_reset()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_cumanafdc_device::ctrl_r)
+READ8_MEMBER(bbc_cumanafdc_device::read)
{
- return m_drive_control;
+ uint8_t data;
+
+ if (offset & 0x04)
+ {
+ data = m_fdc->read(offset & 0x03);
+ }
+ else
+ {
+ data = m_drive_control;
+ }
+ return data;
}
-WRITE8_MEMBER(bbc_cumanafdc_device::ctrl_w)
+WRITE8_MEMBER(bbc_cumanafdc_device::write)
{
- floppy_image_device *floppy = nullptr;
-
- m_drive_control = data;
-
- // bit 0: drive select
- floppy_image_device *floppy0 = m_fdc->subdevice<floppy_connector>("0")->get_device();
- floppy_image_device *floppy1 = m_fdc->subdevice<floppy_connector>("1")->get_device();
- floppy = (BIT(data, 0) ? floppy1 : floppy0);
- m_fdc->set_floppy(floppy);
-
- // Not sure why QFS 1.02 inverts these two bits, need to see an original board to verify
- if (m_invert)
+ if (offset & 0x04)
{
- // bit 1: side select
- if (floppy)
- floppy->ss_w(!BIT(data, 1));
-
- // bit 2: density
- m_fdc->dden_w(!BIT(data, 2));
+ m_fdc->write(offset & 0x03, data);
}
else
{
- // bit 1: side select
- if (floppy)
- floppy->ss_w(BIT(data, 1));
+ floppy_image_device *floppy = nullptr;
- // bit 2: density
- m_fdc->dden_w(BIT(data, 2));
- }
- // bit 3: reset
- if (BIT(data, 3)) m_fdc->soft_reset();
+ m_drive_control = data;
+
+ // bit 0: drive select
+ switch (BIT(data, 0))
+ {
+ case 0: floppy = m_floppy0->get_device(); break;
+ case 1: floppy = m_floppy1->get_device(); break;
+ }
+ m_fdc->set_floppy(floppy);
+
+ // Not sure why QFS 1.02 inverts these two bits, need to see an original board to verify
+ if (m_invert)
+ {
+ // bit 1: side select
+ if (floppy)
+ floppy->ss_w(!BIT(data, 1));
- // bit 4: interrupt enable
- m_fdc_ie = BIT(data, 4);
+ // bit 2: density
+ m_fdc->dden_w(!BIT(data, 2));
+ }
+ else
+ {
+ // bit 1: side select
+ if (floppy)
+ floppy->ss_w(BIT(data, 1));
+
+ // bit 2: density
+ m_fdc->dden_w(BIT(data, 2));
+ }
+ // bit 3: reset
+ if (BIT(data, 3)) m_fdc->soft_reset();
+
+ // bit 4: interrupt enable
+ m_fdc_ie = BIT(data, 4);
+ }
}
WRITE_LINE_MEMBER(bbc_cumanafdc_device::fdc_intrq_w)
@@ -208,12 +223,6 @@ WRITE_LINE_MEMBER(bbc_cumanafdc_device::fdc_drq_w)
WRITE_LINE_MEMBER(bbc_cumanafdc_device::motor_w)
{
- for (int i = 0; i != 2; i++) {
- char devname[8];
- sprintf(devname, "%d", i);
- floppy_connector *con = m_fdc->subdevice<floppy_connector>(devname);
- if (con) {
- con->get_device()->mon_w(!state);
- }
- }
+ if (m_floppy0->get_device()) m_floppy0->get_device()->mon_w(!state);
+ if (m_floppy1->get_device()) m_floppy1->get_device()->mon_w(!state);
}
diff --git a/src/devices/bus/bbc/fdc/cumana.h b/src/devices/bus/bbc/fdc/cumana.h
index 9b0c90c0630..71048da3b1a 100644
--- a/src/devices/bus/bbc/fdc/cumana.h
+++ b/src/devices/bus/bbc/fdc/cumana.h
@@ -23,7 +23,6 @@
class bbc_cumanafdc_device :
public device_t,
public device_bbc_fdc_interface
-
{
public:
DECLARE_FLOPPY_FORMATS(floppy_formats);
@@ -31,8 +30,6 @@ public:
DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
DECLARE_WRITE_LINE_MEMBER(motor_w);
- DECLARE_READ8_MEMBER(ctrl_r);
- DECLARE_WRITE8_MEMBER(ctrl_w);
protected:
// construction/destruction
@@ -42,12 +39,15 @@ protected:
virtual void device_start() override;
virtual void device_reset() override;
- bool m_invert;
+ virtual DECLARE_READ8_MEMBER(read) override;
+ virtual DECLARE_WRITE8_MEMBER(write) override;
required_device<mb8877_device> m_fdc;
required_device<floppy_connector> m_floppy0;
optional_device<floppy_connector> m_floppy1;
+ bool m_invert;
+
private:
required_memory_region m_dfs_rom;
diff --git a/src/devices/bus/bbc/fdc/cv1797.cpp b/src/devices/bus/bbc/fdc/cv1797.cpp
index d1baf8204d9..689d9a23777 100644
--- a/src/devices/bus/bbc/fdc/cv1797.cpp
+++ b/src/devices/bus/bbc/fdc/cv1797.cpp
@@ -58,6 +58,7 @@ void bbc_cv1797_device::device_add_mconfig(machine_config &config)
m_fdc->intrq_wr_callback().set(FUNC(bbc_cv1797_device::fdc_intrq_w));
m_fdc->drq_wr_callback().set(FUNC(bbc_cv1797_device::fdc_drq_w));
m_fdc->hld_wr_callback().set(FUNC(bbc_cv1797_device::motor_w));
+
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
}
@@ -76,12 +77,13 @@ const tiny_rom_entry *bbc_cv1797_device::device_rom_region() const
//-------------------------------------------------
bbc_cv1797_device::bbc_cv1797_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, BBC_CV1797, tag, owner, clock),
- device_bbc_fdc_interface(mconfig, *this),
- m_dfs_rom(*this, "dfs_rom"),
- m_fdc(*this, "fd1797"),
- m_floppy0(*this, "fd1797:0"),
- m_floppy1(*this, "fd1797:1")
+ : device_t(mconfig, BBC_CV1797, tag, owner, clock)
+ , device_bbc_fdc_interface(mconfig, *this)
+ , m_dfs_rom(*this, "dfs_rom")
+ , m_fdc(*this, "fd1797")
+ , m_floppy0(*this, "fd1797:0")
+ , m_floppy1(*this, "fd1797:1")
+ , m_drive_control(0)
{
}
@@ -91,12 +93,7 @@ bbc_cv1797_device::bbc_cv1797_device(const machine_config &mconfig, const char *
void bbc_cv1797_device::device_start()
{
- device_t* cpu = machine().device("maincpu");
- address_space& space = cpu->memory().space(AS_PROGRAM);
- m_slot = dynamic_cast<bbc_fdc_slot_device *>(owner());
-
- space.install_readwrite_handler(0xfe80, 0xfe80, read8sm_delegate(FUNC(fd1797_device::read), m_fdc.target()), write8sm_delegate(FUNC(fd1797_device::write), m_fdc.target()));
- space.install_readwrite_handler(0xfe84, 0xfe9f, read8_delegate(FUNC(bbc_cv1797_device::fd1797l_read), this), write8_delegate(FUNC(bbc_cv1797_device::fd1797l_write), this));
+ save_item(NAME(m_drive_control));
}
//-------------------------------------------------
@@ -106,8 +103,6 @@ void bbc_cv1797_device::device_start()
void bbc_cv1797_device::device_reset()
{
machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base());
-
- m_fdc->soft_reset();
}
@@ -115,32 +110,51 @@ void bbc_cv1797_device::device_reset()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_cv1797_device::fd1797l_read)
+READ8_MEMBER(bbc_cv1797_device::read)
{
- return m_drive_control;
+ uint8_t data;
+
+ if (offset & 0x04)
+ {
+ data = m_fdc->read(offset & 0x03);
+ }
+ else
+ {
+ data = m_drive_control;
+ }
+ return data;
}
-WRITE8_MEMBER(bbc_cv1797_device::fd1797l_write)
+WRITE8_MEMBER(bbc_cv1797_device::write)
{
- floppy_image_device *floppy = nullptr;
-
- m_drive_control = data;
- logerror("fdc: Drive control %02x\n", data);
- // bit 0: drive select
- floppy_image_device *floppy0 = m_floppy0->get_device();
- floppy_image_device *floppy1 = m_floppy1->get_device();
- floppy = (BIT(data, 0) ? floppy1 : floppy0);
- m_fdc->set_floppy(floppy);
-
- // bit 1: side select
- if (floppy)
- floppy->ss_w(BIT(data, 1));
-
- // bit 2: density
- m_fdc->dden_w(BIT(data, 2));
-
- // bit 6: reset
- //if (BIT(data, 6)) m_fdc->soft_reset();
+ if (offset & 0x04)
+ {
+ m_fdc->write(offset & 0x03, data);
+ }
+ else
+ {
+ floppy_image_device *floppy = nullptr;
+
+ m_drive_control = data;
+ logerror("fdc: Drive control %02x\n", data);
+ // bit 0: drive select
+ switch (BIT(data, 0))
+ {
+ case 0: floppy = m_floppy0->get_device(); break;
+ case 1: floppy = m_floppy1->get_device(); break;
+ }
+ m_fdc->set_floppy(floppy);
+
+ // bit 1: side select
+ if (floppy)
+ floppy->ss_w(BIT(data, 1));
+
+ // bit 2: density
+ m_fdc->dden_w(!BIT(data, 2));
+
+ // bit 6: reset
+ //if (BIT(data, 6)) m_fdc->soft_reset();
+ }
}
WRITE_LINE_MEMBER(bbc_cv1797_device::fdc_intrq_w)
diff --git a/src/devices/bus/bbc/fdc/cv1797.h b/src/devices/bus/bbc/fdc/cv1797.h
index b03385810f2..b6a2f3c9a44 100644
--- a/src/devices/bus/bbc/fdc/cv1797.h
+++ b/src/devices/bus/bbc/fdc/cv1797.h
@@ -24,7 +24,6 @@
class bbc_cv1797_device :
public device_t,
public device_bbc_fdc_interface
-
{
public:
static constexpr feature_type imperfect_features() { return feature::DISK; }
@@ -41,11 +40,12 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual DECLARE_READ8_MEMBER(read) override;
+ virtual DECLARE_WRITE8_MEMBER(write) override;
+
private:
DECLARE_FLOPPY_FORMATS(floppy_formats);
- DECLARE_READ8_MEMBER(fd1797l_read);
- DECLARE_WRITE8_MEMBER(fd1797l_write);
DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
DECLARE_WRITE_LINE_MEMBER(motor_w);
diff --git a/src/devices/bus/bbc/fdc/fdc.cpp b/src/devices/bus/bbc/fdc/fdc.cpp
index 5db09a3903e..1db62be6357 100644
--- a/src/devices/bus/bbc/fdc/fdc.cpp
+++ b/src/devices/bus/bbc/fdc/fdc.cpp
@@ -32,15 +32,6 @@ device_bbc_fdc_interface::device_bbc_fdc_interface(const machine_config &mconfig
}
-//-------------------------------------------------
-// ~device_bbc_fdc_interface - destructor
-//-------------------------------------------------
-
-device_bbc_fdc_interface::~device_bbc_fdc_interface()
-{
-}
-
-
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
@@ -53,17 +44,8 @@ bbc_fdc_slot_device::bbc_fdc_slot_device(const machine_config &mconfig, const ch
device_t(mconfig, BBC_FDC_SLOT, tag, owner, clock),
device_slot_interface(mconfig, *this),
m_card(nullptr),
- m_intrq_handler(*this),
- m_drq_handler(*this)
-{
-}
-
-
-//-------------------------------------------------
-// bbc_fdc_slot_device - destructor
-//-------------------------------------------------
-
-bbc_fdc_slot_device::~bbc_fdc_slot_device()
+ m_intrq_cb(*this),
+ m_drq_cb(*this)
{
}
@@ -86,12 +68,13 @@ void bbc_fdc_slot_device::device_validity_check(validity_checker &valid) const
void bbc_fdc_slot_device::device_start()
{
device_t *const carddev = get_card_device();
- if (carddev && !dynamic_cast<device_bbc_fdc_interface *>(carddev))
+ m_card = dynamic_cast<device_bbc_fdc_interface *>(get_card_device());
+ if (carddev && !m_card)
osd_printf_error("Card device %s (%s) does not implement device_bbc_fdc_interface\n", carddev->tag(), carddev->name());
// resolve callbacks
- m_intrq_handler.resolve_safe();
- m_drq_handler.resolve_safe();
+ m_intrq_cb.resolve_safe();
+ m_drq_cb.resolve_safe();
}
//-------------------------------------------------
@@ -102,6 +85,27 @@ void bbc_fdc_slot_device::device_reset()
{
}
+//-------------------------------------------------
+// read
+//-------------------------------------------------
+
+READ8_MEMBER(bbc_fdc_slot_device::read)
+{
+ if (m_card)
+ return m_card->read(space, offset);
+ else
+ return 0xff;
+}
+
+//-------------------------------------------------
+// write
+//-------------------------------------------------
+
+WRITE8_MEMBER(bbc_fdc_slot_device::write)
+{
+ if (m_card)
+ m_card->write(space, offset, data);
+}
//-------------------------------------------------
// SLOT_INTERFACE( bbc_fdc_devices )
@@ -110,9 +114,10 @@ void bbc_fdc_slot_device::device_reset()
// slot devices
#include "acorn.h"
+#include "ams.h"
#include "cumana.h"
#include "cv1797.h"
-//#include "microware.h"
+#include "microware.h"
#include "opus.h"
//#include "solidisk.h"
#include "watford.h"
@@ -123,10 +128,11 @@ void bbc_fdc_devices(device_slot_interface &device)
{
device.option_add("acorn8271", BBC_ACORN8271);
device.option_add("acorn1770", BBC_ACORN1770);
+ device.option_add("ams3", BBC_AMS3);
device.option_add("cumana1", BBC_CUMANA1);
device.option_add("cumana2", BBC_CUMANA2);
device.option_add("cv1797", BBC_CV1797);
- //device.option_add("microware", BBC_MICROWARE);
+ device.option_add("microware", BBC_MICROWARE);
device.option_add("opus8272", BBC_OPUS8272);
device.option_add("opus2791", BBC_OPUS2791);
device.option_add("opus2793", BBC_OPUS2793);
diff --git a/src/devices/bus/bbc/fdc/fdc.h b/src/devices/bus/bbc/fdc/fdc.h
index 892db41fe1d..2b61b881e1a 100644
--- a/src/devices/bus/bbc/fdc/fdc.h
+++ b/src/devices/bus/bbc/fdc/fdc.h
@@ -14,21 +14,6 @@
//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_BBC_FDC_SLOT_ADD(_tag, _slot_intf, _def_slot, _fixed) \
- MCFG_DEVICE_ADD(_tag, BBC_FDC_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _fixed)
-
-#define MCFG_BBC_FDC_SLOT_INTRQ_HANDLER(_devcb) \
- downcast<bbc_fdc_slot_device &>(*device).set_intrq_handler(DEVCB_##_devcb);
-
-#define MCFG_BBC_FDC_SLOT_DRQ_HANDLER(_devcb) \
- downcast<bbc_fdc_slot_device &>(*device).set_drq_handler(DEVCB_##_devcb);
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -40,15 +25,27 @@ class bbc_fdc_slot_device : public device_t, public device_slot_interface
{
public:
// construction/destruction
- bbc_fdc_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual ~bbc_fdc_slot_device();
+ template <typename T>
+ bbc_fdc_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&slot_options, const char *default_option)
+ : bbc_fdc_slot_device(mconfig, tag, owner)
+ {
+ option_reset();
+ slot_options(*this);
+ set_default_option(default_option);
+ set_fixed(false);
+ }
+
+ bbc_fdc_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0);
// callbacks
- template <class Object> devcb_base &set_intrq_handler(Object &&cb) { return m_intrq_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_drq_handler(Object &&cb) { return m_drq_handler.set_callback(std::forward<Object>(cb)); }
+ auto intrq_wr_callback() { return m_intrq_cb.bind(); }
+ auto drq_wr_callback() { return m_drq_cb.bind(); }
- DECLARE_WRITE_LINE_MEMBER( intrq_w ) { m_intrq_handler(state); }
- DECLARE_WRITE_LINE_MEMBER( drq_w) { m_drq_handler(state); }
+ virtual DECLARE_READ8_MEMBER(read);
+ virtual DECLARE_WRITE8_MEMBER(write);
+
+ DECLARE_WRITE_LINE_MEMBER( intrq_w ) { m_intrq_cb(state); }
+ DECLARE_WRITE_LINE_MEMBER( drq_w) { m_drq_cb(state); }
protected:
// device-level overrides
@@ -59,8 +56,8 @@ protected:
device_bbc_fdc_interface *m_card;
private:
- devcb_write_line m_intrq_handler;
- devcb_write_line m_drq_handler;
+ devcb_write_line m_intrq_cb;
+ devcb_write_line m_drq_cb;
};
@@ -69,8 +66,8 @@ private:
class device_bbc_fdc_interface : public device_slot_card_interface
{
public:
- // construction/destruction
- virtual ~device_bbc_fdc_interface();
+ virtual DECLARE_READ8_MEMBER(read) { return 0xff; }
+ virtual DECLARE_WRITE8_MEMBER(write) { }
protected:
device_bbc_fdc_interface(const machine_config &mconfig, device_t &device);
diff --git a/src/devices/bus/bbc/fdc/microware.cpp b/src/devices/bus/bbc/fdc/microware.cpp
new file mode 100644
index 00000000000..2dc527ea822
--- /dev/null
+++ b/src/devices/bus/bbc/fdc/microware.cpp
@@ -0,0 +1,176 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ United Disk Memories DDFS FDC
+
+ Microware DDFS FDC
+
+**********************************************************************/
+
+
+#include "emu.h"
+#include "microware.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(BBC_MICROWARE, bbc_microware_device, "bbc_microware", "Microware DDFS FDC")
+
+
+//-------------------------------------------------
+// MACHINE_DRIVER( microware )
+//-------------------------------------------------
+
+FLOPPY_FORMATS_MEMBER( bbc_microware_device::floppy_formats )
+ FLOPPY_ACORN_SSD_FORMAT,
+ FLOPPY_ACORN_DSD_FORMAT,
+ FLOPPY_FSD_FORMAT
+FLOPPY_FORMATS_END
+
+static void bbc_floppies_525(device_slot_interface &device)
+{
+ device.option_add("525sssd", FLOPPY_525_SSSD);
+ device.option_add("525sd", FLOPPY_525_SD);
+ device.option_add("525ssdd", FLOPPY_525_SSDD);
+ device.option_add("525dd", FLOPPY_525_DD);
+ device.option_add("525qd", FLOPPY_525_QD);
+}
+
+ROM_START( microware )
+ ROM_REGION(0x4000, "dfs_rom", 0)
+ ROM_DEFAULT_BIOS("udm200")
+ ROM_SYSTEM_BIOS(0, "ddfs090", "Microware DDFS 0.90")
+ ROMX_LOAD("microware_ddfs090.rom", 0x0000, 0x4000, CRC(700d50e5) SHA1(6834e46cb15354003d553e6c2bdb4ed76b47a465), ROM_BIOS(0))
+ ROM_SYSTEM_BIOS(1, "udm200", "UDM DDFS 2.00")
+ ROMX_LOAD("udm_ddfs200.rom", 0x0000, 0x4000, CRC(1b4708a2) SHA1(0f37bcc73a758657cfe58c19f0cc92be9107e767), ROM_BIOS(1))
+ROM_END
+
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void bbc_microware_device::device_add_mconfig(machine_config &config)
+{
+ WD2793(config, m_fdc, 16_MHz_XTAL / 16); // Replay advert suggests Type R8272 UDM DFS
+ m_fdc->intrq_wr_callback().set(FUNC(bbc_microware_device::fdc_intrq_w));
+ m_fdc->drq_wr_callback().set(FUNC(bbc_microware_device::fdc_drq_w));
+ m_fdc->hld_wr_callback().set(FUNC(bbc_microware_device::motor_w));
+
+ FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
+}
+
+const tiny_rom_entry *bbc_microware_device::device_rom_region() const
+{
+ return ROM_NAME( microware );
+}
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// bbc_microware_device - constructor
+//-------------------------------------------------
+
+bbc_microware_device::bbc_microware_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, BBC_MICROWARE, tag, owner, clock)
+ , device_bbc_fdc_interface(mconfig, *this)
+ , m_dfs_rom(*this, "dfs_rom")
+ , m_fdc(*this, "wd2793")
+ , m_floppy0(*this, "wd2793:0")
+ , m_floppy1(*this, "wd2793:1")
+ , m_drive_control(0)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void bbc_microware_device::device_start()
+{
+ save_item(NAME(m_drive_control));
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void bbc_microware_device::device_reset()
+{
+ machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base());
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+READ8_MEMBER(bbc_microware_device::read)
+{
+ uint8_t data;
+
+ if (offset & 0x04)
+ {
+ data = m_fdc->read(offset & 0x03);
+ }
+ else
+ {
+ data = m_drive_control;
+ }
+ return data;
+}
+
+WRITE8_MEMBER(bbc_microware_device::write)
+{
+ if (offset & 0x04)
+ {
+ m_fdc->write(offset & 0x03, data);
+ }
+ else
+ {
+ floppy_image_device *floppy = nullptr;
+
+ m_drive_control = data;
+ logerror("fdc: Drive control %02x \n", data);
+ // bit 0: drive select
+ switch (BIT(data, 0))
+ {
+ case 0: floppy = m_floppy0->get_device(); break;
+ case 1: floppy = m_floppy1->get_device(); break;
+ }
+ m_fdc->set_floppy(floppy);
+
+ // bit 1: side select
+ if (floppy)
+ floppy->ss_w(BIT(data, 1));
+
+ // bit 2: density
+ m_fdc->dden_w(BIT(data, 2));
+
+ // bit 3: always set ???
+
+ // bit 4: ??? interrupt
+ }
+}
+
+WRITE_LINE_MEMBER(bbc_microware_device::fdc_intrq_w)
+{
+ m_slot->intrq_w(state);
+}
+
+WRITE_LINE_MEMBER(bbc_microware_device::fdc_drq_w)
+{
+ m_slot->drq_w(state);
+}
+
+WRITE_LINE_MEMBER(bbc_microware_device::motor_w)
+{
+ if (m_floppy0->get_device()) m_floppy0->get_device()->mon_w(!state);
+ if (m_floppy1->get_device()) m_floppy1->get_device()->mon_w(!state);
+}
diff --git a/src/devices/bus/bbc/fdc/microware.h b/src/devices/bus/bbc/fdc/microware.h
new file mode 100644
index 00000000000..9d42eb2b668
--- /dev/null
+++ b/src/devices/bus/bbc/fdc/microware.h
@@ -0,0 +1,68 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ United Disk Memories DDFS FDC
+
+ Microware DDFS FDC
+
+**********************************************************************/
+
+
+#ifndef MAME_BUS_BBC_FDC_MICROWARE_H
+#define MAME_BUS_BBC_FDC_MICROWARE_H
+
+#pragma once
+
+#include "fdc.h"
+#include "machine/wd_fdc.h"
+#include "formats/acorn_dsk.h"
+#include "formats/fsd_dsk.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class bbc_microware_device :
+ public device_t,
+ public device_bbc_fdc_interface
+{
+public:
+ static constexpr feature_type imperfect_features() { return feature::DISK; }
+
+ // construction/destruction
+ bbc_microware_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+ virtual DECLARE_READ8_MEMBER(read) override;
+ virtual DECLARE_WRITE8_MEMBER(write) override;
+
+private:
+ DECLARE_FLOPPY_FORMATS(floppy_formats);
+
+ DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
+ DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
+ DECLARE_WRITE_LINE_MEMBER(motor_w);
+
+ required_memory_region m_dfs_rom;
+ required_device<wd2793_device> m_fdc;
+ required_device<floppy_connector> m_floppy0;
+ optional_device<floppy_connector> m_floppy1;
+
+ int m_drive_control;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(BBC_MICROWARE, bbc_microware_device);
+
+
+#endif /* MAME_BUS_BBC_FDC_MICROWARE_H */
diff --git a/src/devices/bus/bbc/fdc/opus.cpp b/src/devices/bus/bbc/fdc/opus.cpp
index c336cd71a24..85eb8f5e7e9 100644
--- a/src/devices/bus/bbc/fdc/opus.cpp
+++ b/src/devices/bus/bbc/fdc/opus.cpp
@@ -94,6 +94,7 @@ void bbc_opus8272_device::device_add_mconfig(machine_config &config)
I8272A(config, m_fdc, 0);
m_fdc->set_ready_line_connected(true);
m_fdc->intrq_wr_callback().set(FUNC(bbc_opus8272_device::fdc_intrq_w));
+
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true);
}
@@ -103,6 +104,7 @@ void bbc_opus2791_device::device_add_mconfig(machine_config &config)
WD2791(config, m_fdc, 16_MHz_XTAL / 16);
m_fdc->drq_wr_callback().set(FUNC(bbc_opusfdc_device::fdc_drq_w));
m_fdc->hld_wr_callback().set(FUNC(bbc_opusfdc_device::motor_w));
+
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true);
}
@@ -112,6 +114,7 @@ void bbc_opus2793_device::device_add_mconfig(machine_config &config)
WD2793(config, m_fdc, 16_MHz_XTAL / 16);
m_fdc->drq_wr_callback().set(FUNC(bbc_opusfdc_device::fdc_drq_w));
m_fdc->hld_wr_callback().set(FUNC(bbc_opusfdc_device::motor_w));
+
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true);
}
@@ -120,6 +123,7 @@ void bbc_opus1770_device::device_add_mconfig(machine_config &config)
{
WD1770(config, m_fdc, 16_MHz_XTAL / 2);
m_fdc->drq_wr_callback().set(FUNC(bbc_opusfdc_device::fdc_drq_w));
+
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true);
}
@@ -169,7 +173,8 @@ bbc_opusfdc_device::bbc_opusfdc_device(const machine_config &mconfig, device_typ
m_fdc(*this, "fdc"),
m_floppy0(*this, "fdc:0"),
m_floppy1(*this, "fdc:1"),
- m_dfs_rom(*this, "dfs_rom")
+ m_dfs_rom(*this, "dfs_rom"),
+ m_drive_control(0)
{
}
@@ -194,21 +199,11 @@ bbc_opus1770_device::bbc_opus1770_device(const machine_config &mconfig, const ch
void bbc_opus8272_device::device_start()
{
- device_t* cpu = machine().device("maincpu");
- address_space& space = cpu->memory().space(AS_PROGRAM);
- m_slot = dynamic_cast<bbc_fdc_slot_device *>(owner());
-
- space.install_readwrite_handler(0xfe80, 0xfe86, READ8_DELEGATE(bbc_opus8272_device, fdc_r), WRITE8_DELEGATE(bbc_opus8272_device, fdc_w));
}
void bbc_opusfdc_device::device_start()
{
- device_t* cpu = machine().device("maincpu");
- address_space& space = cpu->memory().space(AS_PROGRAM);
- m_slot = dynamic_cast<bbc_fdc_slot_device *>(owner());
-
- space.install_readwrite_handler(0xfe80, 0xfe83, read8sm_delegate(FUNC(wd_fdc_device_base::read), m_fdc.target()), write8sm_delegate(FUNC(wd_fdc_device_base::write), m_fdc.target()));
- space.install_readwrite_handler(0xfe84, 0xfe84, READ8_DELEGATE(bbc_opusfdc_device, ctrl_r), WRITE8_DELEGATE(bbc_opusfdc_device, ctrl_w));
+ save_item(NAME(m_drive_control));
}
//-------------------------------------------------
@@ -218,15 +213,11 @@ void bbc_opusfdc_device::device_start()
void bbc_opus8272_device::device_reset()
{
machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base());
-
- m_fdc->soft_reset();
}
void bbc_opusfdc_device::device_reset()
{
machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base());
-
- m_fdc->soft_reset();
}
@@ -234,11 +225,11 @@ void bbc_opusfdc_device::device_reset()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_opus8272_device::fdc_r)
+READ8_MEMBER(bbc_opus8272_device::read)
{
uint8_t data = 0xff;
- switch (offset)
+ switch (offset & 0x07)
{
case 0x02:
m_fdc->tc_w(true);
@@ -262,11 +253,11 @@ READ8_MEMBER(bbc_opus8272_device::fdc_r)
return data;
}
-WRITE8_MEMBER(bbc_opus8272_device::fdc_w)
+WRITE8_MEMBER(bbc_opus8272_device::write)
{
floppy_image_device *floppy = nullptr;
- switch (offset)
+ switch (offset & 0x07)
{
case 0x01:
switch (data & 0x01)
@@ -292,31 +283,48 @@ WRITE_LINE_MEMBER(bbc_opus8272_device::fdc_intrq_w)
}
-READ8_MEMBER(bbc_opusfdc_device::ctrl_r)
+READ8_MEMBER(bbc_opusfdc_device::read)
{
- return m_drive_control;
+ uint8_t data;
+
+ if (offset & 0x04)
+ {
+ data = m_drive_control;
+ }
+ else
+ {
+ data = m_fdc->read(offset & 0x03);
+ }
+ return data;
}
-WRITE8_MEMBER(bbc_opusfdc_device::ctrl_w)
+WRITE8_MEMBER(bbc_opusfdc_device::write)
{
- floppy_image_device *floppy = nullptr;
+ if (offset & 0x04)
+ {
+ floppy_image_device *floppy = nullptr;
- m_drive_control = data;
+ m_drive_control = data;
- // bit 0: drive select
- switch (BIT(data, 0))
- {
- case 0: floppy = m_floppy0->get_device(); break;
- case 1: floppy = m_floppy1->get_device(); break;
- }
- m_fdc->set_floppy(floppy);
+ // bit 0: drive select
+ switch (BIT(data, 0))
+ {
+ case 0: floppy = m_floppy0->get_device(); break;
+ case 1: floppy = m_floppy1->get_device(); break;
+ }
+ m_fdc->set_floppy(floppy);
- // bit 1: side select
- if (floppy)
- floppy->ss_w(BIT(data, 1));
+ // bit 1: side select
+ if (floppy)
+ floppy->ss_w(BIT(data, 1));
- // bit 6: density
- m_fdc->dden_w(!BIT(data, 6));
+ // bit 6: density
+ m_fdc->dden_w(!BIT(data, 6));
+ }
+ else
+ {
+ m_fdc->write(offset & 0x03, data);
+ }
}
WRITE_LINE_MEMBER(bbc_opusfdc_device::fdc_drq_w)
diff --git a/src/devices/bus/bbc/fdc/opus.h b/src/devices/bus/bbc/fdc/opus.h
index 64ed0c61fe6..86af3dfe370 100644
--- a/src/devices/bus/bbc/fdc/opus.h
+++ b/src/devices/bus/bbc/fdc/opus.h
@@ -22,7 +22,6 @@
class bbc_opus8272_device :
public device_t,
public device_bbc_fdc_interface
-
{
public:
// construction/destruction
@@ -37,9 +36,10 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual DECLARE_READ8_MEMBER(read) override;
+ virtual DECLARE_WRITE8_MEMBER(write) override;
+
private:
- DECLARE_READ8_MEMBER(fdc_r);
- DECLARE_WRITE8_MEMBER(fdc_w);
DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
required_memory_region m_dfs_rom;
@@ -49,19 +49,15 @@ private:
};
-class bbc_opusfdc_device:
+class bbc_opusfdc_device :
public device_t,
public device_bbc_fdc_interface
-
{
public:
DECLARE_FLOPPY_FORMATS(floppy_formats);
- DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
DECLARE_WRITE_LINE_MEMBER(motor_w);
- DECLARE_READ8_MEMBER(ctrl_r);
- DECLARE_WRITE8_MEMBER(ctrl_w);
protected:
// construction/destruction
@@ -71,6 +67,9 @@ protected:
virtual void device_start() override;
virtual void device_reset() override;
+ virtual DECLARE_READ8_MEMBER(read) override;
+ virtual DECLARE_WRITE8_MEMBER(write) override;
+
required_device<wd_fdc_device_base> m_fdc;
required_device<floppy_connector> m_floppy0;
optional_device<floppy_connector> m_floppy1;
diff --git a/src/devices/bus/bbc/fdc/watford.cpp b/src/devices/bus/bbc/fdc/watford.cpp
index 10c56e9cfce..be7f17dea80 100644
--- a/src/devices/bus/bbc/fdc/watford.cpp
+++ b/src/devices/bus/bbc/fdc/watford.cpp
@@ -70,6 +70,7 @@ void bbc_weddb2_device::device_add_mconfig(machine_config &config)
WD1772(config, m_fdc, 16_MHz_XTAL / 2);
m_fdc->intrq_wr_callback().set(FUNC(bbc_weddb2_device::fdc_intrq_w));
m_fdc->drq_wr_callback().set(FUNC(bbc_weddb2_device::fdc_drq_w));
+
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
}
@@ -79,6 +80,7 @@ void bbc_weddb3_device::device_add_mconfig(machine_config &config)
WD1770(config, m_fdc, 16_MHz_XTAL / 2);
m_fdc->intrq_wr_callback().set(FUNC(bbc_weddb3_device::fdc_intrq_w));
m_fdc->drq_wr_callback().set(FUNC(bbc_weddb3_device::fdc_drq_w));
+
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
}
@@ -102,27 +104,29 @@ const tiny_rom_entry *bbc_weddb3_device::device_rom_region() const
// bbc_watfordfdc_device - constructor
//-------------------------------------------------
-bbc_watfordfdc_device::bbc_watfordfdc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
- device_t(mconfig, type, tag, owner, clock),
- device_bbc_fdc_interface(mconfig, *this)
+bbc_watfordfdc_device::bbc_watfordfdc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_bbc_fdc_interface(mconfig, *this)
{
}
bbc_weddb2_device::bbc_weddb2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : bbc_watfordfdc_device(mconfig, BBC_WEDDB2, tag, owner, clock),
- m_dfs_rom(*this, "dfs_rom"),
- m_fdc(*this, "wd1772"),
- m_floppy0(*this, "wd1772:0"),
- m_floppy1(*this, "wd1772:1")
+ : bbc_watfordfdc_device(mconfig, BBC_WEDDB2, tag, owner, clock)
+ , m_dfs_rom(*this, "dfs_rom")
+ , m_fdc(*this, "wd1772")
+ , m_floppy0(*this, "wd1772:0")
+ , m_floppy1(*this, "wd1772:1")
+ , m_drive_control(0)
{
}
bbc_weddb3_device::bbc_weddb3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : bbc_watfordfdc_device(mconfig, BBC_WEDDB3, tag, owner, clock),
- m_dfs_rom(*this, "dfs_rom"),
- m_fdc(*this, "wd1770"),
- m_floppy0(*this, "wd1770:0"),
- m_floppy1(*this, "wd1770:1")
+ : bbc_watfordfdc_device(mconfig, BBC_WEDDB3, tag, owner, clock)
+ , m_dfs_rom(*this, "dfs_rom")
+ , m_fdc(*this, "wd1770")
+ , m_floppy0(*this, "wd1770:0")
+ , m_floppy1(*this, "wd1770:1")
+ , m_drive_control(0)
{
}
@@ -132,22 +136,12 @@ bbc_weddb3_device::bbc_weddb3_device(const machine_config &mconfig, const char *
void bbc_weddb2_device::device_start()
{
- device_t* cpu = machine().device("maincpu");
- address_space& space = cpu->memory().space(AS_PROGRAM);
- m_slot = dynamic_cast<bbc_fdc_slot_device *>(owner());
-
- space.install_readwrite_handler(0xfe80, 0xfe83, read8_delegate(FUNC(bbc_weddb2_device::wd177xl_read), this), write8_delegate(FUNC(bbc_weddb2_device::wd177xl_write), this));
- space.install_readwrite_handler(0xfe84, 0xfe8f, read8sm_delegate(FUNC(wd_fdc_device_base::read), m_fdc.target()), write8sm_delegate(FUNC(wd_fdc_device_base::write), m_fdc.target()));
+ save_item(NAME(m_drive_control));
}
void bbc_weddb3_device::device_start()
{
- device_t* cpu = machine().device("maincpu");
- address_space& space = cpu->memory().space(AS_PROGRAM);
- m_slot = dynamic_cast<bbc_fdc_slot_device *>(owner());
-
- space.install_readwrite_handler(0xfe80, 0xfe83, read8_delegate(FUNC(bbc_weddb3_device::wd177xl_read), this), write8_delegate(FUNC(bbc_weddb3_device::wd177xl_write), this));
- space.install_readwrite_handler(0xfe84, 0xfe8f, read8sm_delegate(FUNC(wd_fdc_device_base::read), m_fdc.target()), write8sm_delegate(FUNC(wd_fdc_device_base::write), m_fdc.target()));
+ save_item(NAME(m_drive_control));
}
//-------------------------------------------------
@@ -169,59 +163,93 @@ void bbc_weddb3_device::device_reset()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_weddb2_device::wd177xl_read)
+READ8_MEMBER(bbc_weddb2_device::read)
{
- return m_drive_control;
+ uint8_t data;
+
+ if (offset & 0x04)
+ {
+ data = m_fdc->read(offset & 0x03);
+ }
+ else
+ {
+ data = m_drive_control;
+ }
+ return data;
}
-WRITE8_MEMBER(bbc_weddb2_device::wd177xl_write)
+WRITE8_MEMBER(bbc_weddb2_device::write)
{
- floppy_image_device *floppy = nullptr;
-
- m_drive_control = data;
-
- // bit 2: drive select
- floppy_image_device *floppy0 = m_fdc->subdevice<floppy_connector>("0")->get_device();
- floppy_image_device *floppy1 = m_fdc->subdevice<floppy_connector>("1")->get_device();
- floppy = (BIT(data, 2) ? floppy1 : floppy0);
- m_fdc->set_floppy(floppy);
-
- // bit 0: density
- m_fdc->dden_w(BIT(data, 0));
-
- // bit 1: side select
- if (floppy)
- floppy->ss_w(BIT(data, 1));
-
- // bit 3: reset
- if (!BIT(data, 3)) m_fdc->soft_reset();
+ if (offset & 0x04)
+ {
+ m_fdc->write(offset & 0x03, data);
+ }
+ else
+ {
+ floppy_image_device *floppy = nullptr;
+
+ m_drive_control = data;
+
+ // bit 2: drive select
+ floppy_image_device *floppy0 = m_floppy0->get_device();
+ floppy_image_device *floppy1 = m_floppy1->get_device();
+ floppy = (BIT(data, 2) ? floppy1 : floppy0);
+ m_fdc->set_floppy(floppy);
+
+ // bit 0: density
+ m_fdc->dden_w(BIT(data, 0));
+
+ // bit 1: side select
+ if (floppy)
+ floppy->ss_w(BIT(data, 1));
+
+ // bit 3: reset
+ if (!BIT(data, 3)) m_fdc->soft_reset();
+ }
}
-READ8_MEMBER(bbc_weddb3_device::wd177xl_read)
+READ8_MEMBER(bbc_weddb3_device::read)
{
- return m_drive_control;
+ uint8_t data;
+
+ if (offset & 0x04)
+ {
+ data = m_fdc->read(offset & 0x03);
+ }
+ else
+ {
+ data = m_drive_control;
+ }
+ return data;
}
-WRITE8_MEMBER(bbc_weddb3_device::wd177xl_write)
+WRITE8_MEMBER(bbc_weddb3_device::write)
{
- floppy_image_device *floppy = nullptr;
-
- m_drive_control = data;
-
- // bit 0, 1: drive select
- if (BIT(data, 0)) floppy = m_fdc->subdevice<floppy_connector>("0")->get_device();
- if (BIT(data, 1)) floppy = m_fdc->subdevice<floppy_connector>("1")->get_device();
- m_fdc->set_floppy(floppy);
-
- // bit 2: side select
- if (floppy)
- floppy->ss_w(BIT(data, 2));
-
- // bit 3: density
- m_fdc->dden_w(BIT(data, 3));
-
- // bit 5: reset
- if (!BIT(data, 5)) m_fdc->soft_reset();
+ if (offset & 0x04)
+ {
+ m_fdc->write(offset & 0x03, data);
+ }
+ else
+ {
+ floppy_image_device *floppy = nullptr;
+
+ m_drive_control = data;
+
+ // bit 0, 1: drive select
+ if (BIT(data, 0)) floppy = m_floppy0->get_device();
+ if (BIT(data, 1)) floppy = m_floppy1->get_device();
+ m_fdc->set_floppy(floppy);
+
+ // bit 2: side select
+ if (floppy)
+ floppy->ss_w(BIT(data, 2));
+
+ // bit 3: density
+ m_fdc->dden_w(BIT(data, 3));
+
+ // bit 5: reset
+ if (!BIT(data, 5)) m_fdc->soft_reset();
+ }
}
WRITE_LINE_MEMBER(bbc_watfordfdc_device::fdc_intrq_w)
diff --git a/src/devices/bus/bbc/fdc/watford.h b/src/devices/bus/bbc/fdc/watford.h
index ddc266d83ed..2f03f24eb0f 100644
--- a/src/devices/bus/bbc/fdc/watford.h
+++ b/src/devices/bus/bbc/fdc/watford.h
@@ -23,18 +23,16 @@
class bbc_watfordfdc_device :
public device_t,
public device_bbc_fdc_interface
-
{
public:
+ DECLARE_FLOPPY_FORMATS(floppy_formats);
+ DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
+ DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
protected:
// construction/destruction
bbc_watfordfdc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_FLOPPY_FORMATS(floppy_formats);
-
- DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
- DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
};
class bbc_weddb2_device : public bbc_watfordfdc_device
@@ -42,9 +40,6 @@ class bbc_weddb2_device : public bbc_watfordfdc_device
public:
bbc_weddb2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_READ8_MEMBER(wd177xl_read);
- DECLARE_WRITE8_MEMBER(wd177xl_write);
-
protected:
// device-level overrides
virtual void device_start() override;
@@ -53,6 +48,9 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual DECLARE_READ8_MEMBER(read) override;
+ virtual DECLARE_WRITE8_MEMBER(write) override;
+
private:
required_memory_region m_dfs_rom;
required_device<wd_fdc_device_base> m_fdc;
@@ -67,9 +65,6 @@ class bbc_weddb3_device : public bbc_watfordfdc_device
public:
bbc_weddb3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_READ8_MEMBER(wd177xl_read);
- DECLARE_WRITE8_MEMBER(wd177xl_write);
-
protected:
// device-level overrides
virtual void device_start() override;
@@ -78,6 +73,9 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual DECLARE_READ8_MEMBER(read) override;
+ virtual DECLARE_WRITE8_MEMBER(write) override;
+
private:
required_memory_region m_dfs_rom;
required_device<wd_fdc_device_base> m_fdc;
diff --git a/src/devices/bus/bbc/joyport/joyport.cpp b/src/devices/bus/bbc/joyport/joyport.cpp
index b45b804a76c..5ed3f8d2fff 100644
--- a/src/devices/bus/bbc/joyport/joyport.cpp
+++ b/src/devices/bus/bbc/joyport/joyport.cpp
@@ -32,15 +32,6 @@ device_bbc_joyport_interface::device_bbc_joyport_interface(const machine_config
}
-//-------------------------------------------------
-// ~device_bbc_joyport_interface - destructor
-//-------------------------------------------------
-
-device_bbc_joyport_interface::~device_bbc_joyport_interface()
-{
-}
-
-
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
@@ -102,8 +93,9 @@ void bbc_joyport_slot_device::device_reset()
READ8_MEMBER(bbc_joyport_slot_device::pb_r)
{
+ // TODO: Joyport connected to PB0-PB4 only. PB5-PB7 are expansion port.
if (m_device)
- return m_device->pb_r(space, 0);
+ return 0xe0 | m_device->pb_r(space, 0);
else
return 0xff;
}
diff --git a/src/devices/bus/bbc/joyport/joyport.h b/src/devices/bus/bbc/joyport/joyport.h
index a11e39a38ec..572e41f7612 100644
--- a/src/devices/bus/bbc/joyport/joyport.h
+++ b/src/devices/bus/bbc/joyport/joyport.h
@@ -34,20 +34,6 @@
//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_BBC_JOYPORT_ADD( _tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, BBC_JOYPORT_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-#define MCFG_BBC_JOYPORT_CB1_HANDLER(_devcb) \
- downcast<bbc_joyport_slot_device &>(*device).set_cb1_handler(DEVCB_##_devcb);
-
-#define MCFG_BBC_JOYPORT_CB2_HANDLER(_devcb) \
- downcast<bbc_joyport_slot_device &>(*device).set_cb2_handler(DEVCB_##_devcb);
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -59,11 +45,21 @@ class bbc_joyport_slot_device : public device_t, public device_slot_interface
{
public:
// construction/destruction
- bbc_joyport_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ bbc_joyport_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&slot_options, const char *default_option)
+ : bbc_joyport_slot_device(mconfig, tag, owner)
+ {
+ option_reset();
+ slot_options(*this);
+ set_default_option(default_option);
+ set_fixed(false);
+ }
+
+ bbc_joyport_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0);
// callbacks
- template <class Object> devcb_base &set_cb1_handler(Object &&cb) { return m_cb1_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_cb2_handler(Object &&cb) { return m_cb2_handler.set_callback(std::forward<Object>(cb)); }
+ auto cb1_handler() { return m_cb1_handler.bind(); }
+ auto cb2_handler() { return m_cb2_handler.bind(); }
DECLARE_WRITE_LINE_MEMBER(cb1_w) { m_cb1_handler(state); }
DECLARE_WRITE_LINE_MEMBER(cb2_w) { m_cb2_handler(state); }
@@ -90,9 +86,6 @@ private:
class device_bbc_joyport_interface : public device_slot_card_interface
{
public:
- // construction/destruction
- virtual ~device_bbc_joyport_interface();
-
virtual DECLARE_READ8_MEMBER(pb_r) { return 0xff; }
virtual DECLARE_WRITE8_MEMBER(pb_w) { }
diff --git a/src/devices/bus/bbc/tube/tube.cpp b/src/devices/bus/bbc/tube/tube.cpp
index f3824e872cf..c69b57cd45f 100644
--- a/src/devices/bus/bbc/tube/tube.cpp
+++ b/src/devices/bus/bbc/tube/tube.cpp
@@ -34,16 +34,6 @@ device_bbc_tube_interface::device_bbc_tube_interface(const machine_config &mconf
}
-//-------------------------------------------------
-// ~device_bbc_tube_interface - destructor
-//-------------------------------------------------
-
-device_bbc_tube_interface::~device_bbc_tube_interface()
-{
-}
-
-
-
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
@@ -62,15 +52,6 @@ bbc_tube_slot_device::bbc_tube_slot_device(const machine_config &mconfig, const
//-------------------------------------------------
-// bbc_tube_slot_device - destructor
-//-------------------------------------------------
-
-bbc_tube_slot_device::~bbc_tube_slot_device()
-{
-}
-
-
-//-------------------------------------------------
// device_validity_check -
//-------------------------------------------------
@@ -135,8 +116,10 @@ WRITE8_MEMBER(bbc_tube_slot_device::host_w)
#include "tube_65c102.h"
#include "tube_80186.h"
#include "tube_80286.h"
+//#include "tube_a500.h"
#include "tube_arm.h"
#include "tube_casper.h"
+//#include "tube_pmsb2p.h"
//#include "tube_x25.h"
#include "tube_z80.h"
#include "tube_zep100.h"
@@ -151,12 +134,16 @@ void bbc_extube_devices(device_slot_interface &device)
device.option_add("6502", BBC_TUBE_6502); /* Acorn ANC01 6502 2nd processor */
device.option_add("z80", BBC_TUBE_Z80); /* Acorn ANC04 Z80 2nd processor */
// device.option_add("32016", BBC_TUBE_32016); /* Acorn ANC05 32016 2nd processor */
-// device.option_add("camb", BBC_TUBE_CAMB); /* Acorn ANC06 Cambridge Co-Processor */
device.option_add("arm", BBC_TUBE_ARM); /* Acorn ANC13 ARM Evaluation System */
device.option_add("80286", BBC_TUBE_80286); /* Acorn 80286 2nd Processor */
-// device.option_add("a500", BBC_TUBE_A500); /* Acorn A500 2nd Processor */
+ //device.option_add("a500", BBC_TUBE_A500); /* Acorn A500 2nd Processor */
device.option_add("casper", BBC_TUBE_CASPER); /* Casper 68000 2nd Processor */
- device.option_add("zep100", BBC_TUBE_ZEP100); /* Torch Z80 Communicator (ZEP100) */
+ //device.option_add("pmsb2p", BBC_TUBE_PMSB2P); /* PMS B2P-6502 */
+ //device.option_add("hdp68k", BBC_TUBE_HDP68K); /* Torch Unicorn (HDP68K) */
+ device.option_add("zep100", BBC_TUBE_ZEP100); /* Torch Z80 Communicator (ZEP100) (Torch) */
+ //device.option_add("zep100l", BBC_TUBE_ZEP100L); /* Torch Z80 Communicator (ZEP100) (Acorn 8271) */
+ //device.option_add("zep100w", BBC_TUBE_ZEP100W); /* Torch Z80 Communicator (ZEP100) (Acorn 1770) */
+ //device.option_add("zep100m", BBC_TUBE_ZEP100M); /* Torch Z80 Communicator (ZEP100) (Master) */
/* Acorn ANC21 Universal 2nd Processor Unit */
device.option_add("65c102", BBC_TUBE_65C102); /* Acorn ADC06 65C102 co-processor */
device.option_add("80186", BBC_TUBE_80186); /* Acorn ADC08 80186 co-processor */
@@ -176,6 +163,19 @@ void bbc_intube_devices(device_slot_interface &device)
//-------------------------------------------------
+// SLOT_INTERFACE( electron_tube_devices )
+//-------------------------------------------------
+
+void electron_tube_devices(device_slot_interface &device)
+{
+ device.option_add("6502", BBC_TUBE_6502); /* Acorn ANC01 6502 2nd processor */
+ device.option_add("z80", BBC_TUBE_Z80); /* Acorn ANC04 Z80 2nd processor */
+ device.option_add("arm", BBC_TUBE_ARM); /* Acorn ANC13 ARM Evaluation System */
+ device.option_add("65c102", BBC_TUBE_65C102); /* Acorn ADC06 65C102 co-processor */
+ device.option_add("80186", BBC_TUBE_80186); /* Acorn ADC08 80186 co-processor */
+}
+
+//-------------------------------------------------
// SLOT_INTERFACE( bbc_x25tube_devices )
//-------------------------------------------------
diff --git a/src/devices/bus/bbc/tube/tube.h b/src/devices/bus/bbc/tube/tube.h
index 722207d8d93..1bcc413c8ac 100644
--- a/src/devices/bus/bbc/tube/tube.h
+++ b/src/devices/bus/bbc/tube/tube.h
@@ -39,25 +39,6 @@
//**************************************************************************
-// CONSTANTS
-//**************************************************************************
-
-#define BBC_TUBE_SLOT_TAG "tube"
-
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_BBC_TUBE_SLOT_ADD(_tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, BBC_TUBE_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-#define MCFG_BBC_TUBE_SLOT_IRQ_HANDLER(_devcb) \
- downcast<bbc_tube_slot_device &>(*device).set_irq_handler(DEVCB_##_devcb);
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -70,11 +51,20 @@ class bbc_tube_slot_device : public device_t, public device_slot_interface
{
public:
// construction/destruction
- bbc_tube_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual ~bbc_tube_slot_device();
+ template <typename T>
+ bbc_tube_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&slot_options, const char *default_option)
+ : bbc_tube_slot_device(mconfig, tag, owner)
+ {
+ option_reset();
+ slot_options(*this);
+ set_default_option(default_option);
+ set_fixed(false);
+ }
+
+ bbc_tube_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0);
// callbacks
- template <class Object> devcb_base &set_irq_handler(Object &&cb) { return m_irq_handler.set_callback(std::forward<Object>(cb)); }
+ auto irq_handler() { return m_irq_handler.bind(); }
DECLARE_READ8_MEMBER( host_r );
DECLARE_WRITE8_MEMBER( host_w );
@@ -99,9 +89,6 @@ private:
class device_bbc_tube_interface : public device_slot_card_interface
{
public:
- // construction/destruction
- virtual ~device_bbc_tube_interface();
-
// reading and writing
virtual DECLARE_READ8_MEMBER(host_r) { return 0xfe; }
virtual DECLARE_WRITE8_MEMBER(host_w) { }
@@ -118,6 +105,7 @@ DECLARE_DEVICE_TYPE(BBC_TUBE_SLOT, bbc_tube_slot_device)
void bbc_extube_devices(device_slot_interface &device);
void bbc_intube_devices(device_slot_interface &device);
+void electron_tube_devices(device_slot_interface &device);
//void bbc_x25tube_devices(device_slot_interface &device);
diff --git a/src/devices/bus/bbc/tube/tube_6502.cpp b/src/devices/bus/bbc/tube/tube_6502.cpp
index beecb3a3019..3aa3c6a1175 100644
--- a/src/devices/bus/bbc/tube/tube_6502.cpp
+++ b/src/devices/bus/bbc/tube/tube_6502.cpp
@@ -43,21 +43,22 @@ ROM_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(bbc_tube_6502_device::device_add_mconfig)
- MCFG_DEVICE_ADD("m6502", M65C02, XTAL(12'000'000) / 4)
- MCFG_DEVICE_PROGRAM_MAP(tube_6502_mem)
+void bbc_tube_6502_device::device_add_mconfig(machine_config &config)
+{
+ M65C02(config, m_m6502, 12_MHz_XTAL / 4);
+ m_m6502->set_addrmap(AS_PROGRAM, &bbc_tube_6502_device::tube_6502_mem);
- MCFG_TUBE_ADD("ula")
- MCFG_TUBE_PNMI_HANDLER(INPUTLINE("m6502", M65C02_NMI_LINE))
- MCFG_TUBE_PIRQ_HANDLER(INPUTLINE("m6502", M65C02_IRQ_LINE))
+ TUBE(config, m_ula);
+ m_ula->pnmi_handler().set_inputline(m_m6502, M65C02_NMI_LINE);
+ m_ula->pirq_handler().set_inputline(m_m6502, M65C02_IRQ_LINE);
/* internal ram */
- RAM(config, RAM_TAG).set_default_size("64K").set_default_value(0);
+ RAM(config, m_ram).set_default_size("64K").set_default_value(0);
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_ls_6502", "bbc_flop_6502")
- MCFG_SOFTWARE_LIST_ADD("flop_ls_65c102", "bbc_flop_65c102")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_ls_6502").set_original("bbc_flop_6502");
+ SOFTWARE_LIST(config, "flop_ls_65c102").set_original("bbc_flop_65c102");
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/bbc/tube/tube_65c102.cpp b/src/devices/bus/bbc/tube/tube_65c102.cpp
index 56668f8c830..1ef92732526 100644
--- a/src/devices/bus/bbc/tube/tube_65c102.cpp
+++ b/src/devices/bus/bbc/tube/tube_65c102.cpp
@@ -43,21 +43,22 @@ ROM_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(bbc_tube_65c102_device::device_add_mconfig)
- MCFG_DEVICE_ADD("maincpu", M65C02, XTAL(16'000'000) / 4)
- MCFG_DEVICE_PROGRAM_MAP(tube_6502_mem)
+void bbc_tube_65c102_device::device_add_mconfig(machine_config &config)
+{
+ M65C02(config, m_maincpu, 16_MHz_XTAL / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &bbc_tube_65c102_device::tube_6502_mem);
- MCFG_TUBE_ADD("ula")
- MCFG_TUBE_PNMI_HANDLER(INPUTLINE("maincpu", M65C02_NMI_LINE))
- MCFG_TUBE_PIRQ_HANDLER(INPUTLINE("maincpu", M65C02_IRQ_LINE))
+ TUBE(config, m_ula);
+ m_ula->pnmi_handler().set_inputline(m_maincpu, M65C02_NMI_LINE);
+ m_ula->pirq_handler().set_inputline(m_maincpu, M65C02_IRQ_LINE);
/* internal ram */
- RAM(config, RAM_TAG).set_default_size("64K").set_default_value(0);
+ RAM(config, m_ram).set_default_size("64K").set_default_value(0);
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_ls_6502", "bbc_flop_6502")
- MCFG_SOFTWARE_LIST_ADD("flop_ls_65c102", "bbc_flop_65c102")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_ls_6502").set_original("bbc_flop_6502");
+ SOFTWARE_LIST(config, "flop_ls_65c102").set_original("bbc_flop_65c102");
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/bbc/tube/tube_80286.cpp b/src/devices/bus/bbc/tube/tube_80286.cpp
index bf0bc1404ca..f38761341f5 100644
--- a/src/devices/bus/bbc/tube/tube_80286.cpp
+++ b/src/devices/bus/bbc/tube/tube_80286.cpp
@@ -47,7 +47,7 @@ void bbc_tube_80286_device::tube_80286_io(address_map &map)
// ROM( tube_80286 )
//-------------------------------------------------
-ROM_START( tube_80286 )
+ROM_START(tube_80286)
ROM_REGION(0x4000, "bootstrap", 0)
ROM_LOAD16_BYTE("m512_lo.ic31", 0x0000, 0x2000, CRC(c0df8707) SHA1(7f6d843d5aea6bdb36cbd4623ae942b16b96069d)) // 2201,287-02
ROM_LOAD16_BYTE("m512_hi.ic32", 0x0001, 0x2000, CRC(e47f10b2) SHA1(45dc8d7e7936afbec6de423569d9005a1c350316)) // 2201,288-02
@@ -57,22 +57,23 @@ ROM_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(bbc_tube_80286_device::device_add_mconfig)
- MCFG_DEVICE_ADD("i80286", I80286, XTAL(12'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(tube_80286_mem)
- MCFG_DEVICE_IO_MAP(tube_80286_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE(DEVICE_SELF, bbc_tube_80286_device, irq_callback)
+void bbc_tube_80286_device::device_add_mconfig(machine_config &config)
+{
+ I80286(config, m_i80286, 12_MHz_XTAL / 2);
+ m_i80286->set_addrmap(AS_PROGRAM, &bbc_tube_80286_device::tube_80286_mem);
+ m_i80286->set_addrmap(AS_IO, &bbc_tube_80286_device::tube_80286_io);
+ m_i80286->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(bbc_tube_80286_device::irq_callback), this));
- MCFG_TUBE_ADD("ula")
- MCFG_TUBE_PNMI_HANDLER(INPUTLINE("i80286", INPUT_LINE_NMI))
- MCFG_TUBE_PIRQ_HANDLER(INPUTLINE("i80286", INPUT_LINE_INT0))
+ TUBE(config, m_ula);
+ m_ula->pnmi_handler().set_inputline(m_i80286, INPUT_LINE_NMI);
+ m_ula->pirq_handler().set_inputline(m_i80286, INPUT_LINE_INT0);
/* internal ram */
- RAM(config, RAM_TAG).set_default_size("1M");
+ RAM(config, m_ram).set_default_size("1M");
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_ls_80186", "bbc_flop_80186")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_ls_80186").set_original("bbc_flop_80186");
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
@@ -117,6 +118,10 @@ void bbc_tube_80286_device::device_start()
void bbc_tube_80286_device::device_reset()
{
m_ula->reset();
+
+ address_space &program = m_i80286->space(AS_PROGRAM);
+
+ program.install_rom(0xc0000, 0xc3fff, 0x3c000, m_bootstrap->base());
}
diff --git a/src/devices/bus/bbc/tube/tube_arm.cpp b/src/devices/bus/bbc/tube/tube_arm.cpp
index 27879f79119..444e188a657 100644
--- a/src/devices/bus/bbc/tube/tube_arm.cpp
+++ b/src/devices/bus/bbc/tube/tube_arm.cpp
@@ -27,6 +27,7 @@ void bbc_tube_arm_device::tube_arm_mem(address_map &map)
{
map.unmap_value_high();
map(0x0000000, 0x03fffff).rw(FUNC(bbc_tube_arm_device::ram_r), FUNC(bbc_tube_arm_device::ram_w));
+ map(0x0400000, 0x0ffffff).noprw();
map(0x1000000, 0x100001f).rw("ula", FUNC(tube_device::parasite_r), FUNC(tube_device::parasite_w)).umask32(0x000000ff);
map(0x3000000, 0x3003fff).rom().region("bootstrap", 0).mirror(0xc000);
}
@@ -50,21 +51,22 @@ ROM_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(bbc_tube_arm_device::device_add_mconfig)
- MCFG_DEVICE_ADD("arm", ARM, XTAL(20'000'000) / 3)
- MCFG_DEVICE_PROGRAM_MAP(tube_arm_mem)
+void bbc_tube_arm_device::device_add_mconfig(machine_config &config)
+{
+ ARM(config, m_arm, 20_MHz_XTAL / 3);
+ m_arm->set_addrmap(AS_PROGRAM, &bbc_tube_arm_device::tube_arm_mem);
- MCFG_TUBE_ADD("ula")
- MCFG_TUBE_HIRQ_HANDLER(WRITELINE(DEVICE_SELF_OWNER, bbc_tube_slot_device, irq_w))
- MCFG_TUBE_PNMI_HANDLER(INPUTLINE("arm", ARM_FIRQ_LINE))
- MCFG_TUBE_PIRQ_HANDLER(INPUTLINE("arm", ARM_IRQ_LINE))
+ TUBE(config, m_ula);
+ m_ula->hirq_handler().set(DEVICE_SELF_OWNER, FUNC(bbc_tube_slot_device::irq_w));
+ m_ula->pnmi_handler().set_inputline(m_arm, ARM_FIRQ_LINE);
+ m_ula->pirq_handler().set_inputline(m_arm, ARM_IRQ_LINE);
/* internal ram */
- RAM(config, RAM_TAG).set_default_size("4M").set_default_value(0);
+ RAM(config, m_ram).set_default_size("4M").set_default_value(0);
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_ls_arm", "bbc_flop_arm")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_ls_arm").set_original("bbc_flop_arm");
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/bbc/tube/tube_z80.cpp b/src/devices/bus/bbc/tube/tube_z80.cpp
index b759fe05898..cc6f87527bf 100644
--- a/src/devices/bus/bbc/tube/tube_z80.cpp
+++ b/src/devices/bus/bbc/tube/tube_z80.cpp
@@ -61,24 +61,25 @@ ROM_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(bbc_tube_z80_device::device_add_mconfig)
- MCFG_DEVICE_ADD("z80", Z80, XTAL(12'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(tube_z80_mem)
- MCFG_DEVICE_OPCODES_MAP(tube_z80_fetch)
- MCFG_DEVICE_IO_MAP(tube_z80_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE(DEVICE_SELF, bbc_tube_z80_device, irq_callback)
-
- MCFG_TUBE_ADD("ula")
- MCFG_TUBE_HIRQ_HANDLER(WRITELINE(DEVICE_SELF_OWNER, bbc_tube_slot_device, irq_w))
- MCFG_TUBE_PNMI_HANDLER(WRITELINE(*this, bbc_tube_z80_device, nmi_w))
- MCFG_TUBE_PIRQ_HANDLER(INPUTLINE("z80", INPUT_LINE_IRQ0))
+void bbc_tube_z80_device::device_add_mconfig(machine_config &config)
+{
+ Z80(config, m_z80, 12_MHz_XTAL / 2);
+ m_z80->set_addrmap(AS_PROGRAM, &bbc_tube_z80_device::tube_z80_mem);
+ m_z80->set_addrmap(AS_OPCODES, &bbc_tube_z80_device::tube_z80_fetch);
+ m_z80->set_addrmap(AS_IO, &bbc_tube_z80_device::tube_z80_io);
+ m_z80->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(bbc_tube_z80_device::irq_callback), this));
+
+ TUBE(config, m_ula);
+ m_ula->hirq_handler().set(DEVICE_SELF_OWNER, FUNC(bbc_tube_slot_device::irq_w));
+ m_ula->pnmi_handler().set(FUNC(bbc_tube_z80_device::nmi_w));
+ m_ula->pirq_handler().set_inputline(m_z80, INPUT_LINE_IRQ0);
/* internal ram */
- RAM(config, RAM_TAG).set_default_size("64K").set_default_value(0);
+ RAM(config, m_ram).set_default_size("64K").set_default_value(0);
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_ls_z80", "bbc_flop_z80")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_ls_z80").set_original("bbc_flop_z80");
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/bbc/userport/userport.h b/src/devices/bus/bbc/userport/userport.h
index 22003968ee9..e2807146efe 100644
--- a/src/devices/bus/bbc/userport/userport.h
+++ b/src/devices/bus/bbc/userport/userport.h
@@ -33,20 +33,6 @@
//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_BBC_USERPORT_SLOT_ADD(_tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, BBC_USERPORT_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-#define MCFG_BBC_USERPORT_CB1_HANDLER(_devcb) \
- downcast<bbc_userport_slot_device &>(*device).set_cb1_handler(DEVCB_##_devcb);
-
-#define MCFG_BBC_USERPORT_CB2_HANDLER(_devcb) \
- downcast<bbc_userport_slot_device &>(*device).set_cb2_handler(DEVCB_##_devcb);
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -59,11 +45,21 @@ class bbc_userport_slot_device : public device_t, public device_slot_interface
{
public:
// construction/destruction
- bbc_userport_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ bbc_userport_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&slot_options, const char *default_option)
+ : bbc_userport_slot_device(mconfig, tag, owner)
+ {
+ option_reset();
+ slot_options(*this);
+ set_default_option(default_option);
+ set_fixed(false);
+ }
+
+ bbc_userport_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0);
// callbacks
- template <class Object> devcb_base &set_cb1_handler(Object &&cb) { return m_cb1_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_cb2_handler(Object &&cb) { return m_cb2_handler.set_callback(std::forward<Object>(cb)); }
+ auto cb1_handler() { return m_cb1_handler.bind(); }
+ auto cb2_handler() { return m_cb2_handler.bind(); }
DECLARE_WRITE_LINE_MEMBER(cb1_w) { m_cb1_handler(state); }
DECLARE_WRITE_LINE_MEMBER(cb2_w) { m_cb2_handler(state); }
diff --git a/src/devices/bus/generic/slot.h b/src/devices/bus/generic/slot.h
index 6c60a58be0a..d0f76b2ea78 100644
--- a/src/devices/bus/generic/slot.h
+++ b/src/devices/bus/generic/slot.h
@@ -189,7 +189,17 @@ protected:
class generic_socket_device : public generic_slot_device
{
public:
- generic_socket_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ generic_socket_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *intf, const char *exts)
+ : generic_socket_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ opts(*this);
+ set_fixed(false);
+ set_interface(intf);
+ set_extensions(exts);
+ }
+
+ generic_socket_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
virtual iodevice_t image_type() const override { return IO_ROM; }
};
diff --git a/src/devices/bus/isa/com.cpp b/src/devices/bus/isa/com.cpp
index 57393a52500..bd2b500d611 100644
--- a/src/devices/bus/isa/com.cpp
+++ b/src/devices/bus/isa/com.cpp
@@ -8,18 +8,24 @@
#include "emu.h"
#include "com.h"
+
+#include "bus/rs232/hlemouse.h"
+#include "bus/rs232/null_modem.h"
#include "bus/rs232/rs232.h"
-#include "bus/rs232/ser_mouse.h"
+#include "bus/rs232/sun_kbd.h"
#include "bus/rs232/terminal.h"
-#include "bus/rs232/null_modem.h"
#include "machine/ins8250.h"
static void isa_com(device_slot_interface &device)
{
- device.option_add("microsoft_mouse", MSFT_SERIAL_MOUSE);
- device.option_add("msystems_mouse", MSYSTEM_SERIAL_MOUSE);
+ device.option_add("microsoft_mouse", MSFT_HLE_SERIAL_MOUSE);
+ device.option_add("logitech_mouse", LOGITECH_HLE_SERIAL_MOUSE);
+ device.option_add("wheel_mouse", WHEEL_HLE_SERIAL_MOUSE);
+ device.option_add("msystems_mouse", MSYSTEMS_HLE_SERIAL_MOUSE);
+ device.option_add("rotatable_mouse", ROTATABLE_HLE_SERIAL_MOUSE);
device.option_add("terminal", SERIAL_TERMINAL);
device.option_add("null_modem", NULL_MODEM);
+ device.option_add("sun_kbd", SUN_KBD_ADAPTOR);
}
@@ -55,7 +61,7 @@ MACHINE_CONFIG_START(isa8_com_device::device_add_mconfig)
uart3.out_rts_callback().set("serport3", FUNC(rs232_port_device::write_rts));
uart3.out_int_callback().set(FUNC(isa8_com_device::pc_com_interrupt_2));*/
- MCFG_DEVICE_ADD( "serport0", RS232_PORT, isa_com, "microsoft_mouse" )
+ MCFG_DEVICE_ADD( "serport0", RS232_PORT, isa_com, "logitech_mouse" )
MCFG_RS232_RXD_HANDLER(WRITELINE(uart0, ins8250_uart_device, rx_w))
MCFG_RS232_DCD_HANDLER(WRITELINE(uart0, ins8250_uart_device, dcd_w))
MCFG_RS232_DSR_HANDLER(WRITELINE(uart0, ins8250_uart_device, dsr_w))
@@ -156,7 +162,7 @@ MACHINE_CONFIG_START(isa8_com_at_device::device_add_mconfig)
uart3.out_dtr_callback().set("serport3", FUNC(rs232_port_device::write_dtr));
uart3.out_rts_callback().set("serport3", FUNC(rs232_port_device::write_rts));
uart3.out_int_callback().set(FUNC(isa8_com_device::pc_com_interrupt_2));*/
- MCFG_DEVICE_ADD( "serport0", RS232_PORT, isa_com, "microsoft_mouse" )
+ MCFG_DEVICE_ADD( "serport0", RS232_PORT, isa_com, "logitech_mouse" )
MCFG_RS232_RXD_HANDLER(WRITELINE(uart0, ins8250_uart_device, rx_w))
MCFG_RS232_DCD_HANDLER(WRITELINE(uart0, ins8250_uart_device, dcd_w))
MCFG_RS232_DSR_HANDLER(WRITELINE(uart0, ins8250_uart_device, dsr_w))
diff --git a/src/devices/bus/isa/myb3k_com.cpp b/src/devices/bus/isa/myb3k_com.cpp
index fdc0a527c6f..df0ce634ea7 100644
--- a/src/devices/bus/isa/myb3k_com.cpp
+++ b/src/devices/bus/isa/myb3k_com.cpp
@@ -101,12 +101,9 @@ void isa8_myb3k_com_device::device_reset()
{
// IO base factory setting is 0x540
uint32_t base = m_iobase->read();
- m_isa->install_device(base, base,
- read8_delegate(FUNC(i8251_device::data_r), subdevice<i8251_device>("usart")),
- write8_delegate(FUNC(i8251_device::data_w), subdevice<i8251_device>("usart")) );
- m_isa->install_device(base + 1, base + 1,
- read8_delegate(FUNC(i8251_device::status_r), subdevice<i8251_device>("usart")),
- write8_delegate(FUNC(i8251_device::control_w), subdevice<i8251_device>("usart")) );
+ m_isa->install_device(base, base + 1,
+ read8sm_delegate(FUNC(i8251_device::read), m_usart.target()),
+ write8sm_delegate(FUNC(i8251_device::write), m_usart.target()) );
m_isa->install_device(base + 2, base + 2,
read8_delegate(FUNC(isa8_myb3k_com_device::dce_status), this),
diff --git a/src/devices/bus/isa/p1_sound.cpp b/src/devices/bus/isa/p1_sound.cpp
index 62b0bbca1d6..15fa04af149 100644
--- a/src/devices/bus/isa/p1_sound.cpp
+++ b/src/devices/bus/isa/p1_sound.cpp
@@ -165,11 +165,11 @@ void p1_sound_device::device_start()
write8_delegate(FUNC(p1_sound_device::dac_w), this));
m_isa->install_memory(0xee000, 0xee000,
- read8_delegate(FUNC(i8251_device::data_r), (i8251_device*)m_midi),
- write8_delegate(FUNC(i8251_device::data_w), (i8251_device*)m_midi));
+ read8smo_delegate(FUNC(i8251_device::data_r), m_midi.target()),
+ write8smo_delegate(FUNC(i8251_device::data_w), m_midi.target()));
m_isa->install_memory(0xee002, 0xee002,
- read8_delegate(FUNC(i8251_device::status_r), (i8251_device*)m_midi),
- write8_delegate(FUNC(i8251_device::control_w), (i8251_device*)m_midi));
+ read8smo_delegate(FUNC(i8251_device::status_r), m_midi.target()),
+ write8smo_delegate(FUNC(i8251_device::control_w), m_midi.target()));
// sync generator
m_isa->install_memory(0xef000, 0xef007,
diff --git a/src/devices/bus/rs232/hlemouse.cpp b/src/devices/bus/rs232/hlemouse.cpp
new file mode 100644
index 00000000000..713f6adefa5
--- /dev/null
+++ b/src/devices/bus/rs232/hlemouse.cpp
@@ -0,0 +1,691 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+/**************************************************************************
+
+ PC Serial Mouse Simulation
+
+ Microsoft mouse is the classic two-button PC mouse. Data is 7N1 at
+ 1,200 Baud. Mouse can be reset by de-asserting RTS. On start, the
+ mouse identifies itself with the string "M". Bit 6 is only set for
+ the first byte of a report - it's clear for all subsequent bytes of
+ a report, and also for all identification bytes.
+
+ Reports consist of three bytes: the first byte contains the button
+ state and the two high bits of the Y and X delta; the second byte
+ contains the low six bits of the X delta; the third byte contains
+ the low six bits of the Y delta. Button bits are set when pressed,
+ and positive delta is rightwards/downwards.
+
+ 1lryyxx 0xxxxxx 0yyyyyy
+
+ Logitech extended the Microsoft protocol to support a third button.
+ The mouse identifies itself with the string "M3". If the third
+ button changes state, and additional byte is sent indicating the
+ new state of the third button.
+
+ 1lryyxx 0xxxxxx 0yyyyyy 0m00000
+
+ The serial wheel mouse protocol extends the Microsoft mouse protocol
+ in a different way. The mouse identifies itself with the string
+ "MZ@\0\0\0". If the third button or wheel state changes, a fourth
+ an additional byte is sent containing the third button state and a
+ four-bit wheel delta value. The wheel value is positive for
+ downward movement. Note that the third button is value is in a
+ different position to the logitech protocol.
+
+ 1lryyxx 0xxxxxx 0yyyyyy 00mwwww
+
+ The Mouse Systems non-rotatable protocol provides two-axis movement
+ and three buttons. Data is 8N1 at 1,200 Baud (the M-1 mouse could
+ also be configured for 300 Baud by turning DIP switch 1 off). The
+ mouse does not send an identification string. The first byte of a
+ report can be identified by a fixed pattern in the five most
+ significant bits.
+
+ Reports are five bytes long. The first byte contains the the button
+ state; the second and fourth bytes contain X delta; the third and
+ fifth bytes contain Y delta. The two delta values for each axis
+ should be summed. Delta values range from -120 to 127 to prevent
+ being mistaken for the lead byte of a report. Button bits are clear
+ when set, and positive delta is rightwards/upwards. Delta values
+ are generated immediately before transmission - reports are not
+ atomic.
+
+ 10000lmr xxxxxxxx yyyyyyyy xxxxxxxx yyyyyyyy
+
+ The Mouse systems rotatable protcol allows the host to infer
+ rotation around the third axis at the cost of halving the maximum
+ sustained movement speed. The M-1 mouse has two sensors spaced 100
+ counts apart horizontally. If DIP switch 2 is on, the X and Y delta
+ for each sensor is reported separately. The right sensor delta is
+ reported before the left sensor delta. If the mouse is rotated, the
+ delta values for the two sensors will differ.
+
+**************************************************************************/
+
+#include "emu.h"
+#include "hlemouse.h"
+
+#include <cassert>
+#include <cmath>
+
+
+//**************************************************
+// Device type globals
+//**************************************************
+
+DEFINE_DEVICE_TYPE_NS(MSFT_HLE_SERIAL_MOUSE, bus::rs232, hle_msft_mouse_device, "rs232_mouse_hle_msft", "Microsoft 2-Button Serial Mouse (HLE)")
+DEFINE_DEVICE_TYPE_NS(LOGITECH_HLE_SERIAL_MOUSE, bus::rs232, hle_logitech_mouse_device, "rs232_mouse_hle_logitech", "Logitech 3-Button Serial Mouse (HLE)")
+DEFINE_DEVICE_TYPE_NS(WHEEL_HLE_SERIAL_MOUSE, bus::rs232, hle_wheel_mouse_device, "rs232_mouse_hle_wheel", "Microsoft Serial Mouse with Wheel (HLE)")
+DEFINE_DEVICE_TYPE_NS(MSYSTEMS_HLE_SERIAL_MOUSE, bus::rs232, hle_msystems_mouse_device, "rs232_mouse_hle_msystems", "Mouse Systems Non-rotatable Mouse (HLE)")
+DEFINE_DEVICE_TYPE_NS(ROTATABLE_HLE_SERIAL_MOUSE, bus::rs232, hle_rotatable_mouse_device, "rs232_mouse_hle_rotatable", "Mouse Systems Rotatable Mouse (HLE)")
+
+namespace bus { namespace rs232 {
+
+namespace {
+
+INPUT_PORTS_START(msft)
+ PORT_START("BTN")
+ PORT_BIT( 0xfffc, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CODE(MOUSECODE_BUTTON1) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_msmouse_device_base, input_changed, nullptr)
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CODE(MOUSECODE_BUTTON2) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_msmouse_device_base, input_changed, nullptr)
+
+ PORT_START("X")
+ PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0fff, 0x00, IPT_MOUSE_X ) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_msmouse_device_base, input_changed, nullptr)
+
+ PORT_START("Y")
+ PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0fff, 0x00, IPT_MOUSE_Y ) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_msmouse_device_base, input_changed, nullptr)
+INPUT_PORTS_END
+
+
+INPUT_PORTS_START(logitech)
+ PORT_INCLUDE(msft)
+
+ PORT_MODIFY("BTN")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CODE(MOUSECODE_BUTTON3) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_msmouse_device_base, input_changed, nullptr)
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CODE(MOUSECODE_BUTTON2) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_msmouse_device_base, input_changed, nullptr)
+INPUT_PORTS_END
+
+
+INPUT_PORTS_START(wheel)
+ PORT_INCLUDE(logitech)
+
+ PORT_START("WHEEL")
+ PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0fff, 0x00, IPT_DIAL_V ) PORT_SENSITIVITY(10) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_msmouse_device_base, input_changed, nullptr)
+INPUT_PORTS_END
+
+
+INPUT_PORTS_START(msystems)
+ PORT_START("BTN")
+ PORT_BIT( 0xfff8, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CODE(MOUSECODE_BUTTON1) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_msystems_device_base, input_changed, nullptr)
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CODE(MOUSECODE_BUTTON3) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_msystems_device_base, input_changed, nullptr)
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CODE(MOUSECODE_BUTTON2) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_msystems_device_base, input_changed, nullptr)
+
+ PORT_START("X")
+ PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0fff, 0x00, IPT_MOUSE_X ) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_msystems_device_base, input_changed, nullptr)
+
+ PORT_START("Y")
+ PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0fff, 0x00, IPT_MOUSE_Y ) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_msystems_device_base, input_changed, nullptr)
+INPUT_PORTS_END
+
+
+INPUT_PORTS_START(rotatable)
+ PORT_INCLUDE(msystems)
+
+ PORT_START("ROT")
+ PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0fff, 0x00, IPT_DIAL ) PORT_SENSITIVITY(10) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_msystems_device_base, input_changed, nullptr)
+INPUT_PORTS_END
+
+
+template <unsigned Bits, typename T>
+std::make_signed_t<T> read_axis(ioport_port &port, T &val)
+{
+ static_assert((1U < Bits) && ((sizeof(T) * 8) > Bits), "invalid field bits");
+
+ T const updated(T(std::make_unsigned_t<T>(port.read())) & make_bitmask<T>(Bits));
+ std::make_signed_t<T> delta(std::make_signed_t<T>(updated) - std::make_signed_t<T>(val));
+ if (std::make_signed_t<T>(std::make_unsigned_t<T>(1) << (Bits - 1)) <= delta)
+ delta -= std::make_signed_t<T>(std::make_unsigned_t<T>(1) << Bits);
+ else if (-std::make_signed_t<T>(std::make_unsigned_t<T>(1) << (Bits - 1)) >= delta)
+ delta += std::make_signed_t<T>(std::make_unsigned_t<T>(1) << Bits);
+ val = updated;
+ return delta;
+}
+
+
+template <typename T>
+uint8_t report_axis(T &delta, T low, T high)
+{
+ T const result(std::min<T>(std::max<T>(delta, low), high));
+ delta -= result;
+ return uint8_t(int8_t(result));
+}
+
+} // anonymous namespace
+
+
+//**************************************************
+// Microsoft mouse base
+//**************************************************
+
+INPUT_CHANGED_MEMBER(hle_msmouse_device_base::input_changed)
+{
+ if (fifo_empty() && is_transmit_register_empty())
+ check_inputs();
+}
+
+hle_msmouse_device_base::hle_msmouse_device_base(
+ machine_config const &mconfig,
+ device_type type,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock)
+ : buffered_rs232_device<8>(mconfig, type, tag, owner, clock)
+ , m_buttons(*this, "BTN")
+ , m_x_axis(*this, "X")
+ , m_y_axis(*this, "Y")
+ , m_x_delta(0)
+ , m_y_delta(0)
+ , m_x_val(0U)
+ , m_y_val(0U)
+ , m_btn_val(0x00U)
+ , m_btn_sent(0x00U)
+ , m_dtr(0U)
+ , m_rts(0U)
+ , m_enable(0U)
+{
+}
+
+void hle_msmouse_device_base::device_resolve_objects()
+{
+ buffered_rs232_device<8>::device_resolve_objects();
+
+ m_dtr = 0U;
+ m_rts = 0U;
+}
+
+void hle_msmouse_device_base::device_start()
+{
+ buffered_rs232_device<8>::device_start();
+
+ save_item(NAME(m_x_delta));
+ save_item(NAME(m_y_delta));
+ save_item(NAME(m_x_val));
+ save_item(NAME(m_y_val));
+ save_item(NAME(m_btn_val));
+ save_item(NAME(m_btn_sent));
+ save_item(NAME(m_dtr));
+ save_item(NAME(m_rts));
+ save_item(NAME(m_enable));
+
+ set_data_frame(1, 7, PARITY_NONE, STOP_BITS_2);
+ set_rate(1'200);
+ receive_register_reset();
+ transmit_register_reset();
+
+ m_x_delta = m_y_delta = 0;
+ m_x_val = m_y_val = 0U;
+ m_btn_val = m_btn_sent = 0x00U;
+ m_enable = 0U;
+
+ machine().scheduler().synchronize(timer_expired_delegate(FUNC(hle_msmouse_device_base::start_mouse), this));
+}
+
+WRITE_LINE_MEMBER(hle_msmouse_device_base::input_dtr)
+{
+ m_dtr = state ? 1U : 0U;
+ check_enable();
+}
+
+WRITE_LINE_MEMBER(hle_msmouse_device_base::input_rts)
+{
+ m_dtr = state ? 1U : 0U;
+ check_enable();
+}
+
+void hle_msmouse_device_base::tra_complete()
+{
+ buffered_rs232_device<8>::tra_complete();
+ if (fifo_empty() && is_transmit_register_empty())
+ check_inputs();
+}
+
+void hle_msmouse_device_base::received_byte(u8 byte)
+{
+}
+
+
+TIMER_CALLBACK_MEMBER(hle_msmouse_device_base::start_mouse)
+{
+ check_enable();
+}
+
+void hle_msmouse_device_base::check_enable()
+{
+ bool const enable(!m_dtr && !m_rts);
+ if (bool(m_enable) != enable)
+ {
+ m_enable = enable ? 1U : 0U;
+ clear_fifo();
+ receive_register_reset();
+ transmit_register_reset();
+ if (enable)
+ {
+ read_inputs();
+ m_x_delta = m_y_delta = 0;
+ m_btn_sent = m_btn_val;
+ reset_and_identify();
+ }
+ }
+}
+
+void hle_msmouse_device_base::check_inputs()
+{
+ if (m_enable && read_inputs())
+ {
+ uint8_t const x(report_axis<int16_t>(m_x_delta, -128, 127));
+ uint8_t const y(report_axis<int16_t>(m_y_delta, -128, 127));
+ transmit_byte(0x40U | ((m_btn_val << 4) & 0x30U) | ((y >> 4) & 0x0cU) | ((x >> 6) & 0x03U));
+ transmit_byte(x & 0x3fU);
+ transmit_byte(y & 0x3fU);
+ transmit_extensions(m_btn_val, m_btn_sent);
+ m_btn_sent = m_btn_val;
+ }
+}
+
+bool hle_msmouse_device_base::read_inputs()
+{
+ m_x_delta += read_axis<12>(*m_x_axis, m_x_val);
+ m_y_delta += read_axis<12>(*m_y_axis, m_y_val);
+ m_btn_val = m_buttons->read();
+ return m_x_delta || m_y_delta || (m_btn_val != m_btn_sent);
+}
+
+
+//**************************************************
+// Microsoft 2-button mouse
+//**************************************************
+
+hle_msft_mouse_device::hle_msft_mouse_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock)
+ : hle_msmouse_device_base(mconfig, MSFT_HLE_SERIAL_MOUSE, tag, owner, clock)
+{
+}
+
+ioport_constructor hle_msft_mouse_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(msft);
+}
+
+void hle_msft_mouse_device::reset_and_identify()
+{
+ // assume ASCII host system
+ transmit_byte('M');
+}
+
+void hle_msft_mouse_device::transmit_extensions(uint8_t btn_val, uint8_t btn_sent)
+{
+}
+
+
+//**************************************************
+// Logitech 3-button mouse
+//**************************************************
+
+hle_logitech_mouse_device::hle_logitech_mouse_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
+ : hle_msmouse_device_base(mconfig, LOGITECH_HLE_SERIAL_MOUSE, tag, owner, clock)
+{
+}
+
+ioport_constructor hle_logitech_mouse_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(logitech);
+}
+
+void hle_logitech_mouse_device::reset_and_identify()
+{
+ // assume ASCII host system
+ transmit_byte('M');
+ transmit_byte('3');
+}
+
+void hle_logitech_mouse_device::transmit_extensions(uint8_t btn_val, uint8_t btn_sent)
+{
+ if (BIT(btn_val | btn_sent, 2))
+ transmit_byte(BIT(btn_val, 2) << 5);
+}
+
+
+
+//**************************************************
+// Microsoft wheel mouse
+//**************************************************
+
+hle_wheel_mouse_device::hle_wheel_mouse_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock)
+ : hle_msmouse_device_base(mconfig, WHEEL_HLE_SERIAL_MOUSE, tag, owner, clock)
+ , m_wheel(*this, "WHEEL")
+ , m_wheel_delta(0)
+ , m_wheel_val(0U)
+{
+}
+
+ioport_constructor hle_wheel_mouse_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(wheel);
+}
+
+void hle_wheel_mouse_device::device_start()
+{
+ hle_msmouse_device_base::device_start();
+
+ save_item(NAME(m_wheel_delta));
+ save_item(NAME(m_wheel_val));
+
+ m_wheel_delta = 0;
+ m_wheel_val = 0U;
+}
+
+bool hle_wheel_mouse_device::read_inputs()
+{
+ m_wheel_delta += read_axis<12>(*m_wheel, m_wheel_val);
+ return hle_msmouse_device_base::read_inputs() || m_wheel_delta;
+}
+
+void hle_wheel_mouse_device::reset_and_identify()
+{
+ m_wheel_delta = 0;
+
+ // assume ASCII host system
+ transmit_byte('M');
+ transmit_byte('Z');
+ transmit_byte('@');
+ transmit_byte('\0');
+ transmit_byte('\0');
+ transmit_byte('\0');
+}
+
+void hle_wheel_mouse_device::transmit_extensions(uint8_t btn_val, uint8_t btn_sent)
+{
+ if (BIT(btn_val | btn_sent, 2) || m_wheel_delta)
+ transmit_byte((BIT(btn_val, 2) << 4) | (report_axis<int16_t>(m_wheel_delta, -8, 7) & 0x0fU));
+}
+
+
+//**************************************************
+// Mouse Systems mouse base
+//**************************************************
+
+INPUT_CHANGED_MEMBER(hle_msystems_device_base::input_changed)
+{
+ if (is_transmit_register_empty())
+ {
+ assert(0U == m_phase);
+ tra_complete();
+ }
+}
+
+hle_msystems_device_base::hle_msystems_device_base(
+ machine_config const &mconfig,
+ device_type type,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_rs232_port_interface(mconfig, *this)
+ , device_serial_interface(mconfig, *this)
+ , m_phase(0U)
+{
+}
+
+void hle_msystems_device_base::device_start()
+{
+ save_item(NAME(m_phase));
+
+ set_data_frame(1, 8, PARITY_NONE, STOP_BITS_1);
+ set_rate(1'200);
+ receive_register_reset();
+ transmit_register_reset();
+
+ m_phase = 0U;
+
+ machine().scheduler().synchronize(timer_expired_delegate(FUNC(hle_msystems_device_base::start_mouse), this));
+}
+
+void hle_msystems_device_base::tra_callback()
+{
+ output_rxd(transmit_register_get_data_bit());
+}
+
+void hle_msystems_device_base::tra_complete()
+{
+ if (4U <= m_phase)
+ m_phase = 0U;
+ else
+ ++m_phase;
+
+ bool const dirty(read_inputs());
+ switch (m_phase)
+ {
+ case 0U:
+ if (dirty)
+ transmit_register_setup((report_buttons() & 0x07U) | 0x80U);
+ break;
+ case 1U:
+ transmit_register_setup(report_x1_delta());
+ break;
+ case 2U:
+ transmit_register_setup(report_y1_delta());
+ break;
+ case 3U:
+ transmit_register_setup(report_x2_delta());
+ break;
+ case 4U:
+ transmit_register_setup(report_y2_delta());
+ break;
+ };
+}
+
+TIMER_CALLBACK_MEMBER(hle_msystems_device_base::start_mouse)
+{
+ if (is_transmit_register_empty())
+ {
+ assert(0U == m_phase);
+ tra_complete();
+ }
+}
+
+
+//**************************************************
+// Mouse Systems non-rotatable mouse
+//**************************************************
+
+hle_msystems_mouse_device::hle_msystems_mouse_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock)
+ : hle_msystems_device_base(mconfig, MSYSTEMS_HLE_SERIAL_MOUSE, tag, owner, clock)
+ , m_buttons(*this, "BTN")
+ , m_x_axis(*this, "X")
+ , m_y_axis(*this, "Y")
+ , m_x_delta(0)
+ , m_y_delta(0)
+ , m_x_val(0U)
+ , m_y_val(0U)
+ , m_btn_val(0x00U)
+ , m_btn_sent(0x00U)
+{
+}
+
+ioport_constructor hle_msystems_mouse_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(msystems);
+}
+
+void hle_msystems_mouse_device::device_start()
+{
+ hle_msystems_device_base::device_start();
+
+ save_item(NAME(m_x_delta));
+ save_item(NAME(m_y_delta));
+ save_item(NAME(m_x_val));
+ save_item(NAME(m_y_val));
+ save_item(NAME(m_btn_val));
+ save_item(NAME(m_btn_sent));
+
+ m_x_delta = m_y_delta = 0;
+ m_x_val = m_y_val = 0U;
+ m_btn_val = m_btn_sent = 0x00U;
+}
+
+bool hle_msystems_mouse_device::read_inputs()
+{
+ m_x_delta += read_axis<12>(*m_x_axis, m_x_val);
+ m_y_delta -= read_axis<12>(*m_y_axis, m_y_val);
+ m_btn_val = m_buttons->read();
+ return m_x_delta || m_y_delta || (m_btn_val != m_btn_sent);
+}
+
+uint8_t hle_msystems_mouse_device::report_buttons()
+{
+ m_btn_sent = m_btn_val;
+ return m_btn_sent;
+}
+
+uint8_t hle_msystems_mouse_device::report_x1_delta()
+{
+ return report_axis<int16_t>(m_x_delta, -120, 127);
+}
+
+uint8_t hle_msystems_mouse_device::report_y1_delta()
+{
+ return report_axis<int16_t>(m_y_delta, -120, 127);
+}
+
+uint8_t hle_msystems_mouse_device::report_x2_delta()
+{
+ return report_axis<int16_t>(m_x_delta, -120, 127);
+}
+
+uint8_t hle_msystems_mouse_device::report_y2_delta()
+{
+ return report_axis<int16_t>(m_y_delta, -120, 127);
+}
+
+
+//**************************************************
+// Mouse Systems rotatable mouse
+//**************************************************
+
+hle_rotatable_mouse_device::hle_rotatable_mouse_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock)
+ : hle_msystems_device_base(mconfig, ROTATABLE_HLE_SERIAL_MOUSE, tag, owner, clock)
+ , m_buttons(*this, "BTN")
+ , m_x_axis(*this, "X")
+ , m_y_axis(*this, "Y")
+ , m_rotation(*this, "ROT")
+ , m_x_delta{ 0, 0 }
+ , m_y_delta{ 0, 0 }
+ , m_x_val(0U)
+ , m_y_val(0U)
+ , m_rot_val(0U)
+ , m_btn_val(0x00U)
+ , m_btn_sent(0x00U)
+{
+}
+
+ioport_constructor hle_rotatable_mouse_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(rotatable);
+}
+
+void hle_rotatable_mouse_device::device_start()
+{
+ hle_msystems_device_base::device_start();
+
+ save_item(NAME(m_x_delta));
+ save_item(NAME(m_y_delta));
+ save_item(NAME(m_x_val));
+ save_item(NAME(m_y_val));
+ save_item(NAME(m_rot_val));
+ save_item(NAME(m_btn_val));
+ save_item(NAME(m_btn_sent));
+
+ m_x_delta[0] = m_x_delta[1] = m_y_delta[0] = m_y_delta[1] = 0;
+ m_x_val = m_y_val = m_rot_val = 0U;
+ m_btn_val = m_btn_sent = 0x00U;
+}
+
+bool hle_rotatable_mouse_device::read_inputs()
+{
+ // translation is straighforward
+ int16_t const x_delta(read_axis<12>(*m_x_axis, m_x_val));
+ int16_t const y_delta(read_axis<12>(*m_y_axis, m_y_val));
+ m_x_delta[0] += x_delta;
+ m_x_delta[1] += x_delta;
+ m_y_delta[0] -= y_delta;
+ m_y_delta[1] -= y_delta;
+
+ // there are two sensors 100 counts apart, one inch below the centre of the mouse
+ // for simplicity, assume the mouse is rotated around the point midway the sensors
+ int16_t const rot_delta(read_axis<12>(*m_rotation, m_rot_val));
+ if (rot_delta)
+ {
+ double const rot_angle(-0.15 * rot_delta);
+ long const x_diff(std::lround((1 - std::cos(rot_angle)) * 100));
+ long const y_diff(std::lround(std::sin(rot_angle) * 100));
+ m_x_delta[0] -= x_diff / 2;
+ m_x_delta[1] += x_diff - (x_diff / 2);
+ m_y_delta[0] += y_diff / 2;
+ m_y_delta[1] -= y_diff - (y_diff / 2);
+ }
+
+ // this is straightforward, too
+ m_btn_val = m_buttons->read();
+ return m_x_delta[0] || m_x_delta[1] || m_y_delta[0] || m_y_delta[1] || (m_btn_val != m_btn_sent);
+}
+
+uint8_t hle_rotatable_mouse_device::report_buttons()
+{
+ m_btn_sent = m_btn_val;
+ return m_btn_sent;
+}
+
+uint8_t hle_rotatable_mouse_device::report_x1_delta()
+{
+ return report_axis<int16_t>(m_x_delta[0], -120, 127);
+}
+
+uint8_t hle_rotatable_mouse_device::report_y1_delta()
+{
+ return report_axis<int16_t>(m_y_delta[0], -120, 127);
+}
+
+uint8_t hle_rotatable_mouse_device::report_x2_delta()
+{
+ return report_axis<int16_t>(m_x_delta[1], -120, 127);
+}
+
+uint8_t hle_rotatable_mouse_device::report_y2_delta()
+{
+ return report_axis<int16_t>(m_y_delta[1], -120, 127);
+}
+
+} } // namespace bus::rs232
diff --git a/src/devices/bus/rs232/hlemouse.h b/src/devices/bus/rs232/hlemouse.h
new file mode 100644
index 00000000000..be3142ad118
--- /dev/null
+++ b/src/devices/bus/rs232/hlemouse.h
@@ -0,0 +1,221 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+/**************************************************************************
+
+ PC Serial Mouse Simulation
+
+**************************************************************************/
+#ifndef MAME_BUS_RS232_HLEMOUSE_H
+#define MAME_BUS_RS232_HLEMOUSE_H
+
+#pragma once
+
+#include "rs232.h"
+#include "diserial.h"
+
+#include <type_traits>
+
+
+namespace bus { namespace rs232 {
+
+//**************************************************
+// Microsoft mouse base
+//**************************************************
+
+class hle_msmouse_device_base : public buffered_rs232_device<8>
+{
+public:
+ DECLARE_INPUT_CHANGED_MEMBER(input_changed);
+
+protected:
+ hle_msmouse_device_base(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, uint32_t clock);
+
+ virtual void device_resolve_objects() override;
+ virtual void device_start() override;
+
+ virtual DECLARE_WRITE_LINE_MEMBER(input_dtr) override;
+ virtual DECLARE_WRITE_LINE_MEMBER(input_rts) override;
+
+ virtual void tra_complete() override;
+
+ virtual void received_byte(u8 byte) override;
+
+ virtual bool read_inputs();
+
+private:
+ TIMER_CALLBACK_MEMBER(start_mouse);
+ void check_enable();
+ void check_inputs();
+
+ virtual void reset_and_identify() = 0;
+ virtual void transmit_extensions(uint8_t btn_val, uint8_t btn_sent) = 0;
+
+ required_ioport m_buttons, m_x_axis, m_y_axis;
+ int16_t m_x_delta, m_y_delta;
+ uint16_t m_x_val, m_y_val;
+ uint8_t m_btn_val, m_btn_sent;
+ uint8_t m_dtr, m_rts, m_enable;
+};
+
+
+//**************************************************
+// Microsoft 2-button mouse
+//**************************************************
+
+class hle_msft_mouse_device : public hle_msmouse_device_base
+{
+public:
+ hle_msft_mouse_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock);
+
+protected:
+ virtual ioport_constructor device_input_ports() const override;
+
+private:
+ virtual void reset_and_identify() override;
+ virtual void transmit_extensions(uint8_t btn_val, uint8_t btn_sent) override;
+};
+
+
+//**************************************************
+// Logitech 3-button mouse
+//**************************************************
+
+class hle_logitech_mouse_device : public hle_msmouse_device_base
+{
+public:
+ hle_logitech_mouse_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock);
+
+protected:
+ virtual ioport_constructor device_input_ports() const override;
+
+private:
+ virtual void reset_and_identify() override;
+ virtual void transmit_extensions(uint8_t btn_val, uint8_t btn_sent) override;
+};
+
+
+//**************************************************
+// Microsoft wheel mouse
+//**************************************************
+
+class hle_wheel_mouse_device : public hle_msmouse_device_base
+{
+public:
+ hle_wheel_mouse_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock);
+
+protected:
+ virtual ioport_constructor device_input_ports() const override;
+ virtual void device_start() override;
+
+ virtual bool read_inputs() override;
+
+private:
+ virtual void reset_and_identify() override;
+ virtual void transmit_extensions(uint8_t btn_val, uint8_t btn_sent) override;
+
+ required_ioport m_wheel;
+ int16_t m_wheel_delta;
+ uint16_t m_wheel_val;
+};
+
+
+//**************************************************
+// Mouse Systems mouse base
+//**************************************************
+
+class hle_msystems_device_base : public device_t, public device_rs232_port_interface, public device_serial_interface
+{
+public:
+ DECLARE_INPUT_CHANGED_MEMBER(input_changed);
+
+protected:
+ hle_msystems_device_base(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, uint32_t clock);
+
+ virtual void device_start() override;
+
+ virtual void tra_callback() override;
+ virtual void tra_complete() override;
+
+private:
+ TIMER_CALLBACK_MEMBER(start_mouse);
+
+ virtual bool read_inputs() = 0;
+ virtual uint8_t report_buttons() = 0;
+ virtual uint8_t report_x1_delta() = 0;
+ virtual uint8_t report_y1_delta() = 0;
+ virtual uint8_t report_x2_delta() = 0;
+ virtual uint8_t report_y2_delta() = 0;
+
+ uint8_t m_phase;
+};
+
+
+//**************************************************
+// Mouse Systems non-rotatable mouse
+//**************************************************
+
+class hle_msystems_mouse_device : public hle_msystems_device_base
+{
+public:
+ hle_msystems_mouse_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock);
+
+protected:
+ virtual ioport_constructor device_input_ports() const override;
+ virtual void device_start() override;
+
+private:
+ virtual bool read_inputs() override;
+ virtual uint8_t report_buttons() override;
+ virtual uint8_t report_x1_delta() override;
+ virtual uint8_t report_y1_delta() override;
+ virtual uint8_t report_x2_delta() override;
+ virtual uint8_t report_y2_delta() override;
+
+ required_ioport m_buttons, m_x_axis, m_y_axis;
+ int16_t m_x_delta, m_y_delta;
+ uint16_t m_x_val, m_y_val;
+ uint8_t m_btn_val, m_btn_sent;
+};
+
+
+//**************************************************
+// Mouse Systems rotatable mouse
+//**************************************************
+
+class hle_rotatable_mouse_device : public hle_msystems_device_base
+{
+public:
+ hle_rotatable_mouse_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock);
+
+protected:
+ virtual ioport_constructor device_input_ports() const override;
+ virtual void device_start() override;
+
+private:
+ virtual bool read_inputs() override;
+ virtual uint8_t report_buttons() override;
+ virtual uint8_t report_x1_delta() override;
+ virtual uint8_t report_y1_delta() override;
+ virtual uint8_t report_x2_delta() override;
+ virtual uint8_t report_y2_delta() override;
+
+ required_ioport m_buttons, m_x_axis, m_y_axis, m_rotation;
+ int16_t m_x_delta[2], m_y_delta[2];
+ uint16_t m_x_val, m_y_val, m_rot_val;
+ uint8_t m_btn_val, m_btn_sent;
+};
+
+} } // namespace bus::rs232
+
+
+//**************************************************
+// Device type globals
+//**************************************************
+
+DECLARE_DEVICE_TYPE_NS(MSFT_HLE_SERIAL_MOUSE, bus::rs232, hle_msft_mouse_device)
+DECLARE_DEVICE_TYPE_NS(LOGITECH_HLE_SERIAL_MOUSE, bus::rs232, hle_logitech_mouse_device)
+DECLARE_DEVICE_TYPE_NS(WHEEL_HLE_SERIAL_MOUSE, bus::rs232, hle_wheel_mouse_device)
+DECLARE_DEVICE_TYPE_NS(MSYSTEMS_HLE_SERIAL_MOUSE, bus::rs232, hle_msystems_mouse_device)
+DECLARE_DEVICE_TYPE_NS(ROTATABLE_HLE_SERIAL_MOUSE, bus::rs232, hle_rotatable_mouse_device)
+
+#endif // MAME_BUS_RS232_SER_MOUSE_H
diff --git a/src/devices/bus/rs232/ser_mouse.cpp b/src/devices/bus/rs232/ser_mouse.cpp
deleted file mode 100644
index 2c80fc43ef5..00000000000
--- a/src/devices/bus/rs232/ser_mouse.cpp
+++ /dev/null
@@ -1,267 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:smf
-/***************************************************************************
-
- machine/ser_mouse.c
-
- Code for emulating PC-style serial mouses
-
-***************************************************************************/
-
-#include "emu.h"
-#include "ser_mouse.h"
-
-
-serial_mouse_device::serial_mouse_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, type, tag, owner, clock),
- device_rs232_port_interface(mconfig, *this),
- device_serial_interface(mconfig, *this),
- m_dtr(1),
- m_rts(1),
- m_head(0),
- m_tail(0),
- m_mb(0),
- m_timer(nullptr),
- m_enabled(false),
- m_x(*this, "ser_mouse_x"),
- m_y(*this, "ser_mouse_y"),
- m_btn(*this, "ser_mouse_btn")
-{
-}
-
-DEFINE_DEVICE_TYPE(MSFT_SERIAL_MOUSE, microsoft_mouse_device, "microsoft_mouse", "Microsoft Serial Mouse")
-
-microsoft_mouse_device::microsoft_mouse_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : serial_mouse_device(mconfig, MSFT_SERIAL_MOUSE, tag, owner, clock)
-{
-}
-
-DEFINE_DEVICE_TYPE(MSYSTEM_SERIAL_MOUSE, mouse_systems_mouse_device, "mouse_systems_mouse", "Mouse Systems Serial Mouse")
-
-mouse_systems_mouse_device::mouse_systems_mouse_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : serial_mouse_device(mconfig, MSYSTEM_SERIAL_MOUSE, tag, owner, clock)
-{
-}
-
-void serial_mouse_device::device_start()
-{
- m_timer = timer_alloc();
- m_enabled = false;
- set_frame();
- set_tra_rate(1200);
- reset_mouse();
-
- save_item(NAME(m_dtr));
- save_item(NAME(m_rts));
- save_item(NAME(m_queue));
- save_item(NAME(m_head));
- save_item(NAME(m_tail));
- save_item(NAME(m_mb));
- save_item(NAME(m_enabled));
-}
-
-void serial_mouse_device::reset_mouse()
-{
- m_head = m_tail = 0;
- output_rxd(1);
- output_dcd(0);
- output_dsr(0);
- output_ri(0);
- output_cts(0);
-}
-
-void serial_mouse_device::tra_complete()
-{
- if(m_tail != m_head)
- transmit_register_setup(unqueue_data());
-}
-
-void serial_mouse_device::tra_callback()
-{
- output_rxd(transmit_register_get_data_bit());
-}
-
-/**************************************************************************
- * Check for mouse moves and buttons. Build delta x/y packets
- **************************************************************************/
-void serial_mouse_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
-{
- if (!id)
- {
- static int ox = 0, oy = 0;
- int nx,ny;
- int dx, dy, nb;
- int mbc;
-
- /* Do not get deltas or send packets if queue is not empty (Prevents drifting) */
- if (m_head==m_tail)
- {
- nx = m_x->read();
-
- dx = nx - ox;
- if (dx<=-0x800) dx = nx + 0x1000 - ox; /* Prevent jumping */
- if (dx>=0x800) dx = nx - 0x1000 - ox;
- ox = nx;
-
- ny = m_y->read();
-
- dy = ny - oy;
- if (dy<=-0x800) dy = ny + 0x1000 - oy;
- if (dy>=0x800) dy = ny - 0x1000 - oy;
- oy = ny;
-
- nb = m_btn->read();
- mbc = nb^m_mb;
- m_mb = nb;
-
- /* check if there is any delta or mouse buttons changed */
- if ( (dx!=0) || (dy!=0) || (mbc!=0) )
- mouse_trans(dx, dy, nb, mbc);
- }
-
- if(m_tail != m_head && is_transmit_register_empty())
- transmit_register_setup(unqueue_data());
- }
-}
-
-void microsoft_mouse_device::mouse_trans(int dx, int dy, int nb, int mbc)
-{
- /* split deltas into packets of -128..+127 max */
- do
- {
- uint8_t m0, m1, m2;
- int ddx = (dx < -128) ? -128 : (dx > 127) ? 127 : dx;
- int ddy = (dy < -128) ? -128 : (dy > 127) ? 127 : dy;
- m0 = 0x40 | ((nb << 4) & 0x30) | ((ddx >> 6) & 0x03) | ((ddy >> 4) & 0x0c);
- m1 = ddx & 0x3f;
- m2 = ddy & 0x3f;
-
- /* KT - changed to use a function */
- queue_data(m0 | 0x40);
- queue_data(m1 & 0x03f);
- queue_data(m2 & 0x03f);
- if ((mbc & 0x04) != 0) /* If button 3 changed send extra byte */
- queue_data( (nb & 0x04) << 3);
-
- dx -= ddx;
- dy -= ddy;
- } while( dx || dy );
-}
-
-/* mouse systems mouse
- from "PC Mouse information" by Tomi Engdahl */
-
-/*
- The data is sent in 5 byte packets in following format:
- D7 D6 D5 D4 D3 D2 D1 D0
-
- 1. 1 0 0 0 0 LB CB RB
- 2. X7 X6 X5 X4 X3 X2 X1 X0
- 3. Y7 Y6 Y5 Y4 Y3 Y4 Y1 Y0
- 4. X7' X6' X5' X4' X3' X2' X1' X0'
- 5. Y7' Y6' Y5' Y4' Y3' Y4' Y1' Y0'
-
- LB is left button state (0=pressed, 1=released)
- CB is center button state (0=pressed, 1=released)
- RB is right button state (0=pressed, 1=released)
- X7-X0 movement in X direction since last packet in signed byte
- format (-128..+127), positive direction right
- Y7-Y0 movement in Y direction since last packet in signed byte
- format (-128..+127), positive direction up
- X7'-X0' movement in X direction since sending of X7-X0 packet in signed byte
- format (-128..+127), positive direction right
- Y7'-Y0' movement in Y direction since sending of Y7-Y0 in signed byte
- format (-128..+127), positive direction up
-
- The last two bytes in the packet (bytes 4 and 5) contains information
- about movement data changes which have occurred after data bytes 2 and 3 have been sent. */
-
-void mouse_systems_mouse_device::mouse_trans(int dx, int dy, int nb, int mbc)
-{
- dy =-dy;
-
- do
- {
- int ddx = (dx < -128) ? -128 : (dx > 127) ? 127 : dx;
- int ddy = (dy < -128) ? -128 : (dy > 127) ? 127 : dy;
-
- /* KT - changed to use a function */
- queue_data(0x080 | ((((nb & 0x04) >> 1) + ((nb & 0x02) << 1) + (nb & 0x01)) ^ 0x07));
- queue_data(ddx);
- queue_data(ddy);
- /* for now... */
- queue_data(0);
- queue_data(0);
- dx -= ddx;
- dy -= ddy;
- } while( dx || dy );
-}
-
-/**************************************************************************
- * Check for mouse control line changes and (de-)install timer
- **************************************************************************/
-
-void serial_mouse_device::set_mouse_enable(bool state)
-{
- if(state && !m_enabled)
- {
- m_timer->adjust(attotime::zero, 0, attotime::from_hz(240));
- }
- else if(!state && m_enabled)
- {
- m_timer->adjust(attotime::never);
- m_head = m_tail = 0;
- }
- m_enabled = state;
-
-}
-
-
-WRITE_LINE_MEMBER(serial_mouse_device::input_dtr)
-{
- m_dtr = state;
- check_state();
-}
-
-WRITE_LINE_MEMBER(serial_mouse_device::input_rts)
-{
- m_rts = state;
- check_state();
-}
-
-WRITE_LINE_MEMBER(microsoft_mouse_device::input_rts)
-{
- if (!m_dtr && m_rts && !state)
- {
- reset_mouse();
- /* Identify as Microsoft 3 Button Mouse */
- queue_data('M');
- queue_data('3');
- }
-
- serial_mouse_device::input_rts(state);
-}
-
-
-
-/**************************************************************************
- * Mouse INPUT_PORT declarations
- **************************************************************************/
-
-static INPUT_PORTS_START( ser_mouse )
- PORT_START( "ser_mouse_btn" )
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_NAME("Mouse Left Button") PORT_CODE(MOUSECODE_BUTTON1)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_NAME("Mouse Middle Button") PORT_CODE(MOUSECODE_BUTTON3)
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3) PORT_NAME("Mouse Right Button") PORT_CODE(MOUSECODE_BUTTON2)
-
- PORT_START( "ser_mouse_x" ) /* Mouse - X AXIS */
- PORT_BIT( 0xfff, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) PORT_PLAYER(1)
-
- PORT_START( "ser_mouse_y" ) /* Mouse - Y AXIS */
- PORT_BIT( 0xfff, 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) PORT_PLAYER(1)
-INPUT_PORTS_END
-
-ioport_constructor serial_mouse_device::device_input_ports() const
-{
- return INPUT_PORTS_NAME(ser_mouse);
-}
diff --git a/src/devices/bus/rs232/ser_mouse.h b/src/devices/bus/rs232/ser_mouse.h
deleted file mode 100644
index ff4e7a81995..00000000000
--- a/src/devices/bus/rs232/ser_mouse.h
+++ /dev/null
@@ -1,84 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:smf
-/*****************************************************************************
- *
- * machine/ser_mouse.h
- *
- ****************************************************************************/
-
-#ifndef MAME_BUS_RS232_SER_MOUSE_H
-#define MAME_BUS_RS232_SER_MOUSE_H
-
-#include "rs232.h"
-#include "diserial.h"
-
-class serial_mouse_device :
- public device_t,
- public device_rs232_port_interface,
- public device_serial_interface
-{
-public:
- virtual ioport_constructor device_input_ports() const override;
-
-protected:
- serial_mouse_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
-
- virtual void device_start() override;
- virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
-
- virtual void mouse_trans(int dx, int dy, int nb, int mbc) = 0;
- virtual void set_frame() = 0;
- void set_mouse_enable(bool state);
- void queue_data(uint8_t data) {m_queue[m_head] = data; ++m_head %= 256;}
- uint8_t unqueue_data() {uint8_t ret = m_queue[m_tail]; ++m_tail %= 256; return ret;}
- virtual void tra_complete() override;
- virtual void tra_callback() override;
- void reset_mouse();
-
- virtual WRITE_LINE_MEMBER(input_dtr) override;
- virtual WRITE_LINE_MEMBER(input_rts) override;
-
- int m_dtr;
- int m_rts;
-
-private:
- void check_state() { set_mouse_enable(!m_dtr && !m_rts); }
-
- uint8_t m_queue[256];
- uint8_t m_head, m_tail, m_mb;
-
- emu_timer *m_timer;
- bool m_enabled;
-
- required_ioport m_x;
- required_ioport m_y;
- required_ioport m_btn;
-};
-
-class microsoft_mouse_device : public serial_mouse_device
-{
-public:
- microsoft_mouse_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
-protected:
- virtual WRITE_LINE_MEMBER(input_rts) override;
-
- virtual void set_frame() override { set_data_frame(1, 7, PARITY_NONE, STOP_BITS_2); }
- virtual void mouse_trans(int dx, int dy, int nb, int mbc) override;
-};
-
-DECLARE_DEVICE_TYPE(MSFT_SERIAL_MOUSE, microsoft_mouse_device)
-
-class mouse_systems_mouse_device : public serial_mouse_device
-{
-public:
- mouse_systems_mouse_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
-protected:
- virtual void set_frame() override { set_data_frame(1, 8, PARITY_NONE, STOP_BITS_2); }
- virtual void mouse_trans(int dx, int dy, int nb, int mbc) override;
-};
-
-DECLARE_DEVICE_TYPE(MSYSTEM_SERIAL_MOUSE, mouse_systems_mouse_device)
-
-#endif // MAME_BUS_RS232_SER_MOUSE_H
diff --git a/src/devices/bus/sbus/sbus.cpp b/src/devices/bus/sbus/sbus.cpp
index 4c876cffd50..f8363194c5a 100644
--- a/src/devices/bus/sbus/sbus.cpp
+++ b/src/devices/bus/sbus/sbus.cpp
@@ -30,7 +30,7 @@ void sbus_cards(device_slot_interface &device)
device.option_add("turbogxp", SBUS_TURBOGXP); /* Sun TurboGX+ 8-bit color display board */
device.option_add("sunpc", SBUS_SUNPC); /* Sun SunPC 5x86 Accelerator board */
device.option_add("hme", SBUS_HME); /* Sun SunSwift 10/100 + Fast Wide SCSI "Colossus" board */
- device.option_add("sb300p", SBUS_SB300P); /* Artecon CB300P 3-serial/4-parallel board */
+ device.option_add("sb300p", SBUS_SB300P); /* Artecon CB300P 3-serial/1-parallel board */
}
DEFINE_DEVICE_TYPE(SBUS_SLOT, sbus_slot_device, "sbus_slot", "Sun SBus Slot")
diff --git a/src/devices/bus/sunkbd/hlekbd.cpp b/src/devices/bus/sunkbd/hlekbd.cpp
index 48b16f13348..2cb5547947e 100644
--- a/src/devices/bus/sunkbd/hlekbd.cpp
+++ b/src/devices/bus/sunkbd/hlekbd.cpp
@@ -21,7 +21,7 @@
0000 0011 bell off
0000 1010 enable keyclick (5ms duration 480us period on make)
0000 1011 disable keyclick
- 0000 1110 ---k lscn LED (1 = on, k = kana, l = caps lock, s = scroll lock, c = compose, n = num lock)
+ 0000 1110 ---k lscn LED (1 = on: k = kana, l = caps lock, s = scroll lock, c = compose, n = num lock)
0000 1111 layout request (keyboard responds with layout response)
message from keyboad to host:
@@ -101,7 +101,7 @@
control on home row, caps lock at bottom left corner of main area
- Type 5 International layout:
+ Type 5 International (ISO) layout:
76 1d 05 06 08 0a 0c 0e 10 11 12 07 09 0b 16 17 15 2d 02 04 30
@@ -114,7 +114,7 @@
double-height return key, 58 (US backslash) moved to home row, 7c added on left of bottom row
- Type 5 Japanese layout:
+ Type 5 Japanese (JIS) layout:
76 1d 05 06 08 0a 0c 0e 10 11 12 07 09 0b 16 17 15 2d 02 04 30
@@ -127,8 +127,8 @@
double-height return key
yen/pipe replaces backtick/tilde at top left corner of main area
linefeed scancode repurposed for backslash/underscore
- kana replaces alt graph (with LED window)
- extra kakutei, henkan and nihongo on-off keys
+ kana (かな) replaces alt graph (with LED window)
+ extra kakutei (確定), henkan (変換) and nihongo on-off (日本語 On-Off) keys
*/
@@ -148,6 +148,7 @@ DEFINE_DEVICE_TYPE_NS(SUN_TYPE5_JP_HLE_KEYBOARD, bus::sunkbd, hle_type5_jp_devic
namespace bus { namespace sunkbd {
namespace {
+
/***************************************************************************
INPUT PORT DEFINITIONS
***************************************************************************/
@@ -941,13 +942,13 @@ void hle_device_base::key_break(uint8_t row, uint8_t column)
assert(!fifo_full());
assert(m_make_count);
- // send the break code, and the idle code if no other keysa are down
+ // send the break code, and the idle code if no other keys are down
transmit_byte(0x80U | (row << 4) | column);
if (!--m_make_count)
transmit_byte(0x7fU);
- // check our counting
- assert(are_all_keys_up() == !bool(m_make_count));
+ // this blows up if a key is pressed just as the last key is released
+ //assert(are_all_keys_up() == !bool(m_make_count));
}
diff --git a/src/devices/bus/sunkbd/hlekbd.h b/src/devices/bus/sunkbd/hlekbd.h
index a4f6d886f5c..4f442daad4a 100644
--- a/src/devices/bus/sunkbd/hlekbd.h
+++ b/src/devices/bus/sunkbd/hlekbd.h
@@ -122,6 +122,7 @@ public:
device_t *owner,
uint32_t clock);
+protected:
virtual ioport_constructor device_input_ports() const override;
private:
@@ -138,6 +139,7 @@ public:
device_t *owner,
uint32_t clock);
+protected:
virtual ioport_constructor device_input_ports() const override;
};
@@ -151,6 +153,7 @@ public:
device_t *owner,
uint32_t clock);
+protected:
virtual ioport_constructor device_input_ports() const override;
};
@@ -164,6 +167,7 @@ public:
device_t *owner,
uint32_t clock);
+protected:
virtual ioport_constructor device_input_ports() const override;
};
@@ -177,6 +181,7 @@ public:
device_t *owner,
uint32_t clock);
+protected:
virtual ioport_constructor device_input_ports() const override;
};
@@ -190,6 +195,7 @@ public:
device_t *owner,
uint32_t clock);
+protected:
virtual ioport_constructor device_input_ports() const override;
};
diff --git a/src/devices/bus/sunkbd/sunkbd.cpp b/src/devices/bus/sunkbd/sunkbd.cpp
index 2ac0eb65b4c..82152b5f905 100644
--- a/src/devices/bus/sunkbd/sunkbd.cpp
+++ b/src/devices/bus/sunkbd/sunkbd.cpp
@@ -1,5 +1,92 @@
// license:BSD-3-Clause
// copyright-holders:Vas Crabb
+/*
+ Sun keyboard port
+
+ Pre-USB Sun keyboards use an asynchronous serial protocol. Data is
+ transmitted at TTL levels using an asynchronous serial protocol at
+ 1,200 Baud. The protocol remained compatible from at least the
+ Type 2 keyboard to the Type 6 keyboard, although key layout and key
+ cap labels varied, some scancodes were repurposed, and a variety of
+ connectors were used.
+
+ From the Sun 2/50 onwards, the keyboard and mouse share a single
+ connector, either using a splitter adapter, or by plugging the mouse
+ into a pass-through connector on the keyboard.
+
+ Type 3 female DA-15 connector on host (introduced on Sun 2/50):
+ 1: keyboard RxD 9: GND
+ 2: GND 10: +5V
+ 3: keyboard TxD 11: +5V
+ 4: GND 12: +5V
+ 5: mouse RxD 13: +5V
+ 6: GND 14: +5V
+ 7: mouse TxD 15: +5V
+ 8: GND
+
+ Type 4 female Mini-DIN-8 connector on host (introduced on Sun 3/80):
+ 1: GND 3: +5V 6: keyboard RxD
+ 2: GND 4: mouse RxD 7: mouse TxD
+ 5: keyboard TxD 8: +5V
+
+ Type 5 female Mini-DIN-8 connector on host:
+ 1: GND 3: +5V 6: keyboard RxD
+ 2: GND 4: mouse RxD 7: power key
+ 5: keyboard TxD 8: +5V
+
+ Scancodes (U.S. caps except as noted):
+ 00: 20: 3 40: [ { 60: Page Up
+ 01: L1/Stop 21: 5 41: ] } 61: L10/Cut
+ 02: Volume Down 22: 5 42: Delete 62: Num Lock
+ 03: L2/Again 23: 6 43: Compose 63: Left Shift
+ 04: Volume Up 24: 7 44: R7/KP 7 64: Z
+ 05: F1 25: 8 45: R8/KP 8 65: X
+ 06: F2 26: 9 46: R9/KP 9 66: C
+ 07: F10 27: 0 47: KP - 67: V
+ 08: F3 28: - _ 48: L7/Open 68: B
+ 09: F11 29: = + 49: L8/Paste 69: N
+ 0a: F4 2a: ` ~ 4a: End 6a: M
+ 0b: F12 2b: Backspace 4b: 6b: , <
+ 0c: F5 2c: Insert 4c: Control 6c: . >
+ 0d: Alt Graph 2d: R4/KP =/Mute 4d: A 6d: / ?
+ 0e: F6 2e: R5/KP / 4e: S 6e: Right Shift
+ 0f: Blank 2f: R6/KP * 4f: D 6f: Line Feed/\ _
+ 10: F7 30: Power 50: F 70: R13/KP 1
+ 11: F8 31: L5/Front 51: G 71: R14/KP 2
+ 12: F9 32: KP . 52: H 72: R15/KP 3
+ 13: Alt 33: L6/Copy 53: J 73: Kakutei
+ 14: Cursor Up 34: Home 54: K 74: Henkan
+ 15: R1/Pause 35: Tab 55: L 75: Nihongo On-Off
+ 16: R2/Print Screen 36: Q 56: ; : 76: Help
+ 17: R3/Scroll Lock 37: W 57: ' " 77: Caps Lock
+ 18: Cursor Left 38: E 58: \ | 78: Left Meta
+ 19: L3/Props 39: R 59: Return 79: Space
+ 1a: L4/Undo 3a: T 5a: Enter 7a: Right Meta
+ 1b: Cursor Down 3b: Y 5b: R10/KP 4 7b: Page Down
+ 1c: Cursor Right 3c: U 5c: R11/KP 5 7c: < >
+ 1d: Escape 3d: I 5d: R12/KP 6 7d: KP +
+ 1e: 1 3e: O 5e: KP 0 7e:
+ 1f: 2 3f: P 5f: L9/Find 7f:
+
+ 7e and 7f are reserved for special messages.
+ L function group and R function group repurposed on Type 4 keyboard.
+ F10, F11, F12, Alt Graph, Compose, and Help added on Type 4 keyboard.
+ Num Lock, KP -, KP +, KP 0, KP ., and Enter added on Type 4 keyboard.
+ Line Feed removed from Type 5 keyboard.
+ Cursor Up, Cursor Down, Cursor Left, and Cursor Right added on Type 5 keyboard.
+ Insert, Home, End, Page Up, and Page Down added on Type 5 keyboard.
+ Volume Down, Volume Up, and Power added on Type 5 keyboard.
+ KP = repurposed for Mute on Type 5 keyboard.
+ Blank key only present on Type 5 UNIX keyboard.
+ < > only present on Type 5 International (ISO) keyboard.
+ Line Feed repurposed for backslash/underscore on Type 5 Japanese (JIS) keyboard.
+ Kakutei, Henkan, and Nihongo On-Off only present on Type 5 Japanese (JIS) keyboard.
+
+ TODO:
+ * Add power key line for soft power sun4c and later systems.
+ * Confirm actual logic levels.
+ * Dump keyboard microcontrollers.
+*/
#include "emu.h"
#include "sunkbd.h"
@@ -52,6 +139,19 @@ void sun_keyboard_port_device::device_config_complete()
}
+void sun_keyboard_port_device::device_validity_check(validity_checker &valid) const
+{
+ device_t *const card(get_card_device());
+ if (card && !dynamic_cast<device_sun_keyboard_port_interface *>(card))
+ {
+ osd_printf_error(
+ "Card device %s (%s) does not implement device_sun_keyboard_port_interface\n",
+ card->tag(),
+ card->name());
+ }
+}
+
+
void sun_keyboard_port_device::device_resolve_objects()
{
m_rxd_handler.resolve_safe();
@@ -60,6 +160,14 @@ void sun_keyboard_port_device::device_resolve_objects()
void sun_keyboard_port_device::device_start()
{
+ if (get_card_device() && !m_dev)
+ {
+ throw emu_fatalerror(
+ "Card device %s (%s) does not implement device_sun_keyboard_port_interface\n",
+ get_card_device()->tag(),
+ get_card_device()->name());
+ }
+
save_item(NAME(m_rxd));
m_rxd = 1;
diff --git a/src/devices/bus/sunkbd/sunkbd.h b/src/devices/bus/sunkbd/sunkbd.h
index 43f60067a46..532193cbf0d 100644
--- a/src/devices/bus/sunkbd/sunkbd.h
+++ b/src/devices/bus/sunkbd/sunkbd.h
@@ -28,7 +28,7 @@ public:
sun_keyboard_port_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0);
virtual ~sun_keyboard_port_device();
- // static configuration helpers
+ // configuration helpers
auto rxd_handler() { return m_rxd_handler.bind(); }
DECLARE_WRITE_LINE_MEMBER( write_txd );
@@ -38,9 +38,10 @@ public:
protected:
sun_keyboard_port_device(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, uint32_t clock);
+ virtual void device_config_complete() override;
+ virtual void device_validity_check(validity_checker &valid) const override;
virtual void device_resolve_objects() override;
virtual void device_start() override;
- virtual void device_config_complete() override;
int m_rxd;
@@ -58,13 +59,13 @@ class device_sun_keyboard_port_interface : public device_slot_card_interface
public:
virtual ~device_sun_keyboard_port_interface() override;
+protected:
+ device_sun_keyboard_port_interface(machine_config const &mconfig, device_t &device);
+
virtual DECLARE_WRITE_LINE_MEMBER( input_txd ) { }
DECLARE_WRITE_LINE_MEMBER( output_rxd ) { m_port->m_rxd = state; m_port->m_rxd_handler(state); }
-protected:
- device_sun_keyboard_port_interface(machine_config const &mconfig, device_t &device);
-
sun_keyboard_port_device *m_port;
static constexpr int START_BIT_COUNT = 1;
diff --git a/src/devices/bus/sunmouse/hlemouse.cpp b/src/devices/bus/sunmouse/hlemouse.cpp
new file mode 100644
index 00000000000..fb08b95232e
--- /dev/null
+++ b/src/devices/bus/sunmouse/hlemouse.cpp
@@ -0,0 +1,314 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+#include "emu.h"
+#include "hlemouse.h"
+
+#define LOG_GENERAL (1U << 0)
+#define LOG_BIT (1U << 1)
+
+//#define VERBOSE (LOG_GENERAL | LOG_BIT)
+//#define LOG_OUTPUT_STREAM std::cerr
+
+#include "logmacro.h"
+
+#define LOGBIT(...) LOGMASKED(LOG_BIT, __VA_ARGS__)
+
+
+/*
+ Mostly compatible with the Mouse Systems "non-rotatable" protocol.
+ The only real difference is that the mouse may send a 3-byte frame
+ if the movement in each axis doesn't exceed the range -120 to 127
+ counts (values in the range -128 to -121 are indistinguishable from
+ button states).
+*/
+
+
+/***************************************************************************
+ DEVICE TYPE GLOBALS
+***************************************************************************/
+
+DEFINE_DEVICE_TYPE_NS(SUN_1200BAUD_HLE_MOUSE, bus::sunmouse, hle_1200baud_device, "sunmouse_hle1200", "Sun Mouse (1200 Baud, HLE)")
+DEFINE_DEVICE_TYPE_NS(SUN_4800BAUD_HLE_MOUSE, bus::sunmouse, hle_4800baud_device, "sunmouse_hle4800", "Sun Mouse (4800 Baud, HLE)")
+
+namespace bus { namespace sunmouse {
+
+namespace {
+
+INPUT_PORTS_START( mouse )
+ PORT_START("BTN")
+ PORT_BIT( 0xfff8, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CODE(MOUSECODE_BUTTON1) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_device_base, input_changed, nullptr)
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CODE(MOUSECODE_BUTTON3) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_device_base, input_changed, nullptr)
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CODE(MOUSECODE_BUTTON2) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_device_base, input_changed, nullptr)
+
+ PORT_START("X")
+ PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0fff, 0x00, IPT_MOUSE_X ) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_device_base, input_changed, nullptr)
+
+ PORT_START("Y")
+ PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0fff, 0x00, IPT_MOUSE_Y ) PORT_SENSITIVITY(100) PORT_KEYDELTA(0) PORT_CHANGED_MEMBER(DEVICE_SELF, hle_device_base, input_changed, nullptr)
+INPUT_PORTS_END
+
+
+uint8_t extract_delta_byte(int32_t &delta)
+{
+ int32_t const result(std::min<int32_t>(std::max<int32_t>(delta, -120), 127));
+ delta -= result;
+ return uint8_t(int8_t(result));
+}
+
+} // anonymous namespace
+
+
+
+/***************************************************************************
+ BASE HLE MOUSE DEVICE
+***************************************************************************/
+
+hle_device_base::hle_device_base(
+ machine_config const &mconfig,
+ device_type type,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock,
+ unsigned multiplier)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_serial_interface(mconfig, *this)
+ , device_sun_mouse_port_interface(mconfig, *this)
+ , m_buttons(*this, "BTN")
+ , m_x_axis(*this, "X")
+ , m_y_axis(*this, "Y")
+ , m_multiplier(multiplier)
+ , m_x_delta(0)
+ , m_y_delta(0)
+ , m_x_val(0U)
+ , m_y_val(0U)
+ , m_btn_sent(0x00U)
+ , m_btn_val(0x00U)
+ , m_phase(0U)
+{
+}
+
+
+hle_device_base::~hle_device_base()
+{
+}
+
+
+INPUT_CHANGED_MEMBER( hle_device_base::input_changed )
+{
+ if (is_transmit_register_empty())
+ {
+ assert((0U == m_phase) || (3U == m_phase));
+
+ check_inputs();
+ if (0U == m_phase)
+ {
+ if (m_x_delta || m_y_delta || (m_btn_sent != m_btn_val))
+ {
+ LOG("Inputs changed (B=%X->%x X=%d Y=%d) - sending button state\n",
+ m_btn_sent,
+ m_btn_val,
+ m_x_delta,
+ m_y_delta);
+ transmit_register_setup((m_btn_sent = m_btn_val) | 0x80U);
+ }
+ }
+ else if (m_x_delta || m_y_delta)
+ {
+ LOG("Inputs changed (B=%X->%x X=%d Y=%d) - sending X delta\n",
+ m_btn_sent,
+ m_btn_val,
+ m_x_delta,
+ m_y_delta);
+ transmit_register_setup(extract_delta_byte(m_x_delta));
+ }
+ else if (m_btn_sent != m_btn_val)
+ {
+ LOG("Inputs changed (B=%X->%x X=%d Y=%d) - sending button state\n",
+ m_btn_sent,
+ m_btn_val,
+ m_x_delta,
+ m_y_delta);
+ m_phase = 0U;
+ transmit_register_setup((m_btn_sent = m_btn_val) | 0x80U);
+ }
+ }
+ else
+ {
+ LOG("Ignoring input changed while transmit register not empty\n");
+ }
+}
+
+
+ioport_constructor hle_device_base::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(mouse);
+}
+
+
+void hle_device_base::device_start()
+{
+ save_item(NAME(m_x_delta));
+ save_item(NAME(m_y_delta));
+ save_item(NAME(m_x_val));
+ save_item(NAME(m_y_val));
+ save_item(NAME(m_phase));
+
+ set_data_frame(START_BIT_COUNT, DATA_BIT_COUNT, PARITY, STOP_BITS);
+ set_rate(BAUD * m_multiplier);
+ receive_register_reset();
+ transmit_register_reset();
+
+ output_rxd(0);
+
+ m_x_delta = 0;
+ m_y_delta = 0;
+ m_btn_sent = 0x00U;
+ m_phase = 0U;
+}
+
+
+void hle_device_base::device_reset()
+{
+ m_x_val = m_x_axis->read();
+ m_y_val = m_y_axis->read();
+ m_btn_val = m_buttons->read();
+}
+
+
+void hle_device_base::tra_callback()
+{
+ int const bit(transmit_register_get_data_bit() ? 0 : 1);
+ LOGBIT("Send bit !%d\n", bit);
+ output_rxd(bit);
+}
+
+
+void hle_device_base::tra_complete()
+{
+ check_inputs();
+
+ if (4U <= m_phase)
+ m_phase = 0U;
+ else
+ ++m_phase;
+
+ switch (m_phase)
+ {
+ // sent second Y delta - send button state if anything changed
+ case 0U:
+ if (m_x_delta || m_y_delta || (m_btn_sent != m_btn_val))
+ {
+ LOG("Sent Y delta (B=%X->%x X=%d Y=%d) - sending button state\n",
+ m_btn_sent,
+ m_btn_val,
+ m_x_delta,
+ m_y_delta);
+ transmit_register_setup((m_btn_sent = m_btn_val) | 0x80U);
+ }
+ else
+ {
+ LOG("Sent Y delta (B=%X->%x X=%d Y=%d) - nothing to send\n",
+ m_btn_sent,
+ m_btn_val,
+ m_x_delta,
+ m_y_delta);
+ }
+ break;
+
+ // can wait after sending first Y delta
+ case 3U:
+ if (!m_x_delta && !m_y_delta && (m_btn_sent == m_btn_val))
+ {
+ LOG("Sent Y delta (B=%X->%x X=%d Y=%d) - nothing to send\n",
+ m_btn_sent,
+ m_btn_val,
+ m_x_delta,
+ m_y_delta);
+ //break; uncommenting this causes problems with early versions of Solaris
+ }
+ case 1U:
+ LOG("Sent %s (B=%X->%x X=%d Y=%d) - sending X delta\n",
+ (1U == m_phase) ? "button state" : "Y delta",
+ m_btn_sent,
+ m_btn_val,
+ m_x_delta,
+ m_y_delta);
+ transmit_register_setup(extract_delta_byte(m_x_delta));
+ break;
+
+ // sent X delta - always follow with Y delta
+ case 2U:
+ case 4U:
+ LOG("Sent X delta (B=%X->%x X=%d Y=%d) - sending Y delta\n",
+ m_btn_sent,
+ m_btn_val,
+ m_x_delta,
+ m_y_delta);
+ transmit_register_setup(extract_delta_byte(m_y_delta));
+ break;
+ }
+}
+
+
+void hle_device_base::check_inputs()
+{
+ // read new axis values and get difference
+ uint16_t const x_val(m_x_axis->read());
+ uint16_t const y_val(m_y_axis->read());
+ int16_t x_delta(x_val - m_x_val);
+ int16_t y_delta(y_val - m_y_val);
+
+ // deal with wraparound
+ if (0x0800 <= x_delta)
+ x_delta -= 0x1000;
+ else if (-0x0800 >= x_delta)
+ x_delta += 0x1000;
+ if (0x0800 <= y_delta)
+ y_delta -= 0x1000;
+ else if (-0x0800 >= y_delta)
+ x_delta += 0x1000;
+
+ // update state
+ m_x_delta += x_delta;
+ m_y_delta -= y_delta;
+ m_x_val = x_val;
+ m_y_val = y_val;
+
+ // read new button values
+ m_btn_val = m_buttons->read();
+}
+
+
+
+/***************************************************************************
+ 1200 BAUD HLE MOUSE DEVICE
+***************************************************************************/
+
+hle_1200baud_device::hle_1200baud_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock)
+ : hle_device_base(mconfig, SUN_1200BAUD_HLE_MOUSE, tag, owner, clock, 8U) // FIXME: hack because z80scc isn't working properly
+{
+}
+
+
+
+/***************************************************************************
+ 4800 BAUD HLE MOUSE DEVICE
+***************************************************************************/
+
+hle_4800baud_device::hle_4800baud_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock)
+ : hle_device_base(mconfig, SUN_4800BAUD_HLE_MOUSE, tag, owner, clock, 4U)
+{
+}
+
+} } // namespace bus::sunmouse
diff --git a/src/devices/bus/sunmouse/hlemouse.h b/src/devices/bus/sunmouse/hlemouse.h
new file mode 100644
index 00000000000..6eb5cf44b63
--- /dev/null
+++ b/src/devices/bus/sunmouse/hlemouse.h
@@ -0,0 +1,82 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+#ifndef MAME_DEVICES_SUNMOUSE_HLEMOUSE_H
+#define MAME_DEVICES_SUNMOUSE_HLEMOUSE_H
+
+#pragma once
+
+#include "sunmouse.h"
+#include "diserial.h"
+
+
+namespace bus { namespace sunmouse {
+
+class hle_device_base
+ : public device_t
+ , public device_serial_interface
+ , public device_sun_mouse_port_interface
+{
+public:
+ virtual ~hle_device_base() override;
+
+ DECLARE_INPUT_CHANGED_MEMBER( input_changed );
+
+protected:
+ // constructor/destructor
+ hle_device_base(
+ machine_config const &mconfig,
+ device_type type,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock,
+ unsigned multiplier);
+
+ // device overrides
+ virtual ioport_constructor device_input_ports() const override;
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // device_serial_interface overrides
+ virtual void tra_callback() override;
+ virtual void tra_complete() override;
+
+private:
+ void check_inputs();
+
+ required_ioport m_buttons, m_x_axis, m_y_axis;
+ unsigned const m_multiplier;
+ int32_t m_x_delta, m_y_delta;
+ uint16_t m_x_val, m_y_val;
+ uint8_t m_btn_sent, m_btn_val;
+ uint8_t m_phase;
+};
+
+
+class hle_1200baud_device : public hle_device_base
+{
+public:
+ hle_1200baud_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock);
+};
+
+
+class hle_4800baud_device : public hle_device_base
+{
+public:
+ hle_4800baud_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock);
+};
+
+} } // namespace bus::sunmouse
+
+
+DECLARE_DEVICE_TYPE_NS(SUN_1200BAUD_HLE_MOUSE, bus::sunmouse, hle_1200baud_device)
+DECLARE_DEVICE_TYPE_NS(SUN_4800BAUD_HLE_MOUSE, bus::sunmouse, hle_4800baud_device)
+
+#endif // MAME_DEVICES_SUNMOUSE_HLEMOUSE_H
diff --git a/src/devices/bus/sunmouse/sunmouse.cpp b/src/devices/bus/sunmouse/sunmouse.cpp
new file mode 100644
index 00000000000..9b59529c54a
--- /dev/null
+++ b/src/devices/bus/sunmouse/sunmouse.cpp
@@ -0,0 +1,184 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+/*
+ Sun mouse port
+
+ Before USB, Sun used an asynchronous serial mouse protocol. Data is
+ transmitted at TTL levels using an asynchronous serial protocol.
+ The mouse RxD line is pulled up by the host and driven low by an
+ open collector driver in the mouse for the mark (1) condition. This
+ means that if no mouse is connected, the host will see a break
+ condition. The protocol is mostly compatible with the Mouse Systems
+ "non-rotatable" protocol.
+
+ Most Sun mouse port devices transmit data at 1,200 Baud. However,
+ some devices transmit at 4,800 Baud, and it's possible to modify any
+ Sun Type 5 mouse for 4,800 Baud operation. Solaris 2.3 or later is
+ required to support a 4,800 Baud mouse.
+
+ From the Sun 2/50 onwards, the keyboard and mouse share a single
+ connector, either using a splitter adapter, or by plugging the mouse
+ into a pass-through connector on the keyboard.
+
+ Type 3 female DA-15 connector on host (introduced on Sun 2/50):
+ 1: keyboard RxD 9: GND
+ 2: GND 10: +5V
+ 3: keyboard TxD 11: +5V
+ 4: GND 12: +5V
+ 5: mouse RxD 13: +5V
+ 6: GND 14: +5V
+ 7: mouse TxD 15: +5V
+ 8: GND
+
+ Type 4 female Mini-DIN-8 connector on host (introduced on Sun 3/80):
+ 1: GND 3: +5V 6: keyboard RxD
+ 2: GND 4: mouse RxD 7: mouse TxD
+ 5: keyboard TxD 8: +5V
+
+ Type 5 female Mini-DIN-8 connector on host:
+ 1: GND 3: +5V 6: keyboard RxD
+ 2: GND 4: mouse RxD 7: power key
+ 5: keyboard TxD 8: +5V
+
+ Type 5 and later sacrifice the TxD line from the host to the mouse
+ in favour of a dedicated line for the soft power key. It was never
+ used for anything useful with standard Sun peripherals anyway.
+
+ Sun 2 and Sun 3 used an optical mouse made by Mouse Systems. The
+ colour varied (usually black for Sun 2 and white for Sun 3). They
+ require a Mouse Systems optical mouse pad to work correctly. The
+ later Sun optical mouse for Sun 4 requires a different pad with
+ thinner stripes.
+
+ The Logitech Trackman T-CB1 is a compatible replacement for a Sun
+ Type 4 or Type 5 mouse, made at Sun's request.
+
+ Known Sun mouse part numbers:
+ * 370-1169: Type 4 optical mouse (manufactured by Mouse Systems)
+ * 370-1398: Type 5 optical mouse (bridge JP2 for 4,800 Baud)
+ * 370-1586-01: SPARCstation Voyager 4,800 Baud mouse
+ * 370-1586-02: Type 5 opto-mechanical mouse
+ * 370-1586-03: Type 5 opto-mechanical mouse
+
+ TODO:
+ * Confirm polarity of TxD signal from host to mouse.
+ * Dump mouse microcontrollers.
+*/
+
+#include "emu.h"
+#include "sunmouse.h"
+
+
+DEFINE_DEVICE_TYPE(SUNMOUSE_PORT, sun_mouse_port_device, "sunmouse", "Sun Mouse Port")
+
+
+int const device_sun_mouse_port_interface::START_BIT_COUNT;
+int const device_sun_mouse_port_interface::DATA_BIT_COUNT;
+device_serial_interface::parity_t const device_sun_mouse_port_interface::PARITY;
+device_serial_interface::stop_bits_t const device_sun_mouse_port_interface::STOP_BITS;
+int const device_sun_mouse_port_interface::BAUD;
+
+
+
+sun_mouse_port_device::sun_mouse_port_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock)
+ : sun_mouse_port_device(mconfig, SUNMOUSE_PORT, tag, owner, clock)
+{
+}
+
+
+sun_mouse_port_device::sun_mouse_port_device(
+ machine_config const &mconfig,
+ device_type type,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_slot_interface(mconfig, *this)
+ , m_rxd(0)
+ , m_rxd_handler(*this)
+ , m_dev(nullptr)
+{
+}
+
+
+sun_mouse_port_device::~sun_mouse_port_device()
+{
+}
+
+
+void sun_mouse_port_device::device_config_complete()
+{
+ m_dev = dynamic_cast<device_sun_mouse_port_interface *>(get_card_device());
+}
+
+
+void sun_mouse_port_device::device_validity_check(validity_checker &valid) const
+{
+ device_t *const card(get_card_device());
+ if (card && !dynamic_cast<device_sun_mouse_port_interface *>(card))
+ {
+ osd_printf_error(
+ "Card device %s (%s) does not implement device_sun_mouse_port_interface\n",
+ card->tag(),
+ card->name());
+ }
+}
+
+
+void sun_mouse_port_device::device_resolve_objects()
+{
+ m_rxd = 1;
+
+ m_rxd_handler.resolve_safe();
+}
+
+
+void sun_mouse_port_device::device_start()
+{
+ if (get_card_device() && !m_dev)
+ {
+ throw emu_fatalerror(
+ "Card device %s (%s) does not implement device_sun_mouse_port_interface\n",
+ get_card_device()->tag(),
+ get_card_device()->name());
+ }
+
+ save_item(NAME(m_rxd));
+
+ if (!m_dev)
+ m_rxd_handler(m_rxd = 0);
+}
+
+
+WRITE_LINE_MEMBER( sun_mouse_port_device::write_txd )
+{
+ if (m_dev)
+ m_dev->input_txd(state ? 0 : 1);
+}
+
+
+
+device_sun_mouse_port_interface::device_sun_mouse_port_interface(machine_config const &mconfig, device_t &device)
+ : device_slot_card_interface(mconfig, device)
+ , m_port(dynamic_cast<sun_mouse_port_device *>(device.owner()))
+{
+}
+
+
+device_sun_mouse_port_interface::~device_sun_mouse_port_interface()
+{
+}
+
+
+
+#include "hlemouse.h"
+
+void default_sun_mouse_devices(device_slot_interface &device)
+{
+ device.option_add("hle1200", SUN_1200BAUD_HLE_MOUSE);
+ device.option_add("hle4800", SUN_4800BAUD_HLE_MOUSE);
+}
diff --git a/src/devices/bus/sunmouse/sunmouse.h b/src/devices/bus/sunmouse/sunmouse.h
new file mode 100644
index 00000000000..ff7dd9ca86a
--- /dev/null
+++ b/src/devices/bus/sunmouse/sunmouse.h
@@ -0,0 +1,84 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+#ifndef MAME_BUS_SUNMOUSE_SUNMOUSE_H
+#define MAME_BUS_SUNMOUSE_SUNMOUSE_H
+
+#pragma once
+
+#include "diserial.h"
+
+
+class device_sun_mouse_port_interface;
+
+
+class sun_mouse_port_device : public device_t, public device_slot_interface
+{
+ friend class device_sun_mouse_port_interface;
+
+public:
+ template <typename T>
+ sun_mouse_port_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
+ : sun_mouse_port_device(mconfig, tag, owner, 0)
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(dflt);
+ set_fixed(false);
+ }
+ sun_mouse_port_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0);
+ virtual ~sun_mouse_port_device();
+
+ // configuration helpers
+ auto rxd_handler() { return m_rxd_handler.bind(); }
+
+ DECLARE_WRITE_LINE_MEMBER( write_txd );
+
+ DECLARE_READ_LINE_MEMBER( rxd_r ) { return m_rxd; }
+
+protected:
+ sun_mouse_port_device(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, uint32_t clock);
+
+ virtual void device_config_complete() override;
+ virtual void device_validity_check(validity_checker &valid) const override;
+ virtual void device_resolve_objects() override;
+ virtual void device_start() override;
+
+ int m_rxd;
+
+ devcb_write_line m_rxd_handler;
+
+private:
+ device_sun_mouse_port_interface *m_dev;
+};
+
+
+class device_sun_mouse_port_interface : public device_slot_card_interface
+{
+ friend class sun_mouse_port_device;
+
+public:
+ virtual ~device_sun_mouse_port_interface() override;
+
+protected:
+ device_sun_mouse_port_interface(machine_config const &mconfig, device_t &device);
+
+ virtual DECLARE_WRITE_LINE_MEMBER( input_txd ) { }
+
+ DECLARE_WRITE_LINE_MEMBER( output_rxd ) { m_port->m_rxd_handler(m_port->m_rxd = state ? 0 : 1); }
+
+ sun_mouse_port_device *m_port;
+
+ static constexpr int START_BIT_COUNT = 1;
+ static constexpr int DATA_BIT_COUNT = 8;
+ static constexpr device_serial_interface::parity_t PARITY = device_serial_interface::PARITY_NONE;
+ static constexpr device_serial_interface::stop_bits_t STOP_BITS = device_serial_interface::STOP_BITS_1;
+ static constexpr int BAUD = 1'200;
+};
+
+
+DECLARE_DEVICE_TYPE(SUNMOUSE_PORT, sun_mouse_port_device)
+
+
+void default_sun_mouse_devices(device_slot_interface &device);
+
+#endif // MAME_BUS_SUNMOUSE_SUNMOUSE_H
diff --git a/src/devices/cpu/nec/v53.cpp b/src/devices/cpu/nec/v53.cpp
index 82b811c873a..5abd00210c9 100644
--- a/src/devices/cpu/nec/v53.cpp
+++ b/src/devices/cpu/nec/v53.cpp
@@ -314,16 +314,16 @@ void v53_base_device::install_peripheral_io()
if (IOAG) // 8-bit
{
- space(AS_IO).install_readwrite_handler(base+0x00, base+0x01, read8_delegate(FUNC(v53_scu_device::data_r), (v53_scu_device*)m_v53scu), write8_delegate(FUNC(v53_scu_device::data_w), (v53_scu_device*)m_v53scu), 0x00ff);
- space(AS_IO).install_readwrite_handler(base+0x00, base+0x01, read8_delegate(FUNC(v53_scu_device::status_r), (v53_scu_device*)m_v53scu), write8_delegate(FUNC(v53_scu_device::command_w), (v53_scu_device*)m_v53scu), 0xff00);
- space(AS_IO).install_write_handler(base+0x02, base+0x03, write8_delegate(FUNC(v53_scu_device::mode_w), (v53_scu_device*)m_v53scu), 0x00ff);
+ space(AS_IO).install_readwrite_handler(base+0x00, base+0x01, read8smo_delegate(FUNC(v53_scu_device::data_r), m_v53scu.target()), write8smo_delegate(FUNC(v53_scu_device::data_w), m_v53scu.target()), 0x00ff);
+ space(AS_IO).install_readwrite_handler(base+0x00, base+0x01, read8smo_delegate(FUNC(v53_scu_device::status_r), m_v53scu.target()), write8smo_delegate(FUNC(v53_scu_device::command_w), m_v53scu.target()), 0xff00);
+ space(AS_IO).install_write_handler(base+0x02, base+0x03, write8smo_delegate(FUNC(v53_scu_device::mode_w), m_v53scu.target()), 0x00ff);
space(AS_IO).install_readwrite_handler(base+0x02, base+0x03, read8_delegate(FUNC(v53_base_device::scu_simk_r), this), write8_delegate(FUNC(v53_base_device::scu_simk_w), this), 0xff00);
}
else
{
- space(AS_IO).install_readwrite_handler(base+0x00, base+0x01, read8_delegate(FUNC(v53_scu_device::data_r), (v53_scu_device*)m_v53scu), write8_delegate(FUNC(v53_scu_device::data_w), (v53_scu_device*)m_v53scu), 0x00ff);
- space(AS_IO).install_readwrite_handler(base+0x02, base+0x03, read8_delegate(FUNC(v53_scu_device::status_r), (v53_scu_device*)m_v53scu), write8_delegate(FUNC(v53_scu_device::command_w), (v53_scu_device*)m_v53scu), 0x00ff);
- space(AS_IO).install_write_handler(base+0x04, base+0x05, write8_delegate(FUNC(v53_scu_device::mode_w), (v53_scu_device*)m_v53scu), 0x00ff);
+ space(AS_IO).install_readwrite_handler(base+0x00, base+0x01, read8smo_delegate(FUNC(v53_scu_device::data_r), m_v53scu.target()), write8smo_delegate(FUNC(v53_scu_device::data_w), m_v53scu.target()), 0x00ff);
+ space(AS_IO).install_readwrite_handler(base+0x02, base+0x03, read8smo_delegate(FUNC(v53_scu_device::status_r), m_v53scu.target()), write8smo_delegate(FUNC(v53_scu_device::command_w), m_v53scu.target()), 0x00ff);
+ space(AS_IO).install_write_handler(base+0x04, base+0x05, write8smo_delegate(FUNC(v53_scu_device::mode_w), m_v53scu.target()), 0x00ff);
space(AS_IO).install_readwrite_handler(base+0x06, base+0x07, read8_delegate(FUNC(v53_base_device::scu_simk_r), this), write8_delegate(FUNC(v53_base_device::scu_simk_w), this), 0x00ff);
}
diff --git a/src/devices/cpu/psx/psx.cpp b/src/devices/cpu/psx/psx.cpp
index 8c1f4977990..1ea5787328d 100644
--- a/src/devices/cpu/psx/psx.cpp
+++ b/src/devices/cpu/psx/psx.cpp
@@ -3462,11 +3462,11 @@ MACHINE_CONFIG_START(psxcpu_device::device_add_mconfig)
MCFG_PSX_RCNT_IRQ1_HANDLER( WRITELINE( "irq", psxirq_device, intin5 ) )
MCFG_PSX_RCNT_IRQ2_HANDLER( WRITELINE( "irq", psxirq_device, intin6 ) )
- MCFG_DEVICE_ADD( "sio0", PSX_SIO0, 0 )
- MCFG_PSX_SIO_IRQ_HANDLER( WRITELINE( "irq", psxirq_device, intin7 ) )
+ auto &sio0(PSX_SIO0(config, "sio0", DERIVED_CLOCK(1, 2)));
+ sio0.irq_handler().set("irq", FUNC(psxirq_device::intin7));
- MCFG_DEVICE_ADD( "sio1", PSX_SIO1, 0 )
- MCFG_PSX_SIO_IRQ_HANDLER( WRITELINE( "irq", psxirq_device, intin8 ) )
+ auto &sio1(PSX_SIO1(config, "sio1", DERIVED_CLOCK(1, 2)));
+ sio1.irq_handler().set("irq", FUNC(psxirq_device::intin8));
RAM( config, "ram" ).set_default_value( 0x00 );
MACHINE_CONFIG_END
diff --git a/src/devices/cpu/psx/sio.h b/src/devices/cpu/psx/sio.h
index 0548480abeb..7e02b57330f 100644
--- a/src/devices/cpu/psx/sio.h
+++ b/src/devices/cpu/psx/sio.h
@@ -16,21 +16,6 @@
DECLARE_DEVICE_TYPE(PSX_SIO0, psxsio0_device)
DECLARE_DEVICE_TYPE(PSX_SIO1, psxsio1_device)
-#define MCFG_PSX_SIO_IRQ_HANDLER(_devcb) \
- downcast<psxsio_device &>(*device).set_irq_handler(DEVCB_##_devcb);
-
-#define MCFG_PSX_SIO_SCK_HANDLER(_devcb) \
- downcast<psxsio_device &>(*device).set_sck_handler(DEVCB_##_devcb);
-
-#define MCFG_PSX_SIO_TXD_HANDLER(_devcb) \
- downcast<psxsio_device &>(*device).set_txd_handler(DEVCB_##_devcb);
-
-#define MCFG_PSX_SIO_DTR_HANDLER(_devcb) \
- downcast<psxsio_device &>(*device).set_dtr_handler(DEVCB_##_devcb);
-
-#define MCFG_PSX_SIO_RTS_HANDLER(_devcb) \
- downcast<psxsio_device &>(*device).set_rts_handler(DEVCB_##_devcb);
-
#define SIO_BUF_SIZE ( 8 )
#define SIO_STATUS_TX_RDY ( 1 << 0 )
@@ -52,11 +37,11 @@ class psxsio_device : public device_t
{
public:
// configuration helpers
- template <class Object> devcb_base &set_irq_handler(Object &&cb) { return m_irq_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_sck_handler(Object &&cb) { return m_sck_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_txd_handler(Object &&cb) { return m_txd_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_dtr_handler(Object &&cb) { return m_dtr_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_rts_handler(Object &&cb) { return m_rts_handler.set_callback(std::forward<Object>(cb)); }
+ auto irq_handler() { return m_irq_handler.bind(); }
+ auto sck_handler() { return m_sck_handler.bind(); }
+ auto txd_handler() { return m_txd_handler.bind(); }
+ auto dtr_handler() { return m_dtr_handler.bind(); }
+ auto rts_handler() { return m_rts_handler.bind(); }
DECLARE_WRITE32_MEMBER( write );
DECLARE_READ32_MEMBER( read );
diff --git a/src/devices/cpu/sparc/mb86901.cpp b/src/devices/cpu/sparc/mb86901.cpp
index ec7671333d7..fad89cf9610 100644
--- a/src/devices/cpu/sparc/mb86901.cpp
+++ b/src/devices/cpu/sparc/mb86901.cpp
@@ -184,9 +184,12 @@ void mb86901_device::device_start()
m_alu_op3_assigned[OP3_WRTBR] = true;
m_alu_op3_assigned[OP3_FPOP1] = true;
m_alu_op3_assigned[OP3_FPOP2] = true;
+ m_alu_op3_assigned[OP3_CPOP1] = true;
+ m_alu_op3_assigned[OP3_CPOP2] = true;
m_alu_op3_assigned[OP3_JMPL] = true;
m_alu_op3_assigned[OP3_RETT] = true;
m_alu_op3_assigned[OP3_TICC] = true;
+ m_alu_op3_assigned[OP3_IFLUSH] = true;
m_alu_op3_assigned[OP3_SAVE] = true;
m_alu_op3_assigned[OP3_RESTORE] = true;
#if SPARCV8
@@ -198,8 +201,6 @@ void mb86901_device::device_start()
m_alu_op3_assigned[OP3_SMULCC] = true;
m_alu_op3_assigned[OP3_UDIVCC] = true;
m_alu_op3_assigned[OP3_SDIVCC] = true;
- m_alu_op3_assigned[OP3_CPOP1] = true;
- m_alu_op3_assigned[OP3_CPOP2] = true;
#endif
m_program = &space(AS_PROGRAM);
@@ -1489,6 +1490,10 @@ void mb86901_device::execute_group2(uint32_t op)
execute_ticc(op);
break;
+ case OP3_IFLUSH:
+ // Ignored
+ break;
+
case OP3_SAVE:
case OP3_RESTORE:
execute_saverestore(op);
@@ -2941,7 +2946,7 @@ void mb86901_device::execute_step()
m_execute_mode = 0;
m_error_mode = 0;
m_reset_mode = 1;
- printf("Entering reset mode\n");
+ //printf("Entering reset mode\n");
return;
}
else if ((PSR & PSR_ET_MASK) && (m_bp_irl == 15 || m_bp_irl > ((PSR & PSR_PIL_MASK) >> PSR_PIL_SHIFT)))
@@ -3028,7 +3033,7 @@ void mb86901_device::reset_step()
m_execute_mode = 1;
m_trap = 1;
m_reset_trap = 1;
- printf("m_bp_reset_in is false, resetting\n");
+ //printf("m_bp_reset_in is false, resetting\n");
}
}
diff --git a/src/devices/cpu/sparc/sparcdefs.h b/src/devices/cpu/sparc/sparcdefs.h
index 823fb3e52f3..b3ebb95d589 100644
--- a/src/devices/cpu/sparc/sparcdefs.h
+++ b/src/devices/cpu/sparc/sparcdefs.h
@@ -208,6 +208,7 @@
#define OP3_JMPL 56
#define OP3_RETT 57
#define OP3_TICC 58
+#define OP3_IFLUSH 59
#define OP3_SAVE 60
#define OP3_RESTORE 61
diff --git a/src/devices/cpu/sparc/sparcv8ops.ipp b/src/devices/cpu/sparc/sparcv8ops.ipp
index 28149ef6778..b2611d694f2 100644
--- a/src/devices/cpu/sparc/sparcv8ops.ipp
+++ b/src/devices/cpu/sparc/sparcv8ops.ipp
@@ -245,7 +245,7 @@ void mb86901_device::execute_div(uint32_t op)
{
uint32_t result = 0;
bool temp_v = false;
- int64_t temp_64bit;
+ int64_t temp_64bit = 0;
if (UDIV || UDIVCC)
{
temp_64bit = int64_t(uint64_t((uint64_t(Y) << 32) | uint64_t(RS1REG)) / operand2);
diff --git a/src/devices/machine/i8251.cpp b/src/devices/machine/i8251.cpp
index d10c724a8f9..da883cd7b06 100644
--- a/src/devices/machine/i8251.cpp
+++ b/src/devices/machine/i8251.cpp
@@ -561,7 +561,7 @@ void i8251_device::mode_w(uint8_t data)
}
}
-WRITE8_MEMBER(i8251_device::control_w)
+void i8251_device::control_w(uint8_t data)
{
if (m_flags & I8251_EXPECTING_MODE)
{
@@ -599,7 +599,7 @@ WRITE8_MEMBER(i8251_device::control_w)
status_r
-------------------------------------------------*/
-READ8_MEMBER(i8251_device::status_r)
+uint8_t i8251_device::status_r()
{
uint8_t status = (m_dsr << 7) | m_status;
@@ -613,7 +613,7 @@ READ8_MEMBER(i8251_device::status_r)
data_w
-------------------------------------------------*/
-WRITE8_MEMBER(i8251_device::data_w)
+void i8251_device::data_w(uint8_t data)
{
m_tx_data = data;
@@ -666,7 +666,7 @@ void i8251_device::receive_character(uint8_t ch)
data_r - read data
-------------------------------------------------*/
-READ8_MEMBER(i8251_device::data_r)
+uint8_t i8251_device::data_r()
{
LOG("read data: %02x, STATUS=%02x\n",m_rx_data,m_status);
/* reading clears */
@@ -677,6 +677,23 @@ READ8_MEMBER(i8251_device::data_r)
}
+uint8_t i8251_device::read(offs_t offset)
+{
+ if (BIT(offset, 0))
+ return status_r();
+ else
+ return data_r();
+}
+
+void i8251_device::write(offs_t offset, uint8_t data)
+{
+ if (BIT(offset, 0))
+ control_w(data);
+ else
+ data_w(data);
+}
+
+
WRITE_LINE_MEMBER(i8251_device::write_rxd)
{
m_rxd = state;
@@ -723,13 +740,3 @@ READ_LINE_MEMBER(i8251_device::txrdy_r)
{
return is_tx_enabled() && (m_status & I8251_STATUS_TX_READY) != 0;
}
-
-WRITE8_MEMBER(v53_scu_device::command_w)
-{
- i8251_device::command_w(data);
-}
-
-WRITE8_MEMBER(v53_scu_device::mode_w)
-{
- i8251_device::mode_w(data);
-}
diff --git a/src/devices/machine/i8251.h b/src/devices/machine/i8251.h
index 2cf0e67cea6..4a9f7bb3eba 100644
--- a/src/devices/machine/i8251.h
+++ b/src/devices/machine/i8251.h
@@ -38,10 +38,13 @@ public:
auto txempty_handler() { return m_txempty_handler.bind(); }
auto syndet_handler() { return m_syndet_handler.bind(); }
- DECLARE_READ8_MEMBER(data_r);
- DECLARE_WRITE8_MEMBER(data_w);
- DECLARE_READ8_MEMBER(status_r);
- DECLARE_WRITE8_MEMBER(control_w);
+ uint8_t data_r();
+ void data_w(uint8_t data);
+ uint8_t status_r();
+ void control_w(uint8_t data);
+
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
DECLARE_WRITE_LINE_MEMBER( write_rxd );
DECLARE_WRITE_LINE_MEMBER( write_cts );
@@ -141,8 +144,8 @@ public:
// construction/destruction
v53_scu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_WRITE8_MEMBER(command_w);
- DECLARE_WRITE8_MEMBER(mode_w);
+ void command_w(uint8_t data) { i8251_device::command_w(data); }
+ void mode_w(uint8_t data) { i8251_device::mode_w(data); }
};
diff --git a/src/devices/machine/i8271.cpp b/src/devices/machine/i8271.cpp
index 243a73b3c6e..bd374a6da6c 100644
--- a/src/devices/machine/i8271.cpp
+++ b/src/devices/machine/i8271.cpp
@@ -163,6 +163,24 @@ void i8271_device::set_rate(int rate)
cur_rate = rate;
}
+READ8_MEMBER(i8271_device::read)
+{
+ switch(offset & 0x03) {
+ case 0x00: return sr_r(space, 0);
+ case 0x01: return rr_r(space, 0);
+ }
+ return 0xff;
+}
+
+WRITE8_MEMBER(i8271_device::write)
+{
+ switch(offset & 0x03) {
+ case 0x00: cmd_w(space, 0, data); break;
+ case 0x01: param_w(space, 0, data); break;
+ case 0x02: reset_w(space, 0, data); break;
+ }
+}
+
READ8_MEMBER(i8271_device::data_r)
{
set_drq(false);
diff --git a/src/devices/machine/i8271.h b/src/devices/machine/i8271.h
index 86a32365fc0..00342f38e4d 100644
--- a/src/devices/machine/i8271.h
+++ b/src/devices/machine/i8271.h
@@ -23,6 +23,8 @@ public:
auto hdl_wr_callback() { return hdl_cb.bind(); }
auto opt_wr_callback() { return opt_cb.bind(); }
+ DECLARE_READ8_MEMBER(read);
+ DECLARE_WRITE8_MEMBER(write);
DECLARE_READ8_MEMBER (data_r);
DECLARE_WRITE8_MEMBER(data_w);
diff --git a/src/devices/machine/nscsi_bus.cpp b/src/devices/machine/nscsi_bus.cpp
index f8be56e50a7..b8e2e878a52 100644
--- a/src/devices/machine/nscsi_bus.cpp
+++ b/src/devices/machine/nscsi_bus.cpp
@@ -6,8 +6,9 @@
#define LOG_GENERAL (1U << 0)
#define LOG_STATE (1U << 1)
#define LOG_CONTROL (1U << 2)
+#define LOG_DATA (1U << 3)
-//#define VERBOSE (LOG_GENERAL | LOG_STATE | LOG_CONTROL)
+//#define VERBOSE (LOG_GENERAL | LOG_STATE | LOG_CONTROL | LOG_DATA)
#define VERBOSE (LOG_GENERAL)
#include "logmacro.h"
@@ -465,6 +466,7 @@ uint8_t nscsi_full_device::scsi_get_data(int id, int pos)
{
switch(id) {
case SBUF_MAIN:
+ LOGMASKED(LOG_DATA, "scsi_get_data MAIN, id:%d pos:%d data:%02x %c\n", id, pos, scsi_cmdbuf[pos], scsi_cmdbuf[pos] >= 0x20 && scsi_cmdbuf[pos] < 0x7f ? (char)scsi_cmdbuf[pos] : ' ');
return scsi_cmdbuf[pos];
case SBUF_SENSE:
return scsi_sense_buffer[pos];
@@ -477,6 +479,7 @@ void nscsi_full_device::scsi_put_data(int id, int pos, uint8_t data)
{
switch(id) {
case SBUF_MAIN:
+ LOGMASKED(LOG_DATA, "nscsi_bus: scsi_put_data MAIN, id:%d pos:%d data:%02x %c\n", id, pos, data, data >= 0x20 && data < 0x7f ? (char)data : ' ');
scsi_cmdbuf[pos] = data;
break;
case SBUF_SENSE:
diff --git a/src/devices/machine/nscsi_hd.cpp b/src/devices/machine/nscsi_hd.cpp
index cc6c9e2167c..15824d1679d 100644
--- a/src/devices/machine/nscsi_hd.cpp
+++ b/src/devices/machine/nscsi_hd.cpp
@@ -6,6 +6,7 @@
#define LOG_GENERAL (1U << 0)
#define LOG_COMMAND (1U << 1)
+#define LOG_DATA (1U << 2)
#define VERBOSE (LOG_GENERAL)
@@ -60,21 +61,30 @@ MACHINE_CONFIG_END
uint8_t nscsi_harddisk_device::scsi_get_data(int id, int pos)
{
+ uint8_t data = 0;
if(id != 2)
- return nscsi_full_device::scsi_get_data(id, pos);
- int clba = lba + pos / bytes_per_sector;
- if(clba != cur_lba) {
- cur_lba = clba;
- if(!hard_disk_read(harddisk, cur_lba, block)) {
- LOG("HD READ ERROR !\n");
- memset(block, 0, sizeof(block));
+ {
+ data = nscsi_full_device::scsi_get_data(id, pos);
+ }
+ else
+ {
+ int clba = lba + pos / bytes_per_sector;
+ if(clba != cur_lba) {
+ cur_lba = clba;
+ if(!hard_disk_read(harddisk, cur_lba, block)) {
+ LOG("HD READ ERROR !\n");
+ memset(block, 0, sizeof(block));
+ }
}
+ data = block[pos % bytes_per_sector];
}
- return block[pos % bytes_per_sector];
+ LOGMASKED(LOG_DATA, "nscsi_hd: scsi_get_data, id:%d pos:%d data:%02x %c\n", id, pos, data, data >= 0x20 && data < 0x7f ? (char)data : ' ');
+ return data;
}
void nscsi_harddisk_device::scsi_put_data(int id, int pos, uint8_t data)
{
+ LOGMASKED(LOG_DATA, "nscsi_hd: scsi_put_data, id:%d pos:%d data:%02x %c\n", id, pos, data, data >= 0x20 && data < 0x7f ? (char)data : ' ');
if(id != 2) {
nscsi_full_device::scsi_put_data(id, pos, data);
return;
@@ -328,7 +338,7 @@ void nscsi_harddisk_device::scsi_command()
}
case SC_START_STOP_UNIT:
- LOG("command START STOP UNIT\n");
+ LOG("command %s UNIT\n", (scsi_cmdbuf[4] & 0x1) ? "START" : "STOP");
scsi_status_complete(SS_GOOD);
break;
diff --git a/src/devices/machine/timekpr.cpp b/src/devices/machine/timekpr.cpp
index aa7febbf9d4..c9db679e13c 100644
--- a/src/devices/machine/timekpr.cpp
+++ b/src/devices/machine/timekpr.cpp
@@ -18,6 +18,12 @@
#include "machine/timekpr.h"
#include "machine/timehelp.h"
+#define LOG_GENERAL (1U << 0)
+#define LOG_TICKS (1U << 1)
+
+#define VERBOSE (0)
+#include "logmacro.h"
+
// device type definition
DEFINE_DEVICE_TYPE(M48T02, m48t02_device, "m48t02", "M48T02 Timekeeper")
DEFINE_DEVICE_TYPE(M48T35, m48t35_device, "m48t35", "M48T35 Timekeeper")
@@ -274,7 +280,7 @@ void timekeeper_device::counters_from_ram()
void timekeeper_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
- logerror("Tick\n");
+ LOGMASKED(LOG_TICKS, "Tick\n");
if( ( m_seconds & SECONDS_ST ) != 0 ||
( m_control & CONTROL_W ) != 0 )
{
@@ -370,7 +376,7 @@ WRITE8_MEMBER(timekeeper_device::watchdog_write)
WRITE8_MEMBER( timekeeper_device::write )
{
- logerror("timekeeper_device::write: %04x = %02x\n", offset, data);
+ LOGMASKED(LOG_GENERAL, "timekeeper_device::write: %04x = %02x\n", offset, data);
if( offset == m_offset_control )
{
if( ( m_control & CONTROL_W ) != 0 &&
@@ -429,7 +435,7 @@ READ8_MEMBER( timekeeper_device::read )
m_reset_cb(CLEAR_LINE);
m_irq_cb(CLEAR_LINE);
}
- logerror("timekeeper_device::read: %04x (%02x)\n", offset, result);
+ LOGMASKED(LOG_GENERAL, "timekeeper_device::read: %04x (%02x)\n", offset, result);
return result;
}
diff --git a/src/devices/machine/tube.h b/src/devices/machine/tube.h
index 17223d22f84..c8d94b1c7a7 100644
--- a/src/devices/machine/tube.h
+++ b/src/devices/machine/tube.h
@@ -14,27 +14,6 @@
//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_TUBE_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, TUBE, 0);
-
-#define MCFG_TUBE_HIRQ_HANDLER(_devcb) \
- downcast<tube_device &>(*device).set_hirq_handler(DEVCB_##_devcb);
-
-#define MCFG_TUBE_PNMI_HANDLER(_devcb) \
- downcast<tube_device &>(*device).set_pnmi_handler(DEVCB_##_devcb);
-
-#define MCFG_TUBE_PIRQ_HANDLER(_devcb) \
- downcast<tube_device &>(*device).set_pirq_handler(DEVCB_##_devcb);
-
-#define MCFG_TUBE_DRQ_HANDLER(_devcb) \
- downcast<tube_device &>(*device).set_drq_handler(DEVCB_##_devcb);
-
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -45,13 +24,9 @@ class tube_device : public device_t
{
public:
// construction/destruction
- tube_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ tube_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
// callbacks
- template <class Object> devcb_base &set_hirq_handler(Object &&cb) { return m_hirq_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_pnmi_handler(Object &&cb) { return m_pnmi_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_pirq_handler(Object &&cb) { return m_pirq_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_drq_handler(Object &&cb) { return m_drq_handler.set_callback(std::forward<Object>(cb)); }
auto hirq_handler() { return m_hirq_handler.bind(); }
auto pnmi_handler() { return m_pnmi_handler.bind(); }
auto pirq_handler() { return m_pirq_handler.bind(); }
diff --git a/src/devices/sound/2608intf.cpp b/src/devices/sound/2608intf.cpp
index 4dc5bedf02f..1445de91f37 100644
--- a/src/devices/sound/2608intf.cpp
+++ b/src/devices/sound/2608intf.cpp
@@ -85,8 +85,6 @@ void ym2608_device::device_start()
ay8910_device::device_start();
int rate = clock()/72;
- void *pcmbufa;
- int pcmsizea;
m_irq_handler.resolve();
@@ -96,14 +94,12 @@ void ym2608_device::device_start()
/* stream system initialize */
m_stream = machine().sound().stream_alloc(*this,0,2,rate, stream_update_delegate(&ym2608_device::stream_generate,this));
- /* setup adpcm buffers */
- pcmbufa = m_region->base();
- pcmsizea = m_region->bytes();
/* initialize YM2608 */
m_chip = ym2608_init(this,clock(),rate,
- pcmbufa,pcmsizea,
- &ym2608_device::static_timer_handler,&ym2608_device::static_irq_handler,&psgintf);
+ &ym2608_device::static_internal_read_byte,
+ &ym2608_device::static_external_read_byte, &ym2608_device::static_external_write_byte,
+ &ym2608_device::static_timer_handler,&ym2608_device::static_irq_handler,&psgintf);
assert_always(m_chip != nullptr, "Error creating YM2608 chip");
}
@@ -135,6 +131,15 @@ void ym2608_device::device_reset()
ym2608_reset_chip(m_chip);
}
+//-------------------------------------------------
+// rom_bank_updated
+//-------------------------------------------------
+
+void ym2608_device::rom_bank_updated()
+{
+ m_stream->update();
+}
+
READ8_MEMBER( ym2608_device::read )
{
@@ -150,16 +155,17 @@ DEFINE_DEVICE_TYPE(YM2608, ym2608_device, "ym2608", "YM2608 OPNA")
ym2608_device::ym2608_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: ay8910_device(mconfig, YM2608, tag, owner, clock, PSG_TYPE_YM, 1, 2)
+ , device_rom_interface(mconfig, *this, 21)
, m_stream(nullptr)
, m_timer{ nullptr, nullptr }
, m_chip(nullptr)
, m_irq_handler(*this)
- , m_region(*this, DEVICE_SELF)
+ , m_internal(*this, "internal")
{
}
ROM_START( ym2608 )
- ROM_REGION( 0x2000, "ym2608", 0 )
+ ROM_REGION( 0x2000, "internal", 0 )
/*
This data is derived from the chip's output - internal ROM can't be read.
It was verified, using real YM2608, that this ADPCM stream produces 100% correct output signal.
diff --git a/src/devices/sound/2608intf.h b/src/devices/sound/2608intf.h
index d3ba76506ee..de64a23245b 100644
--- a/src/devices/sound/2608intf.h
+++ b/src/devices/sound/2608intf.h
@@ -14,7 +14,8 @@ struct ssg_callbacks;
#define MCFG_YM2608_IRQ_HANDLER(cb) \
downcast<ym2608_device &>(*device).set_irq_handler(DEVCB_##cb);
-class ym2608_device : public ay8910_device
+class ym2608_device : public ay8910_device,
+ public device_rom_interface
{
public:
ym2608_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
@@ -38,6 +39,8 @@ protected:
virtual void device_stop() override;
virtual void device_reset() override;
+ virtual void rom_bank_updated() override;
+
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
void stream_generate(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples);
@@ -46,6 +49,10 @@ private:
void timer_handler(int c, int count, int clock);
void update_request() { m_stream->update(); }
+ static uint8_t static_external_read_byte(device_t *param, offs_t offset) { return downcast<ym2608_device *>(param)->read_byte(offset); }
+ static void static_external_write_byte(device_t *param, offs_t offset, uint8_t data) { return downcast<ym2608_device *>(param)->space().write_byte(offset, data); }
+ static uint8_t static_internal_read_byte(device_t *param, offs_t offset) { return downcast<ym2608_device *>(param)->m_internal->as_u8(offset % downcast<ym2608_device *>(param)->m_internal->bytes()); };
+
static void static_irq_handler(device_t *param, int irq) { downcast<ym2608_device *>(param)->irq_handler(irq); }
static void static_timer_handler(device_t *param, int c, int count, int clock) { downcast<ym2608_device *>(param)->timer_handler(c, count, clock); }
@@ -54,7 +61,7 @@ private:
emu_timer * m_timer[2];
void * m_chip;
devcb_write_line m_irq_handler;
- required_memory_region m_region;
+ required_memory_region m_internal;
static const ssg_callbacks psgintf;
};
diff --git a/src/devices/sound/2610intf.cpp b/src/devices/sound/2610intf.cpp
index 6b2e2886d8c..84598507274 100644
--- a/src/devices/sound/2610intf.cpp
+++ b/src/devices/sound/2610intf.cpp
@@ -17,9 +17,6 @@
#include "2610intf.h"
#include "fm.h"
-char const *const ym2610_device::YM2610_TAG = "ymsnd";
-char const *const ym2610_device::YM2610_DELTAT_TAG = "ymsnd.deltat";
-
const ssg_callbacks ym2610_device::psgintf =
{
&ym2610_device::psg_set_clock,
@@ -107,24 +104,21 @@ void ym2610_device::device_start()
/* stream system initialize */
m_stream = machine().sound().stream_alloc(*this,0,2,rate, stream_update_delegate(&ym2610_device::stream_generate,this));
- /* setup adpcm buffers */
- void *pcmbufa = m_region->base();
- int pcmsizea = m_region->bytes();
-
- std::string name = tag() + std::string(".deltat");
- memory_region *deltat_region = machine().root_device().memregion(name.c_str());
- void *pcmbufb = pcmbufa;
- int pcmsizeb = pcmsizea;
- if (deltat_region != nullptr && deltat_region->base() != nullptr && deltat_region->bytes() != 0)
+ if (!has_configured_map(0) && !has_configured_map(1))
{
- pcmbufb = deltat_region->base();
- pcmsizeb = deltat_region->bytes();
+ if (m_adpcm_a_region)
+ space(0).install_rom(0, m_adpcm_a_region->bytes() - 1, m_adpcm_a_region->base());
+
+ if (m_adpcm_b_region)
+ space(1).install_rom(0, m_adpcm_b_region->bytes() - 1, m_adpcm_b_region->base());
+ else if (m_adpcm_a_region)
+ space(1).install_rom(0, m_adpcm_a_region->bytes() - 1, m_adpcm_a_region->base());
}
/**** initialize YM2610 ****/
- m_chip = ym2610_init(this,clock(),rate,
- pcmbufa,pcmsizea,pcmbufb,pcmsizeb,
- &ym2610_device::static_timer_handler,&ym2610_device::static_irq_handler,&psgintf);
+ m_chip = ym2610_init(this, clock(), rate,
+ &ym2610_device::static_adpcm_a_read_byte, &ym2610_device::static_adpcm_b_read_byte,
+ &ym2610_device::static_timer_handler, &ym2610_device::static_irq_handler, &psgintf);
assert_always(m_chip != nullptr, "Error creating YM2610 chip");
}
@@ -156,6 +150,19 @@ void ym2610_device::device_reset()
ym2610_reset_chip(m_chip);
}
+//-------------------------------------------------
+// memory_space_config - return a description of
+// any address spaces owned by this device
+//-------------------------------------------------
+
+device_memory_interface::space_config_vector ym2610_device::memory_space_config() const
+{
+ return space_config_vector{
+ std::make_pair(0, &m_adpcm_a_config),
+ std::make_pair(1, &m_adpcm_b_config)
+ };
+}
+
READ8_MEMBER( ym2610_device::read )
{
@@ -177,10 +184,15 @@ ym2610_device::ym2610_device(const machine_config &mconfig, const char *tag, dev
ym2610_device::ym2610_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
: ay8910_device(mconfig, type, tag, owner, clock, PSG_TYPE_YM, 1, 0)
+ , device_memory_interface(mconfig, *this)
+ , m_adpcm_a_config("adpcm-a", ENDIANNESS_LITTLE, 8, 24, 0)
+ , m_adpcm_b_config("adpcm-b", ENDIANNESS_LITTLE, 8, 24, 0)
, m_stream(nullptr)
, m_timer{ nullptr, nullptr }
, m_irq_handler(*this)
- , m_region(*this, DEVICE_SELF)
+ , m_adpcm_b_region_name("^" + std::string(basetag()) + ".deltat")
+ , m_adpcm_a_region(*this, DEVICE_SELF)
+ , m_adpcm_b_region(*this, m_adpcm_b_region_name.c_str())
{
}
diff --git a/src/devices/sound/2610intf.h b/src/devices/sound/2610intf.h
index 583091a666b..9f9dc69c123 100644
--- a/src/devices/sound/2610intf.h
+++ b/src/devices/sound/2610intf.h
@@ -14,7 +14,8 @@ struct ssg_callbacks;
#define MCFG_YM2610_IRQ_HANDLER(cb) \
downcast<ym2610_device &>(*device).set_irq_handler((DEVCB_##cb));
-class ym2610_device : public ay8910_device
+class ym2610_device : public ay8910_device,
+ public device_memory_interface
{
public:
ym2610_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
@@ -23,15 +24,14 @@ public:
template <class Object> devcb_base &set_irq_handler(Object &&cb) { return m_irq_handler.set_callback(std::forward<Object>(cb)); }
auto irq_handler() { return m_irq_handler.bind(); }
+ virtual space_config_vector memory_space_config() const override;
+
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
// update request from fm.cpp
static void update_request(device_t *param) { downcast<ym2610_device *>(param)->update_request(); }
- static char const *const YM2610_TAG;
- static char const *const YM2610_DELTAT_TAG;
-
protected:
ym2610_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
@@ -53,14 +53,21 @@ private:
void timer_handler(int c, int count, int clock);
void update_request() { m_stream->update(); }
+ static uint8_t static_adpcm_a_read_byte(device_t *param, offs_t offset) { return downcast<ym2610_device *>(param)->space(0).read_byte(offset); }
+ static uint8_t static_adpcm_b_read_byte(device_t *param, offs_t offset) { return downcast<ym2610_device *>(param)->space(1).read_byte(offset); }
+
static void static_irq_handler(device_t *param, int irq) { downcast<ym2610_device *>(param)->irq_handler(irq); }
static void static_timer_handler(device_t *param, int c, int count, int clock) { downcast<ym2610_device *>(param)->timer_handler(c, count, clock); }
// internal state
+ const address_space_config m_adpcm_a_config;
+ const address_space_config m_adpcm_b_config;
sound_stream * m_stream;
emu_timer * m_timer[2];
devcb_write_line m_irq_handler;
- required_memory_region m_region;
+ const std::string m_adpcm_b_region_name;
+ optional_memory_region m_adpcm_a_region;
+ optional_memory_region m_adpcm_b_region;
static const ssg_callbacks psgintf;
};
diff --git a/src/devices/sound/8950intf.cpp b/src/devices/sound/8950intf.cpp
index da0049f0a91..f56f34c88f9 100644
--- a/src/devices/sound/8950intf.cpp
+++ b/src/devices/sound/8950intf.cpp
@@ -84,7 +84,7 @@ void y8950_device::device_start()
assert_always(m_chip != nullptr, "Error creating Y8950 chip");
/* ADPCM ROM data */
- y8950_set_delta_t_memory(m_chip, m_region->base(), m_region->bytes());
+ y8950_set_delta_t_memory(m_chip, &y8950_device::static_read_byte, &y8950_device::static_write_byte);
m_stream = machine().sound().stream_alloc(*this,0,1,rate);
/* port and keyboard handler */
@@ -128,6 +128,15 @@ void y8950_device::device_reset()
y8950_reset_chip(m_chip);
}
+//-------------------------------------------------
+// rom_bank_updated
+//-------------------------------------------------
+
+void y8950_device::rom_bank_updated()
+{
+ m_stream->update();
+}
+
READ8_MEMBER( y8950_device::read )
{
@@ -150,6 +159,7 @@ DEFINE_DEVICE_TYPE(Y8950, y8950_device, "y8950", "Y8950 MSX-Audio")
y8950_device::y8950_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, Y8950, tag, owner, clock)
, device_sound_interface(mconfig, *this)
+ , device_rom_interface(mconfig, *this, 21)
, m_stream(nullptr)
, m_timer{ nullptr, nullptr }
, m_chip(nullptr)
@@ -158,6 +168,5 @@ y8950_device::y8950_device(const machine_config &mconfig, const char *tag, devic
, m_keyboard_write_handler(*this)
, m_io_read_handler(*this)
, m_io_write_handler(*this)
- , m_region(*this, DEVICE_SELF)
{
}
diff --git a/src/devices/sound/8950intf.h b/src/devices/sound/8950intf.h
index c1f3163a9ee..258e27ccdb2 100644
--- a/src/devices/sound/8950intf.h
+++ b/src/devices/sound/8950intf.h
@@ -21,7 +21,9 @@
#define MCFG_Y8950_IO_WRITE_HANDLER(cb) \
downcast<y8950_device &>(*device).set_io_write_handler((DEVCB_##cb));
-class y8950_device : public device_t, public device_sound_interface
+class y8950_device : public device_t,
+ public device_sound_interface,
+ public device_rom_interface
{
public:
y8950_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
@@ -48,6 +50,8 @@ protected:
virtual void device_stop() override;
virtual void device_reset() override;
+ virtual void rom_bank_updated() override;
+
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
// sound stream update overrides
@@ -63,6 +67,9 @@ private:
unsigned char keyboard_handler_r() { return m_keyboard_read_handler(0); }
void keyboard_handler_w(unsigned char data) { m_keyboard_write_handler(offs_t(0), data); }
+ static uint8_t static_read_byte(device_t *param, offs_t offset) { return downcast<y8950_device *>(param)->read_byte(offset); }
+ static void static_write_byte(device_t *param, offs_t offset, uint8_t data) { return downcast<y8950_device *>(param)->space().write_byte(offset, data); }
+
static void static_irq_handler(device_t *param, int irq) { downcast<y8950_device *>(param)->irq_handler(irq); }
static void static_timer_handler(device_t *param, int c, const attotime &period) { downcast<y8950_device *>(param)->timer_handler(c, period); }
static void static_update_request(device_t *param, int interval) { downcast<y8950_device *>(param)->update_request(); }
@@ -81,7 +88,6 @@ private:
devcb_write8 m_keyboard_write_handler;
devcb_read8 m_io_read_handler;
devcb_write8 m_io_write_handler;
- required_memory_region m_region;
};
DECLARE_DEVICE_TYPE(Y8950, y8950_device)
diff --git a/src/devices/sound/fm.cpp b/src/devices/sound/fm.cpp
index e93d009f65f..8f679e99357 100644
--- a/src/devices/sound/fm.cpp
+++ b/src/devices/sound/fm.cpp
@@ -2441,8 +2441,7 @@ struct ym2610_state
uint8_t addr_A1; /* address line A1 */
/* ADPCM-A unit */
- const uint8_t *pcmbuf; /* pcm rom buffer */
- uint32_t pcm_size; /* size of pcm rom */
+ FM_READBYTE read_byte;
uint8_t adpcmTL; /* adpcmA total level */
ADPCM_CH adpcm[6]; /* adpcm channels */
uint32_t adpcmreg[0x30]; /* registers */
@@ -2492,7 +2491,7 @@ struct ym2610_state
data = ch->now_data & 0x0f;
else
{
- ch->now_data = *(pcmbuf+(ch->now_addr>>1));
+ ch->now_data = read_byte(device, ch->now_addr>>1);
data = (ch->now_data >> 4) & 0x0f;
}
@@ -2543,25 +2542,6 @@ struct ym2610_state
adpcm[c].adpcm_step= 0;
adpcm[c].adpcm_out = 0;
adpcm[c].flag = 1;
-
- if(pcmbuf==nullptr)
- { /* Check ROM Mapped */
- device->logerror("YM2608-YM2610: ADPCM-A rom not mapped\n");
- adpcm[c].flag = 0;
- }
- else
- {
- if(adpcm[c].end >= pcm_size)
- { /* Check End in Range */
- device->logerror("YM2610: ADPCM-A end out of range: $%08x\n",adpcm[c].end);
- /*adpcm[c].end = pcm_size-1;*/ /* JB: DO NOT uncomment this, otherwise you will break the comparison in the ADPCM_CALC_CHA() */
- }
- if(adpcm[c].start >= pcm_size) /* Check Start in Range */
- {
- device->logerror("YM2608-YM2610: ADPCM-A start out of range: $%08x\n",adpcm[c].start);
- adpcm[c].flag = 0;
- }
- }
}
}
}
@@ -2959,8 +2939,10 @@ static void YM2608_deltat_status_reset(void *chip, uint8_t changebits)
FM_STATUS_RESET(&(F2608->OPN.ST), changebits);
}
/* YM2608(OPNA) */
-void * ym2608_init(device_t *device, int clock, int rate, void *pcmrom,int pcmsize,
- FM_TIMERHANDLER timer_handler,FM_IRQHANDLER IRQHandler, const ssg_callbacks *ssg)
+void * ym2608_init(device_t *device, int clock, int rate,
+ FM_READBYTE InternalReadByte,
+ FM_READBYTE ExternalReadByte, FM_WRITEBYTE ExternalWriteByte,
+ FM_TIMERHANDLER timer_handler,FM_IRQHANDLER IRQHandler, const ssg_callbacks *ssg)
{
ym2608_state *F2608;
@@ -2986,8 +2968,8 @@ void * ym2608_init(device_t *device, int clock, int rate, void *pcmrom,int pcmsi
F2608->OPN.ST.SSG = ssg;
/* DELTA-T */
- F2608->deltaT.memory = (uint8_t *)pcmrom;
- F2608->deltaT.memory_size = pcmsize;
+ F2608->deltaT.read_byte = ExternalReadByte;
+ F2608->deltaT.write_byte = ExternalWriteByte;
/*F2608->deltaT.write_time = 20.0 / clock;*/ /* a single byte write takes 20 cycles of main clock */
/*F2608->deltaT.read_time = 18.0 / clock;*/ /* a single byte read takes 18 cycles of main clock */
@@ -3000,8 +2982,7 @@ void * ym2608_init(device_t *device, int clock, int rate, void *pcmrom,int pcmsi
F2608->deltaT.status_change_ZERO_bit = 0x10; /* status flag: set bit4 if silence continues for more than 290 milliseconds while recording the ADPCM */
/* ADPCM Rhythm */
- F2608->pcmbuf = device->memregion("ym2608")->base();
- F2608->pcm_size = 0x2000;
+ F2608->read_byte = InternalReadByte;
Init_ADPCMATable();
@@ -3646,9 +3627,9 @@ static void YM2610_deltat_status_reset(void *chip, uint8_t changebits)
F2610->adpcm_arrivedEndAddress &= (~changebits);
}
-void *ym2610_init(device_t *device, int clock, int rate, void *pcmroma,int pcmsizea,void *pcmromb,int pcmsizeb,
- FM_TIMERHANDLER timer_handler,FM_IRQHANDLER IRQHandler, const ssg_callbacks *ssg)
-
+void *ym2610_init(device_t *device, int clock, int rate,
+ FM_READBYTE adpcm_a_read_byte, FM_READBYTE adpcm_b_read_byte,
+ FM_TIMERHANDLER timer_handler,FM_IRQHANDLER IRQHandler, const ssg_callbacks *ssg)
{
ym2610_state *F2610;
@@ -3673,11 +3654,10 @@ void *ym2610_init(device_t *device, int clock, int rate, void *pcmroma,int pcmsi
F2610->OPN.ST.IRQ_Handler = IRQHandler;
F2610->OPN.ST.SSG = ssg;
/* ADPCM */
- F2610->pcmbuf = (const uint8_t *)pcmroma;
- F2610->pcm_size = pcmsizea;
+ F2610->read_byte = adpcm_a_read_byte;
/* DELTA-T */
- F2610->deltaT.memory = (uint8_t *)pcmromb;
- F2610->deltaT.memory_size = pcmsizeb;
+ F2610->deltaT.read_byte = adpcm_b_read_byte;
+ F2610->deltaT.write_byte = nullptr;
F2610->deltaT.status_set_handler = YM2610_deltat_status_set;
F2610->deltaT.status_reset_handler = YM2610_deltat_status_reset;
@@ -3719,26 +3699,6 @@ void ym2610_reset_chip(void *chip)
device_t* dev = F2610->OPN.ST.device;
std::string name(dev->tag());
- /* setup PCM buffers again */
- F2610->pcmbuf = (const uint8_t *)dev->machine().root_device().memregion(name.c_str())->base();
- F2610->pcm_size = dev->machine().root_device().memregion(name.c_str())->bytes();
- name.append(".deltat");
- memory_region *deltat_region = dev->machine().root_device().memregion(name.c_str());
- F2610->deltaT.memory = nullptr;
- if (deltat_region != nullptr)
- {
- F2610->deltaT.memory = (uint8_t *)dev->machine().root_device().memregion(name.c_str())->base();
- }
- if(F2610->deltaT.memory == nullptr)
- {
- F2610->deltaT.memory = (uint8_t*)F2610->pcmbuf;
- F2610->deltaT.memory_size = F2610->pcm_size;
- }
- else
- {
- F2610->deltaT.memory_size = dev->machine().root_device().memregion(name.c_str())->bytes();
- }
-
/* Reset Prescaler */
OPNSetPres( OPN, 6*24, 6*24, 4*2); /* OPN 1/6 , SSG 1/4 */
/* reset SSG section */
diff --git a/src/devices/sound/fm.h b/src/devices/sound/fm.h
index 7b919ea7402..50b6b0d3d99 100644
--- a/src/devices/sound/fm.h
+++ b/src/devices/sound/fm.h
@@ -60,6 +60,8 @@ typedef unsigned char FMSAMPLE;
#endif
*/
+typedef uint8_t (*FM_READBYTE)(device_t *device, offs_t offset);
+typedef void(*FM_WRITEBYTE)(device_t *device, offs_t offset, uint8_t data);
typedef void (*FM_TIMERHANDLER)(device_t *device,int c,int cnt,int clock);
typedef void (*FM_IRQHANDLER)(device_t *device,int irq);
/* FM_TIMERHANDLER : Stop or Start timer */
@@ -134,8 +136,9 @@ void ym2203_postload(void *chip);
#if BUILD_YM2608
/* -------------------- YM2608(OPNA) Interface -------------------- */
void * ym2608_init(device_t *device, int baseclock, int rate,
- void *pcmroma,int pcmsizea,
- FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler, const ssg_callbacks *ssg);
+ FM_READBYTE InternalReadByte,
+ FM_READBYTE ExternalReadByte, FM_WRITEBYTE ExternalWriteByte,
+ FM_TIMERHANDLER TimerHandler, FM_IRQHANDLER IRQHandler, const ssg_callbacks *ssg);
void ym2608_clock_changed(void *chip, int clock, int rate);
void ym2608_shutdown(void *chip);
void ym2608_reset_chip(void *chip);
@@ -150,8 +153,8 @@ void ym2608_postload(void *chip);
#if (BUILD_YM2610||BUILD_YM2610B)
/* -------------------- YM2610(OPNB) Interface -------------------- */
void * ym2610_init(device_t *device, int baseclock, int rate,
- void *pcmroma,int pcmasize,void *pcmromb,int pcmbsize,
- FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler, const ssg_callbacks *ssg);
+ FM_READBYTE adpcm_a_read_byte, FM_READBYTE adpcm_b_read_byte,
+ FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler, const ssg_callbacks *ssg);
void ym2610_clock_changed(void *chip, int clock, int rate);
void ym2610_shutdown(void *chip);
void ym2610_reset_chip(void *chip);
diff --git a/src/devices/sound/fmopl.cpp b/src/devices/sound/fmopl.cpp
index c7390842710..99139310d69 100644
--- a/src/devices/sound/fmopl.cpp
+++ b/src/devices/sound/fmopl.cpp
@@ -70,8 +70,8 @@ Revision History:
*/
#include "emu.h"
-#include "ymdeltat.h"
#include "fmopl.h"
+#include "ymdeltat.h"
@@ -2477,11 +2477,11 @@ void y8950_set_update_handler(void *chip,OPL_UPDATEHANDLER UpdateHandler,device_
reinterpret_cast<FM_OPL *>(chip)->SetUpdateHandler(UpdateHandler, device);
}
-void y8950_set_delta_t_memory(void *chip, void * deltat_mem_ptr, int deltat_mem_size )
+void y8950_set_delta_t_memory(void *chip, FM_READBYTE read_byte, FM_WRITEBYTE write_byte)
{
FM_OPL *OPL = (FM_OPL *)chip;
- OPL->deltat->memory = (uint8_t *)(deltat_mem_ptr);
- OPL->deltat->memory_size = deltat_mem_size;
+ OPL->deltat->read_byte = read_byte;
+ OPL->deltat->write_byte = write_byte;
}
/*
diff --git a/src/devices/sound/fmopl.h b/src/devices/sound/fmopl.h
index 5da3f110830..add973a2369 100644
--- a/src/devices/sound/fmopl.h
+++ b/src/devices/sound/fmopl.h
@@ -26,6 +26,8 @@ typedef int8_t OPLSAMPLE;
#endif
*/
+typedef uint8_t (*FM_READBYTE)(device_t *device, offs_t offset);
+typedef void(*FM_WRITEBYTE)(device_t *device, offs_t offset, uint8_t data);
typedef void (*OPL_TIMERHANDLER)(device_t *device,int timer,const attotime &period);
typedef void (*OPL_IRQHANDLER)(device_t *device,int irq);
typedef void (*OPL_UPDATEHANDLER)(device_t *device,int min_interval_us);
@@ -89,7 +91,7 @@ void ym3526_set_update_handler(void *chip, OPL_UPDATEHANDLER UpdateHandler, devi
/* Y8950 port handlers */
void y8950_set_port_handler(void *chip, OPL_PORTHANDLER_W PortHandler_w, OPL_PORTHANDLER_R PortHandler_r, device_t *device);
void y8950_set_keyboard_handler(void *chip, OPL_PORTHANDLER_W KeyboardHandler_w, OPL_PORTHANDLER_R KeyboardHandler_r, device_t *device);
-void y8950_set_delta_t_memory(void *chip, void * deltat_mem_ptr, int deltat_mem_size );
+void y8950_set_delta_t_memory(void *chip, FM_READBYTE read_byte, FM_WRITEBYTE write_byte);
void * y8950_init(device_t *device, uint32_t clock, uint32_t rate);
void y8950_clock_changed(void *chip, uint32_t clock, uint32_t rate);
diff --git a/src/devices/sound/ymdeltat.cpp b/src/devices/sound/ymdeltat.cpp
index 29e05b4ef9e..ea13da9782b 100644
--- a/src/devices/sound/ymdeltat.cpp
+++ b/src/devices/sound/ymdeltat.cpp
@@ -121,7 +121,7 @@ uint8_t YM_DELTAT::ADPCM_Read()
if (now_addr != (end << 1))
{
- v = memory[now_addr>>1];
+ v = read_byte(device, now_addr>>1);
/*logerror("YM Delta-T memory read $%08x, v=$%02x\n", now_addr >> 1, v);*/
@@ -200,6 +200,7 @@ value: START, REC, MEMDAT, REPEAT, SPOFF, x,x,RESET meaning:
if (emulation_mode == EMULATION_MODE_YM2610)
{
v |= 0x20; /* YM2610 always uses external memory and doesn't even have memory flag bit. */
+ v &= ~0x40; /* YM2610 has no rec bit */
}
portstate = v & (0x80|0x40|0x20|0x10|0x01); /* start, rec, memory mode, repeat flag copy, reset(bit0) */
@@ -223,28 +224,6 @@ value: START, REC, MEMDAT, REPEAT, SPOFF, x,x,RESET meaning:
{
now_addr = start << 1;
memread = 2; /* two dummy reads needed before accesing external memory via register $08*/
-
- /* if yes, then let's check if ADPCM memory is mapped and big enough */
- if (!memory)
- {
- device->logerror("YM Delta-T ADPCM rom not mapped\n");
- portstate = 0x00;
- PCM_BSY = 0;
- }
- else
- {
- if (end >= memory_size) /* Check End in Range */
- {
- device->logerror("YM Delta-T ADPCM end out of range: $%08x\n", end);
- end = memory_size - 1;
- }
- if (start >= memory_size) /* Check Start in Range */
- {
- device->logerror("YM Delta-T ADPCM start out of range: $%08x\n", start);
- portstate = 0x00;
- PCM_BSY = 0;
- }
- }
}
else /* we access CPU memory (ADPCM data register $08) so we only reset now_addr here */
{
@@ -340,7 +319,7 @@ value: START, REC, MEMDAT, REPEAT, SPOFF, x,x,RESET meaning:
if (now_addr != (end << 1))
{
- memory[now_addr >> 1] = v;
+ write_byte(device, now_addr >> 1, v);
now_addr += 2; /* two nybbles at a time */
/* reset BRDY bit in status register, which means we are processing the write */
@@ -450,8 +429,7 @@ void YM_DELTAT::postload(uint8_t *regs)
reg[0] = regs[0];
/* current rom data */
- if (memory)
- now_data = *(memory + (now_addr >> 1));
+ now_data = read_byte(device, now_addr >> 1);
}
void YM_DELTAT::savestate(device_t *device)
@@ -515,7 +493,7 @@ static inline void YM_DELTAT_synthesis_from_external_memory(YM_DELTAT *DELTAT)
if( DELTAT->now_addr&1 ) data = DELTAT->now_data & 0x0f;
else
{
- DELTAT->now_data = *(DELTAT->memory + (DELTAT->now_addr>>1));
+ DELTAT->now_data = DELTAT->read_byte(DELTAT->device, DELTAT->now_addr>>1);
data = DELTAT->now_data >> 4;
}
diff --git a/src/devices/sound/ymdeltat.h b/src/devices/sound/ymdeltat.h
index f52bd46f5cb..def88c712b9 100644
--- a/src/devices/sound/ymdeltat.h
+++ b/src/devices/sound/ymdeltat.h
@@ -6,6 +6,8 @@
#pragma once
+typedef uint8_t (*FM_READBYTE)(device_t *device, offs_t offset);
+typedef void (*FM_WRITEBYTE)(device_t *device, offs_t offset, uint8_t data);
typedef void (*STATUS_CHANGE_HANDLER)(void *chip, uint8_t status_bits);
@@ -14,7 +16,8 @@ struct YM_DELTAT { /* AT: rearranged and tightened structure */
static constexpr int EMULATION_MODE_NORMAL = 0;
static constexpr int EMULATION_MODE_YM2610 = 1;
- uint8_t *memory;
+ FM_READBYTE read_byte;
+ FM_WRITEBYTE write_byte;
int32_t *output_pointer;/* pointer of output pointers */
int32_t *pan; /* pan : &output_pointer[pan] */
double freqbase;
diff --git a/src/devices/video/scn2674.cpp b/src/devices/video/scn2674.cpp
index 3058e110846..67a5fe19f94 100644
--- a/src/devices/video/scn2674.cpp
+++ b/src/devices/video/scn2674.cpp
@@ -601,7 +601,13 @@ void scn2674_device::write_interrupt_mask(bool enabled, uint8_t bits)
if (BIT(changed_bits, 3))
LOGMASKED(LOG_INTR, "Line Zero IRQ %s\n", enabled ? "enabled" : "disabled");
if (BIT(changed_bits, 4))
+ {
LOGMASKED(LOG_INTR, "V-Blank IRQ %s\n", enabled ? "enabled" : "disabled");
+
+ // hack to allow PC-X to get its first interrupt
+ if (BIT(bits, 4) && !m_display_enabled)
+ recompute_parameters();
+ }
}
void scn2674_device::write_delayed_command(uint8_t data)
@@ -919,9 +925,10 @@ WRITE8_MEMBER( scn2674_device::write )
void scn2674_device::recompute_parameters()
{
- int horiz_pix_total = ((m_equalizing_constant + (m_horz_sync_width << 1)) << 1) * m_hpixels_per_column;
+ int horiz_chars_total = (m_equalizing_constant + (m_horz_sync_width << 1)) << 1;
+ int horiz_pix_total = horiz_chars_total * m_hpixels_per_column;
int vert_pix_total = m_rows_per_screen * m_scanline_per_char_row + m_vert_front_porch + m_vert_back_porch + m_vsync_width;
- attoseconds_t refresh = screen().frame_period().attoseconds();
+ attoseconds_t refresh = screen().frame_period().as_attoseconds();
int max_visible_x = (m_character_per_row * m_hpixels_per_column) - 1;
int max_visible_y = (m_rows_per_screen * m_scanline_per_char_row) - 1;
@@ -931,10 +938,10 @@ void scn2674_device::recompute_parameters()
return;
}
- LOGMASKED(LOG_IR, "width %u height %u max_x %u max_y %u refresh %f\n", horiz_pix_total, vert_pix_total, max_visible_x, max_visible_y, 1 / ATTOSECONDS_TO_DOUBLE(refresh));
+ //attoseconds_t refresh = clocks_to_attotime(horiz_chars_total * vert_pix_total).as_attoseconds();
+ LOGMASKED(LOG_IR, "width %u height %u max_x %u max_y %u refresh %f\n", horiz_pix_total, vert_pix_total, max_visible_x, max_visible_y, ATTOSECONDS_TO_HZ(refresh));
- rectangle visarea;
- visarea.set(0, max_visible_x, 0, max_visible_y);
+ rectangle visarea(0, max_visible_x, 0, max_visible_y);
screen().configure(horiz_pix_total, vert_pix_total, visarea, refresh);
m_scanline_timer->adjust(screen().time_until_pos(0, 0), 0, screen().scan_period());
diff --git a/src/emu/diserial.h b/src/emu/diserial.h
index af55c7d4bc5..e1e2a447dff 100644
--- a/src/emu/diserial.h
+++ b/src/emu/diserial.h
@@ -188,6 +188,16 @@ class device_buffered_serial_interface : public device_serial_interface
protected:
using device_serial_interface::device_serial_interface;
+ void interface_post_start() override
+ {
+ device_serial_interface::interface_post_start();
+
+ device().save_item(NAME(m_fifo));
+ device().save_item(NAME(m_head));
+ device().save_item(NAME(m_tail));
+ device().save_item(NAME(m_empty));
+ }
+
virtual void tra_complete() override
{
assert(!m_empty || (m_head == m_tail));
@@ -236,20 +246,14 @@ protected:
}
}
- bool fifo_full() const
+ bool fifo_empty() const
{
- return !m_empty && (m_head == m_tail);
+ return m_empty;
}
-protected:
- void interface_post_start() override
+ bool fifo_full() const
{
- device_serial_interface::interface_post_start();
-
- device().save_item(NAME(m_fifo));
- device().save_item(NAME(m_head));
- device().save_item(NAME(m_tail));
- device().save_item(NAME(m_empty));
+ return !m_empty && (m_head == m_tail);
}
private:
diff --git a/src/emu/render.cpp b/src/emu/render.cpp
index e3071d5f9f4..d6828cce124 100644
--- a/src/emu/render.cpp
+++ b/src/emu/render.cpp
@@ -1728,15 +1728,6 @@ void render_target::load_additional_layout_files(const char *basename, bool have
screen_device_iterator iter(m_manager.machine().root_device());
std::vector<screen_info> const screens(std::begin(iter), std::end(iter));
- if (!have_default && !have_artwork)
- {
- if (screens.size() == 2U)
- {
- load_layout_file(nullptr, layout_dualhsxs);
- if (m_filelist.empty())
- throw emu_fatalerror("Couldn't parse default layout??");
- }
- }
if (screens.empty()) // ensure the fallback view for systems with no screens is loaded if necessary
{
@@ -1945,6 +1936,47 @@ void render_target::load_additional_layout_files(const char *basename, bool have
generate_view("Top-to-Bottom", 1U, false, [] (unsigned x, unsigned y) { return y; });
generate_view("Top-to-Bottom (Gapless)", 1U, true, [] (unsigned x, unsigned y) { return y; });
+ // generate fake cocktail view for systems with two screens
+ if (screens.size() == 2U)
+ {
+ float const height0(float(screens[0].physical_y()) / screens[0].physical_x());
+ float const height1(float(screens[1].physical_y()) / screens[1].physical_x());
+ float const minor((std::max)((std::min)(height0, 1.0F), (std::min)(height1, 1.0F)));
+
+ util::xml::data_node *const viewnode(layoutnode->add_child("view", nullptr));
+ if (!viewnode)
+ throw emu_fatalerror("Couldn't create XML node??");
+ viewnode->set_attribute("name", "Cocktail");
+
+ util::xml::data_node *const mirrornode(viewnode->add_child("screen", nullptr));
+ if (!mirrornode)
+ throw emu_fatalerror("Couldn't create XML node??");
+ mirrornode->set_attribute_int("index", 1);
+ util::xml::data_node *const mirrorbounds(mirrornode->add_child("bounds", nullptr));
+ if (!mirrorbounds)
+ throw emu_fatalerror("Couldn't create XML node??");
+ mirrorbounds->set_attribute_int("x", 0);
+ mirrorbounds->set_attribute_float("y", (-0.01 * minor) - height1);
+ mirrorbounds->set_attribute_int("width", 1);
+ mirrorbounds->set_attribute_float("height", height1);
+ util::xml::data_node *const flipper(mirrornode->add_child("orientation", nullptr));
+ if (!flipper)
+ throw emu_fatalerror("Couldn't create XML node??");
+ flipper->set_attribute_int("rotate", 180);
+
+ util::xml::data_node *const screennode(viewnode->add_child("screen", nullptr));
+ if (!screennode)
+ throw emu_fatalerror("Couldn't create XML node??");
+ screennode->set_attribute_int("index", 0);
+ util::xml::data_node *const screenbounds(screennode->add_child("bounds", nullptr));
+ if (!screenbounds)
+ throw emu_fatalerror("Couldn't create XML node??");
+ screenbounds->set_attribute_int("x", 0);
+ screenbounds->set_attribute_int("y", 0);
+ screenbounds->set_attribute_int("width", 1);
+ screenbounds->set_attribute_float("height", height0);
+ }
+
// generate tiled views
for (unsigned mindim = 2; ((screens.size() + mindim - 1) / mindim) >= mindim; ++mindim)
{
diff --git a/src/emu/xtal.cpp b/src/emu/xtal.cpp
index 85f064dcddf..f4a2915bc7c 100644
--- a/src/emu/xtal.cpp
+++ b/src/emu/xtal.cpp
@@ -235,6 +235,7 @@ const double XTAL::known_xtals[] = {
18'869'600, /* 18.8696_MHz_XTAL Memorex 2178 */
19'339'600, /* 19.3396_MHz_XTAL TeleVideo TVI-955 80-column display clock */
19'600'000, /* 19.6_MHz_XTAL Universal Mr. Do - Model 8021 PCB */
+ 19'602'000, /* 19.602_MHz_XTAL Ampex 210+ 80-column display clock */
19'660'800, /* 19.6608_MHz_XTAL Euro League (bootleg), labeled as "UKI 19.6608 20PF" */
19'661'400, /* 19.6614_MHz_XTAL Wyse WY-30 */
19'923'000, /* 19.923_MHz_XTAL Cinematronics vectors */
@@ -304,6 +305,7 @@ const double XTAL::known_xtals[] = {
31'684'000, /* 31.684_MHz_XTAL TeleVideo TVI-955 132-column display clock */
31'948'800, /* 31.9488_MHz_XTAL NEC PC-88xx, PC-98xx */
32'000'000, /* 32_MHz_XTAL - */
+ 32'147'000, /* 32.147_MHz_XTAL Ampex 210+ 132-column display clock */
32'220'000, /* 32.22_MHz_XTAL Typically used on 90's Data East PCBs (close to 9x NTSC subcarrier which is 32.215905Mhz */
32'317'400, /* 32.3174_MHz_XTAL DEC VT330, VT340 */
32'530'400, /* 32.5304_MHz_XTAL Seta 2 */
diff --git a/src/lib/formats/acorn_dsk.cpp b/src/lib/formats/acorn_dsk.cpp
index 59261f9b4d5..d8992b9ad5a 100644
--- a/src/lib/formats/acorn_dsk.cpp
+++ b/src/lib/formats/acorn_dsk.cpp
@@ -127,6 +127,10 @@ const acorn_ssd_format::format acorn_ssd_format::formats[] =
floppy_image::FF_35, floppy_image::DSDD, floppy_image::FM,
4000, 10, 80, 2, 256,{}, 0,{}, 40, 10, 10
},
+ { // 100k 40 track single sided single density
+ floppy_image::FF_3, floppy_image::SSSD, floppy_image::FM,
+ 4000, 10, 40, 1, 256,{}, 0,{}, 40, 10, 10
+ },
{}
};
diff --git a/src/mame/audio/dsbz80.cpp b/src/mame/audio/dsbz80.cpp
index c521ac825b6..a55613566cd 100644
--- a/src/mame/audio/dsbz80.cpp
+++ b/src/mame/audio/dsbz80.cpp
@@ -29,8 +29,7 @@ void dsbz80_device::dsbz80io_map(address_map &map)
map(0xe5, 0xe7).w(FUNC(dsbz80_device::mpeg_end_w));
map(0xe8, 0xe8).w(FUNC(dsbz80_device::mpeg_volume_w));
map(0xe9, 0xe9).w(FUNC(dsbz80_device::mpeg_stereo_w));
- map(0xf0, 0xf0).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xf1, 0xf1).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xf0, 0xf1).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write));
}
diff --git a/src/mame/audio/segam1audio.cpp b/src/mame/audio/segam1audio.cpp
index 4638106761a..1dd071940b1 100644
--- a/src/mame/audio/segam1audio.cpp
+++ b/src/mame/audio/segam1audio.cpp
@@ -26,8 +26,7 @@ void segam1audio_device::segam1audio_map(address_map &map)
{
map(0x000000, 0x03ffff).rom();
map(0x080000, 0x09ffff).rom().region(M68000_TAG, 0x20000); // mirror of upper ROM socket
- map(0xc20001, 0xc20001).rw(UART_TAG, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xc20003, 0xc20003).rw(UART_TAG, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xc20000, 0xc20003).rw(UART_TAG, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
map(0xc40000, 0xc40007).rw(MULTIPCM_1_TAG, FUNC(multipcm_device::read), FUNC(multipcm_device::write)).umask16(0x00ff);
map(0xc40012, 0xc40013).nopw();
map(0xc50000, 0xc50001).w(FUNC(segam1audio_device::m1_snd_mpcm_bnk1_w));
diff --git a/src/mame/drivers/a7150.cpp b/src/mame/drivers/a7150.cpp
index ff46df7a1d8..ef44b6550a8 100644
--- a/src/mame/drivers/a7150.cpp
+++ b/src/mame/drivers/a7150.cpp
@@ -327,8 +327,7 @@ void a7150_state::a7150_io(address_map &map)
map(0x00c0, 0x00c3).rw(m_pic8259, FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff);
map(0x00c8, 0x00cf).rw("ppi8255", FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0x00ff);
map(0x00d0, 0x00d7).rw(m_pit8253, FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0x00ff);
- map(0x00d8, 0x00d8).rw(m_uart8251, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x00da, 0x00da).rw(m_uart8251, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x00d8, 0x00db).rw(m_uart8251, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
map(0x0200, 0x0203).rw(FUNC(a7150_state::a7150_kgs_r), FUNC(a7150_state::a7150_kgs_w)).umask16(0x00ff); // ABS/KGS board
map(0x0300, 0x031f).unmaprw(); // ASP board #1
map(0x0320, 0x033f).unmaprw(); // ASP board #2
diff --git a/src/mame/drivers/alphatpx.cpp b/src/mame/drivers/alphatpx.cpp
index 71225a67d7e..6376b1b318a 100644
--- a/src/mame/drivers/alphatpx.cpp
+++ b/src/mame/drivers/alphatpx.cpp
@@ -269,8 +269,7 @@ void alphatp_12_state::alphatp2_map(address_map &map)
void alphatp_12_state::alphatp2_io(address_map &map)
{
map.unmap_value_high();
- map(0x04, 0x04).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x05, 0x05).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x04, 0x05).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x10, 0x11).rw(m_kbdmcu, FUNC(i8041_device::upi41_master_r), FUNC(i8041_device::upi41_master_w));
map(0x12, 0x12).w(FUNC(alphatp_12_state::beep_w));
map(0x50, 0x53).rw(FUNC(alphatp_12_state::fdc_r), FUNC(alphatp_12_state::fdc_w));
@@ -309,8 +308,7 @@ void alphatp_34_state::alphatp3_io(address_map &map)
{
map.unmap_value_high();
//AM_RANGE(0x00, 0x00) AM_READ // unknown
- map(0x04, 0x04).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x05, 0x05).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x04, 0x05).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x08, 0x09).rw(FUNC(alphatp_34_state::comm88_r), FUNC(alphatp_34_state::comm88_w));
map(0x10, 0x11).rw(m_kbdmcu, FUNC(i8041_device::upi41_master_r), FUNC(i8041_device::upi41_master_w));
map(0x12, 0x12).w(FUNC(alphatp_34_state::beep_w));
diff --git a/src/mame/drivers/alphatro.cpp b/src/mame/drivers/alphatro.cpp
index 7e69c57b949..09b1e263844 100644
--- a/src/mame/drivers/alphatro.cpp
+++ b/src/mame/drivers/alphatro.cpp
@@ -438,8 +438,7 @@ void alphatro_state::alphatro_io(address_map &map)
map(0x2b, 0x2b).portr("XB");
map(0x30, 0x30).rw(FUNC(alphatro_state::port30_r), FUNC(alphatro_state::port30_w));
// USART for cassette reading and writing
- map(0x40, 0x40).rw(m_usart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x41, 0x41).rw(m_usart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x40, 0x41).rw(m_usart, FUNC(i8251_device::read), FUNC(i8251_device::write));
// CRTC - HD46505 / HD6845SP
map(0x50, 0x50).w(m_crtc, FUNC(mc6845_device::address_w));
map(0x51, 0x51).rw(m_crtc, FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w));
diff --git a/src/mame/drivers/ampex210.cpp b/src/mame/drivers/ampex210.cpp
index 62a576a9594..6f9c0152eea 100644
--- a/src/mame/drivers/ampex210.cpp
+++ b/src/mame/drivers/ampex210.cpp
@@ -9,6 +9,7 @@
#include "emu.h"
#include "cpu/z80/z80.h"
#include "machine/mos6551.h"
+#include "machine/nvram.h"
#include "video/scn2674.h"
#include "screen.h"
@@ -29,6 +30,8 @@ private:
void mem_map(address_map &map);
void io_map(address_map &map);
+ void vram_map(address_map &map);
+
required_device<cpu_device> m_maincpu;
required_region_ptr<u8> m_chargen;
};
@@ -41,7 +44,7 @@ SCN2672_DRAW_CHARACTER_MEMBER(ampex210_state::draw_character)
void ampex210_state::mem_map(address_map &map)
{
map(0x0000, 0x7fff).rom().region("maincpu", 0);
- map(0x8000, 0x87ff).ram();
+ map(0x8000, 0x87ff).ram().share("nvram");
map(0x8800, 0x9fff).ram();
}
@@ -51,6 +54,14 @@ void ampex210_state::io_map(address_map &map)
map(0x00, 0x07).rw("pvtc", FUNC(scn2672_device::read), FUNC(scn2672_device::write));
map(0x44, 0x47).rw("acia", FUNC(mos6551_device::read), FUNC(mos6551_device::write));
map(0x80, 0x80).nopw();
+ map(0xc0, 0xc0).w("pvtc", FUNC(scn2672_device::buffer_w));
+ map(0xc1, 0xc1).r("pvtc", FUNC(scn2672_device::buffer_r));
+ map(0xc7, 0xc7).nopw();
+}
+
+void ampex210_state::vram_map(address_map &map)
+{
+ map(0x0000, 0x1fff).ram(); // MB8464A-10L (second half unused?)
}
@@ -60,21 +71,25 @@ INPUT_PORTS_END
void ampex210_state::ampex210p(machine_config &config)
{
- Z80(config, m_maincpu, 4'000'000);
+ Z80(config, m_maincpu, 3.6864_MHz_XTAL); // Z80ACPU; clock uncertain
m_maincpu->set_addrmap(AS_PROGRAM, &ampex210_state::mem_map);
m_maincpu->set_addrmap(AS_IO, &ampex210_state::io_map);
- mos6551_device &acia(MOS6551(config, "acia", 1'843'200));
+ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // UM6116-2
+
+ mos6551_device &acia(MOS6551(config, "acia", 3.6864_MHz_XTAL / 2)); // AMI S6551AP
acia.irq_handler().set_inputline("maincpu", INPUT_LINE_IRQ0);
- scn2672_device &pvtc(SCN2672(config, "pvtc", 2'178'000));
+ scn2672_device &pvtc(SCN2672(config, "pvtc", 19.602_MHz_XTAL / 9)); // MC2672B4P
pvtc.intr_callback().set_inputline("maincpu", INPUT_LINE_NMI);
- pvtc.set_character_width(10);
+ pvtc.set_character_width(9);
pvtc.set_display_callback(FUNC(ampex210_state::draw_character));
+ pvtc.set_addrmap(0, &ampex210_state::vram_map);
pvtc.set_screen("screen");
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
- screen.set_raw(21'780'000, 1000, 0, 800, 363, 0, 300); // clock guessed
+ screen.set_raw(19.602_MHz_XTAL, 900, 0, 720, 363, 0, 300);
+ //screen.set_raw(32.147_MHz_XTAL, 1476, 0, 1188, 363, 0, 300);
screen.set_screen_update("pvtc", FUNC(scn2672_device::screen_update));
}
diff --git a/src/mame/drivers/amust.cpp b/src/mame/drivers/amust.cpp
index 7f9f315c240..8a810dce397 100644
--- a/src/mame/drivers/amust.cpp
+++ b/src/mame/drivers/amust.cpp
@@ -193,10 +193,8 @@ void amust_state::io_map(address_map &map)
{
map.unmap_value_high();
map.global_mask(0xff);
- map(0x00, 0x00).rw("uart1", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x01, 0x01).rw("uart1", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0x02, 0x02).rw("uart2", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x03, 0x03).rw("uart2", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x00, 0x01).rw("uart1", FUNC(i8251_device::read), FUNC(i8251_device::write));
+ map(0x02, 0x03).rw("uart2", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x04, 0x07).rw("ppi1", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0x08, 0x0b).rw("ppi2", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0x0d, 0x0d).nopr().w(FUNC(amust_state::port0d_w));
diff --git a/src/mame/drivers/att4425.cpp b/src/mame/drivers/att4425.cpp
index 11cdf80bf5d..a6ce9fa3314 100644
--- a/src/mame/drivers/att4425.cpp
+++ b/src/mame/drivers/att4425.cpp
@@ -110,8 +110,7 @@ void att4425_state::att4425_mem(address_map &map)
void att4425_state::att4425_io(address_map &map)
{
map.global_mask(0xff);
- map(0x00, 0x00).rw(m_i8251, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x01, 0x01).rw(m_i8251, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x00, 0x01).rw(m_i8251, FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x10, 0x10).w(FUNC(att4425_state::port10_w));
map(0x14, 0x14).rw(FUNC(att4425_state::port14_r), FUNC(att4425_state::port14_w));
map(0x15, 0x15).r(FUNC(att4425_state::port15_r));
diff --git a/src/mame/drivers/b2m.cpp b/src/mame/drivers/b2m.cpp
index e3584d0b747..f3c7b2ab6a6 100644
--- a/src/mame/drivers/b2m.cpp
+++ b/src/mame/drivers/b2m.cpp
@@ -42,8 +42,7 @@ void b2m_state::b2m_io(address_map &map)
map(0x0c, 0x0c).rw(FUNC(b2m_state::b2m_localmachine_r), FUNC(b2m_state::b2m_localmachine_w));
map(0x10, 0x13).rw(FUNC(b2m_state::b2m_palette_r), FUNC(b2m_state::b2m_palette_w));
map(0x14, 0x15).rw(m_pic, FUNC(pic8259_device::read), FUNC(pic8259_device::write));
- map(0x18, 0x18).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x19, 0x19).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x18, 0x19).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x1c, 0x1f).rw(m_fdc, FUNC(fd1793_device::read), FUNC(fd1793_device::write));
}
@@ -56,8 +55,7 @@ void b2m_state::b2m_rom_io(address_map &map)
map(0x0c, 0x0c).rw(FUNC(b2m_state::b2m_localmachine_r), FUNC(b2m_state::b2m_localmachine_w));
map(0x10, 0x13).rw(FUNC(b2m_state::b2m_palette_r), FUNC(b2m_state::b2m_palette_w));
map(0x14, 0x15).rw(m_pic, FUNC(pic8259_device::read), FUNC(pic8259_device::write));
- map(0x18, 0x18).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x19, 0x19).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x18, 0x19).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write));
}
diff --git a/src/mame/drivers/bbc.cpp b/src/mame/drivers/bbc.cpp
index af78c26ebe6..f9647cb0c2a 100644
--- a/src/mame/drivers/bbc.cpp
+++ b/src/mame/drivers/bbc.cpp
@@ -150,14 +150,14 @@ void bbc_state::bbca_mem(address_map &map)
map(0x8000, 0xbfff).bankr("bank4").w(FUNC(bbc_state::bbc_memoryb4_w)); // 8000-bfff Paged ROM
map(0xc000, 0xfbff).bankr("bank7"); // c000-fbff OS ROM
map(0xfc00, 0xfdff).noprw(); // fc00-fdff FRED & JIM Pages
- // fe00-feff SHEILA Address Page
+ map(0xfe00, 0xfeff).r(FUNC(bbc_state::bbc_fe_r)); // fe00-feff SHEILA Address Page
map(0xfe00, 0xfe00).mirror(0x06).rw(m_hd6845, FUNC(hd6845_device::status_r), FUNC(hd6845_device::address_w)); // fe00-fe07 6845 CRTC Video controller
map(0xfe01, 0xfe01).mirror(0x06).rw(m_hd6845, FUNC(hd6845_device::register_r), FUNC(hd6845_device::register_w));
map(0xfe08, 0xfe09).mirror(0x06).rw(m_acia, FUNC(acia6850_device::read), FUNC(acia6850_device::write)); // fe08-fe0f 6850 ACIA Serial controller
map(0xfe10, 0xfe17).rw(FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::bbc_SerialULA_w)); // fe10-fe17 Serial ULA Serial system chip
map(0xfe18, 0xfe1f).noprw(); // fe18-fe1f INTOFF/STATID # ECONET Interrupt Off / ID No.
map(0xfe20, 0xfe2f).rw(FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::bbc_videoULA_w)); // R: fe20-fe2f INTON # ECONET Interrupt On
- // W: fe20-fe2f Video ULA Video system chip
+ // W: fe20-fe2f Video ULA Video system chip
map(0xfe30, 0xfe3f).rw(FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::page_selecta_w)); // W: fe30-fe3f 74LS161 Paged ROM selector
map(0xfe40, 0xfe5f).rw(m_via6522_0, FUNC(via6522_device::read), FUNC(via6522_device::write)); // fe40-fe5f 6522 VIA SYSTEM VIA
map(0xfe60, 0xfe7f).noprw(); // fe60-fe7f 6522 VIA # USER VIA
@@ -173,7 +173,8 @@ void bbc_state::bbc_base(address_map &map)
{
map.unmap_value_high();
map(0xc000, 0xfbff).bankr("bank7"); // c000-fbff OS ROM
- map(0xfc00, 0xfdff).noprw(); // fc00-fdff FRED & JIM Pages
+ map(0xfc00, 0xfcff).rw(m_1mhzbus, FUNC(bbc_1mhzbus_slot_device::fred_r), FUNC(bbc_1mhzbus_slot_device::fred_w)); // fc00-fcff FRED Address Page
+ map(0xfd00, 0xfdff).rw(m_1mhzbus, FUNC(bbc_1mhzbus_slot_device::jim_r), FUNC(bbc_1mhzbus_slot_device::jim_w)); // fd00-fdff JIM Address Page
map(0xfe00, 0xfeff).r(FUNC(bbc_state::bbc_fe_r)); // fe00-feff SHEILA Address Page
map(0xfe00, 0xfe00).mirror(0x06).rw(m_hd6845, FUNC(hd6845_device::status_r), FUNC(hd6845_device::address_w)); // fe00-fe07 6845 CRTC Video controller
map(0xfe01, 0xfe01).mirror(0x06).rw(m_hd6845, FUNC(hd6845_device::register_r), FUNC(hd6845_device::register_w));
@@ -181,10 +182,10 @@ void bbc_state::bbc_base(address_map &map)
map(0xfe10, 0xfe17).rw(FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::bbc_SerialULA_w)); // fe10-fe17 Serial ULA Serial system chip
map(0xfe18, 0xfe1f).portr("STATID"); // fe18-fe1f INTOFF/STATID ECONET Interrupt Off / ID No.
map(0xfe20, 0xfe2f).rw(FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::bbc_videoULA_w)); // R: fe20-fe2f INTON ECONET Interrupt On
- // W: fe20-fe2f Video ULA Video system chip
+ // W: fe20-fe2f Video ULA Video system chip
map(0xfe40, 0xfe5f).rw(m_via6522_0, FUNC(via6522_device::read), FUNC(via6522_device::write)); // fe40-fe5f 6522 VIA SYSTEM VIA
map(0xfe60, 0xfe7f).rw(m_via6522_1, FUNC(via6522_device::read), FUNC(via6522_device::write)); // fe60-fe7f 6522 VIA USER VIA
- // fe80-fe9f FDC Floppy disc controller
+ // fe80-fe9f FDC Floppy disc controller
map(0xfea0, 0xfebf).r(FUNC(bbc_state::bbc_fe_r)); // fea0-febf 68B54 ADLC ECONET controller
map(0xfec0, 0xfedf).rw(m_upd7002, FUNC(upd7002_device::read), FUNC(upd7002_device::write)); // fec0-fedf uPD7002 Analogue to digital converter
map(0xfee0, 0xfeff).rw(m_tube, FUNC(bbc_tube_slot_device::host_r), FUNC(bbc_tube_slot_device::host_w)); // fee0-feff Tube ULA Tube system interface
@@ -211,6 +212,7 @@ void bbc_state::bbcb_nofdc_mem(address_map &map)
map(0x4000, 0x7fff).bankrw("bank3"); // 4000-7fff Regular RAM
map(0x8000, 0xbfff).bankr("bank4").w(FUNC(bbc_state::bbc_memoryb4_w)); // 8000-bfff Paged ROM/RAM
map(0xfe30, 0xfe3f).w(FUNC(bbc_state::page_selectb_w)); // W: fe30-fe3f 84LS161 Paged ROM selector
+ map(0xfe80, 0xfe9f).rw(m_fdc, FUNC(bbc_fdc_slot_device::read), FUNC(bbc_fdc_slot_device::write)); // fe84-fe9f 8271 FDC Floppy disc controller
}
@@ -796,30 +798,21 @@ WRITE_LINE_MEMBER(bbc_state::adlc_irq_w)
}
-WRITE_LINE_MEMBER(bbc_state::econet_clk_w)
+// 4 x EPROM sockets (16K) in BBC-A, these should grow to 16 for BBC-B and later...
+void bbc_state::bbc_eprom_sockets(machine_config &config)
{
- m_adlc->rxc_w(state);
- m_adlc->txc_w(state);
-}
+ GENERIC_SOCKET(config, m_exp1, generic_linear_slot, "bbc_rom", "bin,rom");
+ m_exp1->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_exp1_load, this));
-// 4 x EPROM sockets (16K) in BBC-A, these should grow to 16 for BBC-B and later...
-MACHINE_CONFIG_START(bbc_state::bbc_eprom_sockets)
- MCFG_GENERIC_SOCKET_ADD("exp_rom1", generic_linear_slot, "bbc_cart")
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_LOAD(bbc_state, exp1_load)
-
- MCFG_GENERIC_SOCKET_ADD("exp_rom2", generic_linear_slot, "bbc_cart")
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_LOAD(bbc_state, exp2_load)
-
- MCFG_GENERIC_SOCKET_ADD("exp_rom3", generic_linear_slot, "bbc_cart")
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_LOAD(bbc_state, exp3_load)
-
- MCFG_GENERIC_SOCKET_ADD("exp_rom4", generic_linear_slot, "bbc_cart")
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_LOAD(bbc_state, exp4_load)
-MACHINE_CONFIG_END
+ GENERIC_SOCKET(config, m_exp2, generic_linear_slot, "bbc_rom", "bin,rom");
+ m_exp2->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_exp2_load, this));
+
+ GENERIC_SOCKET(config, m_exp3, generic_linear_slot, "bbc_rom", "bin,rom");
+ m_exp3->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_exp3_load, this));
+
+ GENERIC_SOCKET(config, m_exp4, generic_linear_slot, "bbc_rom", "bin,rom");
+ m_exp4->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_exp4_load, this));
+}
/***************************************************************************
@@ -831,13 +824,12 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(bbc_state::bbca)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, 16_MHz_XTAL/8) /* 2.00 MHz */
- MCFG_DEVICE_PROGRAM_MAP(bbca_mem)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(bbc_state, bbcb_keyscan, 1000) /* scan keyboard */
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ M6502(config, m_maincpu, 16_MHz_XTAL / 8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &bbc_state::bbca_mem);
+ m_maincpu->set_periodic_int(FUNC(bbc_state::bbcb_keyscan), attotime::from_hz(1000)); /* scan keyboard */
+ config.m_minimum_quantum = attotime::from_hz(60);
- MCFG_INPUT_MERGER_ANY_HIGH("irqs")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", M6502_IRQ_LINE))
+ INPUT_MERGER_ANY_HIGH(config, m_irqs).output_handler().set_inputline(m_maincpu, M6502_IRQ_LINE);
/* internal ram */
RAM(config, m_ram).set_default_size("16K").set_extra_options("32K").set_default_value(0x00);
@@ -846,24 +838,25 @@ MACHINE_CONFIG_START(bbc_state::bbca)
MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbca)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(16_MHz_XTAL, 1024, 0, 640, 312, 0, 256)
- MCFG_SCREEN_UPDATE_DEVICE("hd6845", hd6845_device, screen_update)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(16_MHz_XTAL, 1024, 0, 640, 312, 0, 256);
+ m_screen->set_screen_update("hd6845", FUNC(hd6845_device::screen_update));
- MCFG_PALETTE_ADD("palette", 16)
- MCFG_PALETTE_INIT_OWNER(bbc_state,bbc)
+ palette_device &palette(PALETTE(config, "palette", 16));
+ palette.set_init(palette_init_delegate(FUNC(bbc_state::palette_init_bbc), this));
- MCFG_DEVICE_ADD("saa5050", SAA5050, 12_MHz_XTAL/2)
- MCFG_SAA5050_SCREEN_SIZE(40, 25, 40)
+ SAA5050(config, m_trom, 12_MHz_XTAL / 2);
+ m_trom->set_screen_size(40, 25, 40);
/* crtc */
- MCFG_MC6845_ADD("hd6845", HD6845, "screen", 16_MHz_XTAL / 8)
- MCFG_MC6845_SHOW_BORDER_AREA(false)
- MCFG_MC6845_CHAR_WIDTH(12)
- MCFG_MC6845_UPDATE_ROW_CB(bbc_state, crtc_update_row)
- MCFG_MC6845_OUT_DE_CB(WRITELINE(*this, bbc_state, bbc_de_changed))
- MCFG_MC6845_OUT_HSYNC_CB(WRITELINE(*this, bbc_state, bbc_hsync_changed))
- MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(*this, bbc_state, bbc_vsync_changed))
+ HD6845(config, m_hd6845, 16_MHz_XTAL / 8);
+ m_hd6845->set_screen("screen");
+ m_hd6845->set_show_border_area(false);
+ m_hd6845->set_char_width(12);
+ m_hd6845->set_update_row_callback(FUNC(bbc_state::crtc_update_row), this);
+ m_hd6845->out_de_callback().set(FUNC(bbc_state::bbc_de_changed));
+ m_hd6845->out_hsync_callback().set(FUNC(bbc_state::bbc_hsync_changed));
+ m_hd6845->out_vsync_callback().set(FUNC(bbc_state::bbc_vsync_changed));
MCFG_VIDEO_START_OVERRIDE(bbc_state, bbc)
@@ -871,23 +864,23 @@ MACHINE_CONFIG_START(bbc_state::bbca)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn76489", SN76489, 16_MHz_XTAL/4) /* 4 MHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ SN76489(config, m_sn, 16_MHz_XTAL / 4);
+ m_sn->add_route(ALL_OUTPUTS, "mono", 1.0);
/* cassette relay */
- MCFG_DEVICE_ADD("samples", SAMPLES)
- MCFG_SAMPLES_CHANNELS(1)
- MCFG_SAMPLES_NAMES(bbc_sample_names)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ SAMPLES(config, m_samples);
+ m_samples->set_channels(1);
+ m_samples->set_samples_names(bbc_sample_names);
+ m_samples->add_route(ALL_OUTPUTS, "mono", 1.0);
/* cassette */
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(bbc_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED)
- MCFG_CASSETTE_INTERFACE("bbc_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(bbc_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED);
+ m_cassette->set_interface("bbc_cass");
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("cass_ls_a", "bbca_cass")
+ SOFTWARE_LIST(config, "cass_ls_a").set_original("bbca_cass");
/* acia */
ACIA6850(config, m_acia, 0);
@@ -895,13 +888,13 @@ MACHINE_CONFIG_START(bbc_state::bbca)
m_acia->rts_handler().set(FUNC(bbc_state::bbc_rts_w));
m_acia->irq_handler().set("irqs", FUNC(input_merger_device::in_w<0>));
- MCFG_DEVICE_ADD(RS232_TAG, RS232_PORT, default_rs232_devices, nullptr)
- MCFG_RS232_RXD_HANDLER(WRITELINE(*this, bbc_state, write_rxd_serial))
- MCFG_RS232_DCD_HANDLER(WRITELINE(*this, bbc_state, write_dcd_serial))
- MCFG_RS232_CTS_HANDLER(WRITELINE(*this, bbc_state, write_cts_serial))
+ RS232_PORT(config, m_rs232, default_rs232_devices, nullptr);
+ m_rs232->rxd_handler().set(FUNC(bbc_state::write_rxd_serial));
+ m_rs232->dcd_handler().set(FUNC(bbc_state::write_dcd_serial));
+ m_rs232->cts_handler().set(FUNC(bbc_state::write_cts_serial));
- MCFG_DEVICE_ADD("acia_clock", CLOCK, 16_MHz_XTAL / 13)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, bbc_state, write_acia_clock))
+ CLOCK(config, m_acia_clock, 16_MHz_XTAL / 13);
+ m_acia_clock->signal_handler().set(FUNC(bbc_state::write_acia_clock));
/* system via */
VIA6522(config, m_via6522_0, 16_MHz_XTAL / 16);
@@ -919,8 +912,7 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(bbc_state::bbcb)
bbca(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(bbcb_nofdc_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &bbc_state::bbcb_nofdc_mem);
MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcb)
MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcb)
@@ -929,10 +921,10 @@ MACHINE_CONFIG_START(bbc_state::bbcb)
m_ram->set_default_size("32K").set_default_value(0x00);
/* speech hardware */
- MCFG_DEVICE_ADD("vsm", SPEECHROM, 0)
- MCFG_DEVICE_ADD("tms5220", TMS5220, 640000)
- MCFG_TMS52XX_SPEECHROM("vsm")
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ SPEECHROM(config, "vsm", 0).set_reverse_bit_order(true);
+ TMS5220(config, m_tms, 640000);
+ m_tms->set_speechrom_tag("vsm");
+ m_tms->add_route(ALL_OUTPUTS, "mono", 1.0);
/* user via */
VIA6522(config, m_via6522_1, 16_MHz_XTAL / 16);
@@ -950,126 +942,123 @@ MACHINE_CONFIG_START(bbc_state::bbcb)
/* printer */
centronics_device &centronics(CENTRONICS(config, "centronics", centronics_devices, "printer"));
centronics.ack_handler().set("via6522_1", FUNC(via6522_device::write_ca1)).invert(); // ack seems to be inverted?
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ output_latch_device &latch(OUTPUT_LATCH(config, "cent_data_out"));
+ centronics.set_output_latch(latch);
/* fdc */
- MCFG_BBC_FDC_SLOT_ADD("fdc", bbc_fdc_devices, "acorn8271", false)
- MCFG_BBC_FDC_SLOT_INTRQ_HANDLER(WRITELINE(*this, bbc_state, fdc_intrq_w))
- MCFG_BBC_FDC_SLOT_DRQ_HANDLER(WRITELINE(*this, bbc_state, fdc_drq_w))
+ BBC_FDC_SLOT(config, m_fdc, bbc_fdc_devices, "acorn8271");
+ m_fdc->intrq_wr_callback().set(FUNC(bbc_state::fdc_intrq_w));
+ m_fdc->drq_wr_callback().set(FUNC(bbc_state::fdc_drq_w));
/* econet */
MC6854(config, m_adlc);
m_adlc->out_txd_cb().set(ECONET_TAG, FUNC(econet_device::host_data_w));
m_adlc->out_irq_cb().set(FUNC(bbc_state::adlc_irq_w));
- MCFG_ECONET_ADD()
- MCFG_ECONET_CLK_CALLBACK(WRITELINE(*this, bbc_state, econet_clk_w))
- MCFG_ECONET_DATA_CALLBACK(WRITELINE("mc6854", mc6854_device, set_rx))
- MCFG_ECONET_SLOT_ADD("econet254", 254, econet_devices, nullptr)
+
+ econet_device &econet(ECONET(config, "econet", 0));
+ econet.clk_wr_callback().set(m_adlc, FUNC(mc6854_device::txc_w));
+ econet.clk_wr_callback().append(m_adlc, FUNC(mc6854_device::rxc_w));
+ econet.data_wr_callback().set(m_adlc, FUNC(mc6854_device::set_rx));
+
+ econet_slot_device &econet_slot(ECONET_SLOT(config, "econet254", 0));
+ econet_devices(econet_slot);
+ econet_slot.set_slot(254);
/* analogue port */
- MCFG_BBC_ANALOGUE_SLOT_ADD("analogue", bbc_analogue_devices, nullptr)
+ BBC_ANALOGUE_SLOT(config, m_analog, bbc_analogue_devices, nullptr);
+ m_analog->lpstb_handler().set(FUNC(bbc_state::lpstb_w));
/* 1mhz bus port */
- MCFG_BBC_1MHZBUS_SLOT_ADD("1mhzbus", bbc_1mhzbus_devices, nullptr)
- MCFG_BBC_1MHZBUS_SLOT_IRQ_HANDLER(WRITELINE("irqs", input_merger_device, in_w<3>))
- MCFG_BBC_1MHZBUS_SLOT_NMI_HANDLER(WRITELINE(*this, bbc_state, bus_nmi_w))
+ BBC_1MHZBUS_SLOT(config, m_1mhzbus, bbc_1mhzbus_devices, nullptr);
+ m_1mhzbus->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<3>));
+ m_1mhzbus->nmi_handler().set(FUNC(bbc_state::bus_nmi_w));
/* tube port */
- MCFG_BBC_TUBE_SLOT_ADD("tube", bbc_extube_devices, nullptr)
- MCFG_BBC_TUBE_SLOT_IRQ_HANDLER(WRITELINE("irqs", input_merger_device, in_w<4>))
+ BBC_TUBE_SLOT(config, m_tube, bbc_extube_devices, nullptr);
+ m_tube->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<4>));
/* user port */
- MCFG_BBC_USERPORT_SLOT_ADD("userport", bbc_userport_devices, nullptr)
- MCFG_BBC_USERPORT_CB1_HANDLER(WRITELINE("via6522_1", via6522_device, write_cb1))
- MCFG_BBC_USERPORT_CB2_HANDLER(WRITELINE("via6522_1", via6522_device, write_cb2))
+ BBC_USERPORT_SLOT(config, m_userport, bbc_userport_devices, nullptr);
+ m_userport->cb1_handler().set(m_via6522_1, FUNC(via6522_device::write_cb1));
+ m_userport->cb2_handler().set(m_via6522_1, FUNC(via6522_device::write_cb2));
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("cass_ls_b", "bbcb_cass")
- MCFG_SOFTWARE_LIST_ADD("flop_ls_b", "bbcb_flop")
- MCFG_SOFTWARE_LIST_ADD("flop_ls_b_orig", "bbcb_flop_orig")
+ SOFTWARE_LIST(config, "cass_ls_b").set_original("bbcb_cass");
+ SOFTWARE_LIST(config, "flop_ls_b").set_original("bbcb_flop");
+ SOFTWARE_LIST(config, "flop_ls_b_orig").set_original("bbcb_flop_orig");
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(bbc_state::bbcb_de)
+void bbc_state::bbcb_de(machine_config &config)
+{
bbcb(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(bbcb_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &bbc_state::bbcb_mem);
/* fdc */
- MCFG_DEVICE_REMOVE("fdc")
- I8271(config, m_i8271, 0);
+ config.device_remove("fdc");
+ I8271(config, m_i8271, 16_MHz_XTAL / 8);
m_i8271->intrq_wr_callback().set(FUNC(bbc_state::fdc_intrq_w));
m_i8271->hdl_wr_callback().set(FUNC(bbc_state::motor_w));
m_i8271->opt_wr_callback().set(FUNC(bbc_state::side_w));
- MCFG_FLOPPY_DRIVE_ADD("i8271:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("i8271:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+
+ FLOPPY_CONNECTOR(config, "i8271:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "i8271:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc).enable_sound(true);
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_ls_b_de", "bbcb_cass_de")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_ls_b_de").set_original("bbcb_cass_de");
+}
-MACHINE_CONFIG_START(bbc_state::bbcb_us)
+void bbc_state::bbcb_us(machine_config &config)
+{
bbcb(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(bbcb_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &bbc_state::bbcb_mem);
/* video hardware */
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_SIZE(640, 200)
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1)
- MCFG_SCREEN_REFRESH_RATE(60)
+ m_screen->set_raw(16_MHz_XTAL, 1024, 0, 640, 262, 0, 200);
/* fdc */
- MCFG_DEVICE_REMOVE("fdc")
- I8271(config, m_i8271, 0);
+ config.device_remove("fdc");
+ I8271(config, m_i8271, 16_MHz_XTAL / 8);
m_i8271->intrq_wr_callback().set(FUNC(bbc_state::fdc_intrq_w));
m_i8271->hdl_wr_callback().set(FUNC(bbc_state::motor_w));
m_i8271->opt_wr_callback().set(FUNC(bbc_state::side_w));
- MCFG_FLOPPY_DRIVE_ADD("i8271:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("i8271:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "i8271:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "i8271:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc).enable_sound(true);
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_ls_b_us", "bbcb_flop_us")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_ls_b_us").set_original("bbcb_cass_us");
+}
MACHINE_CONFIG_START(bbc_state::bbcbp)
bbcb(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu") /* M6512 */
- MCFG_DEVICE_PROGRAM_MAP(bbcbp_mem)
- MCFG_DEVICE_OPCODES_MAP(bbcbp_fetch)
+ m_maincpu->set_addrmap(AS_PROGRAM, &bbc_state::bbcbp_mem);
+ m_maincpu->set_addrmap(AS_OPCODES, &bbc_state::bbcbp_fetch);
MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcbp)
MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcbp)
/* fdc */
- MCFG_DEVICE_REMOVE("fdc")
+ config.device_remove("fdc");
WD1770(config, m_wd1770, 16_MHz_XTAL / 2);
m_wd1770->intrq_wr_callback().set(FUNC(bbc_state::fdc_intrq_w));
m_wd1770->drq_wr_callback().set(FUNC(bbc_state::fdc_drq_w));
- MCFG_FLOPPY_DRIVE_ADD("wd1770:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("wd1770:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "wd1770:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "wd1770:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc).enable_sound(true);
MACHINE_CONFIG_END
MACHINE_CONFIG_START(bbc_state::bbcbp128)
bbcbp(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu") /* M6512 */
- MCFG_DEVICE_PROGRAM_MAP(bbcbp128_mem)
- MCFG_DEVICE_OPCODES_MAP(bbcbp_fetch)
+ m_maincpu->set_addrmap(AS_PROGRAM, &bbc_state::bbcbp128_mem);
+ m_maincpu->set_addrmap(AS_OPCODES, &bbc_state::bbcbp_fetch);
MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcbp)
MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcbp)
@@ -1092,42 +1081,41 @@ MACHINE_CONFIG_START(torch_state::torchf)
MCFG_MACHINE_RESET_OVERRIDE(bbc_state, torch)
/* fdc */
- MCFG_DEVICE_REMOVE("fdc")
- I8271(config, m_i8271, 0);
+ config.device_remove("fdc");
+ I8271(config, m_i8271, 16_MHz_XTAL / 8);
m_i8271->intrq_wr_callback().set(FUNC(bbc_state::fdc_intrq_w));
m_i8271->hdl_wr_callback().set(FUNC(bbc_state::motor_w));
m_i8271->opt_wr_callback().set(FUNC(bbc_state::side_w));
- MCFG_FLOPPY_DRIVE_ADD_FIXED("i8271:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD_FIXED("i8271:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "i8271:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc, true).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "i8271:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc).enable_sound(true);
/* Add Torch Z80 Communicator co-processor */
- MCFG_DEVICE_MODIFY("tube")
- MCFG_SLOT_DEFAULT_OPTION("zep100")
- MCFG_SLOT_FIXED(true)
+ m_tube->set_default_option("zep100");
+ m_tube->set_fixed(true);
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(torch_state::torchh10)
+void torch_state::torchh10(machine_config &config)
+{
torchf(config);
/* fdc */
- MCFG_DEVICE_REMOVE("i8271:1")
+ config.device_remove("i8271:1");
/* Add 10MB HDD */
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(torch_state::torchh21)
+void torch_state::torchh21(machine_config &config)
+{
torchf(config);
/* fdc */
- MCFG_DEVICE_REMOVE("i8271:1")
+ config.device_remove("i8271:1");
/* Add 21MB HDD */
-MACHINE_CONFIG_END
+}
/***************************************************************************
@@ -1137,94 +1125,74 @@ MACHINE_CONFIG_END
****************************************************************************/
-MACHINE_CONFIG_START(bbc_state::abc110)
+void bbc_state::abc110(machine_config &config)
+{
bbcbp(config);
/* fdc */
- MCFG_DEVICE_REMOVE("wd1770:1")
+ config.device_remove("wd1770:1");
/* Acorn Z80 co-processor */
- MCFG_DEVICE_MODIFY("tube")
- MCFG_SLOT_DEFAULT_OPTION("z80")
- MCFG_SLOT_FIXED(true)
+ m_tube->set_default_option("z80");
+ m_tube->set_fixed(true);
/* Add ADAPTEC ACB-4000 Winchester Disc Controller */
- //scsi_port_device &scsibus(SCSI_PORT(config, SCSIBUS_TAG));
- //scsibus.set_data_input_buffer("scsi_data_in");
- //scsibus.msg_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::write_bit0));
- //scsibus.bsy_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::scsi_bsy_w))
- //scsibus.req_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::scsi_req_w))
- //scsibus.io_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::write_bit6));
- //scsibus.cd_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::write_bit7));
- //scsibus.set_slot_device(1, "harddisk", ACB4070, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_0));
-
- //output_latch_device &scsiout(OUTPUT_LATCH(config, "scsi_data_out"));
- //scsibus.set_output_latch(scsiout);
- //scsiout.bit_handler<0>().set("scsi", FUNC(scsi_port_device::write_data0));
- //scsiout.bit_handler<1>().set("scsi", FUNC(scsi_port_device::write_data1));
- //scsiout.bit_handler<2>().set("scsi", FUNC(scsi_port_device::write_data2));
- //scsiout.bit_handler<3>().set("scsi", FUNC(scsi_port_device::write_data3));
- //scsiout.bit_handler<4>().set("scsi", FUNC(scsi_port_device::write_data4));
- //scsiout.bit_handler<5>().set("scsi", FUNC(scsi_port_device::write_data5));
- //scsiout.bit_handler<6>().set("scsi", FUNC(scsi_port_device::write_data6));
- //scsiout.bit_handler<7>().set("scsi", FUNC(scsi_port_device::write_data7));
-
- //INPUT_BUFFER(config, "scsi_ctrl_in");
- //INPUT_BUFFER(config, "scsi_data_in");
/* Add 10MB ST-412 Winchester */
/* software lists */
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
-MACHINE_CONFIG_END
+ config.device_remove("cass_ls_a");
+ config.device_remove("cass_ls_b");
+ config.device_remove("flop_ls_b");
+ config.device_remove("flop_ls_b_orig");
+}
-MACHINE_CONFIG_START(bbc_state::acw443)
+void bbc_state::acw443(machine_config &config)
+{
bbcbp(config);
/* fdc */
- MCFG_DEVICE_REMOVE("wd1770:1")
+ config.device_remove("wd1770:1");
/* Add 32016 co-processor */
- //MCFG_DEVICE_MODIFY("tube")
- //MCFG_SLOT_DEFAULT_OPTION("32016")
- //MCFG_SLOT_FIXED(true)
+ //m_tube->set_default_option("32016");
+ //m_tube->set_fixed(true);
/* Add ADAPTEC ACB-4000 Winchester Disc Controller */
+ //m_1mhzbus->set_default_option("awdd");
+ //m_1mhzbus->set_fixed(true);
/* Add 10MB ST-412 Winchester ABC210 */
/* Add 20MB ST-412 Winchester Cambridge */
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_ls_32016", "bbc_flop_32016")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_ls_32016").set_original("bbc_flop_32016");
+ config.device_remove("cass_ls_a");
+ config.device_remove("cass_ls_b");
+ config.device_remove("flop_ls_b");
+ config.device_remove("flop_ls_b_orig");
+}
-MACHINE_CONFIG_START(bbc_state::abc310)
+void bbc_state::abc310(machine_config &config)
+{
bbcbp(config);
/* fdc */
- MCFG_DEVICE_REMOVE("wd1770:1")
+ config.device_remove("wd1770:1");
/* Acorn 80286 co-processor */
- MCFG_DEVICE_MODIFY("tube")
- MCFG_SLOT_DEFAULT_OPTION("80286")
- MCFG_SLOT_FIXED(true)
+ m_tube->set_default_option("80286");
+ m_tube->set_fixed(true);
/* Add ADAPTEC ACB-4000 Winchester Disc Controller */
/* Add 10MB ST-412 Winchester */
/* software lists */
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
-MACHINE_CONFIG_END
+ config.device_remove("cass_ls_a");
+ config.device_remove("cass_ls_b");
+ config.device_remove("flop_ls_b");
+}
/***************************************************************************
@@ -1234,35 +1202,35 @@ MACHINE_CONFIG_END
****************************************************************************/
-MACHINE_CONFIG_START(bbc_state::reutapm)
+void bbc_state::reutapm(machine_config &config)
+{
bbcbp(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu") /* M6512 */
- MCFG_DEVICE_PROGRAM_MAP(reutapm_mem)
- MCFG_DEVICE_OPCODES_MAP(bbcbp_fetch)
+ m_maincpu->set_addrmap(AS_PROGRAM, &bbc_state::reutapm_mem);
+ m_maincpu->set_addrmap(AS_OPCODES, &bbc_state::bbcbp_fetch);
/* sound hardware */
- MCFG_DEVICE_REMOVE("mono")
- MCFG_DEVICE_REMOVE("sn76489")
- MCFG_DEVICE_REMOVE("samples")
- MCFG_DEVICE_REMOVE("vsm")
- MCFG_DEVICE_REMOVE("tms5220")
+ config.device_remove("mono");
+ config.device_remove("sn76489");
+ config.device_remove("samples");
+ config.device_remove("vsm");
+ config.device_remove("tms5220");
/* cassette */
- MCFG_DEVICE_REMOVE( "cassette" )
+ config.device_remove("cassette");
/* fdc */
config.device_remove("wd1770");
/* software lists */
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
+ config.device_remove("cass_ls_a");
+ config.device_remove("cass_ls_b");
+ config.device_remove("flop_ls_b");
+ config.device_remove("flop_ls_b_orig");
/* expansion ports */
- MCFG_DEVICE_REMOVE("analogue")
-MACHINE_CONFIG_END
+ config.device_remove("analogue");
+}
/***************************************************************************
@@ -1280,11 +1248,12 @@ void bbc_state::econx25(machine_config &config)
config.device_remove("tms5220");
/* fdc */
- //config.device_remove("wd1770");
+ //config.device_remove("wd1770")
/* Add Econet X25 Gateway co-processor */
- //MCFG_DEVICE_MODIFY("tube")
- //MCFG_DEVICE_SLOT_INTERFACE(bbc_x25tube_devices, "x25", true)
+ //m_tube->option_list(bbc_x25tube_devices);
+ //m_tube->set_default_option("x25");
+ //m_tube->set_fixed(true);
/* software lists */
config.device_remove("cass_ls_a");
@@ -1303,14 +1272,13 @@ void bbc_state::econx25(machine_config &config)
MACHINE_CONFIG_START(bbc_state::bbcm)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M65SC02, 16_MHz_XTAL/8) /* 2.00 MHz */
- MCFG_DEVICE_PROGRAM_MAP(bbcm_mem)
- MCFG_DEVICE_OPCODES_MAP(bbcm_fetch)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(bbc_state, bbcb_keyscan, 1000) /* scan keyboard */
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ M65SC02(config, m_maincpu, 16_MHz_XTAL / 8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &bbc_state::bbcm_mem);
+ m_maincpu->set_addrmap(AS_OPCODES, &bbc_state::bbcm_fetch);
+ m_maincpu->set_periodic_int(FUNC(bbc_state::bbcb_keyscan), attotime::from_hz(1000)); /* scan keyboard */
+ config.m_minimum_quantum = attotime::from_hz(60);
- MCFG_INPUT_MERGER_ANY_HIGH("irqs")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", M6502_IRQ_LINE))
+ INPUT_MERGER_ANY_HIGH(config, m_irqs).output_handler().set_inputline(m_maincpu, M6502_IRQ_LINE);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("32K").set_default_value(0x00);
@@ -1321,67 +1289,69 @@ MACHINE_CONFIG_START(bbc_state::bbcm)
config.set_default_layout(layout_bbcm);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(16_MHz_XTAL, 1024, 0, 640, 312, 0, 256)
- MCFG_SCREEN_UPDATE_DEVICE("hd6845", hd6845_device, screen_update)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(16_MHz_XTAL, 1024, 0, 640, 312, 0, 256);
+ m_screen->set_screen_update("hd6845", FUNC(hd6845_device::screen_update));
- MCFG_PALETTE_ADD("palette", 16)
- MCFG_PALETTE_INIT_OWNER(bbc_state, bbc)
+ palette_device &palette(PALETTE(config, "palette", 16));
+ palette.set_init(palette_init_delegate(FUNC(bbc_state::palette_init_bbc), this));
- MCFG_DEVICE_ADD("saa5050", SAA5050, 12_MHz_XTAL / 2)
- MCFG_SAA5050_SCREEN_SIZE(40, 25, 40)
+ SAA5050(config, m_trom, 12_MHz_XTAL / 2);
+ m_trom->set_screen_size(40, 25, 40);
/* crtc */
- MCFG_MC6845_ADD("hd6845", HD6845, "screen", 16_MHz_XTAL / 8)
- MCFG_MC6845_SHOW_BORDER_AREA(false)
- MCFG_MC6845_CHAR_WIDTH(12)
- MCFG_MC6845_UPDATE_ROW_CB(bbc_state, crtc_update_row)
- MCFG_MC6845_OUT_DE_CB(WRITELINE(*this, bbc_state, bbc_de_changed))
- MCFG_MC6845_OUT_HSYNC_CB(WRITELINE(*this, bbc_state, bbc_hsync_changed))
- MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(*this, bbc_state, bbc_vsync_changed))
+ HD6845(config, m_hd6845, 16_MHz_XTAL / 8);
+ m_hd6845->set_screen("screen");
+ m_hd6845->set_show_border_area(false);
+ m_hd6845->set_char_width(12);
+ m_hd6845->set_update_row_callback(FUNC(bbc_state::crtc_update_row), this);
+ m_hd6845->out_de_callback().set(FUNC(bbc_state::bbc_de_changed));
+ m_hd6845->out_hsync_callback().set(FUNC(bbc_state::bbc_hsync_changed));
+ m_hd6845->out_vsync_callback().set(FUNC(bbc_state::bbc_vsync_changed));
MCFG_VIDEO_START_OVERRIDE(bbc_state, bbc)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn76489", SN76489, 16_MHz_XTAL/4) /* 4 MHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ SN76489(config, m_sn, 16_MHz_XTAL / 4);
+ m_sn->add_route(ALL_OUTPUTS, "mono", 1.0);
/* cassette relay */
- MCFG_DEVICE_ADD("samples", SAMPLES)
- MCFG_SAMPLES_CHANNELS(1)
- MCFG_SAMPLES_NAMES(bbc_sample_names)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ SAMPLES(config, m_samples);
+ m_samples->set_channels(1);
+ m_samples->set_samples_names(bbc_sample_names);
+ m_samples->add_route(ALL_OUTPUTS, "mono", 1.0);
/* rtc and cmos */
- MCFG_DEVICE_ADD("rtc", MC146818, 32.768_kHz_XTAL)
+ MC146818(config, m_rtc, 32.768_kHz_XTAL);
/* printer */
centronics_device &centronics(CENTRONICS(config, "centronics", centronics_devices, "printer"));
centronics.ack_handler().set("via6522_1", FUNC(via6522_device::write_ca1)).invert(); // ack seems to be inverted?
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ output_latch_device &latch(OUTPUT_LATCH(config, "cent_data_out"));
+ centronics.set_output_latch(latch);
/* cassette */
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(bbc_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED)
- MCFG_CASSETTE_INTERFACE("bbc_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(bbc_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED);
+ m_cassette->set_interface("bbc_cass");
// 2 x cartridge sockets in BBC-Master
- MCFG_GENERIC_CARTSLOT_ADD("exp_rom1", generic_plain_slot, "bbcm_cart")
- MCFG_GENERIC_LOAD(bbc_state, bbcm_exp1_load)
+ GENERIC_CARTSLOT(config, m_exp1, generic_linear_slot, "bbcm_cart", "bin,rom");
+ m_exp1->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_bbcm_cart1_load, this));
- MCFG_GENERIC_CARTSLOT_ADD("exp_rom2", generic_plain_slot, "bbcm_cart")
- MCFG_GENERIC_LOAD(bbc_state, bbcm_exp2_load)
+ GENERIC_CARTSLOT(config, m_exp2, generic_linear_slot, "bbcm_cart", "bin,rom");
+ m_exp2->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_bbcm_cart2_load, this));
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("cass_ls_m", "bbcm_cass")
- MCFG_SOFTWARE_LIST_ADD("flop_ls_m", "bbcm_flop")
- MCFG_SOFTWARE_LIST_ADD("cart_ls_m", "bbcm_cart")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("cass_ls_a", "bbca_cass")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("cass_ls_b", "bbcb_cass")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("flop_ls_b", "bbcb_flop")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("flop_ls_b_orig", "bbcb_flop_orig")
+ SOFTWARE_LIST(config, "cass_ls_m").set_original("bbcm_cass");
+ SOFTWARE_LIST(config, "flop_ls_m").set_original("bbcm_flop");
+ SOFTWARE_LIST(config, "cart_ls_m").set_original("bbcm_cart");
+ SOFTWARE_LIST(config, "cass_ls_a").set_compatible("bbca_cass");
+ SOFTWARE_LIST(config, "cass_ls_b").set_compatible("bbcb_cass");
+ SOFTWARE_LIST(config, "flop_ls_b").set_compatible("bbcb_flop");
+ SOFTWARE_LIST(config, "flop_ls_b_orig").set_compatible("bbcb_flop_orig");
/* acia */
ACIA6850(config, m_acia, 0);
@@ -1389,13 +1359,13 @@ MACHINE_CONFIG_START(bbc_state::bbcm)
m_acia->rts_handler().set(FUNC(bbc_state::bbc_rts_w));
m_acia->irq_handler().set("irqs", FUNC(input_merger_device::in_w<0>));
- MCFG_DEVICE_ADD(RS232_TAG, RS232_PORT, default_rs232_devices, nullptr)
- MCFG_RS232_RXD_HANDLER(WRITELINE(*this, bbc_state, write_rxd_serial))
- MCFG_RS232_DCD_HANDLER(WRITELINE(*this, bbc_state, write_dcd_serial))
- MCFG_RS232_CTS_HANDLER(WRITELINE(*this, bbc_state, write_cts_serial))
+ RS232_PORT(config, m_rs232, default_rs232_devices, nullptr);
+ m_rs232->rxd_handler().set(FUNC(bbc_state::write_rxd_serial));
+ m_rs232->dcd_handler().set(FUNC(bbc_state::write_dcd_serial));
+ m_rs232->cts_handler().set(FUNC(bbc_state::write_cts_serial));
- MCFG_DEVICE_ADD("acia_clock", CLOCK, 16_MHz_XTAL / 13)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, bbc_state, write_acia_clock))
+ CLOCK(config, m_acia_clock, 16_MHz_XTAL / 13);
+ m_acia_clock->signal_handler().set(FUNC(bbc_state::write_acia_clock));
/* adc */
MCFG_DEVICE_ADD("upd7002", UPD7002, 0)
@@ -1423,152 +1393,156 @@ MACHINE_CONFIG_START(bbc_state::bbcm)
m_wd1770->intrq_wr_callback().set(FUNC(bbc_state::fdc_intrq_w));
m_wd1770->drq_wr_callback().set(FUNC(bbc_state::fdc_drq_w));
- MCFG_FLOPPY_DRIVE_ADD("wd1770:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("wd1770:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "wd1770:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "wd1770:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc).enable_sound(true);
/* econet */
MC6854(config, m_adlc);
m_adlc->out_txd_cb().set(ECONET_TAG, FUNC(econet_device::host_data_w));
m_adlc->out_irq_cb().set(FUNC(bbc_state::adlc_irq_w));
- MCFG_ECONET_ADD()
- MCFG_ECONET_CLK_CALLBACK(WRITELINE(*this, bbc_state, econet_clk_w))
- MCFG_ECONET_DATA_CALLBACK(WRITELINE("mc6854", mc6854_device, set_rx))
- MCFG_ECONET_SLOT_ADD("econet254", 254, econet_devices, nullptr)
+
+ econet_device &econet(ECONET(config, "econet", 0));
+ econet.clk_wr_callback().set(m_adlc, FUNC(mc6854_device::txc_w));
+ econet.clk_wr_callback().append(m_adlc, FUNC(mc6854_device::rxc_w));
+ econet.data_wr_callback().set(m_adlc, FUNC(mc6854_device::set_rx));
+
+ econet_slot_device &econet_slot(ECONET_SLOT(config, "econet254", 0));
+ econet_devices(econet_slot);
+ econet_slot.set_slot(254);
/* analogue port */
- MCFG_BBC_ANALOGUE_SLOT_ADD("analogue", bbc_analogue_devices, nullptr)
+ BBC_ANALOGUE_SLOT(config, m_analog, bbc_analogue_devices, nullptr);
/* 1mhz bus port */
- MCFG_BBC_1MHZBUS_SLOT_ADD("1mhzbus", bbc_1mhzbus_devices, nullptr)
- MCFG_BBC_1MHZBUS_SLOT_IRQ_HANDLER(WRITELINE("irqs", input_merger_device, in_w<3>))
- MCFG_BBC_1MHZBUS_SLOT_NMI_HANDLER(WRITELINE(*this, bbc_state, bus_nmi_w))
+ BBC_1MHZBUS_SLOT(config, m_1mhzbus, bbc_1mhzbus_devices, nullptr);
+ m_1mhzbus->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<3>));
+ m_1mhzbus->nmi_handler().set(FUNC(bbc_state::bus_nmi_w));
/* tube ports */
- MCFG_BBC_TUBE_SLOT_ADD("intube", bbc_intube_devices, nullptr)
- MCFG_BBC_TUBE_SLOT_IRQ_HANDLER(WRITELINE("irqs", input_merger_device, in_w<4>))
- MCFG_BBC_TUBE_SLOT_ADD("extube", bbc_extube_devices, nullptr)
- MCFG_BBC_TUBE_SLOT_IRQ_HANDLER(WRITELINE("irqs", input_merger_device, in_w<5>))
+ BBC_TUBE_SLOT(config, m_intube, bbc_intube_devices, nullptr);
+ m_intube->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<4>));
+ BBC_TUBE_SLOT(config, m_extube, bbc_extube_devices, nullptr);
+ m_extube->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<5>));
/* user port */
- MCFG_BBC_USERPORT_SLOT_ADD("userport", bbc_userport_devices, nullptr)
- MCFG_BBC_USERPORT_CB1_HANDLER(WRITELINE("via6522_1", via6522_device, write_cb1))
- MCFG_BBC_USERPORT_CB2_HANDLER(WRITELINE("via6522_1", via6522_device, write_cb2))
+ BBC_USERPORT_SLOT(config, m_userport, bbc_userport_devices, nullptr);
+ m_userport->cb1_handler().set(m_via6522_1, FUNC(via6522_device::write_cb1));
+ m_userport->cb2_handler().set(m_via6522_1, FUNC(via6522_device::write_cb2));
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(bbc_state::bbcmt)
+void bbc_state::bbcmt(machine_config &config)
+{
bbcm(config);
/* Acorn 65C102 co-processor */
- MCFG_DEVICE_MODIFY("intube")
- MCFG_SLOT_DEFAULT_OPTION("65c102")
- MCFG_SLOT_FIXED(true)
-MACHINE_CONFIG_END
+ m_intube->set_default_option("65c102");
+ m_intube->set_fixed(true);
+}
-MACHINE_CONFIG_START(bbc_state::bbcmaiv)
+void bbc_state::bbcmaiv(machine_config &config)
+{
bbcm(config);
/* Acorn 65C102 co-processor */
- MCFG_DEVICE_MODIFY("intube")
- MCFG_SLOT_DEFAULT_OPTION("65c102")
- MCFG_SLOT_FIXED(true)
+ m_intube->set_default_option("65c102");
+ m_intube->set_fixed(true);
/* Add Philips VP415 Laserdisc player */
/* Acorn Tracker Ball */
- MCFG_DEVICE_MODIFY("userport")
- MCFG_SLOT_DEFAULT_OPTION("tracker")
-MACHINE_CONFIG_END
+ m_userport->set_default_option("tracker");
+}
-MACHINE_CONFIG_START(bbc_state::bbcmet)
+void bbc_state::bbcmet(machine_config &config)
+{
bbcm(config);
/* printer */
- MCFG_DEVICE_REMOVE("centronics")
- MCFG_DEVICE_REMOVE("cent_data_out")
+ config.device_remove("centronics");
+ config.device_remove("cent_data_out");
/* cassette */
- MCFG_DEVICE_REMOVE("cassette")
+ config.device_remove("cassette");
/* software lists */
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_m")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_m")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
+ config.device_remove("cass_ls_m");
+ config.device_remove("cass_ls_a");
+ config.device_remove("cass_ls_b");
+ config.device_remove("flop_ls_m");
+ config.device_remove("flop_ls_b");
+ config.device_remove("flop_ls_b_orig");
/* acia */
- MCFG_DEVICE_REMOVE("acia6850")
- MCFG_DEVICE_REMOVE(RS232_TAG)
- MCFG_DEVICE_REMOVE("acia_clock")
+ config.device_remove("acia6850");
+ config.device_remove(RS232_TAG);
+ config.device_remove("acia_clock");
/* devices */
- MCFG_DEVICE_REMOVE("upd7002")
- MCFG_DEVICE_REMOVE("via6522_1")
+ config.device_remove("upd7002");
+ config.device_remove("via6522_1");
/* fdc */
config.device_remove("wd1770");
- /* expansion ports */
- MCFG_DEVICE_REMOVE("analogue")
- MCFG_DEVICE_REMOVE("extube")
- MCFG_DEVICE_REMOVE("1mhzbus")
- MCFG_DEVICE_REMOVE("userport")
-MACHINE_CONFIG_END
+ /* expansion ports (not fitted) */
+ config.device_remove("analogue");
+ config.device_remove("extube");
+ config.device_remove("1mhzbus");
+ config.device_remove("userport");
+}
-MACHINE_CONFIG_START(bbc_state::bbcm512)
+void bbc_state::bbcm512(machine_config &config)
+{
bbcm(config);
/* Acorn Intel 80186 co-processor */
- MCFG_DEVICE_MODIFY("intube")
- MCFG_SLOT_DEFAULT_OPTION("80186")
- MCFG_SLOT_FIXED(true)
+ m_intube->set_default_option("80186");
+ m_intube->set_fixed(true);
/* Acorn Mouse */
- MCFG_DEVICE_MODIFY("userport")
- MCFG_SLOT_DEFAULT_OPTION("m512mouse")
-MACHINE_CONFIG_END
+ m_userport->set_default_option("m512mouse");
+}
-MACHINE_CONFIG_START(bbc_state::bbcmarm)
+void bbc_state::bbcmarm(machine_config &config)
+{
bbcm(config);
/* Acorn ARM co-processor */
- MCFG_DEVICE_MODIFY("extube")
- MCFG_SLOT_DEFAULT_OPTION("arm")
- MCFG_SLOT_FIXED(true)
-MACHINE_CONFIG_END
+ m_extube->set_default_option("arm");
+ m_extube->set_fixed(true);
+}
-MACHINE_CONFIG_START(bbc_state::discmon)
+void bbc_state::discmon(machine_config &config)
+{
bbcm(config);
/* Add coin slot */
/* software lists */
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_m")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_m")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
-MACHINE_CONFIG_END
+ config.device_remove("cass_ls_m");
+ config.device_remove("cass_ls_a");
+ config.device_remove("cass_ls_b");
+ config.device_remove("flop_ls_m");
+ config.device_remove("flop_ls_b");
+ config.device_remove("flop_ls_b_orig");
+}
-MACHINE_CONFIG_START(bbc_state::discmate)
+void bbc_state::discmate(machine_config &config)
+{
bbcm(config);
/* Add Sony CDK-3000PII Auto Disc Loader */
/* Add interface boards connected to cassette and RS423 */
/* software lists */
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_m")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_m")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
-MACHINE_CONFIG_END
+ config.device_remove("cass_ls_m");
+ config.device_remove("cass_ls_a");
+ config.device_remove("cass_ls_b");
+ config.device_remove("flop_ls_m");
+ config.device_remove("flop_ls_b");
+ config.device_remove("flop_ls_b_orig");
+}
MACHINE_CONFIG_START(bbc_state::cfa3000)
@@ -1582,24 +1556,21 @@ MACHINE_CONFIG_START(bbc_state::cfa3000)
MCFG_DEVICE_SLOT_INTERFACE(bbc_floppies_525, nullptr, false)
/* keyboard */
- MCFG_DEVICE_MODIFY("userport")
- MCFG_SLOT_DEFAULT_OPTION("cfa3000kbd")
+ m_userport->set_default_option("cfa3000kbd");
/* option board */
- MCFG_DEVICE_MODIFY("1mhzbus")
- MCFG_SLOT_DEFAULT_OPTION("cfa3000opt")
+ m_1mhzbus->set_default_option("cfa3000opt");
/* analogue dials/sensors */
- MCFG_DEVICE_MODIFY("analogue")
- MCFG_SLOT_DEFAULT_OPTION("cfa3000a")
+ m_analog->set_default_option("cfa3000a");
/* software lists */
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_m")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_m")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
+ config.device_remove("cass_ls_m");
+ config.device_remove("cass_ls_a");
+ config.device_remove("cass_ls_b");
+ config.device_remove("flop_ls_m");
+ config.device_remove("flop_ls_b");
+ config.device_remove("flop_ls_b_orig");
MACHINE_CONFIG_END
@@ -1613,22 +1584,20 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(bbc_state::bbcmc)
bbcm(config);
/* cassette */
- MCFG_DEVICE_REMOVE("cassette")
+ config.device_remove("cassette");
/* fdc */
config.device_remove("wd1770");
- wd1772_device& wd1772(WD1772(config, "wd1772", 16_MHz_XTAL / 2));
- wd1772.intrq_wr_callback().set(FUNC(bbc_state::fdc_intrq_w));
- wd1772.drq_wr_callback().set(FUNC(bbc_state::fdc_drq_w));
+ WD1772(config, m_wd1772, 16_MHz_XTAL / 2);
+ m_wd1772->intrq_wr_callback().set(FUNC(bbc_state::fdc_intrq_w));
+ m_wd1772->drq_wr_callback().set(FUNC(bbc_state::fdc_drq_w));
- MCFG_FLOPPY_DRIVE_ADD_FIXED("wd1772:0", bbc_floppies_35, "35dd", bbc_state::floppy_formats_bbc)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("wd1772:1", bbc_floppies_35, nullptr, bbc_state::floppy_formats_bbc)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "wd1772:0", bbc_floppies_35, "35dd", bbc_state::floppy_formats_bbc, true).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "wd1772:1", bbc_floppies_35, nullptr, bbc_state::floppy_formats_bbc).enable_sound(true);
/* eeprom pcd8572 */
- //MCFG_DEVICE_REMOVE("rtc")
+ //config.device_remove("rtc");
MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcmc)
MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcmc)
@@ -1639,39 +1608,40 @@ MACHINE_CONFIG_START(bbc_state::bbcmc)
m_via6522_1->writepb_handler().set("joyport", FUNC(bbc_joyport_slot_device::pb_w));
/* cartridge sockets */
- MCFG_DEVICE_REMOVE("exp_rom1")
- MCFG_DEVICE_REMOVE("exp_rom2")
+ config.device_remove("exp_rom1");
+ config.device_remove("exp_rom2");
/* software lists */
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_m")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_m")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
- MCFG_SOFTWARE_LIST_REMOVE("cart_ls_m")
- MCFG_SOFTWARE_LIST_ADD("flop_ls_mc", "bbcmc_flop")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("flop_ls_pro128s", "pro128s_flop")
+ config.device_remove("cass_ls_m");
+ config.device_remove("cass_ls_a");
+ config.device_remove("cass_ls_b");
+ config.device_remove("flop_ls_m");
+ config.device_remove("flop_ls_b");
+ config.device_remove("flop_ls_b_orig");
+ config.device_remove("cart_ls_m");
+ SOFTWARE_LIST(config, "flop_ls_mc").set_original("bbcmc_flop");
+ SOFTWARE_LIST(config, "flop_ls_pro128s").set_compatible("pro128s_flop");
/* expansion ports */
- MCFG_BBC_JOYPORT_ADD("joyport", bbc_joyport_devices, "joystick")
- MCFG_BBC_JOYPORT_CB1_HANDLER(WRITELINE("via6522_1", via6522_device, write_cb1))
- MCFG_BBC_JOYPORT_CB2_HANDLER(WRITELINE("via6522_1", via6522_device, write_cb2))
+ BBC_JOYPORT_SLOT(config, m_joyport, bbc_joyport_devices, "joystick");
+ m_joyport->cb1_handler().set(m_via6522_1, FUNC(via6522_device::write_cb1));
+ m_joyport->cb2_handler().set(m_via6522_1, FUNC(via6522_device::write_cb2));
- MCFG_DEVICE_REMOVE("analogue")
- MCFG_DEVICE_REMOVE("intube")
- MCFG_DEVICE_REMOVE("extube")
+ config.device_remove("analogue");
+ config.device_remove("intube");
+ config.device_remove("extube");
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(bbc_state::pro128s)
+void bbc_state::pro128s(machine_config &config)
+{
bbcmc(config);
/* software lists */
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_mc")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_pro128s")
- MCFG_SOFTWARE_LIST_ADD("flop_ls_pro128s", "pro128s_flop")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("flop_ls_mc", "bbcmc_flop")
-MACHINE_CONFIG_END
+ config.device_remove("flop_ls_mc");
+ config.device_remove("flop_ls_pro128s");
+ SOFTWARE_LIST(config, "flop_ls_pro128s").set_original("pro128s_flop");
+ SOFTWARE_LIST(config, "flop_ls_mc").set_compatible("bbcmc_flop");
+}
/***************************************************************************
diff --git a/src/mame/drivers/bingoc.cpp b/src/mame/drivers/bingoc.cpp
index f4b3e9c3296..51266ba6d62 100644
--- a/src/mame/drivers/bingoc.cpp
+++ b/src/mame/drivers/bingoc.cpp
@@ -129,22 +129,14 @@ WRITE8_MEMBER(bingoc_state::sound_play_w)
void bingoc_state::main_map(address_map &map)
{
map(0x000000, 0x03ffff).rom();
- map(0x100001, 0x100001).rw("uart1", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x100003, 0x100003).rw("uart1", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0x100009, 0x100009).rw("uart2", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x10000b, 0x10000b).rw("uart2", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0x100011, 0x100011).rw("uart3", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x100013, 0x100013).rw("uart3", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0x100019, 0x100019).rw("uart4", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x10001b, 0x10001b).rw("uart4", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0x100021, 0x100021).rw("uart5", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x100023, 0x100023).rw("uart5", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0x100029, 0x100029).rw("uart6", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x10002b, 0x10002b).rw("uart6", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0x100031, 0x100031).rw("uart7", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x100033, 0x100033).rw("uart7", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0x100039, 0x100039).rw("uart8", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x10003b, 0x10003b).rw("uart8", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x100000, 0x100003).rw("uart1", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
+ map(0x100008, 0x10000b).rw("uart2", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
+ map(0x100010, 0x100013).rw("uart3", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
+ map(0x100018, 0x10001b).rw("uart4", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
+ map(0x100020, 0x100023).rw("uart5", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
+ map(0x100028, 0x10002b).rw("uart6", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
+ map(0x100030, 0x100033).rw("uart7", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
+ map(0x100038, 0x10003b).rw("uart8", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
map(0x180000, 0x18001f).rw("io", FUNC(sega_315_5338a_device::read), FUNC(sega_315_5338a_device::write)).umask16(0x00ff); //lamps?
#if 0 // !SOUND_TEST
map(0x180010, 0x180011).w(FUNC(bingoc_state::main_sound_latch_w)); //WRONG there...
diff --git a/src/mame/drivers/bw2.cpp b/src/mame/drivers/bw2.cpp
index 55dd940c817..564a3d000af 100644
--- a/src/mame/drivers/bw2.cpp
+++ b/src/mame/drivers/bw2.cpp
@@ -191,8 +191,7 @@ void bw2_state::bw2_io(address_map &map)
map(0x10, 0x13).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write));
map(0x20, 0x21).m(m_lcdc, FUNC(msm6255_device::map));
map(0x30, 0x3f).rw(m_exp, FUNC(bw2_expansion_slot_device::slot_r), FUNC(bw2_expansion_slot_device::slot_w));
- map(0x40, 0x40).rw(m_uart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x41, 0x41).rw(m_uart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x40, 0x41).rw(m_uart, FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x50, 0x50).w("cent_data_out", FUNC(output_latch_device::bus_w));
map(0x60, 0x63).rw(m_fdc, FUNC(wd2797_device::read), FUNC(wd2797_device::write));
map(0x70, 0x7f).rw(m_exp, FUNC(bw2_expansion_slot_device::modsel_r), FUNC(bw2_expansion_slot_device::modsel_w));
diff --git a/src/mame/drivers/cgc7900.cpp b/src/mame/drivers/cgc7900.cpp
index 6b02457a645..d14c727179c 100644
--- a/src/mame/drivers/cgc7900.cpp
+++ b/src/mame/drivers/cgc7900.cpp
@@ -347,10 +347,8 @@ void cgc7900_state::cgc7900_mem(address_map &map)
// AM_RANGE(0xefc446, 0xefc447) HVG Load dY
// AM_RANGE(0xefc448, 0xefc449) HVG Load Pixel Color
// AM_RANGE(0xefc44a, 0xefc44b) HVG Load Trip
- map(0xff8001, 0xff8001).rw(m_i8251_0, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xff8003, 0xff8003).rw(m_i8251_0, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0xff8041, 0xff8041).rw(m_i8251_1, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xff8043, 0xff8043).rw(m_i8251_1, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xff8000, 0xff8003).rw(m_i8251_0, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
+ map(0xff8040, 0xff8043).rw(m_i8251_1, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
map(0xff8080, 0xff8081).rw(FUNC(cgc7900_state::keyboard_r), FUNC(cgc7900_state::keyboard_w));
// AM_RANGE(0xff80c6, 0xff80c7) Joystick X axis
// AM_RANGE(0xff80ca, 0xff80cb) Joystick Y axis
diff --git a/src/mame/drivers/cit101.cpp b/src/mame/drivers/cit101.cpp
index 62848c4adbd..0f450b1276b 100644
--- a/src/mame/drivers/cit101.cpp
+++ b/src/mame/drivers/cit101.cpp
@@ -306,12 +306,9 @@ void cit101_state::mem_map(address_map &map)
map(0x8000, 0xbfff).ram().share("extraram"); // only 4 bits wide?
map(0x8000, 0x8000).w(FUNC(cit101_state::screen_control_w));
map(0xc000, 0xdfff).rw(FUNC(cit101_state::c000_ram_r), FUNC(cit101_state::c000_ram_w));
- map(0xfc00, 0xfc00).rw("auxuart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xfc01, 0xfc01).rw("auxuart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0xfc20, 0xfc20).rw("comuart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xfc21, 0xfc21).rw("comuart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0xfc40, 0xfc40).rw("kbduart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xfc41, 0xfc41).rw("kbduart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xfc00, 0xfc01).rw("auxuart", FUNC(i8251_device::read), FUNC(i8251_device::write));
+ map(0xfc20, 0xfc21).rw("comuart", FUNC(i8251_device::read), FUNC(i8251_device::write));
+ map(0xfc40, 0xfc41).rw("kbduart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0xfc60, 0xfc63).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0xfc80, 0xfc83).w("pit0", FUNC(pit8253_device::write));
map(0xfcc0, 0xfcc3).w("pit1", FUNC(pit8253_device::write));
@@ -319,12 +316,9 @@ void cit101_state::mem_map(address_map &map)
void cit101_state::io_map(address_map &map)
{
- map(0x00, 0x00).rw("auxuart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x01, 0x01).rw("auxuart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0x20, 0x20).rw("comuart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x21, 0x21).rw("comuart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0x40, 0x40).rw("kbduart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x41, 0x41).rw("kbduart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x00, 0x01).rw("auxuart", FUNC(i8251_device::read), FUNC(i8251_device::write));
+ map(0x20, 0x21).rw("comuart", FUNC(i8251_device::read), FUNC(i8251_device::write));
+ map(0x40, 0x41).rw("kbduart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x60, 0x63).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0xa0, 0xa0).w(FUNC(cit101_state::brightness_w));
map(0xe0, 0xe0).rw(FUNC(cit101_state::e0_latch_r), FUNC(cit101_state::e0_latch_w));
diff --git a/src/mame/drivers/cit220.cpp b/src/mame/drivers/cit220.cpp
index 851c8fd4309..17ce79680d7 100644
--- a/src/mame/drivers/cit220.cpp
+++ b/src/mame/drivers/cit220.cpp
@@ -70,8 +70,7 @@ void cit220_state::mem_map(address_map &map)
void cit220_state::io_map(address_map &map)
{
map(0x00, 0x0f).rw("duart", FUNC(scn2681_device::read), FUNC(scn2681_device::write));
- map(0x10, 0x10).rw("usart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x11, 0x11).rw("usart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x10, 0x11).rw("usart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x20, 0x27).rw("avdc", FUNC(scn2674_device::read), FUNC(scn2674_device::write));
map(0xa0, 0xa0).rw("avdc", FUNC(scn2674_device::attr_buffer_r), FUNC(scn2674_device::attr_buffer_w));
map(0xc0, 0xc0).rw("avdc", FUNC(scn2674_device::buffer_r), FUNC(scn2674_device::buffer_w));
diff --git a/src/mame/drivers/compis.cpp b/src/mame/drivers/compis.cpp
index ce70b1e4a79..a7ad6f25013 100644
--- a/src/mame/drivers/compis.cpp
+++ b/src/mame/drivers/compis.cpp
@@ -203,14 +203,7 @@ READ16_MEMBER( compis_state::pcs6_2_3_r )
}
else
{
- if (BIT(offset, 0))
- {
- return m_uart->status_r(space, 0) << 8;
- }
- else
- {
- return m_uart->data_r(space, 0) << 8;
- }
+ return m_uart->read(offset & 1) << 8;
}
}
@@ -221,14 +214,7 @@ WRITE16_MEMBER( compis_state::pcs6_2_3_w )
}
else
{
- if (BIT(offset, 0))
- {
- m_uart->control_w(space, 0, data >> 8);
- }
- else
- {
- m_uart->data_w(space, 0, data >> 8);
- }
+ m_uart->write(offset & 1, data >> 8);
}
}
diff --git a/src/mame/drivers/decwritr.cpp b/src/mame/drivers/decwritr.cpp
index 46c0f0be4f7..e1e2b450db7 100644
--- a/src/mame/drivers/decwritr.cpp
+++ b/src/mame/drivers/decwritr.cpp
@@ -255,8 +255,7 @@ void decwriter_state::la120_mem(address_map &map)
void decwriter_state::la120_io(address_map &map)
{
map.unmap_value_high();
- map(0x00, 0x00).mirror(0x7C).rw(m_usart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); // 8251 Data
- map(0x01, 0x01).mirror(0x7C).rw(m_usart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); // 8251 Status/Control
+ map(0x00, 0x01).mirror(0x7C).rw(m_usart, FUNC(i8251_device::read), FUNC(i8251_device::write)); // 8251 Status/Control
//map(0x02, 0x02).mirror(0x7D); // other io ports, serial loopback etc, see table 4-9 in TM
// 0x80-0xff are reserved for expansion (i.e. unused, open bus)
map.global_mask(0xff);
@@ -462,7 +461,7 @@ MACHINE_CONFIG_START(decwriter_state::la120)
MCFG_RS232_DSR_HANDLER(WRITELINE("usart", i8251_device, write_dsr))
*/
- MCFG_DEVICE_ADD("nvm", ER1400, 0)
+ ER1400(config, m_nvm);
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/duet16.cpp b/src/mame/drivers/duet16.cpp
index 382be0445b9..a66c507484d 100644
--- a/src/mame/drivers/duet16.cpp
+++ b/src/mame/drivers/duet16.cpp
@@ -157,8 +157,7 @@ void duet16_state::duet16_mem(address_map &map)
map(0xf8040, 0xf804f).rw("itm", FUNC(ptm6840_device::read), FUNC(ptm6840_device::write)).umask16(0x00ff);
map(0xf8060, 0xf8067).rw("bgpit", FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0x00ff);
map(0xf8080, 0xf8087).rw("sio", FUNC(upd7201_new_device::ba_cd_r), FUNC(upd7201_new_device::ba_cd_w)).umask16(0x00ff);
- map(0xf80a0, 0xf80a0).rw("kbusart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xf80a2, 0xf80a2).rw("kbusart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xf80a0, 0xf80a3).rw("kbusart", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
map(0xf80c0, 0xf80c0).rw("crtc", FUNC(h46505_device::status_r), FUNC(h46505_device::address_w));
map(0xf80c2, 0xf80c2).rw("crtc", FUNC(h46505_device::register_r), FUNC(h46505_device::register_w));
map(0xf80e0, 0xf80e3).rw("i8741", FUNC(upi41_cpu_device::upi41_master_r), FUNC(upi41_cpu_device::upi41_master_w)).umask16(0x00ff);
diff --git a/src/mame/drivers/dvk_ksm.cpp b/src/mame/drivers/dvk_ksm.cpp
index cc9e8188705..7f2ce0b4754 100644
--- a/src/mame/drivers/dvk_ksm.cpp
+++ b/src/mame/drivers/dvk_ksm.cpp
@@ -174,10 +174,8 @@ void ksm_state::ksm_io(address_map &map)
{
map.unmap_value_high();
map(0x5e, 0x5f).rw(m_pic8259, FUNC(pic8259_device::read), FUNC(pic8259_device::write));
- map(0x6e, 0x6e).rw(m_i8251kbd, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x6f, 0x6f).rw(m_i8251kbd, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0x76, 0x76).rw(m_i8251line, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x77, 0x77).rw(m_i8251line, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x6e, 0x6f).rw(m_i8251kbd, FUNC(i8251_device::read), FUNC(i8251_device::write));
+ map(0x76, 0x77).rw(m_i8251line, FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x78, 0x7b).rw("ppi8255", FUNC(i8255_device::read), FUNC(i8255_device::write));
}
diff --git a/src/mame/drivers/ec7915.cpp b/src/mame/drivers/ec7915.cpp
index 37edfc352fa..e2e8de9a3fb 100644
--- a/src/mame/drivers/ec7915.cpp
+++ b/src/mame/drivers/ec7915.cpp
@@ -46,8 +46,7 @@ void ec7915_state::io_map(address_map &map)
{
map(0x00, 0x03).rw("ppi1", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0x04, 0x07).rw("ppi2", FUNC(i8255_device::read), FUNC(i8255_device::write));
- map(0x08, 0x08).rw("usart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x09, 0x09).rw("usart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x08, 0x09).rw("usart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x0c, 0x0f).rw("ppi3", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0x10, 0x13).w("pit", FUNC(pit8253_device::write));
//map(0x14, 0x14).w("picu", FUNC(i8214_device::write));
diff --git a/src/mame/drivers/ecoinfr.cpp b/src/mame/drivers/ecoinfr.cpp
index bd7facf240d..18cc6751b29 100644
--- a/src/mame/drivers/ecoinfr.cpp
+++ b/src/mame/drivers/ecoinfr.cpp
@@ -488,8 +488,7 @@ void ecoinfr_state::memmap(address_map &map)
map(0x0000, 0x7fff).rom();
map(0x8000, 0x9fff).ram();
- map(0xa000, 0xa000).rw(UPD8251_TAG, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xa001, 0xa001).rw(UPD8251_TAG, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xa000, 0xa001).rw(UPD8251_TAG, FUNC(i8251_device::read), FUNC(i8251_device::write));
}
diff --git a/src/mame/drivers/einstein.cpp b/src/mame/drivers/einstein.cpp
index 7b5a7951cd0..a284efde7fc 100644
--- a/src/mame/drivers/einstein.cpp
+++ b/src/mame/drivers/einstein.cpp
@@ -430,8 +430,7 @@ void einstein_state::einstein_io(address_map &map)
map(0x03, 0x03).mirror(0xff04).w(m_psg, FUNC(ay8910_device::data_w));
map(0x08, 0x08).mirror(0xff06).rw("vdp", FUNC(tms9129_device::vram_r), FUNC(tms9129_device::vram_w));
map(0x09, 0x09).mirror(0xff06).rw("vdp", FUNC(tms9129_device::register_r), FUNC(tms9129_device::register_w));
- map(0x10, 0x10).mirror(0xff06).rw(IC_I060, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x11, 0x11).mirror(0xff06).rw(IC_I060, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x10, 0x11).mirror(0xff06).rw(IC_I060, FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x18, 0x1b).mirror(0xff04).rw(m_fdc, FUNC(wd1770_device::read), FUNC(wd1770_device::write));
map(0x20, 0x20).mirror(0xff00).rw(FUNC(einstein_state::kybint_msk_r), FUNC(einstein_state::kybint_msk_w));
map(0x21, 0x21).mirror(0xff00).w(FUNC(einstein_state::adcint_msk_w));
diff --git a/src/mame/drivers/elwro800.cpp b/src/mame/drivers/elwro800.cpp
index 3cc87788e42..295fe086310 100644
--- a/src/mame/drivers/elwro800.cpp
+++ b/src/mame/drivers/elwro800.cpp
@@ -294,14 +294,7 @@ READ8_MEMBER(elwro800_state::elwro800jr_io_r)
else if (!BIT(cs,4))
{
// CS51
- if (offset & 1)
- {
- return m_i8251->status_r(space, 0);
- }
- else
- {
- return m_i8251->data_r(space, 0);
- }
+ return m_i8251->read(offset & 1);
}
else if (!BIT(cs,5))
{
@@ -345,14 +338,7 @@ WRITE8_MEMBER(elwro800_state::elwro800jr_io_w)
else if (!BIT(cs,4))
{
// CS51
- if (offset & 1)
- {
- m_i8251->control_w(space, 0, data);
- }
- else
- {
- m_i8251->data_w(space, 0, data);
- }
+ m_i8251->write(offset & 1, data);
}
else if (!BIT(cs,5))
{
diff --git a/src/mame/drivers/excali64.cpp b/src/mame/drivers/excali64.cpp
index 037615aee37..8111dc96b40 100644
--- a/src/mame/drivers/excali64.cpp
+++ b/src/mame/drivers/excali64.cpp
@@ -136,8 +136,7 @@ void excali64_state::io_map(address_map &map)
{
map.global_mask(0xff);
map(0x00, 0x0f).r(FUNC(excali64_state::port00_r));
- map(0x10, 0x10).mirror(0x0e).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x11, 0x11).mirror(0x0e).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x10, 0x11).mirror(0x0e).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x20, 0x23).mirror(0x0c).rw("pit", FUNC(pit8253_device::read), FUNC(pit8253_device::write));
map(0x30, 0x30).mirror(0x0e).rw(m_crtc, FUNC(mc6845_device::status_r), FUNC(mc6845_device::address_w));
map(0x31, 0x31).mirror(0x0e).rw(m_crtc, FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w));
diff --git a/src/mame/drivers/facit4440.cpp b/src/mame/drivers/facit4440.cpp
index c5cb37d6819..03bd9221e7e 100644
--- a/src/mame/drivers/facit4440.cpp
+++ b/src/mame/drivers/facit4440.cpp
@@ -137,7 +137,7 @@ u8 facit4440_state::misc_status_r()
WRITE_LINE_MEMBER(facit4440_state::vsync_w)
{
- if (BIT(m_control_latch[0], 5))
+ if (state && BIT(m_control_latch[0], 5))
m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
}
diff --git a/src/mame/drivers/fanucspmg.cpp b/src/mame/drivers/fanucspmg.cpp
index b367305eaa9..a444ee32f8b 100644
--- a/src/mame/drivers/fanucspmg.cpp
+++ b/src/mame/drivers/fanucspmg.cpp
@@ -728,14 +728,10 @@ void fanucspmg_state::maincpu_mem(address_map &map)
map(0xf0000, 0xf0003).rw(m_pic0, FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff);
map(0xf0004, 0xf0007).m(m_fdc, FUNC(upd765a_device::map)).umask16(0x00ff);
map(0xf0008, 0xf000f).rw(m_pit0, FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0x00ff);
- map(0xf0010, 0xf0010).rw(m_usart0, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xf0012, 0xf0012).rw(m_usart0, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0xf0014, 0xf0014).rw(m_usart1, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xf0016, 0xf0016).rw(m_usart1, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0xf0018, 0xf0018).rw(m_usart2, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xf001a, 0xf001a).rw(m_usart2, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0xf001c, 0xf001c).rw(m_usart3, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xf001e, 0xf001e).rw(m_usart3, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xf0010, 0xf0013).rw(m_usart0, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
+ map(0xf0014, 0xf0017).rw(m_usart1, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
+ map(0xf0018, 0xf001b).rw(m_usart2, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
+ map(0xf001c, 0xf001f).rw(m_usart3, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
map(0xf0020, 0xf0029).rw(m_dmac, FUNC(i8257_device::read), FUNC(i8257_device::write));
map(0xf0042, 0xf0043).r(FUNC(fanucspmg_state::magic_r));
map(0xf0046, 0xf0046).w(FUNC(fanucspmg_state::dma_page_w));
diff --git a/src/mame/drivers/fb01.cpp b/src/mame/drivers/fb01.cpp
index fc1834ccb0a..018714dbb66 100644
--- a/src/mame/drivers/fb01.cpp
+++ b/src/mame/drivers/fb01.cpp
@@ -82,8 +82,7 @@ void fb01_state::fb01_io(address_map &map)
map(0x01, 0x01).rw("ym2164", FUNC(ym2151_device::status_r), FUNC(ym2151_device::data_w));
// 10-11 USART uPD71051C 4MHz & 4MHz / 8
- map(0x10, 0x10).rw(m_upd71051, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x11, 0x11).rw(m_upd71051, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x10, 0x11).rw(m_upd71051, FUNC(i8251_device::read), FUNC(i8251_device::write));
// 20 PANEL SWITCH
map(0x20, 0x20).portr("PANEL");
diff --git a/src/mame/drivers/fk1.cpp b/src/mame/drivers/fk1.cpp
index 16b8bde9d5f..982f5155c43 100644
--- a/src/mame/drivers/fk1.cpp
+++ b/src/mame/drivers/fk1.cpp
@@ -328,8 +328,7 @@ void fk1_state::fk1_io(address_map &map)
map(0x10, 0x13).rw("pit8253", FUNC(pit8253_device::read), FUNC(pit8253_device::write));
map(0x20, 0x23).rw("ppi8255_2", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0x30, 0x30).rw(FUNC(fk1_state::fk1_bank_ram_r), FUNC(fk1_state::fk1_intr_w));
- map(0x40, 0x40).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x41, 0x41).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x40, 0x41).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x50, 0x50).rw(FUNC(fk1_state::fk1_bank_rom_r), FUNC(fk1_state::fk1_disk_w));
map(0x60, 0x63).rw("ppi8255_3", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0x70, 0x70).rw(FUNC(fk1_state::fk1_mouse_r), FUNC(fk1_state::fk1_reset_int_w));
diff --git a/src/mame/drivers/fmtowns.cpp b/src/mame/drivers/fmtowns.cpp
index 62681fb91b2..656db340a54 100644
--- a/src/mame/drivers/fmtowns.cpp
+++ b/src/mame/drivers/fmtowns.cpp
@@ -2122,10 +2122,8 @@ WRITE8_MEMBER( towns_state::towns_serial_w )
switch(offset)
{
case 0:
- m_i8251->data_w(space,0,data);
- break;
case 1:
- m_i8251->control_w(space,0,data);
+ m_i8251->write(offset, data);
break;
case 4:
m_serial_irq_enable = data;
@@ -2140,9 +2138,8 @@ READ8_MEMBER( towns_state::towns_serial_r )
switch(offset)
{
case 0:
- return m_i8251->data_r(space,0);
case 1:
- return m_i8251->status_r(space,0);
+ return m_i8251->read(offset);
case 3:
return m_serial_irq_source;
default:
diff --git a/src/mame/drivers/h8.cpp b/src/mame/drivers/h8.cpp
index eca8a3cdb83..188e2a7ebaa 100644
--- a/src/mame/drivers/h8.cpp
+++ b/src/mame/drivers/h8.cpp
@@ -197,11 +197,9 @@ void h8_state::h8_io(address_map &map)
map.global_mask(0xff);
map(0xf0, 0xf0).rw(FUNC(h8_state::portf0_r), FUNC(h8_state::portf0_w));
map(0xf1, 0xf1).w(FUNC(h8_state::portf1_w));
- map(0xf8, 0xf8).rw(m_uart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xf9, 0xf9).rw(m_uart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xf8, 0xf9).rw(m_uart, FUNC(i8251_device::read), FUNC(i8251_device::write));
// optional connection to a serial terminal @ 600 baud
- //AM_RANGE(0xfa, 0xfa) AM_DEVREADWRITE("uart1", i8251_device, data_r, data_w)
- //AM_RANGE(0xfb, 0xfb) AM_DEVREADWRITE("uart1", i8251_device, status_r, control_w)
+ //map(0xfa, 0xfb).rw("uart1", FUNC(i8251_device::read), FUNC(i8251_device::write));
}
/* Input ports */
diff --git a/src/mame/drivers/hh_sm510.cpp b/src/mame/drivers/hh_sm510.cpp
index b224001112a..f103d4edde6 100644
--- a/src/mame/drivers/hh_sm510.cpp
+++ b/src/mame/drivers/hh_sm510.cpp
@@ -1205,6 +1205,7 @@ MACHINE_CONFIG_START(gnw_mickdon_state::gnw_mickdon)
MCFG_SCREEN_VISIBLE_AREA(0, 1920/2-1, 0, 1236/2-1)
MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_sm510_state, display_decay_tick, attotime::from_msec(1))
+ config.set_default_layout(layout_gnw_dualv);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -1288,6 +1289,7 @@ MACHINE_CONFIG_START(gnw_dkong2_state::gnw_dkong2)
MCFG_SCREEN_VISIBLE_AREA(0, 1920/2-1, 0, 1237/2-1)
MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_sm510_state, display_decay_tick, attotime::from_msec(1))
+ config.set_default_layout(layout_gnw_dualv);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -1373,6 +1375,7 @@ MACHINE_CONFIG_START(gnw_mario_state::gnw_mario)
MCFG_SCREEN_VISIBLE_AREA(0, 2261/2-1, 0, 1440/2-1)
MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_sm510_state, display_decay_tick, attotime::from_msec(1))
+ config.set_default_layout(layout_gnw_dualh);
/* sound hardware */
SPEAKER(config, "mono").front_center();
diff --git a/src/mame/drivers/hp64k.cpp b/src/mame/drivers/hp64k.cpp
index 9528f53c968..2034176ae86 100644
--- a/src/mame/drivers/hp64k.cpp
+++ b/src/mame/drivers/hp64k.cpp
@@ -961,13 +961,7 @@ void hp64k_state::hp64k_floppy_wpt_cb(floppy_image_device *floppy , int state)
READ16_MEMBER(hp64k_state::hp64k_usart_r)
{
- uint16_t tmp;
-
- if ((offset & 1) == 0) {
- tmp = m_uart->status_r(space , 0);
- } else {
- tmp = m_uart->data_r(space , 0);
- }
+ uint16_t tmp = m_uart->read(~offset & 1);
// bit 8 == bit 7 rear panel switches (modem/terminal) ???
@@ -982,11 +976,7 @@ READ16_MEMBER(hp64k_state::hp64k_usart_r)
WRITE16_MEMBER(hp64k_state::hp64k_usart_w)
{
- if ((offset & 1) == 0) {
- m_uart->control_w(space , 0 , (uint8_t)(data & 0xff));
- } else {
- m_uart->data_w(space , 0 , (uint8_t)(data & 0xff));
- }
+ m_uart->write(~offset & 1, data & 0xff);
}
WRITE_LINE_MEMBER(hp64k_state::hp64k_rxrdy_w)
diff --git a/src/mame/drivers/ibm6580.cpp b/src/mame/drivers/ibm6580.cpp
index 1abb11bda65..9512ff266da 100644
--- a/src/mame/drivers/ibm6580.cpp
+++ b/src/mame/drivers/ibm6580.cpp
@@ -701,10 +701,8 @@ void ibm6580_state::ibm6580_io(address_map &map)
map(0x0040, 0x005f).rw(FUNC(ibm6580_state::p40_r), FUNC(ibm6580_state::p40_w)).umask16(0x00ff);
map(0x0070, 0x007f).unmaprw();
map(0x0120, 0x0127).rw(m_pit8253, FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0x00ff);
- map(0x0140, 0x0140).rw("upd8251a", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x0142, 0x0142).rw("upd8251a", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0x0160, 0x0160).rw("upd8251b", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x0162, 0x0162).rw("upd8251b", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x0140, 0x0143).rw("upd8251a", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
+ map(0x0160, 0x0163).rw("upd8251b", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
map(0x4000, 0x400f).unmaprw();
map(0x5000, 0x500f).unmaprw();
map(0x6000, 0x601f).unmaprw();
diff --git a/src/mame/drivers/ibmpcjr.cpp b/src/mame/drivers/ibmpcjr.cpp
index 07774a1eef6..1e6ef97f708 100644
--- a/src/mame/drivers/ibmpcjr.cpp
+++ b/src/mame/drivers/ibmpcjr.cpp
@@ -20,8 +20,8 @@
#include "bus/generic/slot.h"
#include "bus/isa/fdc.h"
#include "bus/pc_joy/pc_joy.h"
+#include "bus/rs232/hlemouse.h"
#include "bus/rs232/rs232.h"
-#include "bus/rs232/ser_mouse.h"
#include "screen.h"
#include "softlist.h"
@@ -512,8 +512,11 @@ static void pcjr_floppies(device_slot_interface &device)
static void pcjr_com(device_slot_interface &device)
{
- device.option_add("microsoft_mouse", MSFT_SERIAL_MOUSE);
- device.option_add("mousesys_mouse", MSYSTEM_SERIAL_MOUSE);
+ device.option_add("microsoft_mouse", MSFT_HLE_SERIAL_MOUSE);
+ device.option_add("logitech_mouse", LOGITECH_HLE_SERIAL_MOUSE);
+ device.option_add("wheel_mouse", WHEEL_HLE_SERIAL_MOUSE);
+ device.option_add("msystems_mouse", MSYSTEMS_HLE_SERIAL_MOUSE);
+ device.option_add("rotatable_mouse", ROTATABLE_HLE_SERIAL_MOUSE);
}
static const gfx_layout pc_8_charlayout =
diff --git a/src/mame/drivers/icebox.cpp b/src/mame/drivers/icebox.cpp
index b658c38753d..b1052d290fb 100644
--- a/src/mame/drivers/icebox.cpp
+++ b/src/mame/drivers/icebox.cpp
@@ -169,10 +169,8 @@ void icebox_state::io_map(address_map &map)
{
map.global_mask(0xff);
map.unmap_value_high();
- map(0xe0, 0xe0).rw(m_uart0, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xe1, 0xe1).rw(m_uart0, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0xe2, 0xe2).rw(m_uart1, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xe3, 0xe3).rw(m_uart1, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xe0, 0xe1).rw(m_uart0, FUNC(i8251_device::read), FUNC(i8251_device::write));
+ map(0xe2, 0xe3).rw(m_uart1, FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0xe4, 0xe7).lrw8("fdc_usage",
[this](offs_t offset) { return m_fdc->read(offset^3); },
[this](offs_t offset, u8 data) { m_fdc->write(offset^3, data); });
diff --git a/src/mame/drivers/imds2.cpp b/src/mame/drivers/imds2.cpp
index b0f44b148c7..777003cbbf1 100644
--- a/src/mame/drivers/imds2.cpp
+++ b/src/mame/drivers/imds2.cpp
@@ -143,10 +143,8 @@ void imds2_state::ipc_io_map(address_map &map)
map.unmap_value_low();
map(0xc0, 0xc1).rw(m_ioc, FUNC(imds2ioc_device::dbb_master_r), FUNC(imds2ioc_device::dbb_master_w));
map(0xf0, 0xf3).rw(m_ipctimer, FUNC(pit8253_device::read), FUNC(pit8253_device::write));
- map(0xf4, 0xf4).rw(m_ipcusart[0], FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xf5, 0xf5).rw(m_ipcusart[0], FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0xf6, 0xf6).rw(m_ipcusart[1], FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xf7, 0xf7).rw(m_ipcusart[1], FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xf4, 0xf5).rw(m_ipcusart[0], FUNC(i8251_device::read), FUNC(i8251_device::write));
+ map(0xf6, 0xf7).rw(m_ipcusart[1], FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0xf8, 0xf9).rw(m_ioc, FUNC(imds2ioc_device::pio_master_r), FUNC(imds2ioc_device::pio_master_w));
map(0xfa, 0xfb).rw(FUNC(imds2_state::ipclocpic_r), FUNC(imds2_state::ipclocpic_w));
map(0xfc, 0xfd).rw(FUNC(imds2_state::ipcsyspic_r), FUNC(imds2_state::ipcsyspic_w));
diff --git a/src/mame/drivers/imsai.cpp b/src/mame/drivers/imsai.cpp
index d58b9ec0166..327d326ddc6 100644
--- a/src/mame/drivers/imsai.cpp
+++ b/src/mame/drivers/imsai.cpp
@@ -68,10 +68,8 @@ void imsai_state::imsai_io(address_map &map)
map.global_mask(0xff);
map(0x02, 0x02).r(FUNC(imsai_state::keyin_r)).w(m_terminal, FUNC(generic_terminal_device::write));
map(0x03, 0x03).r(FUNC(imsai_state::status_r));
- map(0x04, 0x04).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x05, 0x05).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0x12, 0x12).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x13, 0x13).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x04, 0x05).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write));
+ map(0x12, 0x13).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x14, 0x14).r(FUNC(imsai_state::keyin_r)).w(m_terminal, FUNC(generic_terminal_device::write));
map(0x15, 0x15).r(FUNC(imsai_state::status_r));
map(0xf3, 0xf3).w(FUNC(imsai_state::control_w));
diff --git a/src/mame/drivers/ipc.cpp b/src/mame/drivers/ipc.cpp
index 339ce3e5a92..b126c30b61a 100644
--- a/src/mame/drivers/ipc.cpp
+++ b/src/mame/drivers/ipc.cpp
@@ -77,10 +77,8 @@ void ipc_state::ipc_io(address_map &map)
map.unmap_value_high();
map.global_mask(0xff);
map(0xf0, 0xf3).rw("pit", FUNC(pit8253_device::read), FUNC(pit8253_device::write));
- map(0xf4, 0xf4).rw("uart1", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xf5, 0xf5).rw("uart1", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0xf6, 0xf6).rw("uart2", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xf7, 0xf7).rw("uart2", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xf4, 0xf5).rw("uart1", FUNC(i8251_device::read), FUNC(i8251_device::write));
+ map(0xf6, 0xf7).rw("uart2", FUNC(i8251_device::read), FUNC(i8251_device::write));
}
/* Input ports */
diff --git a/src/mame/drivers/irisha.cpp b/src/mame/drivers/irisha.cpp
index b468d88bd40..ed792c68df7 100644
--- a/src/mame/drivers/irisha.cpp
+++ b/src/mame/drivers/irisha.cpp
@@ -83,8 +83,7 @@ void irisha_state::irisha_mem(address_map &map)
void irisha_state::irisha_io(address_map &map)
{
map(0x04, 0x05).r(FUNC(irisha_state::irisha_keyboard_r));
- map(0x06, 0x06).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x07, 0x07).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x06, 0x07).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x08, 0x0B).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write));
map(0x0C, 0x0F).rw("pic8259", FUNC(pic8259_device::read), FUNC(pic8259_device::write)).mask(0x01);
map(0x10, 0x13).rw("ppi8255", FUNC(i8255_device::read), FUNC(i8255_device::write));
diff --git a/src/mame/drivers/isbc.cpp b/src/mame/drivers/isbc.cpp
index 052249359c8..9e738703524 100644
--- a/src/mame/drivers/isbc.cpp
+++ b/src/mame/drivers/isbc.cpp
@@ -135,10 +135,8 @@ void isbc_state::rpc86_io(address_map &map)
map(0x00c4, 0x00c7).rw(m_pic_0, FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff);
map(0x00c8, 0x00cf).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0x00ff);
map(0x00d0, 0x00d7).rw("pit", FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0x00ff);
- map(0x00d8, 0x00d8).rw(m_uart8251, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x00da, 0x00da).rw(m_uart8251, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0x00dc, 0x00dc).rw(m_uart8251, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x00de, 0x00de).rw(m_uart8251, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x00d8, 0x00db).rw(m_uart8251, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
+ map(0x00dc, 0x00df).rw(m_uart8251, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
}
void isbc_state::isbc8605_io(address_map &map)
@@ -169,10 +167,8 @@ void isbc_state::isbc_io(address_map &map)
map(0x00c4, 0x00c7).rw(m_pic_0, FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff);
map(0x00c8, 0x00cf).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0x00ff);
map(0x00d0, 0x00d7).rw("pit", FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0x00ff);
- map(0x00d8, 0x00d8).rw(m_uart8251, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x00da, 0x00da).rw(m_uart8251, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0x00dc, 0x00dc).rw(m_uart8251, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x00de, 0x00de).rw(m_uart8251, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x00d8, 0x00db).rw(m_uart8251, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
+ map(0x00dc, 0x00df).rw(m_uart8251, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
}
void isbc_state::isbc286_io(address_map &map)
diff --git a/src/mame/drivers/isbc8010.cpp b/src/mame/drivers/isbc8010.cpp
index 5535f9bb504..4b36693b786 100644
--- a/src/mame/drivers/isbc8010.cpp
+++ b/src/mame/drivers/isbc8010.cpp
@@ -106,8 +106,7 @@ void isbc8010_state::isbc8010_io(address_map &map)
map.global_mask(0xff);
map(0xe4, 0xe7).rw(m_ppi_0, FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0xe8, 0xeb).rw(m_ppi_1, FUNC(i8255_device::read), FUNC(i8255_device::write));
- map(0xec, 0xec).mirror(0x02).rw(m_usart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xed, 0xed).mirror(0x02).rw(m_usart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xec, 0xed).mirror(0x02).rw(m_usart, FUNC(i8251_device::read), FUNC(i8251_device::write));
//AM_RANGE(0xf0, 0xf7) MCS0 - iSBX Multimodule
//AM_RANGE(0xf8, 0xff) MCS1 - iSBX Multimodule
}
diff --git a/src/mame/drivers/isbc8030.cpp b/src/mame/drivers/isbc8030.cpp
index 4f7cc6d2ed6..36752136c1f 100644
--- a/src/mame/drivers/isbc8030.cpp
+++ b/src/mame/drivers/isbc8030.cpp
@@ -79,8 +79,7 @@ void isbc8030_state::isbc8030_io(address_map &map)
map(0xd8, 0xd9).rw(m_pic, FUNC(pic8259_device::read), FUNC(pic8259_device::write));
map(0xdc, 0xdf).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write));
map(0xe8, 0xeb).rw(m_ppi, FUNC(i8255_device::read), FUNC(i8255_device::write));
- map(0xec, 0xec).mirror(0x02).rw(m_usart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xed, 0xed).mirror(0x02).rw(m_usart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xec, 0xed).mirror(0x02).rw(m_usart, FUNC(i8251_device::read), FUNC(i8251_device::write));
}
static INPUT_PORTS_START( isbc8030 )
diff --git a/src/mame/drivers/kyocera.cpp b/src/mame/drivers/kyocera.cpp
index 4d76285f6d5..6f1838c37fb 100644
--- a/src/mame/drivers/kyocera.cpp
+++ b/src/mame/drivers/kyocera.cpp
@@ -628,8 +628,7 @@ void tandy200_state::tandy200_io(address_map &map)
map(0x90, 0x9f).rw(m_rtc, FUNC(rp5c01_device::read), FUNC(rp5c01_device::write));
// AM_RANGE(0xa0, 0xa0) AM_MIRROR(0x0f) AM_DEVWRITE(TCM5089_TAG, write)
map(0xb0, 0xb7).mirror(0x08).rw(I8155_TAG, FUNC(i8155_device::io_r), FUNC(i8155_device::io_w));
- map(0xc0, 0xc0).mirror(0x0e).rw(I8251_TAG, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xc1, 0xc1).mirror(0x0e).rw(I8251_TAG, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xc0, 0xc1).mirror(0x0e).rw(I8251_TAG, FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0xd0, 0xd0).mirror(0x0f).rw(FUNC(tandy200_state::bank_r), FUNC(tandy200_state::bank_w));
map(0xe0, 0xe0).mirror(0x0f).rw(FUNC(tandy200_state::stbk_r), FUNC(tandy200_state::stbk_w));
map(0xf0, 0xf0).mirror(0x0e).rw(m_lcdc, FUNC(hd61830_device::data_r), FUNC(hd61830_device::data_w));
diff --git a/src/mame/drivers/mbc200.cpp b/src/mame/drivers/mbc200.cpp
index bcb7bd74dd4..9038c0eb99e 100644
--- a/src/mame/drivers/mbc200.cpp
+++ b/src/mame/drivers/mbc200.cpp
@@ -151,13 +151,11 @@ void mbc200_state::mbc200_io(address_map &map)
{
map.unmap_value_high();
map.global_mask(0xff);
- //AM_RANGE(0xe0, 0xe0) AM_DEVREADWRITE("uart1", i8251_device, data_r, data_w)
- //AM_RANGE(0xe1, 0xe1) AM_DEVREADWRITE("uart1", i8251_device, status_r, control_w)
+ //map(0xe0, 0xe1).rw("uart1", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0xe0, 0xe1).r(FUNC(mbc200_state::keyboard_r)).nopw();
map(0xe4, 0xe7).rw(m_fdc, FUNC(mb8876_device::read), FUNC(mb8876_device::write));
map(0xe8, 0xeb).rw(m_ppi_m, FUNC(i8255_device::read), FUNC(i8255_device::write));
- map(0xec, 0xec).rw("uart2", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xed, 0xed).rw("uart2", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xec, 0xed).rw("uart2", FUNC(i8251_device::read), FUNC(i8251_device::write));
}
diff --git a/src/mame/drivers/mc1502.cpp b/src/mame/drivers/mc1502.cpp
index 72bbcb21df6..8c3c7d3cd6c 100644
--- a/src/mame/drivers/mc1502.cpp
+++ b/src/mame/drivers/mc1502.cpp
@@ -219,8 +219,7 @@ void mc1502_state::mc1502_map(address_map &map)
void mc1502_state::mc1502_io(address_map &map)
{
map(0x0020, 0x0021).rw(m_pic8259, FUNC(pic8259_device::read), FUNC(pic8259_device::write));
- map(0x0028, 0x0028).rw(m_upd8251, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x0029, 0x0029).rw(m_upd8251, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x0028, 0x0029).rw(m_upd8251, FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x0040, 0x0043).rw(m_pit8253, FUNC(pit8253_device::read), FUNC(pit8253_device::write));
map(0x0060, 0x0063).rw(m_ppi8255n1, FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0x0068, 0x006B).rw(m_ppi8255n2, FUNC(i8255_device::read), FUNC(i8255_device::write)); // keyboard poll
diff --git a/src/mame/drivers/meritum.cpp b/src/mame/drivers/meritum.cpp
index 94ef2df1218..84bd6e27743 100644
--- a/src/mame/drivers/meritum.cpp
+++ b/src/mame/drivers/meritum.cpp
@@ -110,8 +110,7 @@ void meritum_state::io_map(address_map &map)
map(0xf0, 0xf3).rw("flopppi", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0xf4, 0xf7).rw("mainppi", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0xf8, 0xfb).rw("mainpit", FUNC(pit8253_device::read), FUNC(pit8253_device::write));
- map(0xfc, 0xfc).rw("usart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xfd, 0xfd).rw("usart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xfc, 0xfd).rw("usart", FUNC(i8251_device::read), FUNC(i8251_device::write));
// map(0xfe, 0xfe) audio interface
map(0xff, 0xff).rw(FUNC(meritum_state::port_ff_r), FUNC(meritum_state::port_ff_w));
}
diff --git a/src/mame/drivers/mfabfz.cpp b/src/mame/drivers/mfabfz.cpp
index 0c9b3aa76f9..fd2c520e10b 100644
--- a/src/mame/drivers/mfabfz.cpp
+++ b/src/mame/drivers/mfabfz.cpp
@@ -78,18 +78,15 @@ void mfabfz_state::mfabfz_io(address_map &map)
{
map.unmap_value_high();
map.global_mask(0xff);
- map(0xbe, 0xbe).rw("uart1", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xbf, 0xbf).rw("uart1", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0xfe, 0xfe).rw("uart2", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xff, 0xff).rw("uart2", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xbe, 0xbf).rw("uart1", FUNC(i8251_device::read), FUNC(i8251_device::write));
+ map(0xfe, 0xff).rw("uart2", FUNC(i8251_device::read), FUNC(i8251_device::write));
}
void mfabfz_state::mfabfz85_io(address_map &map)
{
map.unmap_value_high();
map.global_mask(0xff);
- map(0xfe, 0xfe).rw("uart2", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xff, 0xff).rw("uart2", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xfe, 0xff).rw("uart2", FUNC(i8251_device::read), FUNC(i8251_device::write));
}
/* Input ports */
diff --git a/src/mame/drivers/mice.cpp b/src/mame/drivers/mice.cpp
index 6a49a3e5f0c..4159256be1f 100644
--- a/src/mame/drivers/mice.cpp
+++ b/src/mame/drivers/mice.cpp
@@ -69,8 +69,7 @@ void mice_state::mice_io(address_map &map)
{
map.unmap_value_high();
map.global_mask(0xff);
- map(0x50, 0x50).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x51, 0x51).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x50, 0x51).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x60, 0x67).rw("rpt", FUNC(i8155_device::io_r), FUNC(i8155_device::io_w));
map(0x70, 0x73).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write));
}
@@ -88,8 +87,7 @@ void mice_state::mice2_io(address_map &map)
{
map.unmap_value_high();
map.global_mask(0xff);
- map(0x80, 0x80).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x81, 0x81).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x80, 0x81).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x90, 0x97).rw("rpt", FUNC(i8155_device::io_r), FUNC(i8155_device::io_w));
map(0xa0, 0xa3).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0xc0, 0xc3).rw("rttppi1", FUNC(i8255_device::read), FUNC(i8255_device::write));
diff --git a/src/mame/drivers/microdec.cpp b/src/mame/drivers/microdec.cpp
index bd1cfb699a9..f8a3d10e8eb 100644
--- a/src/mame/drivers/microdec.cpp
+++ b/src/mame/drivers/microdec.cpp
@@ -142,10 +142,8 @@ void microdec_state::microdec_io(address_map &map)
map(0xf7, 0xf7).rw(FUNC(microdec_state::portf7_r), FUNC(microdec_state::portf7_w));
map(0xf8, 0xf8).w(FUNC(microdec_state::portf8_w));
map(0xfa, 0xfb).m(m_fdc, FUNC(upd765a_device::map));
- map(0xfc, 0xfc).rw("uart1", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xfd, 0xfd).rw("uart1", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0xfe, 0xfe).rw("uart2", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xff, 0xff).rw("uart2", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xfc, 0xfd).rw("uart1", FUNC(i8251_device::read), FUNC(i8251_device::write));
+ map(0xfe, 0xff).rw("uart2", FUNC(i8251_device::read), FUNC(i8251_device::write));
// AM_RANGE(0xf0, 0xf3) 8253 PIT (md3 only) used as a baud rate generator for serial ports
// AM_RANGE(0xf4, 0xf4) Centronics data
// AM_RANGE(0xf5, 0xf5) motor check (md1/2)
diff --git a/src/mame/drivers/model1.cpp b/src/mame/drivers/model1.cpp
index f6221e7382d..5079d0a93f0 100644
--- a/src/mame/drivers/model1.cpp
+++ b/src/mame/drivers/model1.cpp
@@ -838,7 +838,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(model1_state::model1_interrupt)
}
}
-MACHINE_RESET_MEMBER(model1_state,model1)
+void model1_state::machine_reset()
{
membank("bank1")->set_base(memregion("maincpu")->base() + 0x1000000);
irq_init();
@@ -938,8 +938,7 @@ void model1_state::model1_mem(address_map &map)
map(0xc00000, 0xc00fff).r(FUNC(model1_state::dpram_r)).w(m_dpram, FUNC(mb8421_device::right_w)).umask16(0x00ff); // 2k*8-bit dual port ram
- map(0xc40000, 0xc40000).rw(m_m1uart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xc40002, 0xc40002).rw(m_m1uart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xc40000, 0xc40003).rw(m_m1uart, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
map(0xd00000, 0xd00001).rw(FUNC(model1_state::v60_copro_ram_adr_r), FUNC(model1_state::v60_copro_ram_adr_w));
map(0xd20000, 0xd20003).w(FUNC(model1_state::v60_copro_ram_w));
@@ -1400,7 +1399,7 @@ ROM_START( swa )
ROM_LOAD32_WORD( "mpr-16480.30", 0x800000, 0x200000, CRC(3185547a) SHA1(9871937372c2c755717802117a3ad39e1a11410e) )
ROM_LOAD32_WORD( "mpr-16481.31", 0x800002, 0x200000, CRC(ce8d76fe) SHA1(0406f0500d19d6707515627b4143f92a9a5db769) )
- ROM_REGION32_LE( 0x200000, "tgp_data", 0 ) /* TGP data roms */
+ ROM_REGION32_LE( 0x200000, "copro_data", 0 ) /* TGP data roms */
ROM_LOAD32_BYTE( "mpr-16472.39", 0x000000, 0x80000, CRC(5a0d7553) SHA1(ba8e08e5a0c6b7fbc10084ad7ad3edf61efb0d70) )
ROM_LOAD32_BYTE( "mpr-16473.40", 0x000001, 0x80000, CRC(876c5399) SHA1(be7e40c77a385600941f11c24852cd73c71696f0) )
ROM_LOAD32_BYTE( "mpr-16474.41", 0x000002, 0x80000, CRC(5864a26f) SHA1(be0c22dfff37408f6b401b1970f7fcc6fc7fbcd2) )
@@ -1453,7 +1452,7 @@ ROM_START( wingwar )
ROM_LOAD32_WORD( "mpr-16749.32", 0xc00000, 0x200000, CRC(0e36dc1a) SHA1(4939177a6ac51ca57d0acd118ff14af4f4e438bb) )
ROM_LOAD32_WORD( "mpr-16750.33", 0xc00002, 0x200000, CRC(e4f0b98d) SHA1(e69de2e5ccea2834fb8326bdd61fc6b517bc60b7) )
- ROM_REGION32_LE( 0x200000, "tgp_data", 0 ) /* TGP data roms */
+ ROM_REGION32_LE( 0x200000, "copro_data", 0 ) /* TGP data roms */
ROM_LOAD32_BYTE( "mpr-16741.39", 0x000000, 0x80000, CRC(84b2ffd8) SHA1(0eba3855d20b88567c6fa08046e12429664d87cb) )
ROM_LOAD32_BYTE( "mpr-16742.40", 0x000001, 0x80000, CRC(e9cc12bb) SHA1(40c83c968be3b11fad193a00e7b760f074450683) )
ROM_LOAD32_BYTE( "mpr-16739.41", 0x000002, 0x80000, CRC(6c73e98f) SHA1(7b31e62922ab6d0df97c3ecc52b78e6d086c8635) )
@@ -1465,7 +1464,7 @@ wing War (US)
Sega game ID# 833-10844-91-01
Sega ROM board ID# 834-10845-91-01
-Driver/Control BD ID# 837-10859 with EPR-16891 (not dumped)
+Driver/Control BD ID# 837-10859 with EPR-16891
837-8679 MODEL-1 SOUND BD + 837-8680 SOUND BD OPTION daughterboard with ID# 837-10858
838-10141-04 Sound AMP board
*/
@@ -1514,7 +1513,7 @@ ROM_START( wingwaru )
ROM_LOAD32_WORD( "mpr-16749.32", 0xc00000, 0x200000, CRC(0e36dc1a) SHA1(4939177a6ac51ca57d0acd118ff14af4f4e438bb) )
ROM_LOAD32_WORD( "mpr-16750.33", 0xc00002, 0x200000, CRC(e4f0b98d) SHA1(e69de2e5ccea2834fb8326bdd61fc6b517bc60b7) )
- ROM_REGION32_LE( 0x200000, "tgp_data", 0 ) /* TGP data roms */
+ ROM_REGION32_LE( 0x200000, "copro_data", 0 ) /* TGP data roms */
ROM_LOAD32_BYTE( "mpr-16741.39", 0x000000, 0x80000, CRC(84b2ffd8) SHA1(0eba3855d20b88567c6fa08046e12429664d87cb) )
ROM_LOAD32_BYTE( "mpr-16742.40", 0x000001, 0x80000, CRC(e9cc12bb) SHA1(40c83c968be3b11fad193a00e7b760f074450683) )
ROM_LOAD32_BYTE( "mpr-16739.41", 0x000002, 0x80000, CRC(6c73e98f) SHA1(7b31e62922ab6d0df97c3ecc52b78e6d086c8635) )
@@ -1566,7 +1565,7 @@ ROM_START( wingwarj )
ROM_LOAD32_WORD( "mpr-16749.32", 0xc00000, 0x200000, CRC(0e36dc1a) SHA1(4939177a6ac51ca57d0acd118ff14af4f4e438bb) )
ROM_LOAD32_WORD( "mpr-16750.33", 0xc00002, 0x200000, CRC(e4f0b98d) SHA1(e69de2e5ccea2834fb8326bdd61fc6b517bc60b7) )
- ROM_REGION32_LE( 0x200000, "tgp_data", 0 ) /* TGP data roms */
+ ROM_REGION32_LE( 0x200000, "copro_data", 0 ) /* TGP data roms */
ROM_LOAD32_BYTE( "mpr-16741.39", 0x000000, 0x80000, CRC(84b2ffd8) SHA1(0eba3855d20b88567c6fa08046e12429664d87cb) )
ROM_LOAD32_BYTE( "mpr-16742.40", 0x000001, 0x80000, CRC(e9cc12bb) SHA1(40c83c968be3b11fad193a00e7b760f074450683) )
ROM_LOAD32_BYTE( "mpr-16739.41", 0x000002, 0x80000, CRC(6c73e98f) SHA1(7b31e62922ab6d0df97c3ecc52b78e6d086c8635) )
@@ -1620,7 +1619,7 @@ ROM_START( wingwar360 )
ROM_LOAD32_WORD( "mpr-16749.32", 0xc00000, 0x200000, CRC(0e36dc1a) SHA1(4939177a6ac51ca57d0acd118ff14af4f4e438bb) )
ROM_LOAD32_WORD( "mpr-16750.33", 0xc00002, 0x200000, CRC(e4f0b98d) SHA1(e69de2e5ccea2834fb8326bdd61fc6b517bc60b7) )
- ROM_REGION32_LE( 0x200000, "tgp_data", 0 ) /* TGP data roms */
+ ROM_REGION32_LE( 0x200000, "copro_data", 0 ) /* TGP data roms */
ROM_LOAD32_BYTE( "mpr-16741.39", 0x000000, 0x80000, CRC(84b2ffd8) SHA1(0eba3855d20b88567c6fa08046e12429664d87cb) )
ROM_LOAD32_BYTE( "mpr-16742.40", 0x000001, 0x80000, CRC(e9cc12bb) SHA1(40c83c968be3b11fad193a00e7b760f074450683) )
ROM_LOAD32_BYTE( "mpr-16739.41", 0x000002, 0x80000, CRC(6c73e98f) SHA1(7b31e62922ab6d0df97c3ecc52b78e6d086c8635) )
@@ -1668,7 +1667,7 @@ ROM_START( netmerc )
ROM_LOAD32_WORD( "mpr-18132.ic30", 0x800000, 0x200000, CRC(a17e3ac2) SHA1(19827c06ebc3e9de63668ef07675224e169d853e) )
ROM_LOAD32_WORD( "mpr-18133.ic31", 0x800002, 0x200000, CRC(f56354dd) SHA1(2ef1fe8b4995a67b70b565adf8f0ea0ad6e10094) )
- ROM_REGION32_LE( 0x200000, "tgp_data", ROMREGION_ERASE00 ) // IC39-IC42 unpopulated
+ ROM_REGION32_LE( 0x200000, "copro_data", ROMREGION_ERASE00 ) // IC39-IC42 unpopulated
ROM_REGION( 0x8000, "polhemus", 0 ) /* POLHEMUS board */
ROM_LOAD16_BYTE( "u1", 0x0000, 0x4000, CRC(7073a312) SHA1(d2582f9520b8c8c051708dd372633112af59206e) )
@@ -1694,9 +1693,6 @@ MACHINE_CONFIG_START(model1_state::model1)
MCFG_DEVICE_ADDRESS_MAP(mb86233_device::AS_RF, copro_rf_map)
#endif
- MCFG_MACHINE_START_OVERRIDE(model1_state,model1)
- MCFG_MACHINE_RESET_OVERRIDE(model1_state,model1)
-
model1io_device &ioboard(SEGA_MODEL1IO(config, "ioboard", 0));
ioboard.read_callback().set(m_dpram, FUNC(mb8421_device::left_r));
ioboard.write_callback().set(m_dpram, FUNC(mb8421_device::left_w));
@@ -1717,8 +1713,6 @@ MACHINE_CONFIG_START(model1_state::model1)
MCFG_PALETTE_ADD("palette", 8192)
MCFG_PALETTE_FORMAT(xBBBBBGGGGGRRRRR)
- MCFG_VIDEO_START_OVERRIDE(model1_state,model1)
-
SEGAM1AUDIO(config, m_m1audio, 0);
m_m1audio->rxd_handler().set(m_m1uart, FUNC(i8251_device::write_rxd));
diff --git a/src/mame/drivers/model2.cpp b/src/mame/drivers/model2.cpp
index aa84d4c004a..e3487f79106 100644
--- a/src/mame/drivers/model2.cpp
+++ b/src/mame/drivers/model2.cpp
@@ -990,9 +990,9 @@ READ32_MEMBER(model2_state::model2_serial_r)
{
u32 result = 0;
if (ACCESSING_BITS_0_7 && (offset == 0))
- result |= m_uart->data_r(space, 0);
+ result |= m_uart->data_r();
if (ACCESSING_BITS_16_23 && (offset == 0))
- result |= m_uart->status_r(space, 0) << 16;
+ result |= m_uart->status_r() << 16;
return result;
}
@@ -1004,7 +1004,7 @@ WRITE32_MEMBER(model2_state::model2_serial_w)
{
if (ACCESSING_BITS_0_7 && (offset == 0))
{
- m_uart->data_w(space, 0, data & 0xff);
+ m_uart->data_w(data & 0xff);
if (m_scsp.found())
{
@@ -1017,7 +1017,7 @@ WRITE32_MEMBER(model2_state::model2_serial_w)
}
if (ACCESSING_BITS_16_23 && (offset == 0))
{
- m_uart->control_w(space, 0, (data >> 16) & 0xff);
+ m_uart->control_w((data >> 16) & 0xff);
}
}
diff --git a/src/mame/drivers/model3.cpp b/src/mame/drivers/model3.cpp
index 8e31ee66491..e4aeb0cae7d 100644
--- a/src/mame/drivers/model3.cpp
+++ b/src/mame/drivers/model3.cpp
@@ -1729,7 +1729,7 @@ READ8_MEMBER(model3_state::model3_sound_r)
case 0:
{
if (m_uart.found())
- return m_uart->data_r(space, 0);
+ return m_uart->data_r();
break;
}
@@ -1737,7 +1737,7 @@ READ8_MEMBER(model3_state::model3_sound_r)
case 4:
{
if (m_uart.found())
- return m_uart->status_r(space, 0);
+ return m_uart->status_r();
uint8_t res = 0;
res |= 1;
@@ -1757,7 +1757,7 @@ WRITE8_MEMBER(model3_state::model3_sound_w)
set_irq_line(0x40, CLEAR_LINE);
if (m_uart.found())
- m_uart->data_w(space, 0, data);
+ m_uart->data_w(data);
// send to the sound board
m_scsp1->midi_in(data);
@@ -1771,7 +1771,7 @@ WRITE8_MEMBER(model3_state::model3_sound_w)
case 4:
if (m_uart.found())
- m_uart->control_w(space, 0, data);
+ m_uart->control_w(data);
if (data == 0x27)
{
diff --git a/src/mame/drivers/ms6102.cpp b/src/mame/drivers/ms6102.cpp
index 5ac1f1c6778..622a52318f1 100644
--- a/src/mame/drivers/ms6102.cpp
+++ b/src/mame/drivers/ms6102.cpp
@@ -135,8 +135,7 @@ void ms6102_state::ms6102_mem(address_map &map)
void ms6102_state::ms6102_io(address_map &map)
{
map.unmap_value_high();
- map(0x00, 0x00).rw(m_i8251, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x01, 0x01).rw(m_i8251, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x00, 0x01).rw(m_i8251, FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x10, 0x18).rw(m_dma8257, FUNC(i8257_device::read), FUNC(i8257_device::write));
map(0x20, 0x23).rw("pit8253", FUNC(pit8253_device::read), FUNC(pit8253_device::write));
map(0x30, 0x30).mirror(0x0f).rw("589wa1", FUNC(ay31015_device::receive), FUNC(ay31015_device::transmit));
diff --git a/src/mame/drivers/multi8.cpp b/src/mame/drivers/multi8.cpp
index 466d08e9f04..84bcf4220a2 100644
--- a/src/mame/drivers/multi8.cpp
+++ b/src/mame/drivers/multi8.cpp
@@ -310,8 +310,7 @@ void multi8_state::multi8_io(address_map &map)
map(0x1a, 0x1a).r(FUNC(multi8_state::ay8912_1_r));
map(0x1c, 0x1c).rw(m_crtc, FUNC(mc6845_device::status_r), FUNC(mc6845_device::address_w));
map(0x1d, 0x1d).rw(m_crtc, FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w));
- map(0x20, 0x20).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x21, 0x21).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); //cmt
+ map(0x20, 0x21).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write)); //cmt
map(0x24, 0x27).rw("pit", FUNC(pit8253_device::read), FUNC(pit8253_device::write)); //pit
map(0x28, 0x2b).rw(m_ppi, FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0x2c, 0x2d).rw("pic", FUNC(pic8259_device::read), FUNC(pic8259_device::write)); //i8259
diff --git a/src/mame/drivers/namcos2.cpp b/src/mame/drivers/namcos2.cpp
index c5566895f14..6933db3581c 100644
--- a/src/mame/drivers/namcos2.cpp
+++ b/src/mame/drivers/namcos2.cpp
@@ -3804,24 +3804,24 @@ ROM_START( fourtrax )
ROM_LOAD( "fx_obj-9.7c", 0x140000, 0x040000, CRC(90f0735b) SHA1(2adbe72c6547075c0cc0386789cc1b8c1a0bc84f) )
ROM_LOAD( "fx_obj-12.8a", 0x180000, 0x040000, CRC(f5e23b78) SHA1(99896bd7c6663e3f57cb5d206964b81b5d64c8b6) )
ROM_LOAD( "fx_obj-13.7a", 0x1c0000, 0x040000, CRC(04a25007) SHA1(0c33450b0d6907754dbf1914849d1630baa824bd) )
- ROM_LOAD( "fx_obj2.2c", 0x200000, 0x040000, CRC(243affc7) SHA1(738d62960e79b95079b2208ec48fa0f3738c7611) )
+ ROM_LOAD( "fx_obj-2.2c", 0x200000, 0x040000, CRC(243affc7) SHA1(738d62960e79b95079b2208ec48fa0f3738c7611) )
ROM_LOAD( "fx_obj-3.1c", 0x240000, 0x040000, CRC(b7e5d17d) SHA1(3d8ea7cbf33b595ddf739024e8d0fccd5f9e073b) )
- ROM_LOAD( "fx_obj6.2a", 0x280000, 0x040000, CRC(a2d5ce4a) SHA1(bbe9df3914632a573a95fcba76442404d149fb9d) )
- ROM_LOAD( "fx_obj7.1a", 0x2c0000, 0x040000, CRC(4d91c929) SHA1(97470a4ad7b28df83c632bfc8c309b24701275fe) )
- ROM_LOAD( "fx_obj10.6c", 0x300000, 0x040000, CRC(7a01e86f) SHA1(5fde10e53cb192df0f3873cd6d59c725430948f5) )
+ ROM_LOAD( "fx_obj-6.2a", 0x280000, 0x040000, CRC(a2d5ce4a) SHA1(bbe9df3914632a573a95fcba76442404d149fb9d) )
+ ROM_LOAD( "fx_obj-7.1a", 0x2c0000, 0x040000, CRC(4d91c929) SHA1(97470a4ad7b28df83c632bfc8c309b24701275fe) )
+ ROM_LOAD( "fx_obj-10.6c", 0x300000, 0x040000, CRC(7a01e86f) SHA1(5fde10e53cb192df0f3873cd6d59c725430948f5) )
ROM_LOAD( "fx_obj-11.5c", 0x340000, 0x040000, CRC(514b3fe5) SHA1(19562ba2ac04a16d335bdc81b34d929f7ff9161c) )
ROM_LOAD( "fx_obj-14.6a", 0x380000, 0x040000, CRC(c1658c77) SHA1(ec689d0e5cf95085c193aa8949c6ec6e7243338b) )
- ROM_LOAD( "fx_obj15.5a", 0x3c0000, 0x040000, CRC(2bc909b3) SHA1(29c668d6d12ccdee25e97373bc4786894858d463) )
+ ROM_LOAD( "fx_obj-15.5a", 0x3c0000, 0x040000, CRC(2bc909b3) SHA1(29c668d6d12ccdee25e97373bc4786894858d463) )
ROM_REGION( 0x400000, "gfx2", 0 ) /* Tiles */
- NAMCOS2_GFXROM_LOAD_128K( "fx_chr-0.11n", 0x000000, CRC(6658c1c3) SHA1(64b5466e0f94cf5f3cb92915a26331748f67041a) )
- NAMCOS2_GFXROM_LOAD_128K( "fx_chr-1.11p", 0x080000, CRC(3a888943) SHA1(6540b417003045dfa1401a1ff04ac55b86cc177f) )
- NAMCOS2_GFXROM_LOAD_128K( "fx2_ch2.11r", 0x100000, CRC(fdf1e86b) SHA1(91a61c10a9e92f8bbc26ffc9cb72deb31378a843) )
- NAMCOS2_GFXROM_LOAD_128K( "fx_chr-3.11s", 0x180000, CRC(47fa7e61) SHA1(cc2eed81ddb4f942dd7a07e474760e4608eb4da0) )
- NAMCOS2_GFXROM_LOAD_128K( "fx_chr-4.9n", 0x200000, CRC(c720c5f5) SHA1(f68f369bbefe01c770314ea597dd88587638c62a) )
- NAMCOS2_GFXROM_LOAD_128K( "fx_chr-5.9p", 0x280000, CRC(9eacdbc8) SHA1(ca4061afc9e61eeb543f2a3740812abf6a1049bc) )
- NAMCOS2_GFXROM_LOAD_128K( "fx_chr-6.9r", 0x300000, CRC(c3dba42e) SHA1(2b5a8fabec11ccd44156ecfccf86fc713845d262) )
- NAMCOS2_GFXROM_LOAD_128K( "fx_chr-7.9s", 0x380000, CRC(c009f3ae) SHA1(394beed29bda97f4f5ba532bc0bd22177154746b) )
+ NAMCOS2_GFXROM_LOAD_128K( "fx_chr-0.11n", 0x000000, CRC(6658c1c3) SHA1(64b5466e0f94cf5f3cb92915a26331748f67041a) )
+ NAMCOS2_GFXROM_LOAD_128K( "fx_chr-1.11p", 0x080000, CRC(3a888943) SHA1(6540b417003045dfa1401a1ff04ac55b86cc177f) )
+ NAMCOS2_GFXROM_LOAD_128K( "fx2_chr-2.11r", 0x100000, CRC(fdf1e86b) SHA1(91a61c10a9e92f8bbc26ffc9cb72deb31378a843) )
+ NAMCOS2_GFXROM_LOAD_128K( "fx_chr-3.11s", 0x180000, CRC(47fa7e61) SHA1(cc2eed81ddb4f942dd7a07e474760e4608eb4da0) )
+ NAMCOS2_GFXROM_LOAD_128K( "fx_chr-4.9n", 0x200000, CRC(c720c5f5) SHA1(f68f369bbefe01c770314ea597dd88587638c62a) )
+ NAMCOS2_GFXROM_LOAD_128K( "fx_chr-5.9p", 0x280000, CRC(9eacdbc8) SHA1(ca4061afc9e61eeb543f2a3740812abf6a1049bc) )
+ NAMCOS2_GFXROM_LOAD_128K( "fx_chr-6.9r", 0x300000, CRC(c3dba42e) SHA1(2b5a8fabec11ccd44156ecfccf86fc713845d262) )
+ NAMCOS2_GFXROM_LOAD_128K( "fx_chr-7.9s", 0x380000, CRC(c009f3ae) SHA1(394beed29bda97f4f5ba532bc0bd22177154746b) )
ROM_REGION( 0x400000, "gfx3", ROMREGION_ERASEFF ) /* ROZ Tiles */
/* No ROZ files in zip */
@@ -3866,19 +3866,19 @@ ROM_START( fourtraxj )
ROM_LOAD( "fx_obj-9.7c", 0x140000, 0x040000, CRC(90f0735b) SHA1(2adbe72c6547075c0cc0386789cc1b8c1a0bc84f) )
ROM_LOAD( "fx_obj-12.8a", 0x180000, 0x040000, CRC(f5e23b78) SHA1(99896bd7c6663e3f57cb5d206964b81b5d64c8b6) )
ROM_LOAD( "fx_obj-13.7a", 0x1c0000, 0x040000, CRC(04a25007) SHA1(0c33450b0d6907754dbf1914849d1630baa824bd) )
- ROM_LOAD( "fx_obj2.2c", 0x200000, 0x040000, CRC(243affc7) SHA1(738d62960e79b95079b2208ec48fa0f3738c7611) )
+ ROM_LOAD( "fx_obj-2.2c", 0x200000, 0x040000, CRC(243affc7) SHA1(738d62960e79b95079b2208ec48fa0f3738c7611) )
ROM_LOAD( "fx_obj-3.1c", 0x240000, 0x040000, CRC(b7e5d17d) SHA1(3d8ea7cbf33b595ddf739024e8d0fccd5f9e073b) )
- ROM_LOAD( "fx_obj6.2a", 0x280000, 0x040000, CRC(a2d5ce4a) SHA1(bbe9df3914632a573a95fcba76442404d149fb9d) )
- ROM_LOAD( "fx_obj7.1a", 0x2c0000, 0x040000, CRC(4d91c929) SHA1(97470a4ad7b28df83c632bfc8c309b24701275fe) )
- ROM_LOAD( "fx_obj10.6c", 0x300000, 0x040000, CRC(7a01e86f) SHA1(5fde10e53cb192df0f3873cd6d59c725430948f5) )
+ ROM_LOAD( "fx_obj-6.2a", 0x280000, 0x040000, CRC(a2d5ce4a) SHA1(bbe9df3914632a573a95fcba76442404d149fb9d) )
+ ROM_LOAD( "fx_obj-7.1a", 0x2c0000, 0x040000, CRC(4d91c929) SHA1(97470a4ad7b28df83c632bfc8c309b24701275fe) )
+ ROM_LOAD( "fx_obj-10.6c", 0x300000, 0x040000, CRC(7a01e86f) SHA1(5fde10e53cb192df0f3873cd6d59c725430948f5) )
ROM_LOAD( "fx_obj-11.5c", 0x340000, 0x040000, CRC(514b3fe5) SHA1(19562ba2ac04a16d335bdc81b34d929f7ff9161c) )
ROM_LOAD( "fx_obj-14.6a", 0x380000, 0x040000, CRC(c1658c77) SHA1(ec689d0e5cf95085c193aa8949c6ec6e7243338b) )
- ROM_LOAD( "fx_obj15.5a", 0x3c0000, 0x040000, CRC(2bc909b3) SHA1(29c668d6d12ccdee25e97373bc4786894858d463) )
+ ROM_LOAD( "fx_obj-15.5a", 0x3c0000, 0x040000, CRC(2bc909b3) SHA1(29c668d6d12ccdee25e97373bc4786894858d463) )
ROM_REGION( 0x400000, "gfx2", 0 ) /* Tiles */
NAMCOS2_GFXROM_LOAD_128K( "fx_chr-0.11n", 0x000000, CRC(6658c1c3) SHA1(64b5466e0f94cf5f3cb92915a26331748f67041a) )
NAMCOS2_GFXROM_LOAD_128K( "fx_chr-1.11p", 0x080000, CRC(3a888943) SHA1(6540b417003045dfa1401a1ff04ac55b86cc177f) )
- NAMCOS2_GFXROM_LOAD_128K( "fx2_ch2.11r", 0x100000, CRC(fdf1e86b) SHA1(91a61c10a9e92f8bbc26ffc9cb72deb31378a843) ) // should this be the same, fx2 is the world set label, needs checking
+ NAMCOS2_GFXROM_LOAD_128K( "fx_chr-2.11r", 0x100000, CRC(179e4ec6) SHA1(2936ef847c5a9e527f7198f65a21eee7ac36891c) )
NAMCOS2_GFXROM_LOAD_128K( "fx_chr-3.11s", 0x180000, CRC(47fa7e61) SHA1(cc2eed81ddb4f942dd7a07e474760e4608eb4da0) )
NAMCOS2_GFXROM_LOAD_128K( "fx_chr-4.9n", 0x200000, CRC(c720c5f5) SHA1(f68f369bbefe01c770314ea597dd88587638c62a) )
NAMCOS2_GFXROM_LOAD_128K( "fx_chr-5.9p", 0x280000, CRC(9eacdbc8) SHA1(ca4061afc9e61eeb543f2a3740812abf6a1049bc) )
@@ -3917,8 +3917,8 @@ ROM_END
ROM_START( fourtraxa )
ROM_REGION( 0x040000, "maincpu", 0 ) /* Master CPU */
- ROM_LOAD16_BYTE( "fx4_mp0a.11d", 0x000000, 0x020000, CRC(f147cd6b) SHA1(7cdadd68d55dd8fa9b19cbee1434d9266ae1f4b9) ) // == fx2_mp0.11d
- ROM_LOAD16_BYTE( "fx4_mp1a.13d", 0x000001, 0x020000, CRC(d1138c85) SHA1(32bf68ae36f72b84f3c3df28425147b6aaac1edf) )
+ ROM_LOAD16_BYTE( "fx4_mpr-0a.11d", 0x000000, 0x020000, CRC(f147cd6b) SHA1(7cdadd68d55dd8fa9b19cbee1434d9266ae1f4b9) ) // == fx2_mp0.11d
+ ROM_LOAD16_BYTE( "fx4_mpr-1a.13d", 0x000001, 0x020000, CRC(d1138c85) SHA1(32bf68ae36f72b84f3c3df28425147b6aaac1edf) )
ROM_REGION( 0x040000, "slave", 0 ) /* Slave CPU */
ROM_LOAD16_BYTE( "fx1_sp0.11k", 0x000000, 0x020000, CRC(48548e78) SHA1(b3a9de8682fe63c1c3ecab3e3f9380a884efd4af) ) // same content as fx2 set, different label
@@ -3939,24 +3939,24 @@ ROM_START( fourtraxa )
ROM_LOAD( "fx_obj-9.7c", 0x140000, 0x040000, CRC(90f0735b) SHA1(2adbe72c6547075c0cc0386789cc1b8c1a0bc84f) )
ROM_LOAD( "fx_obj-12.8a", 0x180000, 0x040000, CRC(f5e23b78) SHA1(99896bd7c6663e3f57cb5d206964b81b5d64c8b6) )
ROM_LOAD( "fx_obj-13.7a", 0x1c0000, 0x040000, CRC(04a25007) SHA1(0c33450b0d6907754dbf1914849d1630baa824bd) )
- ROM_LOAD( "fx_obj2.2c", 0x200000, 0x040000, CRC(243affc7) SHA1(738d62960e79b95079b2208ec48fa0f3738c7611) )
+ ROM_LOAD( "fx_obj-2.2c", 0x200000, 0x040000, CRC(243affc7) SHA1(738d62960e79b95079b2208ec48fa0f3738c7611) )
ROM_LOAD( "fx_obj-3.1c", 0x240000, 0x040000, CRC(b7e5d17d) SHA1(3d8ea7cbf33b595ddf739024e8d0fccd5f9e073b) )
- ROM_LOAD( "fx_obj6.2a", 0x280000, 0x040000, CRC(a2d5ce4a) SHA1(bbe9df3914632a573a95fcba76442404d149fb9d) )
- ROM_LOAD( "fx_obj7.1a", 0x2c0000, 0x040000, CRC(4d91c929) SHA1(97470a4ad7b28df83c632bfc8c309b24701275fe) )
- ROM_LOAD( "fx_obj10.6c", 0x300000, 0x040000, CRC(7a01e86f) SHA1(5fde10e53cb192df0f3873cd6d59c725430948f5) )
+ ROM_LOAD( "fx_obj-6.2a", 0x280000, 0x040000, CRC(a2d5ce4a) SHA1(bbe9df3914632a573a95fcba76442404d149fb9d) )
+ ROM_LOAD( "fx_obj-7.1a", 0x2c0000, 0x040000, CRC(4d91c929) SHA1(97470a4ad7b28df83c632bfc8c309b24701275fe) )
+ ROM_LOAD( "fx_obj-10.6c", 0x300000, 0x040000, CRC(7a01e86f) SHA1(5fde10e53cb192df0f3873cd6d59c725430948f5) )
ROM_LOAD( "fx_obj-11.5c", 0x340000, 0x040000, CRC(514b3fe5) SHA1(19562ba2ac04a16d335bdc81b34d929f7ff9161c) )
ROM_LOAD( "fx_obj-14.6a", 0x380000, 0x040000, CRC(c1658c77) SHA1(ec689d0e5cf95085c193aa8949c6ec6e7243338b) )
- ROM_LOAD( "fx_obj15.5a", 0x3c0000, 0x040000, CRC(2bc909b3) SHA1(29c668d6d12ccdee25e97373bc4786894858d463) )
+ ROM_LOAD( "fx_obj-15.5a", 0x3c0000, 0x040000, CRC(2bc909b3) SHA1(29c668d6d12ccdee25e97373bc4786894858d463) )
ROM_REGION( 0x400000, "gfx2", 0 ) /* Tiles */
- NAMCOS2_GFXROM_LOAD_128K( "fx_chr-0.11n", 0x000000, CRC(6658c1c3) SHA1(64b5466e0f94cf5f3cb92915a26331748f67041a) )
- NAMCOS2_GFXROM_LOAD_128K( "fx_chr-1.11p", 0x080000, CRC(3a888943) SHA1(6540b417003045dfa1401a1ff04ac55b86cc177f) )
- NAMCOS2_GFXROM_LOAD_128K( "fx4_ch-2a.11r",0x100000, CRC(a5d1ab10) SHA1(8624ef0911c57155b46e184d10cb122d4a41a2de) ) // unique to this set, mask ROM intentionally replaced
- NAMCOS2_GFXROM_LOAD_128K( "fx_chr-3.11s", 0x180000, CRC(47fa7e61) SHA1(cc2eed81ddb4f942dd7a07e474760e4608eb4da0) )
- NAMCOS2_GFXROM_LOAD_128K( "fx_chr-4.9n", 0x200000, CRC(c720c5f5) SHA1(f68f369bbefe01c770314ea597dd88587638c62a) )
- NAMCOS2_GFXROM_LOAD_128K( "fx_chr-5.9p", 0x280000, CRC(9eacdbc8) SHA1(ca4061afc9e61eeb543f2a3740812abf6a1049bc) )
- NAMCOS2_GFXROM_LOAD_128K( "fx_chr-6.9r", 0x300000, CRC(c3dba42e) SHA1(2b5a8fabec11ccd44156ecfccf86fc713845d262) )
- NAMCOS2_GFXROM_LOAD_128K( "fx_chr-7.9s", 0x380000, CRC(c009f3ae) SHA1(394beed29bda97f4f5ba532bc0bd22177154746b) )
+ NAMCOS2_GFXROM_LOAD_128K( "fx_chr-0.11n", 0x000000, CRC(6658c1c3) SHA1(64b5466e0f94cf5f3cb92915a26331748f67041a) )
+ NAMCOS2_GFXROM_LOAD_128K( "fx_chr-1.11p", 0x080000, CRC(3a888943) SHA1(6540b417003045dfa1401a1ff04ac55b86cc177f) )
+ NAMCOS2_GFXROM_LOAD_128K( "fx4_chr-2a.11r", 0x100000, CRC(a5d1ab10) SHA1(8624ef0911c57155b46e184d10cb122d4a41a2de) ) // unique to this set, mask ROM intentionally replaced
+ NAMCOS2_GFXROM_LOAD_128K( "fx_chr-3.11s", 0x180000, CRC(47fa7e61) SHA1(cc2eed81ddb4f942dd7a07e474760e4608eb4da0) )
+ NAMCOS2_GFXROM_LOAD_128K( "fx_chr-4.9n", 0x200000, CRC(c720c5f5) SHA1(f68f369bbefe01c770314ea597dd88587638c62a) )
+ NAMCOS2_GFXROM_LOAD_128K( "fx_chr-5.9p", 0x280000, CRC(9eacdbc8) SHA1(ca4061afc9e61eeb543f2a3740812abf6a1049bc) )
+ NAMCOS2_GFXROM_LOAD_128K( "fx_chr-6.9r", 0x300000, CRC(c3dba42e) SHA1(2b5a8fabec11ccd44156ecfccf86fc713845d262) )
+ NAMCOS2_GFXROM_LOAD_128K( "fx_chr-7.9s", 0x380000, CRC(c009f3ae) SHA1(394beed29bda97f4f5ba532bc0bd22177154746b) )
ROM_REGION( 0x400000, "gfx3", ROMREGION_ERASEFF ) /* ROZ Tiles */
/* No ROZ files in zip */
diff --git a/src/mame/drivers/nc.cpp b/src/mame/drivers/nc.cpp
index 9591e98f3a5..6b622164f45 100644
--- a/src/mame/drivers/nc.cpp
+++ b/src/mame/drivers/nc.cpp
@@ -855,8 +855,7 @@ void nc100_state::nc100_io(address_map &map)
map(0x91, 0x9f).r(FUNC(nc100_state::nc_irq_status_r));
map(0xa0, 0xaf).r(FUNC(nc100_state::nc100_card_battery_status_r));
map(0xb0, 0xb9).r(FUNC(nc100_state::nc_key_data_in_r));
- map(0xc0, 0xc0).rw(m_uart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xc1, 0xc1).rw(m_uart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xc0, 0xc1).rw(m_uart, FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0xd0, 0xdf).rw("rtc", FUNC(tc8521_device::read), FUNC(tc8521_device::write));
}
@@ -1259,8 +1258,7 @@ void nc200_state::nc200_io(address_map &map)
map(0x90, 0x90).rw(FUNC(nc200_state::nc_irq_status_r), FUNC(nc200_state::nc200_irq_status_w));
map(0xa0, 0xa0).r(FUNC(nc200_state::nc200_card_battery_status_r));
map(0xb0, 0xb9).r(FUNC(nc200_state::nc_key_data_in_r));
- map(0xc0, 0xc0).rw(m_uart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xc1, 0xc1).rw(m_uart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xc0, 0xc1).rw(m_uart, FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0xd0, 0xd1).rw("mc", FUNC(mc146818_device::read), FUNC(mc146818_device::write));
map(0xe0, 0xe1).m("upd765", FUNC(upd765a_device::map));
}
diff --git a/src/mame/drivers/neogeo.cpp b/src/mame/drivers/neogeo.cpp
index bec0233cf24..d8afdcc4310 100644
--- a/src/mame/drivers/neogeo.cpp
+++ b/src/mame/drivers/neogeo.cpp
@@ -1351,38 +1351,22 @@ void neogeo_base_state::init_audio()
void neogeo_base_state::init_ym()
{
- uint8_t *ROM;
- uint32_t len;
-
// Resetting a sound device causes the core to update() it and generate samples if it's not up to date.
- // Thus we preemptively reset it here while the old pointers are still valid so it's up to date and
- // doesn't generate samples below when we reset it for the new pointers.
m_ym->reset();
- // all these region_free / region_alloc machinery is needed because current YM emulation does not allow
- // to pass a ROM pointer different from a "ymsnd" / "ymsnd.deltat" region, and therefore we need to copy
- // the ROM(s) from the cart to the corresponding region(s) with appropriate names...
+ address_space &adpcm_a_space = m_ym->space(0);
+ adpcm_a_space.unmap_readwrite(0x000000, 0xffffff);
+
if (m_slots[m_curr_slot] && m_slots[m_curr_slot]->get_ym_size())
- {
- ROM = m_slots[m_curr_slot]->get_ym_base();
- len = m_slots[m_curr_slot]->get_ym_size();
- if (memregion(":ymsnd"))
- machine().memory().region_free(":ymsnd");
- machine().memory().region_alloc(":ymsnd", len, 1, ENDIANNESS_LITTLE);
- memcpy(memregion(":ymsnd")->base(), ROM, len);
- }
+ adpcm_a_space.install_rom(0, m_slots[m_curr_slot]->get_ym_size() - 1, m_slots[m_curr_slot]->get_ym_base());
- if (memregion(":ymsnd.deltat"))
- machine().memory().region_free(":ymsnd.deltat");
- if (m_slots[m_curr_slot] && m_slots[m_curr_slot]->get_ymdelta_size())
- {
- ROM = m_slots[m_curr_slot]->get_ymdelta_base();
- len = m_slots[m_curr_slot]->get_ymdelta_size();
- machine().memory().region_alloc(":ymsnd.deltat", len, 1, ENDIANNESS_LITTLE);
- memcpy(memregion(":ymsnd.deltat")->base(), ROM, len);
- }
+ address_space &adpcm_b_space = m_ym->space(1);
+ adpcm_b_space.unmap_readwrite(0x000000, 0xffffff);
- m_ym->reset(); // reset it again to get the new pointers
+ if (m_slots[m_curr_slot] && m_slots[m_curr_slot]->get_ymdelta_size())
+ adpcm_b_space.install_rom(0, m_slots[m_curr_slot]->get_ymdelta_size() - 1, m_slots[m_curr_slot]->get_ymdelta_base());
+ else if (m_slots[m_curr_slot] && m_slots[m_curr_slot]->get_ym_size())
+ adpcm_b_space.install_rom(0, m_slots[m_curr_slot]->get_ym_size() - 1, m_slots[m_curr_slot]->get_ym_base());
}
void neogeo_base_state::init_sprites()
@@ -1980,11 +1964,10 @@ MACHINE_CONFIG_START(neogeo_base_state::neogeo_stereo)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
- MCFG_DEVICE_MODIFY("ymsnd")
- MCFG_SOUND_ROUTE(0, "lspeaker", 0.28)
- MCFG_SOUND_ROUTE(0, "rspeaker", 0.28)
- MCFG_SOUND_ROUTE(1, "lspeaker", 0.98)
- MCFG_SOUND_ROUTE(2, "rspeaker", 0.98)
+ m_ym->add_route(0, "lspeaker", 0.28);
+ m_ym->add_route(0, "rspeaker", 0.28);
+ m_ym->add_route(1, "lspeaker", 0.98);
+ m_ym->add_route(2, "rspeaker", 0.98);
MACHINE_CONFIG_END
@@ -2008,10 +1991,9 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(ngarcade_base_state::neogeo_mono)
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_MODIFY("ymsnd")
- MCFG_SOUND_ROUTE(0, "speaker", 0.28)
- MCFG_SOUND_ROUTE(1, "speaker", 0.49)
- MCFG_SOUND_ROUTE(2, "speaker", 0.49)
+ m_ym->add_route(0, "speaker", 0.28);
+ m_ym->add_route(1, "speaker", 0.49);
+ m_ym->add_route(2, "speaker", 0.49);
MACHINE_CONFIG_END
@@ -2314,8 +2296,7 @@ MACHINE_CONFIG_END
ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) ) \
ROM_REGION( 0x20000, "cslot1:audiocpu", 0 ) \
ROM_LOAD( name, 0x00000, 0x10000, hash ) \
- ROM_RELOAD( 0x10000, 0x10000 ) \
- ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF )
+ ROM_RELOAD( 0x10000, 0x10000 )
#define NEO_BIOS_AUDIO_128K(name, hash) \
NEOGEO_BIOS \
@@ -2323,8 +2304,7 @@ MACHINE_CONFIG_END
ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) ) \
ROM_REGION( 0x30000, "cslot1:audiocpu", 0 ) \
ROM_LOAD( name, 0x00000, 0x20000, hash ) \
- ROM_RELOAD( 0x10000, 0x20000 ) \
- ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF )
+ ROM_RELOAD( 0x10000, 0x20000 )
#define NEO_BIOS_AUDIO_256K(name, hash) \
NEOGEO_BIOS \
@@ -2332,8 +2312,7 @@ MACHINE_CONFIG_END
ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) ) \
ROM_REGION( 0x50000, "cslot1:audiocpu", 0 ) \
ROM_LOAD( name, 0x00000, 0x40000, hash ) \
- ROM_RELOAD( 0x10000, 0x40000 ) \
- ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF )
+ ROM_RELOAD( 0x10000, 0x40000 )
#define NEO_BIOS_AUDIO_512K(name, hash) \
NEOGEO_BIOS \
@@ -2341,9 +2320,7 @@ MACHINE_CONFIG_END
ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) ) \
ROM_REGION( 0x90000, "cslot1:audiocpu", 0 ) \
ROM_LOAD( name, 0x00000, 0x80000, hash ) \
- ROM_RELOAD( 0x10000, 0x80000 ) \
- ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF )
-
+ ROM_RELOAD( 0x10000, 0x80000 )
#define NEO_BIOS_AUDIO_ENCRYPTED_128K(name, hash) \
NEOGEO_BIOS \
@@ -2351,24 +2328,23 @@ MACHINE_CONFIG_END
ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) ) \
ROM_REGION( 0x90000, "cslot1:audiocpu", ROMREGION_ERASEFF ) \
ROM_REGION( 0x80000, "cslot1:audiocrypt", 0 ) \
- ROM_LOAD( name, 0x00000, 0x20000, hash ) \
- ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF )
+ ROM_LOAD( name, 0x00000, 0x20000, hash )
+
#define NEO_BIOS_AUDIO_ENCRYPTED_256K(name, hash) \
NEOGEO_BIOS \
ROM_REGION( 0x20000, "audiobios", 0 ) \
ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) ) \
ROM_REGION( 0x90000, "cslot1:audiocpu", ROMREGION_ERASEFF ) \
ROM_REGION( 0x80000, "cslot1:audiocrypt", 0 ) \
- ROM_LOAD( name, 0x00000, 0x40000, hash ) \
- ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF )
+ ROM_LOAD( name, 0x00000, 0x40000, hash )
+
#define NEO_BIOS_AUDIO_ENCRYPTED_512K(name, hash) \
NEOGEO_BIOS \
ROM_REGION( 0x20000, "audiobios", 0 ) \
ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) ) \
ROM_REGION( 0x90000, "cslot1:audiocpu", ROMREGION_ERASEFF ) \
ROM_REGION( 0x80000, "cslot1:audiocrypt", 0 ) \
- ROM_LOAD( name, 0x00000, 0x80000, hash ) \
- ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF )
+ ROM_LOAD( name, 0x00000, 0x80000, hash )
@@ -2411,8 +2387,6 @@ ROM_START( neogeo )
ROM_REGION( 0x20000, "fixedbios", 0 )
ROM_LOAD( "sfix.sfix", 0x000000, 0x20000, CRC(c2ea0cfd) SHA1(fd4a618cdcdbf849374f0a50dd8efe9dbab706c3) )
- ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF )
-
ROM_REGION( 0x100000, "sprites", ROMREGION_ERASEFF )
ROM_END
@@ -2441,10 +2415,6 @@ ROM_START( aes )
ROM_REGION( 0x20000, "fixed", ROMREGION_ERASEFF )
- ROM_REGION( 0x1000000, "ymsnd", ROMREGION_ERASEFF )
-
- ROM_REGION( 0x1000000, "ymsnd.deltat", ROMREGION_ERASEFF )
-
ROM_REGION( 0x900000, "sprites", ROMREGION_ERASEFF )
ROM_END
@@ -6473,7 +6443,6 @@ ROM_START( dragonsh )
ROM_REGION( 0x30000, "cslot1:audiocpu", ROMREGION_ERASEFF )
// not present
- ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF )
ROM_REGION( 0x200000, "cslot1:ymsnd", ROMREGION_ERASE00 )
ROM_LOAD( "sram.v1", 0x000000, 0x200000, NO_DUMP ) // was a dead AXS2000PC 2MB sram card, battery dead, data lost.
@@ -7099,7 +7068,6 @@ ROM_START( kizuna4p ) /* same cartridge as kizuna - 4-player mode is enabled by
ROM_LOAD16_WORD_SWAP_BIOS( 0, "sp-45.sp1",0x00000, 0x080000, CRC(03cc9f6a) SHA1(cdf1f49e3ff2bac528c21ed28449cf35b7957dc1) )
ROM_SYSTEM_BIOS( 1, "japan", "Japan MVS (J3)" )
ROM_LOAD16_WORD_SWAP_BIOS( 1, "japan-j3.bin",0x00000, 0x020000, CRC(dff6d41f) SHA1(e92910e20092577a4523a6b39d578a71d4de7085) )
- ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF )
ROM_REGION( 0x30000, "cslot1:audiocpu", 0 )
ROM_LOAD( "216-m1.m1", 0x00000, 0x20000, CRC(1b096820) SHA1(72852e78c620038f8dafde5e54e02e418c31be9c) ) /* mask rom TC531001 */
@@ -7796,7 +7764,6 @@ ROM_START( irrmaze ) /* MVS ONLY RELEASE */
ROM_REGION16_BE( 0x20000, "mainbios", 0 )
/* special BIOS with trackball support, we only have one Irritating Maze bios and thats asia */
ROM_LOAD16_WORD_SWAP("236-bios.sp1", 0x00000, 0x020000, CRC(853e6b96) SHA1(de369cb4a7df147b55168fa7aaf0b98c753b735e) )
- ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF )
ROM_REGION( 0x30000, "cslot1:audiocpu", 0 )
ROM_LOAD( "236-m1.m1", 0x00000, 0x20000, CRC(880a1abd) SHA1(905afa157aba700e798243b842792e50729b19a0) ) /* TC531001 */
@@ -10944,7 +10911,6 @@ ROM_START( svcboot )
ROM_REGION( 0x20000, "audiobios", 0 )
ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) )
- ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF )
ROM_REGION( 0x50000, "cslot1:audiocpu", 0 )
ROM_LOAD( "svc-m1.bin", 0x20000, 0x10000, CRC(804328c3) SHA1(f931636c563b0789d4812033a77b47bf663db43f) )
@@ -10982,7 +10948,6 @@ ROM_START( svcplus )
ROM_REGION( 0x20000, "audiobios", 0 )
ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) )
- ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF )
ROM_REGION( 0x50000, "cslot1:audiocpu", 0 )
ROM_LOAD( "svc-m1.bin", 0x20000, 0x10000, CRC(804328c3) SHA1(f931636c563b0789d4812033a77b47bf663db43f) )
@@ -11021,7 +10986,6 @@ ROM_START( svcplusa )
ROM_REGION( 0x20000, "audiobios", 0 )
ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) )
- ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF )
ROM_REGION( 0x50000, "cslot1:audiocpu", 0 )
ROM_LOAD( "svc-m1.bin", 0x20000, 0x10000, CRC(804328c3) SHA1(f931636c563b0789d4812033a77b47bf663db43f) )
@@ -11058,7 +11022,6 @@ ROM_START( svcsplus )
ROM_REGION( 0x20000, "audiobios", 0 )
ROM_LOAD( "sm1.sm1", 0x00000, 0x20000, CRC(94416d67) SHA1(42f9d7ddd6c0931fd64226a60dc73602b2819dcf) )
- ROM_REGION( 0x10000, "ymsnd", ROMREGION_ERASEFF )
ROM_REGION( 0x50000, "cslot1:audiocpu", 0 )
ROM_LOAD( "svc-m1.bin", 0x20000, 0x10000, CRC(804328c3) SHA1(f931636c563b0789d4812033a77b47bf663db43f) )
diff --git a/src/mame/drivers/nforcepc.cpp b/src/mame/drivers/nforcepc.cpp
index e8b26ad1b02..2fd47bff6ea 100644
--- a/src/mame/drivers/nforcepc.cpp
+++ b/src/mame/drivers/nforcepc.cpp
@@ -24,6 +24,83 @@
#include "cpu/i386/i386.h"
#include "machine/pci.h"
#include "machine/pci-ide.h"
+#include "includes/nforcepc.h"
+
+/*
+ Pci devices
+*/
+
+DEFINE_DEVICE_TYPE(CRUSH11, crush11_host_device, "crush11", "NVIDIA Corporation nForce CPU bridge")
+
+void crush11_host_device::config_map(address_map &map)
+{
+ pci_host_device::config_map(map);
+ map(0x50, 0x50).rw(FUNC(crush11_host_device::test_r), FUNC(crush11_host_device::test_w));
+}
+
+crush11_host_device::crush11_host_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : pci_host_device(mconfig, CRUSH11, tag, owner, clock)
+ , cpu(*this, finder_base::DUMMY_TAG)
+{
+}
+
+void crush11_host_device::set_ram_size(int ram_size)
+{
+ ddr_ram_size = ram_size;
+}
+
+void crush11_host_device::device_start()
+{
+ pci_host_device::device_start();
+ memory_space = &cpu->space(AS_PROGRAM);
+ io_space = &cpu->space(AS_IO);
+
+ memory_window_start = 0;
+ memory_window_end = 0xffffffff;
+ memory_offset = 0;
+ io_window_start = 0;
+ io_window_end = 0xffff;
+ io_offset = 0;
+ status = 0x0010;
+
+ ram.resize(ddr_ram_size / 4);
+}
+
+void crush11_host_device::reset_all_mappings()
+{
+ pci_host_device::reset_all_mappings();
+}
+
+void crush11_host_device::device_reset()
+{
+ pci_host_device::device_reset();
+}
+
+void crush11_host_device::map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space,
+ uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space)
+{
+ io_space->install_device(0, 0xffff, *static_cast<pci_host_device *>(this), &pci_host_device::io_configuration_access_map);
+
+ memory_space->install_ram(0x00000000, 0x0009ffff, &ram[0x00000000 / 4]);
+ memory_space->install_ram(0x00100000, ddr_ram_size - 1, &ram[0x00100000 / 4]);
+ uint32_t mask = m_region->bytes() - 1;
+ memory_space->install_rom(0x000c0000, 0x000fffff, m_region->base() + (0x000c0000 & mask));
+ memory_space->install_rom(0xfffc0000, 0xffffffff, m_region->base() + (0x000c0000 & mask));
+}
+
+READ8_MEMBER(crush11_host_device::test_r)
+{
+ return 0;
+}
+
+WRITE8_MEMBER(crush11_host_device::test_w)
+{
+ logerror("test = %02x\n", data);
+}
+
+/*
+ Machine state
+*/
class nforcepc_state : public driver_device
{
@@ -79,8 +156,6 @@ WRITE8_MEMBER(nforcepc_state::boot_state_award_w)
void nforcepc_state::nforce_map(address_map &map)
{
map.unmap_value_high();
- map(0x000c0000, 0x000fffff).rom().region("bios", 0);
- map(0xfffc0000, 0xffffffff).rom().region("bios", 0);
}
void nforcepc_state::nforce_map_io(address_map &map)
@@ -88,16 +163,19 @@ void nforcepc_state::nforce_map_io(address_map &map)
map.unmap_value_high();
}
+/*
+ Machine configuration
+*/
+
MACHINE_CONFIG_START(nforcepc_state::nforcepc)
MCFG_DEVICE_ADD("maincpu", ATHLONXP, 90000000)
MCFG_DEVICE_PROGRAM_MAP(nforce_map)
MCFG_DEVICE_IO_MAP(nforce_map_io)
-/* MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pci:07.0:pic8259_master", pic8259_device, inta_cb)
+ MCFG_DEVICE_ADD(":pci", PCI_ROOT, 0)
+ MCFG_DEVICE_ADD(":pci:00.0", CRUSH11, 0, "maincpu", 2 * 1024 * 1024)
+ /* MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pci:07.0:pic8259_master", pic8259_device, inta_cb)
MCFG_I386_SMIACT(WRITELINE("pci:00.0", i82439hx_host_device, smi_act_w))
- MCFG_DEVICE_ADD( ":pci", PCI_ROOT, 0)
- MCFG_DEVICE_ADD( ":pci:00.0", I82439HX, 0, "maincpu", 256*1024*1024)
-
i82371sb_isa_device &isa(I82371SB_ISA(config, ":pci:07.0", 0));
isa.boot_state_hook().set(FUNC(nforcepc_state::boot_state_phoenix_ver40_rev6_w));
isa.smi().set_inputline(":maincpu", INPUT_LINE_SMI);
@@ -108,7 +186,7 @@ MACHINE_CONFIG_START(nforcepc_state::nforcepc)
MACHINE_CONFIG_END
ROM_START(nforcepc)
- ROM_REGION32_LE(0x40000, "bios", 0) /* PC bios */
+ ROM_REGION32_LE(0x40000, ":pci:00.0", 0) /* PC bios */
ROM_SYSTEM_BIOS(0, "a7n266c", "a7n266c") // Motherboard dump. Chip: SST49LF020 Package: PLCC32 Label had 3 lines of text: "A7NC3" "1001.D" "GSQ98"
ROMX_LOAD("a7n266c.bin", 0, 0x40000, CRC(F4F0E4FC), ROM_BIOS(0))
ROM_SYSTEM_BIOS(1, "a7n266c1001d", "a7n266c1001d") // bios version 1001.D dwonloaded from Asus website
diff --git a/src/mame/drivers/ngen.cpp b/src/mame/drivers/ngen.cpp
index 9d7e2e0bbda..3535c8d365e 100644
--- a/src/mame/drivers/ngen.cpp
+++ b/src/mame/drivers/ngen.cpp
@@ -346,12 +346,9 @@ WRITE16_MEMBER(ngen_state::peripheral_w)
m_crtc->register_w(space,0,data & 0xff);
break;
case 0x146:
- if(ACCESSING_BITS_0_7)
- m_viduart->data_w(space,0,data & 0xff);
- break;
case 0x147:
if(ACCESSING_BITS_0_7)
- m_viduart->control_w(space,0,data & 0xff);
+ m_viduart->write(offset & 1, data & 0xff);
break;
case 0x1a0: // serial?
logerror("Serial(?) 0x1a0 write offset %04x data %04x mask %04x\n",offset,data,mem_mask);
@@ -420,13 +417,10 @@ READ16_MEMBER(ngen_state::peripheral_r)
ret = m_crtc->register_r(space,0);
break;
case 0x146:
- if(ACCESSING_BITS_0_7)
- ret = m_viduart->data_r(space,0);
- break;
case 0x147: // keyboard UART
- // expects bit 0 to be set (UART transmit ready)
+ // status expects bit 0 to be set (UART transmit ready)
if(ACCESSING_BITS_0_7)
- ret = m_viduart->status_r(space,0);
+ ret = m_viduart->read(offset & 1);
break;
case 0x1a0: // I/O control register?
ret = m_control; // end of DMA transfer? (maybe a per-channel EOP?) Bit 6 is set during a transfer?
@@ -791,13 +785,10 @@ READ16_MEMBER( ngen_state::b38_keyboard_r )
switch(offset)
{
case 0:
- if(ACCESSING_BITS_0_7)
- ret = m_viduart->data_r(space,0);
- break;
case 1: // keyboard UART
- // expects bit 0 to be set (UART transmit ready)
+ // status expects bit 0 to be set (UART transmit ready)
if(ACCESSING_BITS_0_7)
- ret = m_viduart->status_r(space,0);
+ ret = m_viduart->read(offset & 1);
break;
}
return ret;
@@ -808,12 +799,9 @@ WRITE16_MEMBER( ngen_state::b38_keyboard_w )
switch(offset)
{
case 0:
- if(ACCESSING_BITS_0_7)
- m_viduart->data_w(space,0,data & 0xff);
- break;
case 1:
if(ACCESSING_BITS_0_7)
- m_viduart->control_w(space,0,data & 0xff);
+ m_viduart->write(offset & 1, data & 0xff);
break;
}
}
@@ -829,7 +817,7 @@ READ16_MEMBER( ngen_state::b38_crtc_r )
break;
case 1:
if(ACCESSING_BITS_0_7)
- ret = m_viduart->data_r(space,0);
+ ret = m_viduart->data_r();
break;
}
return ret;
diff --git a/src/mame/drivers/octopus.cpp b/src/mame/drivers/octopus.cpp
index 7f1a2da06a3..85b40554c79 100644
--- a/src/mame/drivers/octopus.cpp
+++ b/src/mame/drivers/octopus.cpp
@@ -305,8 +305,7 @@ void octopus_state::octopus_io(address_map &map)
map(0x20, 0x20).portr("DSWA");
map(0x21, 0x2f).rw(FUNC(octopus_state::system_r), FUNC(octopus_state::system_w));
map(0x31, 0x33).rw(FUNC(octopus_state::bank_sel_r), FUNC(octopus_state::bank_sel_w));
- map(0x50, 0x50).rw(m_kb_uart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x51, 0x51).rw(m_kb_uart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x50, 0x51).rw(m_kb_uart, FUNC(i8251_device::read), FUNC(i8251_device::write));
// 0x70-73: HD controller
map(0x80, 0x83).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write));
map(0xa0, 0xa0).rw(m_serial, FUNC(z80sio_device::da_r), FUNC(z80sio_device::da_w));
diff --git a/src/mame/drivers/okean240.cpp b/src/mame/drivers/okean240.cpp
index 7114a44014e..5bcc07378c7 100644
--- a/src/mame/drivers/okean240.cpp
+++ b/src/mame/drivers/okean240.cpp
@@ -255,8 +255,7 @@ void okean240_state::okean240a_io(address_map &map)
map(0x60, 0x63).rw("pit", FUNC(pit8253_device::read), FUNC(pit8253_device::write));
map(0x80, 0x81).rw("pic", FUNC(pic8259_device::read), FUNC(pic8259_device::write));
map(0x80, 0x80).r(FUNC(okean240_state::okean240a_kbd_status_r));
- map(0xa0, 0xa0).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xa1, 0xa1).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xa0, 0xa1).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0xc0, 0xc3).rw("ppic", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0xe0, 0xe3).rw("ppie", FUNC(i8255_device::read), FUNC(i8255_device::write));
// AM_RANGE(0x00, 0x1f)=ppa00.data
@@ -279,8 +278,7 @@ void okean240_state::okean240t_io(address_map &map)
map(0x60, 0x63).rw("pit", FUNC(pit8253_device::read), FUNC(pit8253_device::write));
map(0x80, 0x81).rw("pic", FUNC(pic8259_device::read), FUNC(pic8259_device::write));
map(0x80, 0x80).r(FUNC(okean240_state::okean240_kbd_status_r));
- map(0xa0, 0xa0).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xa1, 0xa1).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xa0, 0xa1).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0xc0, 0xc3).rw("ppic", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0xe0, 0xe3).rw("ppie", FUNC(i8255_device::read), FUNC(i8255_device::write));
}
diff --git a/src/mame/drivers/opwolf.cpp b/src/mame/drivers/opwolf.cpp
index 9a97b534e9e..6c2e351021a 100644
--- a/src/mame/drivers/opwolf.cpp
+++ b/src/mame/drivers/opwolf.cpp
@@ -258,7 +258,10 @@ TODO
There are a few unmapped writes for the sound Z80 in the log.
-Unknown writes to the MSM5205 control addresses
+Unknown writes to the MSM5205 control addresses (RUN/RES implementation is wrong)
+
+Sound volume filtering is imperfect. Notably the coin insert sound:
+MSM1 rings it at volume 0xa8, MSM2 echos it at volume 0x84 but should be more muffled.
Raine source has standard Asuka/Mofflot sprite/tile priority:
0x2000 in sprite_ctrl puts all sprites under top bg layer. But
@@ -304,7 +307,9 @@ public:
m_cchip_irq_clear(*this, "cchip_irq_clear"),
m_pc080sn(*this, "pc080sn"),
m_pc090oj(*this, "pc090oj"),
- m_msm(*this, "msm%u", 0)
+ m_msm(*this, "msm%u", 0),
+ m_lspeaker(*this, "lspeaker"),
+ m_rspeaker(*this, "rspeaker")
{ }
void opwolf(machine_config &config);
@@ -371,6 +376,8 @@ private:
required_device<pc080sn_device> m_pc080sn;
required_device<pc090oj_device> m_pc090oj;
required_device_array<msm5205_device, 2> m_msm;
+ required_device<speaker_device> m_lspeaker;
+ required_device<speaker_device> m_rspeaker;
};
@@ -747,15 +754,15 @@ WRITE8_MEMBER(opwolf_state::sound_bankswitch_w)
membank("z80bank")->set_entry(data & 0x03);
}
-//static uint8_t adpcm_d[0x08];
//0 - start ROM offset LSB
//1 - start ROM offset MSB
//2 - end ROM offset LSB
//3 - end ROM offset MSB
//start & end need to be multiplied by 16 to get a proper _byte_ address in adpcm ROM
-//4 - always zero write (start trigger ?)
-//5 - different values
-//6 - different values
+//4 - RUN, always zero write (start trigger ?)
+//5 - VOL, sample volume
+//6 - RES
+//7 - N/C
template<int N>
WRITE_LINE_MEMBER(opwolf_state::msm5205_vck_w)
@@ -794,6 +801,7 @@ WRITE8_MEMBER(opwolf_state::opwolf_adpcm_b_w)
m_adpcm_pos[0] = start;
m_adpcm_end[0] = end;
m_msm[0]->reset_w(0);
+ m_msm[0]->set_output_gain(0, m_adpcm_b[5] / 255.0);
//logerror("TRIGGER MSM1\n");
}
@@ -816,6 +824,7 @@ WRITE8_MEMBER(opwolf_state::opwolf_adpcm_c_w)
m_adpcm_pos[1] = start;
m_adpcm_end[1] = end;
m_msm[1]->reset_w(0);
+ m_msm[1]->set_output_gain(0, m_adpcm_c[5] / 255.0);
//logerror("TRIGGER MSM2\n");
}
@@ -824,12 +833,16 @@ WRITE8_MEMBER(opwolf_state::opwolf_adpcm_c_w)
WRITE8_MEMBER(opwolf_state::opwolf_adpcm_d_w)
{
-// logerror("CPU #1 d00%i-data=%2x pc=%4x\n",offset,data,m_audiocpu->pc() );
+ // total volume (speaker 1)
+ for (int i = 0; i <= 2; i++)
+ m_lspeaker->set_input_gain(i, data / 255.0);
}
WRITE8_MEMBER(opwolf_state::opwolf_adpcm_e_w)
{
-// logerror("CPU #1 e00%i-data=%2x pc=%4x\n",offset,data,m_audiocpu->pc() );
+ // total volume (speaker 2)
+ for (int i = 0; i <= 2; i++)
+ m_rspeaker->set_input_gain(i, data / 255.0);
}
@@ -975,14 +988,14 @@ MACHINE_CONFIG_START(opwolf_state::opwolf)
MCFG_DEVICE_ADD("msm0", MSM5205, 384000)
MCFG_MSM5205_VCLK_CB(WRITELINE(*this, opwolf_state, msm5205_vck_w<0>))
MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 kHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.60)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.60)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.85)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.85)
MCFG_DEVICE_ADD("msm1", MSM5205, 384000)
MCFG_MSM5205_VCLK_CB(WRITELINE(*this, opwolf_state, msm5205_vck_w<1>))
MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 kHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.60)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.60)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.85)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.85)
MCFG_DEVICE_ADD("ciu", PC060HA, 0)
MCFG_PC060HA_MASTER_CPU("maincpu")
@@ -1050,14 +1063,14 @@ MACHINE_CONFIG_START(opwolf_state::opwolfb) /* OSC clocks unknown for the bootle
MCFG_DEVICE_ADD("msm0", MSM5205, 384000)
MCFG_MSM5205_VCLK_CB(WRITELINE(*this, opwolf_state, msm5205_vck_w<0>))
MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 kHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.60)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.60)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.85)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.85)
MCFG_DEVICE_ADD("msm1", MSM5205, 384000)
MCFG_MSM5205_VCLK_CB(WRITELINE(*this, opwolf_state, msm5205_vck_w<1>))
MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 8 kHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.60)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.60)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.85)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.85)
MCFG_DEVICE_ADD("ciu", PC060HA, 0)
MCFG_PC060HA_MASTER_CPU("maincpu")
@@ -1268,8 +1281,6 @@ ROM_END
// Regular rom set includes the string '11 Sep 1987'
// C-Chip includes the string 'By_TAITO_Copration_On_OSAKA_BUNSHITU._01.Sep.1987_Toshiaki.Kato_Tsutomuawa_4
-// MACHINE_IMPERFECT_SOUND is present because the credit sound appears to double trigger. All other sounds seem correct.
-
// year rom parent machine inp state init
GAME( 1987, opwolf, 0, opwolf, opwolf, opwolf_state, init_opwolf, ROT0, "Taito Corporation Japan", "Operation Wolf (World, set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1987, opwolfa, opwolf, opwolf, opwolf, opwolf_state, init_opwolf, ROT0, "Taito Corporation Japan", "Operation Wolf (World, set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/pc.cpp b/src/mame/drivers/pc.cpp
index bc1db9a5efc..9f82b9e2cb9 100644
--- a/src/mame/drivers/pc.cpp
+++ b/src/mame/drivers/pc.cpp
@@ -454,8 +454,7 @@ void pc_state::epc_io(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x00ff).m("mb", FUNC(ibm5160_mb_device::map));
- map(0x0070, 0x0070).rw("i8251", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x0071, 0x0071).rw("i8251", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x0070, 0x0071).rw("i8251", FUNC(i8251_device::read), FUNC(i8251_device::write));
}
INPUT_CHANGED_MEMBER(pc_state::pc_turbo_callback)
diff --git a/src/mame/drivers/pc100.cpp b/src/mame/drivers/pc100.cpp
index b92eaee0d04..c1dd19b6a40 100644
--- a/src/mame/drivers/pc100.cpp
+++ b/src/mame/drivers/pc100.cpp
@@ -347,8 +347,7 @@ void pc100_state::pc100_io(address_map &map)
map(0x20, 0x23).r(FUNC(pc100_state::pc100_key_r)).umask16(0x00ff); //i/o, keyboard, mouse
map(0x22, 0x22).w(FUNC(pc100_state::pc100_output_w)); //i/o, keyboard, mouse
map(0x24, 0x24).w(FUNC(pc100_state::pc100_tc_w)); //i/o, keyboard, mouse
- map(0x28, 0x28).rw("uart8251", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x2a, 0x2a).rw("uart8251", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x28, 0x2b).rw("uart8251", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
map(0x30, 0x30).rw(FUNC(pc100_state::pc100_shift_r), FUNC(pc100_state::pc100_shift_w)); // crtc shift
map(0x38, 0x38).w(FUNC(pc100_state::pc100_crtc_addr_w)); //crtc address reg
map(0x3a, 0x3a).w(FUNC(pc100_state::pc100_crtc_data_w)); //crtc data reg
diff --git a/src/mame/drivers/pc6001.cpp b/src/mame/drivers/pc6001.cpp
index 3396f9e1736..285b9c140d7 100644
--- a/src/mame/drivers/pc6001.cpp
+++ b/src/mame/drivers/pc6001.cpp
@@ -240,8 +240,7 @@ void pc6001_state::pc6001_io(address_map &map)
{
map.unmap_value_high();
map.global_mask(0xff);
- map(0x80, 0x80).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x81, 0x81).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x80, 0x81).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x90, 0x93).mirror(0x0c).rw(FUNC(pc6001_state::nec_ppi8255_r), FUNC(pc6001_state::nec_ppi8255_w));
map(0xa0, 0xa0).mirror(0x0c).w("ay8910", FUNC(ay8910_device::address_w));
map(0xa1, 0xa1).mirror(0x0c).w("ay8910", FUNC(ay8910_device::data_w));
@@ -696,8 +695,7 @@ void pc6001mk2_state::pc6001mk2_io(address_map &map)
{
map.unmap_value_high();
map.global_mask(0xff);
- map(0x80, 0x80).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x81, 0x81).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x80, 0x81).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x90, 0x93).mirror(0x0c).rw(FUNC(pc6001mk2_state::nec_ppi8255_r), FUNC(pc6001mk2_state::necmk2_ppi8255_w));
@@ -933,8 +931,7 @@ void pc6001sr_state::pc6001sr_io(address_map &map)
// 0x40-0x43 palette indexes
map(0x60, 0x67).rw(FUNC(pc6001sr_state::sr_bank_rn_r), FUNC(pc6001sr_state::sr_bank_rn_w));
map(0x68, 0x6f).rw(FUNC(pc6001sr_state::sr_bank_wn_r), FUNC(pc6001sr_state::sr_bank_wn_w));
- map(0x80, 0x80).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x81, 0x81).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x80, 0x81).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x90, 0x93).mirror(0x0c).rw(FUNC(pc6001sr_state::nec_ppi8255_r), FUNC(pc6001sr_state::necsr_ppi8255_w));
diff --git a/src/mame/drivers/pc8001.cpp b/src/mame/drivers/pc8001.cpp
index 4b15d2a3f6e..88fec2ddf37 100644
--- a/src/mame/drivers/pc8001.cpp
+++ b/src/mame/drivers/pc8001.cpp
@@ -188,8 +188,7 @@ void pc8001_state::pc8001_io(address_map &map)
map(0x08, 0x08).portr("Y8");
map(0x09, 0x09).portr("Y9");
map(0x10, 0x10).mirror(0x0f).w(FUNC(pc8001_state::port10_w));
- map(0x20, 0x20).mirror(0x0e).rw(I8251_TAG, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x21, 0x21).mirror(0x0e).rw(I8251_TAG, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x20, 0x21).mirror(0x0e).rw(I8251_TAG, FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x30, 0x30).mirror(0x0f).w(FUNC(pc8001_state::port30_w));
map(0x40, 0x40).mirror(0x0f).rw(FUNC(pc8001_state::port40_r), FUNC(pc8001_state::port40_w));
map(0x50, 0x51).rw(m_crtc, FUNC(upd3301_device::read), FUNC(upd3301_device::write));
diff --git a/src/mame/drivers/pc8401a.cpp b/src/mame/drivers/pc8401a.cpp
index c70d2d835dc..f0c70f598a9 100644
--- a/src/mame/drivers/pc8401a.cpp
+++ b/src/mame/drivers/pc8401a.cpp
@@ -361,8 +361,7 @@ void pc8401a_state::pc8500_io(address_map &map)
map(0x08, 0x08).portr("Y.8");
map(0x09, 0x09).portr("Y.9");
map(0x10, 0x10).w(FUNC(pc8401a_state::rtc_cmd_w));
- map(0x20, 0x20).rw(I8251_TAG, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x21, 0x21).rw(I8251_TAG, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x20, 0x21).rw(I8251_TAG, FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x30, 0x30).rw(FUNC(pc8401a_state::mmr_r), FUNC(pc8401a_state::mmr_w));
// AM_RANGE(0x31, 0x31)
map(0x40, 0x40).rw(FUNC(pc8401a_state::rtc_r), FUNC(pc8401a_state::rtc_ctrl_w));
diff --git a/src/mame/drivers/pc8801.cpp b/src/mame/drivers/pc8801.cpp
index b75c37bce6a..098301df216 100644
--- a/src/mame/drivers/pc8801.cpp
+++ b/src/mame/drivers/pc8801.cpp
@@ -1553,8 +1553,7 @@ void pc8801_state::pc8801_io(address_map &map)
map(0x0f, 0x0f).portr("KEY15");
map(0x00, 0x02).w(FUNC(pc8801_state::pc8801_pcg8100_w));
map(0x10, 0x10).w(FUNC(pc8801_state::pc8801_rtc_w));
- map(0x20, 0x20).mirror(0x0e).rw(I8251_TAG, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); /* RS-232C and CMT */
- map(0x21, 0x21).mirror(0x0e).rw(I8251_TAG, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x20, 0x21).mirror(0x0e).rw(I8251_TAG, FUNC(i8251_device::read), FUNC(i8251_device::write)); /* RS-232C and CMT */
map(0x30, 0x30).portr("DSW1").w(FUNC(pc8801_state::pc8801_txt_cmt_ctrl_w));
map(0x31, 0x31).portr("DSW2").w(FUNC(pc8801_state::pc8801_gfx_ctrl_w));
map(0x32, 0x32).rw(FUNC(pc8801_state::pc8801_misc_ctrl_r), FUNC(pc8801_state::pc8801_misc_ctrl_w));
diff --git a/src/mame/drivers/pc9801.cpp b/src/mame/drivers/pc9801.cpp
index f57ddeeb266..b49dbc553e7 100644
--- a/src/mame/drivers/pc9801.cpp
+++ b/src/mame/drivers/pc9801.cpp
@@ -675,8 +675,7 @@ void pc9801_state::pc9801_common_io(address_map &map)
map(0x0090, 0x0090).r(m_fdc_2hd, FUNC(upd765a_device::msr_r));
map(0x0092, 0x0092).rw(m_fdc_2hd, FUNC(upd765a_device::fifo_r), FUNC(upd765a_device::fifo_w));
map(0x0094, 0x0094).rw(FUNC(pc9801_state::fdc_2hd_ctrl_r), FUNC(pc9801_state::fdc_2hd_ctrl_w));
- map(0x0091, 0x0091).rw(m_sio, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x0093, 0x0093).rw(m_sio, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x0090, 0x0093).rw(m_sio, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0xff00);
map(0x7fd8, 0x7fdf).rw("ppi8255_mouse", FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0xff00);
}
diff --git a/src/mame/drivers/pcat_dyn.cpp b/src/mame/drivers/pcat_dyn.cpp
index 6aa0d303c17..72ff59519f0 100644
--- a/src/mame/drivers/pcat_dyn.cpp
+++ b/src/mame/drivers/pcat_dyn.cpp
@@ -33,8 +33,8 @@ If the output isn't satisfactory, it prints "I/O BOARD FAILURE".
#include "bus/isa/isa.h"
#include "bus/isa/sblaster.h"
#include "bus/isa/trident.h"
+#include "bus/rs232/hlemouse.h"
#include "bus/rs232/rs232.h"
-#include "bus/rs232/ser_mouse.h"
#include "screen.h"
@@ -145,7 +145,7 @@ INPUT_PORTS_END
static void pcat_dyn_com(device_slot_interface &device)
{
- device.option_add("msmouse", MSYSTEM_SERIAL_MOUSE);
+ device.option_add("msmouse", MSYSTEMS_HLE_SERIAL_MOUSE);
}
static void pcat_dyn_isa8_cards(device_slot_interface &device)
diff --git a/src/mame/drivers/pcipc.cpp b/src/mame/drivers/pcipc.cpp
index 32e17547c61..08669a9b8dd 100644
--- a/src/mame/drivers/pcipc.cpp
+++ b/src/mame/drivers/pcipc.cpp
@@ -26,10 +26,11 @@
#include "machine/i82371sb.h"
#include "video/mga2064w.h"
#include "bus/isa/isa_cards.h"
+#include "bus/rs232/hlemouse.h"
+#include "bus/rs232/null_modem.h"
#include "bus/rs232/rs232.h"
-#include "bus/rs232/ser_mouse.h"
+#include "bus/rs232/sun_kbd.h"
#include "bus/rs232/terminal.h"
-#include "bus/rs232/null_modem.h"
#include "machine/fdc37c93x.h"
class pcipc_state : public driver_device
@@ -50,6 +51,8 @@ public:
pcipc_state(const machine_config &mconfig, device_type type, const char *tag);
private:
+ void pcipc_map(address_map &map);
+ void pcipc_map_io(address_map &map);
DECLARE_WRITE8_MEMBER(boot_state_phoenix_w);
DECLARE_WRITE8_MEMBER(boot_state_phoenix_ver40_rev6_w);
DECLARE_WRITE8_MEMBER(boot_state_award_w);
@@ -479,10 +482,14 @@ static void isa_internal_devices(device_slot_interface &device)
static void isa_com(device_slot_interface &device)
{
- device.option_add("microsoft_mouse", MSFT_SERIAL_MOUSE);
- device.option_add("msystems_mouse", MSYSTEM_SERIAL_MOUSE);
+ device.option_add("microsoft_mouse", MSFT_HLE_SERIAL_MOUSE);
+ device.option_add("logitech_mouse", LOGITECH_HLE_SERIAL_MOUSE);
+ device.option_add("wheel_mouse", WHEEL_HLE_SERIAL_MOUSE);
+ device.option_add("msystems_mouse", MSYSTEMS_HLE_SERIAL_MOUSE);
+ device.option_add("rotatable_mouse", ROTATABLE_HLE_SERIAL_MOUSE);
device.option_add("terminal", SERIAL_TERMINAL);
device.option_add("null_modem", NULL_MODEM);
+ device.option_add("sun_kbd", SUN_KBD_ADAPTOR);
}
void pcipc_state::superio_config(device_t *device)
@@ -501,8 +508,20 @@ void pcipc_state::superio_config(device_t *device)
fdc.nrts2().set(":serport1", FUNC(rs232_port_device::write_rts));
}
+void pcipc_state::pcipc_map(address_map &map)
+{
+ map.unmap_value_high();
+}
+
+void pcipc_state::pcipc_map_io(address_map &map)
+{
+ map.unmap_value_high();
+}
+
MACHINE_CONFIG_START(pcipc_state::pcipc)
MCFG_DEVICE_ADD("maincpu", PENTIUM, 90000000)
+ MCFG_DEVICE_PROGRAM_MAP(pcipc_map)
+ MCFG_DEVICE_IO_MAP(pcipc_map_io)
MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("pci:07.0:pic8259_master", pic8259_device, inta_cb)
MCFG_I386_SMIACT(WRITELINE("pci:00.0", i82439hx_host_device, smi_act_w))
@@ -525,7 +544,7 @@ MACHINE_CONFIG_START(pcipc_state::pcipc)
MCFG_DEVICE_ADD("isa3", ISA16_SLOT, 0, "pci:07.0:isabus", pc_isa16_cards, nullptr, false)
MCFG_DEVICE_ADD("isa4", ISA16_SLOT, 0, "pci:07.0:isabus", pc_isa16_cards, nullptr, false)
MCFG_DEVICE_ADD("isa5", ISA16_SLOT, 0, "pci:07.0:isabus", pc_isa16_cards, nullptr, false)
- MCFG_DEVICE_ADD("serport0", RS232_PORT, isa_com, "microsoft_mouse")
+ MCFG_DEVICE_ADD("serport0", RS232_PORT, isa_com, "logitech_mouse")
MCFG_RS232_RXD_HANDLER(WRITELINE("board4:fdc37c93x", fdc37c93x_device, rxd1_w))
MCFG_RS232_DCD_HANDLER(WRITELINE("board4:fdc37c93x", fdc37c93x_device, ndcd1_w))
MCFG_RS232_DSR_HANDLER(WRITELINE("board4:fdc37c93x", fdc37c93x_device, ndsr1_w))
diff --git a/src/mame/drivers/pcw16.cpp b/src/mame/drivers/pcw16.cpp
index 822c9dfb5e6..9c6e8b6accf 100644
--- a/src/mame/drivers/pcw16.cpp
+++ b/src/mame/drivers/pcw16.cpp
@@ -91,8 +91,8 @@ TODO:
#include "emu.h"
#include "includes/pcw16.h"
+#include "bus/rs232/hlemouse.h"
#include "bus/rs232/rs232.h"
-#include "bus/rs232/ser_mouse.h"
#include "screen.h"
#include "softlist.h"
#include "speaker.h"
@@ -1007,7 +1007,7 @@ INPUT_PORTS_END
static void pcw16_com(device_slot_interface &device)
{
- device.option_add("msystems_mouse", MSYSTEM_SERIAL_MOUSE);
+ device.option_add("msystems_mouse", MSYSTEMS_HLE_SERIAL_MOUSE);
}
MACHINE_CONFIG_START(pcw16_state::pcw16)
diff --git a/src/mame/drivers/peoplepc.cpp b/src/mame/drivers/peoplepc.cpp
index 9d45727b24e..565fa2c21c3 100644
--- a/src/mame/drivers/peoplepc.cpp
+++ b/src/mame/drivers/peoplepc.cpp
@@ -212,10 +212,8 @@ void peoplepc_state::peoplepc_io(address_map &map)
map(0x0020, 0x0031).rw(m_dmac, FUNC(i8257_device::read), FUNC(i8257_device::write)).umask16(0x00ff);
map(0x0040, 0x0047).rw("ppi8255", FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0x00ff);
map(0x0048, 0x004f).rw("pit8253", FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0x00ff);
- map(0x0054, 0x0054).rw(m_8251key, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x0056, 0x0056).rw(m_8251key, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0x005c, 0x005c).rw(m_8251ser, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x005e, 0x005e).rw(m_8251ser, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x0054, 0x0057).rw(m_8251key, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
+ map(0x005c, 0x005f).rw(m_8251ser, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
map(0x0064, 0x0067).m(m_fdc, FUNC(upd765a_device::map)).umask16(0x00ff);
map(0x006c, 0x006c).w("h46505", FUNC(mc6845_device::address_w));
map(0x006e, 0x006e).rw("h46505", FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w));
diff --git a/src/mame/drivers/pg685.cpp b/src/mame/drivers/pg685.cpp
index 60a6f89e2ad..177fadb2ca4 100644
--- a/src/mame/drivers/pg685.cpp
+++ b/src/mame/drivers/pg685.cpp
@@ -167,14 +167,12 @@ void pg685_state::pg675_mem(address_map &map)
map(0xf9f03, 0xf9f03).rw("crtc", FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w));
map(0xf9f04, 0xf9f04).rw(FUNC(pg685_state::f9f04_r), FUNC(pg685_state::f9f04_w));
map(0xf9f06, 0xf9f07).rw("mainpic", FUNC(pic8259_device::read), FUNC(pic8259_device::write));
- map(0xf9f08, 0xf9f08).rw("mainuart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xf9f09, 0xf9f09).rw("mainuart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xf9f08, 0xf9f09).rw("mainuart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0xf9f20, 0xf9f23).rw(m_fdc, FUNC(fd1797_device::read), FUNC(fd1797_device::write));
map(0xf9f24, 0xf9f24).rw(FUNC(pg685_state::f9f24_r), FUNC(pg685_state::f9f24_w));
map(0xf9f28, 0xf9f2b).rw("modppi1", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0xf9f2c, 0xf9f2f).rw("modppi2", FUNC(i8255_device::read), FUNC(i8255_device::write));
- map(0xf9f30, 0xf9f30).rw("moduart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xf9f31, 0xf9f31).rw("moduart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xf9f30, 0xf9f31).rw("moduart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0xf9f32, 0xf9f32).w(FUNC(pg685_state::f9f32_w));
map(0xf9f33, 0xf9f33).r(FUNC(pg685_state::f9f33_r));
map(0xf9f40, 0xf9f5f).rw("rtc", FUNC(mm58167_device::read), FUNC(mm58167_device::write));
@@ -205,14 +203,12 @@ void pg685_state::pg685oua12_mem(address_map &map)
map(0xf9f00, 0xf9f01).rw("kbdc", FUNC(i8279_device::read), FUNC(i8279_device::write));
map(0xf9f04, 0xf9f04).rw(FUNC(pg685_state::f9f04_r), FUNC(pg685_state::f9f04_w));
map(0xf9f06, 0xf9f07).rw("mainpic", FUNC(pic8259_device::read), FUNC(pic8259_device::write));
- map(0xf9f08, 0xf9f08).rw("mainuart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xf9f09, 0xf9f09).rw("mainuart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xf9f08, 0xf9f09).rw("mainuart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0xf9f20, 0xf9f23).rw(m_fdc, FUNC(fd1797_device::read), FUNC(fd1797_device::write));
map(0xf9f24, 0xf9f24).rw(FUNC(pg685_state::f9f24_r), FUNC(pg685_state::f9f24_w));
map(0xf9f28, 0xf9f2b).rw("modppi1", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0xf9f2c, 0xf9f2f).rw("modppi2", FUNC(i8255_device::read), FUNC(i8255_device::write));
- map(0xf9f30, 0xf9f30).rw("moduart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xf9f31, 0xf9f31).rw("moduart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xf9f30, 0xf9f31).rw("moduart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0xf9f32, 0xf9f32).w(FUNC(pg685_state::f9f32_w));
map(0xf9f33, 0xf9f33).r(FUNC(pg685_state::f9f33_r));
map(0xf9f34, 0xf9f37).rw("bppit", FUNC(pit8253_device::read), FUNC(pit8253_device::write));
diff --git a/src/mame/drivers/pimps.cpp b/src/mame/drivers/pimps.cpp
index b93bacbd965..e7d2cbf5918 100644
--- a/src/mame/drivers/pimps.cpp
+++ b/src/mame/drivers/pimps.cpp
@@ -103,10 +103,8 @@ void pimps_state::mem_map(address_map &map)
void pimps_state::io_map(address_map &map)
{
map.unmap_value_high();
- map(0xf0, 0xf0).rw("uart1", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xf1, 0xf1).rw("uart1", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0xf2, 0xf2).rw("uart2", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xf3, 0xf3).rw("uart2", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xf0, 0xf1).rw("uart1", FUNC(i8251_device::read), FUNC(i8251_device::write));
+ map(0xf2, 0xf3).rw("uart2", FUNC(i8251_device::read), FUNC(i8251_device::write));
}
/* Input ports */
diff --git a/src/mame/drivers/poly88.cpp b/src/mame/drivers/poly88.cpp
index 218b727a0e9..c6177449de5 100644
--- a/src/mame/drivers/poly88.cpp
+++ b/src/mame/drivers/poly88.cpp
@@ -65,8 +65,7 @@ void poly88_state::poly88_io(address_map &map)
{
map.unmap_value_high();
map.global_mask(0xff);
- map(0x00, 0x00).rw(m_uart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x01, 0x01).rw(m_uart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x00, 0x01).rw(m_uart, FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x04, 0x04).w(FUNC(poly88_state::poly88_baud_rate_w));
map(0x08, 0x08).w(FUNC(poly88_state::poly88_intr_w));
map(0xf8, 0xf8).r(FUNC(poly88_state::poly88_keyboard_r));
diff --git a/src/mame/drivers/pp01.cpp b/src/mame/drivers/pp01.cpp
index 1e0a6460d8b..3263cf7f740 100644
--- a/src/mame/drivers/pp01.cpp
+++ b/src/mame/drivers/pp01.cpp
@@ -40,8 +40,7 @@ void pp01_state::pp01_io(address_map &map)
{
map(0xc0, 0xc3).rw("ppi8255", FUNC(i8255_device::read), FUNC(i8255_device::write)); // system
//AM_RANGE(0xc4, 0xc7) AM_DEVREADWRITE("ppi8255", i8255_device, read, write) // user
- map(0xc8, 0xc8).mirror(2).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xc9, 0xc9).mirror(2).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xc8, 0xc9).mirror(2).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0xcc, 0xcf).w(FUNC(pp01_state::pp01_video_write_mode_w));
map(0xd0, 0xd3).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write));
map(0xe0, 0xef).mirror(0x10).rw(FUNC(pp01_state::pp01_mem_block_r), FUNC(pp01_state::pp01_mem_block_w));
diff --git a/src/mame/drivers/psx.cpp b/src/mame/drivers/psx.cpp
index 1d4260396d8..15f9e6f6adf 100644
--- a/src/mame/drivers/psx.cpp
+++ b/src/mame/drivers/psx.cpp
@@ -519,8 +519,8 @@ void psx1_state::subcpu_map(address_map &map)
MACHINE_CONFIG_START(psx1_state::psj)
/* basic machine hardware */
- MCFG_DEVICE_ADD( "maincpu", CXD8530CQ, XTAL(67'737'600) )
- MCFG_DEVICE_PROGRAM_MAP( psx_map )
+ CXD8530CQ(config, m_maincpu, XTAL(67'737'600));
+ m_maincpu->set_addrmap(AS_PROGRAM, &psx1_state::psx_map);
subdevice<ram_device>("maincpu:ram")->set_default_size("2M");
@@ -530,10 +530,10 @@ MACHINE_CONFIG_START(psx1_state::psj)
MCFG_PSX_CTRL_PORT_ADD("port1", psx_controllers, "digital_pad")
MCFG_PSX_CTRL_PORT_ADD("port2", psx_controllers, "digital_pad")
- MCFG_DEVICE_MODIFY("maincpu:sio0")
- MCFG_PSX_SIO_DTR_HANDLER(WRITELINE("controllers", psxcontrollerports_device, write_dtr))
- MCFG_PSX_SIO_SCK_HANDLER(WRITELINE("controllers", psxcontrollerports_device, write_sck))
- MCFG_PSX_SIO_TXD_HANDLER(WRITELINE("controllers", psxcontrollerports_device, write_txd))
+ auto &sio0(*m_maincpu->subdevice<psxsio0_device>("sio0"));
+ sio0.dtr_handler().set("controllers", FUNC(psxcontrollerports_device::write_dtr));
+ sio0.sck_handler().set("controllers", FUNC(psxcontrollerports_device::write_sck));
+ sio0.txd_handler().set("controllers", FUNC(psxcontrollerports_device::write_txd));
/* video hardware */
MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8561Q, 0x100000, XTAL(53'693'175) )
@@ -572,8 +572,8 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(psx1_state::pse)
/* basic machine hardware */
- MCFG_DEVICE_ADD( "maincpu", CXD8530AQ, XTAL(67'737'600) )
- MCFG_DEVICE_PROGRAM_MAP( psx_map)
+ CXD8530AQ(config, m_maincpu, XTAL(67'737'600));
+ m_maincpu->set_addrmap(AS_PROGRAM, &psx1_state::psx_map);
subdevice<ram_device>("maincpu:ram")->set_default_size("2M");
@@ -583,10 +583,10 @@ MACHINE_CONFIG_START(psx1_state::pse)
MCFG_PSX_CTRL_PORT_ADD("port1", psx_controllers, "digital_pad")
MCFG_PSX_CTRL_PORT_ADD("port2", psx_controllers, "digital_pad")
- MCFG_DEVICE_MODIFY("maincpu:sio0")
- MCFG_PSX_SIO_DTR_HANDLER(WRITELINE("controllers", psxcontrollerports_device, write_dtr))
- MCFG_PSX_SIO_SCK_HANDLER(WRITELINE("controllers", psxcontrollerports_device, write_sck))
- MCFG_PSX_SIO_TXD_HANDLER(WRITELINE("controllers", psxcontrollerports_device, write_txd))
+ auto &sio0(*m_maincpu->subdevice<psxsio0_device>("sio0"));
+ sio0.dtr_handler().set("controllers", FUNC(psxcontrollerports_device::write_dtr));
+ sio0.sck_handler().set("controllers", FUNC(psxcontrollerports_device::write_sck));
+ sio0.txd_handler().set("controllers", FUNC(psxcontrollerports_device::write_txd));
/* video hardware */
/* TODO: visible area and refresh rate */
diff --git a/src/mame/drivers/pwrview.cpp b/src/mame/drivers/pwrview.cpp
index 98b580297d6..0e66b61a15e 100644
--- a/src/mame/drivers/pwrview.cpp
+++ b/src/mame/drivers/pwrview.cpp
@@ -392,8 +392,7 @@ void pwrview_state::pwrview_io(address_map &map)
map(0xc280, 0xc287).rw(FUNC(pwrview_state::unk3_r), FUNC(pwrview_state::unk3_w)).umask16(0x00ff);
map(0xc288, 0xc28f).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0x00ff);
map(0xc2a0, 0xc2a7).rw("sio", FUNC(z80sio2_device::cd_ba_r), FUNC(z80sio2_device::cd_ba_w)).umask16(0x00ff);
- map(0xc2c0, 0xc2c0).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xc2c2, 0xc2c2).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xc2c0, 0xc2c3).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
map(0xc2e0, 0xc2e3).m("fdc", FUNC(upd765a_device::map)).umask16(0x00ff);
map(0xc2e4, 0xc2e5).ram();
map(0xc2e6, 0xc2e6).r(FUNC(pwrview_state::pitclock_r));
diff --git a/src/mame/drivers/px8.cpp b/src/mame/drivers/px8.cpp
index 4f13ddcefec..af96e8c3c7a 100644
--- a/src/mame/drivers/px8.cpp
+++ b/src/mame/drivers/px8.cpp
@@ -527,8 +527,7 @@ void px8_state::px8_io(address_map &map)
map.unmap_value_high();
map.global_mask(0x0f);
map(0x00, 0x07).rw(FUNC(px8_state::gah40m_r), FUNC(px8_state::gah40m_w));
- map(0x0c, 0x0c).rw(I8251_TAG, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x0d, 0x0d).rw(I8251_TAG, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x0c, 0x0d).rw(I8251_TAG, FUNC(i8251_device::read), FUNC(i8251_device::write));
// AM_RANGE(0x0e, 0x0e) AM_DEVREADWRITE(SED1320_TAG, sed1330_device, status_r, data_w)
// AM_RANGE(0x0f, 0x0f) AM_DEVREADWRITE(SED1320_TAG, sed1330_device, data_r, command_w)
}
diff --git a/src/mame/drivers/qtsbc.cpp b/src/mame/drivers/qtsbc.cpp
index 7bdc8061e12..6e4ca0e4688 100644
--- a/src/mame/drivers/qtsbc.cpp
+++ b/src/mame/drivers/qtsbc.cpp
@@ -150,10 +150,8 @@ READ8_MEMBER(qtsbc_state::io_r)
return 0xff;
case 6:
- return m_usart->data_r(space, 0);
-
case 7:
- return m_usart->status_r(space, 0);
+ return m_usart->read(offset & 1);
}
}
else
@@ -192,11 +190,8 @@ WRITE8_MEMBER(qtsbc_state::io_w)
break;
case 6:
- m_usart->data_w(space, 0, data);
- break;
-
case 7:
- m_usart->control_w(space, 0, data);
+ m_usart->write(offset & 1, data);
break;
}
}
diff --git a/src/mame/drivers/rainbow.cpp b/src/mame/drivers/rainbow.cpp
index 83918c57854..37bcfef0172 100644
--- a/src/mame/drivers/rainbow.cpp
+++ b/src/mame/drivers/rainbow.cpp
@@ -356,8 +356,8 @@ W17 pulls J1 serial port pin 1 to GND when set (chassis to logical GND).
#include "bus/rs232/rs232.h"
#include "imagedev/bitbngr.h"
#include "machine/com8116.h"
+#include "bus/rs232/hlemouse.h"
#include "bus/rs232/terminal.h"
-#include "bus/rs232/ser_mouse.h"
#include "machine/i8251.h"
#include "machine/dec_lk201.h"
@@ -957,8 +957,7 @@ void rainbow_state::rainbow8088_io(address_map &map)
map(0x0e, 0x0e).w(FUNC(rainbow_state::printer_bitrate_w));
- map(0x10, 0x10).rw(m_kbd8251, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x11, 0x11).rw(m_kbd8251, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x10, 0x11).rw(m_kbd8251, FUNC(i8251_device::read), FUNC(i8251_device::write));
// ===========================================================
// There are 4 select lines for Option Select 1 to 4
@@ -3327,9 +3326,10 @@ MACHINE_CONFIG_START(rainbow_state::rainbow)
MCFG_RS232_DCD_HANDLER(WRITELINE(m_mpsc, upd7201_new_device, ctsb_w)) // actually DTR
MCFG_DEVICE_MODIFY("comm")
- MCFG_SLOT_OPTION_ADD("microsoft_mouse", MSFT_SERIAL_MOUSE)
- MCFG_SLOT_OPTION_ADD("mouse_systems_mouse", MSYSTEM_SERIAL_MOUSE)
- MCFG_SLOT_DEFAULT_OPTION("microsoft_mouse")
+ MCFG_SLOT_OPTION_ADD("microsoft_mouse", MSFT_HLE_SERIAL_MOUSE)
+ MCFG_SLOT_OPTION_ADD("logitech_mouse", LOGITECH_HLE_SERIAL_MOUSE)
+ MCFG_SLOT_OPTION_ADD("msystems_mouse", MSYSTEMS_HLE_SERIAL_MOUSE)
+ MCFG_SLOT_DEFAULT_OPTION("logitech_mouse")
MCFG_DEVICE_MODIFY("printer")
MCFG_SLOT_DEFAULT_OPTION("printer")
diff --git a/src/mame/drivers/sage2.cpp b/src/mame/drivers/sage2.cpp
index 02962af2659..b3a7ddd1eb6 100644
--- a/src/mame/drivers/sage2.cpp
+++ b/src/mame/drivers/sage2.cpp
@@ -42,13 +42,11 @@ void sage2_state::sage2_mem(address_map &map)
map(0xffc000, 0xffc007).rw(I8253_1_TAG, FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0x00ff);
map(0xffc010, 0xffc01f).noprw(); //AM_DEVREADWRITE8(TMS9914_TAG, tms9914_device, read, write, 0x00ff)
map(0xffc020, 0xffc027).rw(I8255A_0_TAG, FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0x00ff); // i8255, DIPs + Floppy ctrl port
- map(0xffc031, 0xffc031).rw(m_usart1, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xffc033, 0xffc033).rw(m_usart1, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xffc030, 0xffc033).rw(m_usart1, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
map(0xffc040, 0xffc043).rw(m_pic, FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff);
map(0xffc050, 0xffc053).m(m_fdc, FUNC(upd765a_device::map)).umask16(0x00ff);
map(0xffc060, 0xffc067).rw(I8255A_1_TAG, FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0x00ff); // i8255, Printer
- map(0xffc071, 0xffc071).rw(m_usart0, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xffc073, 0xffc073).rw(m_usart0, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xffc070, 0xffc073).rw(m_usart0, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
map(0xffc080, 0xffc087).mirror(0x78).rw(I8253_0_TAG, FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0x00ff);
// AM_RANGE(0xffc400, 0xffc407) AM_DEVREADWRITE8(S2651_0_TAG, s2651_device, read, write, 0x00ff)
// AM_RANGE(0xffc440, 0xffc447) AM_DEVREADWRITE8(S2651_1_TAG, s2651_device, read, write, 0x00ff)
diff --git a/src/mame/drivers/sbrain.cpp b/src/mame/drivers/sbrain.cpp
index fc1b7caa0ff..8b088a092d1 100644
--- a/src/mame/drivers/sbrain.cpp
+++ b/src/mame/drivers/sbrain.cpp
@@ -138,12 +138,10 @@ void sbrain_state::sbrain_mem(address_map &map)
void sbrain_state::sbrain_io(address_map &map)
{
map.global_mask(0xff);
- map(0x40, 0x40).mirror(6).rw(m_u0, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x41, 0x41).mirror(6).rw(m_u0, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x40, 0x41).mirror(6).rw(m_u0, FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x48, 0x4f).r(FUNC(sbrain_state::port48_r)); //chr_int_latch
map(0x50, 0x57).r(FUNC(sbrain_state::port50_r));
- map(0x58, 0x58).mirror(6).rw(m_u1, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x59, 0x59).mirror(6).rw(m_u1, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x58, 0x59).mirror(6).rw(m_u1, FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x60, 0x60).mirror(7).w("brg", FUNC(com8116_device::stt_str_w));
map(0x68, 0x6b).mirror(4).rw(m_ppi, FUNC(i8255_device::read), FUNC(i8255_device::write));
}
diff --git a/src/mame/drivers/scopus.cpp b/src/mame/drivers/scopus.cpp
index 8f0d45ed5ea..1228aa52d88 100644
--- a/src/mame/drivers/scopus.cpp
+++ b/src/mame/drivers/scopus.cpp
@@ -133,8 +133,7 @@ void sagitta180_state::maincpu_map(address_map &map)
void sagitta180_state::maincpu_io_map(address_map &map)
{
map(0x00, 0x00).portr("DSW");
- map(0x20, 0x20).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x21, 0x21).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x20, 0x21).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x30, 0x31).rw(m_crtc, FUNC(i8275_device::read), FUNC(i8275_device::write));
map(0x40, 0x48).rw(m_dma8257, FUNC(i8257_device::read), FUNC(i8257_device::write));
}
diff --git a/src/mame/drivers/sdk80.cpp b/src/mame/drivers/sdk80.cpp
index ebdc7cd6a2d..1a3be1c2c6f 100644
--- a/src/mame/drivers/sdk80.cpp
+++ b/src/mame/drivers/sdk80.cpp
@@ -83,8 +83,7 @@ void sdk80_state::sdk80_io(address_map &map)
map.global_mask(0xff);
map(0xec, 0xef).rw(m_ppi_1, FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0xf4, 0xf7).rw(m_ppi_0, FUNC(i8255_device::read), FUNC(i8255_device::write));
- map(0xfa, 0xfa).rw(m_usart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xfb, 0xfb).rw(m_usart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xfa, 0xfb).rw(m_usart, FUNC(i8251_device::read), FUNC(i8251_device::write));
}
static INPUT_PORTS_START( sdk80 )
diff --git a/src/mame/drivers/sdk86.cpp b/src/mame/drivers/sdk86.cpp
index 7bec26e7c31..bec2b643446 100644
--- a/src/mame/drivers/sdk86.cpp
+++ b/src/mame/drivers/sdk86.cpp
@@ -73,8 +73,7 @@ void sdk86_state::sdk86_mem(address_map &map)
void sdk86_state::sdk86_io(address_map &map)
{
map.unmap_value_high();
- map(0xfff0, 0xfff0).mirror(4).rw(I8251_TAG, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xfff2, 0xfff2).mirror(4).rw(I8251_TAG, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xfff0, 0xfff3).mirror(4).rw(I8251_TAG, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
map(0xffe8, 0xffeb).mirror(4).rw("i8279", FUNC(i8279_device::read), FUNC(i8279_device::write)).umask16(0x00ff);
map(0xfff8, 0xffff).rw("port1", FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0xff00);
map(0xfff8, 0xffff).rw("port2", FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0x00ff);
diff --git a/src/mame/drivers/seattlecmp.cpp b/src/mame/drivers/seattlecmp.cpp
index 0d9a1745a07..eaedcf1ab3f 100644
--- a/src/mame/drivers/seattlecmp.cpp
+++ b/src/mame/drivers/seattlecmp.cpp
@@ -83,8 +83,7 @@ void seattle_comp_state::io_map(address_map &map)
map(0xf0, 0xf1).rw("pic1", FUNC(pic8259_device::read), FUNC(pic8259_device::write));
map(0xf2, 0xf3).rw("pic2", FUNC(pic8259_device::read), FUNC(pic8259_device::write));
map(0xf4, 0xf5).rw("stc", FUNC(am9513_device::read8), FUNC(am9513_device::write8));
- map(0xf6, 0xf6).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xf7, 0xf7).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xf6, 0xf7).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write));
//AM_RANGE(0xfc, 0xfd) Parallel data, status, serial DCD
//AM_RANGE(0xfe, 0xff) Eprom disable bit, read sense switches (bank of 8 dipswitches)
}
diff --git a/src/mame/drivers/segam1.cpp b/src/mame/drivers/segam1.cpp
index 6894a9183ae..944e974b39d 100644
--- a/src/mame/drivers/segam1.cpp
+++ b/src/mame/drivers/segam1.cpp
@@ -235,8 +235,7 @@ void segam1_state::segam1_comms_map(address_map &map)
map(0x0000, 0x7fff).rom();
map(0x8000, 0x9fff).ram();
map(0xa000, 0xa7ff).rw("dpram", FUNC(mb8421_device::left_r), FUNC(mb8421_device::left_w));
- map(0xc000, 0xc000).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xc001, 0xc001).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xc000, 0xc001).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0xe003, 0xe003).nopw(); // ???
}
diff --git a/src/mame/drivers/seibucats.cpp b/src/mame/drivers/seibucats.cpp
index 7e29e907ea1..45d9018dacf 100644
--- a/src/mame/drivers/seibucats.cpp
+++ b/src/mame/drivers/seibucats.cpp
@@ -184,10 +184,8 @@ void seibucats_state::seibucats_map(address_map &map)
map(0x01200000, 0x01200007).rw("ymz", FUNC(ymz280b_device::read), FUNC(ymz280b_device::write)).umask32(0x000000ff);
map(0x01200100, 0x01200107).nopw(); // YMF721-S MIDI data
map(0x01200104, 0x01200107).nopr(); // YMF721-S MIDI status
- map(0x01200200, 0x01200200).rw("usart1", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x01200204, 0x01200204).rw("usart1", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0x01200300, 0x01200300).rw("usart2", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x01200304, 0x01200304).rw("usart2", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x01200200, 0x01200207).rw("usart1", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask32(0x000000ff);
+ map(0x01200300, 0x01200307).rw("usart2", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask32(0x000000ff);
map(0xa0000000, 0xa1ffffff).noprw(); // NVRAM on ROM board
map(0xa2000000, 0xa2000001).w(FUNC(seibucats_state::aux_rtc_w));
map(0xffe00000, 0xffffffff).rom().region("ipl", 0);
diff --git a/src/mame/drivers/selz80.cpp b/src/mame/drivers/selz80.cpp
index ef9388a11e5..ca1ac40da97 100644
--- a/src/mame/drivers/selz80.cpp
+++ b/src/mame/drivers/selz80.cpp
@@ -95,8 +95,7 @@ void selz80_state::selz80_io(address_map &map)
map.unmap_value_high();
map.global_mask(0xff);
map(0x00, 0x01).rw("i8279", FUNC(i8279_device::read), FUNC(i8279_device::write));
- map(0x18, 0x18).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x19, 0x19).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x18, 0x19).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write));
}
/* Input ports */
diff --git a/src/mame/drivers/sg1000.cpp b/src/mame/drivers/sg1000.cpp
index 5b4b29f1c78..d7a5a34579e 100644
--- a/src/mame/drivers/sg1000.cpp
+++ b/src/mame/drivers/sg1000.cpp
@@ -228,8 +228,7 @@ void sf7000_state::sf7000_io_map(address_map &map)
map(0xdc, 0xdf).rw(FUNC(sf7000_state::peripheral_r), FUNC(sf7000_state::peripheral_w));
map(0xe0, 0xe1).m(m_fdc, FUNC(upd765a_device::map));
map(0xe4, 0xe7).rw(UPD9255_1_TAG, FUNC(i8255_device::read), FUNC(i8255_device::write));
- map(0xe8, 0xe8).rw(UPD8251_TAG, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xe9, 0xe9).rw(UPD8251_TAG, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xe8, 0xe9).rw(UPD8251_TAG, FUNC(i8251_device::read), FUNC(i8251_device::write));
}
/***************************************************************************
diff --git a/src/mame/drivers/sm1800.cpp b/src/mame/drivers/sm1800.cpp
index b56ae565924..6d8cc7187d6 100644
--- a/src/mame/drivers/sm1800.cpp
+++ b/src/mame/drivers/sm1800.cpp
@@ -71,8 +71,7 @@ void sm1800_state::sm1800_io(address_map &map)
map.global_mask(0xff);
map.unmap_value_high();
map(0x3c, 0x3d).rw(m_crtc, FUNC(i8275_device::read), FUNC(i8275_device::write));
- map(0x5c, 0x5c).rw(m_uart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x5d, 0x5d).rw(m_uart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x5c, 0x5d).rw(m_uart, FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x6c, 0x6f).rw(m_ppi, FUNC(i8255_device::read), FUNC(i8255_device::write));
//AM_RANGE( 0x74, 0x74 ) AM_DEVREADWRITE("i8279", i8279_device, status_r, cmd_w)
//AM_RANGE( 0x75, 0x75 ) AM_DEVREADWRITE("i8279", i8279_device, data_r, data_w)
diff --git a/src/mame/drivers/sm7238.cpp b/src/mame/drivers/sm7238.cpp
index 42865b42358..1a1c26dafda 100644
--- a/src/mame/drivers/sm7238.cpp
+++ b/src/mame/drivers/sm7238.cpp
@@ -150,16 +150,13 @@ void sm7238_state::sm7238_io(address_map &map)
{
map.unmap_value_high();
// AM_RANGE (0x40, 0x4f) AM_RAM // LUT
- map(0xa0, 0xa0).rw(m_i8251line, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xa1, 0xa1).rw(m_i8251line, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0xa4, 0xa4).rw(m_i8251kbd, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xa5, 0xa5).rw(m_i8251kbd, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xa0, 0xa1).rw(m_i8251line, FUNC(i8251_device::read), FUNC(i8251_device::write));
+ map(0xa4, 0xa5).rw(m_i8251kbd, FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0xa8, 0xab).rw(m_t_color, FUNC(pit8253_device::read), FUNC(pit8253_device::write));
map(0xac, 0xad).rw(m_pic8259, FUNC(pic8259_device::read), FUNC(pic8259_device::write));
map(0xb0, 0xb3).rw(m_t_hblank, FUNC(pit8253_device::read), FUNC(pit8253_device::write));
map(0xb4, 0xb7).rw(m_t_vblank, FUNC(pit8253_device::read), FUNC(pit8253_device::write));
- map(0xb8, 0xb8).rw(m_i8251prn, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xb9, 0xb9).rw(m_i8251prn, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xb8, 0xb9).rw(m_i8251prn, FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0xbc, 0xbf).rw(m_t_iface, FUNC(pit8253_device::read), FUNC(pit8253_device::write));
}
diff --git a/src/mame/drivers/softbox.cpp b/src/mame/drivers/softbox.cpp
index dcb1c435812..7ec99a421fe 100644
--- a/src/mame/drivers/softbox.cpp
+++ b/src/mame/drivers/softbox.cpp
@@ -126,8 +126,7 @@ void softbox_state::softbox_mem(address_map &map)
void softbox_state::softbox_io(address_map &map)
{
map.global_mask(0xff);
- map(0x08, 0x08).rw(I8251_TAG, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x09, 0x09).rw(I8251_TAG, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x08, 0x09).rw(I8251_TAG, FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x0c, 0x0c).w(COM8116_TAG, FUNC(com8116_device::stt_str_w));
map(0x10, 0x13).rw(I8255_0_TAG, FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0x14, 0x17).rw(I8255_1_TAG, FUNC(i8255_device::read), FUNC(i8255_device::write));
diff --git a/src/mame/drivers/sun3.cpp b/src/mame/drivers/sun3.cpp
index 76f36d39ee0..0e51c328214 100644
--- a/src/mame/drivers/sun3.cpp
+++ b/src/mame/drivers/sun3.cpp
@@ -187,9 +187,14 @@ fefc34a - start of mem_size, which queries ECC registers for each memory board
#include "machine/timekpr.h"
#include "machine/timer.h"
#include "machine/z80scc.h"
+#include "machine/am79c90.h"
+#include "machine/ncr5380n.h"
+#include "machine/nscsi_cd.h"
+#include "machine/nscsi_hd.h"
#include "bus/rs232/rs232.h"
#include "bus/sunkbd/sunkbd.h"
+#include "bus/sunmouse/sunmouse.h"
#include "screen.h"
@@ -200,6 +205,7 @@ fefc34a - start of mem_size, which queries ECC registers for each memory board
#define RS232A_TAG "rs232a"
#define RS232B_TAG "rs232b"
#define KEYBOARD_TAG "keyboard"
+#define MOUSE_TAG "mouseport"
// page table entry constants
#define PM_VALID (0x80000000) // page is valid
@@ -225,6 +231,8 @@ public:
m_maincpu(*this, "maincpu"),
m_scc1(*this, SCC1_TAG),
m_scc2(*this, SCC2_TAG),
+ m_scsibus(*this, "scsibus"),
+ m_scsi(*this, "scsibus:7:ncr5380"),
m_p_ram(*this, "p_ram"),
m_bw2_vram(*this, "bw2_vram"),
m_type0space(*this, "type0"),
@@ -233,7 +241,8 @@ public:
m_type3space(*this, "type3"),
m_rom(*this, "user1"),
m_idprom(*this, "idprom"),
- m_ram(*this, RAM_TAG)
+ m_ram(*this, RAM_TAG),
+ m_lance(*this, "lance")
{ }
void sun3(machine_config &config);
@@ -242,10 +251,15 @@ public:
void sun3200(machine_config &config);
void sun3_50(machine_config &config);
+ void ncr5380(device_t *device);
+
private:
required_device<m68020_device> m_maincpu;
required_device<z80scc_device> m_scc1;
required_device<z80scc_device> m_scc2;
+ required_device<nscsi_bus_device> m_scsibus;
+ required_device<ncr5380n_device> m_scsi;
+
virtual void machine_start() override;
virtual void machine_reset() override;
@@ -254,6 +268,7 @@ private:
optional_device<address_map_bank_device> m_type0space, m_type1space, m_type2space, m_type3space;
required_memory_region m_rom, m_idprom;
required_device<ram_device> m_ram;
+ required_device<am79c90_device> m_lance;
DECLARE_READ32_MEMBER( tl_mmu_r );
DECLARE_WRITE32_MEMBER( tl_mmu_w );
@@ -295,6 +310,27 @@ private:
uint32_t m_cache_tags[0x4000], m_cache_data[0x4000];
};
+static void sun_cdrom(device_t *device)
+{
+ downcast<nscsi_cdrom_device &>(*device).set_block_size(512);
+}
+
+void sun3_state::ncr5380(device_t *device)
+{
+ devcb_base *devcb;
+ (void)devcb;
+ MCFG_DEVICE_CLOCK(10000000)
+// MCFG_NCR5380N_DRQ_HANDLER(WRITELINE(*this, sun3_state, drq_w))
+}
+
+static void scsi_devices(device_slot_interface &device)
+{
+ device.option_add("cdrom", NSCSI_CDROM);
+ device.option_add("harddisk", NSCSI_HARDDISK);
+ device.option_add_internal("ncr5380", NCR5380N);
+ device.set_option_machine_config("cdrom", sun_cdrom);
+}
+
READ32_MEMBER( sun3_state::ram_r )
{
if (m_ecc[0] == 0x10c00000)
@@ -750,6 +786,8 @@ void sun3_state::vmetype1space_map(address_map &map)
map(0x00080000, 0x0008000f).rw(FUNC(sun3_state::parity_r), FUNC(sun3_state::parity_w));
map(0x000a0000, 0x000a0003).rw(FUNC(sun3_state::irqctrl_r), FUNC(sun3_state::irqctrl_w));
map(0x00100000, 0x0010ffff).rom().region("user1", 0);
+ map(0x00120000, 0x00120003).rw(m_lance, FUNC(am79c90_device::regs_r), FUNC(am79c90_device::regs_w));
+ map(0x00140000, 0x00140007).rw(m_scsi, FUNC(ncr5380n_device::read), FUNC(ncr5380n_device::write)).umask32(0xffffffff);
map(0x001e0000, 0x001e00ff).rw(FUNC(sun3_state::ecc_r), FUNC(sun3_state::ecc_w));
}
@@ -1001,9 +1039,12 @@ MACHINE_CONFIG_START(sun3_state::sun3)
SCC8530N(config, m_scc1, 4.9152_MHz_XTAL);
m_scc1->out_txda_callback().set(KEYBOARD_TAG, FUNC(sun_keyboard_port_device::write_txd));
+ m_scc1->out_txdb_callback().set(MOUSE_TAG, FUNC(sun_mouse_port_device::write_txd));
SUNKBD_PORT(config, KEYBOARD_TAG, default_sun_keyboard_devices, "type3hle").rxd_handler().set(m_scc1, FUNC(z80scc_device::rxa_w));
+ SUNMOUSE_PORT(config, MOUSE_TAG, default_sun_mouse_devices, "hle1200").rxd_handler().set(m_scc1, FUNC(z80scc_device::rxb_w));
+
SCC8530N(config, m_scc2, 4.9152_MHz_XTAL);
m_scc2->out_txda_callback().set(RS232A_TAG, FUNC(rs232_port_device::write_txd));
m_scc2->out_txdb_callback().set(RS232B_TAG, FUNC(rs232_port_device::write_txd));
@@ -1017,6 +1058,19 @@ MACHINE_CONFIG_START(sun3_state::sun3)
MCFG_RS232_RXD_HANDLER(WRITELINE(m_scc2, z80scc_device, rxb_w))
MCFG_RS232_DCD_HANDLER(WRITELINE(m_scc2, z80scc_device, dcdb_w))
MCFG_RS232_CTS_HANDLER(WRITELINE(m_scc2, z80scc_device, ctsb_w))
+
+ AM79C90(config, m_lance, 10'000'000); // clock is a guess
+
+ MCFG_NSCSI_BUS_ADD("scsibus")
+ MCFG_NSCSI_ADD("scsibus:0", scsi_devices, nullptr, false)
+ MCFG_NSCSI_ADD("scsibus:1", scsi_devices, "harddisk", false)
+ MCFG_NSCSI_ADD("scsibus:2", scsi_devices, nullptr, false)
+ MCFG_NSCSI_ADD("scsibus:3", scsi_devices, nullptr, false)
+ MCFG_NSCSI_ADD("scsibus:4", scsi_devices, nullptr, false)
+ MCFG_NSCSI_ADD("scsibus:5", scsi_devices, nullptr, false)
+ MCFG_NSCSI_ADD("scsibus:6", scsi_devices, "cdrom", false)
+ MCFG_NSCSI_ADD("scsibus:7", scsi_devices, "ncr5380", true)
+ MCFG_SLOT_OPTION_MACHINE_CONFIG("ncr5380", [this] (device_t *device) { ncr5380(device); })
MACHINE_CONFIG_END
// Sun 3/60
@@ -1035,6 +1089,7 @@ MACHINE_CONFIG_END
// Sun 3/E
MACHINE_CONFIG_START(sun3_state::sun3e)
sun3(config);
+
MCFG_DEVICE_REPLACE("maincpu", M68020, 20000000)
MCFG_DEVICE_PROGRAM_MAP(sun3_mem)
MACHINE_CONFIG_END
@@ -1059,6 +1114,8 @@ MACHINE_CONFIG_START(sun3_state::sun3_50)
MCFG_DEVICE_ADD("maincpu", M68020, 15700000)
MCFG_DEVICE_PROGRAM_MAP(sun3_mem)
+ AM79C90(config, m_lance, 10'000'000); // clock is a guess
+
MCFG_SCREEN_ADD("bwtwo", RASTER)
MCFG_SCREEN_UPDATE_DRIVER(sun3_state, bw2_350_update)
MCFG_SCREEN_SIZE(1600,1100)
@@ -1085,9 +1142,12 @@ MACHINE_CONFIG_START(sun3_state::sun3_50)
SCC8530N(config, m_scc1, 4.9152_MHz_XTAL);
m_scc1->out_txda_callback().set(KEYBOARD_TAG, FUNC(sun_keyboard_port_device::write_txd));
+ m_scc1->out_txdb_callback().set(MOUSE_TAG, FUNC(sun_mouse_port_device::write_txd));
SUNKBD_PORT(config, KEYBOARD_TAG, default_sun_keyboard_devices, "type3hle").rxd_handler().set(m_scc1, FUNC(z80scc_device::rxa_w));
+ SUNMOUSE_PORT(config, MOUSE_TAG, default_sun_mouse_devices, "hle1200").rxd_handler().set(m_scc1, FUNC(z80scc_device::rxb_w));
+
SCC8530N(config, m_scc2, 4.9152_MHz_XTAL);
m_scc2->out_txda_callback().set(RS232A_TAG, FUNC(rs232_port_device::write_txd));
m_scc2->out_txdb_callback().set(RS232B_TAG, FUNC(rs232_port_device::write_txd));
@@ -1101,6 +1161,17 @@ MACHINE_CONFIG_START(sun3_state::sun3_50)
MCFG_RS232_RXD_HANDLER(WRITELINE(m_scc2, z80scc_device, rxb_w))
MCFG_RS232_DCD_HANDLER(WRITELINE(m_scc2, z80scc_device, dcdb_w))
MCFG_RS232_CTS_HANDLER(WRITELINE(m_scc2, z80scc_device, ctsb_w))
+
+ MCFG_NSCSI_BUS_ADD("scsibus")
+ MCFG_NSCSI_ADD("scsibus:0", scsi_devices, nullptr, false)
+ MCFG_NSCSI_ADD("scsibus:1", scsi_devices, "harddisk", false)
+ MCFG_NSCSI_ADD("scsibus:2", scsi_devices, nullptr, false)
+ MCFG_NSCSI_ADD("scsibus:3", scsi_devices, nullptr, false)
+ MCFG_NSCSI_ADD("scsibus:4", scsi_devices, nullptr, false)
+ MCFG_NSCSI_ADD("scsibus:5", scsi_devices, nullptr, false)
+ MCFG_NSCSI_ADD("scsibus:6", scsi_devices, "cdrom", false)
+ MCFG_NSCSI_ADD("scsibus:7", scsi_devices, "ncr5380", true)
+ MCFG_SLOT_OPTION_MACHINE_CONFIG("ncr5380", [this] (device_t *device) { ncr5380(device); })
MACHINE_CONFIG_END
/* ROM definition */
diff --git a/src/mame/drivers/sun3x.cpp b/src/mame/drivers/sun3x.cpp
index 1607affc44a..f07021c3dc2 100644
--- a/src/mame/drivers/sun3x.cpp
+++ b/src/mame/drivers/sun3x.cpp
@@ -143,6 +143,7 @@
#include "bus/rs232/rs232.h"
#include "bus/sunkbd/sunkbd.h"
+#include "bus/sunmouse/sunmouse.h"
#include "screen.h"
@@ -156,6 +157,7 @@
#define RS232A_TAG "rs232a"
#define RS232B_TAG "rs232b"
#define KEYBOARD_TAG "keyboard"
+#define MOUSE_TAG "mouseport"
class sun3x_state : public driver_device
{
@@ -597,8 +599,10 @@ MACHINE_CONFIG_START(sun3x_state::sun3_80)
SCC8530N(config, m_scc1, 4.9152_MHz_XTAL);
m_scc1->out_txda_callback().set(KEYBOARD_TAG, FUNC(sun_keyboard_port_device::write_txd));
+ m_scc1->out_txdb_callback().set(MOUSE_TAG, FUNC(sun_mouse_port_device::write_txd));
SUNKBD_PORT(config, KEYBOARD_TAG, default_sun_keyboard_devices, "type3hle").rxd_handler().set(m_scc1, FUNC(z80scc_device::rxa_w));
+ SUNMOUSE_PORT(config, MOUSE_TAG, default_sun_mouse_devices, "hle1200").rxd_handler().set(m_scc1, FUNC(z80scc_device::rxb_w));
SCC8530N(config, m_scc2, 4.9152_MHz_XTAL);
m_scc2->out_txda_callback().set(RS232A_TAG, FUNC(rs232_port_device::write_txd));
diff --git a/src/mame/drivers/sun4.cpp b/src/mame/drivers/sun4.cpp
index a4eaa3ccc7e..2be69f71d95 100644
--- a/src/mame/drivers/sun4.cpp
+++ b/src/mame/drivers/sun4.cpp
@@ -413,6 +413,7 @@
#include "bus/rs232/rs232.h"
#include "bus/sunkbd/sunkbd.h"
+#include "bus/sunmouse/sunmouse.h"
#include "bus/sbus/sbus.h"
#include "bus/sbus/bwtwo.h"
#include "cpu/sparc/sparc.h"
@@ -442,6 +443,7 @@
#define SCC1_TAG "scc1"
#define SCC2_TAG "scc2"
#define KEYBOARD_TAG "keyboard"
+#define MOUSE_TAG "mouseport"
#define RS232A_TAG "rs232a"
#define RS232B_TAG "rs232b"
#define FDC_TAG "fdc"
@@ -490,6 +492,13 @@
#define DMA_BYTE_COUNT (2)
#define DMA_XTAL (25_MHz_XTAL)
+#define AUXIO_DENSITY (0x20)
+#define AUXIO_DISK_CHG (0x10)
+#define AUXIO_DRIVE_SEL (0x08)
+#define AUXIO_TC (0x04)
+#define AUXIO_EJECT (0x02)
+#define AUXIO_LED (0x01)
+
namespace
{
const sparc_disassembler::asi_desc_map::value_type sun4_asi_desc[] = {
@@ -542,6 +551,7 @@ public:
, m_scc1(*this, SCC1_TAG)
, m_scc2(*this, SCC2_TAG)
, m_fdc(*this, FDC_TAG)
+ , m_floppy(*this, FDC_TAG":0")
, m_lance(*this, LANCE_TAG)
, m_scsibus(*this, "scsibus")
, m_scsi(*this, "scsibus:7:ncr53c90a")
@@ -579,6 +589,8 @@ private:
DECLARE_WRITE32_MEMBER( sun4c_mmu_w );
DECLARE_READ32_MEMBER( ram_r );
DECLARE_WRITE32_MEMBER( ram_w );
+ DECLARE_READ32_MEMBER( timeout_r );
+ DECLARE_WRITE32_MEMBER( timeout_w );
DECLARE_READ32_MEMBER( ss1_sl0_id );
DECLARE_READ32_MEMBER( timer_r );
DECLARE_WRITE32_MEMBER( timer_w );
@@ -586,6 +598,8 @@ private:
DECLARE_WRITE8_MEMBER( irq_w );
DECLARE_READ8_MEMBER( fdc_r );
DECLARE_WRITE8_MEMBER( fdc_w );
+ DECLARE_READ8_MEMBER( auxio_r );
+ DECLARE_WRITE8_MEMBER( auxio_w );
DECLARE_READ32_MEMBER( dma_r );
DECLARE_WRITE32_MEMBER( dma_w );
DECLARE_READ32_MEMBER( lance_dma_r ); // TODO: Should be 16 bits
@@ -598,6 +612,8 @@ private:
DECLARE_WRITE_LINE_MEMBER( scc1_int );
DECLARE_WRITE_LINE_MEMBER( scc2_int );
+ DECLARE_WRITE_LINE_MEMBER( fdc_irq );
+
DECLARE_FLOPPY_FORMATS( floppy_formats );
void ncr53c90a(device_t *device);
@@ -622,7 +638,8 @@ private:
required_device<z80scc_device> m_scc1;
required_device<z80scc_device> m_scc2;
- required_device<n82077aa_device> m_fdc;
+ required_device<i82072_device> m_fdc;
+ required_device<floppy_connector> m_floppy;
required_device<am79c90_device> m_lance;
required_device<nscsi_bus_device> m_scsibus;
required_device<ncr53c90a_device> m_scsi;
@@ -636,6 +653,7 @@ private:
uint32_t *m_rom_ptr;
uint32_t m_context;
uint8_t m_system_enable;
+ uint8_t m_auxio;
uint32_t m_buserr[4];
uint32_t m_counter[4];
uint32_t m_dma[4];
@@ -643,13 +661,15 @@ private:
bool m_dma_tc_read;
uint32_t m_dma_pack_register;
int m_scsi_irq;
+ int m_fdc_irq;
uint32_t *m_ram_ptr;
uint8_t m_segmap[16][4096];
uint32_t m_pagemap[16384];
uint32_t m_cachetags[0x4000];
uint32_t m_cachedata[0x4000];
- uint32_t m_ram_size, m_ram_size_words;
+ uint32_t m_ram_size;
+ uint32_t m_ram_size_words;
uint8_t m_ctx_mask; // SS2 is sun4c but has 16 contexts; most have 8
uint8_t m_pmeg_mask; // SS2 is sun4c but has 16384 PTEs; most have 8192
uint8_t m_irq_reg; // IRQ control
@@ -706,7 +726,7 @@ uint32_t sun4_state::read_insn_data_4c(uint8_t asi, address_space &space, uint32
return m_type1space->read32(space, tmp, mem_mask);
default:
- printf("sun4c: access to memory type not defined in sun4c\n");
+ logerror("sun4c: access to memory type not defined in sun4c\n");
m_maincpu->set_mae();
m_buserr[0] = 0x20;
m_buserr[1] = offset << 2;
@@ -717,7 +737,7 @@ uint32_t sun4_state::read_insn_data_4c(uint8_t asi, address_space &space, uint32
{
if (!machine().side_effects_disabled())
{
- printf("sun4c: INVALID PTE entry %d %08x accessed! vaddr=%x PC=%x\n", entry, m_pagemap[entry], offset <<2, m_maincpu->pc());
+ logerror("sun4c: INVALID PTE entry %d %08x accessed! vaddr=%x PC=%x\n", entry, m_pagemap[entry], offset <<2, m_maincpu->pc());
m_maincpu->set_mae();
m_buserr[0] |= 0x80; // invalid PTE
m_buserr[0] &= ~0x8000; // read
@@ -752,7 +772,7 @@ void sun4_state::write_insn_data_4c(uint8_t asi, address_space &space, uint32_t
{
if ((!(m_pagemap[entry] & PM_WRITEMASK)) || ((m_pagemap[entry] & PM_SYSMASK) && !(asi & 1)))
{
- printf("sun4c: write protect MMU error (PC=%x)\n", m_maincpu->pc());
+ logerror("sun4c: write protect MMU error (PC=%x)\n", m_maincpu->pc());
m_buserr[0] |= 0x8040; // write, protection error
m_buserr[1] = offset<<2;
m_maincpu->set_mae();
@@ -777,7 +797,7 @@ void sun4_state::write_insn_data_4c(uint8_t asi, address_space &space, uint32_t
m_type1space->write32(space, tmp, data, mem_mask);
return;
default:
- printf("sun4c: access to memory type not defined\n");
+ logerror("sun4c: access to memory type not defined\n");
m_maincpu->set_mae();
m_buserr[0] = 0x8020;
m_buserr[1] = offset << 2;
@@ -786,7 +806,7 @@ void sun4_state::write_insn_data_4c(uint8_t asi, address_space &space, uint32_t
}
else
{
- printf("sun4c: INVALID PTE entry %d %08x accessed! data=%08x vaddr=%x PC=%x\n", entry, m_pagemap[entry], data, offset <<2, m_maincpu->pc());
+ logerror("sun4c: INVALID PTE entry %d %08x accessed! data=%08x vaddr=%x PC=%x\n", entry, m_pagemap[entry], data, offset <<2, m_maincpu->pc());
m_maincpu->set_mae();
m_buserr[0] |= 0x8080; // write cycle, invalid PTE
m_buserr[1] = offset<<2;
@@ -861,7 +881,7 @@ READ32_MEMBER( sun4_state::sun4c_mmu_r )
case 0: // IDPROM - TODO: SPARCstation-1 does not have an ID prom and a timeout should occur.
default:
- printf("sun4c: ASI 2 space unhandled read @ %x (PC=%x)\n", offset<<2, m_maincpu->pc());
+ logerror("sun4c: ASI 2 space unhandled read @ %x (PC=%x)\n", offset<<2, m_maincpu->pc());
return 0;
}
break;
@@ -894,11 +914,11 @@ READ32_MEMBER( sun4_state::sun4c_mmu_r )
return read_insn_data_4c(asi, space, offset, mem_mask);
default:
- if (!machine().side_effects_disabled()) printf("sun4c: ASI %d unhandled read @ %x (PC=%x)\n", asi, offset<<2, m_maincpu->pc());
+ if (!machine().side_effects_disabled()) logerror("sun4c: ASI %d unhandled read @ %x (PC=%x)\n", asi, offset<<2, m_maincpu->pc());
return 0;
}
- printf("sun4c: read asi %d byte offset %x, PC = %x\n", asi, offset << 2, m_maincpu->pc());
+ logerror("sun4c: read asi %d byte offset %x, PC = %x\n", asi, offset << 2, m_maincpu->pc());
return 0;
}
@@ -939,7 +959,7 @@ WRITE32_MEMBER( sun4_state::sun4c_mmu_w )
return;
case 6: // bus error
- printf("%08x to bus error @ %x, mask %08x\n", data, offset, mem_mask);
+ logerror("%08x to bus error @ %x, mask %08x\n", data, offset, mem_mask);
m_buserr[offset & 0xf] = data;
return;
@@ -964,7 +984,7 @@ WRITE32_MEMBER( sun4_state::sun4c_mmu_w )
case 0: // IDPROM
default:
- printf("sun4c: ASI 2 space unhandled write %x @ %x (mask %08x, PC=%x, shift %x)\n", data, offset<<2, mem_mask, m_maincpu->pc(), offset>>26);
+ logerror("sun4c: ASI 2 space unhandled write %x @ %x (mask %08x, PC=%x, shift %x)\n", data, offset<<2, mem_mask, m_maincpu->pc(), offset>>26);
return;
}
break;
@@ -1003,7 +1023,7 @@ WRITE32_MEMBER( sun4_state::sun4c_mmu_w )
return;
}
- printf("sun4c: %08x to asi %d byte offset %x, PC = %x, mask = %08x\n", data, asi, offset << 2, m_maincpu->pc(), mem_mask);
+ logerror("sun4c: %08x to asi %d byte offset %x, PC = %x, mask = %08x\n", data, asi, offset << 2, m_maincpu->pc(), mem_mask);
}
// -----------------------------------------------------------------
@@ -1038,7 +1058,7 @@ uint32_t sun4_state::read_insn_data(uint8_t asi, address_space &space, uint32_t
return m_type1space->read32(space, tmp, mem_mask);
default:
- printf("sun4: access to unhandled memory type\n");
+ logerror("sun4: access to unhandled memory type\n");
return 0;
}
}
@@ -1046,7 +1066,7 @@ uint32_t sun4_state::read_insn_data(uint8_t asi, address_space &space, uint32_t
{
if (!machine().side_effects_disabled())
{
- printf("sun4: INVALID PTE entry %d %08x accessed! vaddr=%x PC=%x\n", entry, m_pagemap[entry], offset <<2, m_maincpu->pc());
+ logerror("sun4: INVALID PTE entry %d %08x accessed! vaddr=%x PC=%x\n", entry, m_pagemap[entry], offset <<2, m_maincpu->pc());
m_maincpu->set_mae();
m_buserr[0] |= 0x80; // invalid PTE
m_buserr[0] &= ~0x8000; // read
@@ -1098,13 +1118,13 @@ void sun4_state::write_insn_data(uint8_t asi, address_space &space, uint32_t off
return;
default:
- printf("sun4: access to memory type not defined in sun4c\n");
+ logerror("sun4: access to memory type not defined in sun4c\n");
return;
}
}
else
{
- printf("sun4: INVALID PTE entry %d %08x accessed! data=%08x vaddr=%x PC=%x\n", entry, m_pagemap[entry], data, offset <<2, m_maincpu->pc());
+ logerror("sun4: INVALID PTE entry %d %08x accessed! data=%08x vaddr=%x PC=%x\n", entry, m_pagemap[entry], data, offset <<2, m_maincpu->pc());
//m_maincpu->trap(SPARC_DATA_ACCESS_EXCEPTION);
//m_buserr[0] = 0x8; // invalid PTE
//m_buserr[1] = offset<<2;
@@ -1160,7 +1180,7 @@ READ32_MEMBER( sun4_state::sun4_mmu_r )
case 0:
default:
- printf("sun4: ASI 2 space unhandled read @ %x (PC=%x)\n", offset<<2, m_maincpu->pc());
+ logerror("sun4: ASI 2 space unhandled read @ %x (PC=%x)\n", offset<<2, m_maincpu->pc());
return 0;
}
break;
@@ -1196,11 +1216,11 @@ READ32_MEMBER( sun4_state::sun4_mmu_r )
return read_insn_data(asi, space, offset, mem_mask);
default:
- if (!machine().side_effects_disabled()) printf("sun4: ASI %d unhandled read @ %x (PC=%x)\n", asi, offset<<2, m_maincpu->pc());
+ if (!machine().side_effects_disabled()) logerror("sun4: ASI %d unhandled read @ %x (PC=%x)\n", asi, offset<<2, m_maincpu->pc());
return 0;
}
- printf("sun4: read asi %d byte offset %x, PC = %x\n", asi, offset << 2, m_maincpu->pc());
+ logerror("sun4: read asi %d byte offset %x, PC = %x\n", asi, offset << 2, m_maincpu->pc());
return 0;
}
@@ -1279,7 +1299,7 @@ WRITE32_MEMBER( sun4_state::sun4_mmu_w )
case 0: // IDPROM
default:
- printf("sun4: ASI 2 space unhandled write %x @ %x (mask %08x, PC=%x)\n", data, offset<<2, mem_mask, m_maincpu->pc());
+ logerror("sun4: ASI 2 space unhandled write %x @ %x (mask %08x, PC=%x)\n", data, offset<<2, mem_mask, m_maincpu->pc());
return;
}
break;
@@ -1395,9 +1415,11 @@ void sun4_state::machine_reset()
{
m_context = 0;
m_system_enable = 0;
+ m_auxio = 0xc0;
m_irq_reg = 0;
m_scc1_int = m_scc2_int = 0;
m_scsi_irq = 0;
+ m_fdc_irq = 0;
m_dma_irq = false;
m_dma_tc_read = false;
m_dma_pack_register = 0;
@@ -1433,6 +1455,21 @@ void sun4_state::machine_start()
m_reset_timer->adjust(attotime::never);
}
+READ32_MEMBER( sun4_state::timeout_r )
+{
+ m_buserr[0] = 0x20; // read timeout
+ m_buserr[1] = 0x04000000 + (offset << 2);
+ m_maincpu->set_mae();
+ return ~0;
+}
+
+WRITE32_MEMBER( sun4_state::timeout_w )
+{
+ m_buserr[0] = 0x8020; // write timeout
+ m_buserr[1] = 0x04000000 + (offset << 2);
+ m_maincpu->set_mae();
+}
+
READ32_MEMBER( sun4_state::ram_r )
{
//printf("ram_r: @ %08x (mask %08x)\n", offset<<2, mem_mask);
@@ -1511,6 +1548,7 @@ WRITE32_MEMBER( sun4_state::ram_w )
void sun4_state::type0space_map(address_map &map)
{
map(0x00000000, 0x03ffffff).rw(FUNC(sun4_state::ram_r), FUNC(sun4_state::ram_w));
+ map(0x04000000, 0x0fffffff).rw(FUNC(sun4_state::timeout_r), FUNC(sun4_state::timeout_w));
}
void sun4_state::type1space_map(address_map &map)
@@ -1522,6 +1560,7 @@ void sun4_state::type1space_map(address_map &map)
map(0x05000000, 0x05000003).rw(FUNC(sun4_state::irq_r), FUNC(sun4_state::irq_w));
map(0x06000000, 0x0607ffff).rom().region("user1", 0);
map(0x07200000, 0x07200003).rw(FUNC(sun4_state::fdc_r), FUNC(sun4_state::fdc_w));
+ map(0x07400003, 0x07400003).rw(FUNC(sun4_state::auxio_r), FUNC(sun4_state::auxio_w));
map(0x08000000, 0x08000003).r(FUNC(sun4_state::ss1_sl0_id)); // slot 0 contains SCSI/DMA/Ethernet
map(0x08400000, 0x0840000f).rw(FUNC(sun4_state::dma_r), FUNC(sun4_state::dma_w));
map(0x08800000, 0x0880002f).m(m_scsi, FUNC(ncr53c90a_device::map)).umask32(0xff000000);
@@ -1549,11 +1588,9 @@ READ8_MEMBER( sun4_state::fdc_r )
{
case 0: // Main Status (R)
return m_fdc->msr_r(space, 0, 0xff);
- break;
case 1: // FIFO Data Port (R)
return m_fdc->fifo_r(space, 0, 0xff);
- break;
default:
break;
@@ -1579,6 +1616,27 @@ WRITE8_MEMBER( sun4_state::fdc_w )
}
}
+READ8_MEMBER( sun4_state::auxio_r )
+{
+ logerror("%s: auxio_r: %02x\n", machine().describe_context(), m_auxio);
+ return m_auxio;
+}
+
+WRITE8_MEMBER( sun4_state::auxio_w )
+{
+ logerror("%s: auxio_w: %02x, drive_sel:%d tc:%d eject:%d LED:%d\n", machine().describe_context(), data, BIT(data, 3), BIT(data, 2), BIT(data, 1), BIT(data, 0));
+ m_auxio = (m_auxio & 0xf0) | (data & 0x0f);
+ if (!(m_auxio & AUXIO_DRIVE_SEL))
+ {
+ m_auxio &= ~(AUXIO_DENSITY | AUXIO_DISK_CHG);
+ }
+ else
+ {
+ m_auxio |= AUXIO_DISK_CHG; // Report no disk inserted
+ m_fdc->tc_w(data & AUXIO_TC);
+ }
+}
+
READ8_MEMBER( sun4_state::irq_r )
{
return m_irq_reg;
@@ -1586,18 +1644,45 @@ READ8_MEMBER( sun4_state::irq_r )
WRITE8_MEMBER( sun4_state::irq_w )
{
- printf("%02x to IRQ\n", data);
-
+ const uint8_t old_irq = m_irq_reg;
m_irq_reg = data;
+ const uint8_t changed = old_irq ^ data;
- m_maincpu->set_input_line(SPARC_IRQ12, ((m_scc1_int || m_scc2_int) && (m_irq_reg & 0x01)) ? ASSERT_LINE : CLEAR_LINE);
- if (!(m_irq_reg & 0x01))
- m_maincpu->set_input_line(SPARC_NMI, CLEAR_LINE);
+ logerror("%02x to IRQ, %02x changed\n", data, changed);
+
+ if (!changed)
+ return;
+
+ if (BIT(changed, 0))
+ {
+ if (BIT(m_irq_reg, 7) && BIT(m_counter[2] | m_counter[3], 31))
+ m_maincpu->set_input_line(SPARC_IRQ14, BIT(data, 0) ? ASSERT_LINE : CLEAR_LINE);
+ if (BIT(m_irq_reg, 5) && BIT(m_counter[0] | m_counter[1], 31))
+ m_maincpu->set_input_line(SPARC_IRQ10, BIT(data, 0) ? ASSERT_LINE : CLEAR_LINE);
+ if (BIT(m_irq_reg, 3))
+ m_maincpu->set_input_line(SPARC_IRQ6, BIT(data, 0) ? ASSERT_LINE : CLEAR_LINE);
+ if (BIT(m_irq_reg, 2))
+ m_maincpu->set_input_line(SPARC_IRQ4, BIT(data, 0) ? ASSERT_LINE : CLEAR_LINE);
+ if (BIT(m_irq_reg, 1))
+ m_maincpu->set_input_line(SPARC_IRQ1, BIT(data, 0) ? ASSERT_LINE : CLEAR_LINE);
+ }
+ else if (BIT(m_irq_reg, 0))
+ {
+ if (BIT(changed, 7) && BIT(m_counter[2] | m_counter[3], 31))
+ m_maincpu->set_input_line(SPARC_IRQ14, BIT(m_irq_reg, 7) ? ASSERT_LINE : CLEAR_LINE);
+ if (BIT(changed, 5) && BIT(m_counter[0] | m_counter[1], 31))
+ m_maincpu->set_input_line(SPARC_IRQ10, BIT(m_irq_reg, 5) ? ASSERT_LINE : CLEAR_LINE);
+ if (BIT(changed, 3))
+ m_maincpu->set_input_line(SPARC_IRQ6, BIT(m_irq_reg, 3) ? ASSERT_LINE : CLEAR_LINE);
+ if (BIT(changed, 2))
+ m_maincpu->set_input_line(SPARC_IRQ4, BIT(m_irq_reg, 2) ? ASSERT_LINE : CLEAR_LINE);
+ if (BIT(changed, 1))
+ m_maincpu->set_input_line(SPARC_IRQ1, BIT(m_irq_reg, 1) ? ASSERT_LINE : CLEAR_LINE);
+ }
}
WRITE_LINE_MEMBER( sun4_state::scc1_int )
{
- logerror("scc1\n");
m_scc1_int = state;
m_maincpu->set_input_line(SPARC_IRQ12, ((m_scc1_int || m_scc2_int) && (m_irq_reg & 0x01)) ? ASSERT_LINE : CLEAR_LINE);
@@ -1605,7 +1690,6 @@ WRITE_LINE_MEMBER( sun4_state::scc1_int )
WRITE_LINE_MEMBER( sun4_state::scc2_int )
{
- logerror("scc2\n");
m_scc2_int = state;
m_maincpu->set_input_line(SPARC_IRQ12, ((m_scc1_int || m_scc2_int) && (m_irq_reg & 0x01)) ? ASSERT_LINE : CLEAR_LINE);
@@ -1623,7 +1707,6 @@ void sun4_state::device_timer(emu_timer &timer, device_timer_id id, int param, v
start_timer(0);
if ((m_irq_reg & 0x21) == 0x21)
{
- logerror("t0\n");
m_maincpu->set_input_line(SPARC_IRQ10, ASSERT_LINE);
//printf("Taking INT10\n");
}
@@ -1637,7 +1720,6 @@ void sun4_state::device_timer(emu_timer &timer, device_timer_id id, int param, v
//m_c1_timer->adjust(attotime::never);
if ((m_irq_reg & 0x81) == 0x81)
{
- logerror("t1\n");
m_maincpu->set_input_line(SPARC_IRQ14, ASSERT_LINE);
//printf("Taking INT14\n");
}
@@ -1646,7 +1728,7 @@ void sun4_state::device_timer(emu_timer &timer, device_timer_id id, int param, v
case TIMER_RESET:
m_reset_timer->adjust(attotime::never);
m_maincpu->set_input_line(SPARC_RESET, CLEAR_LINE);
- printf("Clearing reset line\n");
+ //printf("Clearing reset line\n");
break;
}
}
@@ -1665,7 +1747,6 @@ READ32_MEMBER( sun4_state::timer_r )
//printf("Read timer limit 0 (%08x) @ %x, mask %08x\n", ret, m_maincpu->pc(), mem_mask);
m_counter[0] &= ~0x80000000;
m_counter[1] &= ~0x80000000;
- logerror("tc0\n");
m_maincpu->set_input_line(SPARC_IRQ10, CLEAR_LINE);
}
@@ -1678,7 +1759,6 @@ READ32_MEMBER( sun4_state::timer_r )
//printf("Read timer limit 1 (%08x) @ %x, mask %08x\n", ret, m_maincpu->pc(), mem_mask);
m_counter[2] &= ~0x80000000;
m_counter[3] &= ~0x80000000;
- logerror("tc1\n");
m_maincpu->set_input_line(SPARC_IRQ14, CLEAR_LINE);
}
return ret;
@@ -1947,6 +2027,17 @@ WRITE_LINE_MEMBER( sun4_state::scsi_drq )
}
}
+WRITE_LINE_MEMBER( sun4_state::fdc_irq )
+{
+ int old_irq = m_fdc_irq;
+ m_fdc_irq = state;
+ if (old_irq != m_fdc_irq)
+ {
+ logerror("fdc_irq %d\n", state);
+ m_maincpu->set_input_line(SPARC_IRQ11, state ? ASSERT_LINE : CLEAR_LINE);
+ }
+}
+
READ32_MEMBER( sun4_state::lance_dma_r )
{
if (m_arch == ARCH_SUN4)
@@ -2015,8 +2106,10 @@ MACHINE_CONFIG_START(sun4_state::sun4)
M48T02(config, TIMEKEEPER_TAG, 0);
- MCFG_N82077AA_ADD(FDC_TAG, n82077aa_device::MODE_PS2)
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", sun_floppies, "35hd", sun4_state::floppy_formats)
+ I82072(config, m_fdc, 24_MHz_XTAL);
+ m_fdc->set_ready_line_connected(false);
+ m_fdc->intrq_wr_callback().set(FUNC(sun4_state::fdc_irq));
+ FLOPPY_CONNECTOR(config, m_floppy, sun_floppies, "35hd", sun4_state::floppy_formats);
// MMU Type 0 device space
ADDRESS_MAP_BANK(config, m_type0space).set_map(&sun4_state::type0space_map).set_options(ENDIANNESS_BIG, 32, 32, 0x80000000);
@@ -2033,8 +2126,10 @@ MACHINE_CONFIG_START(sun4_state::sun4)
SCC8530N(config, m_scc1, 4.9152_MHz_XTAL);
m_scc1->out_int_callback().set(FUNC(sun4_state::scc1_int));
m_scc1->out_txda_callback().set(KEYBOARD_TAG, FUNC(sun_keyboard_port_device::write_txd));
+ m_scc1->out_txdb_callback().set(MOUSE_TAG, FUNC(sun_mouse_port_device::write_txd));
SUNKBD_PORT(config, KEYBOARD_TAG, default_sun_keyboard_devices, "type4hle").rxd_handler().set(m_scc1, FUNC(z80scc_device::rxa_w));
+ SUNMOUSE_PORT(config, MOUSE_TAG, default_sun_mouse_devices, "hle1200").rxd_handler().set(m_scc1, FUNC(z80scc_device::rxb_w));
// RS232 serial ports
SCC8530N(config, m_scc2, 4.9152_MHz_XTAL);
@@ -2075,8 +2170,10 @@ MACHINE_CONFIG_START(sun4_state::sun4c)
M48T02(config, TIMEKEEPER_TAG, 0);
- MCFG_N82077AA_ADD(FDC_TAG, n82077aa_device::MODE_PS2)
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", sun_floppies, "35hd", sun4_state::floppy_formats)
+ I82072(config, m_fdc, 24_MHz_XTAL);
+ m_fdc->set_ready_line_connected(false);
+ m_fdc->intrq_wr_callback().set(FUNC(sun4_state::fdc_irq));
+ FLOPPY_CONNECTOR(config, m_floppy, sun_floppies, "35hd", sun4_state::floppy_formats);
// MMU Type 0 device space
ADDRESS_MAP_BANK(config, m_type0space).set_map(&sun4_state::type0space_map).set_options(ENDIANNESS_BIG, 32, 32, 0x80000000);
@@ -2093,8 +2190,10 @@ MACHINE_CONFIG_START(sun4_state::sun4c)
SCC8530N(config, m_scc1, 4.9152_MHz_XTAL);
m_scc1->out_int_callback().set(FUNC(sun4_state::scc1_int));
m_scc1->out_txda_callback().set(KEYBOARD_TAG, FUNC(sun_keyboard_port_device::write_txd));
+ // no mouse TxD connection - replaced with soft power request input
SUNKBD_PORT(config, KEYBOARD_TAG, default_sun_keyboard_devices, "type5hle").rxd_handler().set(m_scc1, FUNC(z80scc_device::rxa_w));
+ SUNMOUSE_PORT(config, MOUSE_TAG, default_sun_mouse_devices, "hle1200").rxd_handler().set(m_scc1, FUNC(z80scc_device::rxb_w));
// RS232 serial ports
SCC8530N(config, m_scc2, 4.9152_MHz_XTAL);
diff --git a/src/mame/drivers/sys9002.cpp b/src/mame/drivers/sys9002.cpp
index 70c16c2e744..ce93ab675a7 100644
--- a/src/mame/drivers/sys9002.cpp
+++ b/src/mame/drivers/sys9002.cpp
@@ -66,11 +66,9 @@ void sys9002_state::sys9002_io(address_map &map)
map.global_mask(0xff);
//AM_RANGE(0x04, 0x04) AM_DEVREADWRITE("crtc", mc6845_device, status_r, address_w) // left commented out as mame freezes after about 2 seconds
//AM_RANGE(0x05, 0x05) AM_DEVREADWRITE("crtc", mc6845_device, register_r, register_w)
- map(0x08, 0x08).rw("uart1", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x09, 0x09).rw("uart1", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); // 7 bits even parity, x64
+ map(0x08, 0x09).rw("uart1", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x11, 0x11).nopr(); // continuous read
- map(0x1c, 0x1c).rw("uart2", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x1d, 0x1d).rw("uart2", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); // enabled for transmit only, 8 bits odd parity, x64
+ map(0x1c, 0x1d).rw("uart2", FUNC(i8251_device::read), FUNC(i8251_device::write));
}
/* Input ports */
@@ -151,7 +149,7 @@ MACHINE_CONFIG_START(sys9002_state::sys9002)
uart_clock.signal_handler().append("uart2", FUNC(i8251_device::write_txc));
uart_clock.signal_handler().append("uart2", FUNC(i8251_device::write_rxc));
- i8251_device &uart1(I8251(config, "uart1", 0));
+ i8251_device &uart1(I8251(config, "uart1", 0)); // 7 bits even parity, x64
uart1.txd_handler().set("rs232a", FUNC(rs232_port_device::write_txd));
uart1.dtr_handler().set("rs232a", FUNC(rs232_port_device::write_dtr));
uart1.rts_handler().set("rs232a", FUNC(rs232_port_device::write_rts));
@@ -162,7 +160,7 @@ MACHINE_CONFIG_START(sys9002_state::sys9002)
MCFG_RS232_CTS_HANDLER(WRITELINE("uart1", i8251_device, write_cts))
MCFG_SLOT_OPTION_DEVICE_INPUT_DEFAULTS("terminal", uart1)
- i8251_device &uart2(I8251(config, "uart2", 0));
+ i8251_device &uart2(I8251(config, "uart2", 0)); // enabled for transmit only, 8 bits odd parity, x64
uart2.txd_handler().set("rs232b", FUNC(rs232_port_device::write_txd));
uart2.dtr_handler().set("rs232b", FUNC(rs232_port_device::write_dtr));
uart2.rts_handler().set("rs232b", FUNC(rs232_port_device::write_rts));
diff --git a/src/mame/drivers/taitogn.cpp b/src/mame/drivers/taitogn.cpp
index ac8ce300943..b9077fd8ab0 100644
--- a/src/mame/drivers/taitogn.cpp
+++ b/src/mame/drivers/taitogn.cpp
@@ -381,11 +381,8 @@ public:
void coh3002t_t1(machine_config &config);
private:
- DECLARE_WRITE_LINE_MEMBER(sio0_sck){ m_cat702[0]->write_clock(state); m_cat702[1]->write_clock(state); m_znmcu->write_clock(state); }
- DECLARE_WRITE_LINE_MEMBER(sio0_txd){ m_cat702[0]->write_datain(state); m_cat702[1]->write_datain(state); }
- DECLARE_WRITE_LINE_MEMBER(cat702_1_dataout){ m_cat702_dataout[0] = state; update_sio0_rxd(); }
- DECLARE_WRITE_LINE_MEMBER(cat702_2_dataout){ m_cat702_dataout[1] = state; update_sio0_rxd(); }
- DECLARE_WRITE_LINE_MEMBER(znmcu_dataout){ m_znmcu_dataout = state; update_sio0_rxd(); }
+ template<int Chip> DECLARE_WRITE_LINE_MEMBER(cat702_dataout) { m_cat702_dataout[Chip] = state; update_sio0_rxd(); }
+ DECLARE_WRITE_LINE_MEMBER(znmcu_dataout) { m_znmcu_dataout = state; update_sio0_rxd(); }
void update_sio0_rxd() { m_sio0->write_rxd(m_cat702_dataout[0] && m_cat702_dataout[1] && m_znmcu_dataout); }
DECLARE_READ8_MEMBER(control_r);
DECLARE_WRITE8_MEMBER(control_w);
@@ -692,27 +689,30 @@ void slot_ataflash(device_slot_interface &device)
MACHINE_CONFIG_START(taitogn_state::coh3002t)
/* basic machine hardware */
- MCFG_DEVICE_ADD( "maincpu", CXD8661R, XTAL(100'000'000) )
- MCFG_DEVICE_PROGRAM_MAP(taitogn_map)
-
- subdevice<ram_device>("maincpu:ram")->set_default_size("4M");
-
- MCFG_DEVICE_MODIFY("maincpu:sio0")
- MCFG_PSX_SIO_SCK_HANDLER(WRITELINE(*this, taitogn_state, sio0_sck))
- MCFG_PSX_SIO_TXD_HANDLER(WRITELINE(*this, taitogn_state, sio0_txd))
-
- MCFG_DEVICE_ADD("cat702_1", CAT702, 0)
- MCFG_CAT702_DATAOUT_HANDLER(WRITELINE(*this, taitogn_state, cat702_1_dataout))
-
- MCFG_DEVICE_ADD("cat702_2", CAT702, 0)
- MCFG_CAT702_DATAOUT_HANDLER(WRITELINE(*this, taitogn_state, cat702_2_dataout))
-
- MCFG_DEVICE_ADD("znmcu", ZNMCU, 0)
- MCFG_ZNMCU_DATAOUT_HANDLER(WRITELINE(*this, taitogn_state, znmcu_dataout))
- MCFG_ZNMCU_DSR_HANDLER(WRITELINE("maincpu:sio0", psxsio0_device, write_dsr))
- MCFG_ZNMCU_DSW_HANDLER(IOPORT("DSW"))
- MCFG_ZNMCU_ANALOG1_HANDLER(IOPORT("ANALOG1"))
- MCFG_ZNMCU_ANALOG2_HANDLER(IOPORT("ANALOG2"))
+ CXD8661R(config, m_maincpu, XTAL(100'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &taitogn_state::taitogn_map);
+
+ m_maincpu->subdevice<ram_device>("ram")->set_default_size("4M");
+
+ auto &sio0(*m_maincpu->subdevice<psxsio0_device>("sio0"));
+ sio0.sck_handler().set(m_cat702[0], FUNC(cat702_device::write_clock));
+ sio0.sck_handler().append(m_cat702[1], FUNC(cat702_device::write_clock));
+ sio0.sck_handler().append(m_znmcu, FUNC(znmcu_device::write_clock));
+ sio0.txd_handler().set(m_cat702[0], FUNC(cat702_device::write_datain));
+ sio0.txd_handler().append(m_cat702[1], FUNC(cat702_device::write_datain));
+
+ CAT702(config, m_cat702[0], 0);
+ m_cat702[0]->dataout_handler().set(FUNC(taitogn_state::cat702_dataout<0>));
+
+ CAT702(config, m_cat702[1], 0);
+ m_cat702[1]->dataout_handler().set(FUNC(taitogn_state::cat702_dataout<1>));
+
+ ZNMCU(config, m_znmcu, 0);
+ m_znmcu->dataout_handler().set(FUNC(taitogn_state::znmcu_dataout));
+ m_znmcu->dsr_handler().set("maincpu:sio0", FUNC(psxsio0_device::write_dsr));
+ m_znmcu->dsw_handler().set_ioport("DSW");
+ m_znmcu->analog1_handler().set_ioport("ANALOG1");
+ m_znmcu->analog2_handler().set_ioport("ANALOG2");
MCFG_DEVICE_ADD("at28c16", AT28C16, 0)
MCFG_DEVICE_ADD("rf5c296", RF5C296, 0)
diff --git a/src/mame/drivers/tandy2k.cpp b/src/mame/drivers/tandy2k.cpp
index 8f3a0a9d414..03b12ee5e0c 100644
--- a/src/mame/drivers/tandy2k.cpp
+++ b/src/mame/drivers/tandy2k.cpp
@@ -321,7 +321,7 @@ void tandy2k_state::tandy2k_io(address_map &map)
map(0x00000, 0x00000).mirror(0x8).rw(FUNC(tandy2k_state::enable_r), FUNC(tandy2k_state::enable_w));
map(0x00002, 0x00002).mirror(0x8).w(FUNC(tandy2k_state::dma_mux_w));
map(0x00004, 0x00004).mirror(0x8).rw(FUNC(tandy2k_state::fldtc_r), FUNC(tandy2k_state::fldtc_w));
- map(0x00010, 0x00013).mirror(0xc).rw(m_uart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)).umask16(0x00ff);
+ map(0x00010, 0x00013).mirror(0xc).rw(m_uart, FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
map(0x00030, 0x00033).mirror(0xc).m(m_fdc, FUNC(i8272a_device::map)).umask16(0x00ff);
map(0x00040, 0x00047).mirror(0x8).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write)).umask16(0x00ff);
map(0x00050, 0x00057).mirror(0x8).rw(m_i8255a, FUNC(i8255_device::read), FUNC(i8255_device::write)).umask16(0x00ff);
diff --git a/src/mame/drivers/tim100.cpp b/src/mame/drivers/tim100.cpp
index de2e6397b74..f62678f26c3 100644
--- a/src/mame/drivers/tim100.cpp
+++ b/src/mame/drivers/tim100.cpp
@@ -59,10 +59,8 @@ void tim100_state::tim100_mem(address_map &map)
map.unmap_value_high();
map(0x0000, 0x1fff).rom(); // 2764 at U16
map(0x2000, 0x27ff).ram().share("videoram"); // 2KB static ram CDM6116A at U15
- map(0x6000, 0x6000).rw("uart_u17", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x6001, 0x6001).rw("uart_u17", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0x8000, 0x8000).rw("uart_u18", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x8001, 0x8001).rw("uart_u18", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x6000, 0x6001).rw("uart_u17", FUNC(i8251_device::read), FUNC(i8251_device::write));
+ map(0x8000, 0x8001).rw("uart_u18", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0xa000, 0xa000).nopw(); // continuously writes 00 here
map(0xc000, 0xc001).rw(m_crtc, FUNC(i8276_device::read), FUNC(i8276_device::write)); // i8276
}
diff --git a/src/mame/drivers/trs80.cpp b/src/mame/drivers/trs80.cpp
index ad7bf3fae89..adcd9636b6a 100644
--- a/src/mame/drivers/trs80.cpp
+++ b/src/mame/drivers/trs80.cpp
@@ -264,8 +264,7 @@ void trs80_state::radionic_mem(address_map &map)
{
m1_mem(map);
// Optional external RS232 module with 8251
- //map(0x3400, 0x3400).mirror(0xfe).rw("uart2", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- //map(0x3401, 0x3401).mirror(0xfe).rw("uart2", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ //map(0x3400, 0x3401).mirror(0xfe).rw("uart2", FUNC(i8251_device::read), FUNC(i8251_device::write));
// Internal colour controls (need details)
//map(0x3500, 0x35ff).w(FUNC(trs80_state::colour_w));
// Internal interface to external slots
diff --git a/src/mame/drivers/tsispch.cpp b/src/mame/drivers/tsispch.cpp
index e6d8fc853bc..a6fe540acc3 100644
--- a/src/mame/drivers/tsispch.cpp
+++ b/src/mame/drivers/tsispch.cpp
@@ -309,8 +309,7 @@ void tsispch_state::i8086_mem(address_map &map)
{
map.unmap_value_high();
map(0x00000, 0x02FFF).mirror(0x34000).ram(); // verified; 6264*2 sram, only first 3/4 used
- map(0x03000, 0x03000).mirror(0x341FC).rw("i8251a_u15", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x03002, 0x03002).mirror(0x341FC).rw("i8251a_u15", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x03000, 0x03003).mirror(0x341FC).rw("i8251a_u15", FUNC(i8251_device::read), FUNC(i8251_device::write)).umask16(0x00ff);
map(0x03200, 0x03203).mirror(0x341FC).rw(m_pic, FUNC(pic8259_device::read), FUNC(pic8259_device::write)).umask16(0x00ff); // AMD P8259 PIC @ U5 (reads as 04 and 7c, upper byte is open bus)
map(0x03400, 0x03400).mirror(0x341FE).r(FUNC(tsispch_state::dsw_r)); // verified, read from dipswitch s4
map(0x03401, 0x03401).mirror(0x341FE).w(FUNC(tsispch_state::peripheral_w)); // verified, write to the 4 leds, plus 4 control bits
diff --git a/src/mame/drivers/unior.cpp b/src/mame/drivers/unior.cpp
index ac4c02df4ba..bcfc520f54c 100644
--- a/src/mame/drivers/unior.cpp
+++ b/src/mame/drivers/unior.cpp
@@ -110,8 +110,7 @@ void unior_state::unior_io(address_map &map)
map(0x50, 0x50).w(FUNC(unior_state::scroll_w));
map(0x60, 0x61).rw("crtc", FUNC(i8275_device::read), FUNC(i8275_device::write));
map(0xdc, 0xdf).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write));
- map(0xec, 0xec).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0xed, 0xed).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0xec, 0xed).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write));
}
/* Input ports */
diff --git a/src/mame/drivers/v100.cpp b/src/mame/drivers/v100.cpp
index 7f4ba23e410..427f3c82504 100644
--- a/src/mame/drivers/v100.cpp
+++ b/src/mame/drivers/v100.cpp
@@ -218,10 +218,8 @@ void v100_state::io_map(address_map &map)
map.global_mask(0xff);
map(0x00, 0x0f).w(m_vtac, FUNC(crt5037_device::write));
map(0x10, 0x10).w("brg1", FUNC(com8116_device::stt_str_w));
- map(0x12, 0x12).rw("usart1", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x13, 0x13).rw("usart1", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0x14, 0x14).rw("usart2", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x15, 0x15).rw("usart2", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x12, 0x13).rw("usart1", FUNC(i8251_device::read), FUNC(i8251_device::write));
+ map(0x14, 0x15).rw("usart2", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x16, 0x16).w("brg2", FUNC(com8116_device::stt_str_w));
map(0x20, 0x20).r(FUNC(v100_state::earom_r));
map(0x30, 0x30).w(FUNC(v100_state::port30_w));
@@ -385,7 +383,7 @@ MACHINE_CONFIG_START(v100_state::v100)
ppi.out_pc_callback().set(m_earom, FUNC(er1400_device::data_w)).bit(6).invert();
ppi.out_pc_callback().append(m_earom, FUNC(er1400_device::clock_w)).bit(0).invert();
- ER1400(config, m_earom, 0);
+ ER1400(config, m_earom);
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/v102.cpp b/src/mame/drivers/v102.cpp
index 210c1815ac6..36e02a821f5 100644
--- a/src/mame/drivers/v102.cpp
+++ b/src/mame/drivers/v102.cpp
@@ -63,8 +63,7 @@ void v102_state::io_map(address_map &map)
//AM_RANGE(0x00, 0x3f) AM_DEVREADWRITE("vpac", crt9007_device, read, write)
map(0x18, 0x19).nopw();
map(0x40, 0x43).rw("mpsc", FUNC(upd7201_new_device::ba_cd_r), FUNC(upd7201_new_device::ba_cd_w));
- map(0x60, 0x60).rw("usart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x61, 0x61).rw("usart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x60, 0x61).rw("usart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x80, 0x83).w("pit", FUNC(pit8253_device::write));
map(0xa0, 0xa3).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write));
//AM_RANGE(0xbf, 0xbf) ???
diff --git a/src/mame/drivers/v1050.cpp b/src/mame/drivers/v1050.cpp
index f90de13df63..d6ad0852bc8 100644
--- a/src/mame/drivers/v1050.cpp
+++ b/src/mame/drivers/v1050.cpp
@@ -336,7 +336,7 @@ READ8_MEMBER( v1050_state::kb_data_r )
READ8_MEMBER( v1050_state::kb_status_r )
{
- uint8_t val = m_uart_kb->status_r(space, 0);
+ uint8_t val = m_uart_kb->status_r();
return val | (m_keyavail ? 0x02 : 0x00);
}
@@ -481,12 +481,10 @@ void v1050_state::v1050_io(address_map &map)
map.unmap_value_high();
map.global_mask(0xff);
map(0x84, 0x87).rw(m_ppi_disp, FUNC(i8255_device::read), FUNC(i8255_device::write));
-// AM_RANGE(0x88, 0x88) AM_DEVREADWRITE(I8251A_KB_TAG, i8251_device, data_r, data_w)
-// AM_RANGE(0x89, 0x89) AM_DEVREADWRITE(I8251A_KB_TAG, i8251_device, status_r, control_w)
+// map(0x88, 0x89).rw(m_uart_kb, FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x88, 0x88).r(FUNC(v1050_state::kb_data_r)).w(m_uart_kb, FUNC(i8251_device::data_w));
map(0x89, 0x89).r(FUNC(v1050_state::kb_status_r)).w(m_uart_kb, FUNC(i8251_device::control_w));
- map(0x8c, 0x8c).rw(m_uart_sio, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x8d, 0x8d).rw(m_uart_sio, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x8c, 0x8d).rw(m_uart_sio, FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x90, 0x93).rw(I8255A_MISC_TAG, FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0x94, 0x97).rw(m_fdc, FUNC(mb8877_device::read), FUNC(mb8877_device::write));
map(0x9c, 0x9f).rw(I8255A_RTC_TAG, FUNC(i8255_device::read), FUNC(i8255_device::write));
diff --git a/src/mame/drivers/v550.cpp b/src/mame/drivers/v550.cpp
index eafbd292fbd..c8b9f504978 100644
--- a/src/mame/drivers/v550.cpp
+++ b/src/mame/drivers/v550.cpp
@@ -70,8 +70,7 @@ void v550_state::io_map(address_map &map)
map(0x00, 0x01).rw("gdc", FUNC(upd7220_device::read), FUNC(upd7220_device::write));
map(0x10, 0x10).w("brg1", FUNC(com8116_device::stt_str_w));
map(0x20, 0x23).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write));
- map(0x30, 0x30).rw(m_usart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x31, 0x31).rw(m_usart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x30, 0x31).rw(m_usart, FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x40, 0x40).rw("mpsc", FUNC(upd7201_new_device::da_r), FUNC(upd7201_new_device::da_w));
map(0x41, 0x41).rw("mpsc", FUNC(upd7201_new_device::ca_r), FUNC(upd7201_new_device::ca_w));
map(0x48, 0x48).rw("mpsc", FUNC(upd7201_new_device::db_r), FUNC(upd7201_new_device::db_w));
diff --git a/src/mame/drivers/vector4.cpp b/src/mame/drivers/vector4.cpp
index e73108e1973..1d338f6b3c6 100644
--- a/src/mame/drivers/vector4.cpp
+++ b/src/mame/drivers/vector4.cpp
@@ -48,12 +48,9 @@ void vector4_state::vector4_io(address_map &map)
{
map.unmap_value_high();
map.global_mask(0xff);
- map(0x02, 0x02).rw("uart1", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x03, 0x03).rw("uart1", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0x04, 0x04).rw("uart2", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x05, 0x05).rw("uart2", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0x06, 0x06).rw("uart3", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x07, 0x07).rw("uart3", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x02, 0x03).rw("uart1", FUNC(i8251_device::read), FUNC(i8251_device::write));
+ map(0x04, 0x05).rw("uart2", FUNC(i8251_device::read), FUNC(i8251_device::write));
+ map(0x06, 0x07).rw("uart3", FUNC(i8251_device::read), FUNC(i8251_device::write));
}
/* Input ports */
diff --git a/src/mame/drivers/vectrix.cpp b/src/mame/drivers/vectrix.cpp
index dc1fdead34e..477fbb07386 100644
--- a/src/mame/drivers/vectrix.cpp
+++ b/src/mame/drivers/vectrix.cpp
@@ -44,8 +44,7 @@ void vectrix_state::mem_map(address_map &map)
void vectrix_state::io_map(address_map &map)
{
- map(0x3000, 0x3000).rw("uart1", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x3001, 0x3001).rw("uart1", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x3000, 0x3001).rw("uart1", FUNC(i8251_device::read), FUNC(i8251_device::write));
}
static INPUT_PORTS_START( vectrix )
diff --git a/src/mame/drivers/vgmplay.cpp b/src/mame/drivers/vgmplay.cpp
index 977f50768d5..af84a06707b 100644
--- a/src/mame/drivers/vgmplay.cpp
+++ b/src/mame/drivers/vgmplay.cpp
@@ -191,6 +191,10 @@ public:
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
template<int Chip> DECLARE_READ8_MEMBER(segapcm_rom_r);
+ template<int Chip> DECLARE_READ8_MEMBER(ym2608_rom_r);
+ template<int Chip> DECLARE_READ8_MEMBER(ym2610_adpcm_a_rom_r);
+ template<int Chip> DECLARE_READ8_MEMBER(ym2610_adpcm_b_rom_r);
+ template<int Chip> DECLARE_READ8_MEMBER(y8950_rom_r);
template<int Chip> DECLARE_READ8_MEMBER(ymf278b_rom_r);
template<int Chip> DECLARE_READ8_MEMBER(ymf271_rom_r);
template<int Chip> DECLARE_READ8_MEMBER(ymz280b_rom_r);
@@ -353,6 +357,15 @@ private:
std::array<std::vector<uint8_t>, 0x40> m_data_streams;
std::array<std::vector<data_block>, 0x40> m_data_stream_blocks;
+ struct
+ {
+ uint8_t cmp_type;
+ uint8_t cmp_sub_type;
+ uint8_t bit_dec;
+ uint8_t bit_cmp;
+ std::vector<uint8_t> entries;
+ } m_dec_table;
+
uint32_t m_ym2612_stream_offset = 0U;
uint32_t m_multipcm_bank_l[2];
@@ -365,6 +378,7 @@ private:
uint32_t m_okim6295_bank[2];
uint32_t m_okim6295_nmk112_bank[2][4];
+ int m_sega32x_channel_hack;
int m_nes_apu_channel_hack[2];
};
@@ -405,6 +419,10 @@ public:
void soundchips16_map(address_map &map);
template<int Chip> void segapcm_map(address_map &map);
template<int Chip> void rf5c68_map(address_map &map);
+ template<int Chip> void ym2608_map(address_map &map);
+ template<int Chip> void ym2610_adpcm_a_map(address_map &map);
+ template<int Chip> void ym2610_adpcm_b_map(address_map &map);
+ template<int Chip> void y8950_map(address_map &map);
template<int Chip> void ymf278b_map(address_map &map);
template<int Chip> void ymf271_map(address_map &map);
template<int Chip> void ymz280b_map(address_map &map);
@@ -538,6 +556,7 @@ void vgmplay_device::device_reset()
s.timer->enable(false);
}
+ m_sega32x_channel_hack = 0;
m_nes_apu_channel_hack[0] = 0;
m_nes_apu_channel_hack[1] = 0;
}
@@ -624,6 +643,8 @@ void vgmplay_device::blocks_clear()
m_data_streams[i].clear();
m_data_stream_blocks[i].clear();
}
+
+ m_dec_table.entries.clear();
}
uint32_t vgmplay_device::handle_data_block(uint32_t address)
@@ -657,8 +678,10 @@ uint32_t vgmplay_device::handle_data_block(uint32_t address)
uint8_t cmp_sub_type = m_file->read_byte(m_pc + 0x0e);
uint16_t add_val = m_file->read_word(m_pc + 0x0f);
- if (cmp_sub_type == 0x02)
- osd_printf_error("unhandled n-bit compressed stream size %x->%x type %02x bit_dec %02x bit_cmp %02x unsupported cmp_sub_type %02x add_val %04x\n", size, out_size, type - 0x40, bit_dec, bit_cmp, cmp_sub_type, add_val);
+ if (cmp_sub_type == 0x02 && m_dec_table.entries.size() == 0)
+ osd_printf_error("invalid n-bit compressed stream, no decompression table\n");
+ else if (cmp_sub_type == 0x02 && (m_dec_table.cmp_type != cmp_type || m_dec_table.cmp_sub_type != cmp_sub_type || m_dec_table.bit_dec != bit_dec || m_dec_table.bit_cmp != bit_cmp ))
+ osd_printf_error("invalid n-bit compressed stream, decompression table mismatch\n");
else
{
int in_pos = 0x11 - 0x07;
@@ -705,8 +728,15 @@ uint32_t vgmplay_device::handle_data_block(uint32_t address)
out_val = in_val + add_val;
else if (cmp_sub_type == 1)
out_val = (in_val << (bit_dec - bit_cmp)) + add_val;
+ else if (cmp_sub_type == 2)
+ {
+ if (bit_dec <= 8)
+ out_val = m_dec_table.entries[in_val];
+ else if (bit_dec <= 16)
+ out_val = m_dec_table.entries[in_val << 1] | (m_dec_table.entries[(in_val << 1) + 1] << 8);
+ }
else
- osd_printf_error("unhandled n-bit compressed stream size %x->%x type %02x bit_dec %02x bit_cmp %02x unsupported cmp_sub_type %02x add_val %04x\n", size, out_size, type - 0x40, bit_dec, bit_cmp, cmp_sub_type, add_val);
+ osd_printf_error("invalid n-bit compressed stream size %x->%x type %02x bit_dec %02x bit_cmp %02x unsupported cmp_sub_type %02x add_val %04x\n", size, out_size, type - 0x40, bit_dec, bit_cmp, cmp_sub_type, add_val);
for (int i = 0; i < bit_dec; i += 8)
{
@@ -726,9 +756,17 @@ uint32_t vgmplay_device::handle_data_block(uint32_t address)
else
osd_printf_error("unhandled unknown %02x compressed stream size %x->%x type %02x\n", cmp_type, size, out_size, type - 0x40);
}
- else if (type < 0x80)
- osd_printf_error("unhandled compression table size %x\n", size);
-
+ else if (type == 0x7f)
+ {
+ m_dec_table.cmp_type = m_file->read_byte(m_pc + 0x07);
+ m_dec_table.cmp_sub_type = m_file->read_byte(m_pc + 0x08);
+ m_dec_table.bit_dec = m_file->read_byte(m_pc + 0x09);
+ m_dec_table.bit_cmp = m_file->read_byte(m_pc + 0x0a);
+
+ m_dec_table.entries.resize(m_file->read_word(m_pc + 0x0b) * ((m_dec_table.bit_dec + 7) / 8));
+ for (size_t i = 0; i < m_dec_table.entries.size(); i++)
+ m_dec_table.entries[i] = m_file->read_byte(m_pc + 0x0d + i);
+ }
else if (type < 0xc0)
{
uint32_t rom_size = m_file->read_dword(m_pc + 7);
@@ -825,13 +863,33 @@ TIMER_CALLBACK_MEMBER(vgmplay_device::stream_timer_expired)
else
offset += s.position * s.step_size * s.byte_depth;
- if (offset + s.byte_depth >= m_data_streams[s.bank].size())
+ if (offset + s.byte_depth > m_data_streams[s.bank].size())
{
- osd_printf_error("stream_timer_expired %02x: stream beyond end %u>=%u\n", param, offset, uint32_t(m_data_streams[s.bank].size()));
+ osd_printf_error("stream_timer_expired %02x: stream beyond end %d/%d %u>=%u\n", param, s.position, s.length, offset, uint32_t(m_data_streams[s.bank].size()));
s.timer->enable(false);
}
+ else if (s.chip_type == LED_YM2612)
+ {
+ m_io->write_byte(A_YM2612_0 + 0 + ((s.port & 1) << 1), s.reg);
+ m_io->write_byte(A_YM2612_0 + 1 + ((s.port & 1) << 1), m_data_streams[s.bank][offset]);
+ }
+ else if (s.chip_type == LED_YM2608)
+ {
+ m_io->write_byte(A_YM2608_0 + 0 + ((s.port & 1) << 1), s.reg);
+ m_io->write_byte(A_YM2608_0 + 1 + ((s.port & 1) << 1), m_data_streams[s.bank][offset]);
+ }
else if (s.chip_type == LED_32X_PWM)
+ {
+ if (m_sega32x_channel_hack >= 0)
+ {
+ osd_printf_error("bad rip detected, enabling sega32x channels\n");
+ m_io16->write_word(A_32X_PWM, 5);
+
+ m_sega32x_channel_hack = -2;
+ }
+
m_io16->write_word(A_32X_PWM + (s.reg << 1), ((m_data_streams[s.bank][offset + 1] & 0xf) << 8) | m_data_streams[s.bank][offset]);
+ }
else if (s.chip_type == LED_OKIM6258)
m_io->write_byte(A_OKIM6258_0 + s.reg, m_data_streams[s.bank][offset]);
else
@@ -1380,10 +1438,24 @@ void vgmplay_device::execute_run()
uint8_t offset = m_file->read_byte(m_pc + 1);
uint8_t data = m_file->read_byte(m_pc + 2);
- if ((offset & 0xf0) == 0 && data == 0)
+ if (m_sega32x_channel_hack >= 0)
{
- osd_printf_error("bad rip detected, enabling sega32x channels\n");
- data |= 5;
+ if ((offset & 0xf0) == 0)
+ {
+ if (data != 0)
+ m_sega32x_channel_hack = -1;
+ }
+ else
+ {
+ m_sega32x_channel_hack++;
+ if (m_sega32x_channel_hack == 32)
+ {
+ osd_printf_error("bad rip detected, enabling sega32x channels\n");
+ m_io16->write_word(A_32X_PWM, 5);
+
+ m_sega32x_channel_hack = -2;
+ }
+ }
}
m_io16->write_word(A_32X_PWM + ((offset & 0xf0) >> 3), ((offset & 0xf) << 8) | data);
@@ -1431,11 +1503,11 @@ void vgmplay_device::execute_run()
}
}
}
- else if ((offset & 0x7f) == 0x15 && m_nes_apu_channel_hack[chip] == -2 && (m_file->read_byte(m_pc + 2) & 0x1f) != 0)
- {
- osd_printf_error("bad rip false positive, late enabling nesapu.%d channels\n", chip);
- m_nes_apu_channel_hack[chip] = -1;
- }
+ //else if ((offset & 0x7f) == 0x15 && m_nes_apu_channel_hack[chip] == -2 && (m_file->read_byte(m_pc + 2) & 0x1f) != 0)
+ //{
+ // osd_printf_error("bad rip false positive, late enabling nesapu.%d channels %x/%x\n", chip, m_pc, m_io->read_dword(REG_SIZE));
+ // m_nes_apu_channel_hack[chip] = -1;
+ //}
if (offset & 0x80)
m_io->write_byte(A_NESAPU_1 + (offset & 0x7f), m_file->read_byte(m_pc + 2));
@@ -1963,7 +2035,7 @@ offs_t vgmplay_disassembler::disassemble(std::ostream &stream, offs_t pc, const
"ymf278b.%d rom",
"ymf271.%d rom",
"ymz280b.%d rom",
- "ymf278b.%d rom",
+ "ymf278b.%d ram",
"y8950.%d delta-t rom",
"multipcm.%d rom",
"upd7759.%d rom",
@@ -2008,7 +2080,7 @@ offs_t vgmplay_disassembler::disassemble(std::ostream &stream, offs_t pc, const
}
else if (type < 0x7f)
util::stream_format(stream, "unknown%02x.%d stream comp. data-block %x", type - 0x40, second, size);
- else if (type < 0x80)
+ else if (type == 0x7f)
util::stream_format(stream, "decomp-table %x, %02x/%02x", size, opcodes.r8(pc + 7), opcodes.r8(pc + 8));
else if (type < 0x94)
{
@@ -2065,27 +2137,27 @@ offs_t vgmplay_disassembler::disassemble(std::ostream &stream, offs_t pc, const
return 1 | SUPPORTED;
case 0x90:
- util::stream_format(stream, "stream control %02x %02x %02x %02x\n", opcodes.r8(pc + 1), opcodes.r8(pc + 2), opcodes.r8(pc + 3), opcodes.r8(pc + 4));
+ util::stream_format(stream, "stream control %02x %02x %02x %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2), opcodes.r8(pc + 3), opcodes.r8(pc + 4));
return 5 | SUPPORTED;
case 0x91:
- util::stream_format(stream, "stream data %02x %02x %02x %02x\n", opcodes.r8(pc + 1), opcodes.r8(pc + 2), opcodes.r8(pc + 3), opcodes.r8(pc + 4));
+ util::stream_format(stream, "stream data %02x %02x %02x %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2), opcodes.r8(pc + 3), opcodes.r8(pc + 4));
return 5 | SUPPORTED;
case 0x92:
- util::stream_format(stream, "stream frequency %02x %d\n", opcodes.r8(pc + 1), opcodes.r32(pc + 2));
+ util::stream_format(stream, "stream frequency %02x %d", opcodes.r8(pc + 1), opcodes.r32(pc + 2));
return 6 | SUPPORTED;
case 0x93:
- util::stream_format(stream, "stream start %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", opcodes.r8(pc + 1), opcodes.r8(pc + 2), opcodes.r8(pc + 3), opcodes.r8(pc + 4), opcodes.r8(pc + 5), opcodes.r8(pc + 6), opcodes.r8(pc + 7), opcodes.r8(pc + 8), opcodes.r8(pc + 9), opcodes.r8(pc + 10));
+ util::stream_format(stream, "stream start %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2), opcodes.r8(pc + 3), opcodes.r8(pc + 4), opcodes.r8(pc + 5), opcodes.r8(pc + 6), opcodes.r8(pc + 7), opcodes.r8(pc + 8), opcodes.r8(pc + 9), opcodes.r8(pc + 10));
return 11 | SUPPORTED;
case 0x94:
- util::stream_format(stream, "stream stop %02x\n", opcodes.r8(pc + 1));
+ util::stream_format(stream, "stream stop %02x", opcodes.r8(pc + 1));
return 2 | SUPPORTED;
case 0x95:
- util::stream_format(stream, "stream start short %02x %02x %02x %02x\n", opcodes.r8(pc + 1), opcodes.r8(pc + 2), opcodes.r8(pc + 3), opcodes.r8(pc + 4));
+ util::stream_format(stream, "stream start short %02x %02x %02x %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2), opcodes.r8(pc + 3), opcodes.r8(pc + 4));
return 5 | SUPPORTED;
case 0xa0:
@@ -2308,6 +2380,24 @@ READ8_MEMBER(vgmplay_device::segapcm_rom_r)
}
template<int Chip>
+READ8_MEMBER(vgmplay_device::ym2608_rom_r)
+{
+ return rom_r(Chip, 0x81, offset);
+}
+
+template<int Chip>
+READ8_MEMBER(vgmplay_device::ym2610_adpcm_a_rom_r)
+{
+ return rom_r(Chip, 0x82, offset);
+}
+
+template<int Chip>
+READ8_MEMBER(vgmplay_device::ym2610_adpcm_b_rom_r)
+{
+ return rom_r(Chip, 0x83, offset);
+}
+
+template<int Chip>
READ8_MEMBER(vgmplay_device::ymf278b_rom_r)
{
return rom_r(Chip, 0x84, offset);
@@ -2326,6 +2416,12 @@ READ8_MEMBER(vgmplay_device::ymz280b_rom_r)
}
template<int Chip>
+READ8_MEMBER(vgmplay_device::y8950_rom_r)
+{
+ return rom_r(Chip, 0x88, offset);
+}
+
+template<int Chip>
READ8_MEMBER(vgmplay_device::multipcm_rom_r)
{
if (m_multipcm_banked[Chip] == 1)
@@ -3176,6 +3272,30 @@ void vgmplay_state::rf5c68_map(address_map &map)
}
template<int Chip>
+void vgmplay_state::ym2608_map(address_map &map)
+{
+ map(0, 0x1fffff).r("vgmplay", FUNC(vgmplay_device::ym2608_rom_r<Chip>));
+}
+
+template<int Chip>
+void vgmplay_state::ym2610_adpcm_a_map(address_map &map)
+{
+ map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::ym2610_adpcm_a_rom_r<Chip>));
+}
+
+template<int Chip>
+void vgmplay_state::ym2610_adpcm_b_map(address_map &map)
+{
+ map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::ym2610_adpcm_b_rom_r<Chip>));
+}
+
+template<int Chip>
+void vgmplay_state::y8950_map(address_map &map)
+{
+ map(0, 0x1fffff).r("vgmplay", FUNC(vgmplay_device::y8950_rom_r<Chip>));
+}
+
+template<int Chip>
void vgmplay_state::ymf278b_map(address_map &map)
{
map(0, 0x3fffff).r("vgmplay", FUNC(vgmplay_device::ymf278b_rom_r<Chip>));
@@ -3360,21 +3480,27 @@ MACHINE_CONFIG_START(vgmplay_state::vgmplay)
// TODO: prevent error.log spew
YM2608(config, m_ym2608[0], 0);
+ m_ym2608[0]->set_addrmap(0, &vgmplay_state::ym2608_map<0>);
m_ym2608[0]->add_route(ALL_OUTPUTS, "lspeaker", 1);
m_ym2608[0]->add_route(ALL_OUTPUTS, "rspeaker", 1);
YM2608(config, m_ym2608[1], 0);
+ m_ym2608[1]->set_addrmap(0, &vgmplay_state::ym2608_map<1>);
m_ym2608[1]->add_route(ALL_OUTPUTS, "lspeaker", 1);
m_ym2608[1]->add_route(ALL_OUTPUTS, "rspeaker", 1);
// TODO: prevent error.log spew
YM2610(config, m_ym2610[0], 0);
+ m_ym2610[0]->set_addrmap(0, &vgmplay_state::ym2610_adpcm_a_map<0>);
+ m_ym2610[0]->set_addrmap(1, &vgmplay_state::ym2610_adpcm_b_map<0>);
m_ym2610[0]->add_route(0, "lspeaker", 0.25);
m_ym2610[0]->add_route(0, "rspeaker", 0.25);
m_ym2610[0]->add_route(1, "lspeaker", 0.50);
m_ym2610[0]->add_route(2, "rspeaker", 0.50);
YM2610(config, m_ym2610[1], 0);
+ m_ym2610[1]->set_addrmap(0, &vgmplay_state::ym2610_adpcm_a_map<1>);
+ m_ym2610[1]->set_addrmap(1, &vgmplay_state::ym2610_adpcm_b_map<1>);
m_ym2610[1]->add_route(0, "lspeaker", 0.25);
m_ym2610[1]->add_route(0, "rspeaker", 0.25);
m_ym2610[1]->add_route(1, "lspeaker", 0.50);
@@ -3397,10 +3523,12 @@ MACHINE_CONFIG_START(vgmplay_state::vgmplay)
m_ym3526[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.5);
Y8950(config, m_y8950[0], 0);
+ m_y8950[0]->set_addrmap(0, &vgmplay_state::y8950_map<0>);
m_y8950[0]->add_route(ALL_OUTPUTS, "lspeaker", 0.40);
m_y8950[0]->add_route(ALL_OUTPUTS, "rspeaker", 0.40);
Y8950(config, m_y8950[1], 0);
+ m_y8950[1]->set_addrmap(0, &vgmplay_state::y8950_map<1>);
m_y8950[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.40);
m_y8950[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.40);
@@ -3693,13 +3821,6 @@ MACHINE_CONFIG_START(vgmplay_state::vgmplay)
MACHINE_CONFIG_END
ROM_START( vgmplay )
- // TODO: change sound cores to device_rom_interface
- ROM_REGION( 0x80000, "ym2608.0", ROMREGION_ERASE00 )
- ROM_REGION( 0x80000, "ym2608.1", ROMREGION_ERASE00 )
- ROM_REGION( 0x80000, "ym2610.0", ROMREGION_ERASE00 )
- ROM_REGION( 0x80000, "ym2610.1", ROMREGION_ERASE00 )
- ROM_REGION( 0x80000, "y8950.0", ROMREGION_ERASE00 )
- ROM_REGION( 0x80000, "y8950.1", ROMREGION_ERASE00 )
// TODO: split up 32x to remove dependencies
ROM_REGION( 0x4000, "master", ROMREGION_ERASE00 )
ROM_REGION( 0x4000, "slave", ROMREGION_ERASE00 )
diff --git a/src/mame/drivers/video21.cpp b/src/mame/drivers/video21.cpp
index 5bece7ad699..c4c282d8318 100644
--- a/src/mame/drivers/video21.cpp
+++ b/src/mame/drivers/video21.cpp
@@ -19,7 +19,7 @@ To Do:
- unknown status bits? eg. hopper
- color overlay as seen on flyer upright cabinet
-When booted, press W to get it going.
+When booted, press Key out (mapped to W by default) to get it going.
*******************************************************************************************/
@@ -132,8 +132,8 @@ static INPUT_PORTS_START( video21 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_TAKE )
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_GAMBLE_HIGH ) PORT_NAME("Stay")
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_GAMBLE_KEYOUT ) PORT_NAME("Payout")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_GAMBLE_STAND )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_GAMBLE_KEYOUT )
PORT_DIPNAME( 0x40, 0x40, "42b6" )
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
@@ -221,4 +221,3 @@ ROM_START( video21 )
ROM_END
GAME(1980, video21, 0, video21, video21, video21_state, empty_init, ROT0, "Video Games GmbH", "Video 21", MACHINE_NO_SOUND)
-
diff --git a/src/mame/drivers/vixen.cpp b/src/mame/drivers/vixen.cpp
index 9751536838a..9f349bcae61 100644
--- a/src/mame/drivers/vixen.cpp
+++ b/src/mame/drivers/vixen.cpp
@@ -292,8 +292,7 @@ void vixen_state::vixen_io(address_map &map)
map(0x18, 0x18).mirror(0x07).r(FUNC(vixen_state::ieee488_r));
map(0x20, 0x21).mirror(0x04).w(m_io_i8155, FUNC(i8155_device::ale_w));
map(0x28, 0x28).mirror(0x05).rw(m_io_i8155, FUNC(i8155_device::read), FUNC(i8155_device::write));
- map(0x30, 0x30).mirror(0x06).rw(m_usart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x31, 0x31).mirror(0x06).rw(m_usart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x30, 0x31).mirror(0x06).rw(m_usart, FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x38, 0x38).mirror(0x07).r(FUNC(vixen_state::port3_r));
// AM_RANGE(0xf0, 0xff) Hard Disk?
}
diff --git a/src/mame/drivers/vk100.cpp b/src/mame/drivers/vk100.cpp
index 3090162f4e1..0b9fa43acb5 100644
--- a/src/mame/drivers/vk100.cpp
+++ b/src/mame/drivers/vk100.cpp
@@ -749,15 +749,13 @@ void vk100_state::vk100_io(address_map &map)
map(0x64, 0x67).mirror(0x80).w(FUNC(vk100_state::vgEX)); //EX MOV, DOT, VEC, ER
map(0x68, 0x68).mirror(0x83).w(FUNC(vk100_state::KBDW)); //KBDW (probably AM_MIRROR(0x03))
map(0x6C, 0x6C).mirror(0x83).w(COM5016T_TAG, FUNC(com8116_device::stt_str_w)); //LD BAUD (baud rate clock divider setting for i8251 tx and rx clocks) (probably AM_MIRROR(0x03))
- map(0x70, 0x70).mirror(0x82).w(m_uart, FUNC(i8251_device::data_w)); //LD COMD (i8251 data reg)
- map(0x71, 0x71).mirror(0x82).w(m_uart, FUNC(i8251_device::control_w)); //LD COM (i8251 control reg)
+ map(0x70, 0x71).mirror(0x82).w(m_uart, FUNC(i8251_device::write)); //LD COMD
//AM_RANGE (0x74, 0x74) AM_MIRROR(0x83) AM_WRITE(unknown_74)
//AM_RANGE (0x78, 0x78) AM_MIRROR(0x83) AM_WRITE(kbdw) //KBDW ?(mirror?)
//AM_RANGE (0x7C, 0x7C) AM_MIRROR(0x83) AM_WRITE(unknown_7C)
map(0x40, 0x47).mirror(0x80).r(FUNC(vk100_state::SYSTAT_A)); // SYSTAT A (state machine done and last 4 bits of vram, as well as dipswitches)
map(0x48, 0x48).mirror(0x87/*0x80*/).r(FUNC(vk100_state::SYSTAT_B)); // SYSTAT B (uart stuff)
- map(0x50, 0x50).mirror(0x86).r(m_uart, FUNC(i8251_device::data_r)); // UART O
- map(0x51, 0x51).mirror(0x86).r(m_uart, FUNC(i8251_device::status_r)); // UAR
+ map(0x50, 0x51).mirror(0x86).r(m_uart, FUNC(i8251_device::read)); // UART O
//AM_RANGE (0x58, 0x58) AM_MIRROR(0x87) AM_READ(unknown_58)
//AM_RANGE (0x60, 0x60) AM_MIRROR(0x87) AM_READ(unknown_60)
//AM_RANGE (0x68, 0x68) AM_MIRROR(0x87) AM_READ(unknown_68) // NOT USED
diff --git a/src/mame/drivers/votrpss.cpp b/src/mame/drivers/votrpss.cpp
index 29148b476b1..2406bf53c2d 100644
--- a/src/mame/drivers/votrpss.cpp
+++ b/src/mame/drivers/votrpss.cpp
@@ -136,8 +136,7 @@ void votrpss_state::votrpss_io(address_map &map)
{
map.global_mask(0xff);
map(0x00, 0x03).mirror(0x3c).rw(m_ppi, FUNC(i8255_device::read), FUNC(i8255_device::write));
- map(0x40, 0x40).mirror(0x3e).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x41, 0x41).mirror(0x3e).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x40, 0x41).mirror(0x3e).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x80, 0x83).mirror(0x3c).rw("pit", FUNC(pit8253_device::read), FUNC(pit8253_device::write));
map(0xc0, 0xc0).mirror(0x3e).rw("ay", FUNC(ay8910_device::data_r), FUNC(ay8910_device::address_w));
map(0xc1, 0xc1).mirror(0x3e).rw("ay", FUNC(ay8910_device::data_r), FUNC(ay8910_device::data_w));
diff --git a/src/mame/drivers/vp122.cpp b/src/mame/drivers/vp122.cpp
index 4f96e34bd76..704659218ec 100644
--- a/src/mame/drivers/vp122.cpp
+++ b/src/mame/drivers/vp122.cpp
@@ -61,8 +61,7 @@ void vp122_state::io_map(address_map &map)
{
map(0x00, 0x07).rw("avdc", FUNC(scn2674_device::read), FUNC(scn2674_device::write));
map(0x10, 0x1f).rw("duart", FUNC(scn2681_device::read), FUNC(scn2681_device::write));
- map(0x20, 0x20).rw("usart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x21, 0x21).rw("usart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x20, 0x21).rw("usart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x50, 0x50).rw("avdc", FUNC(scn2674_device::buffer_r), FUNC(scn2674_device::buffer_w));
map(0x60, 0x60).rw("avdc", FUNC(scn2674_device::attr_buffer_r), FUNC(scn2674_device::attr_buffer_w));
map(0x70, 0x73).w("pit", FUNC(pit8253_device::write));
diff --git a/src/mame/drivers/vt100.cpp b/src/mame/drivers/vt100.cpp
index d886f42c362..5d10f0d04f5 100644
--- a/src/mame/drivers/vt100.cpp
+++ b/src/mame/drivers/vt100.cpp
@@ -190,8 +190,7 @@ void vt100_state::vt100_io(address_map &map)
map.unmap_value_high();
map.global_mask(0xff);
// 0x00, 0x01 PUSART (Intel 8251)
- map(0x00, 0x00).rw(m_pusart, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x01, 0x01).rw(m_pusart, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x00, 0x01).rw(m_pusart, FUNC(i8251_device::read), FUNC(i8251_device::write));
// 0x02 Baud rate generator
map(0x02, 0x02).w("dbrg", FUNC(com8116_device::stt_str_w));
// 0x22 Modem buffer
@@ -353,7 +352,7 @@ MACHINE_CONFIG_START(vt100_state::vt100)
dbrg.fr_handler().set(m_pusart, FUNC(i8251_device::write_rxc));
dbrg.ft_handler().set(m_pusart, FUNC(i8251_device::write_txc));
- ER1400(config, m_nvr, 0);
+ ER1400(config, m_nvr);
VT100_KEYBOARD(config, m_keyboard, 0).signal_out_callback().set(m_kbduart, FUNC(ay31015_device::write_si));
diff --git a/src/mame/drivers/xor100.cpp b/src/mame/drivers/xor100.cpp
index 92e00a2856b..4fa4b8b013f 100644
--- a/src/mame/drivers/xor100.cpp
+++ b/src/mame/drivers/xor100.cpp
@@ -257,10 +257,8 @@ void xor100_state::xor100_mem(address_map &map)
void xor100_state::xor100_io(address_map &map)
{
map.global_mask(0xff);
- map(0x00, 0x00).rw(m_uart_a, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x01, 0x01).rw(m_uart_a, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0x02, 0x02).rw(m_uart_b, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x03, 0x03).rw(m_uart_b, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x00, 0x01).rw(m_uart_a, FUNC(i8251_device::read), FUNC(i8251_device::write));
+ map(0x02, 0x03).rw(m_uart_b, FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x04, 0x07).rw(I8255A_TAG, FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0x08, 0x08).w(FUNC(xor100_state::mmu_w));
map(0x09, 0x09).w(FUNC(xor100_state::prom_toggle_w));
diff --git a/src/mame/drivers/zn.cpp b/src/mame/drivers/zn.cpp
index b6eb60e5b30..6a4a7d6f5d0 100644
--- a/src/mame/drivers/zn.cpp
+++ b/src/mame/drivers/zn.cpp
@@ -71,8 +71,7 @@ public:
m_rombank(*this, "rombank%u", 1),
m_soundbank(*this, "soundbank"),
m_okibank(*this, "okibank"),
- m_znmcu_dataout(1),
- m_znmcu_dsrout(1)
+ m_znmcu_dataout(1)
{
std::fill(std::begin(m_cat702_dataout), std::end(m_cat702_dataout), 1);
}
@@ -80,6 +79,7 @@ public:
void zn1_1mb_vram(machine_config &config);
void zn1_2mb_vram(machine_config &config);
void zn2(machine_config &config);
+ void gameboard_cat702(machine_config &config);
void jdredd(machine_config &config);
void coh1002msnd(machine_config &config);
void coh1002tb(machine_config &config);
@@ -110,13 +110,9 @@ public:
DECLARE_CUSTOM_INPUT_MEMBER(jdredd_gun_mux_read);
private:
- DECLARE_WRITE_LINE_MEMBER(sio0_sck){ m_cat702[0]->write_clock(state); m_cat702[1]->write_clock(state); m_znmcu->write_clock(state); }
- DECLARE_WRITE_LINE_MEMBER(sio0_txd){ m_cat702[0]->write_datain(state); m_cat702[1]->write_datain(state); }
- template<int Chip> DECLARE_WRITE_LINE_MEMBER(cat702_dataout){ m_cat702_dataout[Chip] = state; update_sio0_rxd(); }
- DECLARE_WRITE_LINE_MEMBER(znmcu_dataout){ m_znmcu_dataout = state; update_sio0_rxd(); }
- DECLARE_WRITE_LINE_MEMBER(znmcu_dsrout){ m_znmcu_dsrout = state; update_sio0_dsr(); }
- void update_sio0_rxd(){ m_sio0->write_rxd(m_cat702_dataout[0] && m_cat702_dataout[1] && m_znmcu_dataout); }
- void update_sio0_dsr(){ m_sio0->write_dsr(m_znmcu_dsrout); }
+ template<int Chip> DECLARE_WRITE_LINE_MEMBER(cat702_dataout) { m_cat702_dataout[Chip] = state; update_sio0_rxd(); }
+ DECLARE_WRITE_LINE_MEMBER(znmcu_dataout) { m_znmcu_dataout = state; update_sio0_rxd(); }
+ void update_sio0_rxd() { m_sio0->write_rxd(m_cat702_dataout[0] && m_cat702_dataout[1] && m_znmcu_dataout); }
DECLARE_READ8_MEMBER(znsecsel_r);
DECLARE_WRITE8_MEMBER(znsecsel_w);
DECLARE_READ8_MEMBER(boardconfig_r);
@@ -221,7 +217,7 @@ private:
required_device<psxgpu_device> m_gpu;
required_device<screen_device> m_gpu_screen;
required_device<psxsio0_device> m_sio0;
- required_device_array<cat702_device, 2> m_cat702;
+ optional_device_array<cat702_device, 2> m_cat702;
required_device<znmcu_device> m_znmcu;
required_device<cpu_device> m_maincpu;
optional_device<cpu_device> m_audiocpu;
@@ -241,7 +237,6 @@ private:
int m_cat702_dataout[2];
int m_znmcu_dataout;
- int m_znmcu_dsrout;
};
inline void ATTR_PRINTF(3,4) zn_state::verboselog( int n_level, const char *s_fmt, ... )
@@ -262,7 +257,6 @@ void zn_state::machine_start()
save_item(NAME(m_n_znsecsel));
save_item(NAME(m_cat702_dataout));
save_item(NAME(m_znmcu_dataout));
- save_item(NAME(m_znmcu_dsrout));
}
@@ -288,8 +282,8 @@ WRITE8_MEMBER(zn_state::znsecsel_w)
{
verboselog(2, "znsecsel_w( %08x, %08x, %08x )\n", offset, data, mem_mask );
- m_cat702[0]->write_select(BIT(data, 2));
- m_cat702[1]->write_select(BIT(data, 3));
+ if (m_cat702[0]) m_cat702[0]->write_select(BIT(data, 2));
+ if (m_cat702[1]) m_cat702[1]->write_select(BIT(data, 3));
m_znmcu->write_select((data & 0x8c) != 0x8c);
// BIT(data,4); // read analogue controls?
@@ -383,27 +377,25 @@ void zn_state::zn_map(address_map &map)
MACHINE_CONFIG_START(zn_state::zn1_1mb_vram)
/* basic machine hardware */
- MCFG_DEVICE_ADD( m_maincpu, CXD8530CQ, XTAL(67'737'600) )
- MCFG_DEVICE_PROGRAM_MAP( zn_map)
+ CXD8530CQ(config, m_maincpu, XTAL(67'737'600));
+ m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::zn_map);
- subdevice<ram_device>("maincpu:ram")->set_default_size("4M");
+ m_maincpu->subdevice<ram_device>("ram")->set_default_size("4M");
- MCFG_DEVICE_MODIFY("maincpu:sio0")
- MCFG_PSX_SIO_SCK_HANDLER(WRITELINE(*this, zn_state, sio0_sck))
- MCFG_PSX_SIO_TXD_HANDLER(WRITELINE(*this, zn_state, sio0_txd))
+ auto &sio0(*m_maincpu->subdevice<psxsio0_device>("sio0"));
+ sio0.sck_handler().set(m_cat702[0], FUNC(cat702_device::write_clock));
+ sio0.sck_handler().append(m_znmcu, FUNC(znmcu_device::write_clock));
+ sio0.txd_handler().set(m_cat702[0], FUNC(cat702_device::write_datain));
- MCFG_DEVICE_ADD("cat702_1", CAT702, 0)
- MCFG_CAT702_DATAOUT_HANDLER(WRITELINE(*this, zn_state, cat702_dataout<0>))
+ CAT702(config, m_cat702[0], 0);
+ m_cat702[0]->dataout_handler().set(FUNC(zn_state::cat702_dataout<0>));
- MCFG_DEVICE_ADD("cat702_2", CAT702, 0)
- MCFG_CAT702_DATAOUT_HANDLER(WRITELINE(*this, zn_state, cat702_dataout<1>))
-
- MCFG_DEVICE_ADD("znmcu", ZNMCU, 0)
- MCFG_ZNMCU_DATAOUT_HANDLER(WRITELINE(*this, zn_state, znmcu_dataout))
- MCFG_ZNMCU_DSR_HANDLER(WRITELINE(*this, zn_state, znmcu_dsrout))
- MCFG_ZNMCU_DSW_HANDLER(IOPORT("DSW"))
- MCFG_ZNMCU_ANALOG1_HANDLER(IOPORT("ANALOG1"))
- MCFG_ZNMCU_ANALOG2_HANDLER(IOPORT("ANALOG2"))
+ ZNMCU(config, m_znmcu, 0);
+ m_znmcu->dataout_handler().set(FUNC(zn_state::znmcu_dataout));
+ m_znmcu->dsr_handler().set("maincpu:sio0", FUNC(psxsio0_device::write_dsr));
+ m_znmcu->dsw_handler().set_ioport("DSW");
+ m_znmcu->analog1_handler().set_ioport("ANALOG1");
+ m_znmcu->analog2_handler().set_ioport("ANALOG2");
/* video hardware */
MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8561Q, 0x100000, XTAL(53'693'175) )
@@ -433,27 +425,25 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(zn_state::zn2)
/* basic machine hardware */
- MCFG_DEVICE_ADD( m_maincpu, CXD8661R, XTAL(100'000'000) )
- MCFG_DEVICE_PROGRAM_MAP( zn_map)
-
- subdevice<ram_device>("maincpu:ram")->set_default_size("4M");
+ CXD8661R(config, m_maincpu, XTAL(100'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::zn_map);
- MCFG_DEVICE_MODIFY("maincpu:sio0")
- MCFG_PSX_SIO_SCK_HANDLER(WRITELINE(*this, zn_state, sio0_sck))
- MCFG_PSX_SIO_TXD_HANDLER(WRITELINE(*this, zn_state, sio0_txd))
+ m_maincpu->subdevice<ram_device>("ram")->set_default_size("4M");
- MCFG_DEVICE_ADD("cat702_1", CAT702, 0)
- MCFG_CAT702_DATAOUT_HANDLER(WRITELINE(*this, zn_state, cat702_dataout<0>))
+ auto &sio0(*m_maincpu->subdevice<psxsio0_device>("sio0"));
+ sio0.sck_handler().set(m_cat702[0], FUNC(cat702_device::write_clock));
+ sio0.sck_handler().append(m_znmcu, FUNC(znmcu_device::write_clock));
+ sio0.txd_handler().set(m_cat702[0], FUNC(cat702_device::write_datain));
- MCFG_DEVICE_ADD("cat702_2", CAT702, 0)
- MCFG_CAT702_DATAOUT_HANDLER(WRITELINE(*this, zn_state, cat702_dataout<1>))
+ CAT702(config, m_cat702[0], 0);
+ m_cat702[0]->dataout_handler().set(FUNC(zn_state::cat702_dataout<0>));
- MCFG_DEVICE_ADD("znmcu", ZNMCU, 0)
- MCFG_ZNMCU_DATAOUT_HANDLER(WRITELINE(*this, zn_state, znmcu_dataout))
- MCFG_ZNMCU_DSR_HANDLER(WRITELINE(*this, zn_state, znmcu_dsrout))
- MCFG_ZNMCU_DSW_HANDLER(IOPORT("DSW"))
- MCFG_ZNMCU_ANALOG1_HANDLER(IOPORT("ANALOG1"))
- MCFG_ZNMCU_ANALOG2_HANDLER(IOPORT("ANALOG2"))
+ ZNMCU(config, m_znmcu, 0);
+ m_znmcu->dataout_handler().set(FUNC(zn_state::znmcu_dataout));
+ m_znmcu->dsr_handler().set("maincpu:sio0", FUNC(psxsio0_device::write_dsr));
+ m_znmcu->dsw_handler().set_ioport("DSW");
+ m_znmcu->analog1_handler().set_ioport("ANALOG1");
+ m_znmcu->analog2_handler().set_ioport("ANALOG2");
/* video hardware */
MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8654Q, 0x200000, XTAL(53'693'175) )
@@ -474,6 +464,16 @@ MACHINE_CONFIG_START(zn_state::zn2)
MCFG_DEVICE_ADD("at28c16", AT28C16, 0)
MACHINE_CONFIG_END
+void zn_state::gameboard_cat702(machine_config &config)
+{
+ auto &sio0(*m_maincpu->subdevice<psxsio0_device>("sio0"));
+ sio0.sck_handler().append(m_cat702[1], FUNC(cat702_device::write_clock));
+ sio0.txd_handler().append(m_cat702[1], FUNC(cat702_device::write_datain));
+
+ CAT702(config, m_cat702[1], 0);
+ m_cat702[1]->dataout_handler().set(FUNC(zn_state::cat702_dataout<1>));
+}
+
/*
Capcom ZN1 generic PCB Layout
----------------------------
@@ -659,8 +659,9 @@ void zn_state::qsound_portmap(address_map &map)
MACHINE_CONFIG_START(zn_state::coh1000c)
zn1_1mb_vram(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(coh1000c_map)
+ gameboard_cat702(config);
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::coh1000c_map);
MCFG_DEVICE_ADD(m_audiocpu, Z80, XTAL(8'000'000))
MCFG_DEVICE_PROGRAM_MAP(qsound_map)
@@ -684,8 +685,9 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(zn_state::coh1002c)
zn1_2mb_vram(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(coh1000c_map)
+ gameboard_cat702(config);
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::coh1000c_map);
MCFG_DEVICE_ADD(m_audiocpu, Z80, XTAL(8'000'000))
MCFG_DEVICE_PROGRAM_MAP(qsound_map)
@@ -845,8 +847,9 @@ Notes:
MACHINE_CONFIG_START(zn_state::coh3002c)
zn2(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(coh1000c_map)
+ gameboard_cat702(config);
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::coh1000c_map);
MCFG_DEVICE_ADD(m_audiocpu, Z80, XTAL(8'000'000))
MCFG_DEVICE_PROGRAM_MAP(qsound_map)
@@ -1141,8 +1144,9 @@ void zn_state::fx1a_sound_map(address_map &map)
MACHINE_CONFIG_START(zn_state::coh1000ta)
zn1_1mb_vram(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(coh1000ta_map)
+ gameboard_cat702(config);
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::coh1000ta_map);
MCFG_DEVICE_ADD(m_audiocpu, Z80, XTAL(16'000'000) / 4) /* 4 MHz */
MCFG_DEVICE_PROGRAM_MAP(fx1a_sound_map)
@@ -1197,10 +1201,10 @@ void zn_state::init_coh1000tb()
MACHINE_CONFIG_START(zn_state::coh1000tb)
zn1_1mb_vram(config);
+ gameboard_cat702(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(coh1000tb_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::coh1000tb_map);
MCFG_MACHINE_START_OVERRIDE(zn_state, coh1000ta)
MCFG_MACHINE_RESET_OVERRIDE(zn_state, coh1000ta)
@@ -1221,10 +1225,10 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(zn_state::coh1002tb)
zn1_2mb_vram(config);
+ gameboard_cat702(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(coh1000tb_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::coh1000tb_map);
MCFG_MACHINE_START_OVERRIDE(zn_state, coh1000ta)
MCFG_MACHINE_RESET_OVERRIDE(zn_state, coh1000ta)
@@ -1471,8 +1475,9 @@ void zn_state::coh1000w_map(address_map &map)
MACHINE_CONFIG_START(zn_state::coh1000w)
zn1_2mb_vram(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(coh1000w_map)
+ gameboard_cat702(config);
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::coh1000w_map);
subdevice<ram_device>("maincpu:ram")->set_default_size("8M");
@@ -1691,8 +1696,9 @@ void zn_state::oki_map(address_map &map)
MACHINE_CONFIG_START(zn_state::coh1002e)
zn1_2mb_vram(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(coh1002e_map)
+ gameboard_cat702(config);
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::coh1002e_map);
MCFG_DEVICE_ADD(m_audiocpu, M68000, XTAL(12'000'000))
MCFG_DEVICE_PROGRAM_MAP(psarc_snd_map)
@@ -1707,8 +1713,9 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(zn_state::beastrzrb)
zn1_2mb_vram(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(coh1002e_map)
+ gameboard_cat702(config); // TODO: hook up bootleg protection
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::coh1002e_map);
MCFG_DEVICE_ADD(m_audiocpu, AT89C4051, XTAL(12'000'000)) // clock unverified
MCFG_DEVICE_PROGRAM_MAP(beastrzrb_snd_map)
@@ -1847,8 +1854,9 @@ MACHINE_RESET_MEMBER(zn_state,bam2)
MACHINE_CONFIG_START(zn_state::bam2)
zn1_2mb_vram(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(bam2_map)
+ gameboard_cat702(config);
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::bam2_map);
MCFG_MACHINE_START_OVERRIDE(zn_state, bam2)
MCFG_MACHINE_RESET_OVERRIDE(zn_state, bam2)
@@ -2197,14 +2205,15 @@ void zn_state::jdredd_map(address_map &map)
MACHINE_CONFIG_START(zn_state::coh1000a)
zn1_2mb_vram(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(coh1000a_map)
+ gameboard_cat702(config);
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::coh1000a_map);
MACHINE_CONFIG_END
MACHINE_CONFIG_START(zn_state::nbajamex)
coh1000a(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(nbajamex_map)
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::nbajamex_map);
NVRAM(config, "71256", nvram_device::DEFAULT_ALL_1);
@@ -2218,8 +2227,8 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(zn_state::jdredd)
coh1000a(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(jdredd_map)
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::jdredd_map);
m_gpu_screen->screen_vblank().set(FUNC(zn_state::jdredd_vblank));
@@ -2385,8 +2394,9 @@ void zn_state::atlus_snd_map(address_map &map)
MACHINE_CONFIG_START(zn_state::coh1001l)
zn1_2mb_vram(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(coh1001l_map)
+ gameboard_cat702(config);
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::coh1001l_map);
MCFG_DEVICE_ADD(m_audiocpu, M68000, XTAL(10'000'000))
MCFG_DEVICE_PROGRAM_MAP(atlus_snd_map)
@@ -2441,8 +2451,9 @@ MACHINE_RESET_MEMBER(zn_state,coh1002v)
MACHINE_CONFIG_START(zn_state::coh1002v)
zn1_2mb_vram(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(coh1002v_map)
+ gameboard_cat702(config);
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::coh1002v_map);
MCFG_MACHINE_START_OVERRIDE(zn_state, coh1002v)
MCFG_MACHINE_RESET_OVERRIDE(zn_state, coh1002v)
@@ -2631,8 +2642,9 @@ MACHINE_RESET_MEMBER(zn_state,coh1002m)
MACHINE_CONFIG_START(zn_state::coh1002m)
zn1_2mb_vram(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(coh1002m_map)
+ gameboard_cat702(config);
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::coh1002m_map);
MCFG_MACHINE_START_OVERRIDE(zn_state, coh1002m)
MCFG_MACHINE_RESET_OVERRIDE(zn_state, coh1002m)
@@ -2688,8 +2700,7 @@ MACHINE_CONFIG_START(zn_state::coh1002msnd)
coh1002m(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(coh1002msnd_map)
+ m_maincpu->set_addrmap(AS_PROGRAM, &zn_state::coh1002msnd_map);
MCFG_DEVICE_ADD(m_audiocpu, Z80, XTAL(32'000'000)/8)
MCFG_DEVICE_PROGRAM_MAP(cbaj_z80_map)
@@ -4944,10 +4955,13 @@ ROM_START( beastrzrb ) /* bootleg board */
/* http://www.atmel.com/dyn/products/product_card.asp?family_id=604&family_name=8051+Architecture&part_id=1939 */
ROM_LOAD( "at89c4051", 0x000000, 0x001000, NO_DUMP ) /* undumped internal ROM */
- ROM_REGION( 0x180000, "oki", 0 )
+ ROM_REGION( 0x100000, "oki", 0 )
ROM_LOAD( "27c4096.1", 0x000000, 0x080000, CRC(217734a1) SHA1(de4f519215123c09b3b5f27509b4d74604b5e03d) )
ROM_LOAD( "27c4096.2", 0x080000, 0x080000, CRC(d1f2a9b2) SHA1(d1475a453ce4e3b9f2ff59abedf0f57ba3c408fe) )
- ROM_LOAD( "27c240.3", 0x100000, 0x080000, CRC(509cdc8b) SHA1(8b92b79be09de56e7d40c2d02fcbeca92bb60226) ) /* bad dump? (only contains 8k of data) */
+
+ // TODO: hook up bootleg protection
+ ROM_REGION16_LE( 0x080000, "blprot", 0 )
+ ROM_LOAD( "27c240.3", 0x000000, 0x080000, CRC(509cdc8b) SHA1(8b92b79be09de56e7d40c2d02fcbeca92bb60226) ) // replay attack, upper & lower bytes identical
ROM_REGION( 0x8, "cat702_2", 0 )
ROM_LOAD( "et02", 0x000000, 0x000008, CRC(187ce61a) SHA1(521122b0f7b3f278dd2a2b1d73c252b952b5f55d) )
diff --git a/src/mame/drivers/zorba.cpp b/src/mame/drivers/zorba.cpp
index c51bb983378..74bce8a0af0 100644
--- a/src/mame/drivers/zorba.cpp
+++ b/src/mame/drivers/zorba.cpp
@@ -85,12 +85,9 @@ void zorba_state::zorba_io(address_map &map)
map(0x04, 0x04).rw(FUNC(zorba_state::rom_r), FUNC(zorba_state::rom_w));
map(0x05, 0x05).rw(FUNC(zorba_state::ram_r), FUNC(zorba_state::ram_w));
map(0x10, 0x11).rw(m_crtc, FUNC(i8275_device::read), FUNC(i8275_device::write));
- map(0x20, 0x20).rw(m_uart0, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x21, 0x21).rw(m_uart0, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0x22, 0x22).rw(m_uart1, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x23, 0x23).rw(m_uart1, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
- map(0x24, 0x24).rw(m_uart2, FUNC(i8251_device::data_r), FUNC(i8251_device::data_w));
- map(0x25, 0x25).rw(m_uart2, FUNC(i8251_device::status_r), FUNC(i8251_device::control_w));
+ map(0x20, 0x21).rw(m_uart0, FUNC(i8251_device::read), FUNC(i8251_device::write));
+ map(0x22, 0x23).rw(m_uart1, FUNC(i8251_device::read), FUNC(i8251_device::write));
+ map(0x24, 0x25).rw(m_uart2, FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0x26, 0x26).w(FUNC(zorba_state::intmask_w));
map(0x30, 0x30).rw(m_dma, FUNC(z80dma_device::bus_r), FUNC(z80dma_device::bus_w));
map(0x40, 0x43).rw(m_fdc, FUNC(fd1793_device::read), FUNC(fd1793_device::write));
diff --git a/src/mame/includes/bbc.h b/src/mame/includes/bbc.h
index c907323c1c7..a4e4d6b3e77 100644
--- a/src/mame/includes/bbc.h
+++ b/src/mame/includes/bbc.h
@@ -75,6 +75,7 @@ public:
m_intube(*this, "intube"),
m_extube(*this, "extube"),
m_1mhzbus(*this, "1mhzbus"),
+ m_userport(*this, "userport"),
m_rtc(*this, "rtc"),
m_fdc(*this, "fdc"),
m_i8271(*this, "i8271"),
@@ -168,12 +169,12 @@ public:
TIMER_CALLBACK_MEMBER(bbc_tape_timer_cb);
DECLARE_WRITE_LINE_MEMBER(write_acia_clock);
DECLARE_WRITE_LINE_MEMBER(adlc_irq_w);
- DECLARE_WRITE_LINE_MEMBER(econet_clk_w);
DECLARE_WRITE_LINE_MEMBER(bus_nmi_w);
DECLARE_WRITE8_MEMBER(bbcb_via_system_write_porta);
DECLARE_WRITE8_MEMBER(bbcb_via_system_write_portb);
DECLARE_READ8_MEMBER(bbcb_via_system_read_porta);
DECLARE_READ8_MEMBER(bbcb_via_system_read_portb);
+ DECLARE_WRITE_LINE_MEMBER(lpstb_w);
DECLARE_WRITE_LINE_MEMBER(bbc_hsync_changed);
DECLARE_WRITE_LINE_MEMBER(bbc_vsync_changed);
DECLARE_WRITE_LINE_MEMBER(bbc_de_changed);
@@ -205,8 +206,8 @@ public:
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(exp4_load) { return bbc_load_rom(image, m_exp4); }
image_init_result bbcm_load_cart(device_image_interface &image, generic_slot_device *slot);
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(bbcm_exp1_load) { return bbcm_load_cart(image, m_exp1); }
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(bbcm_exp2_load) { return bbcm_load_cart(image, m_exp2); }
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(bbcm_cart1_load) { return bbcm_load_cart(image, m_exp1); }
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(bbcm_cart2_load) { return bbcm_load_cart(image, m_exp2); }
MC6845_UPDATE_ROW(crtc_update_row);
@@ -271,6 +272,7 @@ public: // HACK FOR MC6845
optional_device<bbc_tube_slot_device> m_intube;
optional_device<bbc_tube_slot_device> m_extube;
optional_device<bbc_1mhzbus_slot_device> m_1mhzbus;
+ optional_device<bbc_userport_slot_device> m_userport;
optional_device<mc146818_device> m_rtc;
optional_device<bbc_fdc_slot_device> m_fdc;
optional_device<i8271_device> m_i8271;
diff --git a/src/mame/includes/model1.h b/src/mame/includes/model1.h
index f04d4b2843b..44a5b3c2504 100644
--- a/src/mame/includes/model1.h
+++ b/src/mame/includes/model1.h
@@ -103,8 +103,8 @@ public:
private:
// Machine
- DECLARE_MACHINE_START(model1);
- DECLARE_MACHINE_RESET(model1);
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
DECLARE_READ8_MEMBER(io_r);
DECLARE_WRITE8_MEMBER(io_w);
@@ -165,7 +165,7 @@ private:
DECLARE_WRITE8_MEMBER(r360_w);
// Rendering
- DECLARE_VIDEO_START(model1);
+ virtual void video_start() override;
DECLARE_READ16_MEMBER(model1_listctl_r);
DECLARE_WRITE16_MEMBER(model1_listctl_w);
diff --git a/src/mame/includes/nforcepc.h b/src/mame/includes/nforcepc.h
new file mode 100644
index 00000000000..03e0d72e247
--- /dev/null
+++ b/src/mame/includes/nforcepc.h
@@ -0,0 +1,47 @@
+// license:BSD-3-Clause
+// copyright-holders: Samuele Zannoli
+#ifndef MAME_MACHINE_NFORCEPC_H
+#define MAME_MACHINE_NFORCEPC_H
+
+#pragma once
+
+// NVIDIA Corporation nForce CPU bridge
+
+class crush11_host_device : public pci_host_device {
+public:
+ template <typename T>
+ crush11_host_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&cpu_tag, int ram_size)
+ : crush11_host_device(mconfig, tag, owner, clock)
+ {
+ set_ids_host(0x10de01a4, 0x01, 0x10430c11);
+ set_cpu_tag(std::forward<T>(cpu_tag));
+ set_ram_size(ram_size);
+ }
+ crush11_host_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ template <typename T> void set_cpu_tag(T &&tag) { cpu.set_tag(std::forward<T>(tag)); }
+ void set_ram_size(int ram_size);
+
+protected:
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ virtual void reset_all_mappings() override;
+
+ virtual void map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space,
+ uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) override;
+
+ virtual void config_map(address_map &map) override;
+
+private:
+ int ddr_ram_size;
+ required_device<device_memory_interface> cpu;
+ std::vector<uint32_t> ram;
+
+ DECLARE_READ8_MEMBER(test_r);
+ DECLARE_WRITE8_MEMBER(test_w);
+};
+
+DECLARE_DEVICE_TYPE(CRUSH11, crush11_host_device)
+
+#endif
diff --git a/src/mame/machine/bbc.cpp b/src/mame/machine/bbc.cpp
index cea8152afd2..6dbc57335a9 100644
--- a/src/mame/machine/bbc.cpp
+++ b/src/mame/machine/bbc.cpp
@@ -298,7 +298,7 @@ WRITE8_MEMBER(bbc_state::bbcm_acccon_w)
}
else
{
- space.install_read_handler(0xfc00, 0xfeff, read8_delegate(FUNC(bbc_state::bbcm_r),this));
+ space.install_read_handler(0xfc00, 0xfeff, read8_delegate(FUNC(bbc_state::bbcm_r), this));
}
}
@@ -403,21 +403,22 @@ WRITE8_MEMBER(bbc_state::bbc_memorybm7_w)
READ8_MEMBER(bbc_state::bbcm_r)
{
- long myo;
+ uint8_t data = 0xff;
+ uint8_t myo;
- if (offset<=0x0ff) /* FRED */
+ switch (offset >> 8)
{
- return 0xff;
- };
+ case 0x00: /* FRED */
+ if (m_1mhzbus) return m_1mhzbus->fred_r(space, offset & 0xff);
+ break;
- if ((offset>=0x100) && (offset<=0x1ff)) /* JIM */
- {
- return 0xff;
- };
+ case 0x01: /* JIM */
+ if (m_1mhzbus) return m_1mhzbus->jim_r(space, offset & 0xff);
+ break;
- if ((offset>=0x200) && (offset<=0x2ff)) /* SHEILA */
- {
- myo = offset-0x200;
+ case 0x02: /* SHEILA */
+ data = 0xfe;
+ myo = offset & 0xff;
if ((myo>=0x00) && (myo<=0x06) && (myo+0x01) & 1) return m_hd6845->status_r(space, myo-0x00); /* Video controller */
if ((myo>=0x01) && (myo<=0x07) && (myo & 1)) return m_hd6845->register_r(space, myo-0x01);
if ((myo>=0x08) && (myo<=0x0f)) return m_acia ? m_acia->read(space, myo & 0x01) : 0xfe; /* Serial controller */
@@ -425,15 +426,11 @@ READ8_MEMBER(bbc_state::bbcm_r)
if ((myo>=0x18) && (myo<=0x1f)) return m_upd7002 ? m_upd7002->read(space, myo-0x18) : 0xfe; /* A to D converter */
if ((myo>=0x20) && (myo<=0x23)) return 0xfe; /* VideoULA */
if ((myo>=0x24) && (myo<=0x27)) return bbcm_wd177xl_read(space, myo-0x24); /* 177x Control Latch */
- if ((myo>=0x28) && (myo<=0x2f) && (m_wd1770)) return m_wd1770->read(myo-0x28); /* 1770 Controller */
- if ((myo>=0x28) && (myo<=0x2f) && (m_wd1772)) return m_wd1772->read(myo-0x28); /* 1772 Controller */
- if ((myo>=0x28) && (myo<=0x2f)) return 0xfe; /* No Controller */
- if ((myo>=0x30) && (myo<=0x33)) return 0xfe;
+ if ((myo>=0x28) && (myo<=0x2f) && (m_wd1770)) return m_wd1770->read(myo-0x28); /* 1770 Controller */
+ if ((myo>=0x28) && (myo<=0x2f) && (m_wd1772)) return m_wd1772->read(myo-0x28); /* 1772 Controller */
if ((myo>=0x34) && (myo<=0x37)) return bbcm_acccon_r(space, myo-0x34); /* ACCCON */
- if ((myo>=0x38) && (myo<=0x3f)) return 0xfe; /* NC ?? */
if ((myo>=0x40) && (myo<=0x5f)) return m_via6522_0->read(myo-0x40);
if ((myo>=0x60) && (myo<=0x7f)) return m_via6522_1 ? m_via6522_1->read(myo-0x60) : 0xfe;
- if ((myo>=0x80) && (myo<=0x9f)) return 0xfe;
if ((myo>=0xa0) && (myo<=0xbf)) return m_adlc ? m_adlc->read(space, myo & 0x03) : 0xfe;
if ((myo>=0xc0) && (myo<=0xdf)) return 0xff;
if ((myo>=0xe0) && (myo<=0xff))
@@ -441,17 +438,27 @@ READ8_MEMBER(bbc_state::bbcm_r)
if (m_intube && m_acccon_itu) return m_intube->host_r(space, myo-0xe0); /* Internal TUBE */
if (m_extube && !m_acccon_itu) return m_extube->host_r(space, myo-0xe0); /* External TUBE */
}
+ break;
}
- return 0xfe;
+ return data;
}
WRITE8_MEMBER(bbc_state::bbcm_w)
{
- long myo;
+ uint8_t myo;
- if ((offset>=0x200) && (offset<=0x2ff)) /* SHEILA */
+ switch (offset >> 8)
{
- myo=offset-0x200;
+ case 0x00: /* FRED */
+ if (m_1mhzbus) m_1mhzbus->fred_w(space, offset & 0xff, data);
+ break;
+
+ case 0x01: /* JIM */
+ if (m_1mhzbus) m_1mhzbus->jim_w(space, offset & 0xff, data);
+ break;
+
+ case 0x02: /* SHEILA */
+ myo = offset & 0xff;
if ((myo>=0x00) && (myo<=0x06) && (myo+0x01) & 1) m_hd6845->address_w(space, myo-0x00, data); /* Video Controller */
if ((myo>=0x01) && (myo<=0x07) && (myo & 1)) m_hd6845->register_w(space, myo-0x01, data);
if ((myo>=0x08) && (myo<=0x0f)) if (m_acia) m_acia->write(space, myo & 0x01, data); /* Serial controller */
@@ -459,22 +466,20 @@ WRITE8_MEMBER(bbc_state::bbcm_w)
if ((myo>=0x18) && (myo<=0x1f) && (m_upd7002)) m_upd7002->write(space, myo-0x18, data); /* A to D converter */
if ((myo>=0x20) && (myo<=0x23)) bbc_videoULA_w(space, myo-0x20, data); /* VideoULA */
if ((myo>=0x24) && (myo<=0x27) && (m_wd1770)) bbcm_wd1770l_write(space, myo-0x24, data); /* disc control latch */
- if ((myo>=0x28) && (myo<=0x2f) && (m_wd1770)) m_wd1770->write(myo-0x28, data); /* 1770 Controller */
+ if ((myo>=0x28) && (myo<=0x2f) && (m_wd1770)) m_wd1770->write(myo-0x28, data); /* 1770 Controller */
if ((myo>=0x24) && (myo<=0x27) && (m_wd1772)) bbcm_wd1772l_write(space, myo-0x24, data); /* disc control latch */
- if ((myo>=0x28) && (myo<=0x2f) && (m_wd1772)) m_wd1772->write(myo-0x28, data); /* 1772 Controller */
+ if ((myo>=0x28) && (myo<=0x2f) && (m_wd1772)) m_wd1772->write(myo-0x28, data); /* 1772 Controller */
if ((myo>=0x30) && (myo<=0x33)) page_selectbm_w(space, myo-0x30, data); /* ROMSEL */
if ((myo>=0x34) && (myo<=0x37)) bbcm_acccon_w(space, myo-0x34, data); /* ACCCON */
- //if ((myo>=0x38) && (myo<=0x3f)) /* NC ?? */
if ((myo>=0x40) && (myo<=0x5f)) m_via6522_0->write(myo-0x40, data);
if ((myo>=0x60) && (myo<=0x7f) && (m_via6522_1)) m_via6522_1->write(myo-0x60, data);
- //if ((myo>=0x80) && (myo<=0x9f))
if ((myo>=0xa0) && (myo<=0xbf) && (m_adlc)) m_adlc->write(space, myo & 0x03, data);
- //if ((myo>=0xc0) && (myo<=0xdf))
if ((myo>=0xe0) && (myo<=0xff))
{
if (m_intube && m_acccon_itu) m_intube->host_w(space, myo-0xe0, data); /* Internal TUBE */
if (m_extube && !m_acccon_itu) m_extube->host_w(space, myo-0xe0, data); /* External TUBE */
}
+ break;
}
}
@@ -952,6 +957,13 @@ READ8_MEMBER(bbc_state::bbcb_via_system_read_portb)
}
+WRITE_LINE_MEMBER(bbc_state::lpstb_w)
+{
+ m_via6522_0->write_cb2(state);
+ if (!state)
+ m_hd6845->assert_light_pen_input();
+}
+
/**************************************
BBC Joystick Support
**************************************/
@@ -1270,6 +1282,7 @@ WRITE_LINE_MEMBER(bbc_state::motor_w)
con->get_device()->mon_w(!state);
}
}
+ m_i8271->ready_w(!state);
}
WRITE_LINE_MEMBER(bbc_state::side_w)
@@ -1482,9 +1495,9 @@ image_init_result bbc_state::bbcm_load_cart(device_image_interface &image, gener
return image_init_result::FAIL;
}
- slot->rom_alloc(size_lo + size_hi, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
- memcpy(slot->get_rom_base() + 0, image.get_software_region("uprom"), size_hi);
- memcpy(slot->get_rom_base() + size_hi, image.get_software_region("lorom"), size_lo);
+ slot->rom_alloc(0x8000, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
+ memcpy(slot->get_rom_base() + 0x0000, image.get_software_region("lorom"), size_lo);
+ memcpy(slot->get_rom_base() + 0x4000, image.get_software_region("uprom"), size_hi);
}
return image_init_result::PASS;
diff --git a/src/mame/machine/cat702.h b/src/mame/machine/cat702.h
index 4d25407e4a6..997c55bf241 100644
--- a/src/mame/machine/cat702.h
+++ b/src/mame/machine/cat702.h
@@ -10,16 +10,13 @@
DECLARE_DEVICE_TYPE(CAT702, cat702_device)
-#define MCFG_CAT702_DATAOUT_HANDLER(_devcb) \
- downcast<cat702_device &>(*device).set_dataout_handler(DEVCB_##_devcb);
-
class cat702_device : public device_t
{
public:
cat702_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// configuration helpers
- template <class Object> devcb_base &set_dataout_handler(Object &&cb) { return m_dataout_handler.set_callback(std::forward<Object>(cb)); }
+ auto dataout_handler() { return m_dataout_handler.bind(); }
DECLARE_WRITE_LINE_MEMBER(write_select);
DECLARE_WRITE_LINE_MEMBER(write_datain);
diff --git a/src/mame/machine/mbc55x.cpp b/src/mame/machine/mbc55x.cpp
index dc4852e3568..fbed99ad7af 100644
--- a/src/mame/machine/mbc55x.cpp
+++ b/src/mame/machine/mbc55x.cpp
@@ -251,11 +251,11 @@ READ8_MEMBER(mbc55x_state::mbc55x_kb_usart_r)
switch (offset)
{
case 0: //logerror("%s read kb_uart\n",machine().describe_context());
- result = m_kb_uart->data_r(space,0);
+ result = m_kb_uart->data_r();
break;
case 1:
- result = m_kb_uart->status_r(space,0);
+ result = m_kb_uart->status_r();
if (m_keyboard.key_special & KEY_BIT_CTRL) // Parity error used to flag control down
result |= i8251_device::I8251_STATUS_PARITY_ERROR;
break;
@@ -270,8 +270,8 @@ WRITE8_MEMBER(mbc55x_state::mbc55x_kb_usart_w)
switch (offset)
{
- case 0 : m_kb_uart->data_w(space, 0, data); break;
- case 1 : m_kb_uart->control_w(space, 0, data); break;
+ case 0 : m_kb_uart->data_w(data); break;
+ case 1 : m_kb_uart->control_w(data); break;
}
}
diff --git a/src/mame/machine/model1.cpp b/src/mame/machine/model1.cpp
index c02b21d71ca..75eadf9a4d1 100644
--- a/src/mame/machine/model1.cpp
+++ b/src/mame/machine/model1.cpp
@@ -1723,7 +1723,7 @@ void model1_state::copro_hle_swa()
}
}
-MACHINE_START_MEMBER(model1_state,model1)
+void model1_state::machine_start()
{
m_digits.resolve();
m_copro_ram_data = std::make_unique<u32[]>(0x8000);
diff --git a/src/mame/machine/model1io2.cpp b/src/mame/machine/model1io2.cpp
index f1bac5e80bb..4c115d86bda 100644
--- a/src/mame/machine/model1io2.cpp
+++ b/src/mame/machine/model1io2.cpp
@@ -5,7 +5,7 @@
Sega Model 1 I/O Board (Advanced)
Used by:
- - Wing War (R360) (837-10859)
+ - Wing War/Wing War R360 (837-10859)
- NetMerc (837-11659)
- Virtua Cop (837-11130 with 837-11131)
@@ -112,7 +112,7 @@ ioport_constructor model1io2_device::device_input_ports() const
ROM_START( model1io2 )
ROM_REGION(0x10000, "iocpu", 0)
- // Wing War (taken from R360 version, is it the same for the regular version?)
+ // Wing War/Wing War R360
ROM_SYSTEM_BIOS(0, "epr16891", "EPR-16891")
ROMX_LOAD("epr-16891.6", 0x00000, 0x10000, CRC(a33f84d1) SHA1(3079397c7241c1a6f494fa310faff0989dfa04a0), ROM_BIOS(0))
diff --git a/src/mame/machine/pk8020.cpp b/src/mame/machine/pk8020.cpp
index 74f6852501f..3e7131912ee 100644
--- a/src/mame/machine/pk8020.cpp
+++ b/src/mame/machine/pk8020.cpp
@@ -151,17 +151,9 @@ READ8_MEMBER(pk8020_state::devices_r)
{
case 0x00: return m_pit8253->read(space, offset & 3);
case 0x08: return m_ppi8255_3->read(space,offset & 3);
- case 0x10: switch(offset & 1) {
- case 0 : return m_rs232->data_r(space,0);
- case 1 : return m_rs232->status_r(space,0);
- }
- break;
+ case 0x10: return m_rs232->read(offset & 1);
case 0x18: return m_wd1793->read(offset & 0x03);
- case 0x20: switch(offset & 1) {
- case 0 : return m_lan->data_r(space,0);
- case 1 : return m_lan->status_r(space,0);
- }
- break;
+ case 0x20: return m_lan->read(offset & 1);
case 0x28: return m_pic8259->read(space, offset & 1);
case 0x30: return m_ppi8255_2->read(space,offset & 3);
case 0x38: return m_ppi8255_1->read(space,offset & 3);
@@ -175,19 +167,9 @@ WRITE8_MEMBER(pk8020_state::devices_w)
{
case 0x00: m_pit8253->write(space, offset & 3, data); break;
case 0x08: m_ppi8255_3->write(space,offset & 3,data); break;
- case 0x10: switch(offset & 1) {
- case 0 : m_rs232->data_w(space,0,data); break;
- case 1 : m_rs232->control_w(space,0,data); break;
- }
- break;
- case 0x18:
- m_wd1793->write(offset & 0x03, data);
- break;
- case 0x20: switch(offset & 1) {
- case 0 : m_lan->data_w(space,0,data); break;
- case 1 : m_lan->control_w(space,0,data); break;
- }
- break;
+ case 0x10: m_rs232->write(offset & 1, data); break;
+ case 0x18: m_wd1793->write(offset & 0x03, data); break;
+ case 0x20: m_lan->write(offset & 1, data); break;
case 0x28: m_pic8259->write(space, offset & 1,data);break;
case 0x30: m_ppi8255_2->write(space,offset & 3,data); break;
case 0x38: m_ppi8255_1->write(space,offset & 3,data); break;
diff --git a/src/mame/machine/pmd85.cpp b/src/mame/machine/pmd85.cpp
index ca16cd117fa..1e446c06c3b 100644
--- a/src/mame/machine/pmd85.cpp
+++ b/src/mame/machine/pmd85.cpp
@@ -498,12 +498,7 @@ READ8_MEMBER(pmd85_state::pmd85_io_r)
switch (offset & 0x70)
{
case 0x10: /* 8251 (casette recorder, V24) */
- switch (offset & 0x01)
- {
- case 0x00: return m_uart->data_r(space, offset & 0x01);
- case 0x01: return m_uart->status_r(space, offset & 0x01);
- }
- break;
+ return m_uart->read(offset & 0x01);
case 0x40: /* 8255 (GPIO/0, GPIO/1) */
return m_ppi8255_1->read(space, offset & 0x03);
case 0x50: /* 8253 */
@@ -573,11 +568,7 @@ WRITE8_MEMBER(pmd85_state::pmd85_io_w)
switch (offset & 0x70)
{
case 0x10: /* 8251 (casette recorder, V24) */
- switch (offset & 0x01)
- {
- case 0x00: m_uart->data_w(space, offset & 0x01, data); break;
- case 0x01: m_uart->control_w(space, offset & 0x01, data); break;
- }
+ m_uart->write(offset & 0x01, data);
break;
case 0x40: /* 8255 (GPIO/0, GPIO/0) */
m_ppi8255_1->write(space, offset & 0x03, data);
diff --git a/src/mame/machine/znmcu.h b/src/mame/machine/znmcu.h
index 5b8e3a88d94..4207cae2038 100644
--- a/src/mame/machine/znmcu.h
+++ b/src/mame/machine/znmcu.h
@@ -8,32 +8,17 @@
DECLARE_DEVICE_TYPE(ZNMCU, znmcu_device)
-#define MCFG_ZNMCU_DATAOUT_HANDLER(_devcb) \
- downcast<znmcu_device &>(*device).set_dataout_handler(DEVCB_##_devcb);
-
-#define MCFG_ZNMCU_DSR_HANDLER(_devcb) \
- downcast<znmcu_device &>(*device).set_dsr_handler(DEVCB_##_devcb);
-
-#define MCFG_ZNMCU_DSW_HANDLER(_devcb) \
- downcast<znmcu_device &>(*device).set_dsw_handler(DEVCB_##_devcb);
-
-#define MCFG_ZNMCU_ANALOG1_HANDLER(_devcb) \
- downcast<znmcu_device &>(*device).set_analog1_handler(DEVCB_##_devcb);
-
-#define MCFG_ZNMCU_ANALOG2_HANDLER(_devcb) \
- downcast<znmcu_device &>(*device).set_analog2_handler(DEVCB_##_devcb);
-
class znmcu_device : public device_t
{
public:
znmcu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// configuration helpers
- template <class Object> devcb_base &set_dsw_handler(Object &&cb) { return m_dsw_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_analog1_handler(Object &&cb) { return m_analog1_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_analog2_handler(Object &&cb) { return m_analog2_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_dataout_handler(Object &&cb) { return m_dataout_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_dsr_handler(Object &&cb) { return m_dsr_handler.set_callback(std::forward<Object>(cb)); }
+ auto dsw_handler() { return m_dsw_handler.bind(); }
+ auto analog1_handler() { return m_analog1_handler.bind(); }
+ auto analog2_handler() { return m_analog2_handler.bind(); }
+ auto dataout_handler() { return m_dataout_handler.bind(); }
+ auto dsr_handler() { return m_dsr_handler.bind(); }
WRITE_LINE_MEMBER(write_select);
WRITE_LINE_MEMBER(write_clock);
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 68a9e121ade..e491810c73c 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -890,12 +890,12 @@ triothep // (c) 1989 Data East Corporation (World)
triothepj // (c) 1989 Data East Corporation (Japan)
@source:acvirus.cpp
-virusa // (c) 1997 Access Gmbh
-virusb // (c) 1999 Access Gmbh
-virusc // (c) 2002 Access Gmbh
-virusrck // (c) 2001 Access Gmbh
-virusrckxl // (c) 2002 Access Gmbh
-viruscl // (c) 2004 Access Gmbh
+virusa // (c) 1997 Access GmbH
+virusb // (c) 1999 Access GmbH
+virusc // (c) 2002 Access GmbH
+virusrck // (c) 2001 Access GmbH
+virusrckxl // (c) 2002 Access GmbH
+viruscl // (c) 2004 Access GmbH
@source:adam.cpp
adam // Coleco Adam
@@ -38220,7 +38220,7 @@ victory // (c) 1982
vidbrain //
@source:video21.cpp
-video21 // Videogames gmbh 1980
+video21 // Videogames GmbH 1980
@source:videopin.cpp
solarwar // 036154-036169 1979 [6502]
diff --git a/src/mame/video/model1.cpp b/src/mame/video/model1.cpp
index 2426dcbd3ae..9cf4db2c057 100644
--- a/src/mame/video/model1.cpp
+++ b/src/mame/video/model1.cpp
@@ -1562,7 +1562,7 @@ void model1_state::tgp_scan()
m_render_done = 0;
}
-VIDEO_START_MEMBER(model1_state, model1)
+void model1_state::video_start()
{
m_view = std::make_unique<model1_state::view_t>();
diff --git a/src/mame/video/pcd.cpp b/src/mame/video/pcd.cpp
index 003ad8ca1b8..b6609505c8f 100644
--- a/src/mame/video/pcd.cpp
+++ b/src/mame/video/pcd.cpp
@@ -36,7 +36,6 @@ pcx_video_device::pcx_video_device(const machine_config &mconfig, const char *ta
pcdx_video_device(mconfig, PCX_VIDEO, tag, owner, clock),
device_serial_interface(mconfig, *this),
m_crtc(*this, "crtc"),
- m_vram(4*1024),
m_charrom(*this, "char"),
m_txd_handler(*this)
{
@@ -129,16 +128,22 @@ void pcx_video_device::pcx_vid_map(address_map &map)
void pcx_video_device::pcx_vid_io(address_map &map)
{
- map(0x8000, 0x8007).rw("crtc", FUNC(scn2672_device::read), FUNC(scn2672_device::write));
+ map(0x8000, 0x8007).rw(m_crtc, FUNC(scn2672_device::read), FUNC(scn2672_device::write));
map(0x8008, 0x8008).r(FUNC(pcx_video_device::unk_r));
- map(0xa000, 0xa001).rw(FUNC(pcx_video_device::vram_latch_r), FUNC(pcx_video_device::vram_latch_w));
+ map(0xa000, 0xa000).rw(m_crtc, FUNC(scn2672_device::buffer_r), FUNC(scn2672_device::buffer_w));
+ map(0xa001, 0xa001).rw(m_crtc, FUNC(scn2672_device::attr_buffer_r), FUNC(scn2672_device::attr_buffer_w));
map(0xa002, 0xa003).rw(FUNC(pcx_video_device::term_mcu_r), FUNC(pcx_video_device::term_mcu_w));
map(0xc000, 0xc7ff).ram();
}
-void pcx_video_device::pcx_vram(address_map &map)
+void pcx_video_device::pcx_char_ram(address_map &map)
{
- map(0x0000, 0x07ff).rw(FUNC(pcx_video_device::vram_r), FUNC(pcx_video_device::vram_w));
+ map(0x0000, 0x07ff).ram();
+}
+
+void pcx_video_device::pcx_attr_ram(address_map &map)
+{
+ map(0x0000, 0x07ff).ram();
}
MACHINE_CONFIG_START(pcx_video_device::device_add_mconfig)
@@ -161,7 +166,8 @@ MACHINE_CONFIG_START(pcx_video_device::device_add_mconfig)
m_crtc->set_character_width(12);
m_crtc->set_display_callback(FUNC(pcx_video_device::display_pixels));
m_crtc->set_screen("screen");
- m_crtc->set_addrmap(0, &pcx_video_device::pcx_vram);
+ m_crtc->set_addrmap(0, &pcx_video_device::pcx_char_ram);
+ m_crtc->set_addrmap(1, &pcx_video_device::pcx_attr_ram);
MACHINE_CONFIG_END
@@ -211,19 +217,25 @@ SCN2674_DRAW_CHARACTER_MEMBER(pcd_video_device::display_pixels)
SCN2672_DRAW_CHARACTER_MEMBER(pcx_video_device::display_pixels)
{
- uint8_t data;
- address <<= 1;
- data = m_charrom[m_vram[address] * 16 + linecount + (m_vram[address + 1] & 0x20 ? 4096 : 0)];
- if(cursor && blink)
- data = 0xff;
- if(m_p1 & 0x20)
- data = ~data;
- for(int i = 0; i < 8; i++)
+ uint16_t data = m_charrom[charcode * 16 + linecount + (attrcode & 0x20 ? 4096 : 0)];
+
+ if (cursor && blink)
+ data = 0x3ff;
+ else
{
- rgb_t pix = palette().pen(BIT(data, 7) ? 1 : 0);
- bitmap.pix32(y, x++) = pix;
- bitmap.pix32(y, x++) = pix;
data <<= 1;
+ data |= data << 1;
+ }
+
+ if (m_p1 & 0x20)
+ data ^= 0x3ff;
+
+ for (int i = 0; i < 12; i++)
+ {
+ rgb_t pix = palette().pen(BIT(data, 10) ? 1 : 0);
+ bitmap.pix32(y, x++) = pix;
+ if (i != 1)
+ data <<= 1;
}
}
@@ -365,31 +377,6 @@ WRITE8_MEMBER(pcx_video_device::term_mcu_w)
}
}
-WRITE8_MEMBER(pcx_video_device::vram_w)
-{
- offset <<= 1;
- m_vram[offset] = m_vram_latch_w[0];
- m_vram[offset+1] = m_vram_latch_w[1];
-}
-
-READ8_MEMBER(pcx_video_device::vram_r)
-{
- offset <<= 1;
- m_vram_latch_r[0] = m_vram[offset];
- m_vram_latch_r[1] = m_vram[offset+1];
- return m_vram[offset];
-}
-
-WRITE8_MEMBER(pcx_video_device::vram_latch_w)
-{
- m_vram_latch_w[offset] = data;
-}
-
-READ8_MEMBER(pcx_video_device::vram_latch_r)
-{
- return m_vram_latch_r[offset];
-}
-
READ8_MEMBER(pcdx_video_device::detect_r)
{
return 0;
@@ -429,8 +416,8 @@ void pcd_video_device::device_reset()
void pcd_video_device::map(address_map &map)
{
- map(0x00, 0x0f).w("crtc", FUNC(scn2674_device::write)).umask16(0x00ff);
- map(0x00, 0x0f).r("crtc", FUNC(scn2674_device::read)).umask16(0xff00);
+ map(0x00, 0x0f).w(m_crtc, FUNC(scn2674_device::write)).umask16(0x00ff);
+ map(0x00, 0x0f).r(m_crtc, FUNC(scn2674_device::read)).umask16(0xff00);
map(0x20, 0x20).w(FUNC(pcd_video_device::vram_sw_w));
map(0x30, 0x33).rw("graphics", FUNC(i8741_device::upi41_master_r), FUNC(i8741_device::upi41_master_w)).umask16(0x00ff);
}
diff --git a/src/mame/video/pcd.h b/src/mame/video/pcd.h
index 1c92a66512b..22a28000616 100644
--- a/src/mame/video/pcd.h
+++ b/src/mame/video/pcd.h
@@ -93,16 +93,13 @@ public:
DECLARE_WRITE8_MEMBER(term_w);
DECLARE_READ8_MEMBER(term_mcu_r);
DECLARE_WRITE8_MEMBER(term_mcu_w);
- DECLARE_READ8_MEMBER(vram_r);
- DECLARE_WRITE8_MEMBER(vram_w);
- DECLARE_READ8_MEMBER(vram_latch_r);
- DECLARE_WRITE8_MEMBER(vram_latch_w);
DECLARE_READ8_MEMBER(unk_r);
DECLARE_WRITE8_MEMBER(p1_w);
void pcx_vid_io(address_map &map);
void pcx_vid_map(address_map &map);
- void pcx_vram(address_map &map);
+ void pcx_char_ram(address_map &map);
+ void pcx_attr_ram(address_map &map);
protected:
void device_start() override;
void device_reset() override;
@@ -115,10 +112,9 @@ protected:
private:
required_device<scn2672_device> m_crtc;
- std::vector<uint8_t> m_vram;
required_region_ptr<uint8_t> m_charrom;
devcb_write_line m_txd_handler;
- uint8_t m_term_key, m_term_char, m_term_stat, m_vram_latch_r[2], m_vram_latch_w[2], m_p1;
+ uint8_t m_term_key, m_term_char, m_term_stat, m_p1;
DECLARE_READ8_MEMBER(rx_callback);
DECLARE_WRITE8_MEMBER(tx_callback);
diff --git a/src/osd/modules/render/d3d/d3dhlsl.cpp b/src/osd/modules/render/d3d/d3dhlsl.cpp
index df5e2febea2..8191a2403be 100644
--- a/src/osd/modules/render/d3d/d3dhlsl.cpp
+++ b/src/osd/modules/render/d3d/d3dhlsl.cpp
@@ -780,7 +780,7 @@ int shaders::create_resources()
vector_effect
};
- for (int i = 0; i < 13; i++)
+ for (int i = 0; i < EFFECT_COUNT; i++)
{
effects[i]->add_uniform("SourceDims", uniform::UT_VEC2, uniform::CU_SOURCE_DIMS);
effects[i]->add_uniform("TargetDims", uniform::UT_VEC2, uniform::CU_TARGET_DIMS);