abc80x: Implemented option ROM opcode fetch thru character RAM. [Curt Coder]

This commit is contained in:
Curt Coder 2018-03-26 11:37:03 +03:00
parent d3261eeea4
commit 994c32529f
2 changed files with 88 additions and 6 deletions

View File

@ -379,6 +379,68 @@ void abc806_state::bankswitch()
}
//-------------------------------------------------
// m1_r - opcode read
//-------------------------------------------------
READ8_MEMBER( abc800_state::m1_r )
{
if (offset >= 0x7800 && offset < 0x8000)
{
if (!m_fetch_charram)
{
m_fetch_charram = 1;
bankswitch();
}
return m_rom->base()[0x7800 | (offset & 0x7ff)];
}
if (m_fetch_charram)
{
m_fetch_charram = 0;
bankswitch();
}
return m_maincpu->space(AS_PROGRAM).read_byte(offset);
}
READ8_MEMBER( abc800c_state::m1_r )
{
if (offset >= 0x7c00 && offset < 0x8000)
{
if (!m_fetch_charram)
{
m_fetch_charram = 1;
bankswitch();
}
return m_rom->base()[0x7c00 | (offset & 0x3ff)];
}
if (m_fetch_charram)
{
m_fetch_charram = 0;
bankswitch();
}
return m_maincpu->space(AS_PROGRAM).read_byte(offset);
}
READ8_MEMBER( abc802_state::m1_r )
{
if (m_lrs)
{
if (offset >= 0x7800 && offset < 0x8000)
{
return m_rom->base()[0x7800 | (offset & 0x7ff)];
}
}
return m_maincpu->space(AS_PROGRAM).read_byte(offset);
}
//-------------------------------------------------
// mai_r - memory bank map read
//-------------------------------------------------
@ -425,6 +487,16 @@ WRITE8_MEMBER( abc806_state::mao_w )
// ADDRESS MAPS
//**************************************************************************
//-------------------------------------------------
// ADDRESS_MAP( abc800_m1 )
//-------------------------------------------------
void abc800_state::abc800_m1(address_map &map)
{
map(0x0000, 0xffff).r(this, FUNC(abc800_state::m1_r));
}
//-------------------------------------------------
// ADDRESS_MAP( abc800c_mem )
//-------------------------------------------------
@ -466,11 +538,11 @@ ADDRESS_MAP_END
//-------------------------------------------------
ADDRESS_MAP_START(abc800_state::abc800m_mem)
ADDRESS_MAP_UNMAP_HIGH
AM_RANGE(0x0000, 0x3fff) AM_RAM AM_SHARE("video_ram")
AM_RANGE(0x4000, 0x77ff) AM_ROM
AM_RANGE(0x7800, 0x7fff) AM_RAM AM_SHARE("char_ram")
AM_RANGE(0x8000, 0xffff) AM_RAM
map.unmap_value_high();
map(0x0000, 0x3fff).ram().share("video_ram");
map(0x4000, 0x77ff).rom();
map(0x7800, 0x7fff).ram().share("char_ram");
map(0x8000, 0xffff).ram();
ADDRESS_MAP_END
@ -1024,6 +1096,7 @@ MACHINE_CONFIG_START(abc800c_state::abc800c)
// basic machine hardware
MCFG_CPU_ADD(Z80_TAG, Z80, ABC800_X01/2/2)
MCFG_Z80_DAISY_CHAIN(abc800_daisy_chain)
MCFG_CPU_OPCODES_MAP(abc800_m1)
MCFG_CPU_PROGRAM_MAP(abc800c_mem)
MCFG_CPU_IO_MAP(abc800c_io)
@ -1099,6 +1172,7 @@ MACHINE_CONFIG_START(abc800m_state::abc800m)
// basic machine hardware
MCFG_CPU_ADD(Z80_TAG, Z80, ABC800_X01/2/2)
MCFG_Z80_DAISY_CHAIN(abc800_daisy_chain)
MCFG_CPU_OPCODES_MAP(abc800_m1)
MCFG_CPU_PROGRAM_MAP(abc800m_mem)
MCFG_CPU_IO_MAP(abc800m_io)
@ -1174,6 +1248,7 @@ MACHINE_CONFIG_START(abc802_state::abc802)
// basic machine hardware
MCFG_CPU_ADD(Z80_TAG, Z80, ABC800_X01/2/2)
MCFG_Z80_DAISY_CHAIN(abc800_daisy_chain)
MCFG_CPU_OPCODES_MAP(abc800_m1)
MCFG_CPU_PROGRAM_MAP(abc802_mem)
MCFG_CPU_IO_MAP(abc802_io)
@ -1250,6 +1325,7 @@ MACHINE_CONFIG_START(abc806_state::abc806)
// basic machine hardware
MCFG_CPU_ADD(Z80_TAG, Z80, ABC800_X01/2/2)
MCFG_Z80_DAISY_CHAIN(abc800_daisy_chain)
MCFG_CPU_OPCODES_MAP(abc800_m1)
MCFG_CPU_PROGRAM_MAP(abc806_mem)
MCFG_CPU_IO_MAP(abc806_io)

View File

@ -117,6 +117,7 @@ public:
void bankswitch();
void clock_cassette(int state);
virtual DECLARE_READ8_MEMBER( m1_r );
DECLARE_READ8_MEMBER( pling_r );
DECLARE_WRITE8_MEMBER( hrs_w );
DECLARE_WRITE8_MEMBER( hrc_w );
@ -128,7 +129,9 @@ public:
DECLARE_WRITE_LINE_MEMBER( sio_rtsb_w );
// memory state
int m_fetch_charram; // opcode fetched from character RAM region (0x7800-0x7fff)
bool m_fetch_charram; // opcode fetched from character RAM region (0x7800-0x7fff)
uint16_t m_char_ram_start;
uint16_t m_char_ram_mask;
// sound state
int m_pling;
@ -150,6 +153,7 @@ public:
// timers
emu_timer *m_ctc_timer;
emu_timer *m_cassette_timer;
void abc800_m1(address_map &map);
void abc800c_io(address_map &map);
void abc800m_io(address_map &map);
void abc800m_mem(address_map &map);
@ -205,6 +209,7 @@ public:
offs_t translate_trom_offset(offs_t offset);
void hr_update(bitmap_rgb32 &bitmap, const rectangle &cliprect);
DECLARE_READ8_MEMBER( m1_r ) override;
DECLARE_READ8_MEMBER( char_ram_r );
DECLARE_PALETTE_INIT( abc800c );
void abc800c(machine_config &config);
@ -239,6 +244,7 @@ public:
void bankswitch();
DECLARE_READ8_MEMBER( m1_r ) override;
DECLARE_READ8_MEMBER( pling_r );
DECLARE_WRITE_LINE_MEMBER( lrs_w );
DECLARE_WRITE_LINE_MEMBER( mux80_40_w );