(MESS) Cleaned up tagmap usage in the spectrum drivers a bit. (nw)

This commit is contained in:
Wilbert Pol 2013-02-07 20:55:30 +00:00
parent bdcf0dd2a8
commit 46ef255061
11 changed files with 339 additions and 326 deletions

View File

@ -26,26 +26,24 @@ class atm_state : public spectrum_state
public:
atm_state(const machine_config &mconfig, device_type type, const char *tag)
: spectrum_state(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_bank1(*this, "bank1")
, m_bank2(*this, "bank2")
, m_bank3(*this, "bank3")
, m_bank4(*this, "bank4")
, m_beta(*this, BETA_DISK_TAG)
, m_ram(*this, RAM_TAG)
{ }
DECLARE_WRITE8_MEMBER(atm_port_7ffd_w);
DIRECT_UPDATE_MEMBER(atm_direct);
DECLARE_MACHINE_RESET(atm);
protected:
required_device<cpu_device> m_maincpu;
required_memory_bank m_bank1;
required_memory_bank m_bank2;
required_memory_bank m_bank3;
required_memory_bank m_bank4;
required_device<device_t> m_beta;
required_device<ram_device> m_ram;
private:
UINT8 *m_p_ram;
void atm_update_memory();

View File

@ -34,7 +34,14 @@ class elwro800_state : public spectrum_state
{
public:
elwro800_state(const machine_config &mconfig, device_type type, const char *tag)
: spectrum_state(mconfig, type, tag) { }
: spectrum_state(mconfig, type, tag)
, m_i8251(*this, "i8251")
, m_i8255(*this, "ppi8255")
, m_centronics(*this, "centronics")
, m_io_line8(*this, "LINE8")
, m_io_line9(*this, "LINE9")
, m_io_network_id(*this, "NETWORK ID")
{ }
/* for elwro800 */
/* RAM mapped at 0 */
@ -52,6 +59,16 @@ public:
INTERRUPT_GEN_MEMBER(elwro800jr_interrupt);
DECLARE_READ8_MEMBER(i8255_port_c_r);
DECLARE_WRITE8_MEMBER(i8255_port_c_w);
protected:
required_device<i8251_device> m_i8251;
required_device<i8255_device> m_i8255;
required_device<centronics_device> m_centronics;
required_ioport m_io_line8;
required_ioport m_io_line9;
required_ioport m_io_network_id;
void elwro800jr_mmu_w(UINT8 data);
};
@ -80,15 +97,13 @@ DIRECT_UPDATE_MEMBER(elwro800_state::elwro800_direct_handler)
WRITE8_MEMBER(elwro800_state::elwro800jr_fdc_control_w)
{
upd765a_device *fdc = machine().device<upd765a_device>("upd765");
m_upd765_0->get_device()->mon_w(!BIT(data, 0));
m_upd765_1->get_device()->mon_w(!BIT(data, 1));
machine().device<floppy_connector>("upd765:0")->get_device()->mon_w(!BIT(data, 0));
machine().device<floppy_connector>("upd765:1")->get_device()->mon_w(!BIT(data, 1));
fdc->tc_w(data & 0x04);
m_upd765->tc_w(data & 0x04);
if(!(data & 8))
fdc->reset();
m_upd765->reset();
}
/*************************************
@ -97,13 +112,12 @@ WRITE8_MEMBER(elwro800_state::elwro800jr_fdc_control_w)
*
*************************************/
static void elwro800jr_mmu_w(running_machine &machine, UINT8 data)
void elwro800_state::elwro800jr_mmu_w(UINT8 data)
{
UINT8 *prom = machine.root_device().memregion("proms")->base() + 0x200;
UINT8 *messram = machine.device<ram_device>(RAM_TAG)->pointer();
UINT8 *prom = memregion("proms")->base() + 0x200;
UINT8 *messram = m_ram->pointer();
UINT8 cs;
UINT8 ls175;
elwro800_state *state = machine.driver_data<elwro800_state>();
ls175 = BITSWAP8(data, 7, 6, 5, 4, 4, 5, 7, 6) & 0x0f;
@ -111,48 +125,48 @@ static void elwro800jr_mmu_w(running_machine &machine, UINT8 data)
if (!BIT(cs,0))
{
// rom BAS0
state->membank("bank1")->set_base(state->memregion("maincpu")->base() + 0x0000); /* BAS0 ROM */
machine.device("maincpu")->memory().space(AS_PROGRAM).nop_write(0x0000, 0x1fff);
state->m_ram_at_0000 = 0;
membank("bank1")->set_base(memregion("maincpu")->base() + 0x0000); /* BAS0 ROM */
m_maincpu->space(AS_PROGRAM).nop_write(0x0000, 0x1fff);
m_ram_at_0000 = 0;
}
else if (!BIT(cs,4))
{
// rom BOOT
state->membank("bank1")->set_base(machine.root_device().memregion("maincpu")->base() + 0x4000); /* BOOT ROM */
machine.device("maincpu")->memory().space(AS_PROGRAM).nop_write(0x0000, 0x1fff);
state->m_ram_at_0000 = 0;
membank("bank1")->set_base(memregion("maincpu")->base() + 0x4000); /* BOOT ROM */
m_maincpu->space(AS_PROGRAM).nop_write(0x0000, 0x1fff);
m_ram_at_0000 = 0;
}
else
{
// RAM
state->membank("bank1")->set_base(messram);
machine.device("maincpu")->memory().space(AS_PROGRAM).install_write_bank(0x0000, 0x1fff, "bank1");
state->m_ram_at_0000 = 1;
membank("bank1")->set_base(messram);
m_maincpu->space(AS_PROGRAM).install_write_bank(0x0000, 0x1fff, "bank1");
m_ram_at_0000 = 1;
}
cs = prom[((0x2000 >> 10) | (ls175 << 6)) & 0x1ff];
if (!BIT(cs,1))
{
state->membank("bank2")->set_base(machine.root_device().memregion("maincpu")->base() + 0x2000); /* BAS1 ROM */
machine.device("maincpu")->memory().space(AS_PROGRAM).nop_write(0x2000, 0x3fff);
membank("bank2")->set_base(memregion("maincpu")->base() + 0x2000); /* BAS1 ROM */
m_maincpu->space(AS_PROGRAM).nop_write(0x2000, 0x3fff);
}
else
{
state->membank("bank2")->set_base(messram + 0x2000); /* RAM */
machine.device("maincpu")->memory().space(AS_PROGRAM).install_write_bank(0x2000, 0x3fff, "bank2");
membank("bank2")->set_base(messram + 0x2000); /* RAM */
m_maincpu->space(AS_PROGRAM).install_write_bank(0x2000, 0x3fff, "bank2");
}
if (BIT(ls175,2))
{
// relok
state->m_screen_location = messram + 0xe000;
m_screen_location = messram + 0xe000;
}
else
{
state->m_screen_location = messram + 0x4000;
m_screen_location = messram + 0x4000;
}
state->m_NR = BIT(ls175,3);
m_NR = BIT(ls175,3);
if (BIT(ls175,3))
{
logerror("Reading network number\n");
@ -167,14 +181,12 @@ static void elwro800jr_mmu_w(running_machine &machine, UINT8 data)
READ8_MEMBER(elwro800_state::i8255_port_c_r)
{
centronics_device *centronics = machine().device<centronics_device>("centronics");
return (centronics->ack_r() << 2);
return (m_centronics->ack_r() << 2);
}
WRITE8_MEMBER(elwro800_state::i8255_port_c_w)
{
centronics_device *centronics = machine().device<centronics_device>("centronics");
centronics->strobe_w((data >> 7) & 0x01);
m_centronics->strobe_w((data >> 7) & 0x01);
}
static I8255_INTERFACE(elwro800jr_ppi8255_interface)
@ -227,7 +239,7 @@ READ8_MEMBER(elwro800_state::elwro800jr_io_r)
int mask = 0x8000;
int data = 0xff;
int i;
char port_name[6] = "LINE0";
ioport_port *io_ports[9] = { m_io_line7, m_io_line6, m_io_line5, m_io_line4, m_io_line3, m_io_line2, m_io_line1, m_io_line0, m_io_line8 };
if ( !m_NR )
{
@ -235,32 +247,24 @@ READ8_MEMBER(elwro800_state::elwro800jr_io_r)
{
if (!(offset & mask))
{
if (i == 8)
{
port_name[4] = '8';
}
else
{
port_name[4] = '0' + (7 - i);
}
data &= (ioport(port_name)->read());
data &= io_ports[i]->read();
}
}
if ((offset & 0xff) == 0xfb)
{
data &= ioport("LINE9")->read();
data &= m_io_line9->read();
}
/* cassette input from wav */
if ((machine().device<cassette_image_device>(CASSETTE_TAG))->input() > 0.0038 )
if (m_cassette->input() > 0.0038 )
{
data &= ~0x40;
}
}
else
{
data = ioport("NETWORK ID")->read();
data = m_io_network_id->read();
}
return data;
@ -272,33 +276,30 @@ READ8_MEMBER(elwro800_state::elwro800jr_io_r)
else if (!BIT(cs,2))
{
// CS55
i8255_device *ppi = machine().device<i8255_device>("ppi8255");
return ppi->read(space, (offset & 0x03) ^ 0x03);
return m_i8255->read(space, (offset & 0x03) ^ 0x03);
}
else if (!BIT(cs,3))
{
// CSFDC
upd765a_device *fdc = machine().device<upd765a_device>("upd765");
if (offset & 1)
{
return fdc->fifo_r(space, 0, 0xff);
return m_upd765->fifo_r(space, 0, 0xff);
}
else
{
return fdc->msr_r(space, 0, 0xff);
return m_upd765->msr_r(space, 0, 0xff);
}
}
else if (!BIT(cs,4))
{
// CS51
i8251_device *usart = machine().device<i8251_device>("i8251");
if (offset & 1)
{
return usart->status_r(space, 0);
return m_i8251->status_r(space, 0);
}
else
{
return usart->data_r(space, 0);
return m_i8251->data_r(space, 0);
}
}
else if (!BIT(cs,5))
@ -325,34 +326,31 @@ WRITE8_MEMBER(elwro800_state::elwro800jr_io_w)
else if (!BIT(cs,1))
{
// CF7
elwro800jr_mmu_w(machine(), data);
elwro800jr_mmu_w(data);
}
else if (!BIT(cs,2))
{
// CS55
i8255_device *ppi = machine().device<i8255_device>("ppi8255");
ppi->write(space, (offset & 0x03) ^ 0x03, data);
m_i8255->write(space, (offset & 0x03) ^ 0x03, data);
}
else if (!BIT(cs,3))
{
// CSFDC
upd765a_device *fdc = machine().device<upd765a_device>("upd765");
if (offset & 1)
{
fdc->fifo_w(space, 0, data, 0xff);
m_upd765->fifo_w(space, 0, data, 0xff);
}
}
else if (!BIT(cs,4))
{
// CS51
i8251_device *usart = machine().device<i8251_device>("i8251");
if (offset & 1)
{
usart->control_w(space, 0, data);
m_i8251->control_w(space, 0, data);
}
else
{
usart->data_w(space, 0, data);
m_i8251->data_w(space, 0, data);
}
}
else if (!BIT(cs,5))
@ -502,7 +500,7 @@ INPUT_PORTS_END
MACHINE_RESET_MEMBER(elwro800_state,elwro800)
{
UINT8 *messram = machine().device<ram_device>(RAM_TAG)->pointer();
UINT8 *messram = m_ram->pointer();
m_df_on_databus = 0xdf;
memset(messram, 0, 64*1024);
@ -513,9 +511,9 @@ MACHINE_RESET_MEMBER(elwro800_state,elwro800)
m_port_1ffd_data = -1;
// this is a reset of ls175 in mmu
elwro800jr_mmu_w(machine(), 0);
elwro800jr_mmu_w(0);
machine().device("maincpu")->memory().space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate(FUNC(elwro800_state::elwro800_direct_handler), this));
m_maincpu->space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate(FUNC(elwro800_state::elwro800_direct_handler), this));
}
static const cassette_interface elwro800jr_cassette_interface =

View File

@ -14,13 +14,11 @@ class pentagon_state : public spectrum_state
public:
pentagon_state(const machine_config &mconfig, device_type type, const char *tag)
: spectrum_state(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_bank1(*this, "bank1")
, m_bank2(*this, "bank2")
, m_bank3(*this, "bank3")
, m_bank4(*this, "bank4")
, m_beta(*this, BETA_DISK_TAG)
, m_ram(*this, RAM_TAG)
{ }
DECLARE_DIRECT_UPDATE_MEMBER(pentagon_direct);
@ -28,13 +26,11 @@ public:
DECLARE_MACHINE_RESET(pentagon);
protected:
required_device<cpu_device> m_maincpu;
required_memory_bank m_bank1;
required_memory_bank m_bank2;
required_memory_bank m_bank3;
required_memory_bank m_bank4;
required_device<device_t> m_beta;
required_device<ram_device> m_ram;
private:
UINT8 *m_p_ram;
void pentagon_update_memory();

View File

@ -160,13 +160,11 @@ class scorpion_state : public spectrum_state
public:
scorpion_state(const machine_config &mconfig, device_type type, const char *tag)
: spectrum_state(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_bank1(*this, "bank1")
, m_bank2(*this, "bank2")
, m_bank3(*this, "bank3")
, m_bank4(*this, "bank4")
, m_beta(*this, BETA_DISK_TAG)
, m_ram(*this, RAM_TAG)
{ }
DECLARE_DIRECT_UPDATE_MEMBER(scorpion_direct);
@ -177,13 +175,11 @@ public:
DECLARE_MACHINE_RESET(scorpion);
TIMER_DEVICE_CALLBACK_MEMBER(nmi_check_callback);
protected:
required_device<cpu_device> m_maincpu;
required_memory_bank m_bank1;
required_memory_bank m_bank2;
required_memory_bank m_bank3;
required_memory_bank m_bank4;
required_device<device_t> m_beta;
required_device<ram_device> m_ram;
private:
UINT8 *m_p_ram;
void scorpion_update_memory();
@ -288,7 +284,7 @@ DIRECT_UPDATE_MEMBER(scorpion_state::scorpion_direct)
TIMER_DEVICE_CALLBACK_MEMBER(scorpion_state::nmi_check_callback)
{
if ((machine().root_device().ioport("NMI")->read() & 1)==1)
if ((m_io_nmi->read() & 1)==1)
{
m_port_1ffd_data |= 0x02;
scorpion_update_memory();

View File

@ -169,40 +169,37 @@ static const ay8910_interface spectrum_ay_interface =
/****************************************************************************************************/
/* Spectrum 128 specific functions */
static WRITE8_HANDLER(spectrum_128_port_7ffd_w)
WRITE8_MEMBER(spectrum_state::spectrum_128_port_7ffd_w)
{
spectrum_state *state = space.machine().driver_data<spectrum_state>();
/* D0-D2: RAM page located at 0x0c000-0x0ffff */
/* D3 - Screen select (screen 0 in ram page 5, screen 1 in ram page 7 */
/* D4 - ROM select - which rom paged into 0x0000-0x03fff */
/* D5 - Disable paging */
/* disable paging? */
if (state->m_port_7ffd_data & 0x20)
if (m_port_7ffd_data & 0x20)
return;
/* store new state */
state->m_port_7ffd_data = data;
m_port_7ffd_data = data;
/* update memory */
spectrum_128_update_memory(space.machine());
spectrum_128_update_memory();
}
void spectrum_128_update_memory(running_machine &machine)
void spectrum_state::spectrum_128_update_memory()
{
spectrum_state *state = machine.driver_data<spectrum_state>();
UINT8 *messram = machine.device<ram_device>(RAM_TAG)->pointer();
UINT8 *messram = m_ram->pointer();
unsigned char *ChosenROM;
int ROMSelection;
if (state->m_port_7ffd_data & 8)
if (m_port_7ffd_data & 8)
{
state->m_screen_location = messram + (7<<14);
m_screen_location = messram + (7<<14);
}
else
{
state->m_screen_location = messram + (5<<14);
m_screen_location = messram + (5<<14);
}
/* select ram at 0x0c000-0x0ffff */
@ -210,28 +207,27 @@ void spectrum_128_update_memory(running_machine &machine)
int ram_page;
unsigned char *ram_data;
ram_page = state->m_port_7ffd_data & 0x07;
ram_page = m_port_7ffd_data & 0x07;
ram_data = messram + (ram_page<<14);
state->membank("bank4")->set_base(ram_data);
membank("bank4")->set_base(ram_data);
}
/* ROM switching */
ROMSelection = ((state->m_port_7ffd_data>>4) & 0x01);
ROMSelection = ((m_port_7ffd_data>>4) & 0x01);
/* rom 0 is 128K rom, rom 1 is 48 BASIC */
ChosenROM = machine.root_device().memregion("maincpu")->base() + 0x010000 + (ROMSelection<<14);
ChosenROM = memregion("maincpu")->base() + 0x010000 + (ROMSelection<<14);
state->membank("bank1")->set_base(ChosenROM);
membank("bank1")->set_base(ChosenROM);
}
static READ8_HANDLER ( spectrum_128_ula_r )
READ8_MEMBER( spectrum_state::spectrum_128_ula_r )
{
spectrum_state *state = space.machine().driver_data<spectrum_state>();
int vpos = space.machine().primary_screen->vpos();
int vpos = machine().primary_screen->vpos();
return vpos<193 ? state->m_screen_location[0x1800|(vpos&0xf8)<<2]:0xff;
return vpos<193 ? m_screen_location[0x1800|(vpos&0xf8)<<2]:0xff;
}
static ADDRESS_MAP_START (spectrum_128_io, AS_IO, 8, spectrum_state )
@ -239,10 +235,10 @@ static ADDRESS_MAP_START (spectrum_128_io, AS_IO, 8, spectrum_state )
AM_RANGE(0x001f, 0x001f) AM_READ(spectrum_port_1f_r) AM_MIRROR(0xff00)
AM_RANGE(0x007f, 0x007f) AM_READ(spectrum_port_7f_r) AM_MIRROR(0xff00)
AM_RANGE(0x00df, 0x00df) AM_READ(spectrum_port_df_r) AM_MIRROR(0xff00)
AM_RANGE(0x4000, 0x4000) AM_WRITE_LEGACY(spectrum_128_port_7ffd_w) AM_MIRROR(0x3ffd)
AM_RANGE(0x4000, 0x4000) AM_WRITE(spectrum_128_port_7ffd_w) AM_MIRROR(0x3ffd)
AM_RANGE(0x8000, 0x8000) AM_DEVWRITE_LEGACY("ay8912", ay8910_data_w) AM_MIRROR(0x3ffd)
AM_RANGE(0xc000, 0xc000) AM_DEVREADWRITE_LEGACY("ay8912", ay8910_r, ay8910_address_w) AM_MIRROR(0x3ffd)
AM_RANGE(0x0001, 0x0001) AM_READ_LEGACY(spectrum_128_ula_r) AM_MIRROR(0xfffe)
AM_RANGE(0x0001, 0x0001) AM_READ(spectrum_128_ula_r) AM_MIRROR(0xfffe)
ADDRESS_MAP_END
static ADDRESS_MAP_START (spectrum_128_mem, AS_PROGRAM, 8, spectrum_state )
@ -254,7 +250,7 @@ ADDRESS_MAP_END
MACHINE_RESET_MEMBER(spectrum_state,spectrum_128)
{
UINT8 *messram = machine().device<ram_device>(RAM_TAG)->pointer();
UINT8 *messram = m_ram->pointer();
memset(messram,0,128*1024);
/* 0x0000-0x3fff always holds ROM */
@ -270,7 +266,7 @@ MACHINE_RESET_MEMBER(spectrum_state,spectrum_128)
/* set initial ram config */
m_port_7ffd_data = 0;
m_port_1ffd_data = -1;
spectrum_128_update_memory(machine());
spectrum_128_update_memory();
}
/* F4 Character Displayer */

View File

@ -172,51 +172,47 @@ static const int spectrum_plus3_memory_selections[]=
4,7,6,3
};
static WRITE8_HANDLER(spectrum_plus3_port_3ffd_w)
WRITE8_MEMBER( spectrum_state::spectrum_plus3_port_3ffd_w )
{
spectrum_state *state = space.machine().driver_data<spectrum_state>();
if (state->m_floppy==1)
space.machine().device<upd765a_device>("upd765")->fifo_w(space, 0, data, 0xff);
if (m_floppy==1)
m_upd765->fifo_w(space, 0, data, 0xff);
}
static READ8_HANDLER(spectrum_plus3_port_3ffd_r)
READ8_MEMBER( spectrum_state::spectrum_plus3_port_3ffd_r )
{
spectrum_state *state = space.machine().driver_data<spectrum_state>();
if (state->m_floppy==0)
if (m_floppy==0)
return 0xff;
else
return space.machine().device<upd765a_device>("upd765")->fifo_r(space, 0, 0xff);
return m_upd765->fifo_r(space, 0, 0xff);
}
static READ8_HANDLER(spectrum_plus3_port_2ffd_r)
READ8_MEMBER( spectrum_state::spectrum_plus3_port_2ffd_r )
{
spectrum_state *state = space.machine().driver_data<spectrum_state>();
if (state->m_floppy==0)
if (m_floppy==0)
return 0xff;
else
return space.machine().device<upd765a_device>("upd765")->msr_r(space, 0, 0xff);
return m_upd765->msr_r(space, 0, 0xff);
}
void spectrum_plus3_update_memory(running_machine &machine)
void spectrum_state::spectrum_plus3_update_memory()
{
spectrum_state *state = machine.driver_data<spectrum_state>();
address_space &space = machine.device("maincpu")->memory().space(AS_PROGRAM);
UINT8 *messram = machine.device<ram_device>(RAM_TAG)->pointer();
address_space &space = m_maincpu->space(AS_PROGRAM);
UINT8 *messram = m_ram->pointer();
if (state->m_port_7ffd_data & 8)
if (m_port_7ffd_data & 8)
{
logerror("+3 SCREEN 1: BLOCK 7\n");
state->m_screen_location = messram + (7 << 14);
m_screen_location = messram + (7 << 14);
}
else
{
logerror("+3 SCREEN 0: BLOCK 5\n");
state->m_screen_location = messram + (5 << 14);
m_screen_location = messram + (5 << 14);
}
if ((state->m_port_1ffd_data & 0x01) == 0)
if ((m_port_1ffd_data & 0x01) == 0)
{
int ram_page;
unsigned char *ram_data;
@ -226,29 +222,29 @@ void spectrum_plus3_update_memory(running_machine &machine)
int ROMSelection;
/* select ram at 0x0c000-0x0ffff */
ram_page = state->m_port_7ffd_data & 0x07;
ram_page = m_port_7ffd_data & 0x07;
ram_data = messram + (ram_page<<14);
state->membank("bank4")->set_base(ram_data);
membank("bank4")->set_base(ram_data);
logerror("RAM at 0xc000: %02x\n", ram_page);
/* Reset memory between 0x4000 - 0xbfff in case extended paging was being used */
/* Bank 5 in 0x4000 - 0x7fff */
state->membank("bank2")->set_base(messram + (5 << 14));
membank("bank2")->set_base(messram + (5 << 14));
/* Bank 2 in 0x8000 - 0xbfff */
state->membank("bank3")->set_base(messram + (2 << 14));
membank("bank3")->set_base(messram + (2 << 14));
ROMSelection = ((state->m_port_7ffd_data >> 4) & 0x01) |
((state->m_port_1ffd_data >> 1) & 0x02);
ROMSelection = ((m_port_7ffd_data >> 4) & 0x01) |
((m_port_1ffd_data >> 1) & 0x02);
/* rom 0 is editor, rom 1 is syntax, rom 2 is DOS, rom 3 is 48 BASIC */
ChosenROM = machine.root_device().memregion("maincpu")->base() + 0x010000 + (ROMSelection << 14);
ChosenROM = memregion("maincpu")->base() + 0x010000 + (ROMSelection << 14);
state->membank("bank1")->set_base(ChosenROM);
membank("bank1")->set_base(ChosenROM);
space.unmap_write(0x0000, 0x3fff);
logerror("rom switch: %02x\n", ROMSelection);
@ -261,23 +257,23 @@ void spectrum_plus3_update_memory(running_machine &machine)
int MemorySelection;
unsigned char *ram_data;
MemorySelection = (state->m_port_1ffd_data >> 1) & 0x03;
MemorySelection = (m_port_1ffd_data >> 1) & 0x03;
memory_selection = &spectrum_plus3_memory_selections[(MemorySelection << 2)];
ram_data = messram + (memory_selection[0] << 14);
state->membank("bank1")->set_base(ram_data);
membank("bank1")->set_base(ram_data);
/* allow writes to 0x0000-0x03fff */
space.install_write_bank(0x0000, 0x3fff, "bank1");
ram_data = messram + (memory_selection[1] << 14);
state->membank("bank2")->set_base(ram_data);
membank("bank2")->set_base(ram_data);
ram_data = messram + (memory_selection[2] << 14);
state->membank("bank3")->set_base(ram_data);
membank("bank3")->set_base(ram_data);
ram_data = messram + (memory_selection[3] << 14);
state->membank("bank4")->set_base(ram_data);
membank("bank4")->set_base(ram_data);
logerror("extended memory paging: %02x\n", MemorySelection);
}
@ -285,45 +281,41 @@ void spectrum_plus3_update_memory(running_machine &machine)
static WRITE8_HANDLER(spectrum_plus3_port_7ffd_w)
WRITE8_MEMBER( spectrum_state::spectrum_plus3_port_7ffd_w )
{
/* D0-D2: RAM page located at 0x0c000-0x0ffff */
/* D3 - Screen select (screen 0 in ram page 5, screen 1 in ram page 7 */
/* D4 - ROM select - which rom paged into 0x0000-0x03fff */
/* D5 - Disable paging */
spectrum_state *state = space.machine().driver_data<spectrum_state>();
/* disable paging? */
if (state->m_port_7ffd_data & 0x20)
if (m_port_7ffd_data & 0x20)
return;
/* store new state */
state->m_port_7ffd_data = data;
m_port_7ffd_data = data;
/* update memory */
spectrum_plus3_update_memory(space.machine());
spectrum_plus3_update_memory();
}
static WRITE8_HANDLER(spectrum_plus3_port_1ffd_w)
WRITE8_HANDLER( spectrum_state::spectrum_plus3_port_1ffd_w )
{
/* D0-D1: ROM/RAM paging */
/* D2: Affects if d0-d1 work on ram/rom */
/* D3 - Disk motor on/off */
/* D4 - parallel port strobe */
spectrum_state *state = space.machine().driver_data<spectrum_state>();
m_upd765_0->get_device()->mon_w(!BIT(data, 3));
m_upd765_1->get_device()->mon_w(!BIT(data, 3));
space.machine().device<floppy_connector>("upd765:0")->get_device()->mon_w(!BIT(data, 3));
space.machine().device<floppy_connector>("upd765:1")->get_device()->mon_w(!BIT(data, 3));
state->m_port_1ffd_data = data;
m_port_1ffd_data = data;
/* disable paging? */
if ((state->m_port_7ffd_data & 0x20)==0)
if ((m_port_7ffd_data & 0x20)==0)
{
/* no */
spectrum_plus3_update_memory(space.machine());
spectrum_plus3_update_memory();
}
}
@ -333,17 +325,17 @@ static ADDRESS_MAP_START (spectrum_plus3_io, AS_IO, 8, spectrum_state )
ADDRESS_MAP_UNMAP_HIGH
AM_RANGE(0x0000, 0x0000) AM_READWRITE(spectrum_port_fe_r,spectrum_port_fe_w) AM_MIRROR(0xfffe) AM_MASK(0xffff)
AM_RANGE(0x001f, 0x001f) AM_READ(spectrum_port_1f_r) AM_MIRROR(0xff00)
AM_RANGE(0x4000, 0x4000) AM_WRITE_LEGACY(spectrum_plus3_port_7ffd_w) AM_MIRROR(0x3ffd)
AM_RANGE(0x4000, 0x4000) AM_WRITE(spectrum_plus3_port_7ffd_w) AM_MIRROR(0x3ffd)
AM_RANGE(0x8000, 0x8000) AM_DEVWRITE_LEGACY("ay8912", ay8910_data_w) AM_MIRROR(0x3ffd)
AM_RANGE(0xc000, 0xc000) AM_DEVREADWRITE_LEGACY("ay8912", ay8910_r, ay8910_address_w) AM_MIRROR(0x3ffd)
AM_RANGE(0x1000, 0x1000) AM_WRITE_LEGACY(spectrum_plus3_port_1ffd_w) AM_MIRROR(0x0ffd)
AM_RANGE(0x2000, 0x2000) AM_READ_LEGACY(spectrum_plus3_port_2ffd_r) AM_MIRROR(0x0ffd)
AM_RANGE(0x3000, 0x3000) AM_READWRITE_LEGACY(spectrum_plus3_port_3ffd_r,spectrum_plus3_port_3ffd_w) AM_MIRROR(0x0ffd)
AM_RANGE(0x1000, 0x1000) AM_WRITE(spectrum_plus3_port_1ffd_w) AM_MIRROR(0x0ffd)
AM_RANGE(0x2000, 0x2000) AM_READ(spectrum_plus3_port_2ffd_r) AM_MIRROR(0x0ffd)
AM_RANGE(0x3000, 0x3000) AM_READWRITE(spectrum_plus3_port_3ffd_r,spectrum_plus3_port_3ffd_w) AM_MIRROR(0x0ffd)
ADDRESS_MAP_END
MACHINE_RESET_MEMBER(spectrum_state,spectrum_plus3)
{
UINT8 *messram = machine().device<ram_device>(RAM_TAG)->pointer();
UINT8 *messram = m_ram->pointer();
memset(messram,0,128*1024);
MACHINE_RESET_CALL_MEMBER(spectrum);
@ -351,7 +343,7 @@ MACHINE_RESET_MEMBER(spectrum_state,spectrum_plus3)
/* Initial configuration */
m_port_7ffd_data = 0;
m_port_1ffd_data = 0;
spectrum_plus3_update_memory(machine());
spectrum_plus3_update_memory();
}
DRIVER_INIT_MEMBER(spectrum_state,plus3)

View File

@ -275,13 +275,8 @@ SamRam
#include "emu.h"
#include "cpu/z80/z80.h"
#include "sound/speaker.h"
#include "sound/wave.h"
#include "includes/spectrum.h"
#include "imagedev/snapquik.h"
#include "imagedev/cartslot.h"
#include "imagedev/cassette.h"
#include "machine/ram.h"
#include "formats/tzx_cas.h"
#include "formats/spec_snqk.h"
@ -298,7 +293,6 @@ SamRam
WRITE8_MEMBER(spectrum_state::spectrum_port_fe_w)
{
device_t *speaker = machine().device(SPEAKER_TAG);
unsigned char Changed;
Changed = m_port_fe_data^data;
@ -306,19 +300,19 @@ WRITE8_MEMBER(spectrum_state::spectrum_port_fe_w)
/* border colour changed? */
if ((Changed & 0x07)!=0)
{
spectrum_UpdateBorderBitmap(machine());
spectrum_UpdateBorderBitmap();
}
if ((Changed & (1<<4))!=0)
{
/* DAC output state */
speaker_level_w(speaker,(data>>4) & 0x01);
speaker_level_w(m_speaker,(data>>4) & 0x01);
}
if ((Changed & (1<<3))!=0)
{
/* write cassette data */
machine().device<cassette_image_device>(CASSETTE_TAG)->output((data & (1<<3)) ? -1.0 : +1.0);
m_cassette->output((data & (1<<3)) ? -1.0 : +1.0);
}
m_port_fe_data = data;
@ -333,16 +327,16 @@ READ8_MEMBER(spectrum_state::spectrum_port_fe_r)
int lines = offset >> 8;
int data = 0xff;
int cs_extra1 = ioport("PLUS0")->read_safe(0xff) & 0x1f;
int cs_extra2 = ioport("PLUS1")->read_safe(0xff) & 0x1f;
int cs_extra3 = ioport("PLUS2")->read_safe(0xff) & 0x1f;
int ss_extra1 = ioport("PLUS3")->read_safe(0xff) & 0x1f;
int ss_extra2 = ioport("PLUS4")->read_safe(0xff) & 0x1f;
int cs_extra1 = m_io_plus0 ? m_io_plus0->read() & 0x1f : 0x1f;
int cs_extra2 = m_io_plus1 ? m_io_plus1->read() & 0x1f : 0x1f;
int cs_extra3 = m_io_plus2 ? m_io_plus2->read() & 0x1f : 0x1f;
int ss_extra1 = m_io_plus3 ? m_io_plus3->read() & 0x1f : 0x1f;
int ss_extra2 = m_io_plus4 ? m_io_plus4->read() & 0x1f : 0x1f;
/* Caps - V */
if ((lines & 1) == 0)
{
data &= ioport("LINE0")->read();
data &= m_io_line0->read();
/* CAPS for extra keys */
if (cs_extra1 != 0x1f || cs_extra2 != 0x1f || cs_extra3 != 0x1f)
data &= ~0x01;
@ -350,32 +344,32 @@ READ8_MEMBER(spectrum_state::spectrum_port_fe_r)
/* A - G */
if ((lines & 2) == 0)
data &= ioport("LINE1")->read();
data &= m_io_line1->read();
/* Q - T */
if ((lines & 4) == 0)
data &= ioport("LINE2")->read();
data &= m_io_line2->read();
/* 1 - 5 */
if ((lines & 8) == 0)
data &= ioport("LINE3")->read() & cs_extra1;
data &= m_io_line3->read() & cs_extra1;
/* 6 - 0 */
if ((lines & 16) == 0)
data &= ioport("LINE4")->read() & cs_extra2;
data &= m_io_line4->read() & cs_extra2;
/* Y - P */
if ((lines & 32) == 0)
data &= ioport("LINE5")->read() & ss_extra1;
data &= m_io_line5->read() & ss_extra1;
/* H - Enter */
if ((lines & 64) == 0)
data &= ioport("LINE6")->read();
data &= m_io_line6->read();
/* B - Space */
if ((lines & 128) == 0)
{
data &= ioport("LINE7")->read() & cs_extra3 & ss_extra2;
data &= m_io_line7->read() & cs_extra3 & ss_extra2;
/* SYMBOL SHIFT for extra keys */
if (ss_extra1 != 0x1f || ss_extra2 != 0x1f)
data &= ~0x02;
@ -384,14 +378,14 @@ READ8_MEMBER(spectrum_state::spectrum_port_fe_r)
data |= (0xe0); /* Set bits 5-7 - as reset above */
/* cassette input from wav */
if ((machine().device<cassette_image_device>(CASSETTE_TAG))->input() > 0.0038 )
if (m_cassette->input() > 0.0038 )
{
data &= ~0x40;
}
/* Issue 2 Spectrums default to having bits 5, 6 & 7 set.
Issue 3 Spectrums default to having bits 5 & 7 set and bit 6 reset. */
if (ioport("CONFIG")->read() & 0x80)
if (m_io_config->read() & 0x80)
data ^= (0x40);
return data;
@ -400,19 +394,19 @@ READ8_MEMBER(spectrum_state::spectrum_port_fe_r)
/* kempston joystick interface */
READ8_MEMBER(spectrum_state::spectrum_port_1f_r)
{
return ioport("KEMPSTON")->read() & 0x1f;
return m_io_kempston->read() & 0x1f;
}
/* fuller joystick interface */
READ8_MEMBER(spectrum_state::spectrum_port_7f_r)
{
return ioport("FULLER")->read() | (0xff^0x8f);
return m_io_fuller->read() | (0xff^0x8f);
}
/* mikrogen joystick interface */
READ8_MEMBER(spectrum_state::spectrum_port_df_r)
{
return ioport("MIKROGEN")->read() | (0xff^0x1f);
return m_io_mikrogen->read() | (0xff^0x1f);
}
READ8_MEMBER(spectrum_state::spectrum_port_ula_r)
@ -613,9 +607,9 @@ INPUT_PORTS_END
DRIVER_INIT_MEMBER(spectrum_state,spectrum)
{
address_space &space = machine().device("maincpu")->memory().space(AS_PROGRAM);
address_space &space = m_maincpu->space(AS_PROGRAM);
switch (machine().device<ram_device>(RAM_TAG)->size())
switch (m_ram->size())
{
case 48*1024:
space.install_ram(0x8000, 0xffff, NULL); // Fall through
@ -677,7 +671,7 @@ DEVICE_IMAGE_LOAD_MEMBER( spectrum_state,spectrum_cart )
return IMAGE_INIT_FAIL;
}
if (image.fread(image.device().machine().root_device().memregion("maincpu")->base(), filesize) != filesize)
if (image.fread(memregion("maincpu")->base(), filesize) != filesize)
{
image.seterror(IMAGE_ERROR_UNSPECIFIED, "Error loading file");
return IMAGE_INIT_FAIL;
@ -686,7 +680,7 @@ DEVICE_IMAGE_LOAD_MEMBER( spectrum_state,spectrum_cart )
else
{
filesize = image.get_software_region_length("rom");
memcpy(image.device().machine().root_device().memregion("maincpu")->base(), image.get_software_region("rom"), filesize);
memcpy(memregion("maincpu")->base(), image.get_software_region("rom"), filesize);
}
return IMAGE_INIT_PASS;
}

View File

@ -169,29 +169,23 @@ static const ay8910_interface spectrum_ay_interface =
/* TS2048 specific functions */
static READ8_HANDLER(ts2068_port_f4_r)
READ8_MEMBER( spectrum_state::ts2068_port_f4_r )
{
spectrum_state *state = space.machine().driver_data<spectrum_state>();
return state->m_port_f4_data;
return m_port_f4_data;
}
static WRITE8_HANDLER(ts2068_port_f4_w)
WRITE8_MEMBER( spectrum_state::ts2068_port_f4_w )
{
spectrum_state *state = space.machine().driver_data<spectrum_state>();
state->m_port_f4_data = data;
ts2068_update_memory(space.machine());
m_port_f4_data = data;
ts2068_update_memory();
}
static READ8_HANDLER(ts2068_port_ff_r)
READ8_MEMBER( spectrum_state::ts2068_port_ff_r )
{
spectrum_state *state = space.machine().driver_data<spectrum_state>();
return state->m_port_ff_data;
return m_port_ff_data;
}
static WRITE8_HANDLER(ts2068_port_ff_w)
WRITE8_MEMBER( spectrum_state::ts2068_port_ff_w )
{
/* Bits 0-2 Video Mode Select
Bits 3-5 64 column mode ink/paper selection
@ -199,10 +193,8 @@ static WRITE8_HANDLER(ts2068_port_ff_w)
Bit 6 17ms Interrupt Inhibit
Bit 7 Cartridge (0) / EXROM (1) select
*/
spectrum_state *state = space.machine().driver_data<spectrum_state>();
state->m_port_ff_data = data;
ts2068_update_memory(space.machine());
m_port_ff_data = data;
ts2068_update_memory();
logerror("Port %04x write %02x\n", offset, data);
}
@ -224,33 +216,32 @@ static WRITE8_HANDLER(ts2068_port_ff_w)
* at the same time.
*
*******************************************************************/
void ts2068_update_memory(running_machine &machine)
void spectrum_state::ts2068_update_memory()
{
spectrum_state *state = machine.driver_data<spectrum_state>();
UINT8 *messram = machine.device<ram_device>(RAM_TAG)->pointer();
address_space &space = machine.device("maincpu")->memory().space(AS_PROGRAM);
UINT8 *messram = m_ram->pointer();
address_space &space = m_maincpu->space(AS_PROGRAM);
unsigned char *ChosenROM, *ExROM;
const timex_cart_t *timex_cart = timex_cart_data();
int timex_cart_type = timex_cart->type;
UINT8 timex_cart_chunks = timex_cart->chunks;
UINT8 *DOCK = timex_cart->data;
ExROM = state->memregion("maincpu")->base() + 0x014000;
ExROM = memregion("maincpu")->base() + 0x014000;
if (state->m_port_f4_data & 0x01)
if (m_port_f4_data & 0x01)
{
if (state->m_port_ff_data & 0x80)
if (m_port_ff_data & 0x80)
{
space.install_read_bank(0x0000, 0x1fff, "bank1");
space.unmap_write(0x0000, 0x1fff);
state->membank("bank1")->set_base(ExROM);
membank("bank1")->set_base(ExROM);
logerror("0000-1fff EXROM\n");
}
else
{
if (timex_cart_type == TIMEX_CART_DOCK)
{
state->membank("bank1")->set_base(DOCK);
membank("bank1")->set_base(DOCK);
space.install_read_bank(0x0000, 0x1fff, "bank1");
if (timex_cart_chunks&0x01)
space.install_write_bank(0x0000, 0x1fff, "bank9");
@ -269,18 +260,18 @@ void ts2068_update_memory(running_machine &machine)
}
else
{
ChosenROM = machine.root_device().memregion("maincpu")->base() + 0x010000;
state->membank("bank1")->set_base(ChosenROM);
ChosenROM = memregion("maincpu")->base() + 0x010000;
membank("bank1")->set_base(ChosenROM);
space.install_read_bank(0x0000, 0x1fff, "bank1");
space.unmap_write(0x0000, 0x1fff);
logerror("0000-1fff HOME\n");
}
if (state->m_port_f4_data & 0x02)
if (m_port_f4_data & 0x02)
{
if (state->m_port_ff_data & 0x80)
if (m_port_ff_data & 0x80)
{
state->membank("bank2")->set_base(ExROM);
membank("bank2")->set_base(ExROM);
space.install_read_bank(0x2000, 0x3fff, "bank2");
space.unmap_write(0x2000, 0x3fff);
logerror("2000-3fff EXROM\n");
@ -289,7 +280,7 @@ void ts2068_update_memory(running_machine &machine)
{
if (timex_cart_type == TIMEX_CART_DOCK)
{
state->membank("bank2")->set_base(DOCK+0x2000);
membank("bank2")->set_base(DOCK+0x2000);
space.install_read_bank(0x2000, 0x3fff, "bank2");
if (timex_cart_chunks&0x02)
space.install_write_bank(0x2000, 0x3fff, "bank10");
@ -307,18 +298,18 @@ void ts2068_update_memory(running_machine &machine)
}
else
{
ChosenROM = machine.root_device().memregion("maincpu")->base() + 0x012000;
state->membank("bank2")->set_base(ChosenROM);
ChosenROM = memregion("maincpu")->base() + 0x012000;
membank("bank2")->set_base(ChosenROM);
space.install_read_bank(0x2000, 0x3fff, "bank2");
space.unmap_write(0x2000, 0x3fff);
logerror("2000-3fff HOME\n");
}
if (state->m_port_f4_data & 0x04)
if (m_port_f4_data & 0x04)
{
if (state->m_port_ff_data & 0x80)
if (m_port_ff_data & 0x80)
{
state->membank("bank3")->set_base(ExROM);
membank("bank3")->set_base(ExROM);
space.install_read_bank(0x4000, 0x5fff, "bank3");
space.unmap_write(0x4000, 0x5fff);
logerror("4000-5fff EXROM\n");
@ -327,7 +318,7 @@ void ts2068_update_memory(running_machine &machine)
{
if (timex_cart_type == TIMEX_CART_DOCK)
{
state->membank("bank3")->set_base(DOCK+0x4000);
membank("bank3")->set_base(DOCK+0x4000);
space.install_read_bank(0x4000, 0x5fff, "bank3");
if (timex_cart_chunks&0x04)
space.install_write_bank(0x4000, 0x5fff, "bank11");
@ -344,18 +335,18 @@ void ts2068_update_memory(running_machine &machine)
}
else
{
state->membank("bank3")->set_base(messram);
state->membank("bank11")->set_base(messram);
membank("bank3")->set_base(messram);
membank("bank11")->set_base(messram);
space.install_read_bank(0x4000, 0x5fff, "bank3");
space.install_write_bank(0x4000, 0x5fff, "bank11");
logerror("4000-5fff RAM\n");
}
if (state->m_port_f4_data & 0x08)
if (m_port_f4_data & 0x08)
{
if (state->m_port_ff_data & 0x80)
if (m_port_ff_data & 0x80)
{
state->membank("bank4")->set_base(ExROM);
membank("bank4")->set_base(ExROM);
space.install_read_bank(0x6000, 0x7fff, "bank4");
space.unmap_write(0x6000, 0x7fff);
logerror("6000-7fff EXROM\n");
@ -364,7 +355,7 @@ void ts2068_update_memory(running_machine &machine)
{
if (timex_cart_type == TIMEX_CART_DOCK)
{
state->membank("bank4")->set_base(DOCK+0x6000);
membank("bank4")->set_base(DOCK+0x6000);
space.install_read_bank(0x6000, 0x7fff, "bank4");
if (timex_cart_chunks&0x08)
space.install_write_bank(0x6000, 0x7fff, "bank12");
@ -381,18 +372,18 @@ void ts2068_update_memory(running_machine &machine)
}
else
{
state->membank("bank4")->set_base(messram + 0x2000);
state->membank("bank12")->set_base(messram + 0x2000);
membank("bank4")->set_base(messram + 0x2000);
membank("bank12")->set_base(messram + 0x2000);
space.install_read_bank(0x6000, 0x7fff, "bank4");
space.install_write_bank(0x6000, 0x7fff, "bank12");
logerror("6000-7fff RAM\n");
}
if (state->m_port_f4_data & 0x10)
if (m_port_f4_data & 0x10)
{
if (state->m_port_ff_data & 0x80)
if (m_port_ff_data & 0x80)
{
state->membank("bank5")->set_base(ExROM);
membank("bank5")->set_base(ExROM);
space.install_read_bank(0x8000, 0x9fff, "bank5");
space.unmap_write(0x8000, 0x9fff);
logerror("8000-9fff EXROM\n");
@ -401,7 +392,7 @@ void ts2068_update_memory(running_machine &machine)
{
if (timex_cart_type == TIMEX_CART_DOCK)
{
state->membank("bank5")->set_base(DOCK+0x8000);
membank("bank5")->set_base(DOCK+0x8000);
space.install_read_bank(0x8000, 0x9fff,"bank5");
if (timex_cart_chunks&0x10)
space.install_write_bank(0x8000, 0x9fff,"bank13");
@ -418,18 +409,18 @@ void ts2068_update_memory(running_machine &machine)
}
else
{
state->membank("bank5")->set_base(messram + 0x4000);
state->membank("bank13")->set_base(messram + 0x4000);
membank("bank5")->set_base(messram + 0x4000);
membank("bank13")->set_base(messram + 0x4000);
space.install_read_bank(0x8000, 0x9fff,"bank5");
space.install_write_bank(0x8000, 0x9fff,"bank13");
logerror("8000-9fff RAM\n");
}
if (state->m_port_f4_data & 0x20)
if (m_port_f4_data & 0x20)
{
if (state->m_port_ff_data & 0x80)
if (m_port_ff_data & 0x80)
{
state->membank("bank6")->set_base(ExROM);
membank("bank6")->set_base(ExROM);
space.install_read_bank(0xa000, 0xbfff, "bank6");
space.unmap_write(0xa000, 0xbfff);
logerror("a000-bfff EXROM\n");
@ -438,7 +429,7 @@ void ts2068_update_memory(running_machine &machine)
{
if (timex_cart_type == TIMEX_CART_DOCK)
{
state->membank("bank6")->set_base(DOCK+0xa000);
membank("bank6")->set_base(DOCK+0xa000);
space.install_read_bank(0xa000, 0xbfff, "bank6");
if (timex_cart_chunks&0x20)
space.install_write_bank(0xa000, 0xbfff, "bank14");
@ -456,18 +447,18 @@ void ts2068_update_memory(running_machine &machine)
}
else
{
state->membank("bank6")->set_base(messram + 0x6000);
state->membank("bank14")->set_base(messram + 0x6000);
membank("bank6")->set_base(messram + 0x6000);
membank("bank14")->set_base(messram + 0x6000);
space.install_read_bank(0xa000, 0xbfff, "bank6");
space.install_write_bank(0xa000, 0xbfff, "bank14");
logerror("a000-bfff RAM\n");
}
if (state->m_port_f4_data & 0x40)
if (m_port_f4_data & 0x40)
{
if (state->m_port_ff_data & 0x80)
if (m_port_ff_data & 0x80)
{
state->membank("bank7")->set_base(ExROM);
membank("bank7")->set_base(ExROM);
space.install_read_bank(0xc000, 0xdfff, "bank7");
space.unmap_write(0xc000, 0xdfff);
logerror("c000-dfff EXROM\n");
@ -476,7 +467,7 @@ void ts2068_update_memory(running_machine &machine)
{
if (timex_cart_type == TIMEX_CART_DOCK)
{
state->membank("bank7")->set_base(DOCK+0xc000);
membank("bank7")->set_base(DOCK+0xc000);
space.install_read_bank(0xc000, 0xdfff, "bank7");
if (timex_cart_chunks&0x40)
space.install_write_bank(0xc000, 0xdfff, "bank15");
@ -493,18 +484,18 @@ void ts2068_update_memory(running_machine &machine)
}
else
{
state->membank("bank7")->set_base(messram + 0x8000);
state->membank("bank15")->set_base(messram + 0x8000);
membank("bank7")->set_base(messram + 0x8000);
membank("bank15")->set_base(messram + 0x8000);
space.install_read_bank(0xc000, 0xdfff, "bank7");
space.install_write_bank(0xc000, 0xdfff, "bank15");
logerror("c000-dfff RAM\n");
}
if (state->m_port_f4_data & 0x80)
if (m_port_f4_data & 0x80)
{
if (state->m_port_ff_data & 0x80)
if (m_port_ff_data & 0x80)
{
state->membank("bank8")->set_base(ExROM);
membank("bank8")->set_base(ExROM);
space.install_read_bank(0xe000, 0xffff, "bank8");
space.unmap_write(0xe000, 0xffff);
logerror("e000-ffff EXROM\n");
@ -513,7 +504,7 @@ void ts2068_update_memory(running_machine &machine)
{
if (timex_cart_type == TIMEX_CART_DOCK)
{
state->membank("bank8")->set_base(DOCK+0xe000);
membank("bank8")->set_base(DOCK+0xe000);
space.install_read_bank(0xe000, 0xffff, "bank8");
if (timex_cart_chunks&0x80)
space.install_write_bank(0xe000, 0xffff, "bank16");
@ -530,8 +521,8 @@ void ts2068_update_memory(running_machine &machine)
}
else
{
state->membank("bank8")->set_base(messram + 0xa000);
state->membank("bank16")->set_base(messram + 0xa000);
membank("bank8")->set_base(messram + 0xa000);
membank("bank16")->set_base(messram + 0xa000);
space.install_read_bank(0xe000, 0xffff, "bank8");
space.install_write_bank(0xe000, 0xffff, "bank16");
logerror("e000-ffff RAM\n");
@ -542,11 +533,11 @@ static ADDRESS_MAP_START(ts2068_io, AS_IO, 8, spectrum_state )
AM_RANGE(0x1f, 0x1f) AM_READ(spectrum_port_1f_r ) AM_MIRROR(0xff00)
AM_RANGE(0x7f, 0x7f) AM_READ(spectrum_port_7f_r ) AM_MIRROR(0xff00)
AM_RANGE(0xdf, 0xdf) AM_READ(spectrum_port_df_r ) AM_MIRROR(0xff00)
AM_RANGE(0xf4, 0xf4) AM_READWRITE_LEGACY(ts2068_port_f4_r,ts2068_port_f4_w ) AM_MIRROR(0xff00)
AM_RANGE(0xf4, 0xf4) AM_READWRITE(ts2068_port_f4_r,ts2068_port_f4_w ) AM_MIRROR(0xff00)
AM_RANGE(0xf5, 0xf5) AM_DEVWRITE_LEGACY("ay8912", ay8910_address_w ) AM_MIRROR(0xff00)
AM_RANGE(0xf6, 0xf6) AM_DEVREADWRITE_LEGACY("ay8912", ay8910_r, ay8910_data_w ) AM_MIRROR(0xff00)
AM_RANGE(0xfe, 0xfe) AM_READWRITE(spectrum_port_fe_r,spectrum_port_fe_w ) AM_MIRROR(0xff00) AM_MASK(0xffff)
AM_RANGE(0xff, 0xff) AM_READWRITE_LEGACY(ts2068_port_ff_r,ts2068_port_ff_w ) AM_MIRROR(0xff00)
AM_RANGE(0xff, 0xff) AM_READWRITE(ts2068_port_ff_r,ts2068_port_ff_w ) AM_MIRROR(0xff00)
ADDRESS_MAP_END
static ADDRESS_MAP_START(ts2068_mem, AS_PROGRAM, 8, spectrum_state )
@ -565,7 +556,7 @@ MACHINE_RESET_MEMBER(spectrum_state,ts2068)
{
m_port_ff_data = 0;
m_port_f4_data = 0;
ts2068_update_memory(machine());
ts2068_update_memory();
MACHINE_RESET_CALL_MEMBER(spectrum);
}
@ -575,11 +566,9 @@ MACHINE_RESET_MEMBER(spectrum_state,ts2068)
/* TC2048 specific functions */
static WRITE8_HANDLER( tc2048_port_ff_w )
WRITE8_MEMBER( spectrum_state::tc2048_port_ff_w )
{
spectrum_state *state = space.machine().driver_data<spectrum_state>();
state->m_port_ff_data = data;
m_port_ff_data = data;
logerror("Port %04x write %02x\n", offset, data);
}
@ -588,7 +577,7 @@ static ADDRESS_MAP_START(tc2048_io, AS_IO, 8, spectrum_state )
AM_RANGE(0x1f, 0x1f) AM_READ(spectrum_port_1f_r) AM_MIRROR(0xff00)
AM_RANGE(0x7f, 0x7f) AM_READ(spectrum_port_7f_r) AM_MIRROR(0xff00)
AM_RANGE(0xdf, 0xdf) AM_READ(spectrum_port_df_r) AM_MIRROR(0xff00)
AM_RANGE(0xff, 0xff) AM_READWRITE_LEGACY(ts2068_port_ff_r,tc2048_port_ff_w) AM_MIRROR(0xff00)
AM_RANGE(0xff, 0xff) AM_READWRITE(ts2068_port_ff_r,tc2048_port_ff_w) AM_MIRROR(0xff00)
ADDRESS_MAP_END
static ADDRESS_MAP_START(tc2048_mem, AS_PROGRAM, 8, spectrum_state )
@ -598,7 +587,7 @@ ADDRESS_MAP_END
MACHINE_RESET_MEMBER(spectrum_state,tc2048)
{
UINT8 *messram = machine().device<ram_device>(RAM_TAG)->pointer();
UINT8 *messram = m_ram->pointer();
membank("bank1")->set_base(messram);
membank("bank2")->set_base(messram);

View File

@ -86,7 +86,7 @@ static void spectrum_update_paging(running_machine &machine)
if (state->m_port_7ffd_data == -1)
return;
if (state->m_port_1ffd_data == -1)
spectrum_128_update_memory(machine);
state->spectrum_128_update_memory();
else
{
@ -95,7 +95,7 @@ static void spectrum_update_paging(running_machine &machine)
state->m_port_1ffd_data = 0x04;
else
state->m_port_1ffd_data = 0x00;
spectrum_plus3_update_memory(machine);
state->spectrum_plus3_update_memory();
}
}
@ -2440,13 +2440,13 @@ void spectrum_setup_z80(running_machine &machine, UINT8 *snapdata, UINT32 snapsi
{
state->m_port_f4_data = 0x03;
state->m_port_ff_data = 0x00;
ts2068_update_memory(machine);
state->ts2068_update_memory();
}
if (z80_type == SPECTRUM_Z80_SNAPSHOT_TS2068 && !strcmp(machine.system().name,"ts2068"))
{
state->m_port_f4_data = snapdata[35];
state->m_port_ff_data = snapdata[36];
ts2068_update_memory(machine);
state->ts2068_update_memory();
}
}
}

View File

@ -10,6 +10,9 @@
#include "imagedev/snapquik.h"
#include "imagedev/cartslot.h"
#include "machine/upd765.h"
#include "imagedev/cassette.h"
#include "sound/speaker.h"
#include "machine/ram.h"
/* Spectrum crystals */
@ -70,8 +73,36 @@ class spectrum_state : public driver_device
{
public:
spectrum_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag) ,
m_video_ram(*this, "video_ram"){ }
: driver_device(mconfig, type, tag)
, m_video_ram(*this, "video_ram")
, m_maincpu(*this, "maincpu")
, m_cassette(*this, CASSETTE_TAG)
, m_ram(*this, RAM_TAG)
, m_speaker(*this, SPEAKER_TAG)
, m_upd765(*this, "upd765")
, m_upd765_0(*this, "upd765:0")
, m_upd765_1(*this, "upd765:1")
, m_io_line0(*this, "LINE0")
, m_io_line1(*this, "LINE1")
, m_io_line2(*this, "LINE2")
, m_io_line3(*this, "LINE3")
, m_io_line4(*this, "LINE4")
, m_io_line5(*this, "LINE5")
, m_io_line6(*this, "LINE6")
, m_io_line7(*this, "LINE7")
, m_io_nmi(*this, "NMI")
, m_io_config(*this, "CONFIG")
, m_io_joy_intf(*this, "JOY_INTF")
, m_io_kempston(*this, "KEMPSTON")
, m_io_fuller(*this, "FULLER")
, m_io_mikrogen(*this, "MIKROGEN")
, m_io_plus0(*this, "PLUS0")
, m_io_plus1(*this, "PLUS1")
, m_io_plus2(*this, "PLUS2")
, m_io_plus3(*this, "PLUS3")
, m_io_plus4(*this, "PLUS4")
{ }
int m_port_fe_data;
int m_port_7ffd_data;
@ -106,6 +137,22 @@ public:
DECLARE_READ8_MEMBER(spectrum_port_7f_r);
DECLARE_READ8_MEMBER(spectrum_port_df_r);
DECLARE_READ8_MEMBER(spectrum_port_ula_r);
DECLARE_WRITE8_MEMBER(spectrum_128_port_7ffd_w);
DECLARE_READ8_MEMBER(spectrum_128_ula_r);
DECLARE_WRITE8_MEMBER(spectrum_plus3_port_3ffd_w);
DECLARE_READ8_MEMBER(spectrum_plus3_port_3ffd_r);
DECLARE_READ8_MEMBER(spectrum_plus3_port_2ffd_r);
DECLARE_WRITE8_MEMBER(spectrum_plus3_port_7ffd_w);
DECLARE_WRITE8_MEMBER(spectrum_plus3_port_1ffd_w);
DECLARE_READ8_MEMBER(ts2068_port_f4_r);
DECLARE_WRITE8_MEMBER(ts2068_port_f4_w);
DECLARE_READ8_MEMBER(ts2068_port_ff_r);
DECLARE_WRITE8_MEMBER(ts2068_port_ff_w);
DECLARE_WRITE8_MEMBER(tc2048_port_ff_w);
DECLARE_DRIVER_INIT(spectrum);
DECLARE_DRIVER_INIT(plus2);
DECLARE_DRIVER_INIT(plus3);
@ -131,6 +178,42 @@ public:
bitmap_ind16 m_border_bitmap;
DECLARE_FLOPPY_FORMATS( floppy_formats );
void spectrum_128_update_memory();
void spectrum_plus3_update_memory();
void ts2068_update_memory();
protected:
required_device<cpu_device> m_maincpu;
required_device<cassette_image_device> m_cassette;
required_device<ram_device> m_ram;
required_device<device_t> m_speaker;
optional_device<upd765a_device> m_upd765;
optional_device<floppy_connector> m_upd765_0;
optional_device<floppy_connector> m_upd765_1;
// Regular spectrum ports; marked as optional because of other subclasses
optional_ioport m_io_line0;
optional_ioport m_io_line1;
optional_ioport m_io_line2;
optional_ioport m_io_line3;
optional_ioport m_io_line4;
optional_ioport m_io_line5;
optional_ioport m_io_line6;
optional_ioport m_io_line7;
optional_ioport m_io_nmi;
optional_ioport m_io_config;
optional_ioport m_io_joy_intf;
optional_ioport m_io_kempston;
optional_ioport m_io_fuller;
optional_ioport m_io_mikrogen;
// Plus ports
optional_ioport m_io_plus0;
optional_ioport m_io_plus1;
optional_ioport m_io_plus2;
optional_ioport m_io_plus3;
optional_ioport m_io_plus4;
void spectrum_UpdateBorderBitmap();
};
@ -141,26 +224,8 @@ INPUT_PORTS_EXTERN( spec_plus );
MACHINE_CONFIG_EXTERN( spectrum );
/*----------- defined in drivers/spec128.c -----------*/
MACHINE_CONFIG_EXTERN( spectrum_128 );
void spectrum_128_update_memory(running_machine &machine);
/*----------- defined in drivers/specpls3.c -----------*/
void spectrum_plus3_update_memory(running_machine &machine);
/*----------- defined in drivers/timex.c -----------*/
void ts2068_update_memory(running_machine &machine);
/*----------- defined in video/spectrum.c -----------*/
void spectrum_UpdateBorderBitmap(running_machine &machine);
#endif /* __SPECTRUM_H__ */

View File

@ -67,7 +67,7 @@ void spectrum_state::screen_eof_spectrum(screen_device &screen, bool state)
}
spectrum_UpdateBorderBitmap(machine());
spectrum_UpdateBorderBitmap();
}
}
@ -181,55 +181,44 @@ PALETTE_INIT_MEMBER(spectrum_state,spectrum)
/* The code below is just a per-pixel 'partial update' for the border */
INLINE void spectrum_GetNextPos(running_machine &machine, unsigned int &x, unsigned int &y)
void spectrum_state::spectrum_UpdateBorderBitmap()
{
spectrum_state *state = machine.driver_data<spectrum_state>();
int width = state->m_border_bitmap.width();
int height = state->m_border_bitmap.height();
unsigned int x = machine().primary_screen->hpos();
unsigned int y = machine().primary_screen->vpos();
int width = m_border_bitmap.width();
int height = m_border_bitmap.height();
x += 1;
if (x>width)
if (m_border_bitmap.valid())
{
x = 0;
y += 1;
int colour = m_port_fe_data & 0x07;
if (y>height)
{
y = 0;
}
}
}
void spectrum_UpdateBorderBitmap(running_machine &machine)
{
spectrum_state *state = machine.driver_data<spectrum_state>();
unsigned int x = machine.primary_screen->hpos();
unsigned int y = machine.primary_screen->vpos();
int width = state->m_border_bitmap.width();
int height = state->m_border_bitmap.height();
if (state->m_border_bitmap.valid())
{
int colour = state->m_port_fe_data & 0x07;
//printf("update border from %d,%d to %d,%d\n", state->m_previous_border_x, state->m_previous_border_y, x, y);
//printf("update border from %d,%d to %d,%d\n", m_previous_border_x, m_previous_border_y, x, y);
do
{
if (state->m_previous_border_y < height)
if (m_previous_border_y < height)
{
UINT16* bm = &state->m_border_bitmap.pix16(state->m_previous_border_y);
UINT16* bm = &m_border_bitmap.pix16(m_previous_border_y);
if (state->m_previous_border_x < width)
bm[state->m_previous_border_x] = colour;
if (m_previous_border_x < width)
bm[m_previous_border_x] = colour;
}
spectrum_GetNextPos(machine, state->m_previous_border_x, state->m_previous_border_y);
m_previous_border_x += 1;
if (m_previous_border_x > width)
{
m_previous_border_x = 0;
m_previous_border_y += 1;
if (m_previous_border_y > height)
{
m_previous_border_y = 0;
}
}
}
while (!((state->m_previous_border_x == x) && (state->m_previous_border_y == y)));
while (!((m_previous_border_x == x) && (m_previous_border_y == y)));
}
else