summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/mess/includes/bbc.h29
-rw-r--r--src/mess/machine/bbc.c92
-rw-r--r--src/mess/video/bbc.c114
3 files changed, 108 insertions, 127 deletions
diff --git a/src/mess/includes/bbc.h b/src/mess/includes/bbc.h
index da3cc032632..4c9af1986ed 100644
--- a/src/mess/includes/bbc.h
+++ b/src/mess/includes/bbc.h
@@ -26,6 +26,7 @@ public:
bbc_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
+ , m_mc6845(*this, "mc6845")
, m_sn(*this, "sn76489")
, m_trom(*this, "saa505x")
, m_ACCCON_IRR(CLEAR_LINE)
@@ -35,9 +36,18 @@ public:
, m_region_maincpu(*this, "maincpu")
, m_region_user1(*this, "user1")
, m_region_user2(*this, "user2")
+ , m_bank1(*this, "bank1")
+ , m_bank2(*this, "bank2")
+ , m_bank3(*this, "bank3")
+ , m_bank4(*this, "bank4")
+ , m_bank5(*this, "bank5")
+ , m_bank6(*this, "bank6")
+ , m_bank7(*this, "bank7")
+ , m_bank8(*this, "bank8")
{ }
required_device<cpu_device> m_maincpu;
+ required_device<mc6845_device> m_mc6845;
optional_device<sn76489_device> m_sn;
required_device<saa5050_device> m_trom;
@@ -314,6 +324,18 @@ protected:
required_memory_region m_region_maincpu;
required_memory_region m_region_user1;
optional_memory_region m_region_user2;
+ required_memory_bank m_bank1; // bbca bbcb bbcbp bbcbp128 bbcm
+ optional_memory_bank m_bank2; // bbcbp bbcbp128 bbcm
+ optional_memory_bank m_bank3; // bbca bbcb
+ required_memory_bank m_bank4; // bbca bbcb bbcbp bbcbp128 bbcm
+ optional_memory_bank m_bank5; // bbcm
+ optional_memory_bank m_bank6; // bbcbp bbcbp128
+ required_memory_bank m_bank7; // bbca bbcb bbcbp bbcbp128 bbcm
+ optional_memory_bank m_bank8; // bbcm
+
+ void bbcbp_setvideoshadow(int vdusel);
+ void common_init(int memorySize);
+ void set_pixel_lookup();
};
@@ -329,14 +351,7 @@ extern const wd17xx_interface bbc_wd17xx_interface;
/* tape support */
-
extern const i8271_interface bbc_i8271_interface;
extern const uPD7002_interface bbc_uPD7002;
-/*----------- defined in video/bbc.c -----------*/
-
-void bbc_set_video_memory_lookups(running_machine &machine, int ramsize);
-void bbc_setscreenstart(running_machine &machine, int b4, int b5);
-void bbcbp_setvideoshadow(running_machine &machine, int vdusel);
-
#endif /* BBC_H_ */
diff --git a/src/mess/machine/bbc.c b/src/mess/machine/bbc.c
index 5b86c3308a1..a01df1820f8 100644
--- a/src/mess/machine/bbc.c
+++ b/src/mess/machine/bbc.c
@@ -37,7 +37,7 @@ Model A memory handling functions
/* for the model A just address the 4 on board ROM sockets */
WRITE8_MEMBER(bbc_state::bbc_page_selecta_w)
{
- membank("bank4")->set_base(m_region_user1->base()+((data&0x03)<<14));
+ m_bank4->set_base(m_region_user1->base()+((data&0x03)<<14));
}
@@ -57,11 +57,11 @@ WRITE8_MEMBER(bbc_state::bbc_page_selectb_w)
m_rombank=data&0x0f;
if (m_rombank!=1)
{
- membank("bank4")->set_base(m_region_user1->base() + (m_rombank << 14));
+ m_bank4->set_base(m_region_user1->base() + (m_rombank << 14));
}
else
{
- membank("bank4")->set_base(m_region_user2->base() + ((m_DFSType) << 14));
+ m_bank4->set_base(m_region_user2->base() + ((m_DFSType) << 14));
}
}
@@ -138,24 +138,24 @@ WRITE8_MEMBER(bbc_state::bbc_page_selectbp_w)
if (m_pagedRAM)
{
/* if paged ram then set 8000 to afff to read from the ram 8000 to afff */
- membank("bank4")->set_base(m_region_maincpu->base() + 0x8000);
+ m_bank4->set_base(m_region_maincpu->base() + 0x8000);
}
else
{
/* if paged rom then set the rom to be read from 8000 to afff */
- membank("bank4")->set_base(m_region_user1->base() + (m_rombank << 14));
+ m_bank4->set_base(m_region_user1->base() + (m_rombank << 14));
};
/* set the rom to be read from b000 to bfff */
- membank("bank6")->set_entry(m_rombank);
+ m_bank6->set_entry(m_rombank);
}
else
{
//the video display should now use this flag to display the shadow ram memory
m_vdusel=(data>>7)&0x01;
- bbcbp_setvideoshadow(machine(), m_vdusel);
+ bbcbp_setvideoshadow(m_vdusel);
//need to make the video display do a full screen refresh for the new memory area
- membank("bank2")->set_base(m_region_maincpu->base()+0x3000);
+ m_bank2->set_base(m_region_maincpu->base()+0x3000);
}
}
@@ -186,19 +186,19 @@ DIRECT_UPDATE_MEMBER(bbc_state::bbcbp_direct_handler)
if (m_vdusel == 0)
{
// not in shadow ram mode so just read normal ram
- membank("bank2")->set_base(ram + 0x3000);
+ m_bank2->set_base(ram + 0x3000);
}
else
{
if (vdudriverset(machine()))
{
// if VDUDriver set then read from shadow ram
- membank("bank2")->set_base(ram + 0xb000);
+ m_bank2->set_base(ram + 0xb000);
}
else
{
// else read from normal ram
- membank("bank2")->set_base(ram + 0x3000);
+ m_bank2->set_base(ram + 0x3000);
}
}
return address;
@@ -360,23 +360,23 @@ WRITE8_MEMBER(bbc_state::bbcm_ACCCON_write)
if (m_ACCCON_Y)
{
- membank("bank7")->set_base(m_region_maincpu->base() + 0x9000);
+ m_bank7->set_base(m_region_maincpu->base() + 0x9000);
}
else
{
- membank("bank7")->set_base(m_region_user1->base() + 0x40000);
+ m_bank7->set_base(m_region_user1->base() + 0x40000);
}
- bbcbp_setvideoshadow(machine(), m_ACCCON_D);
+ bbcbp_setvideoshadow(m_ACCCON_D);
if (m_ACCCON_X)
{
- membank("bank2")->set_base(m_region_maincpu->base() + 0xb000 );
+ m_bank2->set_base(m_region_maincpu->base() + 0xb000 );
}
else
{
- membank("bank2")->set_base(m_region_maincpu->base() + 0x3000 );
+ m_bank2->set_base(m_region_maincpu->base() + 0x3000 );
}
/* ACCCON_TST controls paging of rom reads in the 0xFC00-0xFEFF reigon */
@@ -384,7 +384,7 @@ WRITE8_MEMBER(bbc_state::bbcm_ACCCON_write)
/* if 1 the the ROM is paged in for reads but writes still go to I/O */
if (m_ACCCON_TST)
{
- membank("bank8")->set_base(m_region_user1->base()+0x43c00);
+ m_bank8->set_base(m_region_user1->base()+0x43c00);
space.install_read_bank(0xFC00,0xFEFF,"bank8");
}
else
@@ -410,13 +410,13 @@ WRITE8_MEMBER(bbc_state::page_selectbm_w)
if (m_pagedRAM)
{
- membank("bank4")->set_base(m_region_maincpu->base() + 0x8000);
- membank("bank5")->set_entry(m_rombank);
+ m_bank4->set_base(m_region_maincpu->base() + 0x8000);
+ m_bank5->set_entry(m_rombank);
}
else
{
- membank("bank4")->set_base(m_region_user1->base() + ((m_rombank) << 14));
- membank("bank5")->set_entry(m_rombank);
+ m_bank4->set_base(m_region_user1->base() + ((m_rombank) << 14));
+ m_bank5->set_entry(m_rombank);
}
}
@@ -432,17 +432,17 @@ DIRECT_UPDATE_MEMBER(bbc_state::bbcm_direct_handler)
{
if (m_ACCCON_X)
{
- membank( "bank2" )->set_base( m_region_maincpu->base() + 0xb000 );
+ m_bank2->set_base( m_region_maincpu->base() + 0xb000 );
}
else
{
if (m_ACCCON_E && bbcm_vdudriverset(machine()))
{
- membank( "bank2" )->set_base( m_region_maincpu->base() + 0xb000 );
+ m_bank2->set_base( m_region_maincpu->base() + 0xb000 );
}
else
{
- membank( "bank2" )->set_base( m_region_maincpu->base() + 0x3000 );
+ m_bank2->set_base( m_region_maincpu->base() + 0x3000 );
}
}
@@ -1993,11 +1993,11 @@ MACHINE_RESET_MEMBER(bbc_state,bbca)
{
UINT8 *ram = m_region_maincpu->base();
m_RAMSize = 1;
- membank("bank1")->set_base(ram);
- membank("bank3")->set_base(ram);
+ m_bank1->set_base(ram);
+ m_bank3->set_base(ram);
- membank("bank4")->set_base(m_region_user1->base()); /* bank 4 is the paged ROMs from 8000 to bfff */
- membank("bank7")->set_base(m_region_user1->base()+0x10000); /* bank 7 points at the OS rom from c000 to ffff */
+ 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 */
bbcb_IC32_initialise(this);
}
@@ -2029,22 +2029,22 @@ MACHINE_RESET_MEMBER(bbc_state,bbcb)
m_SWRAMtype = (machine().root_device().ioport("BBCCONFIG")->read() >> 3) & 0x03;
m_RAMSize= (machine().root_device().ioport("BBCCONFIG")->read() >> 5) & 0x01;
- membank("bank1")->set_base(ram);
+ m_bank1->set_base(ram);
if (m_RAMSize)
{
/* 32K Model B */
- membank("bank3")->set_base(ram + 0x4000);
+ m_bank3->set_base(ram + 0x4000);
m_memorySize=32;
}
else
{
/* 16K just repeat the lower 16K*/
- membank("bank3")->set_base(ram);
+ m_bank3->set_base(ram);
m_memorySize=16;
}
- membank("bank4")->set_base(m_region_user1->base()); /* bank 4 is the paged ROMs from 8000 to bfff */
- membank("bank7")->set_base(m_region_user1->base() + 0x40000); /* bank 7 points at the OS rom from c000 to ffff */
+ 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);
@@ -2067,16 +2067,16 @@ 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 */
- membank("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)
{
- membank("bank1")->set_base(m_region_maincpu->base());
- membank("bank2")->set_base(m_region_maincpu->base()+0x03000); /* bank 2 screen/shadow ram from 3000 to 7fff */
- membank("bank4")->set_base(m_region_user1->base()); /* bank 4 is paged ROM or RAM from 8000 to afff */
- membank("bank6")->set_entry(0);
- membank("bank7")->set_base(m_region_user1->base()+0x40000); /* bank 7 points at the OS rom from c000 to ffff */
+ 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_bank6->set_entry(0);
+ m_bank7->set_base(m_region_user1->base()+0x40000); /* bank 7 points at the OS rom from c000 to ffff */
bbcb_IC32_initialise(this);
@@ -2093,20 +2093,20 @@ MACHINE_START_MEMBER(bbc_state,bbcm)
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 */
- membank("bank5")->configure_entries(0, 16, m_region_user1->base()+0x01000, 1<<14);
+ m_bank5->configure_entries(0, 16, m_region_user1->base()+0x01000, 1<<14);
/* Set ROM/IO bank to point to rom */
- membank( "bank8" )->set_base( m_region_user1->base()+0x43c00);
+ m_bank8->set_base( m_region_user1->base()+0x43c00);
m_maincpu->space(AS_PROGRAM).install_read_bank(0xFC00, 0xFEFF, "bank8");
}
MACHINE_RESET_MEMBER(bbc_state,bbcm)
{
- membank("bank1")->set_base(m_region_maincpu->base()); /* bank 1 regular lower ram from 0000 to 2fff */
- membank("bank2")->set_base(m_region_maincpu->base() + 0x3000); /* bank 2 screen/shadow ram from 3000 to 7fff */
- membank("bank4")->set_base(m_region_user1->base()); /* bank 4 is paged ROM or RAM from 8000 to 8fff */
- membank("bank5")->set_entry(0);
- membank("bank7")->set_base(m_region_user1->base() + 0x40000); /* bank 6 OS rom of RAM from c000 to dfff */
+ 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_bank5->set_entry(0);
+ m_bank7->set_base(m_region_user1->base() + 0x40000); /* bank 6 OS rom of RAM from c000 to dfff */
bbcb_IC32_initialise(this);
diff --git a/src/mess/video/bbc.c b/src/mess/video/bbc.c
index 99289035552..7637d666baf 100644
--- a/src/mess/video/bbc.c
+++ b/src/mess/video/bbc.c
@@ -97,12 +97,12 @@ 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 */
-static void set_pixel_lookup(bbc_state *state)
+void bbc_state::set_pixel_lookup()
{
int i;
for (i=0; i<256; i++)
{
- state->m_pixel_bits[i] = (((i>>7)&1)<<3) | (((i>>5)&1)<<2) | (((i>>3)&1)<<1) | (((i>>1)&1)<<0);
+ m_pixel_bits[i] = (((i>>7)&1)<<3) | (((i>>5)&1)<<2) | (((i>>3)&1)<<1) | (((i>>1)&1)<<0);
}
}
@@ -143,12 +143,11 @@ WRITE8_MEMBER(bbc_state::bbc_videoULA_w)
} else {
m_pixels_per_byte=pixels_per_byte_set[m_videoULA_characters_per_line|(m_videoULA_6845_clock_rate<<2)];
}
- mc6845_device *mc6845 = machine().device<mc6845_device>("mc6845");
- mc6845->set_hpixels_per_column(m_pixels_per_byte);
+ m_mc6845->set_hpixels_per_column(m_pixels_per_byte);
if (m_videoULA_6845_clock_rate)
- mc6845->set_clock(2000000);
+ m_mc6845->set_clock(2000000);
else
- mc6845->set_clock(1000000);
+ m_mc6845->set_clock(1000000);
}
break;
// Set a pallet register in the Video ULA
@@ -305,14 +304,13 @@ MC6845_INTERFACE( bbc_mc6845_intf )
WRITE8_MEMBER(bbc_state::bbc_6845_w)
{
- mc6845_device *mc6845 = machine().device<mc6845_device>("mc6845");
switch(offset & 1)
{
case 0 :
- mc6845->address_w(space,0,data);
+ m_mc6845->address_w(space,0,data);
break;
case 1 :
- mc6845->register_w(space,0,data);
+ m_mc6845->register_w(space,0,data);
break;
}
return;
@@ -320,12 +318,10 @@ WRITE8_MEMBER(bbc_state::bbc_6845_w)
READ8_MEMBER(bbc_state::bbc_6845_r)
{
- mc6845_device *mc6845 = machine().device<mc6845_device>("mc6845");
-
switch (offset&1)
{
- case 0: return mc6845->status_r(space,0);
- case 1: return mc6845->register_r(space,0);
+ case 0: return m_mc6845->status_r(space,0);
+ case 1: return m_mc6845->register_r(space,0);
}
return 0;
}
@@ -336,14 +332,13 @@ READ8_MEMBER(bbc_state::bbc_6845_r)
/**** BBC B+ Shadow Ram change ****/
-void bbcbp_setvideoshadow(running_machine &machine, int vdusel)
+void bbc_state::bbcbp_setvideoshadow(int vdusel)
{
- bbc_state *state = machine.driver_data<bbc_state>();
if (vdusel)
{
- state->m_BBC_Video_RAM= state->memregion("maincpu")->base()+0x8000;
+ m_BBC_Video_RAM= m_region_maincpu->base()+0x8000;
} else {
- state->m_BBC_Video_RAM= machine.root_device().memregion("maincpu")->base();
+ m_BBC_Video_RAM= m_region_maincpu->base();
}
}
@@ -352,39 +347,38 @@ void bbcbp_setvideoshadow(running_machine &machine, int vdusel)
* Initialize the BBC video emulation
************************************************************************/
-static void common_init(running_machine &machine, int memorySize)
+void bbc_state::common_init(int memorySize)
{
- bbc_state *state = machine.driver_data<bbc_state>();
- state->m_emulation_cursor_size = 1;
+ m_emulation_cursor_size = 1;
- state->m_VideoULA_CR = 7;
- state->m_VideoULA_CR_counter = 0;
+ m_VideoULA_CR = 7;
+ m_VideoULA_CR_counter = 0;
- set_pixel_lookup(state);
+ set_pixel_lookup();
- state->m_BBC_Video_RAM = state->memregion("maincpu")->base();
- state->m_memorySize=memorySize;
+ m_BBC_Video_RAM = m_region_maincpu->base();
+ m_memorySize=memorySize;
}
VIDEO_START_MEMBER(bbc_state,bbca)
{
- common_init(machine(),16);
+ common_init(16);
}
VIDEO_START_MEMBER(bbc_state,bbcb)
{
- common_init(machine(),32);
+ common_init(32);
}
VIDEO_START_MEMBER(bbc_state,bbcbp)
{
- common_init(machine(),32);
+ common_init(32);
}
VIDEO_START_MEMBER(bbc_state,bbcm)
{
- common_init(machine(),32);
+ common_init(32);
}
@@ -582,53 +576,26 @@ static void BBC_Set_CRE(running_machine &machine, int offset, int data)
WRITE8_MEMBER(bbc_state::bbc_6845_w)
{
- mc6845_device *mc6845 = machine().device<mc6845_device>("mc6845");
- switch(offset & 1)
- {
- case 0 :
- mc6845->address_w(space,0,data);
- break;
- case 1 :
- mc6845->register_w(space,0,data);
- break;
- }
- return;
-
- switch (offset&1)
- {
- case 0:
- m6845_address_w(0,data);
- break;
- case 1:
- m6845_register_w(0,data);
- break;
- }
-
+ switch(offset & 1)
+ {
+ case 0 :
+ m_mc6845->address_w(space,0,data);
+ break;
+ case 1 :
+ m_mc6845->register_w(space,0,data);
+ break;
+ }
}
+
READ8_HANDLER (bbc_6845_r)
{
-
- mc6845_device *mc6845 = space.machine().device<mc6845_device>("mc6845");
-
- switch (offset&1)
- {
- case 0: return mc6845->status_r(space,0); break;
- case 1: return mc6845->register_r(space,0); break;
- }
- return 0;
-
- int retval=0;
-
- switch (offset&1)
- {
- case 0:
- break;
- case 1:
- retval=m6845_register_r(0);
- break;
- }
- return retval;
+ switch (offset&1)
+ {
+ case 0: return m_mc6845->status_r(space,0); break;
+ case 1: return m_mc6845->register_r(space,0); break;
+ }
+ return 0;
}
@@ -638,8 +605,7 @@ WRITE8_MEMBER(bbc_state::bbc_6845_w)
UINT32 bbc_state::screen_update_bbc(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- mc6845_device *mc6845 = machine().device<mc6845_device>("mc6845");
- mc6845->update( bitmap, cliprect);
+ m_mc6845->update( bitmap, cliprect);
return 0;