summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/mame/drivers/bbc.cpp106
-rw-r--r--src/mame/includes/bbc.h41
-rw-r--r--src/mame/machine/bbc.cpp89
3 files changed, 99 insertions, 137 deletions
diff --git a/src/mame/drivers/bbc.cpp b/src/mame/drivers/bbc.cpp
index 3b8202285a7..055d7b98c76 100644
--- a/src/mame/drivers/bbc.cpp
+++ b/src/mame/drivers/bbc.cpp
@@ -287,6 +287,13 @@ ADDRESS_MAP_END
INPUT_CHANGED_MEMBER(bbc_state::trigger_reset)
{
m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? CLEAR_LINE : ASSERT_LINE);
+ if (newval)
+ {
+ if (m_via6522_1) m_via6522_1->reset();
+ if (m_adlc) m_adlc->reset();
+ if (m_rtc) m_rtc->reset();
+ if (m_i8271) m_i8271->reset();
+ }
}
@@ -798,16 +805,15 @@ FLOPPY_FORMATS_MEMBER( bbc_state::floppy_formats_bbcmc )
FLOPPY_FORMATS_END0
static SLOT_INTERFACE_START( bbc_floppies_525 )
- SLOT_INTERFACE("sssd", FLOPPY_525_SSSD)
- SLOT_INTERFACE("sd", FLOPPY_525_SD)
- SLOT_INTERFACE("ssdd", FLOPPY_525_SSDD)
- SLOT_INTERFACE("dd", FLOPPY_525_DD)
- SLOT_INTERFACE("ssqd", FLOPPY_525_SSQD)
- SLOT_INTERFACE("qd", FLOPPY_525_QD)
+ SLOT_INTERFACE("525sssd", FLOPPY_525_SSSD)
+ SLOT_INTERFACE("525sd", FLOPPY_525_SD)
+ SLOT_INTERFACE("525ssdd", FLOPPY_525_SSDD)
+ SLOT_INTERFACE("525dd", FLOPPY_525_DD)
+ SLOT_INTERFACE("525qd", FLOPPY_525_QD)
SLOT_INTERFACE_END
static SLOT_INTERFACE_START( bbc_floppies_35 )
- SLOT_INTERFACE("qd", FLOPPY_35_DD)
+ SLOT_INTERFACE("35dd", FLOPPY_35_DD)
SLOT_INTERFACE_END
@@ -860,6 +866,9 @@ static MACHINE_CONFIG_START( bbca, bbc_state )
MCFG_CPU_PERIODIC_INT_DRIVER(bbc_state, bbcb_keyscan, 1000) /* scan keyboard */
MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ MCFG_INPUT_MERGER_ACTIVE_HIGH("irqs")
+ MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", M6502_IRQ_LINE))
+
/* internal ram */
MCFG_RAM_ADD(RAM_TAG)
MCFG_RAM_DEFAULT_SIZE("16K")
@@ -915,7 +924,7 @@ static MACHINE_CONFIG_START( bbca, bbc_state )
MCFG_DEVICE_ADD("acia6850", ACIA6850, 0)
MCFG_ACIA6850_TXD_HANDLER(WRITELINE(bbc_state, bbc_txd_w))
MCFG_ACIA6850_RTS_HANDLER(WRITELINE(bbc_state, bbc_rts_w))
- MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(bbc_state, bbcb_acia6850_irq_w))
+ MCFG_ACIA6850_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_active_high_device, in0_w))
MCFG_RS232_PORT_ADD(RS232_TAG, default_rs232_devices, nullptr)
MCFG_RS232_RXD_HANDLER(WRITELINE(bbc_state, write_rxd_serial))
@@ -931,7 +940,7 @@ static MACHINE_CONFIG_START( bbca, bbc_state )
MCFG_VIA6522_READPB_HANDLER(READ8(bbc_state, bbcb_via_system_read_portb))
MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(bbc_state, bbcb_via_system_write_porta))
MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(bbc_state, bbcb_via_system_write_portb))
- MCFG_VIA6522_IRQ_HANDLER(WRITELINE(bbc_state, bbcb_via_system_irq_w))
+ MCFG_VIA6522_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_active_high_device, in1_w))
/* EPROM sockets */
MCFG_FRAGMENT_ADD(bbc_eprom_sockets)
@@ -963,7 +972,7 @@ static MACHINE_CONFIG_DERIVED( bbcb, bbca )
MCFG_VIA6522_WRITEPA_HANDLER(DEVWRITE8("cent_data_out", output_latch_device, write))
MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(bbc_state, bbcb_via_user_write_portb))
MCFG_VIA6522_CA2_HANDLER(DEVWRITELINE("centronics", centronics_device, write_strobe))
- MCFG_VIA6522_IRQ_HANDLER(WRITELINE(bbc_state, bbcb_via_user_irq_w))
+ MCFG_VIA6522_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_active_high_device, in2_w))
/* adc */
MCFG_DEVICE_ADD("upd7002", UPD7002, 0)
@@ -976,14 +985,14 @@ static MACHINE_CONFIG_DERIVED( bbcb, bbca )
MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
/* fdc */
- MCFG_DEVICE_ADD("i8271", I8271, 0)
- MCFG_I8271_IRQ_CALLBACK(WRITELINE(bbc_state, fdc_intrq_w))
- MCFG_I8271_HDL_CALLBACK(WRITELINE(bbc_state, motor_w))
- MCFG_I8271_OPT_CALLBACK(WRITELINE(bbc_state, side_w))
- MCFG_FLOPPY_DRIVE_ADD("i8271:0", bbc_floppies_525, "qd", bbc_state::floppy_formats_bbc)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("i8271:1", bbc_floppies_525, "qd", bbc_state::floppy_formats_bbc)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ MCFG_DEVICE_ADD("i8271", I8271, 0)
+ MCFG_I8271_IRQ_CALLBACK(WRITELINE(bbc_state, fdc_intrq_w))
+ MCFG_I8271_HDL_CALLBACK(WRITELINE(bbc_state, motor_w))
+ MCFG_I8271_OPT_CALLBACK(WRITELINE(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)
/* econet */
MCFG_DEVICE_ADD("mc6854", MC6854, 0)
@@ -995,10 +1004,10 @@ static MACHINE_CONFIG_DERIVED( bbcb, bbca )
MCFG_ECONET_SLOT_ADD("econet254", 254, econet_devices, nullptr)
/* expansion ports */
- MCFG_BBC_ANALOGUE_SLOT_ADD("analogue", bbc_analogue_devices, nullptr)
- MCFG_BBC_1MHZBUS_SLOT_ADD("1mhzbus", bbc_1mhzbus_devices, nullptr)
- MCFG_BBC_TUBE_SLOT_ADD("tube", bbc_tube_ext_devices, nullptr)
- MCFG_BBC_USERPORT_SLOT_ADD("userport", bbc_userport_devices, nullptr)
+ MCFG_BBC_ANALOGUE_SLOT_ADD("analogue", bbc_analogue_devices, nullptr)
+ MCFG_BBC_1MHZBUS_SLOT_ADD("1mhzbus", bbc_1mhzbus_devices, nullptr)
+ MCFG_BBC_TUBE_SLOT_ADD("tube", bbc_tube_ext_devices, nullptr)
+ MCFG_BBC_USERPORT_SLOT_ADD("userport", bbc_userport_devices, nullptr)
/* software lists */
MCFG_SOFTWARE_LIST_ADD("cass_ls_b", "bbcb_cass")
@@ -1023,16 +1032,16 @@ static MACHINE_CONFIG_DERIVED(bbcb1770, bbcb)
MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(bbc_state, fdc_intrq_w))
MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(bbc_state, fdc_drq_w))
- MCFG_FLOPPY_DRIVE_ADD("wd1770:0", bbc_floppies_525, "qd", bbc_state::floppy_formats_bbcm)
+ MCFG_FLOPPY_DRIVE_ADD("wd1770:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbcm)
MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("wd1770:1", bbc_floppies_525, "qd", bbc_state::floppy_formats_bbcm)
+ MCFG_FLOPPY_DRIVE_ADD("wd1770:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbcm)
MCFG_FLOPPY_DRIVE_SOUND(true)
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( bbcb_de, bbcb )
- /* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_ls_b_de", "bbcb_cass_de")
+/* software lists */
+MCFG_SOFTWARE_LIST_ADD("flop_ls_b_de", "bbcb_cass_de")
MACHINE_CONFIG_END
@@ -1251,6 +1260,9 @@ static MACHINE_CONFIG_START( bbcm, bbc_state )
MCFG_CPU_PERIODIC_INT_DRIVER(bbc_state, bbcb_keyscan, 1000) /* scan keyboard */
MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ MCFG_INPUT_MERGER_ACTIVE_HIGH("irqs")
+ MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", M6502_IRQ_LINE))
+
/* internal ram */
MCFG_RAM_ADD(RAM_TAG)
MCFG_RAM_DEFAULT_SIZE("32K")
@@ -1328,7 +1340,7 @@ static MACHINE_CONFIG_START( bbcm, bbc_state )
MCFG_DEVICE_ADD("acia6850", ACIA6850, 0)
MCFG_ACIA6850_TXD_HANDLER(WRITELINE(bbc_state, bbc_txd_w))
MCFG_ACIA6850_RTS_HANDLER(WRITELINE(bbc_state, bbc_rts_w))
- MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(bbc_state, bbcb_acia6850_irq_w))
+ MCFG_ACIA6850_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_active_high_device, in0_w))
MCFG_RS232_PORT_ADD(RS232_TAG, default_rs232_devices, nullptr)
MCFG_RS232_RXD_HANDLER(WRITELINE(bbc_state, write_rxd_serial))
@@ -1349,7 +1361,7 @@ static MACHINE_CONFIG_START( bbcm, bbc_state )
MCFG_VIA6522_READPB_HANDLER(READ8(bbc_state, bbcb_via_system_read_portb))
MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(bbc_state, bbcb_via_system_write_porta))
MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(bbc_state, bbcb_via_system_write_portb))
- MCFG_VIA6522_IRQ_HANDLER(WRITELINE(bbc_state, bbcb_via_system_irq_w))
+ MCFG_VIA6522_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_active_high_device, in1_w))
/* user via */
MCFG_DEVICE_ADD("via6522_1", VIA6522, XTAL_16MHz / 16)
@@ -1357,16 +1369,16 @@ static MACHINE_CONFIG_START( bbcm, bbc_state )
MCFG_VIA6522_WRITEPA_HANDLER(DEVWRITE8("cent_data_out", output_latch_device, write))
MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(bbc_state, bbcb_via_user_write_portb))
MCFG_VIA6522_CA2_HANDLER(DEVWRITELINE("centronics", centronics_device, write_strobe))
- MCFG_VIA6522_IRQ_HANDLER(WRITELINE(bbc_state, bbcb_via_user_irq_w))
+ MCFG_VIA6522_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_active_high_device, in2_w))
/* fdc */
MCFG_WD1770_ADD("wd1770", XTAL_16MHz / 2)
MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(bbc_state, fdc_intrq_w))
MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(bbc_state, fdc_drq_w))
- MCFG_FLOPPY_DRIVE_ADD("wd1770:0", bbc_floppies_525, "qd", bbc_state::floppy_formats_bbcm)
+ MCFG_FLOPPY_DRIVE_ADD("wd1770:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbcm)
MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("wd1770:1", bbc_floppies_525, "qd", bbc_state::floppy_formats_bbcm)
+ MCFG_FLOPPY_DRIVE_ADD("wd1770:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbcm)
MCFG_FLOPPY_DRIVE_SOUND(true)
/* econet */
@@ -1484,7 +1496,7 @@ static MACHINE_CONFIG_DERIVED( bbcmc, bbcm )
MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(bbc_state, fdc_intrq_w))
MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(bbc_state, fdc_drq_w))
- MCFG_FLOPPY_DRIVE_ADD("wd1772:0", bbc_floppies_35, "qd", bbc_state::floppy_formats_bbcmc)
+ MCFG_FLOPPY_DRIVE_ADD("wd1772:0", bbc_floppies_35, "35dd", bbc_state::floppy_formats_bbcmc)
MCFG_FLOPPY_DRIVE_SOUND(true)
MCFG_FLOPPY_DRIVE_ADD("wd1772:1", bbc_floppies_35, nullptr, bbc_state::floppy_formats_bbcmc)
MCFG_FLOPPY_DRIVE_SOUND(true)
@@ -1495,6 +1507,10 @@ static MACHINE_CONFIG_DERIVED( bbcmc, bbcm )
MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcmc)
MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcmc)
+ // cartridge sockets
+ MCFG_DEVICE_REMOVE("exp_rom1")
+ MCFG_DEVICE_REMOVE("exp_rom2")
+
/* software lists */
MCFG_SOFTWARE_LIST_REMOVE("cass_ls_m")
MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a")
@@ -1599,9 +1615,9 @@ ROM_START(bbcb)
/* rom page 9 24000 */
/* rom page 10 28000 */
/* rom page 11 2c000 */
- /* rom page 12 30000 IC52 SPARE SOCKET */
+ /* rom page 12 30000 IC52 DFS */
/* rom page 13 34000 IC88 SPARE SOCKET */
- /* rom page 14 38000 IC100 DFS */
+ /* rom page 14 38000 IC100 SPARE SOCKET */
/* rom page 15 3c000 IC101 BASIC */
ROM_DEFAULT_BIOS("os12b2")
ROM_SYSTEM_BIOS( 0, "os12b2", "OS 1.20 / BASIC2" )
@@ -1624,12 +1640,12 @@ ROM_START(bbcb)
ROM_RELOAD( 0x08000, 0x4000 )
ROM_RELOAD( 0x0c000, 0x4000 )
- ROM_LOAD("dnfs120-201666.rom", 0x38000, 0x4000, CRC(8ccd2157) SHA1(7e3c536baeae84d6498a14e8405319e01ee78232))
+ ROM_LOAD("dnfs120-201666.rom", 0x30000, 0x4000, CRC(8ccd2157) SHA1(7e3c536baeae84d6498a14e8405319e01ee78232))
ROM_REGION(0x4000, "os", 0)
ROM_COPY("option", 0x40000, 0, 0x4000)
- ROM_REGION(0x8000, "vsm", 0) /* system speech PHROM */
+ ROM_REGION(0x4000, "vsm", 0) /* system speech PHROM */
ROM_LOAD("phroma.bin", 0x0000, 0x4000, CRC(98e1bf9e) SHA1(b369809275cb67dfd8a749265e91adb2d2558ae6))
ROM_END
@@ -1673,9 +1689,9 @@ ROM_START(bbcb1770)
ROM_REGION(0x4000, "os", 0)
ROM_COPY("option", 0x40000, 0, 0x4000)
- ROM_REGION(0x8000, "vsm", 0) /* system speech PHROM */
+ ROM_REGION(0x4000, "vsm", 0) /* system speech PHROM */
ROM_LOAD("phroma.bin", 0x0000, 0x4000, CRC(98e1bf9e) SHA1(b369809275cb67dfd8a749265e91adb2d2558ae6))
-ROM_END
+ ROM_END
ROM_START(bbcb_de)
@@ -1694,16 +1710,16 @@ ROM_START(bbcb_de)
/* rom page 9 24000 */
/* rom page 10 28000 */
/* rom page 11 2c000 */
- /* rom page 12 30000 IC72 SPARE SOCKET */
+ /* rom page 12 30000 IC72 DFS */
/* rom page 13 34000 IC73 SPARE SOCKET */
- /* rom page 14 38000 IC74 DFS */
+ /* rom page 14 38000 IC74 SPARE SOCKET */
/* rom page 15 3c000 IC75 BASIC */
ROM_DEFAULT_BIOS("os12")
ROM_SYSTEM_BIOS( 0, "os12", "OS 1.20 / BASIC2" )
ROMX_LOAD("os_de.rom", 0x40000, 0x4000, CRC(b7262caf) SHA1(aadf90338ee9d1c85dfa73beba50e930c2a38f10), ROM_BIOS(1))
ROMX_LOAD("basic2.rom", 0x3c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(1)) /* rom page 15 3c000 */
- ROM_LOAD("dfs10.rom", 0x38000, 0x4000, CRC(7e367e8c) SHA1(161f585dc45665ea77433c84afd2f95049f7f5a0))
+ ROM_LOAD("dfs10.rom", 0x30000, 0x4000, CRC(7e367e8c) SHA1(161f585dc45665ea77433c84afd2f95049f7f5a0))
ROM_REGION(0x4000, "os", 0)
ROM_COPY("option", 0x40000, 0, 0x4000)
@@ -1776,7 +1792,7 @@ ROM_START(torchf)
ROM_REGION(0x4000, "os", 0)
ROM_COPY("option", 0x40000, 0, 0x4000)
- ROM_REGION(0x8000, "vsm", 0) /* system speech PHROM */
+ ROM_REGION(0x4000, "vsm", 0) /* system speech PHROM */
ROM_LOAD("phrom_us.bin", 0x0000, 0x4000, CRC(bf4b3b64) SHA1(66876702d1d95eecc034d20f25047f893a27cde5))
ROM_END
@@ -1817,7 +1833,7 @@ ROM_START(bbcbp)
ROM_REGION(0x4000, "os", 0)
ROM_COPY("option", 0x40000, 0, 0x4000)
- ROM_REGION(0x8000, "vsm", 0) /* system speech PHROM */
+ ROM_REGION(0x4000, "vsm", 0) /* system speech PHROM */
ROM_LOAD("phroma.bin", 0x0000, 0x4000, CRC(98e1bf9e) SHA1(b369809275cb67dfd8a749265e91adb2d2558ae6))
ROM_END
@@ -1865,7 +1881,7 @@ ROM_START(abc110)
ROM_REGION(0x4000, "os", 0)
ROM_COPY("option", 0x40000, 0, 0x4000)
- ROM_REGION(0x8000, "vsm", 0) /* system speech PHROM */
+ ROM_REGION(0x4000, "vsm", 0) /* system speech PHROM */
ROM_LOAD("phroma.bin", 0x0000, 0x4000, CRC(98e1bf9e) SHA1(b369809275cb67dfd8a749265e91adb2d2558ae6))
ROM_END
@@ -1907,7 +1923,7 @@ ROM_START(acw443)
ROM_REGION(0x4000, "os", 0)
ROM_COPY("option", 0x40000, 0, 0x4000)
- ROM_REGION(0x8000, "vsm", 0) /* system speech PHROM */
+ ROM_REGION(0x4000, "vsm", 0) /* system speech PHROM */
ROM_LOAD("phroma.bin", 0x0000, 0x4000, CRC(98e1bf9e) SHA1(b369809275cb67dfd8a749265e91adb2d2558ae6))
ROM_END
diff --git a/src/mame/includes/bbc.h b/src/mame/includes/bbc.h
index 51b36c82948..dcf3e803b2e 100644
--- a/src/mame/includes/bbc.h
+++ b/src/mame/includes/bbc.h
@@ -23,6 +23,7 @@
#include "machine/wd_fdc.h"
#include "machine/upd7002.h"
#include "machine/mc146818.h"
+#include "machine/input_merger.h"
#include "video/mc6845.h"
#include "video/saa5050.h"
#include "sound/sn76496.h"
@@ -66,6 +67,7 @@ public:
m_hd6845(*this, "hd6845"),
m_adlc(*this, "mc6854"),
m_sn(*this, "sn76489"),
+ m_keyboard(*this, "COL%u", 0),
m_trom(*this, "saa5050"),
m_tms(*this, "tms5220"),
m_cassette(*this, "cassette"),
@@ -83,10 +85,7 @@ public:
m_exp2(*this, "exp_rom2"),
m_exp3(*this, "exp_rom3"),
m_exp4(*this, "exp_rom4"),
- m_joy0(*this, "JOY0"),
- m_joy1(*this, "JOY1"),
- m_joy2(*this, "JOY2"),
- m_joy3(*this, "JOY3"),
+ m_joy(*this, "JOY%u", 0),
m_region_maincpu(*this, "maincpu"),
m_region_os(*this, "os"),
m_region_opt(*this, "option"),
@@ -98,10 +97,7 @@ public:
m_bank6(*this, "bank6"),
m_bank7(*this, "bank7"),
m_bank8(*this, "bank8"),
- m_ACCCON_IRR(CLEAR_LINE),
- m_via_system_irq(CLEAR_LINE),
- m_via_user_irq(CLEAR_LINE),
- m_acia_irq(CLEAR_LINE),
+ m_irqs(*this, "irqs"),
m_palette(*this, "palette"),
m_bbcconfig(*this, "BBCCONFIG")
{ }
@@ -164,17 +160,14 @@ public:
INTERRUPT_GEN_MEMBER(bbcb_keyscan);
TIMER_CALLBACK_MEMBER(bbc_tape_timer_cb);
DECLARE_WRITE_LINE_MEMBER(write_acia_clock);
- DECLARE_WRITE_LINE_MEMBER(bbcb_acia6850_irq_w);
DECLARE_WRITE_LINE_MEMBER(adlc_irq_w);
DECLARE_WRITE_LINE_MEMBER(econet_clk_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(bbcb_via_system_irq_w);
DECLARE_READ8_MEMBER(bbcb_via_user_read_portb);
DECLARE_WRITE8_MEMBER(bbcb_via_user_write_portb);
- DECLARE_WRITE_LINE_MEMBER(bbcb_via_user_irq_w);
DECLARE_WRITE_LINE_MEMBER(bbc_hsync_changed);
DECLARE_WRITE_LINE_MEMBER(bbc_vsync_changed);
DECLARE_WRITE_LINE_MEMBER(bbc_de_changed);
@@ -218,6 +211,7 @@ private:
required_device<hd6845_device> m_hd6845;
optional_device<mc6854_device> m_adlc;
optional_device<sn76489_device> m_sn;
+ required_ioport_array<13> m_keyboard;
public: // HACK FOR MC6845
optional_device<saa5050_device> m_trom;
optional_device<tms5220_device> m_tms;
@@ -232,11 +226,11 @@ public: // HACK FOR MC6845
optional_device<i8271_device> m_i8271;
optional_device<wd1770_t> m_wd1770;
optional_device<wd1772_t> m_wd1772;
- required_device<generic_slot_device> m_exp1;
- required_device<generic_slot_device> m_exp2;
+ optional_device<generic_slot_device> m_exp1;
+ optional_device<generic_slot_device> m_exp2;
optional_device<generic_slot_device> m_exp3;
optional_device<generic_slot_device> m_exp4;
- optional_ioport m_joy0, m_joy1, m_joy2, m_joy3;
+ optional_ioport_array<4> m_joy;
required_memory_region m_region_maincpu;
required_memory_region m_region_os;
@@ -250,7 +244,7 @@ public: // HACK FOR MC6845
required_memory_bank m_bank7; // bbca bbcb bbcbp bbcbp128 bbcm
optional_memory_bank m_bank8; // bbcm
- void check_interrupts();
+ required_device<input_merger_active_high_device> m_irqs;
machine_type_t m_machinetype;
@@ -309,16 +303,18 @@ public: // HACK FOR MC6845
The function of the 8 output bits from this latch are:-
B0 - Write Enable to the sound generator IC
- B1 - READ select on the speech processor
+ B1 - READ select on the speech processor (B and B+)
+ R/nW control on CMOS RAM (Master only)
B2 - WRITE select on the speech processor
+ DS control on CMOS RAM (Master only)
B3 - Keyboard write enable
B4,B5 - these two outputs define the number to be added to the
start of screen address in hardware to control hardware scrolling:-
- Mode Size Start of screen Number to add B5 B4
- 0,1,2 20K &3000 12K 1 1
- 3 16K &4000 16K 0 0
- 4,5 10K &5800 (or &1800) 22K 1 0
- 6 8K &6000 (or &2000) 24K 0 1
+ Mode Size Start of screen Size No.to add B5 B4
+ 0,1,2 20K &3000 12K 1 1
+ 3 16K &4000 16K 0 0
+ 4,5 10K &5800 (or &1800) 22K 1 0
+ 6 8K &6000 (or &2000) 24K 0 1
B6 - Operates the CAPS lock LED (Pin 17 keyboard connector)
B7 - Operates the SHIFT lock LED (Pin 16 keyboard connector)
*/
@@ -340,9 +336,6 @@ public: // HACK FOR MC6845
int m_via_system_porta;
// interrupt state
- int m_via_system_irq;
- int m_via_user_irq;
- int m_acia_irq;
int m_adlc_irq;
int m_column; // this is a counter in the keyboard circuit
diff --git a/src/mame/machine/bbc.cpp b/src/mame/machine/bbc.cpp
index 522fffad39c..3a710b79a31 100644
--- a/src/mame/machine/bbc.cpp
+++ b/src/mame/machine/bbc.cpp
@@ -22,13 +22,6 @@
#include "imagedev/cassette.h"
-void bbc_state::check_interrupts()
-{
- int irq = (m_via_system_irq || m_via_user_irq || m_acia_irq || m_ACCCON_IRR) ? ASSERT_LINE : CLEAR_LINE;
-
- m_maincpu->set_input_line(M6502_IRQ_LINE, irq);
-}
-
/*************************
Model A memory handling functions
*************************/
@@ -336,7 +329,7 @@ WRITE8_MEMBER(bbc_state::bbcm_ACCCON_write)
if (tempIRR!=m_ACCCON_IRR)
{
- check_interrupts();
+ m_irqs->in3_w(m_ACCCON_IRR);
}
if (m_ACCCON_Y)
@@ -711,12 +704,6 @@ B7 - Operates the SHIFT lock LED (Pin 16 keyboard connector)
INTERRUPT_GEN_MEMBER(bbc_state::bbcb_keyscan)
{
- static const char *const colnames[] = {
- "COL0", "COL1", "COL2", "COL3", "COL4",
- "COL5", "COL6", "COL7", "COL8", "COL9",
- "COL10", "COL11", "COL12"
- };
-
/* only do auto scan if keyboard is not enabled */
if (m_b3_keyboard == 1)
{
@@ -733,7 +720,7 @@ INTERRUPT_GEN_MEMBER(bbc_state::bbcb_keyscan)
/* KBD IC4 8 input NAND gate */
/* set the value of via_system ca2, by checking for any keys
being pressed on the selected m_column */
- if ((ioport(colnames[m_column])->read() | 0x01) != 0xff)
+ if ((m_keyboard[m_column]->read() | 0x01) != 0xff)
{
m_via6522_0->write_ca2(1);
}
@@ -755,11 +742,6 @@ int bbc_state::bbc_keyboard(address_space &space, int data)
int bit;
int row;
int res;
- static const char *const colnames[] = {
- "COL0", "COL1", "COL2", "COL3", "COL4",
- "COL5", "COL6", "COL7", "COL8", "COL9",
- "COL10", "COL11", "COL12"
- };
m_column = data & 0x0f;
row = (data>>4) & 0x07;
@@ -768,7 +750,7 @@ int bbc_state::bbc_keyboard(address_space &space, int data)
if (m_column < 13)
{
- res = ioport(colnames[m_column])->read();
+ res = m_keyboard[m_column]->read();
}
else
{
@@ -799,14 +781,14 @@ int bbc_state::bbc_keyboard(address_space &space, int data)
void bbc_state::bbcb_IC32_initialise(bbc_state *state)
{
- m_b0_sound=0x01; // Write Enable to the sound generator IC
- m_b1_speech_read=0x01; // READ select on the speech processor
- m_b2_speech_write=0x01; // WRITE select on the speech processor
- m_b3_keyboard=0x01; // Keyboard write enable
- m_b4_video0=0x01; // These two outputs define the number to be added to the start of screen address
- m_b5_video1=0x01; // in hardware to control hardware scrolling
- m_b6_caps_lock_led=0x01; // Operates the CAPS lock LED
- m_b7_shift_lock_led=0x01; // Operates the SHIFT lock LED
+ m_b0_sound = 0x01; // Write Enable to the sound generator IC
+ m_b1_speech_read = 0x01; // READ select on the speech processor
+ m_b2_speech_write = 0x01; // WRITE select on the speech processor
+ m_b3_keyboard = 0x01; // Keyboard write enable
+ m_b4_video0 = 0x01; // These two outputs define the number to be added to the start of screen address
+ m_b5_video1 = 0x01; // in hardware to control hardware scrolling
+ m_b6_caps_lock_led = 0x01; // Operates the CAPS lock LED
+ m_b7_shift_lock_led = 0x01; // Operates the SHIFT lock LED
}
@@ -877,7 +859,7 @@ WRITE8_MEMBER(bbc_state::bbcb_via_system_write_portb)
{
int bit, value;
bit = data & 0x07;
- value = BIT(data,3);
+ value = BIT(data, 3);
//logerror("SYSTEM write portb %d %d %d\n",data,bit,value);
@@ -1090,13 +1072,6 @@ READ8_MEMBER(bbc_state::bbcb_via_system_read_portb)
}
-WRITE_LINE_MEMBER(bbc_state::bbcb_via_system_irq_w)
-{
- m_via_system_irq = state;
-
- check_interrupts();
-}
-
/**********************************************************************
USER VIA
Port A output is buffered before being connected to the printer connector.
@@ -1117,13 +1092,6 @@ WRITE8_MEMBER(bbc_state::bbcb_via_user_write_portb)
m_userport = data;
}
-WRITE_LINE_MEMBER(bbc_state::bbcb_via_user_irq_w)
-{
- m_via_user_irq = state;
-
- check_interrupts();
-}
-
/**************************************
BBC Joystick Support
@@ -1131,19 +1099,7 @@ BBC Joystick Support
UPD7002_GET_ANALOGUE(bbc_state::BBC_get_analogue_input)
{
- switch (channel_number)
- {
- case 0:
- return ((0xff - m_joy0->read()) << 8);
- case 1:
- return ((0xff - m_joy1->read()) << 8);
- case 2:
- return ((0xff - m_joy2->read()) << 8);
- case 3:
- return ((0xff - m_joy3->read()) << 8);
- }
-
- return 0;
+ return ((0xff - m_joy[channel_number]->read()) << 8);
}
UPD7002_EOC(bbc_state::BBC_uPD7002_EOC)
@@ -1346,14 +1302,6 @@ WRITE_LINE_MEMBER( bbc_state::bbc_txd_w )
}
-WRITE_LINE_MEMBER( bbc_state::bbcb_acia6850_irq_w )
-{
- m_acia_irq = state;
-
- check_interrupts();
-}
-
-
void bbc_state::BBC_Cassette_motor(unsigned char status)
{
if (status)
@@ -1476,15 +1424,20 @@ WRITE_LINE_MEMBER(bbc_state::side_w)
void bbc_state::bbc_update_nmi()
{
- if (m_fdc_irq || m_fdc_drq)
- m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
+ if (m_fdc_irq || m_fdc_drq || m_adlc_irq)
+ {
+ m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
+ }
+ else
+ {
+ m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
+ }
}
WRITE_LINE_MEMBER(bbc_state::fdc_intrq_w)
{
m_fdc_irq = state;
bbc_update_nmi();
-
}
WRITE_LINE_MEMBER(bbc_state::fdc_drq_w)