summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Curt Coder <curtcoder@mail.com>2018-03-26 11:37:03 +0300
committer Curt Coder <curtcoder@mail.com>2018-03-27 13:39:39 +0300
commit994c32529f7de650d89c0f81e4f73a93ba999102 (patch)
tree81eb8833d186e1774f38e0c0c25940a0f2762c5c
parentd3261eeea4e20322cb120f4d943ac7718741cf74 (diff)
abc80x: Implemented option ROM opcode fetch thru character RAM. [Curt Coder]
-rw-r--r--src/mame/drivers/abc80x.cpp86
-rw-r--r--src/mame/includes/abc80x.h8
2 files changed, 88 insertions, 6 deletions
diff --git a/src/mame/drivers/abc80x.cpp b/src/mame/drivers/abc80x.cpp
index 1b9a6060945..ff4363943dc 100644
--- a/src/mame/drivers/abc80x.cpp
+++ b/src/mame/drivers/abc80x.cpp
@@ -380,6 +380,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
//-------------------------------------------------
@@ -426,6 +488,16 @@ WRITE8_MEMBER( abc806_state::mao_w )
//**************************************************************************
//-------------------------------------------------
+// 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)
diff --git a/src/mame/includes/abc80x.h b/src/mame/includes/abc80x.h
index d7459ad7290..f98677f2ab0 100644
--- a/src/mame/includes/abc80x.h
+++ b/src/mame/includes/abc80x.h
@@ -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 );