bbc: clones, floppy formats, softlists, and cleanups.

- Added clone bbcb1770, bbcb now 8271 only.
- Added clone pro128s, Olivetti Prodest PC 128S.
- Added clones Acorn Business Computers and Cambridge Workstation.
- Added clone reutapm, Reuters APM board.
- Improved floppy formats, added dsd and double density formats for ADFS.
- Added speech PHROMs, not yet hooked up correctly.
- Added softlists bbcb_de_cass, bbcb_us_flop and bbcmc_flop.
- Added S11 links (dipswitch) to specify Econet ID.
- Address map cleanups.
This commit is contained in:
Nigel Barnes 2015-09-07 09:46:21 +01:00
parent 3227c85ed6
commit c0e72ea08d
12 changed files with 1370 additions and 1087 deletions

View File

@ -3324,13 +3324,13 @@
<publisher>Visions</publisher>
<info name="usage" value="Load with *RUN" />
<part name="cass1" interface="bbc_cass">
<dataarea name="cass" size="9339">
<rom name="demolator_infinitelives_run(visions).uef" size="9339" crc="8c638151" sha1="85aced0345aec14e7750c5daa290f1cb642b1961" offset="0" />
<dataarea name="cass" size="9319">
<rom name="demolator_run(visions).uef" size="9319" crc="5dc43e5b" sha1="d7d88ca1b651926104c0833e257e967e0d47dfc2" offset="0" />
</dataarea>
</part>
<part name="cass2" interface="bbc_cass">
<dataarea name="cass" size="9319">
<rom name="demolator_run(visions).uef" size="9319" crc="5dc43e5b" sha1="d7d88ca1b651926104c0833e257e967e0d47dfc2" offset="0" />
<dataarea name="cass" size="9339">
<rom name="demolator_infinitelives_run(visions).uef" size="9339" crc="8c638151" sha1="85aced0345aec14e7750c5daa290f1cb642b1961" offset="0" />
</dataarea>
</part>
</software>
@ -5710,17 +5710,6 @@
</part>
</software>
<software name="hopperg" cloneof="hopper">
<description>Hopper (Ger)</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="8112">
<rom name="hopper-german(1983)(acornsoft)(g23).uef" size="8112" crc="3972b897" sha1="b5f7897dcad92b758d0473ac840f2b41e8049ef4" offset="0" />
</dataarea>
</part>
</software>
<software name="hopper21" cloneof="hopper">
<description>Hopper v2.1</description>
<year>1983</year>
@ -7430,17 +7419,6 @@
</part>
</software>
<software name="meteorsg" cloneof="meteors">
<description>Meteors (Ger)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="6610">
<rom name="meteors-german(1982)(acornsoft)(g13).uef" size="6610" crc="0bb65e55" sha1="238ba733b0094942dd477ca49754249284741c40" offset="0" />
</dataarea>
</part>
</software>
<software name="meteorssc" cloneof="meteors">
<description>Meteors (The Acornsoft Hits Vol.2)</description>
<year>1987</year>
@ -7745,17 +7723,6 @@
</part>
</software>
<software name="monstersg" cloneof="monsters">
<description>Monsters (Ger)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7890">
<rom name="monsters-german(1982)(acornsoft)(g03).uef" size="7890" crc="37838358" sha1="c3c698a8174d0b67d6ee563bcecb9a42354ae3fc" offset="0" />
</dataarea>
</part>
</software>
<software name="monsterspias" cloneof="monsters">
<description>Monsters (Play It Again Sam 11)</description>
<year>1989</year>
@ -8889,17 +8856,6 @@
</part>
</software>
<software name="planetoidg" cloneof="plantoid">
<description>Planetoid (Ger)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="8515">
<rom name="planetoid-german(1982)(acornsoft)(g15).uef" size="8515" crc="bfaa94f8" sha1="fc8cb246c19cd717f7684074979ea5cb6d98e4fb" offset="0" />
</dataarea>
</part>
</software>
<software name="plantoidsc" cloneof="plantoid">
<description>Planetoid (The Acornsoft Hits Vol.1)</description>
<year>1987</year>
@ -9828,17 +9784,6 @@
</part>
</software>
<software name="rocketrag" cloneof="rocketra">
<description>Rocket Raid (Ger)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7747">
<rom name="rocketraid-german(1982)(acornsoft)(g05).uef" size="7747" crc="3a6ccbd0" sha1="afd7318589bb419606b25b575c7488369acf2c9b" offset="0" />
</dataarea>
</part>
</software>
<software name="rocketrasc" cloneof="rocketra">
<description>Rocket Raid (The Acornsoft Hits Vol.1)</description>
<year>1987</year>
@ -10721,17 +10666,6 @@
</part>
</software>
<software name="snapperg" cloneof="snapper">
<description>Snapper (Ger)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7174">
<rom name="snapper-german(1982)(acornsoft)(g04).uef" size="7174" crc="6ffbe578" sha1="0cc295dba1b771475ae8e71340b6ce4f885040e9" offset="0" />
</dataarea>
</part>
</software>
<software name="snapperpias" cloneof="snapper">
<description>Snapper (Play It Again Sam 7)</description>
<year>1988</year>
@ -11902,17 +11836,6 @@
</part>
</software>
<software name="superinvg" cloneof="superinv">
<description>Super Invaders (Ger)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7812">
<rom name="superinvaders-german(1982)(acornsoft)(g16).uef" size="7812" crc="382b3412" sha1="4361fba1203b07fb05f62273ac02db403a3f38ce" offset="0" />
</dataarea>
</part>
</software>
<software name="superinv">
<description>Super Invaders</description>
<year>1982</year>
@ -13494,17 +13417,6 @@
</part>
</software>
<software name="welcomeg" cloneof="welcome">
<description>Welcome (Ger)</description>
<year>1981</year>
<publisher>BBC Soft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="48009">
<rom name="welcome-german(1981)(bbc).uef" size="48009" crc="a2d78451" sha1="b0ff9fd8a51412dee878e763fe0aa54deef2c962" offset="0" />
</dataarea>
</part>
</software>
<software name="welcome">
<description>Welcome</description>
<year>1981</year>
@ -14099,17 +14011,6 @@
</part>
</software>
<software name="dskdiaryg" cloneof="dskdiary">
<description>Desk Diary (Ger)</description>
<year>198?</year>
<publisher>Acornsoft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="9739">
<rom name="deskdiary-german(198x)(acornsoft)(b01).uef" size="9739" crc="7ef32892" sha1="ec3910be9c7b5c1729586ba88a88173d08dcf34b" offset="0" />
</dataarea>
</part>
</software>
<software name="dskdiary">
<description>Desk Diary</description>
<year>198?</year>
@ -14753,17 +14654,6 @@
</part>
</software>
<software name="numberbag" cloneof="numberba">
<description>Number Balance (Ger)</description>
<year>198?</year>
<publisher>Acornsoft/ESM</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7727">
<rom name="numberbalance-german(acornsoftesm).uef" size="7727" crc="2461e7a8" sha1="7b2ce801a3213fcac582b173d65aaa347555a2c4" offset="0" />
</dataarea>
</part>
</software>
<software name="numberba">
<description>Number Balance</description>
<year>198?</year>
@ -14852,17 +14742,6 @@
</part>
</software>
<software name="sentseqg" cloneof="sentseq">
<description>Sentence Sequencing (Ger)</description>
<year>198?</year>
<publisher>Acornsoft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="10769">
<rom name="sentencesequencing-german(198x)(acornsoft)(e07).uef" size="10769" crc="28955bf7" sha1="f6422764589cbe5d1acefca2d90f288b95e84280" offset="0" />
</dataarea>
</part>
</software>
<software name="sentseq">
<description>Sentence Sequencing</description>
<year>198?</year>
@ -14967,17 +14846,6 @@
</part>
</software>
<software name="treeknowg" cloneof="treeknow">
<description>Tree Of Knowledge (Ger)</description>
<year>198?</year>
<publisher>Acornsoft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="11319">
<rom name="treeofknowledge-german(198x)(acornsoft)(e04).uef" size="11319" crc="c1b66b33" sha1="53bd97ccc48c5b00a1e57728800e786b6a9d30d9" offset="0" />
</dataarea>
</part>
</software>
<software name="treeknow">
<description>Tree Of Knowledge</description>
<year>198?</year>
@ -15077,17 +14945,6 @@
</part>
</software>
<software name="jars">
<description>Jars (Ger)</description>
<year>198?</year>
<publisher>Acornsoft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="8325">
<rom name="jars-german(198x)(acornsoft)(e15).uef" size="8325" crc="943ba245" sha1="5a911796040eb708926d5c9e1aecb3d0e7ea546b" offset="0" />
</dataarea>
</part>
</software>
<software name="spooky">
<description>Spooky Manor</description>
<year>198?</year>

