diff options
author | Fabio Priuli <etabeta78@users.noreply.github.com> | 2013-10-28 18:34:15 +0000 |
---|---|---|
committer | Fabio Priuli <etabeta78@users.noreply.github.com> | 2013-10-28 18:34:15 +0000 |
commit | 707cc76fd13abd1f44c613d003a5b86411fcc328 (patch) | |
tree | 5777048a2be1b128c0cdc2bad93fc3d94311490f /src | |
parent | 4fca5f2c04f73380036ba21546277ac67f3ad39e (diff) |
(MESS) BBC Micro updates / fixes: [Nigel Barnes]
- implemented ram device, all models have default ramsize, model A is 16K/32K switchable.
- added additional bios options for OS0.1, OS1.0 in models A/B.
- added clones bbcb_de, bbcb_us for BBC B German and US export models.
- added clones bbcmaiv, bbcmet, bbcmt, bbcm512, bbcmarm for other BBC Master models.
- added clones bbcmc, bbcmc_ar for BBC Master Compact and Arabic models.
- implemented BREAK key.
- fixed 8271 disk loading of ssd,dsd images.
- device mc146818 now accepts default CMOS RAM.
- added default CMOS RAM settings for all Master models.
Diffstat (limited to 'src')
-rw-r--r-- | src/emu/machine/mc146818.c | 86 | ||||
-rw-r--r-- | src/emu/machine/mc146818.h | 2 | ||||
-rw-r--r-- | src/mess/drivers/bbc.c | 1253 | ||||
-rw-r--r-- | src/mess/includes/bbc.h | 47 | ||||
-rw-r--r-- | src/mess/machine/bbc.c | 365 | ||||
-rw-r--r-- | src/mess/mess.lst | 21 | ||||
-rw-r--r-- | src/mess/video/bbc.c | 2 |
7 files changed, 1175 insertions, 601 deletions
diff --git a/src/emu/machine/mc146818.c b/src/emu/machine/mc146818.c index 8706549df81..27ddcfb3b6d 100644 --- a/src/emu/machine/mc146818.c +++ b/src/emu/machine/mc146818.c @@ -4,7 +4,7 @@ Implementation of the MC146818 chip - Real time clock chip with battery buffered ram (or CMOS) + Real time clock chip with battery backed ram (or CMOS) Used in IBM PC/AT, several PC clones, Amstrad NC200, Apollo workstations Nathan Woods (npwoods@mess.org) @@ -92,12 +92,14 @@ #define HOURS_24 (m_data[0xb]&2) #define BCD_MODE !(m_data[0xb]&4) // book has other description! -#define CENTURY m_data[100] +#define CENTURY m_data[72] #define YEAR m_data[9] #define MONTH m_data[8] #define DAY m_data[7] #define WEEK_DAY m_data[6] - +#define HOUR m_data[4] +#define MINUTE m_data[2] +#define SECOND m_data[0] //************************************************************************** @@ -175,19 +177,19 @@ void mc146818_device::device_timer(emu_timer &timer, device_timer_id id, int par if (BCD_MODE) { - m_data[0]=bcd_adjust(m_data[0]+1); - if (m_data[0]>=0x60) + SECOND=bcd_adjust(SECOND+1); + if (SECOND>=0x60) { - m_data[0]=0; - m_data[2]=bcd_adjust(m_data[2]+1); - if (m_data[2]>=0x60) + SECOND=0; + MINUTE=bcd_adjust(MINUTE+1); + if (MINUTE>=0x60) { - m_data[2]=0; - m_data[4]=bcd_adjust(m_data[4]+1); + MINUTE=0; + HOUR=bcd_adjust(HOUR+1); // different handling of hours - if (m_data[4]>=0x24) + if (HOUR>=0x24) { - m_data[4]=0; + HOUR=0; WEEK_DAY=bcd_adjust(WEEK_DAY+1)%7; DAY=bcd_adjust(DAY+1); //month=bcd_2_dec(MONTH); @@ -218,17 +220,17 @@ void mc146818_device::device_timer(emu_timer &timer, device_timer_id id, int par } else { - m_data[0]=m_data[0]+1; - if (m_data[0]>=60) + SECOND=SECOND+1; + if (SECOND>=60) { - m_data[0]=0; - m_data[2]=m_data[2]+1; - if (m_data[2]>=60) { - m_data[2]=0; - m_data[4]=m_data[4]+1; + SECOND=0; + MINUTE=MINUTE+1; + if (MINUTE>=60) { + MINUTE=0; + HOUR=HOUR+1; // different handling of hours //? - if (m_data[4]>=24) { - m_data[4]=0; + if (HOUR>=24) { + HOUR=0; WEEK_DAY=(WEEK_DAY+1)%7; year=YEAR; if (m_type!=MC146818_IGNORE_CENTURY) year+=CENTURY*100; @@ -250,9 +252,9 @@ void mc146818_device::device_timer(emu_timer &timer, device_timer_id id, int par } } - if (m_data[1] == m_data[0] && // - m_data[3] == m_data[2] && // - m_data[5] == m_data[4]) { + if (m_data[1] == SECOND && // + m_data[3] == MINUTE && // + m_data[5] == HOUR) { // set the alarm interrupt flag AF m_data[0x0c] |= 0x20; } else { @@ -287,13 +289,13 @@ void mc146818_device::device_timer(emu_timer &timer, device_timer_id id, int par void mc146818_device::rtc_clock_updated(int year, int month, int day, int day_of_week, int hour, int minute, int second) { - YEAR = year; - MONTH = month; - DAY = day; + YEAR = year; + MONTH = month; + DAY = day; WEEK_DAY = day_of_week; - m_data[4] = hour; - m_data[2] = minute; - m_data[0] = second; + HOUR = hour; + MINUTE = minute; + SECOND = second; } @@ -304,6 +306,16 @@ void mc146818_device::rtc_clock_updated(int year, int month, int day, int day_of void mc146818_device::nvram_default() { + // populate from a memory region if present + if (m_region != NULL) + { + UINT32 bytes = m_region->bytes(); + + if (bytes > sizeof(m_data)) + bytes = sizeof(m_data); + + memcpy(m_data, m_region->base(), bytes); + } set_base_datetime(); } @@ -361,18 +373,18 @@ void mc146818_device::set_base_datetime() // current_time.hour,current_time.minute, current_time.second); if (HOURS_24 || (current_time.hour < 12)) - m_data[4] = dec_2_local(current_time.hour); + HOUR = dec_2_local(current_time.hour); else - m_data[4] = dec_2_local(current_time.hour - 12) | 0x80; + HOUR = dec_2_local(current_time.hour - 12) | 0x80; if (m_type != MC146818_IGNORE_CENTURY) CENTURY = dec_2_local(current_time.year /100); - m_data[0] = dec_2_local(current_time.second); - m_data[2] = dec_2_local(current_time.minute); - DAY = dec_2_local(current_time.mday); - MONTH = dec_2_local(current_time.month + 1); - YEAR = dec_2_local(current_time.year % 100); + SECOND = dec_2_local(current_time.second); + MINUTE = dec_2_local(current_time.minute); + DAY = dec_2_local(current_time.mday); + MONTH = dec_2_local(current_time.month + 1); + YEAR = dec_2_local(current_time.year % 100); WEEK_DAY = current_time.weekday; if (current_time.is_dst) diff --git a/src/emu/machine/mc146818.h b/src/emu/machine/mc146818.h index 09e177d3501..3d8a4ac9261 100644 --- a/src/emu/machine/mc146818.h +++ b/src/emu/machine/mc146818.h @@ -4,7 +4,7 @@ Implementation of the MC146818 chip - Real time clock chip with batteru buffered ram + Real time clock chip with battery backed ram Used in IBM PC/AT, several PC clones, Amstrad NC200 Peter Trauner (peter.trauner@jk.uni-linz.ac.at) diff --git a/src/mess/drivers/bbc.c b/src/mess/drivers/bbc.c index 1d6c9683406..20919e193e1 100644 --- a/src/mess/drivers/bbc.c +++ b/src/mess/drivers/bbc.c @@ -1,38 +1,75 @@ /****************************************************************************** BBC Model A,B - BBC Model B Plus - + ANA01 - Model A + ANA02 - Model A with Econet interface + + ANB01 - Model B + ANB02 - Model B with Econet interface + ANB03 - Model B with Disc interface + ANB04 - Model B with Disc and Econet interfaces + + GNB14 - Model B with Disc, Econet & Speech (German model) + UNB09 - Model B with Disc, Econet & Speech (US model) + + BBC Model B+ + + ANB51 - BBC Model B+ 64K + ANB52 - BBC Model B+ 64K with Econet + ANB53 - BBC Model B+ 64K with Disc interface + ANB54 - BBC Model B+ 64K with Disc and Econet interfaces + ANB55 - BBC Model B+ 128K with Disc interface + + BBC Master + + AMB15 - Master 128 + ADB12 - Master Econet Terminal + AVC12 - Master AIV + ARM1 - ARM Evaluation System + ADB20 - Master Compact + + MESS Driver By: Gordon Jefferyes mess_bbc@romvault.com + Nigel Barnes + ngbarnes@hotmail.com ******************************************************************************/ +/* Core includes */ #include "emu.h" -#include "bus/econet/econet.h" + +/* Components */ #include "cpu/m6502/m6502.h" #include "cpu/m6502/m65sc02.h" #include "machine/6522via.h" -#include "machine/mc146818.h" +#include "machine/mc146818.h" /* RTC & CMOS RAM */ #include "machine/mc6854.h" #include "machine/upd7002.h" #include "bus/centronics/ctronics.h" +#include "bus/econet/econet.h" +#include "sound/sn76496.h" /* Sound */ +#include "sound/tms5220.h" /* Speech */ +#include "video/saa5050.h" /* Teletext */ + +/* Devices */ #include "imagedev/flopdrv.h" #include "formats/basicdsk.h" #include "imagedev/cartslot.h" #include "imagedev/cassette.h" #include "formats/uef_cas.h" #include "formats/csw_cas.h" -#include "sound/sn76496.h" -#include "video/saa5050.h" #include "includes/bbc.h" /****************************************************************************** -A= BBC Model A - +A = BBC Model A +B = BBC Model B +B+ = BBC Model B+ +M = BBC Master + A B B+ M + &0000 + + + + | | | | | @@ -103,31 +140,26 @@ static ADDRESS_MAP_START( bbca_mem, AS_PROGRAM, 8, bbc_state ) ADDRESS_MAP_UNMAP_HIGH /* Hardware marked with a # is not present in a Model A */ AM_RANGE(0x0000, 0x3fff) AM_READ_BANK("bank1") AM_WRITE(bbc_memorya1_w) /* 0000-3fff Regular Ram */ - AM_RANGE(0x4000, 0x7fff) AM_READ_BANK("bank3") AM_WRITE(bbc_memorya1_w) /* 4000-7fff Repeat of the Regular Ram */ - + AM_RANGE(0x4000, 0x7fff) AM_READ_BANK("bank3") AM_WRITE(bbc_memoryb3_w) /* 4000-7fff Repeat of the Regular Ram */ AM_RANGE(0x8000, 0xbfff) AM_READ_BANK("bank4") /* 8000-bfff Paged ROM */ - AM_RANGE(0xc000, 0xfbff) AM_READ_BANK("bank7") /* c000-fbff OS ROM */ - AM_RANGE(0xfc00, 0xfdff) AM_NOP /* fc00-fdff FRED & JIM Pages */ - - /* fe00-feff Shiela Address Page */ - AM_RANGE(0xfe00, 0xfe07) AM_READWRITE(bbc_6845_r , bbc_6845_w) /* fe00-fe07 6845 CRTA Video controller */ + /* fe00-feff Shiela Address Page */ + AM_RANGE(0xfe00, 0xfe07) AM_READWRITE(bbc_6845_r, bbc_6845_w) /* fe00-fe07 6845 CRTC Video controller */ AM_RANGE(0xfe08, 0xfe08) AM_MIRROR(0x06) AM_DEVREADWRITE("acia6850", acia6850_device, status_read, control_write) AM_RANGE(0xfe09, 0xfe09) AM_MIRROR(0x06) AM_DEVREADWRITE("acia6850", acia6850_device, data_read, data_write) AM_RANGE(0xfe10, 0xfe17) AM_READWRITE(bbc_fe_r, bbc_SerialULA_w) /* fe10-fe17 Serial ULA Serial system chip */ AM_RANGE(0xfe18, 0xfe1f) AM_NOP /* fe18-fe1f INTOFF/STATID # ECONET Interrupt Off / ID No. */ AM_RANGE(0xfe20, 0xfe2f) AM_WRITE(bbc_videoULA_w) /* R: fe20-fe2f INTON # ECONET Interrupt On */ - /* W: fe20-fe2f Video ULA Video system chip */ + /* W: fe20-fe2f Video ULA Video system chip */ AM_RANGE(0xfe30, 0xfe3f) AM_READWRITE(bbc_fe_r, bbc_page_selecta_w) /* R: fe30-fe3f NC Not Connected */ - /* W: fe30-fe3f 84LS161 Paged ROM selector */ - AM_RANGE(0xfe40, 0xfe5f) AM_DEVREADWRITE("via6522_0", via6522_device, read, write) /* fe40-fe5f 6522 VIA SYSTEM VIA */ + /* W: fe30-fe3f 84LS161 Paged ROM selector */ + AM_RANGE(0xfe40, 0xfe5f) AM_DEVREADWRITE("via6522_0", via6522_device, read, write) /* fe40-fe5f 6522 VIA SYSTEM VIA */ AM_RANGE(0xfe60, 0xfe7f) AM_NOP /* fe60-fe7f 6522 VIA # USER VIA */ AM_RANGE(0xfe80, 0xfe9f) AM_NOP /* fe80-fe9f 8271/1770 FDC # Floppy disc controller */ AM_RANGE(0xfea0, 0xfebf) AM_READ(bbc_fe_r) /* fea0-febf 68B54 ADLC # ECONET controller */ AM_RANGE(0xfec0, 0xfedf) AM_NOP /* fec0-fedf uPD7002 # Analogue to digital converter */ AM_RANGE(0xfee0, 0xfeff) AM_READ(bbc_fe_r) /* fee0-feff Tube ULA # Tube system interface */ - AM_RANGE(0xff00, 0xffff) AM_ROM AM_REGION("user1", 0x13f00) /* ff00-ffff OS Rom (continued) */ ADDRESS_MAP_END @@ -137,31 +169,25 @@ static ADDRESS_MAP_START( bbcb_mem, AS_PROGRAM, 8, bbc_state ) AM_RANGE(0x0000, 0x3fff) AM_READ_BANK("bank1") AM_WRITE(bbc_memorya1_w) /* 0000-3fff Regular Ram */ AM_RANGE(0x4000, 0x7fff) AM_READ_BANK("bank3") AM_WRITE(bbc_memoryb3_w) /* 4000-7fff Repeat of the Regular Ram */ - - AM_RANGE(0x8000, 0xbfff) AM_READ_BANK("bank4") AM_WRITE(bbc_memoryb4_w) /* 8000-bfff Paged ROM */ - AM_RANGE(0xc000, 0xfbff) AM_READ_BANK("bank7") /* c000-fbff OS ROM */ - AM_RANGE(0xfc00, 0xfdff) AM_READWRITE(bbc_opus_read, bbc_opus_write) /* fc00-fdff OPUS Disc Controller */ - - /* fe00-feff Shiela Address Page */ + /* fe00-feff Shiela Address Page */ AM_RANGE(0xfe00, 0xfe07) AM_READWRITE(bbc_6845_r, bbc_6845_w) /* fe00-fe07 6845 CRTC Video controller */ AM_RANGE(0xfe08, 0xfe08) AM_MIRROR(0x06) AM_DEVREADWRITE("acia6850", acia6850_device, status_read, control_write) AM_RANGE(0xfe09, 0xfe09) AM_MIRROR(0x06) AM_DEVREADWRITE("acia6850", acia6850_device, data_read, data_write) AM_RANGE(0xfe10, 0xfe17) AM_READWRITE(bbc_fe_r, bbc_SerialULA_w) /* fe10-fe17 Serial ULA Serial system chip */ AM_RANGE(0xfe18, 0xfe1f) AM_NOP /* fe18-fe1f INTOFF/STATID ECONET Interrupt Off / ID No. */ AM_RANGE(0xfe20, 0xfe2f) AM_WRITE(bbc_videoULA_w) /* R: fe20-fe2f INTON ECONET Interrupt On */ - /* W: fe20-fe2f Video ULA Video system chip */ + /* W: fe20-fe2f Video ULA Video system chip */ AM_RANGE(0xfe30, 0xfe3f) AM_READWRITE(bbc_fe_r, bbc_page_selectb_w) /* R: fe30-fe3f NC Not Connected */ - /* W: fe30-fe3f 84LS161 Paged ROM selector */ - AM_RANGE(0xfe40, 0xfe5f) AM_DEVREADWRITE("via6522_0", via6522_device, read, write) /* fe40-fe5f 6522 VIA SYSTEM VIA */ - AM_RANGE(0xfe60, 0xfe7f) AM_DEVREADWRITE("via6522_1", via6522_device, read, write) /* fe60-fe7f 6522 VIA USER VIA */ + /* W: fe30-fe3f 84LS161 Paged ROM selector */ + AM_RANGE(0xfe40, 0xfe5f) AM_DEVREADWRITE("via6522_0", via6522_device, read, write) /* fe40-fe5f 6522 VIA SYSTEM VIA */ + AM_RANGE(0xfe60, 0xfe7f) AM_DEVREADWRITE("via6522_1", via6522_device, read, write) /* fe60-fe7f 6522 VIA USER VIA */ AM_RANGE(0xfe80, 0xfe9f) AM_READWRITE(bbc_disc_r, bbc_disc_w) /* fe80-fe9f 8271 FDC Floppy disc controller */ AM_RANGE(0xfea0, 0xfebf) AM_READ(bbc_fe_r) /* fea0-febf 68B54 ADLC ECONET controller */ - AM_RANGE(0xfec0, 0xfedf) AM_DEVREADWRITE_LEGACY("upd7002",uPD7002_r,uPD7002_w) /* fec0-fedf uPD7002 Analogue to digital converter */ + AM_RANGE(0xfec0, 0xfedf) AM_DEVREADWRITE_LEGACY("upd7002", uPD7002_r, uPD7002_w) /* fec0-fedf uPD7002 Analogue to digital converter */ AM_RANGE(0xfee0, 0xfeff) AM_READ(bbc_fe_r) /* fee0-feff Tube ULA Tube system interface */ - AM_RANGE(0xff00, 0xffff) AM_ROM AM_REGION("user1", 0x43f00) /* ff00-ffff OS Rom (continued) */ ADDRESS_MAP_END @@ -171,50 +197,40 @@ static ADDRESS_MAP_START( bbcbp_mem, AS_PROGRAM, 8, bbc_state ) AM_RANGE(0x0000, 0x2fff) AM_READ_BANK("bank1") AM_WRITE(bbc_memorybp1_w) /* 0000-2fff Regular Ram */ AM_RANGE(0x3000, 0x7fff) AM_READ_BANK("bank2") AM_WRITE(bbc_memorybp2_w) /* 3000-7fff Video/Shadow Ram */ - - AM_RANGE(0x8000, 0xafff) AM_READ_BANK("bank4") AM_WRITE(bbc_memorybp4_w) /* 8000-afff Paged ROM or 12K of RAM */ + AM_RANGE(0x8000, 0xafff) AM_READ_BANK("bank4") AM_WRITE(bbc_memorybp4_w) /* 8000-afff Paged ROM or 12K of SWRAM */ AM_RANGE(0xb000, 0xbfff) AM_READ_BANK("bank6") /* b000-bfff Rest of paged ROM area */ - AM_RANGE(0xc000, 0xfbff) AM_READ_BANK("bank7") /* c000-fbff OS ROM */ - AM_RANGE(0xfc00, 0xfdff) AM_NOP /* fc00-fdff FRED & JIM Pages */ - - /* fe00-feff Shiela Address Page */ + /* fe00-feff Shiela Address Page */ AM_RANGE(0xfe00, 0xfe07) AM_READWRITE(bbc_6845_r, bbc_6845_w) /* fe00-fe07 6845 CRTC Video controller */ AM_RANGE(0xfe08, 0xfe08) AM_MIRROR(0x06) AM_DEVREADWRITE("acia6850", acia6850_device, status_read, control_write) AM_RANGE(0xfe09, 0xfe09) AM_MIRROR(0x06) AM_DEVREADWRITE("acia6850", acia6850_device, data_read, data_write) AM_RANGE(0xfe10, 0xfe17) AM_READWRITE(bbc_fe_r, bbc_SerialULA_w) /* fe10-fe17 Serial ULA Serial system chip */ AM_RANGE(0xfe18, 0xfe1f) AM_NOP /* fe18-fe1f INTOFF/STATID ECONET Interrupt Off / ID No. */ AM_RANGE(0xfe20, 0xfe2f) AM_WRITE(bbc_videoULA_w) /* R: fe20-fe2f INTON ECONET Interrupt On */ - /* W: fe20-fe2f Video ULA Video system chip */ + /* W: fe20-fe2f Video ULA Video system chip */ AM_RANGE(0xfe30, 0xfe3f) AM_READWRITE(bbc_fe_r, bbc_page_selectbp_w) /* R: fe30-fe3f NC Not Connected */ - /* W: fe30-fe3f 84LS161 Paged ROM selector */ - AM_RANGE(0xfe40, 0xfe5f) AM_DEVREADWRITE("via6522_0", via6522_device, read, write) /* fe40-fe5f 6522 VIA SYSTEM VIA */ - AM_RANGE(0xfe60, 0xfe7f) AM_DEVREADWRITE("via6522_1", via6522_device, read, write) /* fe60-fe7f 6522 VIA USER VIA */ + /* W: fe30-fe3f 84LS161 Paged ROM selector */ + AM_RANGE(0xfe40, 0xfe5f) AM_DEVREADWRITE("via6522_0", via6522_device, read, write) /* fe40-fe5f 6522 VIA SYSTEM VIA */ + AM_RANGE(0xfe60, 0xfe7f) AM_DEVREADWRITE("via6522_1", via6522_device, read, write) /* fe60-fe7f 6522 VIA USER VIA */ AM_RANGE(0xfe80, 0xfe9f) AM_READWRITE(bbc_wd1770_read, bbc_wd1770_write) /* fe80-fe9f 1770 FDC Floppy disc controller */ AM_RANGE(0xfea0, 0xfebf) AM_READ(bbc_fe_r) /* fea0-febf 68B54 ADLC ECONET controller */ - AM_RANGE(0xfec0, 0xfedf) AM_DEVREADWRITE_LEGACY("upd7002", uPD7002_r, uPD7002_w) /* fec0-fedf uPD7002 Analogue to digital converter */ + AM_RANGE(0xfec0, 0xfedf) AM_DEVREADWRITE_LEGACY("upd7002", uPD7002_r, uPD7002_w) /* fec0-fedf uPD7002 Analogue to digital converter */ AM_RANGE(0xfee0, 0xfeff) AM_READ(bbc_fe_r) /* fee0-feff Tube ULA Tube system interface */ - AM_RANGE(0xff00, 0xffff) AM_ROM AM_REGION("user1", 0x43f00) /* ff00-ffff OS Rom (continued) */ ADDRESS_MAP_END - static ADDRESS_MAP_START( bbcbp128_mem, AS_PROGRAM, 8, bbc_state ) ADDRESS_MAP_UNMAP_HIGH AM_RANGE(0x0000, 0x2fff) AM_READ_BANK("bank1") AM_WRITE(bbc_memorybp1_w) /* 0000-2fff Regular Ram */ AM_RANGE(0x3000, 0x7fff) AM_READ_BANK("bank2") AM_WRITE(bbc_memorybp2_w) /* 3000-7fff Video/Shadow Ram */ - - AM_RANGE(0x8000, 0xafff) AM_READ_BANK("bank4") AM_WRITE(bbc_memorybp4_128_w) /* 8000-afff Paged ROM or 12K of RAM */ + AM_RANGE(0x8000, 0xafff) AM_READ_BANK("bank4") AM_WRITE(bbc_memorybp4_128_w) /* 8000-afff Paged ROM or 12K of SWRAM */ AM_RANGE(0xb000, 0xbfff) AM_READ_BANK("bank6") AM_WRITE(bbc_memorybp6_128_w) /* b000-bfff Rest of paged ROM area */ - AM_RANGE(0xc000, 0xfbff) AM_READ_BANK("bank7") /* c000-fbff OS ROM */ - AM_RANGE(0xfc00, 0xfdff) AM_NOP /* fc00-fdff FRED & JIM Pages */ - - /* fe00-feff Shiela Address Page */ + /* fe00-feff Shiela Address Page */ AM_RANGE(0xfe00, 0xfe07) AM_READWRITE(bbc_6845_r, bbc_6845_w) /* fe00-fe07 6845 CRTC Video controller */ AM_RANGE(0xfe08, 0xfe08) AM_MIRROR(0x06) AM_DEVREADWRITE("acia6850", acia6850_device, status_read, control_write) AM_RANGE(0xfe09, 0xfe09) AM_MIRROR(0x06) AM_DEVREADWRITE("acia6850", acia6850_device, data_read, data_write) @@ -222,21 +238,19 @@ static ADDRESS_MAP_START( bbcbp128_mem, AS_PROGRAM, 8, bbc_state ) AM_RANGE(0xfe10, 0xfe17) AM_NOP /* fe10-fe17 Serial ULA Serial system chip */ AM_RANGE(0xfe18, 0xfe1f) AM_NOP /* fe18-fe1f INTOFF/STATID ECONET Interrupt Off / ID No. */ AM_RANGE(0xfe20, 0xfe2f) AM_WRITE(bbc_videoULA_w) /* R: fe20-fe2f INTON ECONET Interrupt On */ - /* W: fe20-fe2f Video ULA Video system chip */ + /* W: fe20-fe2f Video ULA Video system chip */ AM_RANGE(0xfe30, 0xfe3f) AM_READWRITE(bbc_fe_r, bbc_page_selectbp_w) /* R: fe30-fe3f NC Not Connected */ - /* W: fe30-fe3f 84LS161 Paged ROM selector */ - AM_RANGE(0xfe40, 0xfe5f) AM_DEVREADWRITE("via6522_0", via6522_device, read, write) /* fe40-fe5f 6522 VIA SYSTEM VIA */ - AM_RANGE(0xfe60, 0xfe7f) AM_DEVREADWRITE("via6522_1", via6522_device, read, write) /* fe60-fe7f 6522 VIA USER VIA */ + /* W: fe30-fe3f 84LS161 Paged ROM selector */ + AM_RANGE(0xfe40, 0xfe5f) AM_DEVREADWRITE("via6522_0", via6522_device, read, write) /* fe40-fe5f 6522 VIA SYSTEM VIA */ + AM_RANGE(0xfe60, 0xfe7f) AM_DEVREADWRITE("via6522_1", via6522_device, read, write) /* fe60-fe7f 6522 VIA USER VIA */ AM_RANGE(0xfe80, 0xfe9f) AM_READWRITE(bbc_wd1770_read, bbc_wd1770_write) /* fe80-fe9f 1770 FDC Floppy disc controller */ AM_RANGE(0xfea0, 0xfebf) AM_READ(bbc_fe_r) /* fea0-febf 68B54 ADLC ECONET controller */ - AM_RANGE(0xfec0, 0xfedf) AM_DEVREADWRITE_LEGACY("upd7002", uPD7002_r, uPD7002_w) /* fec0-fedf uPD7002 Analogue to digital converter */ + AM_RANGE(0xfec0, 0xfedf) AM_DEVREADWRITE_LEGACY("upd7002", uPD7002_r, uPD7002_w) /* fec0-fedf uPD7002 Analogue to digital converter */ AM_RANGE(0xfee0, 0xfeff) AM_READ(bbc_fe_r) /* fee0-feff Tube ULA Tube system interface */ - AM_RANGE(0xff00, 0xffff) AM_ROM AM_REGION("user1", 0x43f00) /* ff00-ffff OS Rom (continued) */ ADDRESS_MAP_END - /****************************************************************************** &FC00-&FCFF FRED &FD00-&FDFF JIM @@ -262,25 +276,17 @@ ADDRESS_MAP_END static ADDRESS_MAP_START(bbcm_mem, AS_PROGRAM, 8, bbc_state ) - AM_RANGE(0x0000, 0x2fff) AM_READ_BANK("bank1") AM_WRITE(bbc_memorybm1_w) /* 0000-2fff Regular Ram */ - AM_RANGE(0x3000, 0x7fff) AM_READ_BANK("bank2") AM_WRITE(bbc_memorybm2_w) /* 3000-7fff Video/Shadow Ram */ - AM_RANGE(0x8000, 0x8fff) AM_READ_BANK("bank4") AM_WRITE(bbc_memorybm4_w) /* 8000-8fff Paged ROM/RAM or 4K of RAM ANDY */ AM_RANGE(0x9000, 0xbfff) AM_READ_BANK("bank5") AM_WRITE(bbc_memorybm5_w) /* 9000-bfff Rest of paged ROM/RAM area */ - AM_RANGE(0xc000, 0xdfff) AM_READ_BANK("bank7") AM_WRITE(bbc_memorybm7_w) /* c000-dfff OS ROM or 8K of RAM HAZEL */ AM_RANGE(0xe000, 0xfbff) AM_ROM AM_REGION("user1", 0x42000) /* e000-fbff OS ROM */ - - //AM_RANGE(0xfc00, 0xfeff) AM_READWRITE(bbcm_r, bbcm_w) AM_RANGE(0xfc00, 0xfeff) AM_READ_BANK("bank8") AM_WRITE(bbcm_w) /* this is now processed directly because it can be ROM or hardware */ - - AM_RANGE(0xff00, 0xffff) AM_ROM AM_REGION("user1", 0x43f00) /* ff00-ffff OS Rom (continued) */ + AM_RANGE(0xff00, 0xffff) AM_ROM AM_REGION("user1", 0x43f00) /* ff00-ffff OS ROM (continued) */ ADDRESS_MAP_END - static const rgb_t bbc_palette[8]= { MAKE_RGB(0x0ff,0x0ff,0x0ff), @@ -293,11 +299,17 @@ static const rgb_t bbc_palette[8]= MAKE_RGB(0x000,0x000,0x000) }; -PALETTE_INIT_MEMBER(bbc_state,bbc) +PALETTE_INIT_MEMBER(bbc_state, bbc) { palette_set_colors(machine(), 0, bbc_palette, ARRAY_LENGTH(bbc_palette)); } + +INPUT_CHANGED_MEMBER(bbc_state::trigger_reset) +{ + m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? CLEAR_LINE : ASSERT_LINE); +} + /* 2008-05 FP: Small note about natural keyboard support: currently, - "Copy" is mapped to 'F11' @@ -305,14 +317,14 @@ Small note about natural keyboard support: currently, /* Port Key description Emulated key Natural key Shift 1 Shift 2 (Ctrl) */ -static INPUT_PORTS_START(bbca) +static INPUT_PORTS_START(bbc_keyboard) PORT_START("COL0") /* KEYBOARD COLUMN 0 */ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_RSHIFT) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F0") PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10)) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F0") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("1 !") PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("CAPSLOCK") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SHIFTLOCK") PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(F12)) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("CAPSLOCK") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_TOGGLE + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SHIFTLOCK") PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT)) PORT_TOGGLE PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("TAB") PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t') PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("ESCAPE") PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) @@ -324,7 +336,7 @@ static INPUT_PORTS_START(bbca) PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) PORT_CHAR('A') PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("S") PORT_CODE(KEYCODE_S) PORT_CHAR('S') PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F1") PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) PORT_START("COL2") /* KEYBOARD COLUMN 2 */ PORT_DIPNAME(0x01, 0x01, "DIP 8 (Not Used)") @@ -336,55 +348,55 @@ static INPUT_PORTS_START(bbca) PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("X") PORT_CODE(KEYCODE_X) PORT_CHAR('X') PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) PORT_CHAR('C') PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F2") PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) PORT_START("COL3") /* KEYBOARD COLUMN 3 */ PORT_DIPNAME(0x01, 0x01, "DIP 7 (Not Used)") PORT_DIPSETTING( 0x00, DEF_STR( Off )) PORT_DIPSETTING( 0x01, DEF_STR( On )) - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("5") PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("5 %") PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("T") PORT_CODE(KEYCODE_T) PORT_CHAR('T') PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("R") PORT_CODE(KEYCODE_R) PORT_CHAR('R') PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) PORT_CHAR('F') PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G") PORT_CODE(KEYCODE_G) PORT_CHAR('G') PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("V") PORT_CODE(KEYCODE_V) PORT_CHAR('V') - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F3") PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4)) PORT_START("COL4") /* KEYBOARD COLUMN 4 */ PORT_DIPNAME(0x01, 0x01, "DIP 6 (Disc Speed 1)") PORT_DIPSETTING( 0x00, DEF_STR( Off )) PORT_DIPSETTING( 0x01, DEF_STR( On )) - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F4") PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4)) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F4") PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("7 \\") PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'') PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("6 &") PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&') PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("H") PORT_CODE(KEYCODE_H) PORT_CHAR('H') PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) PORT_CHAR('B') - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F5") PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F5") PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6)) PORT_START("COL5") /* KEYBOARD COLUMN 5 */ PORT_DIPNAME(0x01, 0x01, "DIP 5 (Disc Speed 0)") PORT_DIPSETTING( 0x00, DEF_STR( Off )) PORT_DIPSETTING( 0x01, DEF_STR( On )) - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("* (") PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(') + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("8 (") PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(') PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I) PORT_CHAR('I') PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("U") PORT_CODE(KEYCODE_U) PORT_CHAR('U') PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("J") PORT_CODE(KEYCODE_J) PORT_CHAR('J') PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("N") PORT_CODE(KEYCODE_N) PORT_CHAR('N') PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M) PORT_CHAR('M') - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F6") PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6)) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F6") PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7)) PORT_START("COL6") /* KEYBOARD COLUMN 6 */ PORT_DIPNAME(0x01, 0x01, "DIP 4 (Shift Break)") PORT_DIPSETTING( 0x00, DEF_STR( Off )) PORT_DIPSETTING( 0x01, DEF_STR( On )) - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F7") PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7)) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F7") PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8)) PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("9 )") PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')') PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("O") PORT_CODE(KEYCODE_O) PORT_CHAR('O') PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("K") PORT_CODE(KEYCODE_K) PORT_CHAR('K') PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("L") PORT_CODE(KEYCODE_L) PORT_CHAR('L') PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(", <") PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F8") PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8)) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F8") PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9)) PORT_START("COL7") /* KEYBOARD COLUMN 7 */ PORT_DIPNAME(0x01, 0x01, "DIP 3 (Mode bit 2)") @@ -396,7 +408,7 @@ static INPUT_PORTS_START(bbca) PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("@") PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('@') PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("; +") PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+') PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(". >") PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F9") PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9)) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F9") PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10)) PORT_START("COL8") /* KEYBOARD COLUMN 8 */ PORT_DIPNAME(0x01, 0x01, "DIP 2 (Mode bit 1)") @@ -418,10 +430,13 @@ static INPUT_PORTS_START(bbca) PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("DOWN") PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("UP") PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("ENTER") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("DELETE") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("COPY") PORT_CODE(KEYCODE_END) PORT_CHAR(UCHAR_MAMEKEY(F11)) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("DELETE") PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("COPY") PORT_CODE(KEYCODE_END) PORT_CHAR(UCHAR_MAMEKEY(END)) PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("RIGHT") PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) + PORT_START("BRK") /* BREAK */ + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("BREAK") PORT_CODE(KEYCODE_F12) PORT_CHAR(UCHAR_MAMEKEY(F12)) PORT_CHANGED_MEMBER(DEVICE_SELF, bbc_state, trigger_reset, 0) + /* Keyboard columns 10 -> 15 are reserved for BBC Master */ PORT_START("COL10") PORT_START("COL11") @@ -433,7 +448,10 @@ static INPUT_PORTS_START(bbca) PORT_START("IN0") PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) +INPUT_PORTS_END + +static INPUT_PORTS_START(bbc_joy) PORT_START("JOY0") PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_MINMAX(0x0,0xff ) PORT_PLAYER(1) @@ -445,16 +463,24 @@ static INPUT_PORTS_START(bbca) PORT_START("JOY3") PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_MINMAX(0x0,0xff ) PORT_PLAYER(2) +INPUT_PORTS_END + +static INPUT_PORTS_START(bbc_config) PORT_START("BBCCONFIG") - PORT_CONFNAME( 0x07, 0x00, "DFS SELECT" ) + +// PORT_CONFNAME( 0x01, 0x00, "Speech Upgrade" ) +// PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +// PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + + PORT_CONFNAME( 0x07, 0x00, "DFS Select" ) PORT_CONFSETTING( 0x00, "Acorn DFS 0.90 (read only)" ) PORT_CONFSETTING( 0x01, "Acorn DNFS 1.20 (read only)" ) PORT_CONFSETTING( 0x02, "Watford DFS 1.44 (read only)" ) PORT_CONFSETTING( 0x03, "Acorn DFS E00 (hack / read only)" ) PORT_CONFSETTING( 0x04, "Acorn DDFS" ) PORT_CONFSETTING( 0x05, "Watford DDFS (not working)" ) - PORT_CONFSETTING( 0x06, "Opus Challenger 512K (ram drive only)" ) + PORT_CONFSETTING( 0x06, "Opus Challenger 512K (RAM drive only)" ) PORT_CONFSETTING( 0x07, DEF_STR( None ) ) PORT_CONFNAME( 0x18, 0x00, "Sideways RAM Type" ) @@ -462,233 +488,23 @@ static INPUT_PORTS_START(bbca) PORT_CONFSETTING( 0x08, "Solidisk 128K (fe62)" ) PORT_CONFSETTING( 0x10, "Acorn 64K (fe30)" ) PORT_CONFSETTING( 0x18, "Acorn 128K (fe30)" ) - - PORT_CONFNAME( 0x20, 0x20, "Main Ram Size" ) - PORT_CONFSETTING( 0x00, "16K" ) - PORT_CONFSETTING( 0x20, "32K" ) +// PORT_CONFSETTING( 0x20, "ATPL Sidewise 16K" ) INPUT_PORTS_END +static INPUT_PORTS_START(bbca) + PORT_INCLUDE(bbc_keyboard) +INPUT_PORTS_END -/* the BBC came with 4 rom sockets on the mother board 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(0x04000,"maincpu",ROMREGION_ERASEFF) /* RAM */ - - ROM_REGION(0x14000,"user1",0) /* ROM */ - ROM_LOAD("os12.rom", 0x10000, 0x4000, CRC(3c14fc70) SHA1(0d9bcaf6a393c9ce2359ed700ddb53c232c2c45d)) - - /* rom page 0 00000 */ - /* rom page 1 04000 */ - /* rom page 2 08000 */ - ROM_LOAD("basic2.rom", 0x0c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281)) /* rom page 3 0c000 */ -ROM_END - - -/* 0000- 7fff ram */ -/* 8000- bfff not used, this area is mapped over with one of the roms at 10000 and above */ -/* c000- ffff OS rom and memory mapped hardware at fc00-feff */ -/* 10000-4ffff 16 paged rom banks mapped back into 8000-bfff by the page rom select */ - - -ROM_START(bbcb) - ROM_REGION(0x08000,"maincpu",ROMREGION_ERASEFF) /* RAM */ - - ROM_REGION(0x44000,"user1",0) /* ROM */ - - ROM_LOAD("os12.rom", 0x40000,0x4000, CRC(3c14fc70) SHA1(0d9bcaf6a393c9ce2359ed700ddb53c232c2c45d)) - - // usos12.rom is the USA version of the OS. acorn tried to release the BBC B in the USA calling it the - // "Acorn Proton", it failed to sell in the USA and was withdrawn from the market. - // the main difference is the screen resolution setting the display to work on American TV's - //ROM_LOAD("usos12.rom", 0x40000,0x4000, CRC(c8e946a9) ) - - - ROM_LOAD("basic2.rom", 0x00000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281)) /* rom page 15 3c000 */ - //ROM_LOAD("speech-1.0.rom", 0x08000, 0x2000, CRC(e63f7fb7) ) - //ROM_RELOAD( 0x0a000, 0x2000 ) - //ROM_LOAD("dfs144.rom", 0x04000, 0x4000, CRC(9fb8d13f) SHA1(387d2468c6e1360f5b531784ce95d5f71a50c2b5)) /* rom page 14 38000 */ - /* 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 page 12 30000 */ - /* rom page 13 34000 */ - - ROM_REGION(0x20000,"user2",0) /* DFS ROMS */ - - ROM_LOAD("dfs09.rom", 0x00000, 0x2000, CRC(3ce609cf) SHA1(5cc0f14b8f46855c70eaa653cca4ad079b458732)) - ROM_RELOAD( 0x02000, 0x2000 ) - - ROM_LOAD("dnfs.rom", 0x04000, 0x4000, CRC(8ccd2157) SHA1(7e3c536baeae84d6498a14e8405319e01ee78232)) - ROM_LOAD("dfs144.rom", 0x08000, 0x4000, CRC(9fb8d13f) SHA1(387d2468c6e1360f5b531784ce95d5f71a50c2b5)) - ROM_LOAD("zdfs-0.90.rom",0x0C000, 0x2000, CRC(ea579d4d) SHA1(59ad2a8994f4bddad6687891f1a2bc29f2fd32b8)) - ROM_LOAD("ddfs223.rom", 0x10000, 0x4000, CRC(7891f9b7) SHA1(0d7ed0b0b3852cb61970ada1993244f2896896aa)) - ROM_LOAD("ddfs-1.53.rom",0x14000, 0x4000, CRC(e1be4ee4) SHA1(6719dc958f2631e6dc8f045429797b289bfe649a)) - ROM_LOAD("ch103.rom", 0x18000, 0x4000, CRC(98367cf4) SHA1(eca3631aa420691f96b72bfdf2e9c2b613e1bf33)) - /*NONE*/ - - ROM_REGION(0x80000, "disks", ROMREGION_ERASEFF) /* Opus Ram Disc Space */ - - //ROM_REGION(0x2000, "torch", 0) - //ROM_LOAD("torchz80_094.bin", 0x0000, 0x2000, CRC(49989bd4) SHA1(62b57c858a3baa4ff943c31f77d331c414772a61)) - //ROM_LOAD("torchz80_102.bin", 0x0000, 0x2000, CRC(2eb40a21) SHA1(e6ee738e5f2f8556002b79d18caa8ef21f14e08d)) -ROM_END - -#ifdef UNUSED_DEFINITION -ROM_START(bbcbcsw) - ROM_REGION(0x08000,"maincpu",ROMREGION_ERASEFF) /* RAM */ - - ROM_REGION(0x44000,"user1",0) /* ROM */ - - ROM_LOAD("os12.rom", 0x40000,0x4000, CRC(3c14fc70) SHA1(0d9bcaf6a393c9ce2359ed700ddb53c232c2c45d)) - - // usos12.rom is the USA version of the OS. acorn tried to release the BBC B in the USA calling it the - // "Acorn Proton", it failed to sell in the USA and was withdrawn from the market. - // the main difference is the screen resolution setting the display to work on American TV's - //ROM_LOAD("usos12.rom", 0x40000,0x4000, CRC(c8e946a9) ) - - - ROM_LOAD("basic2.rom", 0x00000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281)) /* rom page 15 3c000 */ - //ROM_LOAD("speech-1.0.rom", 0x08000, 0x2000, CRC(e63f7fb7) ) - //ROM_RELOAD( 0x0a000, 0x2000 ) - //ROM_LOAD("dfs144.rom", 0x04000, 0x4000, CRC(9fb8d13f) SHA1(387d2468c6e1360f5b531784ce95d5f71a50c2b5)) /* rom page 14 38000 */ - /* 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 page 12 30000 */ - /* rom page 13 34000 */ - - ROM_REGION(0x20000,"user2",0) /* DFS ROMS */ - - //ROM_LOAD("dfs09.rom", 0x00000, 0x2000, CRC(3ce609cf) SHA1(5cc0f14b8f46855c70eaa653cca4ad079b458732)) - //ROM_RELOAD( 0x02000, 0x2000 ) - - //ROM_LOAD("dnfs.rom", 0x04000, 0x4000, CRC(8ccd2157) SHA1(7e3c536baeae84d6498a14e8405319e01ee78232)) - ROM_LOAD("dfs144.rom", 0x08000, 0x4000, CRC(9fb8d13f) SHA1(387d2468c6e1360f5b531784ce95d5f71a50c2b5)) - //ROM_LOAD("zdfs-0.90.rom",0x0C000, 0x2000, CRC(ea579d4d) SHA1(59ad2a8994f4bddad6687891f1a2bc29f2fd32b8)) - //ROM_LOAD("ddfs223.rom", 0x10000, 0x4000, CRC(7891f9b7) SHA1(0d7ed0b0b3852cb61970ada1993244f2896896aa)) - //ROM_LOAD("ddfs-1.53.rom",0x14000, 0x4000, CRC(e1be4ee4) SHA1(6719dc958f2631e6dc8f045429797b289bfe649a)) - //ROM_LOAD("ch103.rom", 0x18000, 0x4000, CRC(98367cf4) SHA1(eca3631aa420691f96b72bfdf2e9c2b613e1bf33)) - /*NONE*/ - - ROM_REGION(0x80000, "disks", ROMREGION_ERASEFF) /* Opus Ram Disc Space */ - -ROM_END -#endif - -ROM_START(bbcbp) - ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */ - - ROM_REGION(0x44000,"user1",0) /* ROM */ - ROM_LOAD("bpos2.rom", 0x3c000, 0x4000, CRC(9f356396) SHA1(ea7d3a7e3ee1ecfaa1483af994048057362b01f2)) /* basic rom */ - ROM_CONTINUE( 0x40000, 0x4000) /* OS */ - - /* 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 page 12 30000 */ - /* rom page 13 34000 */ - - /* ddfs 2.23 this is acorns 1770 disc controller Double density disc filing system */ - ROM_LOAD("ddfs223.rom", 0x38000, 0x4000, CRC(7891f9b7) SHA1(0d7ed0b0b3852cb61970ada1993244f2896896aa)) /* rom page 14 38000 */ - -ROM_END - - -ROM_START(bbcbp128) - ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */ - - ROM_REGION(0x44000,"user1",0) /* ROM */ - ROM_LOAD("bpos2.rom", 0x3c000, 0x4000, CRC(9f356396) SHA1(ea7d3a7e3ee1ecfaa1483af994048057362b01f2)) /* basic rom */ - ROM_CONTINUE( 0x40000, 0x4000) /* OS */ - - /* 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 page 12 30000 */ - /* rom page 13 34000 */ - - /* ddfs 2.23 this is acorns 1770 disc controller Double density disc filing system */ - ROM_LOAD("ddfs223.rom", 0x38000, 0x4000, CRC(7891f9b7) SHA1(0d7ed0b0b3852cb61970ada1993244f2896896aa)) /* rom page 14 38000 */ - -ROM_END - - -/* BBC Master Rom Load */ -ROM_START(bbcm) - ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */ - - ROM_REGION(0x44000,"user1",0) /* ROM */ - - ROM_SYSTEM_BIOS( 0, "mos350", "Enhanced MOS 3.50" ) - ROMX_LOAD("mos+3.50.rom",0x20000, 0x20000, CRC(141027b9) SHA1(85211b5bc7c7a269952d2b063b7ec0e1f0196803),ROM_BIOS(1)) - - ROM_SYSTEM_BIOS( 1, "mos320", "Original MOS 3.20" ) - ROMX_LOAD("mos3.20.rom",0x20000, 0x20000, CRC(0cfad2ce) SHA1(0275719aa7746dd3b627f95ccc4362b564063a5e),ROM_BIOS(2)) - - /* Move loaded roms into place */ - ROM_COPY("user1",0x20000,0x40000,0x4000) - ROM_FILL(0x20000,0x4000,0xFFFF) - - /* 00000 rom 0 Cartridge */ - /* 04000 rom 1 Cartridge */ - /* 08000 rom 2 Cartridge */ - /* 0c000 rom 3 Cartridge */ - /* 10000 rom 4 RAM */ - /* 14000 rom 5 RAM */ - /* 18000 rom 6 RAM */ - /* 1c000 rom 7 RAM */ - /* 20000 rom 8 SPARE SOCKET */ - /* 24000 rom 9 DFS */ - /* 28000 rom 10 Viewsheet */ - /* 2c000 rom 11 Edit */ - /* 30000 rom 12 Basic */ - /* 34000 rom 13 ADFS */ - /* 38000 rom 14 View */ - /* 3c000 rom 15 Terminal */ - - ROM_LOAD("anfs424.ic27", 0x20000, 0x4000, CRC(1b9f75fd) SHA1(875f71edd48f87c3a55371409d0cc2015d8b5853) ) // TODO where to load this? -ROM_END - - +static INPUT_PORTS_START(bbcb) + PORT_INCLUDE(bbc_config) + PORT_INCLUDE(bbc_keyboard) + PORT_INCLUDE(bbc_joy) +INPUT_PORTS_END +static INPUT_PORTS_START(bbcm) + PORT_INCLUDE(bbc_keyboard) + PORT_INCLUDE(bbc_joy) +INPUT_PORTS_END INTERRUPT_GEN_MEMBER(bbc_state::bbcb_vsync) @@ -750,12 +566,18 @@ static ACIA6850_INTERFACE( bbc_acia6850_interface ) }; static LEGACY_FLOPPY_OPTIONS_START(bbc) - LEGACY_FLOPPY_OPTION(bbc, "ssd,bbc,img", "BBC disk image", basicdsk_identify_default, basicdsk_construct_default, NULL, + LEGACY_FLOPPY_OPTION( ssd80, "bbc,img,ssd", "BBC SSD disk image", basicdsk_identify_default, basicdsk_construct_default, NULL, HEADS([1]) TRACKS([80]) SECTORS([10]) SECTOR_LENGTH([256]) FIRST_SECTOR_ID([0])) + LEGACY_FLOPPY_OPTION( dsd80, "dsd", "BBC DSD disk image", basicdsk_identify_default, basicdsk_construct_default, NULL, + HEADS([2]) + TRACKS([80]) + SECTORS([10]) + SECTOR_LENGTH([256]) + FIRST_SECTOR_ID([0])) LEGACY_FLOPPY_OPTIONS_END static const floppy_interface bbc_floppy_interface = @@ -765,19 +587,19 @@ static const floppy_interface bbc_floppy_interface = DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, - FLOPPY_STANDARD_5_25_DSHD, + FLOPPY_STANDARD_5_25_DSDD, LEGACY_FLOPPY_OPTIONS_NAME(bbc), - NULL, + "floppy_5_25", NULL }; - static SAA5050_INTERFACE( trom_intf ) { DEVCB_NULL, 40, 24, 40 // x, y, size }; + static const mc6854_interface adlc_intf = { DEVCB_NULL, @@ -806,7 +628,7 @@ WRITE_LINE_MEMBER(bbc_state::econet_clk_w) static ECONET_INTERFACE( econet_intf ) { - DEVCB_DRIVER_LINE_MEMBER(bbc_state,econet_clk_w), + DEVCB_DRIVER_LINE_MEMBER(bbc_state, econet_clk_w), DEVCB_NULL }; @@ -841,16 +663,23 @@ static MACHINE_CONFIG_FRAGMENT( bbc_cartslot ) MCFG_CARTSLOT_LOAD(bbc_state, bbcb_cart) MACHINE_CONFIG_END + static MACHINE_CONFIG_START( bbca, bbc_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6502, 2000000) /* 2.00 MHz */ - MCFG_CPU_PROGRAM_MAP( bbca_mem) - MCFG_CPU_VBLANK_INT_DRIVER("screen", bbc_state, bbcb_vsync) /* screen refresh interrupts */ - MCFG_CPU_PERIODIC_INT_DRIVER(bbc_state, bbcb_keyscan, 1000) /* scan keyboard */ + MCFG_CPU_PROGRAM_MAP(bbca_mem) + MCFG_CPU_VBLANK_INT_DRIVER("screen", bbc_state, bbcb_vsync) /* screen refresh interrupts */ + MCFG_CPU_PERIODIC_INT_DRIVER(bbc_state, bbcb_keyscan, 1000) /* scan keyboard */ MCFG_QUANTUM_TIME(attotime::from_hz(60)) - MCFG_MACHINE_START_OVERRIDE(bbc_state, bbca ) - MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbca ) + /* internal ram */ + MCFG_RAM_ADD(RAM_TAG) + MCFG_RAM_DEFAULT_SIZE("16K") + MCFG_RAM_EXTRA_OPTIONS("32K") + MCFG_RAM_DEFAULT_VALUE(0x00) + + MCFG_MACHINE_START_OVERRIDE(bbc_state, bbca) + MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbca) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -859,25 +688,23 @@ static MACHINE_CONFIG_START( bbca, bbc_state ) MCFG_SCREEN_UPDATE_DEVICE("mc6845", mc6845_device, screen_update) MCFG_PALETTE_LENGTH(16) - MCFG_PALETTE_INIT_OVERRIDE(bbc_state,bbc) - MCFG_SAA5050_ADD("saa505x", XTAL_12MHz/2, trom_intf) - - MCFG_MC6845_ADD("mc6845",MC6845,"screen",2000000, bbc_mc6845_intf) + MCFG_PALETTE_INIT_OVERRIDE(bbc_state, bbc) + MCFG_SAA5050_ADD("saa5050", XTAL_12MHz/2, trom_intf) - MCFG_VIDEO_START_OVERRIDE(bbc_state,bbca) + MCFG_MC6845_ADD("mc6845", MC6845, "screen", 2000000, bbc_mc6845_intf) + MCFG_VIDEO_START_OVERRIDE(bbc_state, bbca) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_ADD("sn76489", SN76489, 4000000) /* 4 MHz */ MCFG_SOUND_CONFIG(psg_intf) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) -// MCFG_SOUND_ADD("tms5220", TMS5220, tms5220_interface) /* cassette */ MCFG_CASSETTE_ADD( "cassette", bbc_cassette_interface ) - /* software list */ - MCFG_SOFTWARE_LIST_ADD("cass_ls_a","bbca_cass") + /* software lists */ + MCFG_SOFTWARE_LIST_ADD("cass_ls_a", "bbca_cass") /* acia */ MCFG_ACIA6850_ADD("acia6850", bbc_acia6850_interface) @@ -885,81 +712,158 @@ static MACHINE_CONFIG_START( bbca, bbc_state ) /* devices */ MCFG_VIA6522_ADD("via6522_0", 1000000, bbcb_system_via) - MACHINE_CONFIG_END + static MACHINE_CONFIG_DERIVED( bbcb, bbca ) + /* basic machine hardware */ MCFG_CPU_MODIFY( "maincpu" ) - MCFG_CPU_PROGRAM_MAP( bbcb_mem) + MCFG_CPU_PROGRAM_MAP(bbcb_mem) + + MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcb) + MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcb) + MCFG_VIDEO_START_OVERRIDE(bbc_state, bbcb) + + /* internal ram */ + MCFG_RAM_MODIFY(RAM_TAG) + MCFG_RAM_DEFAULT_SIZE("32K") + MCFG_RAM_DEFAULT_VALUE(0x00) + + /* speech hardware */ +// MCFG_SOUND_ADD("tms5220", TMS5220, 640000) +// MCFG_TMS52XX_SPEECHROM("vsm") + + /* devices */ + MCFG_VIA6522_ADD("via6522_1", 1000000, bbcb_user_via) + MCFG_UPD7002_ADD("upd7002", bbc_uPD7002) + + /* printer */ + MCFG_CENTRONICS_PRINTER_ADD("centronics", bbcb_centronics_config) + + /* fdc */ + MCFG_I8271_ADD("i8271", bbc_i8271_interface) + MCFG_WD1770_ADD("wd177x", bbc_wd17xx_interface ) + MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(bbc_floppy_interface) + + /* slot devices */ + MCFG_FRAGMENT_ADD(bbc_cartslot) + + /* software lists */ + MCFG_DEVICE_REMOVE("cass_ls_a") + MCFG_SOFTWARE_LIST_ADD("cass_ls_b", "bbcb_cass") + MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("cass_ls_a", "bbca_cass") +MACHINE_CONFIG_END + + +static MACHINE_CONFIG_DERIVED( bbcb_us, bbca ) + /* basic machine hardware */ + MCFG_CPU_MODIFY( "maincpu" ) + MCFG_CPU_PROGRAM_MAP(bbcb_mem) + MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcb ) MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcb ) MCFG_VIDEO_START_OVERRIDE(bbc_state, bbcb ) + /* internal ram */ + MCFG_RAM_MODIFY(RAM_TAG) + MCFG_RAM_DEFAULT_SIZE("32K") + MCFG_RAM_DEFAULT_VALUE(0x00) + + /* speech hardware */ +// MCFG_SOUND_ADD("tms5220", TMS5220, 640000) +// MCFG_TMS52XX_SPEECHROM("vsm") + + /* video hardware */ + MCFG_SCREEN_MODIFY("screen") + MCFG_SCREEN_REFRESH_RATE(60) + /* devices */ - MCFG_UPD7002_ADD("upd7002", bbc_uPD7002) MCFG_VIA6522_ADD("via6522_1", 1000000, bbcb_user_via) + MCFG_UPD7002_ADD("upd7002", bbc_uPD7002) + + /* printer */ MCFG_CENTRONICS_PRINTER_ADD("centronics", bbcb_centronics_config) + /* fdc */ MCFG_I8271_ADD("i8271", bbc_i8271_interface) MCFG_WD1770_ADD("wd177x", bbc_wd17xx_interface ) MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(bbc_floppy_interface) MCFG_FRAGMENT_ADD(bbc_cartslot) - /* software list */ + /* software lists */ MCFG_DEVICE_REMOVE("cass_ls_a") - MCFG_SOFTWARE_LIST_ADD("cass_ls_b","bbcb_cass") - MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("cass_ls_a","bbca_cass") + MCFG_SOFTWARE_LIST_ADD("cass_ls_b", "bbcb_cass") + MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("cass_ls_a", "bbca_cass") MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( bbcbp, bbcb ) - MCFG_CPU_MODIFY( "maincpu" ) - MCFG_CPU_PROGRAM_MAP( bbcbp_mem) - MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcbp ) - MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcbp ) - MCFG_VIDEO_START_OVERRIDE(bbc_state, bbcbp ) + /* basic machine hardware */ + MCFG_CPU_MODIFY( "maincpu" ) /* M6512 */ + MCFG_CPU_PROGRAM_MAP(bbcbp_mem) + + MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcbp) + MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcbp) + MCFG_VIDEO_START_OVERRIDE(bbc_state, bbcbp) + /* internal ram */ + MCFG_RAM_MODIFY(RAM_TAG) + MCFG_RAM_DEFAULT_SIZE("64K") + MCFG_RAM_DEFAULT_VALUE(0x00) + + /* fdc */ MCFG_DEVICE_REMOVE("i8271") MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( bbcbp128, bbcbp ) - MCFG_CPU_MODIFY( "maincpu" ) - MCFG_CPU_PROGRAM_MAP( bbcbp128_mem) - MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcbp ) - MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcbp ) - MCFG_VIDEO_START_OVERRIDE(bbc_state, bbcbp ) + /* basic machine hardware */ + MCFG_CPU_MODIFY( "maincpu" ) /* M6512 */ + MCFG_CPU_PROGRAM_MAP(bbcbp128_mem) + MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcbp) + MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcbp) + MCFG_VIDEO_START_OVERRIDE(bbc_state, bbcbp) + + /* internal ram */ + MCFG_RAM_MODIFY(RAM_TAG) + MCFG_RAM_DEFAULT_SIZE("128K") + MCFG_RAM_DEFAULT_VALUE(0x00) MACHINE_CONFIG_END -/* BBC MASTER */ +/* BBC Master Series */ + static MACHINE_CONFIG_START( bbcm, bbc_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M65SC02, 2000000) /* 2.00 MHz */ - MCFG_CPU_PROGRAM_MAP( bbcm_mem) - MCFG_CPU_VBLANK_INT_DRIVER("screen", bbc_state, bbcb_vsync) /* screen refresh interrupts */ - MCFG_CPU_PERIODIC_INT_DRIVER(bbc_state, bbcm_keyscan, 1000) /* scan keyboard */ + MCFG_CPU_PROGRAM_MAP(bbcm_mem) + MCFG_CPU_VBLANK_INT_DRIVER("screen", bbc_state, bbcb_vsync) /* screen refresh interrupts */ + MCFG_CPU_PERIODIC_INT_DRIVER(bbc_state, bbcm_keyscan, 1000) /* scan keyboard */ MCFG_QUANTUM_TIME(attotime::from_hz(60)) - MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcm ) - MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcm ) + /* internal ram */ + MCFG_RAM_ADD(RAM_TAG) + MCFG_RAM_DEFAULT_SIZE("128K") + MCFG_RAM_DEFAULT_VALUE(0x00) + + MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcm) + MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcm) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(50) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(128)) - MCFG_SCREEN_SIZE(800,300) - MCFG_SCREEN_VISIBLE_AREA(0,800-1,0,300-1) + MCFG_SCREEN_SIZE(800, 300) + MCFG_SCREEN_VISIBLE_AREA(0, 800-1, 0, 300-1) MCFG_PALETTE_LENGTH(16) - MCFG_PALETTE_INIT_OVERRIDE(bbc_state,bbc) + MCFG_PALETTE_INIT_OVERRIDE(bbc_state, bbc) MCFG_SCREEN_UPDATE_DEVICE("mc6845", mc6845_device, screen_update) - MCFG_SAA5050_ADD("saa505x", XTAL_12MHz/2, trom_intf) - - MCFG_MC6845_ADD("mc6845",MC6845,"screen",2000000, bbc_mc6845_intf) + MCFG_SAA5050_ADD("saa5050", XTAL_12MHz/2, trom_intf) - MCFG_VIDEO_START_OVERRIDE(bbc_state,bbcm) + MCFG_MC6845_ADD("mc6845", MC6845, "screen", 2000000, bbc_mc6845_intf) + MCFG_VIDEO_START_OVERRIDE(bbc_state, bbcm) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -967,7 +871,8 @@ static MACHINE_CONFIG_START( bbcm, bbc_state ) MCFG_SOUND_CONFIG(psg_intf) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) - MCFG_MC146818_ADD( "rtc", MC146818_STANDARD ) + /* rtc and cmos */ + MCFG_MC146818_ADD( "rtc", MC146818_IGNORE_CENTURY ) /* printer */ MCFG_CENTRONICS_PRINTER_ADD("centronics", bbcb_centronics_config) @@ -975,10 +880,18 @@ static MACHINE_CONFIG_START( bbcm, bbc_state ) /* cassette */ MCFG_CASSETTE_ADD( "cassette", bbc_cassette_interface ) - /* software list */ - MCFG_SOFTWARE_LIST_ADD("cass_ls_m","bbcm_cass") - MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("cass_ls_a","bbca_cass") - MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("cass_ls_b","bbcb_cass") + /* cartridges */ + MCFG_CARTSLOT_ADD("cart") + MCFG_CARTSLOT_EXTENSION_LIST("bin") + MCFG_CARTSLOT_NOT_MANDATORY + MCFG_CARTSLOT_LOAD(bbc_state, bbcm_cart) + MCFG_CARTSLOT_INTERFACE("bbcm_cart") + + /* software lists */ + MCFG_SOFTWARE_LIST_ADD("cass_ls_m", "bbcm_cass") + MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("cass_ls_a", "bbca_cass") + MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("cass_ls_b", "bbcb_cass") + MCFG_SOFTWARE_LIST_ADD("cart_ls_m", "bbcm_cart") /* acia */ MCFG_ACIA6850_ADD("acia6850", bbc_acia6850_interface) @@ -989,19 +902,625 @@ static MACHINE_CONFIG_START( bbcm, bbc_state ) MCFG_VIA6522_ADD("via6522_0", 1000000, bbcb_system_via) MCFG_VIA6522_ADD("via6522_1", 1000000, bbcb_user_via) + /* fdc */ MCFG_WD1770_ADD("wd177x", bbc_wd17xx_interface ) MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(bbc_floppy_interface) + /* rom slots */ MCFG_FRAGMENT_ADD(bbc_cartslot) + /* econet */ MCFG_MC6854_ADD("mc6854", adlc_intf) MCFG_ECONET_ADD(econet_intf) MCFG_ECONET_SLOT_ADD("econet254", 254, econet_devices, NULL) MACHINE_CONFIG_END -/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */ -COMP ( 1981, bbca, 0, 0, bbca, bbca, bbc_state, bbc, "Acorn","BBC Micro Model A" , 0) -COMP ( 1981, bbcb, bbca, 0, bbcb, bbca, bbc_state, bbc, "Acorn","BBC Micro Model B" , 0) -COMP ( 1985, bbcbp, bbca, 0, bbcbp, bbca, bbc_state, bbc, "Acorn","BBC Micro Model B+ 64K" , 0) -COMP ( 1985, bbcbp128, bbca, 0, bbcbp128, bbca, bbc_state, bbc, "Acorn","BBC Micro Model B+ 128k" , 0) -COMP ( 1986, bbcm, bbca, 0, bbcm, bbca, bbc_state, bbcm, "Acorn","BBC Master" , 0) + +static MACHINE_CONFIG_DERIVED( bbcmt, bbcm ) + + /* Add 65C102 co-processor */ + +MACHINE_CONFIG_END + + +static MACHINE_CONFIG_DERIVED( bbcmaiv, bbcm ) + + /* Add 65C102 co-processor */ + + /* Add Philips VP415 Laserdisc player */ + + /* Add Acorn Tracker Ball */ + +MACHINE_CONFIG_END + + +static MACHINE_CONFIG_DERIVED( bbcmet, bbcm ) + + /* Remove all devices not present in this model */ + + /* sound hardware */ +// MCFG_DEVICE_REMOVE("mono") +// MCFG_DEVICE_REMOVE("sn76489") + + /* printer */ +// MCFG_DEVICE_REMOVE("centronics") + + /* cassette */ + MCFG_DEVICE_REMOVE("cassette") + + /* software lists */ + MCFG_SOFTWARE_LIST_REMOVE("cass_ls_m") + MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a") + MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b") + + /* acia */ +// MCFG_DEVICE_REMOVE("acia6850") + MCFG_DEVICE_REMOVE(RS232_TAG) + + /* devices */ +// MCFG_DEVICE_REMOVE("upd7002") +// MCFG_DEVICE_REMOVE("via6522_1") + + /* fdc */ +// MCFG_DEVICE_REMOVE("wd177x") +MACHINE_CONFIG_END + + +static MACHINE_CONFIG_DERIVED( bbcm512, bbcm ) + + /* Add Intel 80186 co-processor */ + +MACHINE_CONFIG_END + + +static MACHINE_CONFIG_DERIVED( bbcmarm, bbcm ) + + /* Add ARM co-processor */ + +MACHINE_CONFIG_END + + +static MACHINE_CONFIG_DERIVED( bbcmc, bbcm ) + +// MCFG_DEVICE_REMOVE("rtc") + + /* fdc */ + MCFG_DEVICE_REMOVE("wd177x") + MCFG_WD1772_ADD("wd177x", bbc_wd17xx_interface ) + + /* software lists */ + MCFG_SOFTWARE_LIST_REMOVE("cart_ls_m") + MCFG_SOFTWARE_LIST_ADD("flop_ls_mc", "bbcmc_flop") +MACHINE_CONFIG_END + + +/* 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,"user1",0) /* ROM */ + /* rom page 0 00000 */ + /* rom page 1 04000 */ + /* rom page 2 08000 */ + /* rom page 3 0c000 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(1)) /* os */ + ROMX_LOAD("basic2.rom", 0x0c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(1)) /* rom page 3 0c000 */ + ROM_SYSTEM_BIOS( 1, "os12b1", "OS 1.20 / BASIC1" ) + ROMX_LOAD("os12.rom", 0x10000, 0x4000, CRC(3c14fc70) SHA1(0d9bcaf6a393c9ce2359ed700ddb53c232c2c45d), ROM_BIOS(2)) /* os */ + ROMX_LOAD("basic1.rom", 0x0c000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(2)) /* rom page 3 0c000 */ + ROM_SYSTEM_BIOS( 2, "os10b2", "OS 1.00 / BASIC2" ) + ROMX_LOAD("os10.rom", 0x10000, 0x4000, CRC(9679b8f8) SHA1(d35f6723132aabe3c4d00fc16fd9ecc6768df753), ROM_BIOS(3)) /* os */ + ROMX_LOAD("basic2.rom", 0x0c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(3)) /* rom page 3 0c000 */ + ROM_SYSTEM_BIOS( 3, "os10b1", "OS 1.00 / BASIC1" ) + ROMX_LOAD("os10.rom", 0x10000, 0x4000, CRC(9679b8f8) SHA1(d35f6723132aabe3c4d00fc16fd9ecc6768df753), ROM_BIOS(4)) /* os */ + ROMX_LOAD("basic1.rom", 0x0c000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(4)) /* rom page 3 0c000 */ + ROM_SYSTEM_BIOS( 4, "os01b2", "OS 0.10 / BASIC2" ) + ROMX_LOAD("os01.rom", 0x10000, 0x4000, CRC(45ee0980) SHA1(4b0ece6dc139d5d3f4fabd023716fb6f25149b80), ROM_BIOS(5)) /* os */ + ROMX_LOAD("basic2.rom", 0x00000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(5)) /* rom page 0 00000 */ + ROMX_LOAD("basic2.rom", 0x04000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(5)) /* rom page 1 04000 */ + ROMX_LOAD("basic2.rom", 0x08000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(5)) /* rom page 2 08000 */ + ROMX_LOAD("basic2.rom", 0x0c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(5)) /* rom page 3 0c000 */ + ROM_SYSTEM_BIOS( 5, "os01b1", "OS 0.10 / BASIC1" ) + ROMX_LOAD("os01.rom", 0x10000, 0x4000, CRC(45ee0980) SHA1(4b0ece6dc139d5d3f4fabd023716fb6f25149b80), ROM_BIOS(6)) /* os */ + ROMX_LOAD("basic1.rom", 0x00000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(6)) /* rom page 0 00000 */ + ROMX_LOAD("basic1.rom", 0x04000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(6)) /* rom page 1 04000 */ + ROMX_LOAD("basic1.rom", 0x08000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(6)) /* rom page 2 08000 */ + ROMX_LOAD("basic1.rom", 0x0c000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(6)) /* rom page 3 0c000 */ +ROM_END + + +/* 0000- 7fff ram */ +/* 8000- bfff not used, this area is mapped over with one of the roms at 10000 and above */ +/* c000- ffff OS rom and memory mapped hardware at fc00-feff */ +/* 10000-4ffff 16 paged rom banks mapped back into 8000-bfff by the page rom select */ + + +ROM_START(bbcb) + ROM_REGION(0x08000,"maincpu",ROMREGION_ERASEFF) /* RAM */ + + ROM_REGION(0x44000,"user1",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 page 12 30000 */ + /* rom page 13 34000 */ + /* rom page 14 38000 */ + /* rom page 15 3c000 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(1)) /* os */ + ROMX_LOAD("basic2.rom", 0x3c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(1)) /* rom page 15 3c000 */ + ROM_SYSTEM_BIOS( 1, "os12b1", "OS 1.20 / BASIC1" ) + ROMX_LOAD("os12.rom", 0x40000, 0x4000, CRC(3c14fc70) SHA1(0d9bcaf6a393c9ce2359ed700ddb53c232c2c45d), ROM_BIOS(2)) /* os */ + ROMX_LOAD("basic1.rom", 0x3c000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(2)) /* rom page 15 3c000 */ + ROM_SYSTEM_BIOS( 2, "os10b2", "OS 1.00 / BASIC2" ) + ROMX_LOAD("os10.rom", 0x40000, 0x4000, CRC(9679b8f8) SHA1(d35f6723132aabe3c4d00fc16fd9ecc6768df753), ROM_BIOS(3)) /* os */ + ROMX_LOAD("basic2.rom", 0x3c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(3)) /* rom page 15 3c000 */ + ROM_SYSTEM_BIOS( 3, "os10b1", "OS 1.00 / BASIC1" ) + ROMX_LOAD("os10.rom", 0x40000, 0x4000, CRC(9679b8f8) SHA1(d35f6723132aabe3c4d00fc16fd9ecc6768df753), ROM_BIOS(4)) /* os */ + ROMX_LOAD("basic1.rom", 0x3c000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(4)) /* rom page 15 3c000 */ + + ROM_REGION(0x20000,"user2",0) /* DFS ROMS */ + ROM_LOAD("dfs09.rom", 0x00000, 0x2000, CRC(3ce609cf) SHA1(5cc0f14b8f46855c70eaa653cca4ad079b458732)) + ROM_RELOAD( 0x02000, 0x2000 ) + ROM_LOAD("dnfs.rom", 0x04000, 0x4000, CRC(8ccd2157) SHA1(7e3c536baeae84d6498a14e8405319e01ee78232)) + ROM_LOAD("dfs144.rom", 0x08000, 0x4000, CRC(9fb8d13f) SHA1(387d2468c6e1360f5b531784ce95d5f71a50c2b5)) + ROM_LOAD("zdfs-0.90.rom",0x0C000, 0x2000, CRC(ea579d4d) SHA1(59ad2a8994f4bddad6687891f1a2bc29f2fd32b8)) + ROM_LOAD("ddfs223.rom", 0x10000, 0x4000, CRC(7891f9b7) SHA1(0d7ed0b0b3852cb61970ada1993244f2896896aa)) + ROM_LOAD("ddfs-1.53.rom",0x14000, 0x4000, CRC(e1be4ee4) SHA1(6719dc958f2631e6dc8f045429797b289bfe649a)) + ROM_LOAD("ch103.rom", 0x18000, 0x4000, CRC(98367cf4) SHA1(eca3631aa420691f96b72bfdf2e9c2b613e1bf33)) + /*NONE*/ + ROM_REGION(0x80000, "disks", ROMREGION_ERASEFF) /* Opus Ram Disc Space */ + + //ROM_REGION(0x2000, "torch", 0) + //ROM_LOAD("torchz80_094.bin", 0x0000, 0x2000, CRC(49989bd4) SHA1(62b57c858a3baa4ff943c31f77d331c414772a61)) + //ROM_LOAD("torchz80_102.bin", 0x0000, 0x2000, CRC(2eb40a21) SHA1(e6ee738e5f2f8556002b79d18caa8ef21f14e08d)) + + ROM_REGION(0x8000, "vsm", 0) /* system speech PHROM */ + ROM_LOAD("phroma.bin", 0x0000, 0x4000, CRC(98e1bf9e) SHA1(b369809275cb67dfd8a749265e91adb2d2558ae6)) +ROM_END + +ROM_START(bbcb_de) + ROM_REGION(0x08000,"maincpu",ROMREGION_ERASEFF) /* RAM */ + + ROM_REGION(0x44000,"user1",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 page 12 30000 */ + /* rom page 13 34000 */ + /* rom page 14 38000 */ + /* rom page 15 3c000 BASIC */ + ROM_DEFAULT_BIOS("os12") + ROM_SYSTEM_BIOS( 0, "os12", "OS 1.20 / BASIC2" ) + ROMX_LOAD("os_de.rom", 0x40000, 0x4000, CRC(b7262caf) SHA1(aadf90338ee9d1c85dfa73beba50e930c2a38f10), ROM_BIOS(1)) + ROMX_LOAD("basic2.rom", 0x3c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(1)) /* rom page 15 3c000 */ + + ROM_REGION(0x20000,"user2",0) /* DFS ROMS */ + ROM_LOAD("dfs09.rom", 0x00000, 0x2000, CRC(3ce609cf) SHA1(5cc0f14b8f46855c70eaa653cca4ad079b458732)) + ROM_RELOAD( 0x02000, 0x2000 ) + + ROM_LOAD("dnfs.rom", 0x04000, 0x4000, CRC(8ccd2157) SHA1(7e3c536baeae84d6498a14e8405319e01ee78232)) + ROM_LOAD("dfs144.rom", 0x08000, 0x4000, CRC(9fb8d13f) SHA1(387d2468c6e1360f5b531784ce95d5f71a50c2b5)) + ROM_LOAD("zdfs-0.90.rom",0x0C000, 0x2000, CRC(ea579d4d) SHA1(59ad2a8994f4bddad6687891f1a2bc29f2fd32b8)) + ROM_LOAD("ddfs223.rom", 0x10000, 0x4000, CRC(7891f9b7) SHA1(0d7ed0b0b3852cb61970ada1993244f2896896aa)) + ROM_LOAD("ddfs-1.53.rom",0x14000, 0x4000, CRC(e1be4ee4) SHA1(6719dc958f2631e6dc8f045429797b289bfe649a)) + ROM_LOAD("ch103.rom", 0x18000, 0x4000, CRC(98367cf4) SHA1(eca3631aa420691f96b72bfdf2e9c2b613e1bf33)) + /*NONE*/ + ROM_REGION(0x80000, "disks", ROMREGION_ERASEFF) /* Opus Ram Disc Space */ +ROM_END + +ROM_START(bbcb_us) + ROM_REGION(0x08000,"maincpu",ROMREGION_ERASEFF) /* RAM */ + + ROM_REGION(0x44000,"user1",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 page 12 30000 */ + /* rom page 13 34000 */ + /* rom page 14 38000 */ + /* rom page 15 3c000 BASIC */ + ROM_DEFAULT_BIOS("os10b3") + ROM_SYSTEM_BIOS( 0, "os10b3", "OS A1.0 / BASIC3" ) + ROMX_LOAD("os10_us.rom", 0x40000, 0x4000, CRC(c8e946a9) SHA1(83d91d089dca092d2c8b7c3650ff8143c9069b89), ROM_BIOS(1)) + ROMX_LOAD("basic3.rom", 0x3c000, 0x4000, CRC(161b9539) SHA1(b39014610a968789afd7695aa04d1277d874405c), ROM_BIOS(1)) /* rom page 15 3c000 */ + + ROM_REGION(0x20000,"user2",0) /* DFS ROMS */ + ROM_LOAD("dfs09.rom", 0x00000, 0x2000, CRC(3ce609cf) SHA1(5cc0f14b8f46855c70eaa653cca4ad079b458732)) + ROM_RELOAD( 0x02000, 0x2000 ) + + ROM_LOAD("dnfs.rom", 0x04000, 0x4000, CRC(8ccd2157) SHA1(7e3c536baeae84d6498a14e8405319e01ee78232)) + ROM_LOAD("dfs144.rom", 0x08000, 0x4000, CRC(9fb8d13f) SHA1(387d2468c6e1360f5b531784ce95d5f71a50c2b5)) + ROM_LOAD("zdfs-0.90.rom",0x0C000, 0x2000, CRC(ea579d4d) SHA1(59ad2a8994f4bddad6687891f1a2bc29f2fd32b8)) + ROM_LOAD("ddfs223.rom", 0x10000, 0x4000, CRC(7891f9b7) SHA1(0d7ed0b0b3852cb61970ada1993244f2896896aa)) + ROM_LOAD("ddfs-1.53.rom",0x14000, 0x4000, CRC(e1be4ee4) SHA1(6719dc958f2631e6dc8f045429797b289bfe649a)) + ROM_LOAD("ch103.rom", 0x18000, 0x4000, CRC(98367cf4) SHA1(eca3631aa420691f96b72bfdf2e9c2b613e1bf33)) + /*NONE*/ + ROM_REGION(0x80000, "disks", ROMREGION_ERASEFF) /* Opus Ram Disc Space */ + + ROM_REGION(0x8000, "vsm", 0) /* system speech PHROM */ + ROM_LOAD("phrom_us.bin", 0x0000, 0x4000, CRC(bf4b3b64) SHA1(66876702d1d95eecc034d20f25047f893a27cde5)) +ROM_END + +ROM_START(bbcbp) + ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */ + + ROM_REGION(0x44000,"user1",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(1)) /* rom page 15 3C000 BASIC */ + ROM_CONTINUE( 0x40000, 0x4000) /* OS */ + /* rom page 0 00000 */ + /* rom page 1 04000 */ + /* rom page 2 08000 32K IN PAGE 3 */ + /* rom page 3 0c000 SPARE SOCKET */ + /* rom page 4 10000 32K IN PAGE 5 */ + /* rom page 5 14000 SPARE SOCKET */ + /* rom page 6 18000 32K IN PAGE 7 */ + /* rom page 7 1c000 DDFS */ + /* rom page 8 20000 32K IN PAGE 9 */ + /* rom page 9 24000 SPARE SOCKET */ + /* rom page 10 28000 32K IN PAGE 11 */ + /* rom page 11 2c000 SPARE SOCKET */ + /* rom page 12 30000 */ + /* rom page 13 34000 */ + /* rom page 14 38000 32K IN PAGE 15 */ + /* rom page 15 3C000 BASIC */ + /* ddfs 2.23 this is acorns 1770 disc controller Double density disc filing system */ + ROM_LOAD("ddfs223.rom", 0x1c000, 0x4000, CRC(7891f9b7) SHA1(0d7ed0b0b3852cb61970ada1993244f2896896aa)) +ROM_END + + +ROM_START(bbcbp128) + ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */ + + ROM_REGION(0x44000,"user1",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(1)) /* rom page 15 3C000 BASIC */ + ROM_CONTINUE( 0x40000, 0x4000) /* OS */ + /* rom page 0 00000 */ + /* rom page 1 04000 */ + /* rom page 2 08000 32K IN PAGE 3 */ + /* rom page 3 0c000 SPARE SOCKET */ + /* rom page 4 10000 32K IN PAGE 5 */ + /* rom page 5 14000 SPARE SOCKET */ + /* rom page 6 18000 32K IN PAGE 7 */ + /* rom page 7 1c000 DDFS */ + /* rom page 8 20000 32K IN PAGE 9 */ + /* rom page 9 24000 SPARE SOCKET */ + /* rom page 10 28000 32K IN PAGE 11 */ + /* rom page 11 2c000 SPARE SOCKET */ + /* rom page 12 30000 */ + /* rom page 13 34000 */ + /* rom page 14 38000 32K IN PAGE 15 */ + /* rom page 15 3C000 BASIC */ + /* ddfs 2.23 this is acorns 1770 disc controller Double density disc filing system */ + ROM_LOAD("ddfs223.rom", 0x1c000, 0x4000, CRC(7891f9b7) SHA1(0d7ed0b0b3852cb61970ada1993244f2896896aa)) +ROM_END + + +ROM_START(bbcm) + ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */ + + ROM_REGION(0x44000,"user1",0) /* ROM */ + ROM_DEFAULT_BIOS("mos350") + ROM_SYSTEM_BIOS( 0, "mos350", "Enhanced MOS 3.50" ) + ROMX_LOAD("mos350.ic24", 0x20000, 0x20000, CRC(141027b9) SHA1(85211b5bc7c7a269952d2b063b7ec0e1f0196803), ROM_BIOS(1)) + ROM_SYSTEM_BIOS( 1, "mos320", "Original MOS 3.20" ) + ROMX_LOAD("mos320.ic24", 0x20000, 0x20000, CRC(0cfad2ce) SHA1(0275719aa7746dd3b627f95ccc4362b564063a5e), ROM_BIOS(2)) + ROM_COPY("user1", 0x20000, 0x40000, 0x4000) /* Move loaded roms into place */ + ROM_FILL(0x20000, 0x4000, 0xFFFF) + /* 00000 rom 0 Rear Cartridge bottom 16K */ + /* 04000 rom 1 Rear Cartridge top 16K */ + /* 08000 rom 2 Front Cartridge bottom 16K */ + /* 0c000 rom 3 Front Cartridge top 16K */ + /* 10000 rom 4 SWRAM */ + /* 14000 rom 5 SWRAM */ + /* 18000 rom 6 SWRAM */ + /* 1c000 rom 7 SWRAM */ + /* 20000 rom 8 SPARE SOCKET */ + /* 24000 rom 9 DFS + SRAM */ + /* 28000 rom 10 Viewsheet */ + /* 2c000 rom 11 Edit */ + /* 30000 rom 12 BASIC */ + /* 34000 rom 13 ADFS */ + /* 38000 rom 14 View + MOS code */ + /* 3c000 rom 15 Terminal + Tube host + CFS */ +// ROM_LOAD("anfs424.rom", 0x20000, 0x4000, CRC(1b9f75fd) SHA1(875f71edd48f87c3a55371409d0cc2015d8b5853) ) // TODO where to load this? + + ROM_REGION(0x40,"rtc",0) /* mc146818 */ + /* Factory defaulted CMOS RAM, sets default language ROM, etc. */ + ROMX_LOAD("mos350.cmos", 0x00, 0x40, CRC(e84c1854) SHA1(f3cb7f12b7432caba28d067f01af575779220aac), ROM_BIOS(1)) + ROMX_LOAD("mos320.cmos", 0x00, 0x40, CRC(c7f9e85a) SHA1(f24cc9db0525910689219f7204bf8b864033ee94), ROM_BIOS(2)) +ROM_END + + +ROM_START(bbcmt) + ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */ + + ROM_REGION(0x44000,"user1",0) /* ROM */ + ROM_DEFAULT_BIOS("mos350") + ROM_SYSTEM_BIOS( 0, "mos350", "Enhanced MOS 3.50" ) + ROMX_LOAD("mos350.ic24", 0x20000, 0x20000, CRC(141027b9) SHA1(85211b5bc7c7a269952d2b063b7ec0e1f0196803), ROM_BIOS(1)) + ROM_SYSTEM_BIOS( 1, "mos320", "Original MOS 3.20" ) + ROMX_LOAD("mos320.ic24", 0x20000, 0x20000, CRC(0cfad2ce) SHA1(0275719aa7746dd3b627f95ccc4362b564063a5e), ROM_BIOS(2)) + ROM_COPY("user1", 0x20000, 0x40000, 0x4000) /* Move loaded roms into place */ + ROM_FILL(0x20000, 0x4000, 0xFFFF) + /* 00000 rom 0 Rear Cartridge bottom 16K */ + /* 04000 rom 1 Rear Cartridge top 16K */ + /* 08000 rom 2 Front Cartridge bottom 16K */ + /* 0c000 rom 3 Front Cartridge top 16K */ + /* 10000 rom 4 SWRAM */ + /* 14000 rom 5 SWRAM */ + /* 18000 rom 6 SWRAM */ + /* 1c000 rom 7 SWRAM */ + /* 20000 rom 8 SPARE SOCKET */ + /* 24000 rom 9 DFS + SRAM */ + /* 28000 rom 10 Viewsheet */ + /* 2c000 rom 11 Edit */ + /* 30000 rom 12 BASIC */ + /* 34000 rom 13 ADFS */ + /* 38000 rom 14 View + MOS code */ + /* 3c000 rom 15 Terminal + Tube host + CFS */ +// ROM_LOAD("anfs424.ic27", 0x20000, 0x4000, CRC(1b9f75fd) SHA1(875f71edd48f87c3a55371409d0cc2015d8b5853) ) // TODO where to load this? + + ROM_REGION(0x40,"rtc",0) /* mc146818 */ + /* Factory defaulted CMOS RAM, sets default language ROM, etc. */ + ROMX_LOAD("mos350.cmos", 0x00, 0x40, CRC(e84c1854) SHA1(f3cb7f12b7432caba28d067f01af575779220aac), ROM_BIOS(1)) + ROMX_LOAD("mos320.cmos", 0x00, 0x40, CRC(c7f9e85a) SHA1(f24cc9db0525910689219f7204bf8b864033ee94), ROM_BIOS(2)) +ROM_END + + +ROM_START(bbcmaiv) + ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */ + + ROM_REGION(0x44000,"user1",0) /* ROM */ + ROM_DEFAULT_BIOS("mos320") + ROM_SYSTEM_BIOS( 0, "mos320", "MOS 3.20" ) + ROMX_LOAD("mos320.ic24", 0x20000, 0x20000, CRC(0cfad2ce) SHA1(0275719aa7746dd3b627f95ccc4362b564063a5e), ROM_BIOS(1)) + ROM_COPY("user1", 0x20000, 0x40000, 0x4000) /* Move loaded roms into place */ + ROM_FILL(0x20000, 0x4000, 0xFFFF) + /* 00000 rom 0 Rear Cartridge bottom 16K */ + /* 04000 rom 1 Rear Cartridge top 16K */ + /* 08000 rom 2 Front Cartridge bottom 16K */ + /* 0c000 rom 3 Front Cartridge top 16K */ + /* 10000 rom 4 SWRAM */ + /* 14000 rom 5 SWRAM */ + /* 18000 rom 6 SWRAM */ + /* 1c000 rom 7 SWRAM */ + /* 20000 rom 8 VFS */ + /* 24000 rom 9 DFS + SRAM */ + /* 28000 rom 10 Viewsheet */ + /* 2c000 rom 11 Edit */ + /* 30000 rom 12 BASIC */ + /* 34000 rom 13 ADFS */ + /* 38000 rom 14 View + MOS code */ + /* 3c000 rom 15 Terminal + Tube host + CFS */ + ROM_LOAD("vfs170.rom", 0x20000, 0x4000, CRC(b124a0bb) SHA1(ba31c757815cf470402d7829a70a0e1d3fb1355b) ) + + 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(1)) +ROM_END + + +ROM_START(bbcmet) + ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */ + + ROM_REGION(0x44000,"user1",0) /* ROM */ + ROM_DEFAULT_BIOS("mos400") + ROM_SYSTEM_BIOS( 0, "mos400", "Econet MOS 4.00" ) + ROMX_LOAD("mos400.ic24", 0x20000, 0x10000, BAD_DUMP CRC(81729034) SHA1(d4bc2c7f5e66b5298786138f395908e70c772971), ROM_BIOS(1)) /* Merged individual ROM bank dumps */ + ROM_COPY("user1", 0x24000, 0x34000, 0xC000) /* Mirror */ + ROM_COPY("user1", 0x20000, 0x40000, 0x4000) /* Move loaded roms into place */ + ROM_FILL(0x20000, 0x4000, 0xFFFF) + /* 00000 rom 0 Rear Cartridge bottom 16K */ + /* 04000 rom 1 Rear Cartridge top 16K */ + /* 08000 rom 2 Front Cartridge bottom 16K */ + /* 0c000 rom 3 Front Cartridge top 16K */ + /* 10000 rom 4 SWRAM */ + /* 14000 rom 5 SWRAM */ + /* 18000 rom 6 SWRAM */ + /* 1c000 rom 7 SWRAM */ + /* 20000 rom 8 NO SOCKET */ + /* 24000 rom 9 BASIC */ + /* 28000 rom 10 ANFS */ + /* 2c000 rom 11 MOS code */ + /* 30000 rom 12 UNUSED */ + /* 34000 rom 13 BASIC */ + /* 38000 rom 14 ANFS */ + /* 3c000 rom 15 MOS code */ + + 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(1)) +ROM_END + + +ROM_START(bbcm512) + ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */ + + ROM_REGION(0x44000,"user1",0) /* ROM */ + ROM_DEFAULT_BIOS("mos350") + ROM_SYSTEM_BIOS( 0, "mos350", "Enhanced MOS 3.50" ) + ROMX_LOAD("mos350.ic24", 0x20000, 0x20000, CRC(141027b9) SHA1(85211b5bc7c7a269952d2b063b7ec0e1f0196803), ROM_BIOS(1)) + ROM_SYSTEM_BIOS( 1, "mos320", "Original MOS 3.20" ) + ROMX_LOAD("mos320.ic24", 0x20000, 0x20000, CRC(0cfad2ce) SHA1(0275719aa7746dd3b627f95ccc4362b564063a5e), ROM_BIOS(2)) + ROM_COPY("user1", 0x20000, 0x40000, 0x4000) /* Move loaded roms into place */ + ROM_FILL(0x20000, 0x4000, 0xFFFF) + /* 00000 rom 0 Rear Cartridge bottom 16K */ + /* 04000 rom 1 Rear Cartridge top 16K */ + /* 08000 rom 2 Front Cartridge bottom 16K */ + /* 0c000 rom 3 Front Cartridge top 16K */ + /* 10000 rom 4 SWRAM */ + /* 14000 rom 5 SWRAM */ + /* 18000 rom 6 SWRAM */ + /* 1c000 rom 7 SWRAM */ + /* 20000 rom 8 SPARE SOCKET */ + /* 24000 rom 9 DFS + SRAM */ + /* 28000 rom 10 Viewsheet */ + /* 2c000 rom 11 Edit */ + /* 30000 rom 12 BASIC */ + /* 34000 rom 13 ADFS */ + /* 38000 rom 14 View + MOS code */ + /* 3c000 rom 15 Terminal + Tube host + CFS */ +// ROM_LOAD("anfs424.ic27", 0x20000, 0x4000, CRC(1b9f75fd) SHA1(875f71edd48f87c3a55371409d0cc2015d8b5853) ) + + ROM_REGION(0x40,"rtc",0) /* mc146818 */ + /* Factory defaulted CMOS RAM, sets default language ROM, etc. */ + ROMX_LOAD("mos350.cmos", 0x00, 0x40, CRC(e84c1854) SHA1(f3cb7f12b7432caba28d067f01af575779220aac), ROM_BIOS(1)) + ROMX_LOAD("mos320.cmos", 0x00, 0x40, CRC(c7f9e85a) SHA1(f24cc9db0525910689219f7204bf8b864033ee94), ROM_BIOS(2)) +ROM_END + + +ROM_START(bbcmarm) + ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */ + + ROM_REGION(0x44000,"user1",0) /* ROM */ + ROM_DEFAULT_BIOS("mos320") + ROM_SYSTEM_BIOS( 0, "mos320", "Original MOS 3.20" ) + ROMX_LOAD("mos320.ic24", 0x20000, 0x20000, CRC(0cfad2ce) SHA1(0275719aa7746dd3b627f95ccc4362b564063a5e), ROM_BIOS(1)) + ROM_COPY("user1", 0x20000, 0x40000, 0x4000) /* Move loaded roms into place */ + ROM_FILL(0x20000, 0x4000, 0xFFFF) + /* 00000 rom 0 Rear Cartridge bottom 16K */ + /* 04000 rom 1 Rear Cartridge top 16K */ + /* 08000 rom 2 Front Cartridge bottom 16K */ + /* 0c000 rom 3 Front Cartridge top 16K */ + /* 10000 rom 4 SWRAM */ + /* 14000 rom 5 SWRAM */ + /* 18000 rom 6 SWRAM */ + /* 1c000 rom 7 SWRAM */ + /* 20000 rom 8 SPARE SOCKET */ + /* 24000 rom 9 DFS + SRAM */ + /* 28000 rom 10 Viewsheet */ + /* 2c000 rom 11 Edit */ + /* 30000 rom 12 BASIC */ + /* 34000 rom 13 ADFS */ + /* 38000 rom 14 View + MOS code */ + /* 3c000 rom 15 Terminal + Tube host + CFS */ +// ROM_LOAD("anfs424.ic27", 0x20000, 0x4000, CRC(1b9f75fd) SHA1(875f71edd48f87c3a55371409d0cc2015d8b5853) ) + + ROM_REGION(0x40,"rtc",0) /* mc146818 */ + /* Factory defaulted CMOS RAM, sets default language ROM, etc. */ + ROMX_LOAD("mos320a.cmos", 0x00, 0x40, CRC(56117257) SHA1(ed98563bef18f9d2a0b2d941cd20823d760fb127), ROM_BIOS(1)) +ROM_END + + +ROM_START(bbcmc) + ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */ + + ROM_REGION(0x44000,"user1",0) /* ROM */ + 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(1)) /* Merged individual ROM bank dumps */ + ROM_SYSTEM_BIOS( 1, "mos500", "Original MOS 5.00" ) + ROMX_LOAD("mos500.ic49", 0x30000, 0x10000, BAD_DUMP CRC(f6170023) SHA1(140d002d2d9cd34b47197a2ba823505af2a84633), ROM_BIOS(2)) /* Merged individual ROM bank dumps */ + + ROM_COPY("user1", 0x30000, 0x40000, 0x4000) /* Move loaded roms into place */ + ROM_FILL(0x30000, 0x4000, 0xFFFF) + /* 00000 rom 0 EXTERNAL */ + /* 04000 rom 1 EXTERNAL */ + /* 08000 rom 2 SPARE SOCKET */ + /* 0c000 rom 3 SPARE SOCKET */ + /* 10000 rom 4 SWRAM */ + /* 14000 rom 5 SWRAM */ + /* 18000 rom 6 SWRAM */ + /* 1c000 rom 7 SWRAM */ + /* 20000 rom 8 SPARE SOCKET */ + /* 24000 rom 9 UNUSED */ + /* 28000 rom 10 UNUSED */ + /* 2c000 rom 11 UNUSED */ + /* 30000 rom 12 UNUSED */ + /* 34000 rom 13 ADFS */ + /* 38000 rom 14 BASIC */ + /* 3c000 rom 15 Utils */ + +// ROM_REGION(0x80,"mc146818",0) /* mc146818 */ + /* Factory defaulted CMOS RAM, sets default language ROM, etc. */ +// ROM_LOAD("mos500.cmos", 0x00, 0x80, CRC(d8458039) SHA1(72c056d493e74ceca41f48936012b012b496a226)) +ROM_END + + +ROM_START(bbcmc_ar) + ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */ + + ROM_REGION(0x44000,"user1",0) /* ROM */ + ROM_DEFAULT_BIOS("mos511i") + ROM_SYSTEM_BIOS( 0, "mos511i", "International MOS 5.11" ) + ROMX_LOAD("mos511.ic49", 0x30000, 0x10000, BAD_DUMP CRC(8708803c) SHA1(d2170c8b9b536f3ad84a4a603a7fe712500cc751), ROM_BIOS(1)) /* Merged individual ROM bank dumps */ + ROM_COPY("user1", 0x30000, 0x40000, 0x4000) /* Move loaded roms into place */ + ROM_FILL(0x30000, 0x4000, 0xFFFF) + /* 00000 rom 0 EXTERNAL */ + /* 04000 rom 1 EXTERNAL */ + /* 08000 rom 2 International */ + /* 0c000 rom 3 SPARE SOCKET */ + /* 10000 rom 4 SWRAM */ + /* 14000 rom 5 SWRAM */ + /* 18000 rom 6 SWRAM */ + /* 1c000 rom 7 SWRAM */ + /* 20000 rom 8 Arabian */ + /* 24000 rom 9 UNUSED */ + /* 28000 rom 10 UNUSED */ + /* 2c000 rom 11 UNUSED */ + /* 30000 rom 12 UNUSED */ + /* 34000 rom 13 ADFS */ + /* 38000 rom 14 BASIC */ + /* 3c000 rom 15 Utils */ + ROM_LOAD("international16.rom", 0x8000 , 0x4000, CRC(0ef527b1) SHA1(dc5149ccf588cd591a6ad47727474ef3313272ce) ) + ROM_LOAD("arabian-c22.rom" , 0x20000, 0x4000, CRC(4f3aadff) SHA1(2bbf61ba68264ce5845aab9c54e750b0efe219c8) ) + +// ROM_REGION(0x80,"mc146818",0) /* mc146818 */ + /* Factory defaulted CMOS RAM, sets default language ROM, etc. */ +// ROM_LOAD("mos500.cmos", 0x00, 0x80, CRC(d8458039) SHA1(72c056d493e74ceca41f48936012b012b496a226)) +ROM_END + + +/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME */ +COMP ( 1981, bbcb, 0, bbca, bbcb, bbcb, bbc_state, bbc, "Acorn", "BBC Micro Model B", 0) +COMP ( 1981, bbca, bbcb, 0, bbca, bbca, bbc_state, bbc, "Acorn", "BBC Micro Model A", 0) +COMP ( 1981, bbcb_us, bbcb, 0, bbcb_us, bbcb, bbc_state, bbc, "Acorn", "Acorn Proton (US)", 0) +COMP ( 1981, bbcb_de, bbcb, 0, bbcb, bbcb, bbc_state, bbc, "Acorn", "BBC Micro Model B (German)", 0) +COMP ( 1985, bbcbp, 0, bbcb, bbcbp, bbcb, bbc_state, bbc, "Acorn", "BBC Micro Model B+ 64K", 0) +COMP ( 1985, bbcbp128, bbcbp, 0, bbcbp128, bbcb, bbc_state, bbc, "Acorn", "BBC Micro Model B+ 128K", 0) +COMP ( 1986, bbcm, 0, bbcb, bbcm, bbcm, bbc_state, bbcm, "Acorn", "BBC Master 128", 0) +COMP ( 1986, bbcmt, bbcm, 0, bbcmt, bbcm, bbc_state, bbcm, "Acorn", "BBC Master Turbo", GAME_NOT_WORKING) +COMP ( 1986, bbcmaiv, bbcm, 0, bbcmaiv, bbcm, bbc_state, bbcm, "Acorn", "BBC Master AIV", GAME_NOT_WORKING) +COMP ( 1986, bbcmet, bbcm, 0, bbcmet, bbcm, bbc_state, bbcm, "Acorn", "BBC Master ET", 0) +COMP ( 1986, bbcm512, bbcm, 0, bbcm512, bbcm, bbc_state, bbcm, "Acorn", "BBC Master 512", GAME_NOT_WORKING) +COMP ( 1986, bbcmarm, bbcm, 0, bbcmarm, bbcm, bbc_state, bbcm, "Acorn", "ARM Evaluation System", GAME_NOT_WORKING) +COMP ( 1986, bbcmc, 0, bbcm, bbcmc, bbcm, bbc_state, bbcm, "Acorn", "BBC Master Compact", 0) +COMP ( 1986, bbcmc_ar, bbcmc, 0, bbcmc, bbcm, bbc_state, bbcm, "Acorn", "BBC Master Compact (Arabic)", 0) diff --git a/src/mess/includes/bbc.h b/src/mess/includes/bbc.h index cf3d28c49e4..3f4c455ed85 100644 --- a/src/mess/includes/bbc.h +++ b/src/mess/includes/bbc.h @@ -13,12 +13,14 @@ #include "machine/6522via.h" #include "machine/6850acia.h" +#include "machine/ram.h" #include "machine/i8271.h" #include "machine/wd17xx.h" #include "machine/upd7002.h" #include "video/mc6845.h" #include "video/saa5050.h" #include "sound/sn76496.h" +#include "sound/tms5220.h" #include "imagedev/cassette.h" #include "machine/serial.h" @@ -30,9 +32,11 @@ 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_mc6845(*this, "mc6845"), m_sn(*this, "sn76489"), - m_trom(*this, "saa505x"), + m_trom(*this, "saa5050"), + m_tms(*this, "tms5220"), m_cassette(*this, "cassette"), m_acia(*this, "acia6850"), m_rs232(*this, RS232_TAG), @@ -53,28 +57,30 @@ public: m_bank8(*this, "bank8") { } required_device<cpu_device> m_maincpu; + required_device<ram_device> m_ram; required_device<mc6845_device> m_mc6845; optional_device<sn76489_device> m_sn; required_device<saa5050_device> m_trom; - required_device<cassette_image_device> m_cassette; - required_device<acia6850_device> m_acia; - required_device<rs232_port_device> m_rs232; + optional_device<tms5220_device> m_tms; + optional_device<cassette_image_device> m_cassette; + optional_device<acia6850_device> m_acia; + optional_device<rs232_port_device> m_rs232; void check_interrupts(); - int m_RAMSize; // BBC Memory Size int m_DFSType; // this stores the DIP switch setting for the DFS type being used int m_SWRAMtype; // this stores the DIP switch setting for the SWRAM type being used + int m_Speech; // this stores the CONF setting for Speech enabled/disabled int m_Master; // if 0 then we are emulating a BBC B style machine - // if 1 then we are emulating a BBC Master style machine + // if 1 then we are emulating a BBC Master style machine - int m_ACCCON_IRR; // IRQ inputs + int m_ACCCON_IRR; // IRQ inputs int m_rombank; // This is the latch that holds the sideways ROM bank to read int m_userport; // This stores the sideways RAM latch type. - // Acorn and others use the bbc_rombank latch to select the write bank to be used.(type 0) - // Solidisc use the BBC's userport to select the write bank to be used (type 1) + // Acorn and others use the bbc_rombank latch to select the write bank to be used.(type 0) + // Solidisc use the BBC's userport to select the write bank to be used (type 1) int m_pagedRAM; // BBC B+ memory handling int m_vdusel; // BBC B+ memory handling @@ -183,11 +189,10 @@ public: int m_previous_i8271_int_state; // 8271 interupt status - - /************************************** WD1770 disc control ***************************************/ + int m_drive_control; int m_wd177x_irq_state; int m_wd177x_drq_state; @@ -197,9 +202,8 @@ public: /************************************** Opus Challenger Disc control ***************************************/ - int m_opusbank; - + int m_opusbank; /************************************** Video Code @@ -229,7 +233,6 @@ public: int m_BBC_VSync; - int m_Teletext_Latch; int m_VideoULA_CR; int m_VideoULA_CR_counter; @@ -242,7 +245,6 @@ public: int m_videoULA_flash_colour_select; - int m_pixels_per_byte; int m_emulation_pixels_per_real_pixel; int m_emulation_pixels_per_byte; @@ -302,16 +304,16 @@ public: DECLARE_MACHINE_START(bbca); DECLARE_MACHINE_RESET(bbca); DECLARE_VIDEO_START(bbca); - DECLARE_PALETTE_INIT(bbc); - DECLARE_MACHINE_START(bbcm); - DECLARE_MACHINE_RESET(bbcm); - DECLARE_VIDEO_START(bbcm); DECLARE_MACHINE_START(bbcb); DECLARE_MACHINE_RESET(bbcb); DECLARE_VIDEO_START(bbcb); DECLARE_MACHINE_START(bbcbp); DECLARE_MACHINE_RESET(bbcbp); DECLARE_VIDEO_START(bbcbp); + DECLARE_MACHINE_START(bbcm); + DECLARE_MACHINE_RESET(bbcm); + DECLARE_VIDEO_START(bbcm); + DECLARE_PALETTE_INIT(bbc); UINT32 screen_update_bbc(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); INTERRUPT_GEN_MEMBER(bbcb_vsync); INTERRUPT_GEN_MEMBER(bbcb_keyscan); @@ -340,8 +342,10 @@ public: DECLARE_READ_LINE_MEMBER(bbc_cts_r); DECLARE_WRITE_LINE_MEMBER(bbc_rts_w); DECLARE_WRITE_LINE_MEMBER(bbc_txd_w); + DECLARE_INPUT_CHANGED_MEMBER( trigger_reset ); DECLARE_DEVICE_IMAGE_LOAD_MEMBER( bbcb_cart ); + DECLARE_DEVICE_IMAGE_LOAD_MEMBER( bbcm_cart ); protected: required_memory_region m_region_maincpu; @@ -384,17 +388,16 @@ public: /*----------- defined in machine/bbc.c -----------*/ - extern const mc6845_interface bbc_mc6845_intf; - extern const via6522_interface bbcb_system_via; extern const via6522_interface bbcb_user_via; + +extern const i8271_interface bbc_i8271_interface; extern const wd17xx_interface bbc_wd17xx_interface; /* tape support */ -extern const i8271_interface bbc_i8271_interface; extern const uPD7002_interface bbc_uPD7002; #endif /* BBC_H_ */ diff --git a/src/mess/machine/bbc.c b/src/mess/machine/bbc.c index dcb5f39189f..e5a9c0a254b 100644 --- a/src/mess/machine/bbc.c +++ b/src/mess/machine/bbc.c @@ -5,6 +5,8 @@ Gordon Jefferyes mess_bbc@romvault.com + Nigel Barnes + ngbarnes@hotmail.com ******************************************************************************/ @@ -51,7 +53,7 @@ Model B memory handling functions *************************/ /* the model B address all 16 of the ROM sockets */ -/* I have set bank 1 as a special case to load different DFS roms selectable from MESS's DIP settings var:bbc_DFSTypes */ +/* I have set bank 1 as a special case to load different DFS roms selectable from MESS's CONF settings var:bbc_DFSTypes */ WRITE8_MEMBER(bbc_state::bbc_page_selectb_w) { m_rombank=data&0x0f; @@ -68,7 +70,7 @@ WRITE8_MEMBER(bbc_state::bbc_page_selectb_w) WRITE8_MEMBER(bbc_state::bbc_memoryb3_w) { - if (m_RAMSize) + if (m_ram->size() == 32*1024) { m_region_maincpu->base()[offset + 0x4000] = data; } @@ -76,7 +78,6 @@ WRITE8_MEMBER(bbc_state::bbc_memoryb3_w) { m_region_maincpu->base()[offset] = data; } - } /* I have setup 3 types of sideways ram: @@ -95,7 +96,8 @@ WRITE8_MEMBER(bbc_state::bbc_memoryb4_w) { // special DFS case for Acorn DFS E00 Hack that can write to the DFS RAM Bank; if (m_DFSType == 3) m_region_user2->base()[((m_DFSType) << 14) + offset] = data; - } else + } + else { switch (m_SWRAMtype) { @@ -181,23 +183,23 @@ WRITE8_MEMBER(bbc_state::bbc_memorybp1_w) DIRECT_UPDATE_MEMBER(bbc_state::bbcbp_direct_handler) { - UINT8 *ram = m_region_maincpu->base(); + UINT8 *RAM = m_region_maincpu->base(); if (m_vdusel == 0) { // not in shadow ram mode so just read normal ram - m_bank2->set_base(ram + 0x3000); + m_bank2->set_base(RAM + 0x3000); } else { if (vdudriverset()) { // if VDUDriver set then read from shadow ram - m_bank2->set_base(ram + 0xb000); + m_bank2->set_base(RAM + 0xb000); } else { // else read from normal ram - m_bank2->set_base(ram + 0x3000); + m_bank2->set_base(RAM + 0x3000); } } return address; @@ -206,23 +208,23 @@ DIRECT_UPDATE_MEMBER(bbc_state::bbcbp_direct_handler) WRITE8_MEMBER(bbc_state::bbc_memorybp2_w) { - UINT8 *ram = m_region_maincpu->base(); + UINT8 *RAM = m_region_maincpu->base(); if (m_vdusel==0) { // not in shadow ram mode so just write to normal ram - ram[offset + 0x3000] = data; + RAM[offset + 0x3000] = data; } else { if (vdudriverset()) { // if VDUDriver set then write to shadow ram - ram[offset + 0xb000] = data; + RAM[offset + 0xb000] = data; } else { // else write to normal ram - ram[offset + 0x3000] = data; + RAM[offset + 0x3000] = data; } } } @@ -292,7 +294,7 @@ ACCCON b7 IRR 1=Causes an IRQ to the processor b6 TST 1=Selects &FC00-&FEFF read from OS-ROM -b5 IFJ 1=Internal 1 MHz bus +b5 IFJ 1=Internal 1MHz bus 0=External 1MHz bus b4 ITU 1=Internal Tube 0=External Tube @@ -307,7 +309,7 @@ b0 D 1=Display LYNNE as screen ACCCON is a read/write register -HAZEL is the 8K of RAM used by the MOS,filling system, and other Roms at &C000-&DFFF +HAZEL is the 8K of RAM used by the MOS, filing system, and other Roms at &C000-&DFFF ANDY is the name of the 4K of RAM used by the MOS at &8000-&8FFF @@ -342,7 +344,6 @@ WRITE8_MEMBER(bbc_state::bbcm_ACCCON_write) tempIRR=m_ACCCON_IRR; - m_ACCCON_IRR=(data>>7)&1; m_ACCCON_TST=(data>>6)&1; m_ACCCON_IFJ=(data>>5)&1; @@ -390,7 +391,6 @@ WRITE8_MEMBER(bbc_state::bbcm_ACCCON_write) { space.install_read_handler(0xFC00,0xFEFF,read8_delegate(FUNC(bbc_state::bbcm_r),this)); } - } @@ -452,20 +452,20 @@ DIRECT_UPDATE_MEMBER(bbc_state::bbcm_direct_handler) WRITE8_MEMBER(bbc_state::bbc_memorybm2_w) { - UINT8 *ram = m_region_maincpu->base(); + UINT8 *RAM = m_region_maincpu->base(); if (m_ACCCON_X) { - ram[offset + 0xb000] = data; + RAM[offset + 0xb000] = data; } else { if (m_ACCCON_E && bbcm_vdudriverset()) { - ram[offset + 0xb000] = data; + RAM[offset + 0xb000] = data; } else { - ram[offset + 0x3000] = data; + RAM[offset + 0x3000] = data; } } } @@ -480,13 +480,13 @@ WRITE8_MEMBER(bbc_state::bbc_memorybm4_w) { if (m_pagedRAM) { - m_region_maincpu->base()[offset+0x8000]=data; + m_region_maincpu->base()[offset+0x8000] = data; } else { if (bbc_master_sideways_ram_banks[m_rombank]) { - m_region_user1->base()[offset+(m_rombank<<14)]=data; + m_region_user1->base()[offset+(m_rombank<<14)] = data; } } } @@ -496,7 +496,7 @@ WRITE8_MEMBER(bbc_state::bbc_memorybm5_w) { if (bbc_master_sideways_ram_banks[m_rombank]) { - m_region_user1->base()[offset+(m_rombank<<14)+0x1000]=data; + m_region_user1->base()[offset+(m_rombank<<14)+0x1000] = data; } } @@ -505,7 +505,7 @@ WRITE8_MEMBER(bbc_state::bbc_memorybm7_w) { if (m_ACCCON_Y) { - m_region_maincpu->base()[offset+0x9000]=data; + m_region_maincpu->base()[offset+0x9000] = data; } } @@ -513,29 +513,48 @@ WRITE8_MEMBER(bbc_state::bbc_memorybm7_w) /****************************************************************************** &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 -&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 1170 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 +&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 1170 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) { -long myo; + long myo; /* Now handled in bbcm_ACCCON_write PHS - 2008-10-11 */ // if ( m_ACCCON_TST ) @@ -553,14 +572,13 @@ long myo; return 0xff; }; - if ((offset>=0x200) && (offset<=0x2ff)) /* SHEILA */ { via6522_device *via_0 = machine().device<via6522_device>("via6522_0"); via6522_device *via_1 = machine().device<via6522_device>("via6522_1"); device_t *adlc = machine().device("mc6854"); - myo=offset-0x200; + myo = offset-0x200; if ((myo>=0x00) && (myo<=0x07)) return bbc_6845_r(space, myo-0x00); /* Video Controller */ if ((myo>=0x08) && (myo<=0x0f)) { @@ -569,16 +587,16 @@ long myo; else return m_acia->data_read(space,0); } - if ((myo>=0x10) && (myo<=0x17)) return 0xfe; /* Serial System Chip */ + if ((myo>=0x10) && (myo<=0x17)) return 0xfe; /* Serial System Chip */ if ((myo>=0x18) && (myo<=0x1f)) return uPD7002_r(machine().device("upd7002"), space, myo-0x18); /* A to D converter */ - if ((myo>=0x20) && (myo<=0x23)) return 0xfe; /* VideoULA */ - if ((myo>=0x24) && (myo<=0x27)) return bbcm_wd1770l_read(space, myo-0x24); /* 1770 */ - if ((myo>=0x28) && (myo<=0x2f)) return bbcm_wd1770_read(space, myo-0x28); /* disc control latch */ - if ((myo>=0x30) && (myo<=0x33)) return 0xfe; /* page select */ + if ((myo>=0x20) && (myo<=0x23)) return 0xfe; /* VideoULA */ + if ((myo>=0x24) && (myo<=0x27)) return bbcm_wd1770l_read(space, myo-0x24); /* 1770 */ + if ((myo>=0x28) && (myo<=0x2f)) return bbcm_wd1770_read(space, myo-0x28); /* disc control latch */ + if ((myo>=0x30) && (myo<=0x33)) return 0xfe; /* page select */ if ((myo>=0x34) && (myo<=0x37)) return bbcm_ACCCON_read(space, myo-0x34); /* ACCCON */ - if ((myo>=0x38) && (myo<=0x3f)) return 0xfe; /* NC ?? */ - if ((myo>=0x40) && (myo<=0x5f)) return via_0->read(space,myo-0x40); - if ((myo>=0x60) && (myo<=0x7f)) return via_1->read(space,myo-0x60); + if ((myo>=0x38) && (myo<=0x3f)) return 0xfe; /* NC ?? */ + if ((myo>=0x40) && (myo<=0x5f)) return via_0->read(space, myo-0x40); + if ((myo>=0x60) && (myo<=0x7f)) return via_1->read(space, myo-0x60); if ((myo>=0x80) && (myo<=0x9f)) return 0xfe; if ((myo>=0xa0) && (myo<=0xbf)) return mc6854_r(adlc, space, myo & 0x03); if ((myo>=0xc0) && (myo<=0xdf)) return 0xfe; @@ -590,7 +608,7 @@ long myo; WRITE8_MEMBER(bbc_state::bbcm_w) { -long myo; + long myo; if ((offset>=0x200) && (offset<=0x2ff)) /* SHEILA */ { @@ -599,7 +617,7 @@ long myo; device_t *adlc = machine().device("mc6854"); myo=offset-0x200; - if ((myo>=0x00) && (myo<=0x07)) bbc_6845_w(space, myo-0x00,data); /* Video Controller */ + if ((myo>=0x00) && (myo<=0x07)) bbc_6845_w(space, myo-0x00, data); /* Video Controller */ if ((myo>=0x08) && (myo<=0x0f)) { if ((myo - 0x08) & 1) @@ -607,22 +625,21 @@ long myo; else m_acia->data_write(space, 0, data); } - if ((myo>=0x10) && (myo<=0x17)) bbc_SerialULA_w(space, myo-0x10,data); /* Serial System Chip */ - if ((myo>=0x18) && (myo<=0x1f)) uPD7002_w(machine().device("upd7002"),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)) bbcm_wd1770l_write(space, myo-0x24,data); /* 1770 */ - if ((myo>=0x28) && (myo<=0x2f)) bbcm_wd1770_write(space, myo-0x28,data); /* disc control latch */ - if ((myo>=0x30) && (myo<=0x33)) page_selectbm_w(space, myo-0x30,data); /* page select */ - if ((myo>=0x34) && (myo<=0x37)) bbcm_ACCCON_write(space, myo-0x34,data); /* ACCCON */ - //if ((myo>=0x38) && (myo<=0x3f)) /* NC ?? */ - if ((myo>=0x40) && (myo<=0x5f)) via_0->write(space,myo-0x40, data); - if ((myo>=0x60) && (myo<=0x7f)) via_1->write(space,myo-0x60, data); + if ((myo>=0x10) && (myo<=0x17)) bbc_SerialULA_w(space, myo-0x10, data); /* Serial System Chip */ + if ((myo>=0x18) && (myo<=0x1f)) uPD7002_w(machine().device("upd7002"), 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)) bbcm_wd1770l_write(space, myo-0x24, data); /* 1770 */ + if ((myo>=0x28) && (myo<=0x2f)) bbcm_wd1770_write(space, myo-0x28, data); /* disc control latch */ + if ((myo>=0x30) && (myo<=0x33)) page_selectbm_w(space, myo-0x30, data); /* page select */ + if ((myo>=0x34) && (myo<=0x37)) bbcm_ACCCON_write(space, myo-0x34, data); /* ACCCON */ + //if ((myo>=0x38) && (myo<=0x3f)) /* NC ?? */ + if ((myo>=0x40) && (myo<=0x5f)) via_0->write(space, myo-0x40, data); + if ((myo>=0x60) && (myo<=0x7f)) via_1->write(space, myo-0x60, data); //if ((myo>=0x80) && (myo<=0x9f)) if ((myo>=0xa0) && (myo<=0xbf)) mc6854_w(adlc, space, myo & 0x03, data); //if ((myo>=0xc0) && (myo<=0xdf)) //if ((myo>=0xe0) && (myo<=0xff)) } - } @@ -647,25 +664,24 @@ PB0-PB2 outputs These 3 outputs form the address to an 8 bit addressable latch. (IC32 74LS259) - PB3 output ---------- This output holds the data to be written to the selected addressable latch bit. - PB4 and PB5 inputs +------------------ These are the inputs from the joystick FIRE buttons. They are normally at logic 1 with no button pressed and change to 0 when a button is pressed. - PB6 and PB7 inputs from the speech processor +-------------------------------------------- PB6 is the speech processor 'ready' output and PB7 is from the speech processor 'interrupt' output. - CA1 input +--------- This is the vertical sync input from the 6845. CA1 is set up to interrupt the 6502 every 20ms (50Hz) as a vertical sync from the video circuity is detected. The operation system changes @@ -674,24 +690,23 @@ they maintain synchronisation with the rest of the picture. ---------------------------------------------------------------- This is required for a lot of time function within the machine and must be triggered every 20ms. (Should check at some point -how this 20ms signal is made, and see if none standard shapped +how this 20ms signal is made, and see if none standard shaped screen modes change this time period.) - CB1 input +--------- The CB1 input is the end of conversion (EOC) signal from the 7002 analogue to digital converter. It can be used to interrupt the 6502 whenever a conversion is complete. - CA2 input +--------- This input comes from the keyboard circuit, and is used to generate an interrupt whenever a key is pressed. See the keyboard circuit section for more details. - - CB2 input +--------- This is the light pen strobe signal (LPSTB) from the light pen. If also connects to the 6845 video processor, CB2 can be programmed to interrupt the processor whenever @@ -718,16 +733,15 @@ B3 - Keyboard write enable B4,B5 - these two outputs define the number to be added to the start of screen address in hardware to control hardware scrolling:- Mode Size Start of screen Number to add B5 B4 -0,1,2 20K &3000 12K 1 1 -3 16K &4000 16K 0 0 -4,5 10K &5800 (or &1800) 22K 1 0 -6 8K &6000 (or &2000) 24K 0 1 +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) ******************************************************************************/ - INTERRUPT_GEN_MEMBER(bbc_state::bbcb_keyscan) { static const char *const colnames[] = { @@ -756,7 +770,6 @@ INTERRUPT_GEN_MEMBER(bbc_state::bbcb_keyscan) { via_0->write_ca2(0); } - } else { @@ -796,7 +809,6 @@ INTERRUPT_GEN_MEMBER(bbc_state::bbcm_keyscan) { via_0->write_ca2(0); } - } else { @@ -853,19 +865,18 @@ int bbc_state::bbc_keyboard(address_space &space, int data) void bbc_state::bbcb_IC32_initialise(bbc_state *state) { - m_b0_sound=0x01; // Sound is negative edge trigered - m_b1_speech_read=0x01; // ???? - m_b2_speech_write=0x01; // ???? - m_b3_keyboard=0x01; // Keyboard is negative edge trigered - m_b4_video0=0x01; - m_b5_video1=0x01; - m_b6_caps_lock_led=0x01; - m_b7_shift_lock_led=0x01; - + 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 } -/* This the BBC Masters Real Time Clock and NVRam IC */ +/* This the BBC Masters Real Time Clock and NVRAM IC */ void bbc_state::MC146818_set(address_space &space) { logerror ("146181 WR=%d DS=%d AS=%d CE=%d \n",m_MC146818_WR,m_MC146818_DS,m_MC146818_AS,m_MC146818_CE); @@ -907,7 +918,7 @@ WRITE8_MEMBER(bbc_state::bbcb_via_system_write_porta) if (m_b0_sound == 0) { //logerror("Doing an unsafe write to the sound chip %d \n",data); - m_sn->write(space, 0,m_via_system_porta); + m_sn->write(space, 0, m_via_system_porta); } if (m_b3_keyboard == 0) { @@ -924,7 +935,6 @@ WRITE8_MEMBER(bbc_state::bbcb_via_system_write_portb) bit = data & 0x07; value = (data >> 3) & 0x01; - //logerror("SYSTEM write portb %d %d %d\n",data,bit,value); if (value) @@ -942,7 +952,7 @@ WRITE8_MEMBER(bbc_state::bbcb_via_system_write_portb) { if (m_MC146818_WR == 0) { - /* BBC MASTER has NV RAM Here */ + /* BBC MASTER has NVRAM Here */ m_MC146818_WR = 1; MC146818_set(space); } @@ -961,7 +971,7 @@ WRITE8_MEMBER(bbc_state::bbcb_via_system_write_portb) { if (m_MC146818_DS == 0) { - /* BBC MASTER has NV RAM Here */ + /* BBC MASTER has NVRAM Here */ m_MC146818_DS = 1; MC146818_set(space); } @@ -1096,7 +1106,6 @@ WRITE8_MEMBER(bbc_state::bbcb_via_system_write_portb) } - if (m_Master) { //set the Address Select @@ -1146,9 +1155,9 @@ READ8_MEMBER(bbc_state::bbcb_via_system_read_portb) //TMSint=(!tms5220_int_r())&1; //TMSrdy=(!tms5220_readyq_r())&1; - //logerror("SYSTEM read portb %d\n",0xf | input_port(machine, "IN0")|(TMSint<<6)|(TMSrdy<<7)); + //logerror("SYSTEM read portb %d\n",0xf | input_port(machine, "IN0") | (TMSint<<6)|(TMSrdy<<7)); - return (0xf | ioport("IN0")->read()|(TMSint<<6)|(TMSrdy<<7)); + return (0xf | ioport("IN0")->read() | (TMSint<<6)|(TMSrdy<<7)); } @@ -1162,7 +1171,7 @@ READ8_MEMBER(bbc_state::bbcb_via_system_read_ca1) /* joystick EOC */ READ8_MEMBER(bbc_state::bbcb_via_system_read_cb1) { - return uPD7002_EOC_r(machine().device("upd7002"),space,0); + return uPD7002_EOC_r(machine().device("upd7002"), space, 0); } @@ -1289,7 +1298,6 @@ const uPD7002_interface bbc_uPD7002 = ****************************************/ - void bbc_state::MC6850_Receive_Clock(int new_clock) { m_rxd_cass = new_clock; @@ -1367,7 +1375,6 @@ TIMER_CALLBACK_MEMBER(bbc_state::bbc_tape_timer_cb) m_len2=0; m_len3=0; m_wav_len=0; - } m_len3=m_len2; @@ -1406,8 +1413,6 @@ TIMER_CALLBACK_MEMBER(bbc_state::bbc_tape_timer_cb) m_len2=0; m_len3=0; } - - } m_wav_len++; @@ -1623,8 +1628,6 @@ WRITE8_MEMBER(bbc_state::bbc_i8271_write) ***************************************/ - - /* B/ B+ drive control: @@ -1728,7 +1731,6 @@ WRITE8_MEMBER(bbc_state::bbc_wd177x_status_w) wd17xx_dden_w(fdc, BIT(data, 3)); m_1770_IntEnabled=(((data>>4) & 0x01)==0); - } @@ -1838,7 +1840,6 @@ WRITE8_MEMBER(bbc_state::bbc_opus_status_w) wd17xx_dden_w(fdc, BIT(data, 5)); m_1770_IntEnabled=(data>>4) & 0x01; - } READ8_MEMBER(bbc_state::bbc_opus_read) @@ -1861,7 +1862,6 @@ READ8_MEMBER(bbc_state::bbc_opus_read) case 0xfb: return wd17xx_data_r(fdc, space, 0); } - } else { @@ -2003,7 +2003,7 @@ READ8_MEMBER(bbc_state::bbc_disc_r) /* case 0 to 3 are all standard 8271 interfaces */ case 0: case 1: case 2: case 3: return bbc_i8271_read(space, offset); - /* case 4 is the acown 1770 interface */ + /* case 4 is the acorn 1770 interface */ case 4: return bbc_wd1770_read(space, offset); /* case 5 is the watford 1770 interface */ @@ -2027,7 +2027,7 @@ WRITE8_MEMBER(bbc_state::bbc_disc_w) case 0: case 1: case 2: case 3: bbc_i8271_write(space, offset,data); break; - /* case 4 is the acown 1770 interface */ + /* case 4 is the acorn 1770 interface */ case 4: bbc_wd1770_write(space, offset,data); break; @@ -2052,7 +2052,7 @@ WRITE8_MEMBER(bbc_state::bbc_disc_w) ***************************************/ DEVICE_IMAGE_LOAD_MEMBER( bbc_state, bbcb_cart ) { - UINT8 *mem = m_region_user1->base(); + UINT8 *RAM = m_region_user1->base(); int size, read_; int addr = 0; int index = 0; @@ -2084,14 +2084,14 @@ DEVICE_IMAGE_LOAD_MEMBER( bbc_state, bbcb_cart ) switch (size) { case 0x2000: - read_ = image.fread(mem + addr, size); + read_ = image.fread(RAM + addr, size); if (read_ != size) return 1; image.fseek(0, SEEK_SET); - read_ = image.fread(mem + addr + 0x2000, size); + read_ = image.fread(RAM + addr + 0x2000, size); break; case 0x4000: - read_ = image.fread(mem + addr, size); + read_ = image.fread(RAM + addr, size); break; default: read_ = 0; @@ -2105,6 +2105,62 @@ DEVICE_IMAGE_LOAD_MEMBER( bbc_state, bbcb_cart ) } +/************************************** + BBC Master Rom loading functions +***************************************/ +DEVICE_IMAGE_LOAD_MEMBER( bbc_state, bbcm_cart ) +{ + UINT8 *RAM = m_region_user1->base(); + int size, read_; + int addr = 0; + int index = 0; + + size = image.length(); + + if (strcmp(image.device().tag(),":cart1") == 0) + { + index = 0; + } + if (strcmp(image.device().tag(),":cart2") == 0) + { + index = 1; + } + if (strcmp(image.device().tag(),":cart3") == 0) + { + index = 2; + } + if (strcmp(image.device().tag(),":cart4") == 0) + { + index = 3; + } + addr = 0x8000 + (0x4000 * index); + + + logerror("loading rom %s at %.4x size:%.4x\n", image.filename(), addr, size); + + + switch (size) + { + case 0x2000: + read_ = image.fread(RAM + addr, size); + if (read_ != size) + return 1; + image.fseek(0, SEEK_SET); + read_ = image.fread(RAM + addr + 0x2000, size); + break; + case 0x4000: + read_ = image.fread(RAM + addr, size); + break; + default: + read_ = 0; + logerror("bad rom file size of %.4x\n", size); + break; + } + + if (read_ != size) + return 1; + return 0; +} /************************************** @@ -2137,10 +2193,21 @@ MACHINE_START_MEMBER(bbc_state,bbca) MACHINE_RESET_MEMBER(bbc_state,bbca) { - UINT8 *ram = m_region_maincpu->base(); - m_RAMSize = 1; - m_bank1->set_base(ram); - m_bank3->set_base(ram); + UINT8 *RAM = m_region_maincpu->base(); + + m_bank1->set_base(RAM); + if (m_ram->size() == 32*1024) + { + /* 32K Model A */ + m_bank3->set_base(RAM + 0x4000); + m_memorySize=32; + } + else + { + /* 16K just repeat the lower 16K*/ + m_bank3->set_base(RAM); + m_memorySize=16; + } m_bank4->set_base(m_region_user1->base()); /* bank 4 is the paged ROMs from 8000 to bfff */ m_bank7->set_base(m_region_user1->base()+0x10000); /* bank 7 points at the OS rom from c000 to ffff */ @@ -2151,58 +2218,25 @@ MACHINE_RESET_MEMBER(bbc_state,bbca) MACHINE_START_MEMBER(bbc_state,bbcb) { m_mc6850_clock = 0; - //removed from here because MACHINE_START can no longer read DIP swiches. - //put in machine_reset instead. - //m_DFSType= (ioport("BBCCONFIG")->read()>>0)&0x07; - //m_SWRAMtype=(ioport("BBCCONFIG")->read()>>3)&0x03; - //m_RAMSize= (ioport("BBCCONFIG")->read()>>5)&0x01; - - /*set up the required disc controller*/ - //switch (m_DFSType) { - //case 0: case 1: case 2: case 3: - m_previous_i8271_int_state=0; - // break; - //case 4: case 5: case 6: - m_previous_wd177x_int_state=1; - // break; - //} + m_previous_i8271_int_state=0; + m_previous_wd177x_int_state=1; } MACHINE_RESET_MEMBER(bbc_state,bbcb) { - UINT8 *ram = m_region_maincpu->base(); + UINT8 *RAM = m_region_maincpu->base(); m_DFSType= (ioport("BBCCONFIG")->read() >> 0) & 0x07; m_SWRAMtype = (ioport("BBCCONFIG")->read() >> 3) & 0x03; - m_RAMSize= (ioport("BBCCONFIG")->read() >> 5) & 0x01; + m_bank1->set_base(RAM); + m_bank3->set_base(RAM + 0x4000); + m_memorySize=32; - m_bank1->set_base(ram); - if (m_RAMSize) - { - /* 32K Model B */ - m_bank3->set_base(ram + 0x4000); - m_memorySize=32; - } - else - { - /* 16K just repeat the lower 16K*/ - m_bank3->set_base(ram); - m_memorySize=16; - } - - m_bank4->set_base(m_region_user1->base()); /* bank 4 is the paged ROMs from 8000 to bfff */ + m_bank4->set_base(m_region_user1->base()); /* bank 4 is the paged ROMs from 8000 to bfff */ m_bank7->set_base(m_region_user1->base() + 0x40000); /* bank 7 points at the OS rom from c000 to ffff */ bbcb_IC32_initialise(this); - m_opusbank = 0; - /*set up the required disc controller*/ - //switch (m_DFSType) { - //case 0: case 1: case 2: case 3: - // break; - //case 4: case 5: case 6: - // break; - //} } @@ -2213,32 +2247,30 @@ MACHINE_START_MEMBER(bbc_state,bbcbp) m_maincpu->space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate(FUNC(bbc_state::bbcbp_direct_handler), this)); /* bank 6 is the paged ROMs from b000 to bfff */ - m_bank6->configure_entries(0, 16, m_region_user1->base() + 0x3000, 1<<14); + m_bank6->configure_entries(0, 16, m_region_user1->base()+0x3000, 1<<14); } MACHINE_RESET_MEMBER(bbc_state,bbcbp) { m_bank1->set_base(m_region_maincpu->base()); m_bank2->set_base(m_region_maincpu->base()+0x03000); /* bank 2 screen/shadow ram from 3000 to 7fff */ - m_bank4->set_base(m_region_user1->base()); /* bank 4 is paged ROM or RAM from 8000 to afff */ + m_bank4->set_base(m_region_user1->base()); /* bank 4 is paged ROM or RAM from 8000 to afff */ m_bank6->set_entry(0); - m_bank7->set_base(m_region_user1->base()+0x40000); /* bank 7 points at the OS rom from c000 to ffff */ + m_bank7->set_base(m_region_user1->base()+0x40000); /* bank 7 points at the OS rom from c000 to ffff */ bbcb_IC32_initialise(this); - m_previous_wd177x_int_state=1; } - MACHINE_START_MEMBER(bbc_state,bbcm) { m_mc6850_clock = 0; m_maincpu->space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate(FUNC(bbc_state::bbcm_direct_handler), this)); - /* bank 5 is the paged ROMs from 9000 to bfff */ + /* bank 5 is the paged ROMs from 9000 to bfff */ m_bank5->configure_entries(0, 16, m_region_user1->base()+0x01000, 1<<14); /* Set ROM/IO bank to point to rom */ @@ -2250,12 +2282,11 @@ MACHINE_RESET_MEMBER(bbc_state,bbcm) { 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 */ - m_bank4->set_base(m_region_user1->base()); /* bank 4 is paged ROM or RAM from 8000 to 8fff */ + m_bank4->set_base(m_region_user1->base()); /* bank 4 is paged ROM or RAM from 8000 to 8fff */ m_bank5->set_entry(0); - m_bank7->set_base(m_region_user1->base() + 0x40000); /* bank 6 OS rom of RAM from c000 to dfff */ + m_bank7->set_base(m_region_user1->base() + 0x40000); /* bank 6 OS rom of RAM from c000 to dfff */ bbcb_IC32_initialise(this); - m_previous_wd177x_int_state=1; } diff --git a/src/mess/mess.lst b/src/mess/mess.lst index 4d7578de587..aff62252fd7 100644 --- a/src/mess/mess.lst +++ b/src/mess/mess.lst @@ -351,15 +351,24 @@ d110 // Acorn acrnsys1 // 1979 Acorn System 1 (Microcomputer Kit) atom // 1979 Acorn Atom -atomeb // 1979 Acorn Atom -atombb // 1979 Acorn Atom +atomeb // 1979 Acorn Atom +atombb // 1979 Acorn Atom bbca // 1981 BBC Micro Model A bbcb // 1981 BBC Micro Model B -bbcbp // 198? BBC Micro Model B+ 64K -bbcbp128 // 198? BBC Micro Model B+ 128K -bbcm // 198? BBC Master -bbcbc // 1985 BBC Bridge Companion +bbcb_de // 1981 BBC Micro Model B (German) +bbcb_us // 1981 BBC Micro Model B (US) electron // 1983 Acorn Electron +bbcbp // 1985 BBC Micro Model B+ 64K +bbcbp128 // 1985 BBC Micro Model B+ 128K +bbcm // 1986 BBC Master 128 +bbcmt // 1986 BBC Master Turbo +bbcmaiv // 1986 BBC Master AIV +bbcmet // 1986 BBC Master ET +bbcm512 // 1986 BBC Master 512 +bbcmarm // 1986 ARM Evaluation System +bbcmc // 1986 BBC Master Compact +bbcmc_ar // 1986 BBC Master Comapact (Arabic) +bbcbc // 1985 BBC Bridge Companion a310 // 1988 Acorn Archimedes 310 a3010 // 1988 Acorn Archimedes 3010 a3020 // 1988 Acorn Archimedes 3020 diff --git a/src/mess/video/bbc.c b/src/mess/video/bbc.c index 5aadc335da6..2c0f29ee522 100644 --- a/src/mess/video/bbc.c +++ b/src/mess/video/bbc.c @@ -96,7 +96,7 @@ static const int pixels_per_byte_set[8]={ 2,4,8,16,1,2,4,8 }; static const int width_of_cursor_set[8]={ 0,0,1,2,1,0,2,4 }; /* this is a quick lookup array that puts bits 0,2,4,6 into bits 0,1,2,3 - this is used by the pallette lookup in the video ULA */ + this is used by the palette lookup in the video ULA */ void bbc_state::set_pixel_lookup() { int i; |