diff options
Diffstat (limited to 'src/mame/drivers/amust.cpp')
-rw-r--r-- | src/mame/drivers/amust.cpp | 74 |
1 files changed, 49 insertions, 25 deletions
diff --git a/src/mame/drivers/amust.cpp b/src/mame/drivers/amust.cpp index 36a07f99ba7..f2c6a026670 100644 --- a/src/mame/drivers/amust.cpp +++ b/src/mame/drivers/amust.cpp @@ -98,7 +98,8 @@ public: : driver_device(mconfig, type, tag) , m_palette(*this, "palette") , m_maincpu(*this, "maincpu") - , m_p_videoram(*this, "videoram") + , m_rom(*this, "maincpu") + , m_ram(*this, "mainram") , m_p_chargen(*this, "chargen") , m_beep(*this, "beeper") , m_fdc (*this, "fdc") @@ -108,8 +109,6 @@ public: void amust(machine_config &config); - void init_amust(); - private: enum { @@ -137,6 +136,7 @@ private: void io_map(address_map &map); void mem_map(address_map &map); void machine_reset() override; + void machine_start() override; void do_int(); u8 m_port04; @@ -149,10 +149,14 @@ private: //bool m_intrq; bool m_hsync; bool m_vsync; + bool m_rom_in_map; + std::unique_ptr<u8[]> m_vram; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; + memory_passthrough_handler *m_rom_shadow_tap; required_device<palette_device> m_palette; required_device<cpu_device> m_maincpu; - required_region_ptr<u8> m_p_videoram; + required_region_ptr<u8> m_rom; + required_shared_ptr<u8> m_ram; required_region_ptr<u8> m_p_chargen; required_device<beep_device> m_beep; required_device<upd765a_device> m_fdc; @@ -185,9 +189,8 @@ void amust_state::device_timer(emu_timer &timer, device_timer_id id, int param, void amust_state::mem_map(address_map &map) { - map.unmap_value_high(); - map(0x0000, 0xf7ff).ram(); - map(0xf800, 0xffff).bankr("bankr0").bankw("bankw0"); + map(0x0000, 0xffff).ram().share("mainram"); + map(0xf800, 0xffff).lr8(NAME([this] (offs_t offset) { if(m_rom_in_map) return m_rom[offset]; else return m_ram[offset]; })); } void amust_state::io_map(address_map &map) @@ -357,11 +360,11 @@ void amust_state::port0a_w(u8 data) void amust_state::port0d_w(u8 data) { uint16_t video_address = m_port08 | ((m_port0a & 7) << 8); - m_p_videoram[video_address] = data; + m_vram[video_address] = data; } /* F4 Character Displayer */ -static const gfx_layout amust_charlayout = +static const gfx_layout charlayout = { 8, 8, /* 8 x 8 characters */ 256, /* 256 characters */ @@ -375,7 +378,7 @@ static const gfx_layout amust_charlayout = }; static GFXDECODE_START( gfx_amust ) - GFXDECODE_ENTRY( "chargen", 0x0000, amust_charlayout, 0, 1 ) + GFXDECODE_ENTRY( "chargen", 0x0000, charlayout, 0, 1 ) GFXDECODE_END MC6845_UPDATE_ROW( amust_state::crtc_update_row ) @@ -389,7 +392,7 @@ MC6845_UPDATE_ROW( amust_state::crtc_update_row ) { inv = (x == cursor_x) ? 0xff : 0; mem = (ma + x) & 0x7ff; - chr = m_p_videoram[mem]; + chr = m_vram[mem]; if (ra < 8) gfx = m_p_chargen[(chr<<3) | ra] ^ inv; else @@ -409,8 +412,7 @@ MC6845_UPDATE_ROW( amust_state::crtc_update_row ) void amust_state::machine_reset() { - membank("bankr0")->set_entry(0); // point at rom - membank("bankw0")->set_entry(0); // always write to ram + m_rom_in_map = true; m_port04 = 0; m_port06 = 0; m_port08 = 0; @@ -421,16 +423,40 @@ void amust_state::machine_reset() m_drq = false; m_fdc->set_ready_line_connected(1); // always ready for minifloppy; controlled by fdc for 20cm m_fdc->set_unscaled_clock(4000000); // 4MHz for minifloppy; 8MHz for 20cm - m_maincpu->set_state_int(Z80_PC, 0xf800); + + address_space &program = m_maincpu->space(AS_PROGRAM); + program.install_rom(0x0000, 0x07ff, m_rom); // do it here for F3 + m_rom_shadow_tap = program.install_read_tap(0xf800, 0xffff, "rom_shadow_r",[this](offs_t offset, u8 &data, u8 mem_mask) + { + if (!machine().side_effects_disabled()) + { + // delete this tap + m_rom_shadow_tap->remove(); + + // reinstall ram over the rom shadow + m_maincpu->space(AS_PROGRAM).install_ram(0x0000, 0x07ff, m_ram); + } + + // return the original data + return data; + }); } -void amust_state::init_amust() +void amust_state::machine_start() { - u8 *main = memregion("maincpu")->base(); - - membank("bankr0")->configure_entry(1, &main[0xf800]); - membank("bankr0")->configure_entry(0, &main[0x10800]); - membank("bankw0")->configure_entry(0, &main[0xf800]); + m_vram = make_unique_clear<u8[]>(0x800); + save_pointer(NAME(m_vram), 0x800); + save_item(NAME(m_port04)); + save_item(NAME(m_port06)); + save_item(NAME(m_port08)); + save_item(NAME(m_port09)); + save_item(NAME(m_port0a)); + save_item(NAME(m_term_data)); + save_item(NAME(m_drq)); + //save_item(NAME(m_intrq)); + save_item(NAME(m_hsync)); + save_item(NAME(m_vsync)); + save_item(NAME(m_rom_in_map)); } void amust_state::amust(machine_config &config) @@ -507,19 +533,17 @@ void amust_state::amust(machine_config &config) /* ROM definition */ ROM_START( amust ) - ROM_REGION( 0x11000, "maincpu", ROMREGION_ERASEFF ) - ROM_LOAD( "mon_h.ic25", 0x10000, 0x1000, CRC(10dceac6) SHA1(1ef80039063f7a6455563d59f1bcc23e09eca369) ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mon_h.ic25", 0x0000, 0x1000, CRC(10dceac6) SHA1(1ef80039063f7a6455563d59f1bcc23e09eca369) ) ROM_REGION( 0x800, "chargen", 0 ) ROM_LOAD( "cg4.ic74", 0x000, 0x800, CRC(52e7b9d8) SHA1(cc6d457634eb688ccef471f72bddf0424e64b045) ) ROM_REGION( 0x800, "keyboard", 0 ) ROM_LOAD( "kbd_3.rom", 0x000, 0x800, CRC(d9441b35) SHA1(ce250ab1e892a13fd75182703f259855388c6bf4) ) - - ROM_REGION( 0x800, "videoram", ROMREGION_ERASE00 ) ROM_END /* Driver */ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1983, amust, 0, 0, amust, amust, amust_state, init_amust, "Amust", "Amust Executive 816", MACHINE_NOT_WORKING ) +COMP( 1983, amust, 0, 0, amust, amust, amust_state, empty_init, "Amust", "Amust Executive 816", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) |