166
hash/bbcb_de_cass.xml Normal file
View File

@ -0,0 +1,166 @@
<?xml version="1.0"?>
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
<!-- BBC Micro Model B (German) Tapes -->
<!-- I believe all the Cassette images here are original, so some require the manuals for additional copy protection -->
<!-- Loading Instructions:
If the system has a disk drive (which the BBC Model B does by default in MESS) you must type *TAPE, then use the relevant command to load the software, usually CHAIN"" or *RUN, though some earlier titles from Micro Power require *LOAD.
To start/stop the tape you must use the MESS menus, so you'll have to turn full keyboard mode off with Scroll Lock, then navigate the menus, turning Scroll Lock back on when you're finished.
-->
<softwarelist name="bbcb_de_cass" description="BBC Micro Model B (German) cassettes">
<!-- Games -->
<software name="hopperg">
<description>Hopper (Ger)</description>
<year>1983</year>
<publisher>Acornsoft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="8112">
<rom name="hopper-german(1983)(acornsoft)(g23).uef" size="8112" crc="3972b897" sha1="b5f7897dcad92b758d0473ac840f2b41e8049ef4" offset="0" />
</dataarea>
</part>
</software>
<software name="meteorsg">
<description>Meteors (Ger)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="6610">
<rom name="meteors-german(1982)(acornsoft)(g13).uef" size="6610" crc="0bb65e55" sha1="238ba733b0094942dd477ca49754249284741c40" offset="0" />
</dataarea>
</part>
</software>
<software name="monstersg">
<description>Monsters (Ger)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7890">
<rom name="monsters-german(1982)(acornsoft)(g03).uef" size="7890" crc="37838358" sha1="c3c698a8174d0b67d6ee563bcecb9a42354ae3fc" offset="0" />
</dataarea>
</part>
</software>
<software name="planetoidg">
<description>Planetoid (Ger)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="8515">
<rom name="planetoid-german(1982)(acornsoft)(g15).uef" size="8515" crc="bfaa94f8" sha1="fc8cb246c19cd717f7684074979ea5cb6d98e4fb" offset="0" />
</dataarea>
</part>
</software>
<software name="rocketrag">
<description>Rocket Raid (Ger)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7747">
<rom name="rocketraid-german(1982)(acornsoft)(g05).uef" size="7747" crc="3a6ccbd0" sha1="afd7318589bb419606b25b575c7488369acf2c9b" offset="0" />
</dataarea>
</part>
</software>
<software name="snapperg">
<description>Snapper (Ger)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7174">
<rom name="snapper-german(1982)(acornsoft)(g04).uef" size="7174" crc="6ffbe578" sha1="0cc295dba1b771475ae8e71340b6ce4f885040e9" offset="0" />
</dataarea>
</part>
</software>
<software name="superinvg">
<description>Super Invaders (Ger)</description>
<year>1982</year>
<publisher>Acornsoft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7812">
<rom name="superinvaders-german(1982)(acornsoft)(g16).uef" size="7812" crc="382b3412" sha1="4361fba1203b07fb05f62273ac02db403a3f38ce" offset="0" />
</dataarea>
</part>
</software>
<software name="welcomeg">
<description>Welcome (Ger)</description>
<year>1981</year>
<publisher>BBC Soft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="48009">
<rom name="welcome-german(1981)(bbc).uef" size="48009" crc="a2d78451" sha1="b0ff9fd8a51412dee878e763fe0aa54deef2c962" offset="0" />
</dataarea>
</part>
</software>
<!-- Business -->
<software name="dskdiaryg">
<description>Desk Diary (Ger)</description>
<year>198?</year>
<publisher>Acornsoft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="9739">
<rom name="deskdiary-german(198x)(acornsoft)(b01).uef" size="9739" crc="7ef32892" sha1="ec3910be9c7b5c1729586ba88a88173d08dcf34b" offset="0" />
</dataarea>
</part>
</software>
<!-- Educational -->
<software name="numberbag">
<description>Number Balance (Ger)</description>
<year>198?</year>
<publisher>Acornsoft/ESM</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="7727">
<rom name="numberbalance-german(acornsoftesm).uef" size="7727" crc="2461e7a8" sha1="7b2ce801a3213fcac582b173d65aaa347555a2c4" offset="0" />
</dataarea>
</part>
</software>
<software name="sentseqg">
<description>Sentence Sequencing (Ger)</description>
<year>198?</year>
<publisher>Acornsoft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="10769">
<rom name="sentencesequencing-german(198x)(acornsoft)(e07).uef" size="10769" crc="28955bf7" sha1="f6422764589cbe5d1acefca2d90f288b95e84280" offset="0" />
</dataarea>
</part>
</software>
<software name="treeknowg">
<description>Tree Of Knowledge (Ger)</description>
<year>198?</year>
<publisher>Acornsoft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="11319">
<rom name="treeofknowledge-german(198x)(acornsoft)(e04).uef" size="11319" crc="c1b66b33" sha1="53bd97ccc48c5b00a1e57728800e786b6a9d30d9" offset="0" />
</dataarea>
</part>
</software>
<software name="jars">
<description>Jars (Ger)</description>
<year>198?</year>
<publisher>Acornsoft</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="8325">
<rom name="jars-german(198x)(acornsoft)(e15).uef" size="8325" crc="943ba245" sha1="5a911796040eb708926d5c9e1aecb3d0e7ea546b" offset="0" />
</dataarea>
</part>
</software>
</softwarelist>

25
hash/bbcb_us_flop.xml Normal file
View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
<!-- BBC Micro Model B (US) Disks -->
<!-- Loading Instructions:
Hold down the SHIFT key and press and release the BREAK key.
-->
<softwarelist name="bbcb_us_flop" description="BBC Micro Model B (US) disks">
<software name="intrutil">
<description>Introductory and Utilities Disk</description>
<year>1983</year>
<publisher>Acorn</publisher>
<info name="protection" value="none" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="204800">
<rom name="introductory_utils(1983)(acorn).ssd" size="204800" crc="60612fc2" sha1="037f7c3499547d5ac5f88e812d7765ccaf27d6e1" offset="0" />
</dataarea>
</part>
</software>
</softwarelist>

25
hash/bbcmc_flop.xml Normal file
View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
<!-- BBC Master Compact Disks -->
<!-- Loading Instructions:
Hold down the SHIFT key and press and release the BREAK key.
-->
<softwarelist name="bbcmc_flop" description="BBC Master Compact disks">
<software name="welcome">
<description>BBC Master Compact Welcome Disc</description>
<year>1986</year>
<publisher>Acorn</publisher>
<info name="protection" value="none" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="655360">
<rom name="welcome_compact.adl" size="655360" crc="9d747205" sha1="04cfd6d1e08e8f695befb2948e27d63fd7842b8f" offset="0" />
</dataarea>
</part>
</software>
</softwarelist>

55
hash/pro128_cart.xml Normal file
View File

@ -0,0 +1,55 @@
<?xml version="1.0"?>
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
<softwarelist name="pro128_cart" description="Prodest PC 128 cartridges">
<software name="agenda">
<description>Agenda</description>
<year>1984</year>
<publisher>Answare</publisher>
<part name="cart" interface="mo5_cart">
<dataarea name="rom" size="16384">
<rom name="agenda (1984)(answare)(fr).m5" size="16384" crc="a4460761" sha1="5a77e3709b90f430c0b4c2c282916095e60ee22b" offset="0x0000" />
</dataarea>
</part>
</software>
<software name="clrpaint">
<description>Colorpaint</description>
<year>1985</year>
<publisher>Thomson</publisher>
<part name="cart" interface="mo5_cart">
<dataarea name="rom" size="32768">
<rom name="colorpaint (1985)(thomson)(it).m5" size="32768" crc="8fa1493b" sha1="d27c6db21adb29dc76df33d7a3855f8532d8cc57" offset="0x0000" />
</dataarea>
</part>
</software>
<software name="logo">
<description>LOGO v1.0</description>
<year>1984</year>
<publisher>Soli</publisher>
<part name="cart" interface="mo5_cart">
<dataarea name="rom" size="16384">
<rom name="logo v1.0 (1984)(soli)(fr).m5" size="16384" crc="6e997494" sha1="039f460f00973da9e192691061b37b493028bc35" offset="0x0000" />
</dataarea>
</part>
</software>
<software name="scriptor">
<description>Scriptor</description>
<year>1986</year>
<publisher>To Tek</publisher>
<part name="cart" interface="mo5_cart">
<dataarea name="rom" size="16384">
<rom name="scriptor (1986)(to tek)(it).m5" size="16384" crc="3bb553c9" sha1="b8b4b7618684e0c9331e8759fe13b07d22340fbe" offset="0x0000" />
</dataarea>
</part>
</software>
</softwarelist>

