diff options
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 |
commit | 994c32529f7de650d89c0f81e4f73a93ba999102 (patch) | |
tree | 81eb8833d186e1774f38e0c0c25940a0f2762c5c | |
parent | d3261eeea4e20322cb120f4d943ac7718741cf74 (diff) |
abc80x: Implemented option ROM opcode fetch thru character RAM. [Curt Coder]
-rw-r--r-- | src/mame/drivers/abc80x.cpp | 86 | ||||
-rw-r--r-- | src/mame/includes/abc80x.h | 8 |
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 ); |