From ad8f14beb52272ec784263579f4c7c2e9a002955 Mon Sep 17 00:00:00 2001 From: Nigel Barnes Date: Fri, 26 Oct 2018 13:58:49 +0100 Subject: bbc.cpp: Reimplemented the addressable latch with LS259 device. - Added 32K ROM slots in B+ and Master variants. - Use bankdev to switch IO/ROM in Master. - Use ram_device instead of ROM_REGION for RAM. - Added I2CMEM device for PCD8572 in Master Compact. - Corrected sound device SN76489->SN76489A. --- src/devices/bus/bbc/1mhzbus/1mhzbus.cpp | 30 +- src/devices/bus/bbc/1mhzbus/1mhzbus.h | 1 + src/devices/bus/bbc/tube/tube.cpp | 51 +- src/devices/bus/bbc/tube/tube.h | 2 +- src/mame/drivers/bbc.cpp | 1217 +++++++++++++++---------------- src/mame/includes/bbc.h | 476 ++++++------ src/mame/machine/bbc.cpp | 1122 +++++++++++----------------- src/mame/video/bbc.cpp | 21 +- 8 files changed, 1317 insertions(+), 1603 deletions(-) diff --git a/src/devices/bus/bbc/1mhzbus/1mhzbus.cpp b/src/devices/bus/bbc/1mhzbus/1mhzbus.cpp index 06458b4d748..138926a219a 100644 --- a/src/devices/bus/bbc/1mhzbus/1mhzbus.cpp +++ b/src/devices/bus/bbc/1mhzbus/1mhzbus.cpp @@ -132,6 +132,7 @@ WRITE8_MEMBER(bbc_1mhzbus_slot_device::jim_w) // slot devices //#include "teletext.h" //#include "ieee488.h" +//#include "m2000.h" //#include "m5000.h" //#include "scsi.h" //#include "multiform.h" @@ -146,18 +147,37 @@ WRITE8_MEMBER(bbc_1mhzbus_slot_device::jim_w) 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("ieee488", BBC_IEEE488); /* Acorn ANK01 IEEE488 Interface */ //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("b488", BBC_B488); /* Aries B488 */ + //device.option_add("procyon", BBC_PROCYON); /* CST Procyon IEEE Interface */ + //device.option_add("twdd", BBC_TWDD); /* Technomatic Winchester (Akhter Host Adaptor + ABD4070 */ //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("beebsid", BBC_BEEBSID); /* BeebSID */ //device.option_add("prisma3", BBC_PRISMA3); /* PRISMA-3 - Millipede 1989 */ +} + +void bbcm_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("awdd", BBC_AWDD); /* Acorn Winchester 110/130 */ + //device.option_add("b488", BBC_B488); /* Aries B488 */ + //device.option_add("procyon", BBC_PROCYON); /* CST Procyon IEEE Interface */ + //device.option_add("twdd", BBC_TWDD); /* Technomatic Winchester (Akhter Host Adaptor + ABD4070 */ + //device.option_add("m2000", BBC_M2000); /* Hybrid Music 2000 Interface */ + //device.option_add("m3000", BBC_M3000); /* Hybrid Music 3000 Expander */ + //device.option_add("m5000", BBC_M5000); /* Hybrid Music 5000 Synthesiser */ + //device.option_add("m87", BBC_M87); /* Peartree Music 87 Synthesiser */ + //device.option_add("multiform", BBC_MULTIFORM); /* Technomatic Multiform Z80 */ + //device.option_add("opusa", BBC_OPUSA); /* Opus Challenger ADFS */ + //device.option_add("ramdisc", BBC_RAMDISC); /* Morley Electronics RAM Disc */ + device.option_add("beebsid", BBC_BEEBSID); /* BeebSID */ + //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 c1229718494..ceabd85ed4b 100644 --- a/src/devices/bus/bbc/1mhzbus/1mhzbus.h +++ b/src/devices/bus/bbc/1mhzbus/1mhzbus.h @@ -150,6 +150,7 @@ protected: DECLARE_DEVICE_TYPE(BBC_1MHZBUS_SLOT, bbc_1mhzbus_slot_device) void bbc_1mhzbus_devices(device_slot_interface &device); +void bbcm_1mhzbus_devices(device_slot_interface &device); #endif // MAME_BUS_BBC_1MHZBUS_1MHZBUS_H diff --git a/src/devices/bus/bbc/tube/tube.cpp b/src/devices/bus/bbc/tube/tube.cpp index 521497361ee..9ec7148ff61 100644 --- a/src/devices/bus/bbc/tube/tube.cpp +++ b/src/devices/bus/bbc/tube/tube.cpp @@ -119,33 +119,57 @@ WRITE8_MEMBER(bbc_tube_slot_device::host_w) #include "tube_arm.h" #include "tube_casper.h" //#include "tube_pmsb2p.h" +//#include "tube_rc6502.h" //#include "tube_x25.h" #include "tube_z80.h" #include "tube_zep100.h" //------------------------------------------------- -// SLOT_INTERFACE( bbc_extube_devices ) +// SLOT_INTERFACE( bbc_tube_devices ) //------------------------------------------------- -void bbc_extube_devices(device_slot_interface &device) +void bbc_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("32016", BBC_TUBE_32016); /* Acorn ANC05 32016 2nd processor */ + //device.option_add("32016", BBC_TUBE_32016); /* Acorn ANC05 32016 2nd 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("casper", BBC_TUBE_CASPER); /* Casper 68000 2nd Processor */ //device.option_add("pmsb2p", BBC_TUBE_PMSB2P); /* PMS B2P-6502 */ //device.option_add("hdp68k", BBC_TUBE_HDP68K); /* Torch Unicorn (HDP68K) */ + //device.option_add("x25", BBC_TUBE_X25); /* Econet X25 Gateway */ 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) */ + //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) */ /* 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 */ + //device.option_add("rc6502", BBC_TUBE_RC6502); /* ReCo6502 (6502) */ + //device.option_add("rc65816", BBC_TUBE_RC65816); /* ReCo6502 (65816) */ +} + + +//------------------------------------------------- +// SLOT_INTERFACE( bbc_extube_devices ) +//------------------------------------------------- + +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("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("pmsb2p", BBC_TUBE_PMSB2P); /* PMS B2P-6502 */ + /* 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 */ + //device.option_add("rc6502", BBC_TUBE_RC6502); /* ReCo6502 (6502) */ + //device.option_add("rc65816", BBC_TUBE_RC65816); /* ReCo6502 (65816) */ } @@ -157,7 +181,10 @@ void bbc_intube_devices(device_slot_interface &device) { device.option_add("65c102", BBC_TUBE_65C102); /* Acorn ADC06 65C102 co-processor */ device.option_add("80186", BBC_TUBE_80186); /* Acorn ADC08 80186 co-processor */ -// device.option_add("arm7", BBC_TUBE_ARM7); /* Sprow ARM7 co-processor */ + //device.option_add("zep100m", BBC_TUBE_ZEP100M); /* Torch Z80 Communicator (ZEP100) (Master) */ + //device.option_add("arm7", BBC_TUBE_ARM7); /* Sprow ARM7 co-processor */ + //device.option_add("rc6502", BBC_TUBE_RC6502); /* ReCo6502 (6502) */ + //device.option_add("rc65816", BBC_TUBE_RC65816); /* ReCo6502 (65816) */ } @@ -172,12 +199,6 @@ void electron_tube_devices(device_slot_interface &device) 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 */ + //device.option_add("rc6502", BBC_TUBE_RC6502); /* ReCo6502 (6502) */ + //device.option_add("rc65816", BBC_TUBE_RC65816); /* ReCo6502 (65816) */ } - -//------------------------------------------------- -// SLOT_INTERFACE( bbc_x25tube_devices ) -//------------------------------------------------- - -//void bbc_x25tube_devices(device_slot_interface &device) -// device.option_add("x25", BBC_TUBE_X25); /* Econet X25 Gateway */ -//} diff --git a/src/devices/bus/bbc/tube/tube.h b/src/devices/bus/bbc/tube/tube.h index 1bcc413c8ac..954867f0b7f 100644 --- a/src/devices/bus/bbc/tube/tube.h +++ b/src/devices/bus/bbc/tube/tube.h @@ -103,10 +103,10 @@ protected: // device type definition DECLARE_DEVICE_TYPE(BBC_TUBE_SLOT, bbc_tube_slot_device) +void bbc_tube_devices(device_slot_interface &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); #endif // MAME_BUS_BBC_TUBE_TUBE_H diff --git a/src/mame/drivers/bbc.cpp b/src/mame/drivers/bbc.cpp index 0312b0a224c..120ea2c9115 100644 --- a/src/mame/drivers/bbc.cpp +++ b/src/mame/drivers/bbc.cpp @@ -42,30 +42,17 @@ ******************************************************************************/ -/* Core includes */ #include "emu.h" #include "includes/bbc.h" +#include "softlist.h" +#include "speaker.h" -/* Components */ -#include "bus/rs232/rs232.h" -#include "cpu/m6502/m6502.h" -#include "cpu/m6502/m65sc02.h" -#include "machine/6522via.h" -#include "bus/centronics/ctronics.h" -#include "bus/econet/econet.h" -#include "sound/tms5220.h" /* Speech */ -#include "video/saa5050.h" /* Teletext */ - -/* Devices */ #include "formats/acorn_dsk.h" #include "formats/fsd_dsk.h" #include "formats/pc_dsk.h" #include "imagedev/cassette.h" #include "formats/uef_cas.h" #include "formats/csw_cas.h" -#include "screen.h" -#include "softlist.h" -#include "speaker.h" #include "bbc.lh" #include "bbcm.lh" @@ -81,39 +68,39 @@ M = BBC Master | | | | | | &1000 | | | | |1 | | |1 |1 -| &2000 |1 | | | +| &2000 RAM |1 | | | | | | | | + &3000 | | + + |2 | | | | + &4000 + |1 | | | | | | | | &5000 | | | | -| | | |2 |2 +| LYNNE | | |2 |2 |3 &6000 |3 | | | | | | | | | &7000 | | | | | | | | | + &8000 + + + + -|4 | | | |4 +|4 ANDY | | | |4 + &9000 | | | + | | | |4 | |5 &A000 |4 |4 | |5 | | | | | -+ &B000 | | + | -|6 | | |6 | +| &B000 | | + | +| | | |5 | + &C000 + + + + -| | | | |7 -|7 &D000 | | | | | | | | | -+ &E000 |7 |7 |7 + +|6 &D000 HAZEL | | | |6 | | | | | -|8 &F000 | | | |8 ++ &E000 |6 |6 |6 + +| | | | | +| &F000 | | | | | | | | | + &FC00 FRED + + + + &FD00 JIM + + + + &FE00 SHEILA + + + + + &FF00 + + + + -|9 |9 |9 |9 |9 +| |6 |6 |6 | + &FFFF + + + + @@ -137,59 +124,41 @@ read: &E0-&FF Tube ULA Tube system interface 32 (32 bytes x 1 ) 2MHz ******************************************************************************/ -READ8_MEMBER(bbc_state::bbc_fe_r) -{ - return 0xfe; -} - void bbc_state::bbca_mem(address_map &map) { - map.unmap_value_high(); // Hardware marked with a # is not present in a Model A + map.unmap_value_high(); map(0x0000, 0x3fff).bankrw("bank1"); // 0000-3fff Regular RAM map(0x4000, 0x7fff).bankrw("bank3"); // 4000-7fff Regular RAM mirrored - 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 + map(0x8000, 0xbfff).bankr("bank4").w(FUNC(bbc_state::bbc_bank4_w)); // 8000-bfff Paged ROM/RAM + map(0xc000, 0xffff).bankr("bank6"); // c000-fbff OS ROM 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 - map(0xfe30, 0xfe3f).rw(FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::page_selecta_w)); // W: fe30-fe3f 74LS161 Paged ROM selector + map(0xfe08, 0xfe0f).rw(m_acia, FUNC(acia6850_device::read), FUNC(acia6850_device::write)); // fe08-fe0f 6850 ACIA Serial controller + map(0xfe10, 0xfe17).w(FUNC(bbc_state::serial_ula_w)); // fe10-fe17 Serial ULA Serial system chip + map(0xfe20, 0xfe2f).w(FUNC(bbc_state::video_ula_w)); // W: fe20-fe2f Video ULA Video system chip + map(0xfe30, 0xfe3f).w(FUNC(bbc_state::bbc_romsel_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 - map(0xfe80, 0xfe9f).noprw(); // fe80-fe9f 8271/1770 FDC # Floppy disc controller - map(0xfea0, 0xfebf).r(FUNC(bbc_state::bbc_fe_r)); // fea0-febf 68B54 ADLC # ECONET controller - map(0xfec0, 0xfedf).noprw(); // fec0-fedf uPD7002 # Analogue to digital converter - map(0xfee0, 0xfeff).r(FUNC(bbc_state::bbc_fe_r)); // fee0-feff Tube ULA # Tube system interface - map(0xff00, 0xffff).rom().region("os", 0x3f00); // ff00-ffff OS ROM (continued) } void bbc_state::bbc_base(address_map &map) { map.unmap_value_high(); - map(0xc000, 0xfbff).bankr("bank7"); // c000-fbff OS ROM + map(0xc000, 0xffff).bankr("bank6"); // c000-fbff OS ROM 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)); - 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(0xfe08, 0xfe0f).rw(m_acia, FUNC(acia6850_device::read), FUNC(acia6850_device::write)); // fe08-fe0f 6850 ACIA Serial controller + map(0xfe10, 0xfe17).w(FUNC(bbc_state::serial_ula_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 + map(0xfe20, 0xfe2f).w(FUNC(bbc_state::video_ula_w)); // 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 - 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 - map(0xff00, 0xffff).rom().region("os", 0x3f00); // ff00-ffff OS ROM (continued) } @@ -198,10 +167,10 @@ void bbc_state::bbcb_mem(address_map &map) bbc_base(map); map(0x0000, 0x3fff).bankrw("bank1"); // 0000-3fff Regular RAM 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, 0xfe83).m(m_i8271, FUNC(i8271_device::map)); // fe80-fe83 8271 FDC Floppy disc controller - map(0xfe84, 0xfe9f).rw(m_i8271, FUNC(i8271_device::data_r), FUNC(i8271_device::data_w)); // fe84-fe9f 8271 FDC Floppy disc controller + map(0x8000, 0xbfff).bankr("bank4").w(FUNC(bbc_state::bbc_bank4_w)); // 8000-bfff Paged ROM/RAM + map(0xfe30, 0xfe3f).w(FUNC(bbc_state::bbc_romsel_w)); // W: fe30-fe3f 84LS161 Paged ROM selector + map(0xfe80, 0xfe83).mirror(0x08).m(m_i8271, FUNC(i8271_device::map)); // fe80-fe83 8271 FDC Floppy disc controller + map(0xfe84, 0xfe87).mirror(0x08).rw(m_i8271, FUNC(i8271_device::data_r), FUNC(i8271_device::data_w)); // fe84-fe9f 8271 FDC Floppy disc controller } @@ -210,96 +179,146 @@ void bbc_state::bbcb_nofdc_mem(address_map &map) bbc_base(map); map(0x0000, 0x3fff).bankrw("bank1"); // 0000-3fff Regular RAM 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(0x8000, 0xbfff).bankr("bank4").w(FUNC(bbc_state::bbc_bank4_w)); // 8000-bfff Paged ROM/RAM + map(0xfe30, 0xfe3f).w(FUNC(bbc_state::bbc_romsel_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 } -void bbc_state::bbcbp_mem(address_map &map) +void bbcbp_state::bbcbp_mem(address_map &map) { bbc_base(map); map(0x0000, 0x2fff).bankrw("bank1"); // 0000-2fff Regular RAM map(0x3000, 0x7fff).bankrw("bank2"); // 3000-7fff Video/Shadow RAM - map(0x8000, 0xafff).bankr("bank4").w(FUNC(bbc_state::bbc_memorybp4_w)); // 8000-afff Paged ROM or 12K of SWRAM - map(0xb000, 0xbfff).bankr("bank6").w(FUNC(bbc_state::bbc_memorybp6_w)); // b000-bfff Rest of paged ROM area - map(0xfe30, 0xfe3f).w(FUNC(bbc_state::page_selectbp_w)); // W: fe30-fe3f 84LS161 Paged ROM selector - map(0xfe80, 0xfe83).w(FUNC(bbc_state::bbc_wd1770_status_w)); // fe80-fe83 1770 FDC Drive control register + map(0x8000, 0xafff).bankr("bank4").w(FUNC(bbc_state::bbcbp_bank4_w)); // 8000-afff Paged ROM or 12K of SWRAM + map(0xb000, 0xbfff).bankr("bank5").w(FUNC(bbc_state::bbcbp_bank5_w)); // b000-bfff Rest of paged ROM area + map(0xfe30, 0xfe3f).w(FUNC(bbc_state::bbcbp_romsel_w)); // W: fe30-fe3f 84LS161 Paged ROM selector + map(0xfe80, 0xfe83).w(FUNC(bbc_state::bbcbp_drive_control_w)); // fe80-fe83 1770 FDC Drive control register map(0xfe84, 0xfe9f).rw(m_wd1770, FUNC(wd1770_device::read), FUNC(wd1770_device::write)); // fe84-fe9f 1770 FDC Floppy disc controller - 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 } -void bbc_state::bbcbp128_mem(address_map &map) +void bbcbp_state::reutapm_mem(address_map &map) { bbc_base(map); map(0x0000, 0x2fff).bankrw("bank1"); // 0000-2fff Regular RAM map(0x3000, 0x7fff).bankrw("bank2"); // 3000-7fff Video/Shadow RAM - map(0x8000, 0xafff).bankr("bank4").w(FUNC(bbc_state::bbc_memorybp4_w)); // 8000-afff Paged ROM or 12K of SWRAM - map(0xb000, 0xbfff).bankr("bank6").w(FUNC(bbc_state::bbc_memorybp6_w)); // b000-bfff Rest of paged ROM area - map(0xfe30, 0xfe3f).w(FUNC(bbc_state::page_selectbp128_w)); // W: fe30-fe3f 84LS161 Paged ROM selector - map(0xfe80, 0xfe83).w(FUNC(bbc_state::bbc_wd1770_status_w)); // fe80-fe83 1770 FDC Drive control register - map(0xfe84, 0xfe9f).rw(m_wd1770, FUNC(wd1770_device::read), FUNC(wd1770_device::write)); // fe84-fe9f 1770 FDC Floppy disc controller - 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 + map(0x8000, 0xafff).bankr("bank4").w(FUNC(bbc_state::bbcbp_bank4_w)); // 8000-afff Paged ROM or 12K of SWRAM + map(0xb000, 0xbfff).bankr("bank5").w(FUNC(bbc_state::bbcbp_bank5_w)); // b000-bfff Rest of paged ROM area + map(0xfe30, 0xfe3f).w(FUNC(bbc_state::bbcbp_romsel_w)); // W: fe30-fe3f 84LS161 Paged ROM selector } -void bbc_state::reutapm_mem(address_map &map) +void bbcbp_state::bbcbp_fetch(address_map &map) { - bbc_base(map); - map(0x0000, 0x2fff).bankrw("bank1"); // 0000-2fff Regular RAM - map(0x3000, 0x7fff).bankrw("bank2"); // 3000-7fff Video/Shadow RAM - map(0x8000, 0xafff).bankr("bank4").w(FUNC(bbc_state::bbc_memorybp4_w)); // 8000-afff Paged ROM or 12K of SWRAM - map(0xb000, 0xbfff).bankr("bank6").w(FUNC(bbc_state::bbc_memorybp6_w)); // b000-bfff Rest of paged ROM area - map(0xfe30, 0xfe3f).w(FUNC(bbc_state::page_selectbp_w)); // W: fe30-fe3f 84LS161 Paged ROM selector - 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 + map(0x0000, 0xffff).r(FUNC(bbc_state::bbcbp_fetch_r)); } -void bbc_state::bbcbp_fetch(address_map &map) +void bbcm_state::bbcm_mem(address_map &map) { - map(0x0000, 0xffff).r(FUNC(bbc_state::bbcbp_fetch_r)); + map(0x0000, 0x2fff).bankrw("bank1"); /* 0000-2fff Regular RAM */ + map(0x3000, 0x7fff).bankrw("bank2"); /* 3000-7fff Video/Shadow RAM LYNNE */ + map(0x8000, 0x8fff).bankr("bank4").w(FUNC(bbc_state::bbcm_bank4_w)); /* 8000-8fff Paged ROM/RAM or 4K of RAM ANDY */ + map(0x9000, 0xbfff).bankr("bank5").w(FUNC(bbc_state::bbcm_bank5_w)); /* 9000-bfff Rest of paged ROM/RAM area */ + map(0xc000, 0xffff).rom().region("mos", 0); /* c000-ffff OS ROM */ + map(0xc000, 0xdfff).bankr("bank6").w(FUNC(bbc_state::bbcm_bank6_w)); /* c000-dfff OS ROM or 8K of RAM HAZEL */ + map(0xfc00, 0xffff).m(m_bankdev, FUNC(address_map_bank_device::amap8)); /* fc00-ffff OS ROM or hardware IO */ } -/****************************************************************************** -&FC00-&FCFF FRED -&FD00-&FDFF JIM -&FE00-&FEFF SHEILA Read Write -&00-&07 6845 CRTC Video controller Video Controller 8 ( 2 bytes x 4 ) -&08-&0F 6850 ACIA Serial controller Serial Controller 8 ( 2 bytes x 4 ) -&10-&17 Serial ULA - Serial system chip 8 ( 1 byte x 8 ) -&18-&1F uPD7002 A to D converter A to D converter 8 ( 4 bytes x 2 ) - -&20-&23 Video ULA - Video system chip 4 ( 2 bytes x 2 ) -&24-&27 FDC Latch 1770 Control latch 1770 Control latch 4 ( 1 byte x 4 ) -&28-&2F 1770 registers 1770 Disc Controller 1770 Disc Controller 8 ( 4 bytes x 2 ) -&30-&33 ROMSEL - ROM Select 4 ( 1 byte x 4 ) -&34-&37 ACCCON ACCCON select reg. ACCCON select reg 4 ( 1 byte x 4 ) -&38-&3F NC - - -&40-&5F 6522 VIA SYSTEM VIA SYSTEM VIA 32 (16 bytes x 2 ) 1MHz -&60-&7F 6522 VIA USER VIA USER VIA 32 (16 bytes x 2 ) 1MHz -&80-&9F Int. Modem Int. Modem Int Modem -&A0-&BF 68B54 ADLC ECONET controller ECONET controller 32 ( 4 bytes x 8 ) 2MHz -&C0-&DF NC - - -&E0-&FF Tube ULA Tube system interface Tube system interface 32 (32 bytes x 1 ) 2MHz -******************************************************************************/ +void bbcm_state::bbcm_fetch(address_map &map) +{ + map(0x0000, 0xffff).r(FUNC(bbc_state::bbcm_fetch_r)); +} -void bbc_state::bbcm_mem(address_map &map) +void bbcm_state::bbcm_bankdev(address_map &map) { - map(0x0000, 0x2fff).bankrw("bank1"); /* 0000-2fff Regular RAM */ - map(0x3000, 0x7fff).bankrw("bank2"); /* 3000-7fff Video/Shadow RAM */ - map(0x8000, 0x8fff).bankr("bank4").w(FUNC(bbc_state::bbc_memorybm4_w)); /* 8000-8fff Paged ROM/RAM or 4K of RAM ANDY */ - map(0x9000, 0xbfff).bankr("bank5").w(FUNC(bbc_state::bbc_memorybm5_w)); /* 9000-bfff Rest of paged ROM/RAM area */ - map(0xc000, 0xdfff).bankr("bank7").w(FUNC(bbc_state::bbc_memorybm7_w)); /* c000-dfff OS ROM or 8K of RAM HAZEL */ - map(0xe000, 0xffff).rom().region("os", 0x2000); /* e000-ffff OS ROM */ - map(0xfc00, 0xfeff).bankr("bank8").w(FUNC(bbc_state::bbcm_w)); /* processed directly because it can be ROM or hardware */ + map.unmap_value_high(); + /* ACCCON TST bit - normal state */ + map(0x0000, 0x03ff).rom().region("mos", 0x3c00); // fc00-ffff OS ROM (continued) + map(0x0000, 0x00ff).mirror(0x400).rw(m_1mhzbus, FUNC(bbc_1mhzbus_slot_device::fred_r), FUNC(bbc_1mhzbus_slot_device::fred_w)); // fc00-fcff Master FRED Address Page + map(0x0100, 0x01ff).mirror(0x400).rw(m_1mhzbus, FUNC(bbc_1mhzbus_slot_device::jim_r), FUNC(bbc_1mhzbus_slot_device::jim_w)); // fd00-fdff Master JIM Address Page + map(0x0200, 0x02ff).mirror(0x400).r(FUNC(bbc_state::bbc_fe_r)); // fe00-feff SHEILA Address Page + map(0x0200, 0x0200).mirror(0x406).rw(m_hd6845, FUNC(hd6845_device::status_r), FUNC(hd6845_device::address_w)); // fe00-fe07 6845 CRTC Video controller + map(0x0201, 0x0201).mirror(0x406).rw(m_hd6845, FUNC(hd6845_device::register_r), FUNC(hd6845_device::register_w)); + map(0x0208, 0x020f).mirror(0x400).rw(m_acia, FUNC(acia6850_device::read), FUNC(acia6850_device::write)); // fe08-fe0f 6850 ACIA Serial controller + map(0x0210, 0x0217).mirror(0x400).w(FUNC(bbc_state::serial_ula_w)); // fe10-fe17 Serial ULA Serial system chip + map(0x0218, 0x021f).mirror(0x400).rw(m_upd7002, FUNC(upd7002_device::read), FUNC(upd7002_device::write)); // fe18-fe1f uPD7002 Analogue to digital converter + map(0x0220, 0x0223).mirror(0x400).w(FUNC(bbc_state::video_ula_w)); // fe20-fe23 Video ULA Video system chip + map(0x0224, 0x0227).mirror(0x400).w(FUNC(bbc_state::bbcm_drive_control_w)); // fe24-fe27 FDC Latch 1770 Control latch + map(0x0228, 0x022f).mirror(0x400).rw(m_wd1770, FUNC(wd1770_device::read), FUNC(wd1770_device::write)); // fe28-fe2f 1770 FDC Floppy disc controller + map(0x0230, 0x0233).mirror(0x400).w(FUNC(bbc_state::bbcm_romsel_w)); // fe30-fe33 ROMSEL ROM Select + map(0x0234, 0x0237).mirror(0x400).rw(FUNC(bbc_state::bbcm_acccon_r), FUNC(bbc_state::bbcm_acccon_w)); // fe34-fe37 ACCCON ACCCON select register + map(0x0238, 0x023b).mirror(0x400).r(FUNC(bbc_state::bbc_fe_r)); // fe38-fe3b INTOFF + map(0x023c, 0x023f).mirror(0x400).r(FUNC(bbc_state::bbc_fe_r)); // fe3c-fe3f INTON + map(0x0240, 0x025f).mirror(0x400).rw(m_via6522_0, FUNC(via6522_device::read), FUNC(via6522_device::write)); // fe40-fe5f 6522 VIA SYSTEM VIA + map(0x0260, 0x027f).mirror(0x400).rw(m_via6522_1, FUNC(via6522_device::read), FUNC(via6522_device::write)); // fe60-fe7f 6522 VIA USER VIA + map(0x0280, 0x029f).mirror(0x400).r(FUNC(bbc_state::bbc_fe_r)); // fe80-fe9f Int. Modem Int. Modem + map(0x02a0, 0x02bf).mirror(0x400).rw(m_adlc, FUNC(mc6854_device::read), FUNC(mc6854_device::write)); // fea0-febf 68B54 ADLC ECONET controller + map(0x02e0, 0x02ff).mirror(0x400).rw(FUNC(bbc_state::bbcm_tube_r), FUNC(bbc_state::bbcm_tube_w)); // fee0-feff Tube ULA Tube system interface + /* ACCCON TST bit - hardware test */ + map(0x0400, 0x07ff).rom().region("mos", 0x3c00); // fc00-ffff OS ROM (continued) } -void bbc_state::bbcm_fetch(address_map &map) + +void bbcm_state::bbcmet_bankdev(address_map &map) { - map(0x0000, 0xffff).r(FUNC(bbc_state::bbcm_fetch_r)); + map.unmap_value_high(); + /* ACCCON TST bit - normal state */ + map(0x0000, 0x03ff).rom().region("mos", 0x3c00); // fc00-ffff OS ROM (continued) + map(0x0000, 0x00ff).mirror(0x400).unmaprw(); // fc00-fcff FRED Address Page + map(0x0100, 0x01ff).mirror(0x400).unmaprw(); // fd00-fdff JIM Address Page + map(0x0200, 0x02ff).mirror(0x400).r(FUNC(bbc_state::bbc_fe_r)); // fe00-feff SHEILA Address Page + map(0x0200, 0x0200).mirror(0x406).rw(m_hd6845, FUNC(hd6845_device::status_r), FUNC(hd6845_device::address_w)); // fe00-fe07 6845 CRTC Video controller + map(0x0201, 0x0201).mirror(0x406).rw(m_hd6845, FUNC(hd6845_device::register_r), FUNC(hd6845_device::register_w)); + map(0x0208, 0x020f).mirror(0x400).r(FUNC(bbc_state::bbc_fe_r)); // fe08-fe0f 6850 ACIA Serial controller + map(0x0210, 0x0217).mirror(0x400).w(FUNC(bbc_state::serial_ula_w)); // fe10-fe17 Serial ULA Serial system chip + map(0x0218, 0x021f).mirror(0x400).r(FUNC(bbc_state::bbc_fe_r)); // fe18-fe1f uPD7002 Analogue to digital converter + map(0x0220, 0x0223).mirror(0x400).w(FUNC(bbc_state::video_ula_w)); // fe20-fe23 Video ULA Video system chip + map(0x0224, 0x0227).mirror(0x400).r(FUNC(bbc_state::bbc_fe_r)); // fe24-fe27 FDC Latch 1770 Control latch + map(0x0228, 0x022f).mirror(0x400).r(FUNC(bbc_state::bbc_fe_r)); // fe28-fe2f 1770 FDC Floppy disc controller + map(0x0230, 0x0233).mirror(0x400).w(FUNC(bbc_state::bbcm_romsel_w)); // fe30-fe33 ROMSEL ROM Select + map(0x0234, 0x0237).mirror(0x400).rw(FUNC(bbc_state::bbcm_acccon_r), FUNC(bbc_state::bbcm_acccon_w)); // fe34-fe37 ACCCON ACCCON select register + map(0x0238, 0x023b).mirror(0x400).r(FUNC(bbc_state::bbc_fe_r)); // fe38-fe3b INTOFF + map(0x023c, 0x023f).mirror(0x400).r(FUNC(bbc_state::bbc_fe_r)); // fe3c-fe3f INTON + map(0x0240, 0x025f).mirror(0x400).rw(m_via6522_0, FUNC(via6522_device::read), FUNC(via6522_device::write)); // fe40-fe5f 6522 VIA SYSTEM VIA + map(0x0260, 0x027f).mirror(0x400).r(FUNC(bbc_state::bbc_fe_r)); // fe60-fe7f 6522 VIA USER VIA + map(0x0280, 0x029f).mirror(0x400).r(FUNC(bbc_state::bbc_fe_r)); // fe80-fe9f Int. Modem Int. Modem + map(0x02a0, 0x02bf).mirror(0x400).rw(m_adlc, FUNC(mc6854_device::read), FUNC(mc6854_device::write)); // fea0-febf 68B54 ADLC ECONET controller + map(0x02e0, 0x02ff).mirror(0x400).rw(FUNC(bbc_state::bbcm_tube_r), FUNC(bbc_state::bbcm_tube_w)); // fee0-feff Tube ULA Tube system interface + /* ACCCON TST bit - hardware test */ + map(0x0400, 0x07ff).rom().region("mos", 0x3c00); // fc00-ffff OS ROM (continued) +} + + +void bbcm_state::bbcmc_bankdev(address_map &map) +{ + map.unmap_value_high(); + /* ACCCON TST bit - normal state */ + map(0x0000, 0x03ff).rom().region("mos", 0x3c00); // fc00-ffff OS ROM (continued) + //map(0x0000, 0x00ff).mirror(0x400).rw(m_exp, FUNC(bbc_exp_slot_device::fred_r), FUNC(bbc_exp_slot_device::fred_w)); // fc00-fcff Compact FRED Address Page + //map(0x0100, 0x01ff).mirror(0x400).rw(m_exp, FUNC(bbc_exp_slot_device::jim_r), FUNC(bbc_exp_slot_device::jim_w)); // fd00-fdff Compact JIM Address Page + //map(0x0200, 0x02ff).mirror(0x400).rw(m_exp, FUNC(bbc_exp_slot_device::sheila_r), FUNC(bbc_exp_slot_device::sheila_w)); // fd00-fdff Compact SHEILA Address Page + map(0x0200, 0x0200).mirror(0x406).rw(m_hd6845, FUNC(hd6845_device::status_r), FUNC(hd6845_device::address_w)); // fe00-fe07 6845 CRTC Video controller + map(0x0201, 0x0201).mirror(0x406).rw(m_hd6845, FUNC(hd6845_device::register_r), FUNC(hd6845_device::register_w)); + map(0x0208, 0x020f).mirror(0x400).rw(m_acia, FUNC(acia6850_device::read), FUNC(acia6850_device::write)); // fe08-fe0f 6850 ACIA Serial controller + map(0x0210, 0x0217).mirror(0x400).w(FUNC(bbc_state::serial_ula_w)); // fe10-fe17 Serial ULA Serial system chip + map(0x0220, 0x0223).mirror(0x400).w(FUNC(bbc_state::video_ula_w)); // fe20-fe23 Video ULA Video system chip + map(0x0224, 0x0227).mirror(0x400).w(FUNC(bbc_state::bbcmc_drive_control_w)); // fe24-fe27 FDC Latch 1772 Control latch + map(0x0228, 0x022f).mirror(0x400).rw(m_wd1772, FUNC(wd1772_device::read), FUNC(wd1772_device::write)); // fe28-fe2f 1772 FDC Floppy disc controller + map(0x0230, 0x0233).mirror(0x400).w(FUNC(bbc_state::bbcm_romsel_w)); // fe30-fe33 ROMSEL ROM Select + map(0x0234, 0x0237).mirror(0x400).rw(FUNC(bbc_state::bbcm_acccon_r), FUNC(bbc_state::bbcm_acccon_w)); // fe34-fe37 ACCCON ACCCON select register + map(0x0238, 0x023b).mirror(0x400).r(FUNC(bbc_state::bbc_fe_r)); // fe38-fe3b INTOFF + map(0x023c, 0x023f).mirror(0x400).r(FUNC(bbc_state::bbc_fe_r)); // fe3c-fe3f INTON + map(0x0240, 0x025f).mirror(0x400).rw(m_via6522_0, FUNC(via6522_device::read), FUNC(via6522_device::write)); // fe40-fe5f 6522 VIA SYSTEM VIA + map(0x0260, 0x027f).mirror(0x400).rw(m_via6522_1, FUNC(via6522_device::read), FUNC(via6522_device::write)); // fe60-fe7f 6522 VIA USER VIA + map(0x0280, 0x029f).mirror(0x400).r(FUNC(bbc_state::bbc_fe_r)); // fe80-fe9f Int. Modem Int. Modem + map(0x02a0, 0x02bf).mirror(0x400).rw(m_adlc, FUNC(mc6854_device::read), FUNC(mc6854_device::write)); // fea0-febf 68B54 ADLC ECONET controller + map(0x02e0, 0x02ff).mirror(0x400).r(FUNC(bbc_state::bbc_fe_r)); // fee0-feff Tube ULA Tube system interface + /* ACCCON TST bit - hardware test */ + map(0x0400, 0x07ff).rom().region("mos", 0x3c00); // fc00-ffff OS ROM (continued) } @@ -314,6 +333,8 @@ INPUT_CHANGED_MEMBER(bbc_state::trigger_reset) if (m_rtc) m_rtc->reset(); if (m_fdc) m_fdc->reset(); if (m_i8271) m_i8271->reset(); + if (m_wd1770) m_wd1770->reset(); + if (m_wd1772) m_wd1772->reset(); if (m_1mhzbus) m_1mhzbus->reset(); if (m_tube) m_tube->reset(); if (m_intube) m_intube->reset(); @@ -755,7 +776,7 @@ static INPUT_PORTS_START(ltmpm) INPUT_PORTS_END -FLOPPY_FORMATS_MEMBER( bbc_state::floppy_formats_bbc ) +FLOPPY_FORMATS_MEMBER( bbc_state::floppy_formats ) FLOPPY_ACORN_SSD_FORMAT, FLOPPY_ACORN_DSD_FORMAT, FLOPPY_ACORN_ADFS_OLD_FORMAT, @@ -766,18 +787,12 @@ FLOPPY_FORMATS_MEMBER( bbc_state::floppy_formats_bbc ) FLOPPY_PC_FORMAT FLOPPY_FORMATS_END -static void bbc_floppies_525(device_slot_interface &device) +static void bbc_floppies(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); -} - -static void bbc_floppies_35(device_slot_interface &device) -{ - device.option_add("35dd", FLOPPY_35_DD); + device.option_add("35dd", FLOPPY_35_DD); } @@ -793,25 +808,7 @@ static const char *const bbc_sample_names[] = WRITE_LINE_MEMBER(bbc_state::adlc_irq_w) { m_adlc_irq = state; - - bbc_update_nmi(); -} - - -// 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) -{ - 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)); - - 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)); + update_nmi(); } @@ -822,7 +819,8 @@ void bbc_state::bbc_eprom_sockets(machine_config &config) ****************************************************************************/ -MACHINE_CONFIG_START(bbc_state::bbca) +void bbc_state::bbca(machine_config &config) +{ /* basic machine hardware */ M6502(config, m_maincpu, 16_MHz_XTAL / 8); m_maincpu->set_addrmap(AS_PROGRAM, &bbc_state::bbca_mem); @@ -831,11 +829,15 @@ MACHINE_CONFIG_START(bbc_state::bbca) 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); + /* addressable latch */ + LS259(config, m_latch); + m_latch->q_out_cb<0>().set(FUNC(bbc_state::snd_enable_w)); + m_latch->q_out_cb<3>().set(FUNC(bbc_state::kbd_enable_w)); + m_latch->q_out_cb<6>().set(FUNC(bbc_state::capslock_led_w)); + m_latch->q_out_cb<7>().set(FUNC(bbc_state::shiftlock_led_w)); - MCFG_MACHINE_START_OVERRIDE(bbc_state, bbca) - MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbca) + /* internal ram */ + RAM(config, m_ram).set_default_size("16K").set_extra_options("32K"); /* video hardware */ SCREEN(config, m_screen, SCREEN_TYPE_RASTER); @@ -858,13 +860,11 @@ MACHINE_CONFIG_START(bbc_state::bbca) 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) - config.set_default_layout(layout_bbc); /* sound hardware */ SPEAKER(config, "mono").front_center(); - SN76489(config, m_sn, 16_MHz_XTAL / 4); + SN76489A(config, m_sn, 16_MHz_XTAL / 4); m_sn->add_route(ALL_OUTPUTS, "mono", 1.0); /* cassette relay */ @@ -879,49 +879,59 @@ MACHINE_CONFIG_START(bbc_state::bbca) m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED); m_cassette->set_interface("bbc_cass"); - /* software lists */ - SOFTWARE_LIST(config, "cass_ls_a").set_original("bbca_cass"); - /* acia */ ACIA6850(config, m_acia, 0); - m_acia->txd_handler().set(FUNC(bbc_state::bbc_txd_w)); - m_acia->rts_handler().set(FUNC(bbc_state::bbc_rts_w)); - m_acia->irq_handler().set("irqs", FUNC(input_merger_device::in_w<0>)); + m_acia->txd_handler().set(FUNC(bbc_state::write_txd)); + m_acia->rts_handler().set(FUNC(bbc_state::write_rts)); + m_acia->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<0>)); 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)); + m_rs232->rxd_handler().set(FUNC(bbc_state::write_rxd)); + m_rs232->dcd_handler().set(FUNC(bbc_state::write_dcd)); + m_rs232->cts_handler().set(FUNC(bbc_state::write_cts)); 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); - m_via6522_0->readpa_handler().set(FUNC(bbc_state::bbcb_via_system_read_porta)); - m_via6522_0->readpb_handler().set(FUNC(bbc_state::bbcb_via_system_read_portb)); - m_via6522_0->writepa_handler().set(FUNC(bbc_state::bbcb_via_system_write_porta)); - m_via6522_0->writepb_handler().set(FUNC(bbc_state::bbcb_via_system_write_portb)); - m_via6522_0->irq_handler().set("irqs", FUNC(input_merger_device::in_w<1>)); + m_via6522_0->readpa_handler().set(FUNC(bbc_state::via_system_porta_r)); + m_via6522_0->readpb_handler().set(FUNC(bbc_state::via_system_portb_r)); + m_via6522_0->writepa_handler().set(FUNC(bbc_state::via_system_porta_w)); + m_via6522_0->writepb_handler().set(FUNC(bbc_state::via_system_portb_w)); + m_via6522_0->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<1>)); + + /* eprom sockets */ + GENERIC_SOCKET(config, m_rom[12], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic101 */ + m_rom[12]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_romc, this)); + GENERIC_SOCKET(config, m_rom[13], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic100 */ + m_rom[13]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_romd, this)); + GENERIC_SOCKET(config, m_rom[14], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic88 */ + m_rom[14]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_rome, this)); + GENERIC_SOCKET(config, m_rom[15], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic52 */ + m_rom[15]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_romf, this)); - /* EPROM sockets */ - bbc_eprom_sockets(config); -MACHINE_CONFIG_END + /* software lists */ + SOFTWARE_LIST(config, "cass_ls_a").set_original("bbca_cass"); + SOFTWARE_LIST(config, "rom_ls").set_original("bbc_rom").set_filter("A"); +} -MACHINE_CONFIG_START(bbc_state::bbcb) +void bbc_state::bbcb(machine_config &config) +{ bbca(config); /* basic machine hardware */ 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) + /* addressable latch */ + m_latch->q_out_cb<1>().set(FUNC(bbc_state::speech_rsq_w)); + m_latch->q_out_cb<2>().set(FUNC(bbc_state::speech_wsq_w)); /* internal ram */ - m_ram->set_default_size("32K").set_default_value(0x00); + m_ram->set_default_size("32K"); /* speech hardware */ - SPEECHROM(config, "vsm", 0).set_reverse_bit_order(true); + SPEECHROM(config, "vsm", 0); TMS5220(config, m_tms, 640000); m_tms->set_speechrom_tag("vsm"); m_tms->add_route(ALL_OUTPUTS, "mono", 1.0); @@ -929,19 +939,19 @@ MACHINE_CONFIG_START(bbc_state::bbcb) /* user via */ VIA6522(config, m_via6522_1, 16_MHz_XTAL / 16); m_via6522_1->writepa_handler().set("cent_data_out", FUNC(output_latch_device::bus_w)); - m_via6522_1->readpb_handler().set("userport", FUNC(bbc_userport_slot_device::pb_r)); - m_via6522_1->writepb_handler().set("userport", FUNC(bbc_userport_slot_device::pb_w)); + m_via6522_1->readpb_handler().set(m_userport, FUNC(bbc_userport_slot_device::pb_r)); + m_via6522_1->writepb_handler().set(m_userport, FUNC(bbc_userport_slot_device::pb_w)); m_via6522_1->ca2_handler().set("centronics", FUNC(centronics_device::write_strobe)); - m_via6522_1->irq_handler().set("irqs", FUNC(input_merger_device::in_w<2>)); + m_via6522_1->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<2>)); /* adc */ UPD7002(config, m_upd7002, 0); - m_upd7002->set_get_analogue_callback(FUNC(bbc_state::BBC_get_analogue_input), this); - m_upd7002->set_eoc_callback(FUNC(bbc_state::BBC_uPD7002_EOC), this); + m_upd7002->set_get_analogue_callback(FUNC(bbc_state::get_analogue_input), this); + m_upd7002->set_eoc_callback(FUNC(bbc_state::upd7002_eoc), this); /* printer */ centronics_device ¢ronics(CENTRONICS(config, "centronics", centronics_devices, "printer")); - centronics.ack_handler().set("via6522_1", FUNC(via6522_device::write_ca1)).invert(); // ack seems to be inverted? + centronics.ack_handler().set(m_via6522_1, FUNC(via6522_device::write_ca1)).invert(); // ack seems to be inverted? output_latch_device &latch(OUTPUT_LATCH(config, "cent_data_out")); centronics.set_output_latch(latch); @@ -974,7 +984,7 @@ MACHINE_CONFIG_START(bbc_state::bbcb) m_1mhzbus->nmi_handler().set(FUNC(bbc_state::bus_nmi_w)); /* tube port */ - BBC_TUBE_SLOT(config, m_tube, bbc_extube_devices, nullptr); + BBC_TUBE_SLOT(config, m_tube, bbc_tube_devices, nullptr); m_tube->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<4>)); /* user port */ @@ -982,11 +992,16 @@ MACHINE_CONFIG_START(bbc_state::bbcb) 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)); + /* internal expansion boards */ + //BBC_INTERNAL_SLOT(config, m_internal, bbc_internal_devices, nullptr); + //m_internal->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<5>)); + //m_internal->nmi_handler().set(FUNC(bbc_state::bus_nmi_w)); + /* software lists */ 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 +} void bbc_state::bbcb_de(machine_config &config) @@ -996,14 +1011,14 @@ void bbc_state::bbcb_de(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &bbc_state::bbcb_mem); /* fdc */ - 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)); + config.device_remove("fdc"); - 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); + FLOPPY_CONNECTOR(config, "i8271:0", bbc_floppies, "525qd", bbc_state::floppy_formats).enable_sound(true); + FLOPPY_CONNECTOR(config, "i8271:1", bbc_floppies, "525qd", bbc_state::floppy_formats).enable_sound(true); /* software lists */ SOFTWARE_LIST(config, "flop_ls_b_de").set_original("bbcb_cass_de"); @@ -1020,51 +1035,20 @@ void bbc_state::bbcb_us(machine_config &config) m_screen->set_raw(16_MHz_XTAL, 1024, 0, 640, 262, 0, 200); /* fdc */ - 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)); + config.device_remove("fdc"); - 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); + FLOPPY_CONNECTOR(config, "i8271:0", bbc_floppies, "525qd", bbc_state::floppy_formats).enable_sound(true); + FLOPPY_CONNECTOR(config, "i8271:1", bbc_floppies, "525qd", bbc_state::floppy_formats).enable_sound(true); /* software lists */ SOFTWARE_LIST(config, "flop_ls_b_us").set_original("bbcb_cass_us"); } -MACHINE_CONFIG_START(bbc_state::bbcbp) - bbcb(config); - /* basic machine hardware */ - 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 */ - 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)); - - 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 */ - 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) -MACHINE_CONFIG_END - - /*************************************************************************** Torch Computers @@ -1072,49 +1056,104 @@ MACHINE_CONFIG_END ****************************************************************************/ -MACHINE_CONFIG_START(torch_state::torchf) +void bbc_state::torchf(machine_config &config) +{ bbcb(config); /* basic machine hardware */ - MCFG_DEVICE_MODIFY("maincpu") - MCFG_DEVICE_PROGRAM_MAP(bbcb_mem) - - MCFG_MACHINE_RESET_OVERRIDE(bbc_state, torch) + m_maincpu->set_addrmap(AS_PROGRAM, &bbc_state::bbcb_mem); /* fdc */ - 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)); + config.device_remove("fdc"); - 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); + FLOPPY_CONNECTOR(config, "i8271:0", bbc_floppies, "525qd", bbc_state::floppy_formats, true).enable_sound(true); + FLOPPY_CONNECTOR(config, "i8271:1", bbc_floppies, "525qd", bbc_state::floppy_formats).enable_sound(true); /* Add Torch Z80 Communicator co-processor */ m_tube->set_default_option("zep100"); m_tube->set_fixed(true); -MACHINE_CONFIG_END +} -void torch_state::torchh10(machine_config &config) +void bbc_state::torchh10(machine_config &config) { torchf(config); /* fdc */ - config.device_remove("i8271:1"); + m_i8271->subdevice("1")->set_default_option(""); - /* Add 10MB HDD */ + /* 10MB HDD */ } -void torch_state::torchh21(machine_config &config) +void bbc_state::torchh21(machine_config &config) { torchf(config); /* fdc */ - config.device_remove("i8271:1"); + m_i8271->subdevice("1")->set_default_option(""); + + /* 21MB HDD */ + +} + + +/*************************************************************************** + + BBC Model B+ + +****************************************************************************/ + + +void bbcbp_state::bbcbp(machine_config &config) +{ + bbcb(config); + /* basic machine hardware */ + m_maincpu->set_addrmap(AS_PROGRAM, &bbcbp_state::bbcbp_mem); + m_maincpu->set_addrmap(AS_OPCODES, &bbcbp_state::bbcbp_fetch); + + /* internal ram */ + m_ram->set_default_size("64K"); + + /* fdc */ + WD1770(config, m_wd1770, 16_MHz_XTAL / 2); + m_wd1770->set_force_ready(true); + m_wd1770->intrq_wr_callback().set(FUNC(bbc_state::fdc_intrq_w)); + m_wd1770->drq_wr_callback().set(FUNC(bbc_state::fdc_drq_w)); + config.device_remove("fdc"); + + FLOPPY_CONNECTOR(config, "wd1770:0", bbc_floppies, "525qd", bbc_state::floppy_formats).enable_sound(true); + FLOPPY_CONNECTOR(config, "wd1770:1", bbc_floppies, "525qd", bbc_state::floppy_formats).enable_sound(true); + + /* eprom sockets */ + GENERIC_SOCKET(config, m_rom[2], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic35 */ + m_rom[2]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_rom23, this)); + GENERIC_SOCKET(config, m_rom[4], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic44 */ + m_rom[4]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_rom45, this)); + GENERIC_SOCKET(config, m_rom[6], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic57 */ + m_rom[6]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_rom67, this)); + GENERIC_SOCKET(config, m_rom[8], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic62 */ + m_rom[8]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_rom89, this)); + GENERIC_SOCKET(config, m_rom[10], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic68 */ + m_rom[10]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_romab, this)); + config.device_remove("romslot12"); + config.device_remove("romslot13"); + config.device_remove("romslot14"); + config.device_remove("romslot15"); - /* Add 21MB HDD */ + /* software lists */ + subdevice("rom_ls")->set_filter("B+"); +} + +void bbcbp_state::bbcbp128(machine_config &config) +{ + bbcbp(config); + + /* internal ram */ + m_ram->set_default_size("128K"); } @@ -1125,19 +1164,19 @@ void torch_state::torchh21(machine_config &config) ****************************************************************************/ -void bbc_state::abc110(machine_config &config) +void bbcbp_state::abc110(machine_config &config) { bbcbp(config); /* fdc */ - config.device_remove("wd1770:1"); + m_wd1770->subdevice("1")->set_default_option(""); /* Acorn Z80 co-processor */ m_tube->set_default_option("z80"); m_tube->set_fixed(true); - /* Add ADAPTEC ACB-4000 Winchester Disc Controller */ + /* Adaptec ACB-4000 Winchester Disc Controller */ - /* Add 10MB ST-412 Winchester */ + /* 10MB ST-412 Winchester */ /* software lists */ config.device_remove("cass_ls_a"); @@ -1147,23 +1186,23 @@ void bbc_state::abc110(machine_config &config) } -void bbc_state::acw443(machine_config &config) +void bbcbp_state::acw443(machine_config &config) { bbcbp(config); /* fdc */ - config.device_remove("wd1770:1"); + m_wd1770->subdevice("1")->set_default_option(""); - /* Add 32016 co-processor */ + /* 32016 co-processor */ //m_tube->set_default_option("32016"); //m_tube->set_fixed(true); - /* Add ADAPTEC ACB-4000 Winchester Disc Controller */ + /* Adaptec ACB-4000 Winchester Disc Controller */ //m_1mhzbus->set_default_option("awdd"); //m_1mhzbus->set_fixed(true); - /* Add 10MB ST-412 Winchester ABC210 */ + /* 10MB ST-412 Winchester ABC210 */ - /* Add 20MB ST-412 Winchester Cambridge */ + /* 20MB ST-412 Winchester Cambridge */ /* software lists */ SOFTWARE_LIST(config, "flop_ls_32016").set_original("bbc_flop_32016"); @@ -1174,19 +1213,19 @@ void bbc_state::acw443(machine_config &config) } -void bbc_state::abc310(machine_config &config) +void bbcbp_state::abc310(machine_config &config) { bbcbp(config); /* fdc */ - config.device_remove("wd1770:1"); + m_wd1770->subdevice("1")->set_default_option(""); /* Acorn 80286 co-processor */ m_tube->set_default_option("80286"); m_tube->set_fixed(true); - /* Add ADAPTEC ACB-4000 Winchester Disc Controller */ + /* Adaptec ACB-4000 Winchester Disc Controller */ - /* Add 10MB ST-412 Winchester */ + /* 10MB ST-412 Winchester */ /* software lists */ config.device_remove("cass_ls_a"); @@ -1202,12 +1241,16 @@ void bbc_state::abc310(machine_config &config) ****************************************************************************/ -void bbc_state::reutapm(machine_config &config) +void bbcbp_state::reutapm(machine_config &config) { bbcbp(config); /* basic machine hardware */ - m_maincpu->set_addrmap(AS_PROGRAM, &bbc_state::reutapm_mem); - m_maincpu->set_addrmap(AS_OPCODES, &bbc_state::bbcbp_fetch); + m_maincpu->set_addrmap(AS_PROGRAM, &bbcbp_state::reutapm_mem); + m_maincpu->set_addrmap(AS_OPCODES, &bbcbp_state::bbcbp_fetch); + + /* addressable latch */ + m_latch->q_out_cb<1>().set_nop(); + m_latch->q_out_cb<2>().set_nop(); /* sound hardware */ config.device_remove("mono"); @@ -1240,18 +1283,21 @@ void bbc_state::reutapm(machine_config &config) ****************************************************************************/ -void bbc_state::econx25(machine_config &config) +void bbcbp_state::econx25(machine_config &config) { bbcbp(config); /* sound hardware */ config.device_remove("vsm"); config.device_remove("tms5220"); + /* addressable latch */ + m_latch->q_out_cb<1>().set_nop(); + m_latch->q_out_cb<2>().set_nop(); + /* fdc */ //config.device_remove("wd1770") /* Add Econet X25 Gateway co-processor */ - //m_tube->option_list(bbc_x25tube_devices); //m_tube->set_default_option("x25"); //m_tube->set_fixed(true); @@ -1270,21 +1316,28 @@ void bbc_state::econx25(machine_config &config) ****************************************************************************/ -MACHINE_CONFIG_START(bbc_state::bbcm) +void bbcm_state::bbcm(machine_config &config) +{ /* basic machine hardware */ 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_addrmap(AS_PROGRAM, &bbcm_state::bbcm_mem); + m_maincpu->set_addrmap(AS_OPCODES, &bbcm_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); + ADDRESS_MAP_BANK(config, m_bankdev).set_map(&bbcm_state::bbcm_bankdev).set_options(ENDIANNESS_LITTLE, 8, 16, 0x0400); + 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); + /* addressable latch */ + LS259(config, m_latch); + m_latch->q_out_cb<0>().set(FUNC(bbc_state::snd_enable_w)); + m_latch->q_out_cb<3>().set(FUNC(bbc_state::kbd_enable_w)); + m_latch->q_out_cb<6>().set(FUNC(bbc_state::capslock_led_w)); + m_latch->q_out_cb<7>().set(FUNC(bbc_state::shiftlock_led_w)); - MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcm) - MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcm) + /* internal ram */ + RAM(config, m_ram).set_default_size("128K"); config.set_default_layout(layout_bbcm); @@ -1309,11 +1362,9 @@ MACHINE_CONFIG_START(bbc_state::bbcm) 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(); - SN76489(config, m_sn, 16_MHz_XTAL / 4); + SN76489A(config, m_sn, 16_MHz_XTAL / 4); m_sn->add_route(ALL_OUTPUTS, "mono", 1.0); /* cassette relay */ @@ -1324,10 +1375,11 @@ MACHINE_CONFIG_START(bbc_state::bbcm) /* rtc and cmos */ MC146818(config, m_rtc, 32.768_kHz_XTAL); + m_rtc->irq().set(m_irqs, FUNC(input_merger_device::in_w<7>)); /* printer */ centronics_device ¢ronics(CENTRONICS(config, "centronics", centronics_devices, "printer")); - centronics.ack_handler().set("via6522_1", FUNC(via6522_device::write_ca1)).invert(); // ack seems to be inverted? + centronics.ack_handler().set(m_via6522_1, FUNC(via6522_device::write_ca1)).invert(); // ack seems to be inverted? output_latch_device &latch(OUTPUT_LATCH(config, "cent_data_out")); centronics.set_output_latch(latch); @@ -1337,64 +1389,49 @@ MACHINE_CONFIG_START(bbc_state::bbcm) m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED); m_cassette->set_interface("bbc_cass"); - // 2 x cartridge sockets in BBC-Master - 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)); - - 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 */ - 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); - m_acia->txd_handler().set(FUNC(bbc_state::bbc_txd_w)); - m_acia->rts_handler().set(FUNC(bbc_state::bbc_rts_w)); - m_acia->irq_handler().set("irqs", FUNC(input_merger_device::in_w<0>)); + m_acia->txd_handler().set(FUNC(bbc_state::write_txd)); + m_acia->rts_handler().set(FUNC(bbc_state::write_rts)); + m_acia->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<0>)); 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)); + m_rs232->rxd_handler().set(FUNC(bbc_state::write_rxd)); + m_rs232->dcd_handler().set(FUNC(bbc_state::write_dcd)); + m_rs232->cts_handler().set(FUNC(bbc_state::write_cts)); CLOCK(config, m_acia_clock, 16_MHz_XTAL / 13); m_acia_clock->signal_handler().set(FUNC(bbc_state::write_acia_clock)); /* adc */ UPD7002(config, m_upd7002, 0); - m_upd7002->set_get_analogue_callback(FUNC(bbc_state::BBC_get_analogue_input), this); - m_upd7002->set_eoc_callback(FUNC(bbc_state::BBC_uPD7002_EOC), this); + m_upd7002->set_get_analogue_callback(FUNC(bbc_state::get_analogue_input), this); + m_upd7002->set_eoc_callback(FUNC(bbc_state::upd7002_eoc), this); /* system via */ VIA6522(config, m_via6522_0, 16_MHz_XTAL / 16); - m_via6522_0->readpa_handler().set(FUNC(bbc_state::bbcb_via_system_read_porta)); - m_via6522_0->readpb_handler().set(FUNC(bbc_state::bbcb_via_system_read_portb)); - m_via6522_0->writepa_handler().set(FUNC(bbc_state::bbcb_via_system_write_porta)); - m_via6522_0->writepb_handler().set(FUNC(bbc_state::bbcb_via_system_write_portb)); - m_via6522_0->irq_handler().set("irqs", FUNC(input_merger_device::in_w<1>)); + m_via6522_0->readpa_handler().set(FUNC(bbc_state::via_system_porta_r)); + m_via6522_0->readpb_handler().set(FUNC(bbc_state::via_system_portb_r)); + m_via6522_0->writepa_handler().set(FUNC(bbc_state::via_system_porta_w)); + m_via6522_0->writepb_handler().set(FUNC(bbc_state::via_system_portb_w)); + m_via6522_0->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<1>)); /* user via */ VIA6522(config, m_via6522_1, 16_MHz_XTAL / 16); m_via6522_1->writepa_handler().set("cent_data_out", FUNC(output_latch_device::bus_w)); - m_via6522_1->readpb_handler().set("userport", FUNC(bbc_userport_slot_device::pb_r)); - m_via6522_1->writepb_handler().set("userport", FUNC(bbc_userport_slot_device::pb_w)); + m_via6522_1->readpb_handler().set(m_userport, FUNC(bbc_userport_slot_device::pb_r)); + m_via6522_1->writepb_handler().set(m_userport, FUNC(bbc_userport_slot_device::pb_w)); m_via6522_1->ca2_handler().set("centronics", FUNC(centronics_device::write_strobe)); - m_via6522_1->irq_handler().set("irqs", FUNC(input_merger_device::in_w<2>)); + m_via6522_1->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<2>)); /* fdc */ WD1770(config, m_wd1770, 16_MHz_XTAL / 2); + m_wd1770->set_force_ready(true); m_wd1770->intrq_wr_callback().set(FUNC(bbc_state::fdc_intrq_w)); m_wd1770->drq_wr_callback().set(FUNC(bbc_state::fdc_drq_w)); - 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); + FLOPPY_CONNECTOR(config, "wd1770:0", bbc_floppies, "525qd", bbc_state::floppy_formats).enable_sound(true); + FLOPPY_CONNECTOR(config, "wd1770:1", bbc_floppies, "525qd", bbc_state::floppy_formats).enable_sound(true); /* econet */ MC6854(config, m_adlc); @@ -1414,7 +1451,7 @@ MACHINE_CONFIG_START(bbc_state::bbcm) BBC_ANALOGUE_SLOT(config, m_analog, bbc_analogue_devices, nullptr); /* 1mhz bus port */ - BBC_1MHZBUS_SLOT(config, m_1mhzbus, bbc_1mhzbus_devices, nullptr); + BBC_1MHZBUS_SLOT(config, m_1mhzbus, bbcm_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)); @@ -1428,10 +1465,34 @@ MACHINE_CONFIG_START(bbc_state::bbcm) 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 + + /* cartridge slots */ + GENERIC_CARTSLOT(config, m_cart[0], generic_linear_slot, "bbcm_cart", "bin,rom"); + m_cart[0]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_cart1, this)); + GENERIC_CARTSLOT(config, m_cart[1], generic_linear_slot, "bbcm_cart", "bin,rom"); + m_cart[1]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_cart2, this)); + + /* eprom sockets */ + GENERIC_SOCKET(config, m_rom[8], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic27 */ + m_rom[8]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_rom8, this)); + GENERIC_SOCKET(config, m_rom[4], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic41 */ + m_rom[4]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_rom45, this)); + GENERIC_SOCKET(config, m_rom[6], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic37 */ + m_rom[6]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_rom67, this)); + + /* software lists */ + 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"); + SOFTWARE_LIST(config, "rom_ls").set_original("bbc_rom").set_filter("M"); +} -void bbc_state::bbcmt(machine_config &config) +void bbcm_state::bbcmt(machine_config &config) { bbcm(config); /* Acorn 65C102 co-processor */ @@ -1440,7 +1501,7 @@ void bbc_state::bbcmt(machine_config &config) } -void bbc_state::bbcmaiv(machine_config &config) +void bbcm_state::bbcmaiv(machine_config &config) { bbcm(config); /* Acorn 65C102 co-processor */ @@ -1454,9 +1515,12 @@ void bbc_state::bbcmaiv(machine_config &config) } -void bbc_state::bbcmet(machine_config &config) +void bbcm_state::bbcmet(machine_config &config) { bbcm(config); + + m_bankdev->set_map(&bbcm_state::bbcmet_bankdev).set_options(ENDIANNESS_LITTLE, 8, 16, 0x0400); + /* printer */ config.device_remove("centronics"); config.device_remove("cent_data_out"); @@ -1464,6 +1528,10 @@ void bbc_state::bbcmet(machine_config &config) /* cassette */ config.device_remove("cassette"); + /* eprom sockets */ + config.device_remove("romslot4"); + config.device_remove("romslot6"); + /* software lists */ config.device_remove("cass_ls_m"); config.device_remove("cass_ls_a"); @@ -1474,7 +1542,7 @@ void bbc_state::bbcmet(machine_config &config) /* acia */ config.device_remove("acia6850"); - config.device_remove(RS232_TAG); + config.device_remove("rs232"); config.device_remove("acia_clock"); /* devices */ @@ -1492,7 +1560,7 @@ void bbc_state::bbcmet(machine_config &config) } -void bbc_state::bbcm512(machine_config &config) +void bbcm_state::bbcm512(machine_config &config) { bbcm(config); /* Acorn Intel 80186 co-processor */ @@ -1504,7 +1572,7 @@ void bbc_state::bbcm512(machine_config &config) } -void bbc_state::bbcmarm(machine_config &config) +void bbcm_state::bbcmarm(machine_config &config) { bbcm(config); /* Acorn ARM co-processor */ @@ -1513,7 +1581,7 @@ void bbc_state::bbcmarm(machine_config &config) } -void bbc_state::discmon(machine_config &config) +void bbcm_state::discmon(machine_config &config) { bbcm(config); /* Add coin slot */ @@ -1528,7 +1596,7 @@ void bbc_state::discmon(machine_config &config) } -void bbc_state::discmate(machine_config &config) +void bbcm_state::discmate(machine_config &config) { bbcm(config); /* Add Sony CDK-3000PII Auto Disc Loader */ @@ -1545,15 +1613,13 @@ void bbc_state::discmate(machine_config &config) } -MACHINE_CONFIG_START(bbc_state::cfa3000) +void bbcm_state::cfa3000(machine_config &config) +{ bbcm(config); - MCFG_MACHINE_START_OVERRIDE(bbc_state, cfa3000) /* fdc */ - MCFG_DEVICE_MODIFY("wd1770:0") - MCFG_DEVICE_SLOT_INTERFACE(bbc_floppies_525, nullptr, false) - MCFG_DEVICE_MODIFY("wd1770:1") - MCFG_DEVICE_SLOT_INTERFACE(bbc_floppies_525, nullptr, false) + m_wd1770->subdevice("0")->set_default_option(""); + m_wd1770->subdevice("1")->set_default_option(""); /* keyboard */ m_userport->set_default_option("cfa3000kbd"); @@ -1571,7 +1637,7 @@ MACHINE_CONFIG_START(bbc_state::cfa3000) config.device_remove("flop_ls_m"); config.device_remove("flop_ls_b"); config.device_remove("flop_ls_b_orig"); -MACHINE_CONFIG_END +} /*************************************************************************** @@ -1581,179 +1647,156 @@ MACHINE_CONFIG_END ****************************************************************************/ -MACHINE_CONFIG_START(bbc_state::bbcmc) +void bbcm_state::bbcmc(machine_config &config) +{ bbcm(config); + + m_bankdev->set_map(&bbcm_state::bbcmc_bankdev).set_options(ENDIANNESS_LITTLE, 8, 16, 0x0400); + /* cassette */ config.device_remove("cassette"); /* fdc */ - config.device_remove("wd1770"); - 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)); + config.device_remove("wd1770"); - 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); + FLOPPY_CONNECTOR(config, "wd1772:0", bbc_floppies, "35dd", bbc_state::floppy_formats).enable_sound(true); + FLOPPY_CONNECTOR(config, "wd1772:1", bbc_floppies, "35dd", bbc_state::floppy_formats).enable_sound(true); /* eeprom pcd8572 */ - //config.device_remove("rtc"); - - MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcmc) - MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcmc) + I2CMEM(config, "i2cmem", 0).set_data_size(0x80); + config.device_remove("rtc"); /* user via */ - // TODO: Joyport connected to PB0-PB4 only. PB5-PB7 are expansion port. - m_via6522_1->readpb_handler().set("joyport", FUNC(bbc_joyport_slot_device::pb_r)); - m_via6522_1->writepb_handler().set("joyport", FUNC(bbc_joyport_slot_device::pb_w)); + m_via6522_1->readpb_handler().set(m_joyport, FUNC(bbc_joyport_slot_device::pb_r)).mask(0x1f); + //m_via6522_1->readpb_handler().append(m_exp, FUNC(bbc_exp_slot_device::pb_r)).mask(0xe0); + m_via6522_1->writepb_handler().set(m_joyport, FUNC(bbc_joyport_slot_device::pb_w)).mask(0x1f); + //m_via6522_1->writepb_handler().append(m_exp, FUNC(bbc_exp_slot_device::pb_w)).mask(0xe0); /* cartridge sockets */ - config.device_remove("exp_rom1"); - config.device_remove("exp_rom2"); + config.device_remove("cartslot1"); + config.device_remove("cartslot2"); + + /* eprom sockets */ + GENERIC_SOCKET(config, m_rom[2], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic23 */ + m_rom[2]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_rom2, this)); + GENERIC_SOCKET(config, m_rom[3], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic17 */ + m_rom[3]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_rom3, this)); + GENERIC_SOCKET(config, m_rom[0], generic_linear_slot, "bbc_rom", "bin,rom"); /* ic38 */ + m_rom[0]->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_rom01, this)); + config.device_remove("romslot4"); + config.device_remove("romslot6"); /* software lists */ + SOFTWARE_LIST(config, "flop_ls_mc").set_original("bbcmc_flop"); + SOFTWARE_LIST(config, "flop_ls_pro128s").set_compatible("pro128s_flop"); + subdevice("flop_ls_m")->set_compatible("bbcm_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 */ + //BBC_EXP_SLOT(config, m_exp, bbc_exp_devices, nullptr); + //m_exp->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<3>)); + //m_exp->nmi_handler().set(FUNC(bbc_state::bus_nmi_w)); + 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)); + config.device_remove("1mhzbus"); config.device_remove("analogue"); config.device_remove("intube"); config.device_remove("extube"); -MACHINE_CONFIG_END + config.device_remove("userport"); +} -void bbc_state::pro128s(machine_config &config) +void bbcm_state::pro128s(machine_config &config) { bbcmc(config); /* software lists */ - 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"); + subdevice("flop_ls_pro128s")->set_original("pro128s_flop"); + subdevice("flop_ls_mc")->set_compatible("bbcmc_flop"); } -/*************************************************************************** - - LTM Portables - -****************************************************************************/ - -/* Both LTM machines used a 9" Hantarex MT3000 green monitor */ - -MACHINE_CONFIG_START(bbc_state::ltmpbp) - bbcbp(config); - /* basic machine hardware */ - MCFG_MACHINE_RESET_OVERRIDE(bbc_state, ltmpbp) -MACHINE_CONFIG_END - - -MACHINE_CONFIG_START(bbc_state::ltmpm) - bbcm(config); - /* basic machine hardware */ - MCFG_MACHINE_RESET_OVERRIDE(bbc_state, ltmpm) -MACHINE_CONFIG_END +void bbcm_state::autoc15(machine_config &config) +{ + bbcmc(config); + /* Autocue RAM disc */ + //m_exp->set_default_option("autocue"); + //m_exp->set_fixed(true); +} -/* the BBC came with 4 rom sockets on the motherboard as shown in the model A driver */ -/* you could get a number of rom upgrade boards that took this up to 16 roms as in the */ -/* model B driver */ ROM_START(bbca) - ROM_REGION(0x08000,"maincpu",ROMREGION_ERASEFF) /* RAM */ - - ROM_REGION(0x14000,"option",0) /* ROM */ - /* rom page 12 00000 IC52 SPARE SOCKET */ - /* rom page 13 04000 IC88 SPARE SOCKET */ - /* rom page 14 08000 IC100 SPARE SOCKET */ - /* rom page 15 0c000 IC101 BASIC */ + ROM_REGION(0x44000, "swr", 0) /* Sideways ROMs */ + /* rom page 12 30000 IC52 SPARE SOCKET */ + /* rom page 13 34000 IC88 SPARE SOCKET */ + /* 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" ) - ROMX_LOAD("os12.rom", 0x10000, 0x4000, CRC(3c14fc70) SHA1(0d9bcaf6a393c9ce2359ed700ddb53c232c2c45d), ROM_BIOS(0)) // os - ROMX_LOAD("basic2.rom", 0x0c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(0)) // rom page 3 0c000 + ROMX_LOAD("os12.rom", 0x40000, 0x4000, CRC(3c14fc70) SHA1(0d9bcaf6a393c9ce2359ed700ddb53c232c2c45d), ROM_BIOS(0)) + ROMX_LOAD("basic2.rom", 0x3c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(0)) ROM_SYSTEM_BIOS( 1, "os12b1", "OS 1.20 / BASIC1" ) - ROMX_LOAD("os12.rom", 0x10000, 0x4000, CRC(3c14fc70) SHA1(0d9bcaf6a393c9ce2359ed700ddb53c232c2c45d), ROM_BIOS(1)) // os - ROMX_LOAD("basic1.rom", 0x0c000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(1)) // rom page 3 0c000 + ROMX_LOAD("os12.rom", 0x40000, 0x4000, CRC(3c14fc70) SHA1(0d9bcaf6a393c9ce2359ed700ddb53c232c2c45d), ROM_BIOS(1)) + ROMX_LOAD("basic1.rom", 0x3c000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(1)) ROM_SYSTEM_BIOS( 2, "os10b2", "OS 1.00 / BASIC2" ) - ROMX_LOAD("os10.rom", 0x10000, 0x4000, CRC(9679b8f8) SHA1(d35f6723132aabe3c4d00fc16fd9ecc6768df753), ROM_BIOS(2)) // os - ROMX_LOAD("basic2.rom", 0x0c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(2)) // rom page 3 0c000 + ROMX_LOAD("os10.rom", 0x40000, 0x4000, CRC(9679b8f8) SHA1(d35f6723132aabe3c4d00fc16fd9ecc6768df753), ROM_BIOS(2)) + ROMX_LOAD("basic2.rom", 0x3c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(2)) ROM_SYSTEM_BIOS( 3, "os10b1", "OS 1.00 / BASIC1" ) - ROMX_LOAD("os10.rom", 0x10000, 0x4000, CRC(9679b8f8) SHA1(d35f6723132aabe3c4d00fc16fd9ecc6768df753), ROM_BIOS(3)) // os - ROMX_LOAD("basic1.rom", 0x0c000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(3)) // rom page 3 0c000 + ROMX_LOAD("os10.rom", 0x40000, 0x4000, CRC(9679b8f8) SHA1(d35f6723132aabe3c4d00fc16fd9ecc6768df753), ROM_BIOS(3)) + ROMX_LOAD("basic1.rom", 0x3c000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(3)) ROM_SYSTEM_BIOS( 4, "os01b1", "OS 0.10 / BASIC1" ) - ROMX_LOAD("os01.rom", 0x10000, 0x4000, CRC(45ee0980) SHA1(4b0ece6dc139d5d3f4fabd023716fb6f25149b80), ROM_BIOS(4)) // os + ROMX_LOAD("os01.rom", 0x40000, 0x4000, CRC(45ee0980) SHA1(4b0ece6dc139d5d3f4fabd023716fb6f25149b80), ROM_BIOS(4)) // OS0.1 does not support rom paging, load BASIC into all pages - ROMX_LOAD("basic1.rom", 0x00000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(4)) // rom page 0 00000 - ROM_RELOAD( 0x04000, 0x4000 ) - ROM_RELOAD( 0x08000, 0x4000 ) - ROM_RELOAD( 0x0c000, 0x4000 ) + ROMX_LOAD("basic1.rom", 0x30000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(4)) + ROM_RELOAD( 0x34000, 0x4000 ) + ROM_RELOAD( 0x38000, 0x4000 ) + ROM_RELOAD( 0x3c000, 0x4000 ) - ROM_REGION(0x4000, "os", 0) - ROM_COPY("option", 0x10000, 0, 0x4000) + ROM_REGION(0x4000, "mos", 0) + ROM_COPY("swr", 0x40000, 0, 0x4000) ROM_END -/* 0000- 7fff ram */ -/* 8000- bfff this area is mapped over with one of the roms from "option" region 0x00000-0x40000 */ -/* c000- ffff OS rom and memory mapped hardware at fc00-feff, from "option" region 0x40000-0x44000 */ - - ROM_START(bbcb) - ROM_REGION(0x08000,"maincpu",ROMREGION_ERASEFF) /* RAM */ - - ROM_REGION(0x44000,"option",0) /* ROM */ - /* rom page 0 00000 */ - /* rom page 1 04000 */ - /* rom page 2 08000 */ - /* rom page 3 0c000 */ - /* rom page 4 10000 */ - /* rom page 5 14000 */ - /* rom page 6 18000 */ - /* rom page 7 1c000 */ - /* rom page 8 20000 */ - /* rom page 9 24000 */ - /* rom page 10 28000 */ - /* rom page 11 2c000 */ + ROM_REGION(0x44000, "swr", 0) /* Sideways ROMs */ /* rom page 12 30000 IC52 DFS */ /* rom page 13 34000 IC88 SPARE SOCKET */ /* 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" ) - ROMX_LOAD("os12.rom", 0x40000, 0x4000, CRC(3c14fc70) SHA1(0d9bcaf6a393c9ce2359ed700ddb53c232c2c45d), ROM_BIOS(0)) // os - ROMX_LOAD("basic2.rom", 0x3c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(0)) // rom page 15 3c000 + ROMX_LOAD("os12.rom", 0x40000, 0x4000, CRC(3c14fc70) SHA1(0d9bcaf6a393c9ce2359ed700ddb53c232c2c45d), ROM_BIOS(0)) + ROMX_LOAD("basic2.rom", 0x3c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(0)) ROM_SYSTEM_BIOS( 1, "os12b1", "OS 1.20 / BASIC1" ) - ROMX_LOAD("os12.rom", 0x40000, 0x4000, CRC(3c14fc70) SHA1(0d9bcaf6a393c9ce2359ed700ddb53c232c2c45d), ROM_BIOS(1)) // os - ROMX_LOAD("basic1.rom", 0x3c000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(1)) // rom page 15 3c000 + ROMX_LOAD("os12.rom", 0x40000, 0x4000, CRC(3c14fc70) SHA1(0d9bcaf6a393c9ce2359ed700ddb53c232c2c45d), ROM_BIOS(1)) + ROMX_LOAD("basic1.rom", 0x3c000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(1)) ROM_SYSTEM_BIOS( 2, "os10b2", "OS 1.00 / BASIC2" ) - ROMX_LOAD("os10.rom", 0x40000, 0x4000, CRC(9679b8f8) SHA1(d35f6723132aabe3c4d00fc16fd9ecc6768df753), ROM_BIOS(2)) // os - ROMX_LOAD("basic2.rom", 0x3c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(2)) // rom page 15 3c000 + ROMX_LOAD("os10.rom", 0x40000, 0x4000, CRC(9679b8f8) SHA1(d35f6723132aabe3c4d00fc16fd9ecc6768df753), ROM_BIOS(2)) + ROMX_LOAD("basic2.rom", 0x3c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(2)) ROM_SYSTEM_BIOS( 3, "os10b1", "OS 1.00 / BASIC1" ) - ROMX_LOAD("os10.rom", 0x40000, 0x4000, CRC(9679b8f8) SHA1(d35f6723132aabe3c4d00fc16fd9ecc6768df753), ROM_BIOS(3)) // os - ROMX_LOAD("basic1.rom", 0x3c000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(3)) // rom page 15 3c000 + ROMX_LOAD("os10.rom", 0x40000, 0x4000, CRC(9679b8f8) SHA1(d35f6723132aabe3c4d00fc16fd9ecc6768df753), ROM_BIOS(3)) + ROMX_LOAD("basic1.rom", 0x3c000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(3)) ROM_SYSTEM_BIOS( 4, "os01b1", "OS 0.10 / BASIC1" ) - ROMX_LOAD("os01.rom", 0x40000, 0x4000, CRC(45ee0980) SHA1(4b0ece6dc139d5d3f4fabd023716fb6f25149b80), ROM_BIOS(4)) // os + ROMX_LOAD("os01.rom", 0x40000, 0x4000, CRC(45ee0980) SHA1(4b0ece6dc139d5d3f4fabd023716fb6f25149b80), ROM_BIOS(4)) // OS0.1 does not support rom paging, load BASIC into all pages - ROMX_LOAD("basic1.rom", 0x00000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(4)) // rom page 0 00000 + ROMX_LOAD("basic1.rom", 0x00000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(4)) ROM_RELOAD( 0x04000, 0x4000 ) ROM_RELOAD( 0x08000, 0x4000 ) ROM_RELOAD( 0x0c000, 0x4000 ) ROM_LOAD("dnfs120-201666.rom", 0x30000, 0x4000, CRC(8ccd2157) SHA1(7e3c536baeae84d6498a14e8405319e01ee78232)) - ROM_REGION(0x4000, "os", 0) - ROM_COPY("option", 0x40000, 0, 0x4000) + ROM_REGION(0x4000, "mos", 0) + ROM_COPY("swr", 0x40000, 0, 0x4000) ROM_REGION(0x4000, "vsm", 0) /* system speech PHROM */ ROM_LOAD("phroma.bin", 0x0000, 0x4000, CRC(98e1bf9e) SHA1(b369809275cb67dfd8a749265e91adb2d2558ae6)) @@ -1761,34 +1804,17 @@ ROM_END ROM_START(bbcb_de) - ROM_REGION(0x08000,"maincpu",ROMREGION_ERASEFF) /* RAM */ - - ROM_REGION(0x44000,"option",0) /* ROM */ - /* rom page 0 00000 */ - /* rom page 1 04000 */ - /* rom page 2 08000 */ - /* rom page 3 0c000 */ - /* rom page 4 10000 */ - /* rom page 5 14000 */ - /* rom page 6 18000 */ - /* rom page 7 1c000 */ - /* rom page 8 20000 */ - /* rom page 9 24000 */ - /* rom page 10 28000 */ - /* rom page 11 2c000 */ + ROM_REGION(0x44000, "swr", 0) /* Sideways ROMs */ /* rom page 12 30000 IC72 DFS */ /* rom page 13 34000 IC73 SPARE SOCKET */ /* 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(0)) - ROMX_LOAD("basic2.rom", 0x3c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(0)) // rom page 15 3c000 + ROM_LOAD("os_de.rom", 0x40000, 0x4000, CRC(b7262caf) SHA1(aadf90338ee9d1c85dfa73beba50e930c2a38f10)) + ROM_LOAD("basic2.rom", 0x3c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281)) + ROM_LOAD("dfs10.rom", 0x30000, 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) + ROM_REGION(0x4000, "mos", 0) + ROM_COPY("swr", 0x40000, 0, 0x4000) ROM_REGION(0x8000, "vsm", 0) /* system speech PHROM */ ROM_LOAD("phroma.bin", 0x0000, 0x4000, CRC(98e1bf9e) SHA1(b369809275cb67dfd8a749265e91adb2d2558ae6)) @@ -1796,35 +1822,18 @@ ROM_END ROM_START(bbcb_us) - ROM_REGION(0x08000,"maincpu",ROMREGION_ERASEFF) /* RAM */ - - ROM_REGION(0x44000,"option",0) /* ROM */ - /* rom page 0 00000 */ - /* rom page 1 04000 */ - /* rom page 2 08000 */ - /* rom page 3 0c000 */ - /* rom page 4 10000 */ - /* rom page 5 14000 */ - /* rom page 6 18000 */ - /* rom page 7 1c000 */ - /* rom page 8 20000 */ - /* rom page 9 24000 */ - /* rom page 10 28000 */ - /* rom page 11 2c000 */ + ROM_REGION(0x44000, "swr", 0) /* Sideways ROMs */ /* rom page 12 30000 IC72 VIEW2.1 */ /* rom page 13 34000 IC73 US DNFS */ /* rom page 14 38000 IC74 US BASIC */ /* rom page 15 3c000 IC75 SPARE SOCKET */ - ROM_DEFAULT_BIOS("os10b3") - ROM_SYSTEM_BIOS( 0, "os10b3", "OS A1.0 / BASIC3" ) - ROMX_LOAD("usmos10.rom", 0x40000, 0x4000, CRC(c8e946a9) SHA1(83d91d089dca092d2c8b7c3650ff8143c9069b89), ROM_BIOS(0)) - ROMX_LOAD("usbasic3.rom", 0x38000, 0x4000, CRC(161b9539) SHA1(b39014610a968789afd7695aa04d1277d874405c), ROM_BIOS(0)) // rom page 15 3c000 - + ROM_LOAD("usmos10.rom", 0x40000, 0x4000, CRC(c8e946a9) SHA1(83d91d089dca092d2c8b7c3650ff8143c9069b89)) + ROM_LOAD("usbasic3.rom", 0x38000, 0x4000, CRC(161b9539) SHA1(b39014610a968789afd7695aa04d1277d874405c)) ROM_LOAD("viewa210.rom", 0x30000, 0x4000, CRC(4345359f) SHA1(88c93df1854f5fbe6cd6e5f0e29a8bf4ea3b5614)) ROM_LOAD("usdnfs10.rom", 0x34000, 0x4000, CRC(7e367e8c) SHA1(161f585dc45665ea77433c84afd2f95049f7f5a0)) - ROM_REGION(0x4000, "os", 0) - ROM_COPY("option", 0x40000, 0, 0x4000) + ROM_REGION(0x4000, "mos", 0) + ROM_COPY("swr", 0x40000, 0, 0x4000) ROM_REGION(0x8000, "vsm", 0) /* system speech PHROM */ ROM_LOAD("phrom_us.bin", 0x0000, 0x4000, CRC(bf4b3b64) SHA1(66876702d1d95eecc034d20f25047f893a27cde5)) @@ -1832,16 +1841,14 @@ ROM_END ROM_START(torchf) - ROM_REGION(0x08000,"maincpu",ROMREGION_ERASEFF) /* RAM */ - - ROM_REGION(0x44000,"option",0) /* ROM */ + ROM_REGION(0x44000, "swr", 0) /* Sideways ROMs */ /* rom page 12 30000 IC52 BASIC */ /* rom page 13 34000 IC88 DNFS */ /* rom page 14 38000 IC100 CPN */ /* rom page 15 3c000 IC101 SPARE SOCKET */ ROM_LOAD("os12.rom", 0x40000, 0x4000, CRC(3c14fc70) SHA1(0d9bcaf6a393c9ce2359ed700ddb53c232c2c45d)) /* os */ - ROM_LOAD("basic2.rom", 0x0c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281)) + ROM_LOAD("basic2.rom", 0x30000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281)) ROM_LOAD("dnfs120-201666.rom", 0x34000, 0x4000, CRC(8ccd2157) SHA1(7e3c536baeae84d6498a14e8405319e01ee78232)) ROM_DEFAULT_BIOS("mcp120cbl") @@ -1855,8 +1862,8 @@ ROM_START(torchf) ROMX_LOAD("cpn071.rom", 0x38000, 0x2000, CRC(fcb1bdc8) SHA1(756e22f6d76eb26206765f92c78c7152944102b6), ROM_BIOS(3)) ROM_RELOAD( 0x3a000, 0x2000 ) - ROM_REGION(0x4000, "os", 0) - ROM_COPY("option", 0x40000, 0, 0x4000) + ROM_REGION(0x4000, "mos", 0) + ROM_COPY("swr", 0x40000, 0, 0x4000) ROM_REGION(0x4000, "vsm", 0) /* system speech PHROM */ ROM_LOAD("phrom_us.bin", 0x0000, 0x4000, CRC(bf4b3b64) SHA1(66876702d1d95eecc034d20f25047f893a27cde5)) @@ -1864,19 +1871,12 @@ ROM_END #define rom_torchh10 rom_torchf - - #define rom_torchh21 rom_torchf ROM_START(bbcbp) - ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */ - - ROM_REGION(0x44000,"option",0) /* ROM */ - ROM_DEFAULT_BIOS("os20") - ROM_SYSTEM_BIOS( 0, "os20", "OS 2.00" ) - ROMX_LOAD("bpos2.ic71", 0x3c000, 0x4000, CRC(9f356396) SHA1(ea7d3a7e3ee1ecfaa1483af994048057362b01f2), ROM_BIOS(0)) // rom page 15 3C000 BASIC - ROM_CONTINUE( 0x40000, 0x4000) /* OS */ + ROM_REGION(0x44000, "swr", 0) /* Sideways ROMs */ + ROM_LOAD("bpos2.ic71", 0x3c000, 0x8000, CRC(9f356396) SHA1(ea7d3a7e3ee1ecfaa1483af994048057362b01f2)) /* rom page 0 00000 SWRAM (B+ 128K only) */ /* rom page 1 04000 SWRAM (B+ 128K only) */ /* rom page 2 08000 IC35 32K IN PAGE 3 */ @@ -1896,8 +1896,8 @@ ROM_START(bbcbp) ROM_LOAD("adfs130.rom", 0x14000, 0x4000, CRC(d3855588) SHA1(301fd05c475a629c4bec70510d4507256a5b00d8)) ROM_LOAD("ddfs223.rom", 0x1c000, 0x4000, CRC(7891f9b7) SHA1(0d7ed0b0b3852cb61970ada1993244f2896896aa)) - ROM_REGION(0x4000, "os", 0) - ROM_COPY("option", 0x40000, 0, 0x4000) + ROM_REGION(0x4000, "mos", 0) + ROM_COPY("swr", 0x40000, 0, 0x4000) ROM_REGION(0x4000, "vsm", 0) /* system speech PHROM */ ROM_LOAD("phroma.bin", 0x0000, 0x4000, CRC(98e1bf9e) SHA1(b369809275cb67dfd8a749265e91adb2d2558ae6)) @@ -1908,21 +1908,18 @@ ROM_END ROM_START(abc110) - ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */ - - ROM_REGION(0x44000,"option",0) /* ROM */ + ROM_REGION(0x44000, "swr", 0) /* Sideways ROMs */ ROM_DEFAULT_BIOS("mos200") ROM_SYSTEM_BIOS( 0, "mos200", "MOS2.00" ) - ROMX_LOAD("mos200.rom", 0x40000, 0x4000, CRC(5e88f994) SHA1(76235ff15d736f5def338f73ac7497c41b916505), ROM_BIOS(0)) + ROMX_LOAD("mos200.rom", 0x40000, 0x4000, CRC(5e88f994) SHA1(76235ff15d736f5def338f73ac7497c41b916505), ROM_BIOS(0)) ROMX_LOAD("basic200.rom", 0x3c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(0)) ROM_SYSTEM_BIOS( 1, "mos123stor", "MOS1.23 + ViewStore" ) - ROMX_LOAD("mos123stor.rom", 0x3c000, 0x4000, CRC(4e84f452) SHA1(145ee54f04b3eb4d0e5afaabe21915be48db3c54), ROM_BIOS(1)) // rom page 15 3C000 ViewStore - ROM_CONTINUE( 0x40000, 0x4000) // OS + ROMX_LOAD("mos123stor.rom", 0x3c000, 0x8000, CRC(4e84f452) SHA1(145ee54f04b3eb4d0e5afaabe21915be48db3c54), ROM_BIOS(1)) // rom page 15 3C000 ViewStore ROM_SYSTEM_BIOS( 2, "mos123", "MOS1.23" ) - ROMX_LOAD("mos123.rom", 0x40000, 0x4000, CRC(90d31d08) SHA1(42a01892cf8bd2ada4db1c8b36aff80c85eb5dcb), ROM_BIOS(2)) + ROMX_LOAD("mos123.rom", 0x40000, 0x4000, CRC(90d31d08) SHA1(42a01892cf8bd2ada4db1c8b36aff80c85eb5dcb), ROM_BIOS(2)) ROMX_LOAD("basic200.rom", 0x3c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(2)) ROM_SYSTEM_BIOS( 3, "mos120", "MOS1.20" ) - ROMX_LOAD("mos120.rom", 0x40000, 0x4000, CRC(0a1e83a0) SHA1(21dc3a94eef7c003b194686730fb461779f44925), ROM_BIOS(3)) + ROMX_LOAD("mos120.rom", 0x40000, 0x4000, CRC(0a1e83a0) SHA1(21dc3a94eef7c003b194686730fb461779f44925), ROM_BIOS(3)) ROMX_LOAD("basic200.rom", 0x3c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(3)) /* rom page 0 00000 */ /* rom page 1 04000 IC71 selectable with link S13 */ @@ -1944,8 +1941,8 @@ ROM_START(abc110) ROM_LOAD("acwddfs225.rom", 0x14000, 0x4000, CRC(7d0f9016) SHA1(bdfe44c79e18142d747436627e71a362a04cf746)) ROM_LOAD("adfs130.rom", 0x1c000, 0x4000, CRC(d3855588) SHA1(301fd05c475a629c4bec70510d4507256a5b00d8)) - ROM_REGION(0x4000, "os", 0) - ROM_COPY("option", 0x40000, 0, 0x4000) + ROM_REGION(0x4000, "mos", 0) + ROM_COPY("swr", 0x40000, 0, 0x4000) ROM_REGION(0x4000, "vsm", 0) /* system speech PHROM */ ROM_LOAD("phroma.bin", 0x0000, 0x4000, CRC(98e1bf9e) SHA1(b369809275cb67dfd8a749265e91adb2d2558ae6)) @@ -1956,9 +1953,7 @@ ROM_END ROM_START(acw443) - ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */ - - ROM_REGION(0x44000,"option",0) /* ROM */ + ROM_REGION(0x44000, "swr", 0) /* Sideways ROMs */ ROM_DEFAULT_BIOS("mos210") ROM_SYSTEM_BIOS( 0, "mos210", "MOS2.10" ) ROMX_LOAD("acwmos210.rom", 0x40000, 0x4000, CRC(168d6753) SHA1(dcd01d8f5f6e0cd92ae626ca52a3db71abf5d282), ROM_BIOS(0)) @@ -1986,8 +1981,8 @@ ROM_START(acw443) ROM_LOAD("adfs130.rom", 0x24000, 0x4000, CRC(d3855588) SHA1(301fd05c475a629c4bec70510d4507256a5b00d8)) ROM_LOAD("basic200.rom", 0x28000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281)) - ROM_REGION(0x4000, "os", 0) - ROM_COPY("option", 0x40000, 0, 0x4000) + ROM_REGION(0x4000, "mos", 0) + ROM_COPY("swr", 0x40000, 0, 0x4000) ROM_REGION(0x4000, "vsm", 0) /* system speech PHROM */ ROM_LOAD("phroma.bin", 0x0000, 0x4000, CRC(98e1bf9e) SHA1(b369809275cb67dfd8a749265e91adb2d2558ae6)) @@ -1995,9 +1990,7 @@ ROM_END ROM_START(reutapm) - ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */ - - ROM_REGION(0x44000,"option",0) /* ROM */ + ROM_REGION(0x44000, "swr", 0) /* Sideways ROMs */ /* rom page 0 00000 */ /* rom page 1 04000 */ /* rom page 2 08000 32K IN PAGE 3 */ @@ -2017,15 +2010,13 @@ ROM_START(reutapm) ROM_LOAD("reutera100.rom", 0x1c000, 0x4000, CRC(98ebabfb) SHA1(a7887e1e5c206203491e1e06682b9508b0fef49d)) ROM_LOAD("reuterb.rom", 0x2c000, 0x4000, CRC(9e02f59b) SHA1(1e63aa3bf4b37bf9ba41e454f95db05c3d15bfbf)) - ROM_REGION(0x4000, "os", 0) + ROM_REGION(0x4000, "mos", 0) ROM_LOAD("mos_r030.rom", 0x0000, 0x4000, CRC(8b652337) SHA1(6a5c7ace255c8ac96c983d5ba67084fbd71ff61e)) ROM_END ROM_START(econx25) - ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) /* ROM MEMORY */ - - ROM_REGION(0x44000, "option", 0) /* ROM */ + ROM_REGION(0x44000, "swr", 0) /* Sideways ROMs */ ROM_LOAD("0246,201_01_x25os.rom", 0x40000, 0x4000, CRC(8b652337) SHA1(6a5c7ace255c8ac96c983d5ba67084fbd71ff61e)) /* rom page 0 00000 */ /* rom page 1 04000 IC71 selectable with link S13 */ @@ -2048,21 +2039,19 @@ ROM_START(econx25) /* X25 TSI is in IC37 which is supposed to take a speech PHROM, so not sure where this is mapped */ ROM_LOAD("0246,215_02_x25tsi_v0.51.rom", 0x30000, 0x4000, CRC(71dd84e4) SHA1(bbfa892fdcc6f753dda5134ecb97cc7c42b959c2)) - ROM_REGION(0x4000, "os", 0) - ROM_COPY("option", 0x40000, 0, 0x4000) + ROM_REGION(0x4000, "mos", 0) + ROM_COPY("swr", 0x40000, 0, 0x4000) ROM_END ROM_START(bbcm) - ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */ - - ROM_REGION(0x44000,"option",0) /* ROM */ + ROM_REGION(0x44000, "swr", 0) /* Sideways ROMs */ ROM_DEFAULT_BIOS("mos320") ROM_SYSTEM_BIOS( 0, "mos320", "Original MOS 3.20" ) ROMX_LOAD("mos320.ic24", 0x20000, 0x20000, CRC(0f747ebe) SHA1(eacacbec3892dc4809ad5800e6c8299ff9eb528f), ROM_BIOS(0)) ROM_SYSTEM_BIOS( 1, "mos350", "Enhanced MOS 3.50" ) ROMX_LOAD("mos350.ic24", 0x20000, 0x20000, CRC(141027b9) SHA1(85211b5bc7c7a269952d2b063b7ec0e1f0196803), ROM_BIOS(1)) - ROM_COPY("option", 0x20000, 0x40000, 0x4000) /* Move loaded roms into place */ + ROM_COPY("swr", 0x20000, 0x40000, 0x4000) /* Move loaded roms into place */ ROM_FILL(0x20000, 0x4000, 0xff) /* 00000 rom 0 SK3 Rear Cartridge bottom 16K */ /* 04000 rom 1 SK3 Rear Cartridge top 16K */ @@ -2082,10 +2071,10 @@ ROM_START(bbcm) /* 3c000 rom 15 IC24 Terminal + Tube host + CFS */ //ROM_LOAD("anfs425-2201351.rom", 0x20000, 0x4000, CRC(c2a6655e) SHA1(14f75d36ffe9af14aaac42df55b4fe3729ba75cf)) - ROM_REGION(0x4000, "os", 0) - ROM_COPY("option", 0x40000, 0, 0x4000) + ROM_REGION(0x4000, "mos", 0) + ROM_COPY("swr", 0x40000, 0, 0x4000) - ROM_REGION(0x40,"rtc",0) /* mc146818 */ + ROM_REGION(0x40, "rtc", 0) /* mc146818 */ /* Factory defaulted CMOS RAM, sets default language ROM, etc. */ ROMX_LOAD("mos320.cmos", 0x00, 0x40, CRC(c7f9e85a) SHA1(f24cc9db0525910689219f7204bf8b864033ee94), ROM_BIOS(0)) ROMX_LOAD("mos350.cmos", 0x00, 0x40, CRC(e84c1854) SHA1(f3cb7f12b7432caba28d067f01af575779220aac), ROM_BIOS(1)) @@ -2097,13 +2086,11 @@ ROM_END ROM_START(bbcmaiv) - ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */ - - ROM_REGION(0x44000,"option",0) /* ROM */ + ROM_REGION(0x44000, "swr", 0) /* Sideways ROMs */ ROM_DEFAULT_BIOS("mos320") ROM_SYSTEM_BIOS( 0, "mos320", "MOS 3.20" ) ROMX_LOAD("mos320.ic24", 0x20000, 0x20000, CRC(0f747ebe) SHA1(eacacbec3892dc4809ad5800e6c8299ff9eb528f), ROM_BIOS(0)) - ROM_COPY("option", 0x20000, 0x40000, 0x4000) /* Move loaded roms into place */ + ROM_COPY("swr", 0x20000, 0x40000, 0x4000) /* Move loaded roms into place */ ROM_FILL(0x20000, 0x4000, 0xff) /* 00000 rom 0 SK3 Rear Cartridge bottom 16K */ /* 04000 rom 1 SK3 Rear Cartridge top 16K */ @@ -2123,24 +2110,22 @@ ROM_START(bbcmaiv) /* 3c000 rom 15 IC24 Terminal + Tube host + CFS */ ROM_LOAD("vfs170.rom", 0x20000, 0x4000, CRC(b124a0bb) SHA1(ba31c757815cf470402d7829a70a0e1d3fb1355b) ) - ROM_REGION(0x4000, "os", 0) - ROM_COPY("option", 0x40000, 0, 0x4000) + ROM_REGION(0x4000, "mos", 0) + ROM_COPY("swr", 0x40000, 0, 0x4000) - ROM_REGION(0x40,"rtc",0) /* mc146818 */ + ROM_REGION(0x40, "rtc", 0) /* mc146818 */ /* Factory defaulted CMOS RAM, sets default language ROM, etc. */ - ROMX_LOAD("mos320aiv.cmos", 0x0E, 0x32, BAD_DUMP CRC(b9ae42a1) SHA1(abf3e94b013f24027ca36c96720963c3411e93f8), ROM_BIOS(0)) + ROMX_LOAD("mos320aiv.cmos", 0x0e, 0x32, BAD_DUMP CRC(b9ae42a1) SHA1(abf3e94b013f24027ca36c96720963c3411e93f8), ROM_BIOS(0)) ROM_END ROM_START(bbcmet) - ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */ - - ROM_REGION(0x44000,"option",0) /* ROM */ + ROM_REGION(0x44000, "swr", 0) /* Sideways ROMs */ ROM_DEFAULT_BIOS("mos400") ROM_SYSTEM_BIOS( 0, "mos400", "Econet MOS 4.00" ) ROMX_LOAD("mos400.ic24", 0x30000, 0x10000, CRC(81729034) SHA1(d4bc2c7f5e66b5298786138f395908e70c772971), ROM_BIOS(0)) - ROM_COPY("option", 0x34000, 0x24000, 0xC000) /* Mirror */ - ROM_COPY("option", 0x30000, 0x40000, 0x4000) /* Move loaded roms into place */ + ROM_COPY("swr", 0x34000, 0x24000, 0xc000) /* Mirror */ + ROM_COPY("swr", 0x30000, 0x40000, 0x4000) /* Move loaded roms into place */ ROM_FILL(0x30000, 0x4000, 0xff) /* 00000 rom 0 SK3 Rear Cartridge bottom 16K */ /* 04000 rom 1 SK3 Rear Cartridge top 16K */ @@ -2159,23 +2144,21 @@ ROM_START(bbcmet) /* 38000 rom 14 IC24 ANFS */ /* 3c000 rom 15 IC24 MOS code */ - ROM_REGION(0x4000, "os", 0) - ROM_COPY("option", 0x40000, 0, 0x4000) + ROM_REGION(0x4000, "mos", 0) + ROM_COPY("swr", 0x40000, 0, 0x4000) - ROM_REGION(0x40,"rtc",0) /* mc146818 */ + ROM_REGION(0x40, "rtc", 0) /* mc146818 */ /* Factory defaulted CMOS RAM, sets default language ROM, etc. */ - ROMX_LOAD("mos400.cmos", 0x0E, 0x32, BAD_DUMP CRC(fff41cc5) SHA1(3607568758f90b3bd6c7dc9533e2aa24f9806ff3), ROM_BIOS(0)) + ROMX_LOAD("mos400.cmos", 0x0e, 0x32, BAD_DUMP CRC(fff41cc5) SHA1(3607568758f90b3bd6c7dc9533e2aa24f9806ff3), ROM_BIOS(0)) ROM_END ROM_START(bbcmarm) - ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */ - - ROM_REGION(0x44000,"option",0) /* ROM */ + ROM_REGION(0x44000, "swr", 0) /* Sideways ROMs */ ROM_DEFAULT_BIOS("mos320") ROM_SYSTEM_BIOS( 0, "mos320", "Original MOS 3.20" ) ROMX_LOAD("mos320.ic24", 0x20000, 0x20000, CRC(0f747ebe) SHA1(eacacbec3892dc4809ad5800e6c8299ff9eb528f), ROM_BIOS(0)) - ROM_COPY("option", 0x20000, 0x40000, 0x4000) /* Move loaded roms into place */ + ROM_COPY("swr", 0x20000, 0x40000, 0x4000) /* Move loaded roms into place */ ROM_FILL(0x20000, 0x4000, 0xff) /* 00000 rom 0 SK3 Rear Cartridge bottom 16K */ /* 04000 rom 1 SK3 Rear Cartridge top 16K */ @@ -2195,28 +2178,26 @@ ROM_START(bbcmarm) /* 3c000 rom 15 IC24 Terminal + Tube host + CFS */ //ROM_LOAD("anfs425-2201351.rom", 0x20000, 0x4000, CRC(c2a6655e) SHA1(14f75d36ffe9af14aaac42df55b4fe3729ba75cf)) - ROM_REGION(0x4000, "os", 0) - ROM_COPY("option", 0x40000, 0, 0x4000) + ROM_REGION(0x4000, "mos", 0) + ROM_COPY("swr", 0x40000, 0, 0x4000) - ROM_REGION(0x40,"rtc",0) /* mc146818 */ + ROM_REGION(0x40, "rtc", 0) /* mc146818 */ /* Factory defaulted CMOS RAM, sets default language ROM, etc. */ ROMX_LOAD("mos320arm.cmos", 0x00, 0x40, CRC(56117257) SHA1(ed98563bef18f9d2a0b2d941cd20823d760fb127), ROM_BIOS(0)) ROM_END ROM_START(bbcmc) - ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */ - - ROM_REGION(0x44000,"option",0) /* ROM */ + ROM_REGION(0x44000, "swr", 0) /* Sideways ROMs */ ROM_DEFAULT_BIOS("mos510") ROM_SYSTEM_BIOS( 0, "mos510", "Enhanced MOS 5.10" ) ROMX_LOAD("mos510.ic49", 0x30000, 0x10000, BAD_DUMP CRC(9a2a6086) SHA1(094ab37b0b6437c4f1653eaa0602ef102737adb6), ROM_BIOS(0)) // Merged individual ROM bank dumps ROM_SYSTEM_BIOS( 1, "mos500", "Original MOS 5.00" ) ROMX_LOAD("mos500.ic49", 0x30000, 0x10000, CRC(f6170023) SHA1(140d002d2d9cd34b47197a2ba823505af2a84633), ROM_BIOS(1)) - ROM_COPY("option", 0x30000, 0x40000, 0x4000) // Move loaded roms into place + ROM_COPY("swr", 0x30000, 0x40000, 0x4000) // Move loaded roms into place ROM_FILL(0x30000, 0x4000, 0xff) - /* 00000 rom 0 EXTERNAL */ - /* 04000 rom 1 EXTERNAL */ + /* 00000 rom 0 IC38 or EXTERNAL */ + /* 04000 rom 1 IC38 or EXTERNAL */ /* 08000 rom 2 IC23 SPARE SOCKET */ /* 0c000 rom 3 IC17 SPARE SOCKET */ /* 10000 rom 4 SWRAM */ @@ -2228,26 +2209,24 @@ ROM_START(bbcmc) /* 28000 rom 10 UNUSED */ /* 2c000 rom 11 UNUSED */ /* 30000 rom 12 UNUSED */ - /* 34000 rom 13 IC16 ADFS */ - /* 38000 rom 14 IC16 BASIC */ - /* 3c000 rom 15 IC16 Utils */ + /* 34000 rom 13 IC49 ADFS */ + /* 38000 rom 14 IC49 BASIC */ + /* 3c000 rom 15 IC49 Utils */ - ROM_REGION(0x4000, "os", 0) - ROM_COPY("option", 0x40000, 0, 0x4000) + ROM_REGION(0x4000, "mos", 0) + ROM_COPY("swr", 0x40000, 0, 0x4000) ROM_END ROM_START(bbcmc_ar) - ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */ - - ROM_REGION(0x44000,"option",0) /* ROM */ + ROM_REGION(0x44000, "swr", 0) /* Sideways ROMs */ ROM_DEFAULT_BIOS("mos511i") ROM_SYSTEM_BIOS( 0, "mos511i", "International MOS 5.11i" ) ROMX_LOAD("mos511.ic49", 0x30000, 0x10000, BAD_DUMP CRC(8708803c) SHA1(d2170c8b9b536f3ad84a4a603a7fe712500cc751), ROM_BIOS(0)) // Merged individual ROM bank dumps - ROM_COPY("option", 0x30000, 0x40000, 0x4000) // Move loaded roms into place + ROM_COPY("swr", 0x30000, 0x40000, 0x4000) // Move loaded roms into place ROM_FILL(0x30000, 0x4000, 0xff) - /* 00000 rom 0 EXTERNAL */ - /* 04000 rom 1 EXTERNAL */ + /* 00000 rom 0 IC38 or EXTERNAL */ + /* 04000 rom 1 IC38 or EXTERNAL */ /* 08000 rom 2 IC23 International */ /* 0c000 rom 3 IC17 SPARE SOCKET */ /* 10000 rom 4 SWRAM */ @@ -2259,28 +2238,26 @@ ROM_START(bbcmc_ar) /* 28000 rom 10 UNUSED */ /* 2c000 rom 11 UNUSED */ /* 30000 rom 12 UNUSED */ - /* 34000 rom 13 IC16 ADFS */ - /* 38000 rom 14 IC16 BASIC */ - /* 3c000 rom 15 IC16 Utils */ + /* 34000 rom 13 IC49 ADFS */ + /* 38000 rom 14 IC49 BASIC */ + /* 3c000 rom 15 IC49 Utils */ ROM_LOAD("international16.rom", 0x8000 , 0x4000, CRC(0ef527b1) SHA1(dc5149ccf588cd591a6ad47727474ef3313272ce) ) ROM_LOAD("arabian-c22.rom" , 0x20000, 0x4000, CRC(4f3aadff) SHA1(2bbf61ba68264ce5845aab9c54e750b0efe219c8) ) - ROM_REGION(0x4000, "os", 0) - ROM_COPY("option", 0x40000, 0, 0x4000) + ROM_REGION(0x4000, "mos", 0) + ROM_COPY("swr", 0x40000, 0, 0x4000) ROM_END ROM_START(pro128s) - ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) /* ROM MEMORY */ - - ROM_REGION(0x44000, "option", 0) /* ROM */ + ROM_REGION(0x44000, "swr", 0) /* Sideways ROMs */ ROM_DEFAULT_BIOS("mos510o") ROM_SYSTEM_BIOS(0, "mos510o", "Olivetti MOS 5.10") - ROMX_LOAD("mos510o.ic49", 0x30000, 0x10000, CRC(c16858d3) SHA1(ad231ed21a55e493b553703285530d1cacd3de7a), ROM_BIOS(0)) - ROM_COPY("option", 0x30000, 0x40000, 0x4000) // Move loaded roms into place + ROMX_LOAD("mos510o.ic49", 0x30000, 0x10000, CRC(c16858d3) SHA1(ad231ed21a55e493b553703285530d1cacd3de7a), ROM_BIOS(0)) // System ROM 0258,211-01 + ROM_COPY("swr", 0x30000, 0x40000, 0x4000) // Move loaded roms into place ROM_FILL(0x30000, 0x4000, 0xff) - /* 00000 rom 0 EXTERNAL */ - /* 04000 rom 1 EXTERNAL */ + /* 00000 rom 0 IC38 or EXTERNAL */ + /* 04000 rom 1 IC38 or EXTERNAL */ /* 08000 rom 2 IC23 SPARE SOCKET */ /* 0c000 rom 3 IC17 SPARE SOCKET */ /* 10000 rom 4 SWRAM */ @@ -2292,23 +2269,21 @@ ROM_START(pro128s) /* 28000 rom 10 UNUSED */ /* 2c000 rom 11 UNUSED */ /* 30000 rom 12 UNUSED */ - /* 34000 rom 13 IC16 ADFS */ - /* 38000 rom 14 IC16 BASIC */ - /* 3c000 rom 15 IC16 Utils */ + /* 34000 rom 13 IC49 ADFS */ + /* 38000 rom 14 IC49 BASIC */ + /* 3c000 rom 15 IC49 Utils */ - ROM_REGION(0x4000, "os", 0) - ROM_COPY("option", 0x40000, 0, 0x4000) + ROM_REGION(0x4000, "mos", 0) + ROM_COPY("swr", 0x40000, 0, 0x4000) ROM_END ROM_START(autoc15) - ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) /* ROM MEMORY */ - - ROM_REGION(0x44000, "option", 0) /* ROM */ + ROM_REGION(0x44000, "swr", 0) /* Sideways ROMs */ ROM_DEFAULT_BIOS("mos510i") ROM_SYSTEM_BIOS(0, "mos510i", "Swedish MOS 5.10i") ROMX_LOAD("swedish_mega_29-1.ic49", 0x20000, 0x20000, CRC(67512992) SHA1(5d04b6e53a3a75af22ab10c652cceb9a63b23a6d), ROM_BIOS(0)) - ROM_COPY("option", 0x20000, 0x40000, 0x4000) // Move loaded roms into place + ROM_COPY("swr", 0x20000, 0x40000, 0x4000) // Move loaded roms into place ROM_FILL(0x20000, 0x4000, 0xff) /* 00000 rom 0 IC38 SBII */ /* 04000 rom 1 IC38 SBII */ @@ -2318,7 +2293,7 @@ ROM_START(autoc15) /* 14000 rom 5 SWRAM */ /* 18000 rom 6 SWRAM */ /* 1c000 rom 7 SWRAM */ - /* 20000 rom 8 IC49 MODROM 0.47 */ + /* 20000 rom 8 IC29 MODROM 0.47 */ /* 24000 rom 9 IC49 ADFS */ /* 28000 rom 10 IC49 BASIC */ /* 2c000 rom 11 IC49 Autocue Giant */ @@ -2331,19 +2306,17 @@ ROM_START(autoc15) ROM_LOAD("swedish_16k_iso.ic17", 0x0c000, 0x4000, CRC(bd7716c0) SHA1(8a70f941f4de64d87e956e2086eb50287b8205b9)) ROM_LOAD("modrom0_47.ic29", 0x20000, 0x4000, CRC(0d7874cb) SHA1(3f467f0b1618fb6546a2b94ca22b9f58d58bbdce)) - ROM_REGION(0x4000, "os", 0) - ROM_COPY("option", 0x40000, 0, 0x4000) + ROM_REGION(0x4000, "mos", 0) + ROM_COPY("swr", 0x40000, 0, 0x4000) ROM_END ROM_START(discmon) - ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) /* ROM MEMORY */ - - ROM_REGION(0x44000, "option", 0) /* ROM */ + ROM_REGION(0x44000, "swr", 0) /* Sideways ROMs */ ROM_DEFAULT_BIOS("mos320") ROM_SYSTEM_BIOS(0, "mos320", "Original MOS 3.20") ROMX_LOAD("mos320.ic24", 0x20000, 0x20000, CRC(0f747ebe) SHA1(eacacbec3892dc4809ad5800e6c8299ff9eb528f), ROM_BIOS(0)) - ROM_COPY("option", 0x20000, 0x40000, 0x4000) // Move loaded roms into place + ROM_COPY("swr", 0x20000, 0x40000, 0x4000) // Move loaded roms into place ROM_FILL(0x20000, 0x4000, 0xff) /* 00000 rom 0 SK3 Rear Cartridge bottom 16K */ /* 04000 rom 1 SK3 Rear Cartridge top 16K */ @@ -2363,8 +2336,8 @@ ROM_START(discmon) /* 3c000 rom 15 IC24 Terminal + Tube host + CFS */ ROM_LOAD("discmonitor406.rom", 0x20000, 0x4000, CRC(12e30e9b) SHA1(0e5356531978e08e75913e793cb0afc0e75e61ad)) - ROM_REGION(0x4000, "os", 0) - ROM_COPY("option", 0x40000, 0, 0x4000) + ROM_REGION(0x4000, "mos", 0) + ROM_COPY("swr", 0x40000, 0, 0x4000) ROM_REGION(0x40, "rtc", 0) /* mc146818 */ /* Factory defaulted CMOS RAM, sets default language ROM, etc. */ @@ -2373,13 +2346,11 @@ ROM_END ROM_START(discmate) - ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) /* ROM MEMORY */ - - ROM_REGION(0x44000, "option", 0) /* ROM */ + ROM_REGION(0x44000, "swr", 0) /* Sideways ROMs */ ROM_DEFAULT_BIOS("mos320") ROM_SYSTEM_BIOS(0, "mos320", "Original MOS 3.20") ROMX_LOAD("mos320.ic24", 0x20000, 0x20000, CRC(0f747ebe) SHA1(eacacbec3892dc4809ad5800e6c8299ff9eb528f), ROM_BIOS(0)) - ROM_COPY("option", 0x20000, 0x40000, 0x4000) // Move loaded roms into place + ROM_COPY("swr", 0x20000, 0x40000, 0x4000) // Move loaded roms into place ROM_FILL(0x20000, 0x4000, 0xff) /* 00000 rom 0 SK3 Rear Cartridge bottom 16K */ /* 04000 rom 1 SK3 Rear Cartridge top 16K */ @@ -2399,8 +2370,8 @@ ROM_START(discmate) /* 3c000 rom 15 IC24 Terminal + Tube host + CFS */ ROM_LOAD("discmaster303.rom", 0x20000, 0x4000, CRC(73974057) SHA1(79f99eae62ab46818386ab8a67fe50319ae30226)) - ROM_REGION(0x4000, "os", 0) - ROM_COPY("option", 0x40000, 0, 0x4000) + ROM_REGION(0x4000, "mos", 0) + ROM_COPY("swr", 0x40000, 0, 0x4000) ROM_REGION(0x40, "rtc", 0) /* mc146818 */ /* Factory defaulted CMOS RAM, sets default language ROM, etc. */ @@ -2409,14 +2380,12 @@ ROM_END ROM_START(cfa3000) - ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) /* ROM MEMORY */ - - ROM_REGION(0x44000, "option", 0) /* ROM */ + ROM_REGION(0x44000, "swr", 0) /* Sideways ROMs */ ROM_LOAD("cfa3000_3_4_iss10.3.ic41", 0x10000, 0x08000, CRC(ecb385ab) SHA1(eafa9b34cb1cf63790f74332bb7d85ee356b6973)) ROM_LOAD("cfa3000_sm_iss10.3.ic37", 0x18000, 0x08000, CRC(c07aee5f) SHA1(1994e3755dc15d1ea7e105bc19cd57893b719779)) ROM_LOAD("acorn_mos,tinsley_64k,iss10.3.ic24", 0x20000, 0x10000, CRC(4413c3ee) SHA1(76d0462b4dabe2461010fce2341570ff3d606d54)) - ROM_COPY("option", 0x20000, 0x30000, 0x10000) /* Mirror MOS */ - ROM_COPY("option", 0x30000, 0x40000, 0x04000) /* Move loaded roms into place */ + ROM_COPY("swr", 0x20000, 0x30000, 0x10000) /* Mirror MOS */ + ROM_COPY("swr", 0x30000, 0x40000, 0x04000) /* Move loaded roms into place */ ROM_FILL(0x30000, 0x4000, 0xff) /* 00000 rom 0 SK3 Rear Cartridge bottom 16K */ /* 04000 rom 1 SK3 Rear Cartridge top 16K */ @@ -2435,8 +2404,8 @@ ROM_START(cfa3000) /* 38000 rom 14 IC24 BASIC */ /* 3c000 rom 15 IC24 Terminal + Tube host + CFS */ - ROM_REGION(0x4000, "os", 0) - ROM_COPY("option", 0x40000, 0, 0x4000) + ROM_REGION(0x4000, "mos", 0) + ROM_COPY("swr", 0x40000, 0, 0x4000) ROM_REGION(0x40, "rtc", 0) /* mc146818 */ /* Factory defaulted CMOS RAM, sets default language ROM, etc. */ @@ -2448,34 +2417,34 @@ ROM_END #define rom_ltmpm rom_bbcm -/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ -COMP ( 1981, bbcb, 0, bbca, bbcb, bbcb, bbc_state, init_bbc, "Acorn", "BBC Micro Model B", MACHINE_IMPERFECT_GRAPHICS) -COMP ( 1981, bbca, bbcb, 0, bbca, bbca, bbc_state, init_bbc, "Acorn", "BBC Micro Model A", MACHINE_IMPERFECT_GRAPHICS) -COMP ( 1982, torchf, bbcb, 0, torchf, torch, torch_state, init_bbc, "Torch Computers", "Torch CF240", MACHINE_IMPERFECT_GRAPHICS) -COMP ( 1982, torchh10, bbcb, 0, torchh10, torch, torch_state, init_bbc, "Torch Computers", "Torch CH240/10", MACHINE_NOT_WORKING) -COMP ( 1982, torchh21, bbcb, 0, torchh21, torch, torch_state, init_bbc, "Torch Computers", "Torch CH240/21", MACHINE_NOT_WORKING) -COMP ( 1982, bbcb_de, bbcb, 0, bbcb_de, bbcb, bbc_state, init_bbc, "Acorn", "BBC Micro Model B (German)", MACHINE_IMPERFECT_GRAPHICS) -COMP ( 1983, bbcb_us, bbcb, 0, bbcb_us, bbcb, bbc_state, init_bbc, "Acorn", "BBC Micro Model B (US)", MACHINE_IMPERFECT_GRAPHICS) -COMP ( 1985, bbcbp, 0, bbcb, bbcbp, bbcbp, bbc_state, init_bbc, "Acorn", "BBC Micro Model B+ 64K", MACHINE_IMPERFECT_GRAPHICS) -COMP ( 1985, bbcbp128, bbcbp, 0, bbcbp128, bbcbp, bbc_state, init_bbc, "Acorn", "BBC Micro Model B+ 128K", MACHINE_IMPERFECT_GRAPHICS) -COMP ( 1985, abc110, bbcbp, 0, abc110, abc, bbc_state, init_bbc, "Acorn", "ABC 110", MACHINE_NOT_WORKING) -COMP ( 1985, acw443, bbcbp, 0, acw443, abc, bbc_state, init_bbc, "Acorn", "ABC 210/Cambridge Workstation", MACHINE_NOT_WORKING) -COMP ( 1985, abc310, bbcbp, 0, abc310, abc, bbc_state, init_bbc, "Acorn", "ABC 310", MACHINE_NOT_WORKING) -COMP ( 1985, ltmpbp, bbcbp, 0, ltmpbp, ltmpbp, bbc_state, init_bbc, "Lawrie T&M Ltd.", "LTM Portable (B+)", MACHINE_IMPERFECT_GRAPHICS) -COMP ( 1985, reutapm, bbcbp, 0, reutapm, bbcb, bbc_state, init_bbc, "Acorn", "Reuters APM", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING) -COMP ( 1986, econx25, bbcbp, 0, econx25, bbcbp, bbc_state, init_bbc, "Acorn", "Econet X25 Gateway", MACHINE_NOT_WORKING) -COMP ( 1986, bbcm, 0, bbcb, bbcm, bbcm, bbc_state, init_bbc, "Acorn", "BBC Master 128", MACHINE_IMPERFECT_GRAPHICS) -COMP ( 1986, bbcmt, bbcm, 0, bbcmt, bbcm, bbc_state, init_bbc, "Acorn", "BBC Master Turbo", MACHINE_IMPERFECT_GRAPHICS) -COMP ( 1986, bbcmaiv, bbcm, 0, bbcmaiv, bbcm, bbc_state, init_bbc, "Acorn", "BBC Master AIV", MACHINE_NOT_WORKING) -COMP ( 1986, bbcmet, bbcm, 0, bbcmet, bbcm, bbc_state, init_bbc, "Acorn", "BBC Master ET", MACHINE_IMPERFECT_GRAPHICS) -COMP ( 1986, bbcm512, bbcm, 0, bbcm512, bbcm, bbc_state, init_bbc, "Acorn", "BBC Master 512", MACHINE_IMPERFECT_GRAPHICS) -COMP ( 1986, bbcmarm, bbcm, 0, bbcmarm, bbcm, bbc_state, init_bbc, "Acorn", "BBC Master (ARM Evaluation)", MACHINE_NOT_WORKING) -COMP ( 1986, ltmpm, bbcm, 0, ltmpm, ltmpm, bbc_state, init_bbc, "Lawrie T&M Ltd.", "LTM Portable (Master)", MACHINE_IMPERFECT_GRAPHICS) -COMP ( 1986, bbcmc, 0, bbcm, bbcmc, bbcm, bbc_state, init_bbc, "Acorn", "BBC Master Compact", MACHINE_IMPERFECT_GRAPHICS) -COMP ( 1986, bbcmc_ar, bbcmc, 0, bbcmc, bbcm, bbc_state, init_bbc, "Acorn", "BBC Master Compact (Arabic)", MACHINE_IMPERFECT_GRAPHICS) -COMP ( 1987, pro128s, bbcmc, 0, pro128s, bbcm, bbc_state, init_bbc, "Olivetti", "Prodest PC 128S", MACHINE_IMPERFECT_GRAPHICS) -COMP ( 1988, autoc15, bbcmc, 0, bbcmc, bbcm, bbc_state, init_bbc, "Autocue", "Autocue 1500", MACHINE_NOT_WORKING) -COMP ( 1988, discmon, bbcm, 0, discmon, bbcm, bbc_state, init_bbc, "Arbiter Leisure", "Arbiter Discmonitor A-01", MACHINE_NOT_WORKING) -COMP ( 1988, discmate, bbcm, 0, discmate, bbcm, bbc_state, init_bbc, "Arbiter Leisure", "Arbiter Discmate A-02", MACHINE_NOT_WORKING) -//COMP ( 1988, discmast, bbcm, 0, discmast, bbcm, bbc_state, init_bbc, "Arbiter Leisure", "Arbiter Discmaster A-03", MACHINE_NOT_WORKING) -COMP ( 1989, cfa3000, bbcm, 0, cfa3000, bbcm, bbc_state, init_bbc, "Tinsley Medical Instruments", "Henson CFA 3000", MACHINE_NOT_WORKING) +/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ +COMP ( 1981, bbcb, 0, bbca, bbcb, bbcb, bbc_state, init_bbc, "Acorn", "BBC Micro Model B", MACHINE_IMPERFECT_GRAPHICS) +COMP ( 1981, bbca, bbcb, 0, bbca, bbca, bbc_state, init_bbc, "Acorn", "BBC Micro Model A", MACHINE_IMPERFECT_GRAPHICS) +COMP ( 1982, torchf, bbcb, 0, torchf, torch, torch_state, init_bbc, "Torch Computers", "Torch CF240", MACHINE_IMPERFECT_GRAPHICS) +COMP ( 1982, torchh10, bbcb, 0, torchh10, torch, torch_state, init_bbc, "Torch Computers", "Torch CH240/10", MACHINE_NOT_WORKING) +COMP ( 1982, torchh21, bbcb, 0, torchh21, torch, torch_state, init_bbc, "Torch Computers", "Torch CH240/21", MACHINE_NOT_WORKING) +COMP ( 1982, bbcb_de, bbcb, 0, bbcb_de, bbcb, bbc_state, init_bbc, "Acorn", "BBC Micro Model B (German)", MACHINE_IMPERFECT_GRAPHICS) +COMP ( 1983, bbcb_us, bbcb, 0, bbcb_us, bbcb, bbc_state, init_bbc, "Acorn", "BBC Micro Model B (US)", MACHINE_IMPERFECT_GRAPHICS) +COMP ( 1985, bbcbp, 0, bbcb, bbcbp, bbcbp, bbcbp_state, init_bbc, "Acorn", "BBC Micro Model B+ 64K", MACHINE_IMPERFECT_GRAPHICS) +COMP ( 1985, bbcbp128, bbcbp, 0, bbcbp128, bbcbp, bbcbp_state, init_bbc, "Acorn", "BBC Micro Model B+ 128K", MACHINE_IMPERFECT_GRAPHICS) +COMP ( 1985, abc110, bbcbp, 0, abc110, abc, bbcbp_state, init_bbc, "Acorn", "ABC 110", MACHINE_NOT_WORKING) +COMP ( 1985, acw443, bbcbp, 0, acw443, abc, bbcbp_state, init_bbc, "Acorn", "ABC 210/Cambridge Workstation", MACHINE_NOT_WORKING) +COMP ( 1985, abc310, bbcbp, 0, abc310, abc, bbcbp_state, init_bbc, "Acorn", "ABC 310", MACHINE_NOT_WORKING) +COMP ( 1985, ltmpbp, bbcbp, 0, bbcbp, ltmpbp, bbcbp_state, init_ltmp, "Lawrie T&M Ltd.", "LTM Portable (B+)", MACHINE_IMPERFECT_GRAPHICS) +COMP ( 1985, reutapm, bbcbp, 0, reutapm, bbcb, bbcbp_state, init_bbc, "Acorn", "Reuters APM", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING) +COMP ( 1986, econx25, bbcbp, 0, econx25, bbcbp, bbcbp_state, init_bbc, "Acorn", "Econet X25 Gateway", MACHINE_NOT_WORKING) +COMP ( 1986, bbcm, 0, bbcb, bbcm, bbcm, bbcm_state, init_bbcm, "Acorn", "BBC Master 128", MACHINE_IMPERFECT_GRAPHICS) +COMP ( 1986, bbcmt, bbcm, 0, bbcmt, bbcm, bbcm_state, init_bbcm, "Acorn", "BBC Master Turbo", MACHINE_IMPERFECT_GRAPHICS) +COMP ( 1986, bbcmaiv, bbcm, 0, bbcmaiv, bbcm, bbcm_state, init_bbcm, "Acorn", "BBC Master AIV", MACHINE_NOT_WORKING) +COMP ( 1986, bbcmet, bbcm, 0, bbcmet, bbcm, bbcm_state, init_bbcm, "Acorn", "BBC Master ET", MACHINE_IMPERFECT_GRAPHICS) +COMP ( 1986, bbcm512, bbcm, 0, bbcm512, bbcm, bbcm_state, init_bbcm, "Acorn", "BBC Master 512", MACHINE_IMPERFECT_GRAPHICS) +COMP ( 1986, bbcmarm, bbcm, 0, bbcmarm, bbcm, bbcm_state, init_bbcm, "Acorn", "BBC Master (ARM Evaluation)", MACHINE_NOT_WORKING) +COMP ( 1986, ltmpm, bbcm, 0, bbcm, ltmpm, bbcm_state, init_ltmp, "Lawrie T&M Ltd.", "LTM Portable (Master)", MACHINE_IMPERFECT_GRAPHICS) +COMP ( 1986, bbcmc, 0, bbcm, bbcmc, bbcm, bbcm_state, init_bbcm, "Acorn", "BBC Master Compact", MACHINE_IMPERFECT_GRAPHICS) +COMP ( 1986, bbcmc_ar, bbcmc, 0, bbcmc, bbcm, bbcm_state, init_bbcm, "Acorn", "BBC Master Compact (Arabic)", MACHINE_IMPERFECT_GRAPHICS) +COMP ( 1987, pro128s, bbcmc, 0, pro128s, bbcm, bbcm_state, init_bbcm, "Olivetti", "Prodest PC 128S", MACHINE_IMPERFECT_GRAPHICS) +COMP ( 1988, autoc15, bbcmc, 0, autoc15, bbcm, bbcm_state, init_bbcm, "Autocue", "Autocue 1500", MACHINE_NOT_WORKING) +COMP ( 1988, discmon, bbcm, 0, discmon, bbcm, bbcm_state, init_bbcm, "Arbiter Leisure", "Arbiter Discmonitor A-01", MACHINE_NOT_WORKING) +COMP ( 1988, discmate, bbcm, 0, discmate, bbcm, bbcm_state, init_bbcm, "Arbiter Leisure", "Arbiter Discmate A-02", MACHINE_NOT_WORKING) +//COMP ( 1988, discmast, bbcm, 0, discmast, bbcm, bbcm_state, init_bbc, "Arbiter Leisure", "Arbiter Discmaster A-03", MACHINE_NOT_WORKING) +COMP ( 1989, cfa3000, bbcm, 0, cfa3000, bbcm, bbcm_state, init_cfa, "Tinsley Medical Instruments", "Henson CFA 3000", MACHINE_NOT_WORKING) diff --git a/src/mame/includes/bbc.h b/src/mame/includes/bbc.h index 63a07b670fd..1cf42088ada 100644 --- a/src/mame/includes/bbc.h +++ b/src/mame/includes/bbc.h @@ -2,9 +2,7 @@ // copyright-holders:Gordon Jefferyes, Nigel Barnes /***************************************************************************** * - * includes/bbc.h - * - * BBC Model B + * BBC Model B/B+/Master/Compact * * Driver by Gordon Jefferyes * @@ -14,7 +12,9 @@ #pragma once -#include "bus/rs232/rs232.h" +#include "cpu/m6502/m6502.h" +#include "cpu/m6502/m65sc02.h" +#include "machine/74259.h" #include "machine/6522via.h" #include "machine/6850acia.h" #include "machine/clock.h" @@ -24,6 +24,8 @@ #include "machine/wd_fdc.h" #include "machine/upd7002.h" #include "machine/mc146818.h" +#include "machine/i2cmem.h" +#include "machine/bankdev.h" #include "machine/input_merger.h" #include "video/mc6845.h" #include "video/saa5050.h" @@ -32,11 +34,16 @@ #include "sound/samples.h" #include "imagedev/cassette.h" +#include "bus/rs232/rs232.h" +#include "bus/centronics/ctronics.h" +#include "bus/econet/econet.h" #include "bus/bbc/fdc/fdc.h" #include "bus/bbc/analogue/analogue.h" #include "bus/bbc/1mhzbus/1mhzbus.h" +//#include "bus/bbc/internal/internal.h" #include "bus/bbc/tube/tube.h" #include "bus/bbc/userport/userport.h" +//#include "bus/bbc/exp/exp.h" #include "bus/bbc/joyport/joyport.h" #include "bus/generic/slot.h" @@ -45,71 +52,61 @@ #include "emupal.h" #include "screen.h" -#define RS232_TAG "rs232" class bbc_state : public driver_device { public: - bbc_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_ram(*this, RAM_TAG), - m_hd6845(*this, "hd6845"), - m_screen(*this, "screen"), - m_adlc(*this, "mc6854"), - m_sn(*this, "sn76489"), - m_samples(*this, "samples"), - m_keyboard(*this, "COL%u", 0), - m_trom(*this, "saa5050"), - m_tms(*this, "tms5220"), - m_cassette(*this, "cassette"), - m_acia(*this, "acia6850"), - m_acia_clock(*this, "acia_clock"), - m_rs232(*this, RS232_TAG), - m_via6522_0(*this, "via6522_0"), - m_via6522_1(*this, "via6522_1"), - m_upd7002(*this, "upd7002"), - m_analog(*this, "analogue"), - m_joyport(*this, "joyport"), - m_tube(*this, "tube"), - 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"), - m_wd1770(*this, "wd1770"), - m_wd1772(*this, "wd1772"), - m_exp1(*this, "exp_rom1"), - m_exp2(*this, "exp_rom2"), - m_exp3(*this, "exp_rom3"), - m_exp4(*this, "exp_rom4"), - m_region_maincpu(*this, "maincpu"), - m_region_os(*this, "os"), - m_region_opt(*this, "option"), - m_bank1(*this, "bank1"), - m_bank2(*this, "bank2"), - m_bank3(*this, "bank3"), - m_bank4(*this, "bank4"), - m_bank5(*this, "bank5"), - m_bank6(*this, "bank6"), - m_bank7(*this, "bank7"), - m_bank8(*this, "bank8"), - m_irqs(*this, "irqs"), - m_palette(*this, "palette"), - m_bbcconfig(*this, "BBCCONFIG") + bbc_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_ram(*this, RAM_TAG) + , m_hd6845(*this, "hd6845") + , m_screen(*this, "screen") + , m_irqs(*this, "irqs") + , m_palette(*this, "palette") + , m_adlc(*this, "mc6854") + , m_sn(*this, "sn76489") + , m_samples(*this, "samples") + , m_keyboard(*this, "COL%u", 0) + , m_trom(*this, "saa5050") + , m_tms(*this, "tms5220") + , m_cassette(*this, "cassette") + , m_acia(*this, "acia6850") + , m_acia_clock(*this, "acia_clock") + , m_latch(*this, "latch") + , m_rs232(*this, "rs232") + , m_via6522_0(*this, "via6522_0") + , m_via6522_1(*this, "via6522_1") + , m_upd7002(*this, "upd7002") + , m_analog(*this, "analogue") + , m_joyport(*this, "joyport") + , m_tube(*this, "tube") + , m_intube(*this, "intube") + , m_extube(*this, "extube") + , m_1mhzbus(*this, "1mhzbus") + , m_userport(*this, "userport") +// , m_internal(*this, "internal") +// , m_exp(*this, "exp") + , m_rtc(*this, "rtc") + , m_i2cmem(*this, "i2cmem") + , m_fdc(*this, "fdc") + , m_i8271(*this, "i8271") + , m_wd1770(*this, "wd1770") + , m_wd1772(*this, "wd1772") + , m_rom(*this, "romslot%u", 0U) + , m_cart(*this, "cartslot%u", 1U) + , m_region_mos(*this, "mos") + , m_region_swr(*this, "swr") + , m_bank1(*this, "bank1") + , m_bank2(*this, "bank2") + , m_bank3(*this, "bank3") + , m_bank4(*this, "bank4") + , m_bank5(*this, "bank5") + , m_bank6(*this, "bank6") + , m_bankdev(*this, "bankdev") + , m_bbcconfig(*this, "BBCCONFIG") { } - enum machine_type_t - { - MODELA, - MODELB, - BPLUS, - MASTER, - COMPACT - }; - enum monitor_type_t { COLOUR = 0, @@ -118,150 +115,149 @@ public: AMBER = 3 }; - DECLARE_FLOPPY_FORMATS(floppy_formats_bbc); + DECLARE_FLOPPY_FORMATS(floppy_formats); - DECLARE_WRITE8_MEMBER(page_selecta_w); - DECLARE_WRITE8_MEMBER(page_selectb_w); - DECLARE_WRITE8_MEMBER(bbc_memoryb4_w); + DECLARE_WRITE8_MEMBER(bbc_romsel_w); + DECLARE_WRITE8_MEMBER(bbc_bank4_w); DECLARE_READ8_MEMBER(bbcbp_fetch_r); - DECLARE_WRITE8_MEMBER(page_selectbp_w); - DECLARE_WRITE8_MEMBER(page_selectbp128_w); - DECLARE_WRITE8_MEMBER(bbc_memorybp4_w); - DECLARE_WRITE8_MEMBER(bbc_memorybp6_w); + DECLARE_WRITE8_MEMBER(bbcbp_romsel_w); + DECLARE_WRITE8_MEMBER(bbcbp_bank4_w); + DECLARE_WRITE8_MEMBER(bbcbp_bank5_w); DECLARE_READ8_MEMBER(bbcm_fetch_r); DECLARE_READ8_MEMBER(bbcm_acccon_r); DECLARE_WRITE8_MEMBER(bbcm_acccon_w); - DECLARE_WRITE8_MEMBER(page_selectbm_w); - DECLARE_WRITE8_MEMBER(bbc_memorybm4_w); - DECLARE_WRITE8_MEMBER(bbc_memorybm5_w); - DECLARE_WRITE8_MEMBER(bbc_memorybm7_w); - DECLARE_READ8_MEMBER(bbcm_r); - DECLARE_WRITE8_MEMBER(bbcm_w); - DECLARE_WRITE8_MEMBER(bbc_SerialULA_w); - - DECLARE_WRITE8_MEMBER(bbc_wd1770_status_w); - DECLARE_READ8_MEMBER(bbcm_wd177xl_read); - DECLARE_WRITE8_MEMBER(bbcm_wd1770l_write); - DECLARE_WRITE8_MEMBER(bbcm_wd1772l_write); - DECLARE_WRITE8_MEMBER(bbc_videoULA_w); - DECLARE_READ8_MEMBER(bbc_fe_r); + DECLARE_WRITE8_MEMBER(bbcm_romsel_w); + DECLARE_WRITE8_MEMBER(bbcm_bank4_w); + DECLARE_WRITE8_MEMBER(bbcm_bank5_w); + DECLARE_WRITE8_MEMBER(bbcm_bank6_w); + DECLARE_READ8_MEMBER(bbcm_tube_r); + DECLARE_WRITE8_MEMBER(bbcm_tube_w); + DECLARE_WRITE8_MEMBER(bbcbp_drive_control_w); + DECLARE_WRITE8_MEMBER(bbcm_drive_control_w); + DECLARE_WRITE8_MEMBER(bbcmc_drive_control_w); + DECLARE_WRITE8_MEMBER(serial_ula_w); + DECLARE_WRITE8_MEMBER(video_ula_w); + DECLARE_READ8_MEMBER(bbc_fe_r) { return 0xfe; }; - void init_bbc(); DECLARE_VIDEO_START(bbc); - DECLARE_MACHINE_START(bbca); - DECLARE_MACHINE_RESET(bbca); - DECLARE_MACHINE_START(bbcb); - DECLARE_MACHINE_RESET(bbcb); - DECLARE_MACHINE_RESET(torch); - DECLARE_MACHINE_START(bbcbp); - DECLARE_MACHINE_RESET(bbcbp); - DECLARE_MACHINE_START(bbcm); - DECLARE_MACHINE_RESET(bbcm); - DECLARE_MACHINE_START(bbcmc); - DECLARE_MACHINE_RESET(bbcmc); - DECLARE_MACHINE_RESET(ltmpbp); - DECLARE_MACHINE_RESET(ltmpm); - DECLARE_MACHINE_START(cfa3000); - DECLARE_PALETTE_INIT(bbc); INTERRUPT_GEN_MEMBER(bbcb_keyscan); - TIMER_CALLBACK_MEMBER(bbc_tape_timer_cb); + TIMER_CALLBACK_MEMBER(tape_timer_cb); + TIMER_CALLBACK_MEMBER(reset_timer_cb); DECLARE_WRITE_LINE_MEMBER(write_acia_clock); DECLARE_WRITE_LINE_MEMBER(adlc_irq_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(snd_enable_w); + DECLARE_WRITE_LINE_MEMBER(speech_rsq_w); + DECLARE_WRITE_LINE_MEMBER(speech_wsq_w); + DECLARE_WRITE_LINE_MEMBER(kbd_enable_w); + DECLARE_WRITE_LINE_MEMBER(capslock_led_w); + DECLARE_WRITE_LINE_MEMBER(shiftlock_led_w); + DECLARE_READ8_MEMBER(via_system_porta_r); + DECLARE_WRITE8_MEMBER(via_system_porta_w); + DECLARE_READ8_MEMBER(via_system_portb_r); + DECLARE_WRITE8_MEMBER(via_system_portb_w); 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); DECLARE_INPUT_CHANGED_MEMBER(monitor_changed); + void update_acia_rxd(); void update_acia_dcd(); void update_acia_cts(); - DECLARE_WRITE_LINE_MEMBER(bbc_rts_w); - DECLARE_WRITE_LINE_MEMBER(bbc_txd_w); - DECLARE_WRITE_LINE_MEMBER(write_rxd_serial); - DECLARE_WRITE_LINE_MEMBER(write_dcd_serial); - DECLARE_WRITE_LINE_MEMBER(write_cts_serial); + DECLARE_WRITE_LINE_MEMBER(write_rts); + DECLARE_WRITE_LINE_MEMBER(write_txd); + DECLARE_WRITE_LINE_MEMBER(write_rxd); + DECLARE_WRITE_LINE_MEMBER(write_dcd); + DECLARE_WRITE_LINE_MEMBER(write_cts); + DECLARE_INPUT_CHANGED_MEMBER(trigger_reset); DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w); DECLARE_WRITE_LINE_MEMBER(fdc_drq_w); DECLARE_WRITE_LINE_MEMBER(motor_w); DECLARE_WRITE_LINE_MEMBER(side_w); - int BBC_get_analogue_input(int channel_number); - void BBC_uPD7002_EOC(int data); - - void bbc_setup_banks(memory_bank *membank, int banks, uint32_t shift, uint32_t size); - void bbcm_setup_banks(memory_bank *membank, int banks, uint32_t shift, uint32_t size); - - image_init_result bbc_load_rom(device_image_interface &image, generic_slot_device *slot); - DECLARE_DEVICE_IMAGE_LOAD_MEMBER(exp1_load) { return bbc_load_rom(image, m_exp1); } - DECLARE_DEVICE_IMAGE_LOAD_MEMBER(exp2_load) { return bbc_load_rom(image, m_exp2); } - DECLARE_DEVICE_IMAGE_LOAD_MEMBER(exp3_load) { return bbc_load_rom(image, m_exp3); } - 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_cart1_load) { return bbcm_load_cart(image, m_exp1); } - DECLARE_DEVICE_IMAGE_LOAD_MEMBER(bbcm_cart2_load) { return bbcm_load_cart(image, m_exp2); } + int get_analogue_input(int channel_number); + void upd7002_eoc(int data); + + void setup_banks(memory_bank *membank, uint32_t shift); + + image_init_result load_rom16(device_image_interface &image, generic_slot_device *slot); + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom0) { return load_rom16(image, m_rom[0]); } + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom1) { return load_rom16(image, m_rom[1]); } + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom2) { return load_rom16(image, m_rom[2]); } + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom3) { return load_rom16(image, m_rom[3]); } + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom4) { return load_rom16(image, m_rom[4]); } + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom5) { return load_rom16(image, m_rom[5]); } + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom6) { return load_rom16(image, m_rom[6]); } + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom7) { return load_rom16(image, m_rom[7]); } + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom8) { return load_rom16(image, m_rom[8]); } + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom9) { return load_rom16(image, m_rom[9]); } + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(roma) { return load_rom16(image, m_rom[10]); } + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(romb) { return load_rom16(image, m_rom[11]); } + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(romc) { return load_rom16(image, m_rom[12]); } + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(romd) { return load_rom16(image, m_rom[13]); } + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rome) { return load_rom16(image, m_rom[14]); } + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(romf) { return load_rom16(image, m_rom[15]); } + + image_init_result load_rom32(device_image_interface &image, generic_slot_device *slot); + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom01) { return load_rom32(image, m_rom[0]); } + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom23) { return load_rom32(image, m_rom[2]); } + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom45) { return load_rom32(image, m_rom[4]); } + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom67) { return load_rom32(image, m_rom[6]); } + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(rom89) { return load_rom32(image, m_rom[8]); } + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(romab) { return load_rom32(image, m_rom[10]); } + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(romcd) { return load_rom32(image, m_rom[12]); } + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(romef) { return load_rom32(image, m_rom[14]); } + + image_init_result load_cart(device_image_interface &image, generic_slot_device *slot); + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart1) { return load_cart(image, m_cart[0]); } + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart2) { return load_cart(image, m_cart[1]); } MC6845_UPDATE_ROW(crtc_update_row); - void bbc_eprom_sockets(machine_config &config); - void discmon(machine_config &config); - void discmate(machine_config &config); - void reutapm(machine_config &config); - void bbcbp(machine_config &config); - void abc310(machine_config &config); - void bbcmc(machine_config &config); - void bbcmt(machine_config &config); - void bbcm(machine_config &config); - void ltmpm(machine_config &config); - void bbcmet(machine_config &config); - void cfa3000(machine_config &config); - void bbcbp128(machine_config &config); - void pro128s(machine_config &config); - void bbcm512(machine_config &config); - void bbcmarm(machine_config &config); - void abc110(machine_config &config); - void ltmpbp(machine_config &config); - void bbcb_de(machine_config &config); - void bbcb(machine_config &config); - void bbcmaiv(machine_config &config); void bbca(machine_config &config); + void bbcb(machine_config &config); + void bbcb_de(machine_config &config); void bbcb_us(machine_config &config); - void econx25(machine_config &config); - void acw443(machine_config &config); - void bbc_base(address_map &map); + void torchf(machine_config &config); + void torchh21(machine_config &config); + void torchh10(machine_config &config); + void bbca_mem(address_map &map); + void bbc_base(address_map &map); void bbcb_mem(address_map &map); void bbcb_nofdc_mem(address_map &map); - void bbcbp128_mem(address_map &map); - void bbcbp_mem(address_map &map); - void bbcbp_fetch(address_map &map); - void bbcm_mem(address_map &map); - void bbcm_fetch(address_map &map); - void reutapm_mem(address_map &map); -private: + void init_bbc(); + void init_bbcm(); + void init_ltmp(); + void init_cfa(); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + + virtual void video_start() override; + required_device m_maincpu; required_device m_ram; required_device m_hd6845; required_device m_screen; + required_device m_irqs; + required_device m_palette; optional_device m_adlc; - optional_device m_sn; + optional_device m_sn; optional_device m_samples; required_ioport_array<13> m_keyboard; -public: // HACK FOR MC6845 optional_device m_trom; optional_device m_tms; optional_device m_cassette; optional_device m_acia; optional_device m_acia_clock; + required_device m_latch; optional_device m_rs232; required_device m_via6522_0; optional_device m_via6522_1; @@ -273,33 +269,28 @@ public: // HACK FOR MC6845 optional_device m_extube; optional_device m_1mhzbus; optional_device m_userport; + //optional_device m_internal; + //optional_device m_exp; optional_device m_rtc; + optional_device m_i2cmem; optional_device m_fdc; optional_device m_i8271; optional_device m_wd1770; optional_device m_wd1772; - optional_device m_exp1; - optional_device m_exp2; - optional_device m_exp3; - optional_device m_exp4; - - required_memory_region m_region_maincpu; - required_memory_region m_region_os; - required_memory_region m_region_opt; + optional_device_array m_rom; + optional_device_array m_cart; + + required_memory_region m_region_mos; + required_memory_region m_region_swr; required_memory_bank m_bank1; // bbca bbcb bbcbp bbcbp128 bbcm optional_memory_bank m_bank2; // bbcbp bbcbp128 bbcm optional_memory_bank m_bank3; // bbca bbcb required_memory_bank m_bank4; // bbca bbcb bbcbp bbcbp128 bbcm - optional_memory_bank m_bank5; // bbcm - optional_memory_bank m_bank6; // bbcbp bbcbp128 - required_memory_bank m_bank7; // bbca bbcb bbcbp bbcbp128 bbcm - optional_memory_bank m_bank8; // bbcm - - required_device m_irqs; - - machine_type_t m_machinetype; + optional_memory_bank m_bank5; // bbcbp bbcbp128 bbcm + required_memory_bank m_bank6; // bbca bbcb bbcbp bbcbp128 bbcm + optional_device m_bankdev; // bbcm + optional_ioport m_bbcconfig; - bool m_os01; // flag indicating whether OS 0.1 is being used int m_monitortype; // monitor type (colour, green, amber) int m_swramtype; // this stores the setting for the SWRAM type being used @@ -341,44 +332,9 @@ public: // HACK FOR MC6845 int m_acccon_e; int m_acccon_d; - - /* - The addressable latch - This 8 bit addressable latch is operated from port B lines 0-3. - PB0-PB2 are set to the required address of the output bit to be set. - PB3 is set to the value which should be programmed at that bit. - 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 (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 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) - */ - - int m_b0_sound; - int m_b1_speech_read; - int m_b2_speech_write; - int m_b3_keyboard; - int m_b4_video0; - int m_b5_video1; - int m_b6_caps_lock_led; - int m_b7_shift_lock_led; - - int m_MC146818_WR; // FE30 bit 1 replaces b1_speech_read - int m_MC146818_DS; // FE30 bit 2 replaces b2_speech_write - int m_MC146818_AS; // 6522 port b bit 7 - int m_MC146818_CE; // 6522 port b bit 6 + void mc146818_set(address_space &space); + int m_mc146818_as; // 6522 port b bit 7 + int m_mc146818_ce; // 6522 port b bit 6 int m_via_system_porta; @@ -388,10 +344,9 @@ public: // HACK FOR MC6845 int m_column; // this is a counter in the keyboard circuit - - /*************************************** - BBC 2C199 Serial Interface Cassette - ****************************************/ + /*************************************** + BBC 2C199 Serial Interface Cassette + ****************************************/ double m_last_dev_val; int m_wav_len; @@ -399,7 +354,6 @@ public: // HACK FOR MC6845 int m_len1; int m_len2; int m_len3; - int m_mc6850_clock; uint8_t m_serproc_data; int m_rxd_serial; int m_dcd_serial; @@ -415,17 +369,16 @@ public: // HACK FOR MC6845 emu_timer *m_tape_timer; - /************************************** - WD1770 disc control - ***************************************/ + /************************************** + WD1770 disc control + ***************************************/ - int m_drive_control; int m_fdc_irq; int m_fdc_drq; - /************************************** - Video Code - ***************************************/ + /************************************** + Video Code + ***************************************/ // this is the real location of the start of the BBC's ram in the emulation // it can be changed if shadow ram is being used to point at the upper 32K of RAM @@ -459,15 +412,15 @@ public: // HACK FOR MC6845 void setvideoshadow(int vdusel); void set_pixel_lookup(); - int bbc_keyboard(address_space &space, int data); - void bbcb_IC32_initialise(bbc_state *state); - void MC146818_set(address_space &space); - void MC6850_Receive_Clock(int new_clock); + int bbc_keyboard(int data); + + void mc6850_receive_clock(int new_clock); void cassette_motor(bool state); - void bbc_update_nmi(); + void update_nmi(); uint16_t calculate_video_address(uint16_t ma, uint8_t ra); - required_device m_palette; - optional_ioport m_bbcconfig; + +private: + emu_timer *m_reset_timer; }; @@ -476,9 +429,60 @@ class torch_state : public bbc_state public: using bbc_state::bbc_state; static constexpr feature_type imperfect_features() { return feature::KEYBOARD; } - void torchf(machine_config &config); - void torchh21(machine_config &config); - void torchh10(machine_config &config); }; + +class bbcbp_state : public bbc_state +{ +public: + using bbc_state::bbc_state; + + void bbcbp(machine_config &config); + void bbcbp128(machine_config &config); + void abc110(machine_config &config); + void acw443(machine_config &config); + void abc310(machine_config &config); + void econx25(machine_config &config); + void reutapm(machine_config &config); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + + void bbcbp_mem(address_map &map); + void reutapm_mem(address_map &map); + void bbcbp_fetch(address_map &map); +}; + + +class bbcm_state : public bbc_state +{ +public: + using bbc_state::bbc_state; + + void bbcm(machine_config &config); + void bbcmt(machine_config &config); + void bbcmet(machine_config &config); + void bbcmaiv(machine_config &config); + void bbcm512(machine_config &config); + void bbcmarm(machine_config &config); + void cfa3000(machine_config &config); + void discmon(machine_config &config); + void discmate(machine_config &config); + void bbcmc(machine_config &config); + void pro128s(machine_config &config); + void autoc15(machine_config &config); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + + void bbcm_mem(address_map &map); + void bbcm_bankdev(address_map &map); + void bbcmet_bankdev(address_map &map); + void bbcmc_bankdev(address_map &map); + void bbcm_fetch(address_map &map); +}; + + #endif // MAME_INCLUDES_BBC_H diff --git a/src/mame/machine/bbc.cpp b/src/mame/machine/bbc.cpp index 2ecd9e05e70..35d64e69aa9 100644 --- a/src/mame/machine/bbc.cpp +++ b/src/mame/machine/bbc.cpp @@ -22,46 +22,46 @@ #include "imagedev/cassette.h" -/**************************************** - BBC Model A memory handling functions -****************************************/ - -WRITE8_MEMBER(bbc_state::page_selecta_w) +TIMER_CALLBACK_MEMBER(bbc_state::reset_timer_cb) { - /* for the Model A just address the 4 on board ROM sockets */ - m_swrbank = data & 0x03; - m_swrbank_ram = false; - - m_bank4->set_entry(m_swrbank); + m_maincpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); } - /**************************************** BBC Model B memory handling functions ****************************************/ -WRITE8_MEMBER(bbc_state::page_selectb_w) +WRITE8_MEMBER(bbc_state::bbc_romsel_w) { static const unsigned short swramtype[4][16] = { - // TODO: move sideways RAM boards to slot devices + // TODO: move sideways ROM/RAM boards to slot devices { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, // 0: none { 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1 }, // 1: 128K (bank 8 to 15) Solidisk sideways ram userport bank latch (not implemented) { 0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0 }, // 2: 64K (banks 4 to 7) for Acorn sideways ram FE30 bank latch { 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1 }, // 3: 128K (banks 8 to 15) for Acorn sideways ram FE30 bank latch }; - /* the Model B address all 16 of the ROM sockets */ - m_swrbank = data & 0x0f; - m_swrbank_ram = swramtype[m_swramtype][m_swrbank] ? true : false; + if (m_swramtype == 0) + { + /* no sideways expansion board fitted so address only the 4 on board ROM sockets */ + m_swrbank = (data & 0x03) | 0x0c; + m_swrbank_ram = false; + } + else + { + /* expansion board fitted so address all 16 ROM sockets and check if RAM fitted */ + m_swrbank = data & 0x0f; + m_swrbank_ram = swramtype[m_swramtype][m_swrbank] ? true : false; + } m_bank4->set_entry(m_swrbank); } -WRITE8_MEMBER(bbc_state::bbc_memoryb4_w) +WRITE8_MEMBER(bbc_state::bbc_bank4_w) { if (m_swrbank_ram) { - m_region_opt->base()[(m_swrbank << 14) + offset] = data; + m_region_swr->base()[(m_swrbank << 14) + offset] = data; } } @@ -78,11 +78,11 @@ READ8_MEMBER(bbc_state::bbcbp_fetch_r) /* Code executing from sideways RAM between 0xa000-0xafff will access the shadow RAM (if selected) */ if (m_vdusel && m_paged_ram) { - m_bank2->set_base(m_region_maincpu->base() + 0xb000); + m_bank2->set_base(m_ram->pointer() + 0xb000); } else { - m_bank2->set_base(m_region_maincpu->base() + 0x3000); + m_bank2->set_base(m_ram->pointer() + 0x3000); } break; @@ -91,67 +91,41 @@ READ8_MEMBER(bbc_state::bbcbp_fetch_r) /* Access shadow RAM if VDU drivers and shadow RAM selected */ if (m_vdusel) { - m_bank2->set_base(m_region_maincpu->base() + 0xb000); + m_bank2->set_base(m_ram->pointer() + 0xb000); } else { - m_bank2->set_base(m_region_maincpu->base() + 0x3000); + m_bank2->set_base(m_ram->pointer() + 0x3000); } break; default: - m_bank2->set_base(m_region_maincpu->base() + 0x3000); + m_bank2->set_base(m_ram->pointer() + 0x3000); break; } return m_maincpu->space(AS_PROGRAM).read_byte(offset); } -WRITE8_MEMBER(bbc_state::page_selectbp_w) -{ - /* the Model B+ addresses all 16 ROM sockets and extra 12K of RAM at 0x8000 and 20K of shadow RAM at 0x3000 */ - switch (offset & 0x07) - { - case 0x00: - m_paged_ram = BIT(data,7); - - m_swrbank = data & 0x0f; - m_swrbank_ram = false; - - if (m_paged_ram) - { - /* if paged RAM then set 0x8000 to 0xafff to read from the RAM 8000 to 0xafff */ - m_bank4->set_entry(0x10); - } - else - { - /* if paged ROM then set the ROM to be read from 0x8000 to 0xafff */ - m_bank4->set_entry(m_swrbank); - }; - - /* set the ROM to be read from 0xb000 to 0xbfff */ - m_bank6->set_entry(m_swrbank); - break; - - case 0x04: - /* the video display should now use this flag to display the shadow RAM memory */ - m_vdusel = BIT(data,7); - setvideoshadow(m_vdusel); - break; - } -} - -WRITE8_MEMBER(bbc_state::page_selectbp128_w) +WRITE8_MEMBER(bbc_state::bbcbp_romsel_w) { - /* the BBC B+ 128K has extra RAM mapped in replacing the ROM banks 0,1,c and d. */ + /* the BBC Model B+ 128K has extra RAM mapped in replacing the ROM banks 0,1,c and d. */ static const unsigned short swram_banks[16] = { 1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0 }; + /* the BBC Model B+ addresses all 16 ROM sockets and extra 12K of RAM at 0x8000 and 20K of shadow RAM at 0x3000 */ switch (offset & 0x07) { case 0x00: m_paged_ram = BIT(data, 7); m_swrbank = data & 0x0f; - m_swrbank_ram = swram_banks[m_swrbank] ? true : false; + if (m_ram->size() == 128 * 1024) + { + m_swrbank_ram = swram_banks[m_swrbank] ? true : false; + } + else + { + m_swrbank_ram = false; + } if (m_paged_ram) { @@ -165,7 +139,7 @@ WRITE8_MEMBER(bbc_state::page_selectbp128_w) } /* set the ROM to be read from 0xb000 to 0xbfff */ - m_bank6->set_entry(m_swrbank); + m_bank5->set_entry(m_swrbank); break; case 0x04: @@ -176,23 +150,23 @@ WRITE8_MEMBER(bbc_state::page_selectbp128_w) } } -WRITE8_MEMBER(bbc_state::bbc_memorybp4_w) +WRITE8_MEMBER(bbc_state::bbcbp_bank4_w) { if (m_paged_ram) { - m_region_maincpu->base()[offset + 0x8000] = data; + m_ram->pointer()[offset + 0x8000] = data; } else if (m_swrbank_ram) { - m_region_opt->base()[offset + (m_swrbank << 14)] = data; + m_region_swr->base()[offset + (m_swrbank << 14)] = data; } } -WRITE8_MEMBER(bbc_state::bbc_memorybp6_w) +WRITE8_MEMBER(bbc_state::bbcbp_bank5_w) { if (m_swrbank_ram) { - m_region_opt->base()[offset + (m_swrbank << 14) + 0x3000] = data; + m_region_swr->base()[offset + (m_swrbank << 14) + 0x3000] = data; } } @@ -235,11 +209,11 @@ READ8_MEMBER(bbc_state::bbcm_fetch_r) { if (m_acccon_x || (m_acccon_e && offset >= 0xc000 && offset <= 0xdfff)) { - m_bank2->set_base(m_region_maincpu->base() + 0xb000); + m_bank2->set_base(m_ram->pointer() + 0xb000); } else { - m_bank2->set_base(m_region_maincpu->base() + 0x3000); + m_bank2->set_base(m_ram->pointer() + 0x3000); } return m_maincpu->space(AS_PROGRAM).read_byte(offset); } @@ -268,11 +242,11 @@ WRITE8_MEMBER(bbc_state::bbcm_acccon_w) /* Bit Y causes 8K of RAM (HAZEL) to be overlayed on the MOS VDU drivers. */ if (m_acccon_y) { - m_bank7->set_base(m_region_maincpu->base() + 0x9000); + m_bank6->set_base(m_ram->pointer() + 0x9000); } else { - m_bank7->set_base(m_region_os->base()); + m_bank6->set_base(m_region_mos->base()); } /* Bit D causes the CRT controller to display the contents of LYNNE. */ @@ -281,28 +255,20 @@ WRITE8_MEMBER(bbc_state::bbcm_acccon_w) /* Bit X causes all accesses to 0x3000-0x7fff to be re-directed to LYNNE.*/ if (m_acccon_x) { - m_bank2->set_base(m_region_maincpu->base() + 0xb000); + m_bank2->set_base(m_ram->pointer() + 0xb000); } else { - m_bank2->set_base(m_region_maincpu->base() + 0x3000); + m_bank2->set_base(m_ram->pointer() + 0x3000); } /* Bit TST controls paging of ROM reads in the 0xfc00-0xfeff region */ /* if 0 the I/O is paged for both reads and writes */ /* if 1 the ROM is paged in for reads but writes still go to I/O */ - if (m_acccon_tst) - { - m_bank8->set_base(m_region_os->base() + 0x3c00); - space.install_read_bank(0xfc00, 0xfeff, "bank8"); - } - else - { - space.install_read_handler(0xfc00, 0xfeff, read8_delegate(FUNC(bbc_state::bbcm_r), this)); - } + m_bankdev->set_bank(m_acccon_tst); } -WRITE8_MEMBER(bbc_state::page_selectbm_w) +WRITE8_MEMBER(bbc_state::bbcm_romsel_w) { m_paged_ram = (data & 0x80) >> 7; m_swrbank = data & 0x0f; @@ -330,156 +296,63 @@ WRITE8_MEMBER(bbc_state::page_selectbm_w) } } -WRITE8_MEMBER(bbc_state::bbc_memorybm4_w) +WRITE8_MEMBER(bbc_state::bbcm_bank4_w) { if (m_paged_ram) { - m_region_maincpu->base()[offset + 0x8000] = data; + m_ram->pointer()[offset + 0x8000] = data; } else if (m_swrbank_ram) { - m_region_opt->base()[offset + (m_swrbank << 14)] = data; + m_region_swr->base()[offset + (m_swrbank << 14)] = data; } } - -WRITE8_MEMBER(bbc_state::bbc_memorybm5_w) +WRITE8_MEMBER(bbc_state::bbcm_bank5_w) { if (m_swrbank_ram) { - m_region_opt->base()[offset + (m_swrbank << 14) + 0x1000] = data; + m_region_swr->base()[offset + (m_swrbank << 14) + 0x1000] = data; } } -WRITE8_MEMBER(bbc_state::bbc_memorybm7_w) +WRITE8_MEMBER(bbc_state::bbcm_bank6_w) { if (m_acccon_y) { - m_region_maincpu->base()[offset + 0x9000] = data; + m_ram->pointer()[offset + 0x9000] = data; } } - -/****************************************************************************** -&FC00-&FCFF FRED -&FC00-&FC03 Byte-Wide Expansion RAM -&FC08-&FC0F Ample M2000 MIDI Interface (see also FCF0) -&FC10-&FC13 Teletext -&FC14-&FC1F Prestel -&FC20-&FC27 IEEE 488 Interface -&FC28-&FC2F Acorn Expansion, currently unused -&FC30-&FC3F Cambridge Ring Interface -&FC40-&FC47 Winchester Disc Interface -&FC48-&FC7F Acorn Expansion, currently unused -&FC80-&FC8F Test Hardware -&FC90-&FCBF Acorn Expansion, currently unused -&FCC0-&FCFE User Applications -&FCF0-&FCF7 JGH/ETI MIDI Control (see also FC08) -&FCFC-&FCFF Page-Wide Expansion RAM - -&FD00-&FDFF JIM -&FD00-&FDFF Page-wide expansion RAM window -&FD40-&FD4F Torch SASI/SCSI Hard Drive Access -&FDFE-&FDFF Reset Test vector - -&FE00-&FEFF SHEILA Read Write -&FE00-&FE07 6845 CRTC Video controller Video Controller 8 ( 2 bytes x 4 ) -&FE08-&FE0F 6850 ACIA Serial controller Serial Controller 8 ( 2 bytes x 4 ) -&FE10-&FE17 Serial ULA - Serial system chip 8 ( 1 byte x 8 ) -&FE18-&FE1F uPD7002 A to D converter A to D converter 8 ( 4 bytes x 2 ) -&FE20-&FE23 Video ULA - Video system chip 4 ( 2 bytes x 2 ) -&FE24-&FE27 FDC Latch 1770 Control latch 1770 Control latch 4 ( 1 byte x 4 ) -&FE28-&FE2F 1770 registers 1770 Disc Controller 1770 Disc Controller 8 ( 4 bytes x 2 ) -&FE30-&FE33 ROMSEL - ROM Select 4 ( 1 byte x 4 ) -&FE34-&3FE7 ACCCON ACCCON select reg. ACCCON select reg 4 ( 1 byte x 4 ) -&FE38-&FE3F NC - - -&FE40-&FE5F 6522 VIA SYSTEM VIA SYSTEM VIA 32 (16 bytes x 2 ) 1MHz -&FE60-&FE7F 6522 VIA USER VIA USER VIA 32 (16 bytes x 2 ) 1MHz -&FE80-&FE9F 8271 registers 8271 Disk Controller 8271 Disk Controller -&FEA0-&FEBF 68B54 ADLC ECONET controller ECONET controller 32 ( 4 bytes x 8 ) 2MHz -&FEC0-&FEDF 6854 ADLC ECONET controller ECONET controller 32 ( 4 bytes x 8 ) 2MHz -&FEE0-&FEFF Tube ULA Tube system interface Tube system interface 32 (32 bytes x 1 ) 2MHz -******************************************************************************/ - -READ8_MEMBER(bbc_state::bbcm_r) +READ8_MEMBER(bbc_state::bbcm_tube_r) { - uint8_t data = 0xff; - uint8_t myo; + uint8_t data = 0xfe; - switch (offset >> 8) + if (m_acccon_itu) { - case 0x00: /* FRED */ - if (m_1mhzbus) return m_1mhzbus->fred_r(space, offset & 0xff); - break; - - case 0x01: /* JIM */ - if (m_1mhzbus) return m_1mhzbus->jim_r(space, offset & 0xff); - break; - - 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 */ - if ((myo>=0x10) && (myo<=0x17)) return 0xfe; /* Serial System Chip */ - 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>=0x34) && (myo<=0x37)) return bbcm_acccon_r(space, myo-0x34); /* ACCCON */ - 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>=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)) - { - 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; + /* internal Tube */ + if (m_intube) data = m_intube->host_r(space, offset); + } + else + { + /* external Tube */ + if (m_extube) data = m_extube->host_r(space, offset); } + return data; } -WRITE8_MEMBER(bbc_state::bbcm_w) +WRITE8_MEMBER(bbc_state::bbcm_tube_w) { - uint8_t myo; - - switch (offset >> 8) + if (m_acccon_itu) { - 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 */ - if ((myo>=0x10) && (myo<=0x17)) bbc_SerialULA_w(space, myo-0x10, data); /* Serial System Chip */ - 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>=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>=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>=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>=0xa0) && (myo<=0xbf) && (m_adlc)) m_adlc->write(space, myo & 0x03, data); - 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; + /* internal Tube */ + if (m_intube) m_intube->host_w(space, offset, data); + } + else + { + /* external Tube */ + if (m_extube) m_extube->host_w(space, offset, data); } } @@ -591,16 +464,13 @@ B7 - Operates the SHIFT lock LED (Pin 16 keyboard connector) INTERRUPT_GEN_MEMBER(bbc_state::bbcb_keyscan) { /* only do auto scan if keyboard is not enabled */ - if (m_b3_keyboard == 1) + if (m_latch->q3_r()) { /* KBD IC1 4 bit addressable counter */ /* KBD IC3 4 to 10 line decoder */ /* keyboard not enabled so increment counter */ m_column = (m_column + 1) % 16; - /* OS 0.1 programs CA2 to interrupt on negative edge and expects the keyboard to still work */ - //int set = (m_os01 ? 0 : 1); - if (m_column < 13) { /* KBD IC4 8 input NAND gate */ @@ -623,7 +493,7 @@ INTERRUPT_GEN_MEMBER(bbc_state::bbcb_keyscan) } -int bbc_state::bbc_keyboard(address_space &space, int data) +int bbc_state::bbc_keyboard(int data) { int bit; int row; @@ -649,9 +519,6 @@ int bbc_state::bbc_keyboard(address_space &space, int data) bit = 1; } - /* OS 0.1 programs CA2 to interrupt on negative edge and expects the keyboard to still work */ - //int set = (m_os01 ? 0 : 1); - if ((res | 1) != 0xff) { m_via6522_0->write_ca2(1); @@ -665,295 +532,161 @@ int bbc_state::bbc_keyboard(address_space &space, int data) } -void bbc_state::bbcb_IC32_initialise(bbc_state *state) +WRITE_LINE_MEMBER(bbc_state::snd_enable_w) { - 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 + if (!state && m_sn) + { + m_sn->write(m_via_system_porta); + } } +WRITE_LINE_MEMBER(bbc_state::speech_rsq_w) +{ + if (m_tms) + { + m_tms->rsq_w(state); + if (!m_latch->q1_r() && m_latch->q2_r()) + { + m_via_system_porta = m_tms->status_r(); + } + } +} -/* This the BBC Masters Real Time Clock and NVRAM IC */ -void bbc_state::MC146818_set(address_space &space) +WRITE_LINE_MEMBER(bbc_state::speech_wsq_w) { - //logerror ("146181 WR=%d DS=%d AS=%d CE=%d \n",m_MC146818_WR,m_MC146818_DS,m_MC146818_AS,m_MC146818_CE); + /* Write select on the speech processor */ + if (m_tms) + { + m_tms->wsq_w(state); + if (m_latch->q1_r() && !m_latch->q2_r()) + { + m_tms->data_w(m_via_system_porta); + } + } +} - // if chip enabled - if (m_MC146818_CE) +WRITE_LINE_MEMBER(bbc_state::kbd_enable_w) +{ + if (!state) { - // if data select is set then access the data in the 146818 - if (m_MC146818_DS) + m_via_system_porta = bbc_keyboard(m_via_system_porta); + } +} + +WRITE_LINE_MEMBER(bbc_state::capslock_led_w) +{ + output().set_value("capslock_led", state); +} + +WRITE_LINE_MEMBER(bbc_state::shiftlock_led_w) +{ + output().set_value("shiftlock_led", state); +} + + +void bbc_state::mc146818_set(address_space &space) +{ + /* if chip enabled */ + if (m_mc146818_ce) + { + /* if data select is set then access the data in the 146818 */ + if (m_latch->q2_r()) // DS { - if (m_MC146818_WR) + if (m_latch->q1_r()) // WR { m_via_system_porta = m_rtc->read(space, 1); - //logerror("read 146818 data %d \n",m_via_system_porta); } else { m_rtc->write(space, 1, m_via_system_porta); - //logerror("write 146818 data %d \n",m_via_system_porta); } } - // if address select is set then set the address in the 146818 - if (m_MC146818_AS) + /* if address select is set then set the address in the 146818 */ + if (m_mc146818_as) { m_rtc->write(space, 0, m_via_system_porta); - //logerror("write 146818 address %d \n",m_via_system_porta); } } } -WRITE8_MEMBER(bbc_state::bbcb_via_system_write_porta) +READ8_MEMBER(bbc_state::via_system_porta_r) { - //logerror("SYSTEM write porta %d\n",data); + return m_via_system_porta; +} +WRITE8_MEMBER(bbc_state::via_system_porta_w) +{ m_via_system_porta = data; - if (m_b0_sound == 0) - { - //logerror("Doing an unsafe write to the sound chip %d \n",data); - if (m_sn) m_sn->write(m_via_system_porta); - } - if (m_b1_speech_read == 0) - { - if (m_tms) m_via_system_porta = m_tms->status_r(); - //logerror("Doing an unsafe read to the speech chip %d \n",m_via_system_porta); - } - if (m_b2_speech_write == 0) + + /* Write enable to the sound generator */ + //if (!m_latch->q0_r() && m_sn) + //{ + // m_sn->write(m_via_system_porta); + //} + /* Keyboard write enable */ + if (!m_latch->q3_r()) { - //logerror("Doing an unsafe write to the speech chip %d \n",data); - if (m_tms) m_tms->data_w(m_via_system_porta); + m_via_system_porta = bbc_keyboard(m_via_system_porta); } - if (m_b3_keyboard == 0) + + if (m_rtc) { - //logerror("Doing an unsafe write to the keyboard %d \n",data); - m_via_system_porta = bbc_keyboard(space, m_via_system_porta); + mc146818_set(space); } - if (m_rtc) MC146818_set(space); } -WRITE8_MEMBER(bbc_state::bbcb_via_system_write_portb) +READ8_MEMBER(bbc_state::via_system_portb_r) { - int bit, value; - bit = data & 0x07; - value = BIT(data, 3); - - //logerror("SYSTEM write portb %d %d %d\n",data,bit,value); + uint8_t data = 0xff; - if (value) + /* B/B+/Master only */ + if (m_analog) { - switch (bit) - { - case 0: - if (m_b0_sound == 0) - { - m_b0_sound = 1; - } - break; - case 1: - if (m_machinetype == MASTER && m_MC146818_WR == 0) - { - /* BBC Master has NVRAM Here */ - m_MC146818_WR = 1; - MC146818_set(space); - } - else - { - if (m_b1_speech_read == 0) - { - /* VSP TMS 5220 */ - m_b1_speech_read = 1; - //logerror("Speech read select true\n"); - if (m_tms) m_tms->rsq_w(true); - } - } - break; - case 2: - if (m_machinetype == MASTER && m_MC146818_DS == 0) - { - /* BBC Master has NVRAM Here */ - m_MC146818_DS = 1; - MC146818_set(space); - } - else - { - if (m_b2_speech_write == 0) - { - /* VSP TMS 5220 */ - m_b2_speech_write = 1; - //logerror("Speech write select true\n"); - if (m_tms) m_tms->wsq_w(true); - } - } - break; - case 3: - if (m_b3_keyboard == 0) - { - m_b3_keyboard = 1; - } - break; - case 4: - if (m_b4_video0 == 0) - { - m_b4_video0 = 1; - } - break; - case 5: - if (m_b5_video1 == 0) - { - m_b5_video1 = 1; - } - break; - case 6: - if (m_b6_caps_lock_led == 0) - { - m_b6_caps_lock_led = 1; - /* call caps lock led update */ - output().set_value("capslock_led", m_b6_caps_lock_led); - } - break; - case 7: - if (m_b7_shift_lock_led == 0) - { - m_b7_shift_lock_led = 1; - /* call shift lock led update */ - output().set_value("shiftlock_led", m_b7_shift_lock_led); - } - break; - } + data &= ~0x30; + data |= m_analog->pb_r(); } - else + + /* Master Compact only */ + if (m_i2cmem) { - switch (bit) - { - case 0: - if (m_b0_sound == 1) - { - m_b0_sound = 0; - if (m_sn) m_sn->write(m_via_system_porta); - } - break; - case 1: - if (m_machinetype == MASTER && m_MC146818_WR == 1) - { - /* BBC Master has NVRAM Here */ - m_MC146818_WR = 0; - MC146818_set(space); - } - else - { - if (m_b1_speech_read == 1) - { - /* VSP TMS 5220 */ - m_b1_speech_read = 0; - //logerror("Speech read select false\n"); - if (m_tms) m_tms->rsq_w(false); - } - } - break; - case 2: - if (m_machinetype == MASTER && m_MC146818_DS == 1) - { - /* BBC Master has NVRAM Here */ - m_MC146818_DS = 0; - MC146818_set(space); - } - else - { - if (m_b2_speech_write == 1) - { - /* VSP TMS 5220 */ - m_b2_speech_write = 0; - //logerror("Speech write select false\n"); - if (m_tms) m_tms->wsq_w(false); - } - } - break; - case 3: - if (m_b3_keyboard == 1) - { - m_b3_keyboard = 0; - /* *** call keyboard enabled *** */ - m_via_system_porta = bbc_keyboard(space, m_via_system_porta); - } - break; - case 4: - if (m_b4_video0 == 1) - { - m_b4_video0 = 0; - } - break; - case 5: - if (m_b5_video1 == 1) - { - m_b5_video1 = 0; - } - break; - case 6: - if (m_b6_caps_lock_led == 1) - { - m_b6_caps_lock_led = 0; - /* call caps lock led update */ - output().set_value("capslock_led", m_b6_caps_lock_led); - } - break; - case 7: - if (m_b7_shift_lock_led == 1) - { - m_b7_shift_lock_led = 0; - /* call shift lock led update */ - output().set_value("shiftlock_led", m_b7_shift_lock_led); - } - break; - } + data &= ~0x30; + data |= m_i2cmem->read_sda() << 4; } - - if (m_machinetype == MASTER) + /* B/B+ only */ + if (m_tms) { - //set the Address Select - if (m_MC146818_AS != BIT(data,7)) - { - m_MC146818_AS = BIT(data,7); - MC146818_set(space); - } - - //if CE changes - if (m_MC146818_CE != BIT(data,6)) - { - m_MC146818_CE = BIT(data,6); - MC146818_set(space); - } + // TODO: Fix speech, it's never worked + //data &= ~0xc0; + //data |= m_tms->intq_r() << 6; + //data |= m_tms->readyq_r() << 7; } -} + return data; +} -READ8_MEMBER(bbc_state::bbcb_via_system_read_porta) +WRITE8_MEMBER(bbc_state::via_system_portb_w) { - //logerror("SYSTEM read porta %d\n",m_via_system_porta); - return m_via_system_porta; -} + m_latch->write_nibble_d3(space, 0, data); + /* Master only */ + if (m_rtc) + { + /* set Chip Enable and Address Strobe lines */ + m_mc146818_ce = BIT(data, 6); + m_mc146818_as = BIT(data, 7); + mc146818_set(space); + } -READ8_MEMBER(bbc_state::bbcb_via_system_read_portb) -{ - // D4 of portb is joystick fire button 1 - // D5 of portb is joystick fire button 2 - // D6 VSPINT - // D7 VSPRDY - int vspint = m_tms ? m_tms->intq_r() : 0; - int vsprdy = m_tms ? m_tms->readyq_r() : 0; - //logerror("TMSint %d\n",TMSint); - //logerror("TMSrdy %d\n",TMSrdy); - return ((m_analog ? m_analog->pb_r() : 0x30) | (!vsprdy << 7) | (!vspint << 6)); + /* Master Compact only */ + if (m_i2cmem) + { + m_i2cmem->write_sda(BIT(data, 4)); + m_i2cmem->write_scl(BIT(data, 5)); + } } @@ -965,10 +698,10 @@ WRITE_LINE_MEMBER(bbc_state::lpstb_w) } /************************************** - BBC Joystick Support + BBC Joystick Support **************************************/ -int bbc_state::BBC_get_analogue_input(int channel_number) +int bbc_state::get_analogue_input(int channel_number) { if (m_analog) return ((0xff - m_analog->ch_r(channel_number)) << 8); @@ -976,17 +709,17 @@ int bbc_state::BBC_get_analogue_input(int channel_number) return 0xff; } -void bbc_state::BBC_uPD7002_EOC(int data) +void bbc_state::upd7002_eoc(int data) { m_via6522_0->write_cb1(data); } /*************************************** - BBC 2C199 Serial Interface Cassette + BBC 2C199 Serial Interface Cassette ****************************************/ -void bbc_state::MC6850_Receive_Clock(int new_clock) +void bbc_state::mc6850_receive_clock(int new_clock) { m_rxd_cass = new_clock; update_acia_rxd(); @@ -1003,7 +736,7 @@ void bbc_state::MC6850_Receive_Clock(int new_clock) } } -TIMER_CALLBACK_MEMBER(bbc_state::bbc_tape_timer_cb) +TIMER_CALLBACK_MEMBER(bbc_state::tape_timer_cb) { if ( m_cass_out_enabled ) { @@ -1083,7 +816,7 @@ TIMER_CALLBACK_MEMBER(bbc_state::bbc_tape_timer_cb) m_nr_high_tones = 0; m_dcd_cass = 0; update_acia_dcd(); - MC6850_Receive_Clock(0); + mc6850_receive_clock(0); m_len0=0; m_len1=0; m_len2=0; @@ -1100,7 +833,7 @@ TIMER_CALLBACK_MEMBER(bbc_state::bbc_tape_timer_cb) m_dcd_cass = 1; update_acia_dcd(); } - MC6850_Receive_Clock(1); + mc6850_receive_clock(1); m_len0=0; m_len1=0; m_len2=0; @@ -1113,7 +846,7 @@ TIMER_CALLBACK_MEMBER(bbc_state::bbc_tape_timer_cb) } } -WRITE_LINE_MEMBER( bbc_state::write_rxd_serial ) +WRITE_LINE_MEMBER(bbc_state::write_rxd) { m_rxd_serial = state; update_acia_rxd(); @@ -1121,11 +854,11 @@ WRITE_LINE_MEMBER( bbc_state::write_rxd_serial ) void bbc_state::update_acia_rxd() { - m_acia->write_rxd(( m_serproc_data & 0x40 ) ? m_rxd_serial : m_rxd_cass); + m_acia->write_rxd(BIT(m_serproc_data, 6) ? m_rxd_serial : m_rxd_cass); } -WRITE_LINE_MEMBER( bbc_state::write_dcd_serial ) +WRITE_LINE_MEMBER(bbc_state::write_dcd) { m_dcd_serial = state; update_acia_dcd(); @@ -1133,11 +866,11 @@ WRITE_LINE_MEMBER( bbc_state::write_dcd_serial ) void bbc_state::update_acia_dcd() { - m_acia->write_dcd(( m_serproc_data & 0x40 ) ? m_dcd_serial : m_dcd_cass); + m_acia->write_dcd(BIT(m_serproc_data, 6) ? m_dcd_serial : m_dcd_cass); } -WRITE_LINE_MEMBER( bbc_state::write_cts_serial ) +WRITE_LINE_MEMBER(bbc_state::write_cts) { m_cts_serial = state; update_acia_cts(); @@ -1145,13 +878,13 @@ WRITE_LINE_MEMBER( bbc_state::write_cts_serial ) void bbc_state::update_acia_cts() { - m_acia->write_cts(( m_serproc_data & 0x40 ) ? m_cts_serial : 0); + m_acia->write_cts(BIT(m_serproc_data, 6) ? m_cts_serial : 0); } -WRITE_LINE_MEMBER( bbc_state::bbc_rts_w ) +WRITE_LINE_MEMBER(bbc_state::write_rts) { - if ( m_serproc_data & 0x40 ) + if (BIT(m_serproc_data, 6)) { m_rs232->write_rts(state); m_cass_out_enabled = 0; @@ -1163,9 +896,9 @@ WRITE_LINE_MEMBER( bbc_state::bbc_rts_w ) } -WRITE_LINE_MEMBER( bbc_state::bbc_txd_w ) +WRITE_LINE_MEMBER(bbc_state::write_txd) { - if ( m_serproc_data & 0x40 ) + if (BIT(m_serproc_data, 6)) { m_rs232->write_txd(state); } @@ -1205,24 +938,25 @@ void bbc_state::cassette_motor(bool motor_state) } -// -// Serial processor control -// x--- ---- - Motor OFF(0)/ON(1) -// -x-- ---- - Cassette(0)/RS243 input(1) -// --xx x--- - Receive baud rate generator control -// ---- -xxx - Transmit baud rate generator control -// These possible settings apply to both the receive -// and transmit baud generator control bits: -// 000 - 16MHz / 13 / 1 - 19200 baud -// 001 - 16MHz / 13 / 16 - 1200 baud -// 010 - 16MHz / 13 / 4 - 4800 baud -// 011 - 16MHz / 13 / 128 - 150 baud -// 100 - 16MHz / 13 / 2 - 9600 baud -// 101 - 16MHz / 13 / 64 - 300 baud -// 110 - 16MHz / 13 / 8 - 2400 baud -// 110 - 16MHz / 13 / 256 - 75 baud -// -WRITE8_MEMBER(bbc_state::bbc_SerialULA_w) +/* + Serial processor control + x--- ---- - Motor OFF(0)/ON(1) + -x-- ---- - Cassette(0)/RS243 input(1) + --xx x--- - Receive baud rate generator control + ---- -xxx - Transmit baud rate generator control + These possible settings apply to both the receive + and transmit baud generator control bits: + 000 - 16MHz / 13 / 1 - 19200 baud + 001 - 16MHz / 13 / 16 - 1200 baud + 010 - 16MHz / 13 / 4 - 4800 baud + 011 - 16MHz / 13 / 128 - 150 baud + 100 - 16MHz / 13 / 2 - 9600 baud + 101 - 16MHz / 13 / 64 - 300 baud + 110 - 16MHz / 13 / 8 - 2400 baud + 110 - 16MHz / 13 / 256 - 75 baud +*/ + +WRITE8_MEMBER(bbc_state::serial_ula_w) { static const int serial_clocks[8] = { @@ -1250,7 +984,7 @@ WRITE_LINE_MEMBER(bbc_state::write_acia_clock) { m_acia->write_txc(state); - if (m_serproc_data & 0x40) + if (BIT(m_serproc_data, 6)) m_acia->write_rxc(state); } @@ -1263,7 +997,7 @@ WRITE_LINE_MEMBER(bbc_state::write_acia_clock) WRITE_LINE_MEMBER(bbc_state::bus_nmi_w) { m_bus_nmi = state; - bbc_update_nmi(); + update_nmi(); } @@ -1274,27 +1008,22 @@ WRITE_LINE_MEMBER(bbc_state::bus_nmi_w) WRITE_LINE_MEMBER(bbc_state::motor_w) { - for (int i=0; i != 2; i++) { - char devname[8]; - sprintf(devname, "%d", i); - floppy_connector *con = m_i8271->subdevice(devname); - if (con) { - con->get_device()->mon_w(!state); - } - } + floppy_image_device *floppy0 = m_i8271->subdevice("0")->get_device(); + floppy_image_device *floppy1 = m_i8271->subdevice("1")->get_device(); + + if (floppy0) floppy0->mon_w(!state); + if (floppy1) floppy1->mon_w(!state); + m_i8271->ready_w(!state); } WRITE_LINE_MEMBER(bbc_state::side_w) { - for (int i=0; i != 2; i++) { - char devname[8]; - sprintf(devname, "%d", i); - floppy_connector *con = m_i8271->subdevice(devname); - if (con) { - con->get_device()->ss_w(state); - } - } + floppy_image_device *floppy0 = m_i8271->subdevice("0")->get_device(); + floppy_image_device *floppy1 = m_i8271->subdevice("1")->get_device(); + + if (floppy0) floppy0->ss_w(state); + if (floppy1) floppy1->ss_w(state); } @@ -1303,20 +1032,7 @@ WRITE_LINE_MEMBER(bbc_state::side_w) ***************************************/ -/* wd177x_IRQ_SET and latch bit 4 (nmi_enable) are NAND'ED together - wd177x_DRQ_SET and latch bit 4 (nmi_enable) are NAND'ED together - the output of the above two NAND gates are then OR'ED together and sent to the 6502 NMI line. - DRQ and IRQ are active low outputs from wd177x. We use wd177x_DRQ_SET for DRQ = 0, - and wd177x_DRQ_CLR for DRQ = 1. Similarly wd177x_IRQ_SET for IRQ = 0 and wd177x_IRQ_CLR - for IRQ = 1. - - The above means that if IRQ or DRQ are set, a interrupt should be generated. - The nmi_enable decides if interrupts are actually triggered. - The nmi is edge triggered, and triggers on a +ve edge. -*/ - - -void bbc_state::bbc_update_nmi() +void bbc_state::update_nmi() { if (m_fdc_irq || m_fdc_drq || m_adlc_irq || m_bus_nmi) { @@ -1331,17 +1047,17 @@ void bbc_state::bbc_update_nmi() WRITE_LINE_MEMBER(bbc_state::fdc_intrq_w) { m_fdc_irq = state; - bbc_update_nmi(); + update_nmi(); } WRITE_LINE_MEMBER(bbc_state::fdc_drq_w) { m_fdc_drq = state; - bbc_update_nmi(); + update_nmi(); } /* - B/ B+ drive control: + B+ drive control: Bit Meaning ----------------- @@ -1354,12 +1070,10 @@ WRITE_LINE_MEMBER(bbc_state::fdc_drq_w) 0 Drive select 0. */ -WRITE8_MEMBER(bbc_state::bbc_wd1770_status_w) +WRITE8_MEMBER(bbc_state::bbcbp_drive_control_w) { floppy_image_device *floppy = nullptr; - m_drive_control = data; - // bit 0, 1: drive select if (BIT(data, 0)) floppy = m_wd1770->subdevice("0")->get_device(); if (BIT(data, 1)) floppy = m_wd1770->subdevice("1")->get_device(); @@ -1372,7 +1086,7 @@ WRITE8_MEMBER(bbc_state::bbc_wd1770_status_w) // bit 3: density m_wd1770->dden_w(BIT(data, 3)); - // bit 4: interrupt enable + // bit 4: interrupt enable (S5 wire link not fitted) // bit 5: reset if (!BIT(data, 5)) m_wd1770->soft_reset(); @@ -1392,21 +1106,13 @@ WRITE8_MEMBER(bbc_state::bbc_wd1770_status_w) 0 Drive select 0. */ -READ8_MEMBER(bbc_state::bbcm_wd177xl_read) -{ - return m_drive_control; -} - -WRITE8_MEMBER(bbc_state::bbcm_wd1770l_write) +WRITE8_MEMBER(bbc_state::bbcm_drive_control_w) { floppy_image_device *floppy = nullptr; - m_drive_control = data; - // bit 0, 1, 3: drive select if (BIT(data, 0)) floppy = m_wd1770->subdevice("0")->get_device(); if (BIT(data, 1)) floppy = m_wd1770->subdevice("1")->get_device(); - if (BIT(data, 3)) floppy = m_wd1770->subdevice("2")->get_device(); m_wd1770->set_floppy(floppy); // bit 4: side select @@ -1420,16 +1126,13 @@ WRITE8_MEMBER(bbc_state::bbcm_wd1770l_write) if (!BIT(data, 2)) m_wd1770->soft_reset(); } -WRITE8_MEMBER(bbc_state::bbcm_wd1772l_write) +WRITE8_MEMBER(bbc_state::bbcmc_drive_control_w) { floppy_image_device *floppy = nullptr; - m_drive_control = data; - // bit 0, 1, 3: drive select if (BIT(data, 0)) floppy = m_wd1772->subdevice("0")->get_device(); if (BIT(data, 1)) floppy = m_wd1772->subdevice("1")->get_device(); - if (BIT(data, 3)) floppy = m_wd1772->subdevice("2")->get_device(); m_wd1772->set_floppy(floppy); // bit 4: side select @@ -1444,31 +1147,69 @@ WRITE8_MEMBER(bbc_state::bbcm_wd1772l_write) } /************************************** - BBC B Rom loading functions + BBC romslot loading functions ***************************************/ -image_init_result bbc_state::bbc_load_rom(device_image_interface &image, generic_slot_device *slot) +image_init_result bbc_state::load_rom16(device_image_interface &image, generic_slot_device *slot) { uint32_t size = slot->common_get_size("rom"); // socket accepts 8K and 16K ROM only if (size != 0x2000 && size != 0x4000) { - image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported ROM size"); + image.seterror(IMAGE_ERROR_UNSPECIFIED, "ROM socket accepts 16K/8K only"); return image_init_result::FAIL; } - slot->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE); + slot->rom_alloc(0x4000, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE); slot->common_load_rom(slot->get_rom_base(), size, "rom"); + uint8_t *crt = slot->get_rom_base(); + if (size == 0x2000) + { + /* mirror 8K ROMs */ + memcpy(crt + 0x2000, crt, 0x2000); + } + + return image_init_result::PASS; +} + +image_init_result bbc_state::load_rom32(device_image_interface &image, generic_slot_device *slot) +{ + uint32_t size = slot->common_get_size("rom"); + + // socket accepts 32K,16K and 8K ROM only + if (size != 0x8000 && size != 0x4000 && size != 0x2000) + { + image.seterror(IMAGE_ERROR_UNSPECIFIED, "ROM socket accepts 32K/16K/8K only"); + return image_init_result::FAIL; + } + + slot->rom_alloc(0x8000, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE); + slot->common_load_rom(slot->get_rom_base(), size, "rom"); + + uint8_t *crt = slot->get_rom_base(); + if (size == 0x2000) + { + /* mirror 8K ROMs */ + memcpy(crt + 0x2000, crt, 0x2000); + memcpy(crt + 0x4000, crt, 0x2000); + memcpy(crt + 0x6000, crt, 0x2000); + } + else if (size == 0x4000) + { + /* mirror 16K ROMs */ + memcpy(crt + 0x4000, crt, 0x4000); + } + return image_init_result::PASS; } /************************************** - BBC Master Rom loading functions + BBC cartslot loading functions ***************************************/ -image_init_result bbc_state::bbcm_load_cart(device_image_interface &image, generic_slot_device *slot) +image_init_result bbc_state::load_cart(device_image_interface &image, generic_slot_device *slot) { if (!image.loaded_through_softlist()) { @@ -1476,7 +1217,7 @@ image_init_result bbc_state::bbcm_load_cart(device_image_interface &image, gener if (filesize > 0x8000) { - image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size"); + image.seterror(IMAGE_ERROR_UNSPECIFIED, "Cartridge socket accepts 16K/32K only"); return image_init_result::FAIL; } @@ -1510,237 +1251,196 @@ image_init_result bbc_state::bbcm_load_cart(device_image_interface &image, gener void bbc_state::init_bbc() { - m_os01 = false; - m_rxd_cass = 0; m_nr_high_tones = 0; m_serproc_data = 0; m_cass_out_enabled = 0; - m_tape_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(bbc_state::bbc_tape_timer_cb),this)); + m_tape_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(bbc_state::tape_timer_cb), this)); + m_reset_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(bbc_state::reset_timer_cb), this)); /* vertical sync pulse from video circuit */ m_via6522_0->write_ca1(1); /* light pen strobe detect (not emulated) */ m_via6522_0->write_cb2(1); + + m_monitortype = monitor_type_t::COLOUR; + m_swramtype = 0; } +void bbc_state::init_ltmp() +{ + init_bbc(); + + /* LTM machines used a 9" Hantarex MT3000 green monitor */ + m_monitortype = monitor_type_t::GREEN; +} -// setup pointers for optional EPROMs -void bbc_state::bbc_setup_banks(memory_bank *membank, int banks, uint32_t shift, uint32_t size) +void bbc_state::init_bbcm() { std::string region_tag; - memory_region *tmp_reg; - uint8_t *eprom[4]; - if (m_exp1 && (tmp_reg = memregion(region_tag.assign(m_exp1->tag()).append(GENERIC_ROM_REGION_TAG).c_str()))) - eprom[0] = tmp_reg->base() + shift; - else - eprom[0] = m_region_opt->base() + 0x0000 + shift; - if (m_exp2 && (tmp_reg = memregion(region_tag.assign(m_exp2->tag()).append(GENERIC_ROM_REGION_TAG).c_str()))) - eprom[1] = tmp_reg->base() + shift; - else - eprom[1] = m_region_opt->base() + 0x4000 + shift; - if (m_exp3 && (tmp_reg = memregion(region_tag.assign(m_exp3->tag()).append(GENERIC_ROM_REGION_TAG).c_str()))) - eprom[2] = tmp_reg->base() + shift; - else - eprom[2] = m_region_opt->base() + 0x8000 + shift; - if (m_exp4 && (tmp_reg = memregion(region_tag.assign(m_exp4->tag()).append(GENERIC_ROM_REGION_TAG).c_str()))) - eprom[3] = tmp_reg->base() + shift; - else - eprom[3] = m_region_opt->base() + 0xc000 + shift; - membank->configure_entries(0, 1, eprom[0], size); - membank->configure_entries(1, 1, eprom[1], size); - membank->configure_entries(2, 1, eprom[2], size); - membank->configure_entries(3, 1, eprom[3], size); + init_bbc(); - if (banks > 4) + /* set links if ROM present, disabling RAM */ + if (m_rom[4] && memregion(region_tag.assign(m_rom[4]->tag()).append(GENERIC_ROM_REGION_TAG).c_str())) { - for (int i = 0; i < banks - 4; i++) - membank->configure_entries(i + 4, 1, m_region_opt->base() + 0x10000 + shift + i * 0x4000, size); + /* link for ROM in slots 4 and 5 */ + m_lk19_ic37_paged_rom = true; } -} - -void bbc_state::bbcm_setup_banks(memory_bank *membank, int banks, uint32_t shift, uint32_t size) -{ - std::string region_tag; - memory_region *tmp_reg; - uint8_t *eprom[2]; - if (m_exp1 && (tmp_reg = memregion(region_tag.assign(m_exp1->tag()).append(GENERIC_ROM_REGION_TAG).c_str()))) - eprom[0] = tmp_reg->base() + shift; else - eprom[0] = m_region_opt->base() + 0x0000 + shift; - if (m_exp2 && (tmp_reg = memregion(region_tag.assign(m_exp2->tag()).append(GENERIC_ROM_REGION_TAG).c_str()))) - eprom[1] = tmp_reg->base() + shift; + { + m_lk18_ic41_paged_rom = false; + } + if (m_rom[6] && memregion(region_tag.assign(m_rom[6]->tag()).append(GENERIC_ROM_REGION_TAG).c_str())) + { + /* link for ROM in slots 6 and 7 */ + m_lk18_ic41_paged_rom = true; + } else - eprom[1] = m_region_opt->base() + 0x8000 + shift; - - membank->configure_entries(0, 1, eprom[0], size); - membank->configure_entries(1, 1, eprom[0] + 0x4000, size); - membank->configure_entries(2, 1, eprom[1], size); - membank->configure_entries(3, 1, eprom[1] + 0x4000, size); - - if (banks > 4) { - for (int i = 0; i < banks - 4; i++) - membank->configure_entries(i + 4, 1, m_region_opt->base() + 0x10000 + shift + i * 0x4000, size); + m_lk18_ic41_paged_rom = false; } } -MACHINE_START_MEMBER(bbc_state, bbca) +void bbc_state::init_cfa() { - m_machinetype = MODELA; + init_bbc(); + + /* link for ROM in slots 4 and 5 */ + m_lk19_ic37_paged_rom = true; + /* link for ROM in slots 6 and 7 */ + m_lk18_ic41_paged_rom = true; - bbc_setup_banks(m_bank4, 4, 0, 0x4000); + m_monitortype = monitor_type_t::GREEN; } -MACHINE_RESET_MEMBER(bbc_state, bbca) + +/************************************** + Setup pointers for rom/cartridge slots +***************************************/ + +void bbc_state::setup_banks(memory_bank *membank, uint32_t shift) { - m_monitortype = m_bbcconfig.read_safe(0) & 0x03; - m_swramtype = (m_bbcconfig.read_safe(0) & 0x0c) >> 2; + std::string region_tag; + memory_region *rom_region; - m_bank1->set_base(m_region_maincpu->base()); - if (m_ram->size() == 32*1024) + /* configure romslots */ + for (int i = 0; i < 16; i++) { - /* 32K Model A */ - m_bank3->set_base(m_region_maincpu->base() + 0x4000); + membank->configure_entry(i, m_region_swr->base() + (i * 0x4000) + shift); + /* TODO: expansion devices currently use machine().root_device(), add method to slot interfaces to return pointer to memregion("rom") */ + //if (m_fdc->rom_region[i]) + //{ + // membank->configure_entry(i, m_fdc->rom_region[i] + shift); + //} + /* romslots populated by user override expansion devices */ + if (m_rom[i] && (rom_region = memregion(region_tag.assign(m_rom[i]->tag()).append(GENERIC_ROM_REGION_TAG).c_str()))) + { + switch (rom_region->bytes()) + { + case 0x4000: /* 16K socket */ + membank->configure_entry(i, rom_region->base() + shift); + break; + case 0x8000: /* 32K socket */ + membank->configure_entry(i++, rom_region->base() + shift); + membank->configure_entry(i, rom_region->base() + shift + 0x4000); + break; + } + } } - else + + /* configure cartslots */ + for (int i = 0; i < 2; i++) { - /* 16K just repeat the lower 16K*/ - m_bank3->set_base(m_region_maincpu->base()); + if (m_cart[i] && (rom_region = memregion(region_tag.assign(m_cart[i]->tag()).append(GENERIC_ROM_REGION_TAG).c_str()))) + { + membank->configure_entry(i * 2, rom_region->base() + shift); + membank->configure_entry(i * 2 + 1, rom_region->base() + shift + 0x4000); + } } +} - m_bank4->set_entry(0); - m_bank7->set_base(m_region_os->base()); /* bank 7 points at the OS rom from c000 to ffff */ - bbcb_IC32_initialise(this); -} +/************************************** + Machine start/reset +***************************************/ -MACHINE_START_MEMBER(bbc_state, bbcb) +void bbc_state::machine_start() { - m_machinetype = MODELB; - m_mc6850_clock = 0; - bbc_setup_banks(m_bank4, 16, 0, 0x4000); + setup_banks(m_bank4, 0x0000); } -MACHINE_RESET_MEMBER(bbc_state, bbcb) +void bbc_state::machine_reset() { - m_monitortype = m_bbcconfig.read_safe(0) & 0x03; m_swramtype = (m_bbcconfig.read_safe(0) & 0x0c) >> 2; - - m_bank1->set_base(m_region_maincpu->base()); - m_bank3->set_base(m_region_maincpu->base() + 0x4000); + /* bank 1 regular lower RAM from 0000 to 3fff */ + m_bank1->set_base(m_ram->pointer()); + /* bank 3 regular higher RAM from 4000 to 7fff */ + if (m_ram->size() == 16 * 1024) + { + /* 16K just repeat the lower 16K*/ + m_bank3->set_base(m_ram->pointer()); + } + else + { + /* 32K */ + m_bank3->set_base(m_ram->pointer() + 0x4000); + } m_bank4->set_entry(0); - m_bank7->set_base(m_region_os->base()); /* bank 7 points at the OS rom from c000 to ffff */ + /* bank 7 OS ROM from c000 to ffff */ + m_bank6->set_base(m_region_mos->base()); - bbcb_IC32_initialise(this); + /* power-on reset timer, should produce "boo...beep" startup sound before sn76496 is initialised */ + //m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); + //m_reset_timer->adjust(attotime::from_msec(138.6)); } -MACHINE_RESET_MEMBER(bbc_state, torch) +void bbcbp_state::machine_start() { - MACHINE_RESET_CALL_MEMBER(bbcb); + bbc_state::machine_start(); - m_monitortype = monitor_type_t::COLOUR; - m_swramtype = 0; + /* additional bank for paged ram */ + m_bank4->configure_entry(16, m_ram->pointer() + 0x8000); + setup_banks(m_bank5, 0x3000); } - -MACHINE_START_MEMBER(bbc_state, bbcbp) +void bbcbp_state::machine_reset() { - m_machinetype = BPLUS; - m_mc6850_clock = 0; - - bbc_setup_banks(m_bank4, 16, 0, 0x3000); - m_bank4->configure_entries(16, 1, m_region_maincpu->base() + 0x8000, 0x3000); // additional bank for paged ram - bbc_setup_banks(m_bank6, 16, 0x3000, 0x1000); -} - -MACHINE_RESET_MEMBER(bbc_state, bbcbp) -{ - m_monitortype = m_bbcconfig.read_safe(0) & 0x03; - m_swramtype = 0; - - m_bank1->set_base(m_region_maincpu->base()); - m_bank2->set_base(m_region_maincpu->base() + 0x3000); /* bank 2 screen/shadow ram from 3000 to 7fff */ + /* bank 1 regular lower RAM from 0000 to 2fff */ + m_bank1->set_base(m_ram->pointer()); + /* bank 2 screen/shadow RAM from 3000 to 7fff */ + m_bank2->set_base(m_ram->pointer() + 0x3000); m_bank4->set_entry(0); - m_bank6->set_entry(0); - m_bank7->set_base(m_region_os->base()); /* bank 7 points at the OS rom from c000 to ffff */ - - bbcb_IC32_initialise(this); + m_bank5->set_entry(0); + /* bank 6 OS ROM from c000 to ffff */ + m_bank6->set_base(m_region_mos->base()); } -MACHINE_START_MEMBER(bbc_state, bbcm) +void bbcm_state::machine_start() { - m_machinetype = MASTER; - m_mc6850_clock = 0; + bbc_state::machine_start(); - m_lk18_ic41_paged_rom = false; /* Link set for RAM in slots 6 and 7 */ - m_lk19_ic37_paged_rom = false; /* Link set for RAM in slots 4 and 5 */ - - bbcm_setup_banks(m_bank4, 16, 0, 0x1000); - m_bank4->configure_entries(16, 1, m_region_maincpu->base() + 0x8000, 0x1000); // additional bank for paged ram - bbcm_setup_banks(m_bank5, 16, 0x1000, 0x3000); - - /* Set ROM/IO bank to point to rom */ - m_bank8->set_base(m_region_os->base() + 0x3c00); - m_maincpu->space(AS_PROGRAM).install_read_bank(0xfc00, 0xfeff, "bank8"); + /* additional bank for paged ram */ + m_bank4->configure_entry(16, m_ram->pointer() + 0x8000); + setup_banks(m_bank5, 0x1000); output().set_value("power_led", 0); } -MACHINE_RESET_MEMBER(bbc_state, bbcm) +void bbcm_state::machine_reset() { - m_monitortype = m_bbcconfig.read_safe(0) & 0x03; - m_swramtype = 0; - - m_bank1->set_base(m_region_maincpu->base()); /* bank 1 regular lower RAM from 0000 to 2fff */ - m_bank2->set_base(m_region_maincpu->base() + 0x3000); /* bank 2 screen/shadow RAM from 3000 to 7fff */ + /* bank 1 regular lower RAM from 0000 to 2fff */ + m_bank1->set_base(m_ram->pointer()); + /* bank 2 screen/shadow RAM from 3000 to 7fff */ + m_bank2->set_base(m_ram->pointer() + 0x3000); m_bank4->set_entry(0); m_bank5->set_entry(0); - m_bank7->set_base(m_region_os->base()); /* bank 6 OS rom of RAM from c000 to dfff */ - - bbcb_IC32_initialise(this); -} - - -MACHINE_START_MEMBER(bbc_state, bbcmc) -{ - MACHINE_START_CALL_MEMBER(bbcm); - - m_machinetype = COMPACT; -} - -MACHINE_RESET_MEMBER(bbc_state, bbcmc) -{ - MACHINE_RESET_CALL_MEMBER(bbcm); -} - - -MACHINE_RESET_MEMBER(bbc_state, ltmpbp) -{ - MACHINE_RESET_CALL_MEMBER(bbcbp); - - m_monitortype = monitor_type_t::GREEN; - m_swramtype = 0; -} - -MACHINE_RESET_MEMBER(bbc_state, ltmpm) -{ - MACHINE_RESET_CALL_MEMBER(bbcm); - - m_monitortype = monitor_type_t::GREEN; - m_swramtype = 0; -} - - -MACHINE_START_MEMBER(bbc_state, cfa3000) -{ - MACHINE_START_CALL_MEMBER(bbcm); + /* bank 6 OS ROM from c000 to ffff */ + m_bank6->set_base(m_region_mos->base()); - m_lk18_ic41_paged_rom = true; /* Link set for ROM in slots 6 and 7 */ - m_lk19_ic37_paged_rom = true; /* Link set for ROM in slots 4 and 5 */ + m_bankdev->set_bank(0); } diff --git a/src/mame/video/bbc.cpp b/src/mame/video/bbc.cpp index 96e53a0e380..f8d9ed94c9e 100644 --- a/src/mame/video/bbc.cpp +++ b/src/mame/video/bbc.cpp @@ -40,8 +40,8 @@ uint16_t bbc_state::calculate_video_address(uint16_t ma, uint8_t ra) { /* output from IC32 74LS259 bits 4 and 5 */ - int c0 = m_b4_video0; - int c1 = m_b5_video1; + int c0 = m_latch->q4_r(); + int c1 = m_latch->q5_r(); /* the 4 bit input port b on IC39 are produced by 4 NAND gates. These NAND gates take their inputs from c0 and c1 (from IC32) and ma12 (from the 6845) */ @@ -141,7 +141,7 @@ void bbc_state::set_pixel_lookup() } -WRITE8_MEMBER(bbc_state::bbc_videoULA_w) +WRITE8_MEMBER(bbc_state::video_ula_w) { // Make sure vpos is never <0 int vpos = m_screen->vpos(); @@ -175,13 +175,13 @@ WRITE8_MEMBER(bbc_state::bbc_videoULA_w) m_hd6845->set_hpixels_per_column(m_pixels_per_byte); if (m_video_ula.clock_rate_6845) - m_hd6845->set_clock(XTAL(16'000'000) / 8); + m_hd6845->set_clock(16_MHz_XTAL / 8); else - m_hd6845->set_clock(XTAL(16'000'000) / 16); + m_hd6845->set_clock(16_MHz_XTAL / 16); // FIXME: double clock for MODE7 until interlace is implemented if (m_video_ula.teletext_normal_select) - m_hd6845->set_clock(XTAL(16'000'000) / 8); + m_hd6845->set_clock(16_MHz_XTAL / 8); break; // Set a palette register in the Video ULA case 1: @@ -288,21 +288,20 @@ void bbc_state::setvideoshadow(int vdusel) // as the video circuitry will already be looking at 0x3000 or so above // the offset. if (vdusel) - m_video_ram = m_region_maincpu->base() + 0x8000; + m_video_ram = m_ram->pointer() + 0x8000; else - m_video_ram = m_region_maincpu->base(); + m_video_ram = m_ram->pointer(); } /************************************************************************ - * bbc_vh_start * Initialize the BBC video emulation ************************************************************************/ -VIDEO_START_MEMBER(bbc_state, bbc) +void bbc_state::video_start() { m_cursor_size = 1; set_pixel_lookup(); - m_video_ram = m_region_maincpu->base(); + m_video_ram = m_ram->pointer(); } -- cgit v1.2.3