View File

@ -1,53 +1,229 @@
// license:GPL-2.0+
// copyright-holders:Dirk Best
// copyright-holders:Dirk Best, Nigel Barnes
/***************************************************************************
BBC Micro
Disk image format
Disk image formats
***************************************************************************/
#include "bbc_dsk.h"
#include "basicdsk.h"
bbc_format::bbc_format() : wd177x_format(formats)
LEGACY_FLOPPY_OPTIONS_START(bbc)
LEGACY_FLOPPY_OPTION( ssd40, "bbc,img,ssd", "BBC 40t SSD disk image", basicdsk_identify_default, basicdsk_construct_default, NULL,
HEADS([1])
TRACKS([40])
SECTORS([10])
SECTOR_LENGTH([256])
FIRST_SECTOR_ID([0]))
LEGACY_FLOPPY_OPTION( ssd80, "bbc,img,ssd", "BBC 80t 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( dsd40, "dsd", "BBC 40t DSD disk image", basicdsk_identify_default, basicdsk_construct_default, NULL,
HEADS([2])
TRACKS([40])
SECTORS([10])
SECTOR_LENGTH([256])
INTERLEAVE([0])
FIRST_SECTOR_ID([0]))
LEGACY_FLOPPY_OPTION( dsd80, "dsd", "BBC 80t DSD disk image", basicdsk_identify_default, basicdsk_construct_default, NULL,
HEADS([2])
TRACKS([80])
SECTORS([10])
SECTOR_LENGTH([256])
INTERLEAVE([0])
FIRST_SECTOR_ID([0]))
LEGACY_FLOPPY_OPTIONS_END
/********************************************************************/
bbc_ssd_525_format::bbc_ssd_525_format() : wd177x_format(formats)
{
}
const char *bbc_format::name() const
const char *bbc_ssd_525_format::name() const
{
return "bbc";
return "ssd";
}
const char *bbc_format::description() const
const char *bbc_ssd_525_format::description() const
{
return "BBC Micro disk image";
return "BBC Micro 5.25\" disk image";
}
const char *bbc_format::extensions() const
const char *bbc_ssd_525_format::extensions() const
{
return "bbc,img,ssd,dsd";
return "bbc,img,ssd";
}
const bbc_format::format bbc_format::formats[] =
int bbc_ssd_525_format::find_size(io_generic *io, UINT32 form_factor)
{
{ // 100k single sided single density
char cat[8];
io_generic_read(io, cat, 256, 8);
UINT64 sectors = ((cat[6] & 3) << 8) + cat[7]; // sector count from catalogue
UINT64 size = io_generic_size(io);
for(int i=0; formats[i].form_factor; i++) {
const format &f = formats[i];
if(form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor)
continue;
if((size <= (UINT64)compute_track_size(f) * f.track_count * f.head_count) && (sectors == f.track_count * f.sector_count))
return i;
}
return -1;
}
const bbc_ssd_525_format::format bbc_ssd_525_format::formats[] =
{
{ // 100k 40 track single sided single density
floppy_image::FF_525, floppy_image::SSSD, floppy_image::FM,
4000, 10, 40, 1, 256, {}, 0, {}, 16, 11, 19
4000, 10, 40, 1, 256, {}, 0, {}, 40, 10, 10
},
{ // 200k double sided single density
floppy_image::FF_525, floppy_image::DSSD, floppy_image::FM,
4000, 10, 40, 2, 256, {}, 0, {}, 16, 11, 19
},
{ // 200k single sided double density
{ // 200k 80 track single sided single density
floppy_image::FF_525, floppy_image::SSQD, floppy_image::FM,
4000, 10, 80, 1, 256, {}, 0, {}, 16, 11, 19
4000, 10, 80, 1, 256, {}, 0, {}, 40, 10, 10
},
{ // 400k double sided double density
{ // 200k 40 track double sided single density
floppy_image::FF_525, floppy_image::DSSD, floppy_image::FM,
4000, 10, 40, 2, 256, {}, 0, {}, 40, 10, 10
},
{ // 400k 80 track double sided single density
floppy_image::FF_525, floppy_image::DSQD, floppy_image::FM,
4000, 10, 80, 2, 256, {}, 0, {}, 16, 11, 19
4000, 10, 80, 2, 256, {}, 0, {}, 40, 10, 10
},
{}
};
const floppy_format_type FLOPPY_BBC_FORMAT = &floppy_image_format_creator<bbc_format>;
bbc_dsd_525_format::bbc_dsd_525_format() : wd177x_format(formats)
{
}
const char *bbc_dsd_525_format::name() const
{
return "dsd";
}
const char *bbc_dsd_525_format::description() const
{
return "BBC Micro 5.25\" disk image";
}
const char *bbc_dsd_525_format::extensions() const
{
return "dsd";
}
int bbc_dsd_525_format::find_size(io_generic *io, UINT32 form_factor)
{
char cat[8];
io_generic_read(io, cat, 256, 8);
UINT64 sectors = ((cat[6] & 3) << 8) + cat[7]; // sector count from catalogue
UINT64 size = io_generic_size(io);
for(int i=0; formats[i].form_factor; i++) {
const format &f = formats[i];
if(form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor)
continue;
if((size <= (UINT64)compute_track_size(f) * f.track_count * f.head_count) && (sectors == f.track_count * f.sector_count))
return i;
}
return -1;
}
const bbc_dsd_525_format::format bbc_dsd_525_format::formats[] =
{
{ // 200k 40 track double sided single density
floppy_image::FF_525, floppy_image::DSQD, floppy_image::FM,
4000, 10, 40, 2, 256, {}, -1, { 0,1,2,3,4,5,6,7,8,9 }, 40, 10, 10
},
{ // 400k 80 track double sided single density
floppy_image::FF_525, floppy_image::DSQD, floppy_image::FM,
4000, 10, 80, 2, 256, {}, -1, { 0,1,2,3,4,5,6,7,8,9 }, 40, 10, 10
},
{}
};
bbc_adf_525_format::bbc_adf_525_format() : wd177x_format(formats)
{
}
const char *bbc_adf_525_format::name() const
{
return "adf";
}
const char *bbc_adf_525_format::description() const
{
return "BBC Micro 5.25\" ADFS disk image";
}
const char *bbc_adf_525_format::extensions() const
{
return "adf,ads,adm,adl,img";
}
const bbc_adf_525_format::format bbc_adf_525_format::formats[] =
{
{ // 160K 40 track single sided double density
floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM,
2000, 16, 40, 1, 256, {}, 0, {}, 60, 22, 43
},
{ // 320K 80 track single sided double density
floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM,
2000, 16, 80, 1, 256, {}, 0, {}, 60, 22, 43
},
{ // 640K 80 track double sided double density
floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
2000, 16, 80, 2, 256, {}, -1, { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }, 60, 22, 43
},
{}
};
bbc_adf_35_format::bbc_adf_35_format() : wd177x_format(formats)
{
}
const char *bbc_adf_35_format::name() const
{
return "adf";
}
const char *bbc_adf_35_format::description() const
{
return "BBC Micro 3.5\" ADFS disk image";
}
const char *bbc_adf_35_format::extensions() const
{
return "adf,ads,adm,adl,img";
}
const bbc_adf_35_format::format bbc_adf_35_format::formats[] = {
{ // 160K 3 1/2 inch 40 track single sided double density
floppy_image::FF_35, floppy_image::SSDD, floppy_image::MFM,
2000, 16, 40, 1, 256, {}, 0, {}, 60, 22, 43
},
{ // 320K 3 1/2 inch 80 track single sided double density
floppy_image::FF_35, floppy_image::SSQD, floppy_image::MFM,
2000, 16, 80, 1, 256, {}, 0, {}, 60, 22, 43
},
{ // 640K 3 1/2 inch 80 track double sided double density
floppy_image::FF_35, floppy_image::DSQD, floppy_image::MFM,
2000, 16, 80, 2, 256, {}, -1, { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }, 60, 22, 43
},
{}
};
const floppy_format_type FLOPPY_BBC_SSD_525_FORMAT = &floppy_image_format_creator<bbc_ssd_525_format>;
const floppy_format_type FLOPPY_BBC_DSD_525_FORMAT = &floppy_image_format_creator<bbc_dsd_525_format>;
const floppy_format_type FLOPPY_BBC_ADF_525_FORMAT = &floppy_image_format_creator<bbc_adf_525_format>;
const floppy_format_type FLOPPY_BBC_ADF_35_FORMAT = &floppy_image_format_creator<bbc_adf_35_format>;

View File

@ -1,10 +1,10 @@
// license:GPL-2.0+
// copyright-holders:Dirk Best
// copyright-holders:Dirk Best, Nigel Barnes
/***************************************************************************
BBC Micro
Disk image format
Disk image formats
***************************************************************************/
@ -13,12 +13,47 @@
#ifndef __BBC_DSK_H__
#define __BBC_DSK_H__
#include "flopimg.h"
#include "wd177x_dsk.h"
class bbc_format : public wd177x_format
/**************************************************************************/
LEGACY_FLOPPY_OPTIONS_EXTERN(bbc);
/**************************************************************************/
class bbc_ssd_525_format : public wd177x_format
{
public:
bbc_format();
bbc_ssd_525_format();
virtual int find_size(io_generic *io, UINT32 form_factor);
virtual const char *name() const;
virtual const char *description() const;
virtual const char *extensions() const;
private:
static const format formats[];
};
class bbc_dsd_525_format : public wd177x_format
{
public:
bbc_dsd_525_format();
virtual int find_size(io_generic *io, UINT32 form_factor);
virtual const char *name() const;
virtual const char *description() const;
virtual const char *extensions() const;
private:
static const format formats[];
};
class bbc_adf_525_format : public wd177x_format
{
public:
bbc_adf_525_format();
virtual const char *name() const;
virtual const char *description() const;
@ -28,6 +63,23 @@ private:
static const format formats[];
};
extern const floppy_format_type FLOPPY_BBC_FORMAT;
class bbc_adf_35_format : public wd177x_format
{
public:
bbc_adf_35_format();
virtual const char *name() const;
virtual const char *description() const;
virtual const char *extensions() const;
private:
static const format formats[];
};
extern const floppy_format_type FLOPPY_BBC_SSD_525_FORMAT;
extern const floppy_format_type FLOPPY_BBC_DSD_525_FORMAT;
extern const floppy_format_type FLOPPY_BBC_ADF_525_FORMAT;
extern const floppy_format_type FLOPPY_BBC_ADF_35_FORMAT;
#endif // __BBC_DSK_H__

View File

@ -342,12 +342,17 @@ atomeb // 1979 Acorn Atom
atombb // 1979 Acorn Atom
//prophet2
bbca // 1981 BBC Micro Model A
bbcb // 1981 BBC Micro Model B
bbcb // 1981 BBC Micro Model B w/8271 FDC
bbcb_de // 1981 BBC Micro Model B (German)
bbcb_us // 1981 BBC Micro Model B (US)
bbcb_us // 1983 BBC Micro Model B (US)
electron // 1983 Acorn Electron
bbcb1770 // 1985 BBC Micro Model B w/1770 FDC
bbcbp // 1985 BBC Micro Model B+ 64K
bbcbp128 // 1985 BBC Micro Model B+ 128K
abc110 // 1985 ABC 110
abc210 // 1985 ABC 210/Cambridge Workstation
abc310 // 1985 ABC 310
reutapm // 1985 Reuters APM Board
bbcm // 1986 BBC Master 128
bbcmt // 1986 BBC Master Turbo
bbcmaiv // 1986 BBC Master AIV
@ -355,7 +360,8 @@ 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)
bbcmc_ar // 1986 BBC Master Compact (Arabic)
pro128s // 1987 Olivetti Prodest PC 128S
bbcbc // 1985 BBC Bridge Companion
a310 // 1988 Acorn Archimedes 310
a3010 // 1988 Acorn Archimedes 3010

File diff suppressed because it is too large Load Diff

View File

@ -22,6 +22,7 @@
#include "machine/i8271.h"
#include "machine/wd_fdc.h"
#include "machine/upd7002.h"
#include "machine/mc146818.h"
#include "video/mc6845.h"
#include "video/saa5050.h"
#include "sound/sn76496.h"
@ -52,7 +53,10 @@ public:
m_via6522_0(*this, "via6522_0"),
m_via6522_1(*this, "via6522_1"),
m_upd7002(*this, "upd7002"),
m_rtc(*this, "rtc"),
m_i8271(*this, "i8271"),
m_wd1770(*this, "wd1770"),
m_wd1772(*this, "wd1772"),
m_exp1(*this, "exp_rom1"),
m_exp2(*this, "exp_rom2"),
m_exp3(*this, "exp_rom3"),
@ -64,7 +68,6 @@ public:
m_region_maincpu(*this, "maincpu"),
m_region_os(*this, "os"),
m_region_opt(*this, "option"),
m_region_dfs(*this, "dfs"),
m_bank1(*this, "bank1"),
m_bank2(*this, "bank2"),
m_bank3(*this, "bank3"),
@ -80,7 +83,9 @@ public:
m_palette(*this, "palette")
{ }
DECLARE_FLOPPY_FORMATS(floppy_formats);
DECLARE_FLOPPY_FORMATS(floppy_formats_525sd);
DECLARE_FLOPPY_FORMATS(floppy_formats_525dd);
DECLARE_FLOPPY_FORMATS(floppy_formats_35dd);
DECLARE_WRITE8_MEMBER(bbc_page_selecta_w);
DECLARE_WRITE8_MEMBER(bbc_memorya1_w);
@ -104,40 +109,34 @@ public:
DECLARE_READ8_MEMBER(bbcm_r);
DECLARE_WRITE8_MEMBER(bbcm_w);
DECLARE_WRITE8_MEMBER(bbc_SerialULA_w);
DECLARE_READ8_MEMBER(bbc_i8271_read);
DECLARE_WRITE8_MEMBER(bbc_i8271_write);
DECLARE_WRITE8_MEMBER(bbc_wd177x_status_w);
DECLARE_READ8_MEMBER(bbc_wd1770_read);
DECLARE_WRITE8_MEMBER(bbc_wd1770_write);
DECLARE_WRITE8_MEMBER(bbc_opus_status_w);
DECLARE_READ8_MEMBER(bbc_opus_read);
DECLARE_WRITE8_MEMBER(bbc_opus_write);
DECLARE_READ8_MEMBER(bbcm_wd1770_read);
DECLARE_WRITE8_MEMBER(bbcm_wd1770_write);
DECLARE_READ8_MEMBER(bbcm_wd1770l_read);
DECLARE_WRITE8_MEMBER(bbc_wd1770_status_w);
DECLARE_READ8_MEMBER(bbcm_wd177xl_read);
DECLARE_WRITE8_MEMBER(bbcm_wd1770l_write);
DECLARE_READ8_MEMBER(bbc_disc_r);
DECLARE_WRITE8_MEMBER(bbc_disc_w);
DECLARE_WRITE8_MEMBER(bbcm_wd1772l_write);
DECLARE_WRITE8_MEMBER(bbc_videoULA_w);
DECLARE_WRITE8_MEMBER(bbc_6845_w);
DECLARE_READ8_MEMBER(bbc_6845_r);
DECLARE_READ8_MEMBER(bbc_fe_r);
DECLARE_DIRECT_UPDATE_MEMBER(bbcbp_direct_handler);
DECLARE_DIRECT_UPDATE_MEMBER(bbcm_direct_handler);
DECLARE_DRIVER_INIT(bbc);
DECLARE_DRIVER_INIT(bbcm);
DECLARE_MACHINE_START(bbca);
DECLARE_MACHINE_RESET(bbca);
DECLARE_VIDEO_START(bbca);
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);
@ -197,13 +196,16 @@ public: // HACK FOR MC6845
optional_device<saa5050_device> m_trom;
optional_device<tms5220_device> m_tms;
optional_device<cassette_image_device> m_cassette;
required_device<acia6850_device> m_acia;
required_device<clock_device> m_acia_clock;
optional_device<acia6850_device> m_acia;
optional_device<clock_device> m_acia_clock;
optional_device<rs232_port_device> m_rs232;
required_device<via6522_device> m_via6522_0;
optional_device<via6522_device> m_via6522_1;
optional_device<upd7002_device> m_upd7002;
optional_device<mc146818_device> m_rtc;
optional_device<i8271_device> m_i8271;
optional_device<wd1770_t> m_wd1770;
optional_device<wd1772_t> m_wd1772;
required_device<generic_slot_device> m_exp1;
required_device<generic_slot_device> m_exp2;
optional_device<generic_slot_device> m_exp3;
@ -213,7 +215,6 @@ public: // HACK FOR MC6845
required_memory_region m_region_maincpu;
required_memory_region m_region_os;
required_memory_region m_region_opt;
optional_memory_region m_region_dfs;
required_memory_bank m_bank1; // bbca bbcb bbcbp bbcbp128 bbcm
optional_memory_bank m_bank2; // bbcbp bbcbp128 bbcm
optional_memory_bank m_bank3; // bbca bbcb
@ -225,11 +226,8 @@ public: // HACK FOR MC6845
void check_interrupts();
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
int m_ACCCON_IRR; // IRQ inputs
@ -347,7 +345,7 @@ public: // HACK FOR MC6845
i8271 disc control
***************************************/
int m_previous_i8271_int_state; // 8271 interupt status
int m_previous_i8271_int_state; // 8271 interrupt status
/**************************************
WD1770 disc control
@ -357,13 +355,7 @@ public: // HACK FOR MC6845
int m_wd177x_irq_state;
int m_wd177x_drq_state;
int m_previous_wd177x_int_state;
int m_1770_IntEnabled;
/**************************************
Opus Challenger Disc control
***************************************/
int m_opusbank;
int m_177x_IntEnabled;
/**************************************
Video Code

View File

@ -51,19 +51,11 @@ 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 CONF settings var:bbc_DFSTypes */
WRITE8_MEMBER(bbc_state::bbc_page_selectb_w)
{
m_rombank = data & 0x0f;
if (m_rombank != 1)
{
m_bank4->set_entry(m_rombank);
}
else
{
m_bank4->set_entry(0x10 + m_DFSType);
}
}
WRITE8_MEMBER(bbc_state::bbc_memoryb3_w)
@ -89,13 +81,6 @@ static const unsigned short bbc_SWRAMtype2[16]={0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0}
static const unsigned short bbc_SWRAMtype3[16]={0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1};
WRITE8_MEMBER(bbc_state::bbc_memoryb4_w)
{
if (m_rombank == 1)
{
// special DFS case for Acorn DFS E00 Hack that can write to the DFS RAM Bank;
if (m_DFSType == 3) m_region_dfs->base()[((m_DFSType) << 14) + offset] = data;
}
else
{
switch (m_SWRAMtype)
{
@ -104,7 +89,6 @@ WRITE8_MEMBER(bbc_state::bbc_memoryb4_w)
case 3: if (bbc_SWRAMtype3[m_rombank]) m_region_opt->base()[(m_rombank << 14) + offset] = data;
}
}
}
/****************************************/
/* BBC B Plus memory handling function */
@ -377,7 +361,7 @@ WRITE8_MEMBER(bbc_state::bbcm_ACCCON_write)
m_bank2->set_base(m_region_maincpu->base() + 0x3000);
}
/* ACCCON_TST controls paging of rom reads in the 0xFC00-0xFEFF reigon */
/* ACCCON_TST controls paging of rom reads in the 0xFC00-0xFEFF region */
/* if 0 the I/O is paged for both reads and writes */
/* if 1 the ROM is paged in for reads but writes still go to I/O */
if (m_ACCCON_TST)
@ -538,7 +522,7 @@ WRITE8_MEMBER(bbc_state::bbc_memorybm7_w)
&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 )
&FE28-&FE2F 1770 registers 1770 Disc Controller 1770 Disc Controller 8 ( 4 bytes x 2 )
&FE30-&FE33 ROMSEL - ROM Select 4 ( 1 byte x 4 )
&FE34-&3FE7 ACCCON ACCCON select reg. ACCCON select reg 4 ( 1 byte x 4 )
&FE38-&FE3F NC - -
@ -554,12 +538,6 @@ READ8_MEMBER(bbc_state::bbcm_r)
{
long myo;
/* Now handled in bbcm_ACCCON_write PHS - 2008-10-11 */
// if ( m_ACCCON_TST )
// {
// return m_region_os->base()[offset + 0x3c00];
// };
if (offset<=0x0ff) /* FRED */
{
return 0xff;
@ -573,30 +551,27 @@ READ8_MEMBER(bbc_state::bbcm_r)
if ((offset>=0x200) && (offset<=0x2ff)) /* SHEILA */
{
myo = offset-0x200;
if ((myo>=0x00) && (myo<=0x07)) return bbc_6845_r(space, myo-0x00); /* Video Controller */
if ((myo>=0x08) && (myo<=0x0f))
{
if ((myo - 0x08) & 1)
return m_acia->status_r(space,0);
else
return m_acia->data_r(space,0);
}
if ((myo>=0x00) && (myo<=0x06) && (myo+0x01) & 1) return m_mc6845->status_r(space, myo-0x00); /* Video controller */
if ((myo>=0x01) && (myo<=0x07) && (myo & 1)) return m_mc6845->register_r(space, myo-0x01);
if ((myo>=0x08) && (myo<=0x0e) && (myo+0x01) & 1) return m_acia ? m_acia->status_r(space, myo-0x08) : 0xfe; /* Serial controller */
if ((myo>=0x09) && (myo<=0x0f) && (myo & 1)) return m_acia ? m_acia->data_r(space, myo-0x09) : 0xfe;
if ((myo>=0x10) && (myo<=0x17)) return 0xfe; /* Serial System Chip */
if ((myo>=0x18) && (myo<=0x1f)) return m_upd7002->read(space, myo-0x18); /* A to D converter */
if ((myo>=0x18) && (myo<=0x1f)) return m_upd7002 ? m_upd7002->read(space, myo-0x18) : 0xfe; /* A to D converter */
if ((myo>=0x20) && (myo<=0x23)) return 0xfe; /* VideoULA */
if ((myo>=0x24) && (myo<=0x27)) return bbcm_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>=0x24) && (myo<=0x27)) return bbcm_wd177xl_read(space, myo - 0x24); /* 177x Control Latch */
if ((myo>=0x28) && (myo<=0x2f) && (m_wd1770)) return m_wd1770->read(space, myo-0x28); /* 1770 Controller */
if ((myo>=0x28) && (myo<=0x2f) && (m_wd1772)) return m_wd1772->read(space, myo-0x28); /* 1772 Controller */
if ((myo>=0x28) && (myo<=0x2f)) return 0xfe; /* No Controller */
if ((myo>=0x30) && (myo<=0x33)) return 0xfe;
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 m_via6522_0->read(space, myo-0x40);
if ((myo>=0x60) && (myo<=0x7f)) return m_via6522_1->read(space, myo-0x60);
if ((myo>=0x60) && (myo<=0x7f)) return m_via6522_1 ? m_via6522_1->read(space, myo-0x60) : 0xfe;
if ((myo>=0x80) && (myo<=0x9f)) return 0xfe;
if ((myo>=0xa0) && (myo<=0xbf)) return m_adlc->read(space, myo & 0x03);
if ((myo>=0xa0) && (myo<=0xbf)) return m_adlc ? m_adlc->read(space, myo & 0x03) : 0xfe;
if ((myo>=0xc0) && (myo<=0xdf)) return 0xfe;
if ((myo>=0xe0) && (myo<=0xff)) return 0xfe;
}
return 0xfe;
}
@ -607,26 +582,24 @@ WRITE8_MEMBER(bbc_state::bbcm_w)
if ((offset>=0x200) && (offset<=0x2ff)) /* SHEILA */
{
myo=offset-0x200;
if ((myo>=0x00) && (myo<=0x07)) bbc_6845_w(space, myo-0x00, data); /* Video Controller */
if ((myo>=0x08) && (myo<=0x0f))
{
if ((myo - 0x08) & 1)
m_acia->control_w(space, 0, data);
else
m_acia->data_w(space, 0, data);
}
if ((myo>=0x00) && (myo<=0x06) && (myo+0x01) & 1) m_mc6845->address_w(space, myo-0x00, data); /* Video Controller */
if ((myo>=0x01) && (myo<=0x07) && (myo & 1)) m_mc6845->register_w(space, myo-0x01, data);
if ((myo>=0x08) && (myo<=0x0e) && (myo+0x01) & 1) if (m_acia) m_acia->control_w(space, myo-0x08, data); /* Serial controller */
if ((myo>=0x09) && (myo<=0x0f) && (myo & 1)) if (m_acia) m_acia->data_w(space, myo-0x09, data);
if ((myo>=0x10) && (myo<=0x17)) bbc_SerialULA_w(space, myo-0x10, data); /* Serial System Chip */
if ((myo>=0x18) && (myo<=0x1f)) m_upd7002->write(space, myo-0x18, data); /* A to D converter */
if ((myo>=0x18) && (myo<=0x1f) && (m_upd7002)) m_upd7002->write(space, myo-0x18, data); /* A to D converter */
if ((myo>=0x20) && (myo<=0x23)) bbc_videoULA_w(space, myo-0x20, data); /* VideoULA */
if ((myo>=0x24) && (myo<=0x27)) 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>=0x24) && (myo<=0x27) && (m_wd1770)) bbcm_wd1770l_write(space, myo-0x24, data); /* disc control latch */
if ((myo>=0x28) && (myo<=0x2f) && (m_wd1770)) m_wd1770->write(space, myo-0x28, data); /* 1770 Controller */
if ((myo>=0x24) && (myo<=0x27) && (m_wd1772)) bbcm_wd1772l_write(space, myo-0x24, data); /* disc control latch */
if ((myo>=0x28) && (myo<=0x2f) && (m_wd1772)) m_wd1772->write(space, myo-0x28, data); /* 1772 Controller */
if ((myo>=0x30) && (myo<=0x33)) page_selectbm_w(space, myo-0x30, data); /* ROMSEL */
if ((myo>=0x34) && (myo<=0x37)) bbcm_ACCCON_write(space, myo-0x34, data); /* ACCCON */
//if ((myo>=0x38) && (myo<=0x3f)) /* NC ?? */
if ((myo>=0x40) && (myo<=0x5f)) m_via6522_0->write(space, myo-0x40, data);
if ((myo>=0x60) && (myo<=0x7f)) m_via6522_1->write(space, myo-0x60, data);
if ((myo>=0x60) && (myo<=0x7f) && (m_via6522_1)) m_via6522_1->write(space, myo-0x60, data);
//if ((myo>=0x80) && (myo<=0x9f))
if ((myo>=0xa0) && (myo<=0xbf)) m_adlc->write(space, myo & 0x03, data);
if ((myo>=0xa0) && (myo<=0xbf) && (m_adlc)) m_adlc->write(space, myo & 0x03, data);
//if ((myo>=0xc0) && (myo<=0xdf))
//if ((myo>=0xe0) && (myo<=0xff))
}
@ -665,18 +638,23 @@ 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 and PB7 inputs from the speech processor (model B and B+)
-------------------------------------------------------------
PB6 is the speech processor 'ready' output and PB7 is from the
speech processor 'interrupt' output.
PB6 and PB7 outputs to Master CMOS RAM/RTC
------------------------------------------
PB6 operates the 146818 chip enable when set to '1'. PB7 operates
the 146818 address strobe line.
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
the flash colours on the display in this interrupt time so that
they maintain synchronisation with the rest of the picture.
the video circuitry is detected. The operation system changes
the display flash colours on this interrupt so that they occur
during the screen blanking period.
----------------------------------------------------------------
This is required for a lot of time function within the machine
and must be triggered every 20ms. (Should check at some point
@ -830,8 +808,8 @@ void bbc_state::bbcb_IC32_initialise(bbc_state *state)
/* 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);
mc146818_device *rtc = space.machine().device<mc146818_device>("rtc");
//logerror ("146181 WR=%d DS=%d AS=%d CE=%d \n",m_MC146818_WR,m_MC146818_DS,m_MC146818_AS,m_MC146818_CE);
//mc146818_device *rtc = space.machine().device<mc146818_device>("rtc");
// if chip enabled
if (m_MC146818_CE)
@ -841,12 +819,12 @@ void bbc_state::MC146818_set(address_space &space)
{
if (m_MC146818_WR)
{
m_via_system_porta=rtc->read(space, 1);
m_via_system_porta = m_rtc->read(space, 1);
//logerror("read 146818 data %d \n",m_via_system_porta);
}
else
{
rtc->write(space, 1, m_via_system_porta);
m_rtc->write(space, 1, m_via_system_porta);
//logerror("write 146818 data %d \n",m_via_system_porta);
}
}
@ -854,7 +832,7 @@ void bbc_state::MC146818_set(address_space &space)
// if address select is set then set the address in the 146818
if (m_MC146818_AS)
{
rtc->write(space, 0, m_via_system_porta);
m_rtc->write(space, 0, m_via_system_porta);
//logerror("write 146818 address %d \n",m_via_system_porta);
}
}
@ -869,14 +847,24 @@ 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);
if (m_sn) m_sn->write(space, 0, m_via_system_porta);
}
if (m_b1_speech_read == 0)
{
if (m_tms) m_via_system_porta = m_tms->status_r(space, 0);
//logerror("Doing an unsafe read to the speech chip %d \n",m_via_system_porta);
}
if (m_b2_speech_write == 0)
{
//logerror("Doing an unsafe write to the speech chip %d \n",data);
if (m_tms) m_tms->data_w(space, 0, m_via_system_porta);
}
if (m_b3_keyboard == 0)
{
//logerror("Doing an unsafe write to the keyboard %d \n",data);
m_via_system_porta = bbc_keyboard(space, m_via_system_porta);
}
if (m_Master) MC146818_set(space);
if (m_rtc) MC146818_set(space);
}
@ -899,40 +887,38 @@ WRITE8_MEMBER(bbc_state::bbcb_via_system_write_portb)
}
break;
case 1:
if (m_Master)
if (m_rtc && m_MC146818_WR == 0)
{
if (m_MC146818_WR == 0)
{
/* BBC MASTER has NVRAM Here */
/* BBC Master has NVRAM Here */
m_MC146818_WR = 1;
MC146818_set(space);
}
}
else
{
if (m_b1_speech_read == 0)
{
/* VSP TMS 5220 */
m_b1_speech_read = 1;
//logerror("Speech read select TRUE\n");
if (m_tms) m_tms->rsq_w(TRUE);
}
}
break;
case 2:
if (m_Master)
if (m_rtc && m_MC146818_DS == 0)
{
if (m_MC146818_DS == 0)
{
/* BBC MASTER has NVRAM Here */
/* BBC Master has NVRAM Here */
m_MC146818_DS = 1;
MC146818_set(space);
}
}
else
{
if (m_b2_speech_write == 0)
{
/* VSP TMS 5220 */
m_b2_speech_write = 1;
//logerror("Speech write select TRUE\n");
if (m_tms) m_tms->wsq_w(TRUE);
}
}
break;
@ -980,44 +966,42 @@ WRITE8_MEMBER(bbc_state::bbcb_via_system_write_portb)
if (m_b0_sound == 1)
{
m_b0_sound = 0;
m_sn->write(space, 0, m_via_system_porta);
if (m_sn) m_sn->write(space, 0, m_via_system_porta);
}
break;
case 1:
if (m_Master)
if (m_rtc && m_MC146818_WR == 1)
{
if (m_MC146818_WR == 1)
{
/* BBC MASTER has NV RAM Here */
/* BBC Master has NVRAM Here */
m_MC146818_WR = 0;
MC146818_set(space);
}
}
else
{
if (m_b1_speech_read == 1)
{
/* VSP TMS 5220 */
m_b1_speech_read = 0;
//logerror("Speech read select FALSE\n");
if (m_tms) m_tms->rsq_w(FALSE);
}
}
break;
case 2:
if (m_Master)
if (m_rtc && m_MC146818_DS == 1)
{
if (m_MC146818_DS == 1)
{
/* BBC MASTER has NV RAM Here */
/* BBC Master has NVRAM Here */
m_MC146818_DS = 0;
MC146818_set(space);
}
}
else
{
if (m_b2_speech_write == 1)
{
/* VSP TMS 5220 */
m_b2_speech_write = 0;
//logerror("Speech write select FALSE\n");
if (m_tms) m_tms->wsq_w(FALSE);
}
}
break;
@ -1061,7 +1045,7 @@ WRITE8_MEMBER(bbc_state::bbcb_via_system_write_portb)
}
if (m_Master)
if (m_rtc)
{
//set the Address Select
if (m_MC146818_AS != ((data>>7)&1))
@ -1086,33 +1070,18 @@ READ8_MEMBER(bbc_state::bbcb_via_system_read_porta)
return m_via_system_porta;
}
READ8_MEMBER(bbc_state::bbcb_via_system_read_portb)
{
// D4 of portb is joystick fire button 1
// D5 of portb is joystick fire button 2
// D6 VSPINT
// D7 VSPRDY
/* this is the interupt and ready signal from the BBC B Speech processor */
static const int TMSint=1;
static const int TMSrdy=1;
#ifdef UNUSED_FUNCTION
void bbc_state::bbc_TMSint(int status)
{
TMSint=(!status)&1;
TMSrdy=(!tms5220_readyq_r())&1;
via_0_portb_w(0,(0xf | ioport("IN0")->read()|(TMSint<<6)|(TMSrdy<<7)));
}
#endif
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));
return (0xf | ioport("IN0")->read() | (TMSint<<6)|(TMSrdy<<7));
int TMSint = m_tms ? m_tms->intq_r() : 0;
int TMSrdy = m_tms ? m_tms->readyq_r() : 0;
//logerror("TMSint %d\n",TMSint);
//logerror("TMSrdy %d\n",TMSrdy);
return (0xf | ioport("IN0")->read() | (!TMSrdy << 7) | (!TMSint << 6));
}
@ -1129,7 +1098,7 @@ Port A output is buffered before being connected to the printer connector.
This means that they can only be operated as output lines.
CA1 is pulled high by a 4K7 resistor. CA1 normally acts as an acknowledge
line when a printer is used. CA2 is buffered so that it has become an open
collector output only. It usially acts as the printer strobe line.
collector output only. It usually acts as the printer strobe line.
***********************************************************************/
/* USER VIA 6522 port B is connected to the BBC user port */
@ -1430,7 +1399,7 @@ WRITE8_MEMBER(bbc_state::bbc_SerialULA_w)
update_acia_rxd();
update_acia_dcd();
update_acia_cts();
BBC_Cassette_motor(m_serproc_data & 0x80);
if (m_cassette) BBC_Cassette_motor(m_serproc_data & 0x80);
// Set transmit clock rate
m_acia_clock->set_clock_scale( (double) 1 / serial_clocks[ data & 0x07 ] );
@ -1471,55 +1440,6 @@ WRITE_LINE_MEMBER(bbc_state::bbc_i8271_interrupt)
}
READ8_MEMBER(bbc_state::bbc_i8271_read)
{
int ret;
logerror("i8271 read %d ",offset);
switch (offset)
{
case 0:
case 1:
case 2:
case 3:
/* 8271 registers */
ret=m_i8271->read(space, offset);
logerror(" %d\n",ret);
break;
case 4:
ret=m_i8271->data_r(space, offset);
logerror(" %d\n",ret);
break;
default:
ret=0x0ff;
break;
}
logerror(" void\n");
return ret;
}
WRITE8_MEMBER(bbc_state::bbc_i8271_write)
{
logerror("i8271 write %d %d\n",offset,data);
switch (offset)
{
case 0:
case 1:
case 2:
case 3:
/* 8271 registers */
m_i8271->write(space, offset, data);
return;
case 4:
m_i8271->data_w(space, offset, data);
return;
default:
break;
}
}
/**************************************
WD1770 disc control function
***************************************/
@ -1543,9 +1463,6 @@ WRITE8_MEMBER(bbc_state::bbc_i8271_write)
density select
single density is as the 8271 disc format
double density is as the 8271 disc format but with 16 sectors per track
At some point we need to check the size of the disc image to work out if it is a single or double
density disc image
*/
@ -1566,7 +1483,7 @@ void bbc_state::bbc_update_fdq_int(int state)
int bbc_state;
/* if drq or irq is set, and interrupt is enabled */
if ((m_wd177x_irq_state || m_wd177x_drq_state) && (m_1770_IntEnabled))
if ((m_wd177x_irq_state || m_wd177x_drq_state) && (m_177x_IntEnabled))
{
/* int trigger */
bbc_state = 1;
@ -1576,7 +1493,6 @@ void bbc_state::bbc_update_fdq_int(int state)
/* do not trigger int */
bbc_state = 0;
}
//printf("bbc_state %d prev %d\n", bbc_state, m_previous_wd177x_int_state);
/* nmi is edge triggered, and triggers when the state goes from clear->set.
Here we are checking this transition before triggering the nmi */
if (bbc_state != m_previous_wd177x_int_state)
@ -1594,7 +1510,6 @@ void bbc_state::bbc_update_fdq_int(int state)
WRITE_LINE_MEMBER(bbc_state::bbc_wd177x_intrq_w)
{
//printf("bbc_wd177x_intrq_w %d \n", state);
m_wd177x_irq_state = state;
bbc_update_fdq_int(state);
}
@ -1605,357 +1520,92 @@ WRITE_LINE_MEMBER(bbc_state::bbc_wd177x_drq_w)
bbc_update_fdq_int(state);
}
WRITE8_MEMBER(bbc_state::bbc_wd177x_status_w)
WRITE8_MEMBER(bbc_state::bbc_wd1770_status_w)
{
wd1770_t *fdc = machine().device<wd1770_t>("wd177x");
floppy_image_device *floppy0 = machine().device<floppy_connector>("wd177x:0")->get_device();
floppy_image_device *floppy1 = machine().device<floppy_connector>("wd177x:1")->get_device();
floppy_image_device *floppy = NULL;
m_drive_control = data;
logerror("Drive control %d \n", data);
// bit 5: reset
if (!BIT(data, 5)) m_wd1770->reset();
// bit 0, 1: drive select
if (BIT(data, 0)) floppy = floppy0;
if (BIT(data, 1)) floppy = floppy1;
fdc->set_floppy(floppy);
if (BIT(data, 0)) floppy = m_wd1770->subdevice<floppy_connector>("0")->get_device();
if (BIT(data, 1)) floppy = m_wd1770->subdevice<floppy_connector>("1")->get_device();
m_wd1770->set_floppy(floppy);
// bit 2: side select
if (floppy)
floppy->ss_w(BIT(data, 2));
// bit 3: density
fdc->dden_w(BIT(data, 3));
m_wd1770->dden_w(BIT(data, 3));
// bit 4: interrupt enable
m_1770_IntEnabled = !BIT(data, 4);
m_177x_IntEnabled = !BIT(data, 4);
}
READ8_MEMBER(bbc_state::bbc_wd1770_read)
{
int retval=0xff;
wd1770_t *fdc = machine().device<wd1770_t>("wd177x");
switch (offset)
{
case 4:
retval=fdc->status_r(space, 0);
break;
case 5:
retval=fdc->track_r(space, 0);
break;
case 6:
retval=fdc->sector_r(space, 0);
break;
case 7:
retval=fdc->data_r(space, 0);
break;
default:
break;
}
//logerror("wd177x read: $%02X $%02X\n", offset,retval);
return retval;
}
WRITE8_MEMBER(bbc_state::bbc_wd1770_write)
{
wd1770_t *fdc = machine().device<wd1770_t>("wd177x");
//logerror("wd177x write: $%02X $%02X\n", offset,data);
switch (offset)
{
case 0:
bbc_wd177x_status_w(space, 0, data);
break;
case 4:
fdc->cmd_w(space, 0, data);
break;
case 5:
fdc->track_w(space, 0, data);
break;
case 6:
fdc->sector_w(space, 0, data);
break;
case 7:
fdc->data_w(space, 0, data);
break;
default:
break;
}
}
/*********************************************
OPUS CHALLENGER MEMORY MAP
Read Write
&FCF8 1770 Status register 1770 command register
&FCF9 1770 track register
&FCFA 1770 sector register
&FCFB 1770 data register
&FCFC 1770 drive control
drive control register bits
0 select side 0= side 0 1= side 1
1 select drive 0
2 select drive 1
3 ?unused?
4 ?Always Set
5 Density Select 0=double, 1=single
6 ?unused?
7 ?unused?
The RAM is accessible through JIM (page &FD). One page is visible in JIM at a time.
The selected page is controlled by the two paging registers:
&FCFE Paging register MSB
&FCFF Paging register LSB
256K model has 1024 pages &000 to &3ff
512K model has 2048 pages &000 to &7ff
AM_RANGE(0xfc00, 0xfdff) AM_READWRITE(bbc_opus_read , bbc_opus_write )
**********************************************/
WRITE8_MEMBER(bbc_state::bbc_opus_status_w)
{
wd1770_t *fdc = machine().device<wd1770_t>("wd177x");
floppy_image_device *floppy0 = machine().device<floppy_connector>("wd177x:0")->get_device();
floppy_image_device *floppy1 = machine().device<floppy_connector>("wd177x:1")->get_device();
floppy_image_device *floppy = NULL;
m_drive_control = data;
// bit 1, 2: drive select
if (BIT(data, 1)) floppy = floppy0;
if (BIT(data, 2)) floppy = floppy1;
fdc->set_floppy(floppy);
// bit 0: side select
if (floppy)
floppy->ss_w(BIT(data, 0));
// bit 5: density
fdc->dden_w(BIT(data, 5));
// bit 4: interrupt enable
m_1770_IntEnabled = BIT(data, 4);
}
READ8_MEMBER(bbc_state::bbc_opus_read)
{
wd1770_t *fdc = machine().device<wd1770_t>("wd177x");
//logerror("wd177x read: $%02X\n", offset);
if (m_DFSType==6)
{
if (offset<0x100)
{
switch (offset)
{
case 0xf8:
return fdc->status_r(space, 0);
case 0xf9:
return fdc->track_r(space, 0);
case 0xfa:
return fdc->sector_r(space, 0);
case 0xfb:
return fdc->data_r(space, 0);
}
}
else
{
return memregion("disks")->base()[offset + (m_opusbank << 8)];
}
}
return 0xff;
}
WRITE8_MEMBER(bbc_state::bbc_opus_write)
{
wd1770_t *fdc = machine().device<wd1770_t>("wd177x");
//logerror("wd177x write: $%02X $%02X\n", offset,data);
if (m_DFSType==6)
{
if (offset<0x100)
{
switch (offset)
{
case 0xf8:
fdc->cmd_w(space, 0, data);
break;
case 0xf9:
fdc->track_w(space, 0, data);
break;
case 0xfa:
fdc->sector_w(space, 0, data);
break;
case 0xfb:
fdc->data_w(space, 0, data);
break;
case 0xfc:
bbc_opus_status_w(space, 0,data);
break;
case 0xfe:
m_opusbank=(m_opusbank & 0xff) | (data<<8);
break;
case 0xff:
m_opusbank=(m_opusbank & 0xff00) | data;
break;
}
}
else
{
memregion("disks")->base()[offset + (m_opusbank << 8)] = data;
}
}
}
/***************************************
BBC MASTER DISC SUPPORT
***************************************/
READ8_MEMBER(bbc_state::bbcm_wd1770_read)
{
int retval=0xff;
wd1770_t *fdc = machine().device<wd1770_t>("wd177x");
switch (offset)
{
case 0:
retval=fdc->status_r(space, 0);
break;
case 1:
retval=fdc->track_r(space, 0);
break;
case 2:
retval=fdc->sector_r(space, 0);
break;
case 3:
retval=fdc->data_r(space, 0);
break;
default:
break;
}
return retval;
}
WRITE8_MEMBER(bbc_state::bbcm_wd1770_write)
{
wd1770_t *fdc = machine().device<wd1770_t>("wd177x");
//logerror("wd177x write: $%02X $%02X\n", offset,data);
switch (offset)
{
case 0:
fdc->cmd_w(space, 0, data);
break;
case 1:
fdc->track_w(space, 0, data);
break;
case 2:
fdc->sector_w(space, 0, data);
break;
case 3:
fdc->data_w(space, 0, data);
break;
default:
break;
}
}
READ8_MEMBER(bbc_state::bbcm_wd1770l_read)
READ8_MEMBER(bbc_state::bbcm_wd177xl_read)
{
return m_drive_control;
}
WRITE8_MEMBER(bbc_state::bbcm_wd1770l_write)
{
wd1770_t *fdc = machine().device<wd1770_t>("wd177x");
floppy_image_device *floppy0 = machine().device<floppy_connector>("wd177x:0")->get_device();
floppy_image_device *floppy1 = machine().device<floppy_connector>("wd177x:1")->get_device();
floppy_image_device *floppy = NULL;
m_drive_control = data;
//logerror("Drive control %d \n", data);
// bit 0, 1: drive select
if (BIT(data, 0)) floppy = floppy0;
if (BIT(data, 1)) floppy = floppy1;
// bit 2: reset
if (!BIT(data, 5)) m_wd1770->reset();
// bit 0, 1, 3: drive select
if (BIT(data, 0)) floppy = m_wd1770->subdevice<floppy_connector>("0")->get_device();
if (BIT(data, 1)) floppy = m_wd1770->subdevice<floppy_connector>("1")->get_device();
if (BIT(data, 3)) floppy = m_wd1770->subdevice<floppy_connector>("2")->get_device();
m_wd1770->set_floppy(floppy);
// bit 4: side select
if (floppy)
floppy->ss_w(BIT(data, 4));
// bit 5: density
fdc->dden_w(BIT(data, 5));
m_wd1770->dden_w(BIT(data, 5));
// m_1770_IntEnabled=(((data>>4) & 0x01)==0);
m_1770_IntEnabled=1;
m_177x_IntEnabled = 1;
}
/**************************************
DFS Hardware mapping for different Disc Controller types
***************************************/
READ8_MEMBER(bbc_state::bbc_disc_r)
WRITE8_MEMBER(bbc_state::bbcm_wd1772l_write)
{
switch (m_DFSType){
/* 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 acorn 1770 interface */
case 4:
return bbc_wd1770_read(space, offset);
/* case 5 is the watford 1770 interface */
case 5:
return bbc_wd1770_read(space, offset);
/* case 6 is the Opus challenger interface */
case 6:
/* not connected here, opus drive is connected via the 1MHz Bus */
break;
/* case 7 in no disc controller */
case 7:
break;
}
return 0x0ff;
}
floppy_image_device *floppy = NULL;
WRITE8_MEMBER(bbc_state::bbc_disc_w)
{
switch (m_DFSType){
/* case 0 to 3 are all standard 8271 interfaces */
case 0: case 1: case 2: case 3:
bbc_i8271_write(space, offset,data);
break;
/* case 4 is the acorn 1770 interface */
case 4:
bbc_wd1770_write(space, offset,data);
break;
/* case 5 is the watford 1770 interface */
case 5:
bbc_wd1770_write(space, offset,data);
break;
/* case 6 is the Opus challenger interface */
case 6:
/* not connected here, opus drive is connected via the 1MHz Bus */
break;
/* case 7 in no disc controller */
case 7:
break;
}
}
m_drive_control = data;
//logerror("Drive control %d \n", data);
// bit 2: reset
if (!BIT(data, 5)) m_wd1772->reset();
// bit 0, 1, 3: drive select
if (BIT(data, 0)) floppy = m_wd1772->subdevice<floppy_connector>("0")->get_device();
if (BIT(data, 1)) floppy = m_wd1772->subdevice<floppy_connector>("1")->get_device();
if (BIT(data, 3)) floppy = m_wd1772->subdevice<floppy_connector>("2")->get_device();
m_wd1772->set_floppy(floppy);
// bit 4: side select
if (floppy)
floppy->ss_w(BIT(data, 4));
// bit 5: density
m_wd1772->dden_w(BIT(data, 5));
m_177x_IntEnabled = 1;
}
/**************************************
BBC B Rom loading functions
@ -2023,23 +1673,6 @@ int bbc_state::bbcm_load_cart(device_image_interface &image, generic_slot_device
DRIVER_INIT_MEMBER(bbc_state,bbc)
{
m_Master=0;
m_rxd_cass = 0;
m_nr_high_tones = 0;
m_serproc_data = 0;
m_cass_out_enabled = 0;
m_tape_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(bbc_state::bbc_tape_timer_cb),this));
/* vertical sync pulse from video circuit */
m_via6522_0->write_ca1(1);
/* light pen strobe detect (not emulated) */
m_via6522_0->write_cb2(1);
}
DRIVER_INIT_MEMBER(bbc_state,bbcm)
{
m_Master=1;
m_rxd_cass = 0;
m_nr_high_tones = 0;
m_serproc_data = 0;
@ -2149,14 +1782,12 @@ MACHINE_START_MEMBER(bbc_state, bbcb)
m_previous_i8271_int_state=0;
m_previous_wd177x_int_state=1;
bbc_setup_banks(m_bank4, 16, 0, 0x4000);
if (m_region_dfs)
m_bank4->configure_entries(16, 8, m_region_dfs->base(), 0x4000); // additional bank for paged ram
}
MACHINE_RESET_MEMBER(bbc_state, bbcb)
{
UINT8 *RAM = m_region_maincpu->base();
m_DFSType= (ioport("BBCCONFIG")->read() >> 0) & 0x07;
m_Speech = (ioport("BBCCONFIG")->read() >> 0) & 0x01;
m_SWRAMtype = (ioport("BBCCONFIG")->read() >> 3) & 0x03;
m_bank1->set_base(RAM);
m_bank3->set_base(RAM + 0x4000);
@ -2166,8 +1797,6 @@ MACHINE_RESET_MEMBER(bbc_state, bbcb)
m_bank7->set_base(m_region_os->base()); /* bank 7 points at the OS rom from c000 to ffff */
bbcb_IC32_initialise(this);
m_opusbank = 0;
}
@ -2184,6 +1813,7 @@ MACHINE_START_MEMBER(bbc_state, bbcbp)
MACHINE_RESET_MEMBER(bbc_state, bbcbp)
{
m_Speech = 1;
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_entry(0);

View File

@ -99,8 +99,7 @@ static const int width_of_cursor_set[8]={ 0,0,1,2,1,0,2,4 };
this is used by the palette lookup in the video ULA */
void bbc_state::set_pixel_lookup()
{
int i;
for (i=0; i<256; i++)
for (int i=0; i<256; i++)
{
m_pixel_bits[i] = (((i>>7)&1)<<3) | (((i>>5)&1)<<2) | (((i>>3)&1)<<1) | (((i>>1)&1)<<0);
}
@ -254,37 +253,6 @@ WRITE_LINE_MEMBER(bbc_state::bbc_vsync)
m_trom->dew_w(state);
}
/************************************************************************
* memory interface to BBC's 6845
************************************************************************/
WRITE8_MEMBER(bbc_state::bbc_6845_w)
{
switch(offset & 1)
{
case 0 :
m_mc6845->address_w(space,0,data);
break;
case 1 :
m_mc6845->register_w(space,0,data);
break;
}
return;
}
READ8_MEMBER(bbc_state::bbc_6845_r)
{
switch (offset&1)
{
case 0: return m_mc6845->status_r(space,0);
case 1: return m_mc6845->register_r(space,0);
}
return 0;
}
/**** BBC B+ Shadow Ram change ****/
@ -319,7 +287,7 @@ void bbc_state::common_init(int memorySize)
VIDEO_START_MEMBER(bbc_state,bbca)
{
common_init(16);
common_init(m_ram->size()/1024);
}
VIDEO_START_MEMBER(bbc_state,bbcb)