From d3a7b0ddc1272c2e0e2417a4c6906d6f7c23bd88 Mon Sep 17 00:00:00 2001 From: Robbbert Date: Thu, 11 Jun 2020 19:44:02 +1000 Subject: (nw) more cleanups --- src/mame/drivers/h19.cpp | 2 +- src/mame/drivers/k8915.cpp | 47 ++++++++++++------------ src/mame/drivers/lcmate2.cpp | 48 ++++++++++++------------ src/mame/drivers/lola8a.cpp | 81 ++++++++++++++++++++++++++++------------- src/mame/drivers/mbc200.cpp | 85 ++++++++++++++++++++++--------------------- src/mame/drivers/meritum.cpp | 64 +++++++++++++++++--------------- src/mame/drivers/mes.cpp | 27 +++++++++----- src/mame/drivers/mits680b.cpp | 2 +- src/mame/drivers/modellot.cpp | 74 +++++++++++++++++++++++++------------ src/mame/drivers/pulsar.cpp | 7 ++-- 10 files changed, 256 insertions(+), 181 deletions(-) diff --git a/src/mame/drivers/h19.cpp b/src/mame/drivers/h19.cpp index f1b97ffcabb..8dd9f74013c 100644 --- a/src/mame/drivers/h19.cpp +++ b/src/mame/drivers/h19.cpp @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:Robbbert, Mark Garlanger +// copyright-holders:Mark Garlanger /*************************************************************************** Heathkit H19 diff --git a/src/mame/drivers/k8915.cpp b/src/mame/drivers/k8915.cpp index aae294342de..c68441f0221 100644 --- a/src/mame/drivers/k8915.cpp +++ b/src/mame/drivers/k8915.cpp @@ -24,42 +24,43 @@ public: k8915_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") + , m_rom(*this, "maincpu") + , m_ram(*this, "mainram") , m_p_videoram(*this, "videoram") , m_p_chargen(*this, "chargen") { } void k8915(machine_config &config); - void init_k8915(); - private: - void k8915_a8_w(uint8_t data); + void k8915_a8_w(u8 data); uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void io_map(address_map &map); void mem_map(address_map &map); - uint8_t m_framecnt; - virtual void machine_reset() override; + u8 m_framecnt; + bool m_rom_in_map; + void machine_start() override; + void machine_reset() override; required_device m_maincpu; - required_shared_ptr m_p_videoram; + required_region_ptr m_rom; + required_shared_ptr m_ram; + required_shared_ptr m_p_videoram; required_region_ptr m_p_chargen; }; -void k8915_state::k8915_a8_w(uint8_t data) +void k8915_state::k8915_a8_w(u8 data) { // seems to switch ram and rom around. - if (data == 0x87) - membank("boot")->set_entry(0); // ram at 0000 - else - membank("boot")->set_entry(1); // rom at 0000 + m_rom_in_map = (data == 0x87) ? 0 : 1; } void k8915_state::mem_map(address_map &map) { map.unmap_value_high(); - map(0x0000, 0x0fff).bankrw("boot"); + map(0x0000, 0x0fff).ram().share("mainram").lr8(NAME([this] (offs_t offset) { if(m_rom_in_map) return m_rom[offset]; else return m_ram[offset]; })); map(0x1000, 0x17ff).ram().share("videoram"); map(0x1800, 0xffff).ram(); } @@ -78,19 +79,19 @@ INPUT_PORTS_END void k8915_state::machine_reset() { - membank("boot")->set_entry(1); + m_rom_in_map = 1; } -void k8915_state::init_k8915() +void k8915_state::machine_start() { - uint8_t *RAM = memregion("maincpu")->base(); - membank("boot")->configure_entries(0, 2, &RAM[0x0000], 0x10000); + save_item(NAME(m_framecnt)); + save_item(NAME(m_rom_in_map)); } -uint32_t k8915_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +u32 k8915_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - uint8_t y,ra,chr,gfx; - uint16_t sy=0,ma=0,x; + u8 y,ra,chr,gfx; + u16 sy=0,ma=0,x; m_framecnt++; @@ -98,7 +99,7 @@ uint32_t k8915_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, { for (ra = 0; ra < 10; ra++) { - uint16_t *p = &bitmap.pix16(sy++); + u16 *p = &bitmap.pix16(sy++); for (x = ma; x < ma + 80; x++) { @@ -170,8 +171,8 @@ void k8915_state::k8915(machine_config &config) /* ROM definition */ ROM_START( k8915 ) - ROM_REGION( 0x11000, "maincpu", ROMREGION_ERASEFF ) - ROM_LOAD( "k8915.bin", 0x10000, 0x1000, CRC(ca70385f) SHA1(a34c14adae9be821678aed7f9e33932ee1f3e61c)) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "k8915.bin", 0x0000, 0x1000, CRC(ca70385f) SHA1(a34c14adae9be821678aed7f9e33932ee1f3e61c)) /* character generator not dumped, using the one from 'c10' for now */ ROM_REGION( 0x2000, "chargen", 0 ) @@ -181,4 +182,4 @@ ROM_END /* Driver */ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1982, k8915, 0, 0, k8915, k8915, k8915_state, init_k8915, "Robotron", "K8915", MACHINE_NOT_WORKING | MACHINE_NO_SOUND) +COMP( 1982, k8915, 0, 0, k8915, k8915, k8915_state, empty_init, "Robotron", "K8915", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/lcmate2.cpp b/src/mame/drivers/lcmate2.cpp index d0ccef31f32..4c687df074c 100644 --- a/src/mame/drivers/lcmate2.cpp +++ b/src/mame/drivers/lcmate2.cpp @@ -43,13 +43,13 @@ class lcmate2_state : public driver_device { public: - lcmate2_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_lcdc(*this, "hd44780"), - m_rtc(*this, "rtc"), - m_speaker(*this, "speaker"), - m_kbdlines(*this, "LINE%u", 0U) + lcmate2_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_lcdc(*this, "hd44780") + , m_rtc(*this, "rtc") + , m_speaker(*this, "speaker") + , m_kbdlines(*this, "LINE%u", 0U) { } void lcmate2(machine_config &config); @@ -64,23 +64,23 @@ private: required_device m_speaker; required_ioport_array<8> m_kbdlines; - uint8_t key_r(offs_t offset); - void speaker_w(uint8_t data); - void bankswitch_w(uint8_t data); + u8 key_r(offs_t offset); + void speaker_w(u8 data); + void bankswitch_w(u8 data); void lcmate2_palette(palette_device &palette) const; - void lcmate2_io(address_map &map); - void lcmate2_mem(address_map &map); + void io_map(address_map &map); + void mem_map(address_map &map); }; -void lcmate2_state::speaker_w(uint8_t data) +void lcmate2_state::speaker_w(u8 data) { m_speaker->level_w(BIT(data, 6)); } // offsets are FE,FD,FB,F7,EF,DF,BF,7F to scan a particular row, or 00 to check if any key pressed -uint8_t lcmate2_state::key_r(offs_t offset) +u8 lcmate2_state::key_r(offs_t offset) { - uint8_t data = 0xff; + u8 data = 0xff; for (int i = 0; i < 8; i++) { @@ -91,12 +91,12 @@ uint8_t lcmate2_state::key_r(offs_t offset) return data; } -void lcmate2_state::bankswitch_w(uint8_t data) +void lcmate2_state::bankswitch_w(u8 data) { membank("rombank")->set_entry(data&0x0f); } -void lcmate2_state::lcmate2_mem(address_map &map) +void lcmate2_state::mem_map(address_map &map) { map.unmap_value_high(); map(0x0000, 0x3fff).rom(); @@ -104,7 +104,7 @@ void lcmate2_state::lcmate2_mem(address_map &map) map(0x8000, 0x9fff).ram().mirror(0x6000).share("nvram"); } -void lcmate2_state::lcmate2_io(address_map &map) +void lcmate2_state::io_map(address_map &map) { map.unmap_value_high(); map(0x0000, 0x000f).rw(m_rtc, FUNC(rp5c15_device::read), FUNC(rp5c15_device::write)); @@ -208,10 +208,10 @@ void lcmate2_state::lcmate2_palette(palette_device &palette) const void lcmate2_state::machine_start() { - membank("rombank")->configure_entries(0, 0x10, (uint8_t*)memregion("maincpu")->base(), 0x4000); + membank("rombank")->configure_entries(0, 0x10, (u8*)memregion("maincpu")->base(), 0x4000); } -static const gfx_layout lcmate2_charlayout = +static const gfx_layout charlayout = { 5, 8, /* 5 x 8 characters */ 256, /* 256 characters */ @@ -223,7 +223,7 @@ static const gfx_layout lcmate2_charlayout = }; static GFXDECODE_START( gfx_lcmate2 ) - GFXDECODE_ENTRY( "hd44780:cgrom", 0x0000, lcmate2_charlayout, 0, 1 ) + GFXDECODE_ENTRY( "hd44780:cgrom", 0x0000, charlayout, 0, 1 ) GFXDECODE_END @@ -231,8 +231,8 @@ void lcmate2_state::lcmate2(machine_config &config) { /* basic machine hardware */ Z80(config, m_maincpu, XTAL(3'579'545)); // confirmed - m_maincpu->set_addrmap(AS_PROGRAM, &lcmate2_state::lcmate2_mem); - m_maincpu->set_addrmap(AS_IO, &lcmate2_state::lcmate2_io); + m_maincpu->set_addrmap(AS_PROGRAM, &lcmate2_state::mem_map); + m_maincpu->set_addrmap(AS_IO, &lcmate2_state::io_map); /* video hardware */ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD)); @@ -269,4 +269,4 @@ ROM_END /* Driver */ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1984, lcmate2, 0, 0, lcmate2, lcmate2, lcmate2_state, empty_init, "VTech", "Laser Compumate 2", MACHINE_NOT_WORKING ) +COMP( 1984, lcmate2, 0, 0, lcmate2, lcmate2, lcmate2_state, empty_init, "VTech", "Laser Compumate 2", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/lola8a.cpp b/src/mame/drivers/lola8a.cpp index 912023d6ce2..f915bed8bfe 100644 --- a/src/mame/drivers/lola8a.cpp +++ b/src/mame/drivers/lola8a.cpp @@ -70,49 +70,55 @@ public: lola8a_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") + , m_rom(*this, "maincpu") + , m_ram(*this, "mainram") , m_cass(*this, "cassette") , m_palette(*this, "palette") , m_p_videoram(*this, "videoram") - , m_io_keyboard(*this, "KEY.%u", 0) + , m_io_keyboard(*this, "KEY.%u", 0U) { } void lola8a(machine_config &config); private: - uint8_t lola8a_port_a_r(); - void lola8a_port_b_w(uint8_t data); + void machine_reset() override; + void machine_start() override; + u8 lola8a_port_a_r(); + void lola8a_port_b_w(u8 data); DECLARE_WRITE_LINE_MEMBER(crtc_vsync); DECLARE_READ_LINE_MEMBER(cass_r); DECLARE_WRITE_LINE_MEMBER(cass_w); - uint8_t keyboard_r(); + u8 keyboard_r(); MC6845_UPDATE_ROW(crtc_update_row); - void lola8a_io(address_map &map); - void lola8a_mem(address_map &map); + void io_map(address_map &map); + void mem_map(address_map &map); - uint8_t m_portb; - virtual void machine_reset() override { m_maincpu->set_pc(0x8000); } + u8 m_portb; + memory_passthrough_handler *m_rom_shadow_tap; required_device m_maincpu; + required_region_ptr m_rom; + required_shared_ptr m_ram; required_device m_cass; required_device m_palette; - required_shared_ptr m_p_videoram; + required_shared_ptr m_p_videoram; required_ioport_array<10> m_io_keyboard; }; -void lola8a_state::lola8a_mem(address_map &map) +void lola8a_state::mem_map(address_map &map) { map.unmap_value_high(); - map(0x0000, 0x1fff).ram(); // 6264 at G45 + map(0x0000, 0x1fff).ram().share("mainram"); // 6264 at G45 map(0x2000, 0x3fff).ram(); // 6264 at F45 // empty place for 6264 at E45 // empty place for 6264 at D45 - map(0x8000, 0x9fff).rom(); // 2764A at B45 - map(0xa000, 0xbfff).rom(); // 2764A at C45 - map(0xc000, 0xdfff).rom(); // 2764A at H67 + map(0x8000, 0x9fff).rom().region("maincpu", 0); // 2764A at B45 + map(0xa000, 0xbfff).rom().region("maincpu", 0x2000); // 2764A at C45 + map(0xc000, 0xdfff).rom().region("maincpu", 0x4000); // 2764A at H67 map(0xe000, 0xffff).ram().share("videoram"); // 6264 at G67 } -void lola8a_state::lola8a_io(address_map &map) +void lola8a_state::io_map(address_map &map) { map.unmap_value_high(); map(0x80, 0x80).w(AY8910_TAG, FUNC(ay8910_device::address_w)); @@ -251,13 +257,13 @@ MC6845_UPDATE_ROW( lola8a_state::crtc_update_row ) } -uint8_t lola8a_state::lola8a_port_a_r() +u8 lola8a_state::lola8a_port_a_r() { logerror("lola8a_port_a_r\n"); return 0x00; } -void lola8a_state::lola8a_port_b_w(uint8_t data) +void lola8a_state::lola8a_port_b_w(u8 data) { m_portb = data; } @@ -272,7 +278,7 @@ WRITE_LINE_MEMBER( lola8a_state::cass_w ) m_cass->output(state ? -1.0 : +1.0); } -uint8_t lola8a_state::keyboard_r() +u8 lola8a_state::keyboard_r() { u8 data = 0xff, kbrow = m_portb & 15; @@ -282,6 +288,31 @@ uint8_t lola8a_state::keyboard_r() return data; } +void lola8a_state::machine_reset() +{ + address_space &program = m_maincpu->space(AS_PROGRAM); + program.install_rom(0x0000, 0x1fff, m_rom); // do it here for F3 + m_rom_shadow_tap = program.install_read_tap(0x8000, 0x9fff, "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, 0x1fff, m_ram); + } + + // return the original data + return data; + }); +} + +void lola8a_state::machine_start() +{ + save_item(NAME(m_portb)); +} + WRITE_LINE_MEMBER(lola8a_state::crtc_vsync) { m_maincpu->set_input_line(I8085_RST75_LINE, state? ASSERT_LINE : CLEAR_LINE); @@ -291,8 +322,8 @@ void lola8a_state::lola8a(machine_config &config) { /* basic machine hardware */ I8085A(config, m_maincpu, XTAL(4'915'200)); - m_maincpu->set_addrmap(AS_PROGRAM, &lola8a_state::lola8a_mem); - m_maincpu->set_addrmap(AS_IO, &lola8a_state::lola8a_io); + m_maincpu->set_addrmap(AS_PROGRAM, &lola8a_state::mem_map); + m_maincpu->set_addrmap(AS_IO, &lola8a_state::io_map); m_maincpu->in_sid_func().set(FUNC(lola8a_state::cass_r)); m_maincpu->out_sod_func().set(FUNC(lola8a_state::cass_w)); @@ -326,13 +357,13 @@ void lola8a_state::lola8a(machine_config &config) /* ROM definition */ ROM_START( lola8a ) - ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) - ROM_LOAD( "lola 8a r0 w06 22.11.86.b45", 0x8000, 0x2000, CRC(aca1fc08) SHA1(f7076d937bb53b0addcba2a5b7c05ab75d6d0d93)) - ROM_LOAD( "lola 8a r1 w06 22.11.86.c45", 0xa000, 0x2000, CRC(99f8ec9b) SHA1(88eafd09c479f177525fa0039cf04d74bae39dab)) - ROM_LOAD( "lola 8a r2 w06 22.11.86.h67", 0xc000, 0x2000, CRC(1e7cd46b) SHA1(048b2583ee7baeb9621e629b79ed64583ac5d554)) + ROM_REGION( 0x6000, "maincpu", ROMREGION_ERASEFF ) + ROM_LOAD( "lola 8a r0 w06 22.11.86.b45", 0x0000, 0x2000, CRC(aca1fc08) SHA1(f7076d937bb53b0addcba2a5b7c05ab75d6d0d93)) + ROM_LOAD( "lola 8a r1 w06 22.11.86.c45", 0x2000, 0x2000, CRC(99f8ec9b) SHA1(88eafd09c479f177525fa0039cf04d74bae39dab)) + ROM_LOAD( "lola 8a r2 w06 22.11.86.h67", 0x4000, 0x2000, CRC(1e7cd46b) SHA1(048b2583ee7baeb9621e629b79ed64583ac5d554)) ROM_END /* Driver */ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1986, lola8a, 0, 0, lola8a, lola8a, lola8a_state, empty_init, "Institut Ivo Lola Ribar", "Lola 8A", 0 ) +COMP( 1986, lola8a, 0, 0, lola8a, lola8a, lola8a_state, empty_init, "Institut Ivo Lola Ribar", "Lola 8A", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/mbc200.cpp b/src/mame/drivers/mbc200.cpp index aa063294e98..369cb6ee117 100644 --- a/src/mame/drivers/mbc200.cpp +++ b/src/mame/drivers/mbc200.cpp @@ -68,6 +68,8 @@ public: , m_ppi_m(*this, "ppi_m") , m_vram(*this, "vram") , m_maincpu(*this, "maincpu") + , m_rom(*this, "maincpu") + , m_ram(*this, "mainram") , m_beep(*this, "beeper") , m_speaker(*this, "speaker") , m_fdc(*this, "fdc") @@ -78,28 +80,30 @@ public: void mbc200(machine_config &config); private: - uint8_t p2_porta_r(); - void p1_portc_w(uint8_t data); - void pm_porta_w(uint8_t data); - void pm_portb_w(uint8_t data); - uint8_t keyboard_r(offs_t offset); + u8 p2_porta_r(); + void p1_portc_w(u8 data); + void pm_porta_w(u8 data); + void pm_portb_w(u8 data); + u8 keyboard_r(offs_t offset); void kbd_put(u8 data); MC6845_UPDATE_ROW(update_row); required_device m_palette; - void mbc200_io(address_map &map); - void mbc200_mem(address_map &map); - void mbc200_sub_io(address_map &map); - void mbc200_sub_mem(address_map &map); + void main_io(address_map &map); + void main_mem(address_map &map); + void sub_io(address_map &map); + void sub_mem(address_map &map); virtual void machine_start() override; virtual void machine_reset() override; - uint8_t m_comm_latch; - uint8_t m_term_data; + u8 m_comm_latch; + u8 m_term_data; required_device m_crtc; required_device m_ppi_m; - required_shared_ptr m_vram; + required_shared_ptr m_vram; required_device m_maincpu; + required_region_ptr m_rom; + required_shared_ptr m_ram; required_device m_beep; required_device m_speaker; required_device m_fdc; @@ -108,26 +112,24 @@ private: }; -void mbc200_state::mbc200_mem(address_map &map) +void mbc200_state::main_mem(address_map &map) { - map.unmap_value_high(); - map(0x0000, 0x0fff).ram().region("maincpu", 0); - map(0x1000, 0xffff).ram(); + map(0x0000, 0xffff).ram().share("mainram"); } -void mbc200_state::p1_portc_w(uint8_t data) +void mbc200_state::p1_portc_w(u8 data) { m_speaker->level_w(BIT(data,4)); // used by beep command in basic } -void mbc200_state::pm_porta_w(uint8_t data) +void mbc200_state::pm_porta_w(u8 data) { machine().scheduler().synchronize(); // force resync //printf("A %02x %c\n",data,data); m_comm_latch = data; // to slave CPU } -void mbc200_state::pm_portb_w(uint8_t data) +void mbc200_state::pm_portb_w(u8 data) { floppy_image_device *floppy = nullptr; @@ -148,7 +150,7 @@ void mbc200_state::pm_portb_w(uint8_t data) m_beep->set_state(BIT(data, 1)); // key-click } -void mbc200_state::mbc200_io(address_map &map) +void mbc200_state::main_io(address_map &map) { map.unmap_value_high(); map.global_mask(0xff); @@ -161,7 +163,7 @@ void mbc200_state::mbc200_io(address_map &map) -void mbc200_state::mbc200_sub_mem(address_map &map) +void mbc200_state::sub_mem(address_map &map) { map.unmap_value_high(); map(0x0000, 0x2fff).rom(); @@ -169,16 +171,16 @@ void mbc200_state::mbc200_sub_mem(address_map &map) map(0x8000, 0xffff).ram().share("vram"); } -uint8_t mbc200_state::p2_porta_r() +u8 mbc200_state::p2_porta_r() { machine().scheduler().synchronize(); // force resync - uint8_t tmp = m_comm_latch; + u8 tmp = m_comm_latch; m_comm_latch = 0; m_ppi_m->pc6_w(0); // ppi_ack return tmp; } -void mbc200_state::mbc200_sub_io(address_map &map) +void mbc200_state::sub_io(address_map &map) { map.unmap_value_high(); map.global_mask(0xff); @@ -192,9 +194,9 @@ void mbc200_state::mbc200_sub_io(address_map &map) static INPUT_PORTS_START( mbc200 ) INPUT_PORTS_END -uint8_t mbc200_state::keyboard_r(offs_t offset) +u8 mbc200_state::keyboard_r(offs_t offset) { - uint8_t data = 0; + u8 data = 0; if (offset) { if (m_term_data) @@ -250,13 +252,13 @@ void mbc200_state::kbd_put(u8 data) void mbc200_state::machine_start() { + save_item(NAME(m_comm_latch)); + save_item(NAME(m_term_data)); } void mbc200_state::machine_reset() { - uint8_t* roms = memregion("roms")->base(); - uint8_t* main = memregion("maincpu")->base(); - memcpy(main, roms, 0x1000); + memcpy(m_ram, m_rom, 0x1000); } static void mbc200_floppies(device_slot_interface &device) @@ -267,9 +269,9 @@ static void mbc200_floppies(device_slot_interface &device) MC6845_UPDATE_ROW( mbc200_state::update_row ) { const rgb_t *palette = m_palette->palette()->entry_list_raw(); - uint8_t gfx; - uint16_t mem,x; - uint32_t *p = &bitmap.pix32(y); + u8 gfx; + u16 mem,x; + u32 *p = &bitmap.pix32(y); for (x = 0; x < x_count; x++) { @@ -286,7 +288,7 @@ MC6845_UPDATE_ROW( mbc200_state::update_row ) } } -static const gfx_layout mbc200_chars_8x8 = +static const gfx_layout charlayout = { 8,8, 256, @@ -298,7 +300,7 @@ static const gfx_layout mbc200_chars_8x8 = }; static GFXDECODE_START( gfx_mbc200 ) - GFXDECODE_ENTRY( "subcpu", 0x1800, mbc200_chars_8x8, 0, 1 ) + GFXDECODE_ENTRY( "subcpu", 0x1800, charlayout, 0, 1 ) GFXDECODE_END @@ -306,12 +308,12 @@ void mbc200_state::mbc200(machine_config &config) { /* basic machine hardware */ Z80(config, m_maincpu, 8_MHz_XTAL / 2); // NEC D780C-1 - m_maincpu->set_addrmap(AS_PROGRAM, &mbc200_state::mbc200_mem); - m_maincpu->set_addrmap(AS_IO, &mbc200_state::mbc200_io); + m_maincpu->set_addrmap(AS_PROGRAM, &mbc200_state::main_mem); + m_maincpu->set_addrmap(AS_IO, &mbc200_state::main_io); z80_device &subcpu(Z80(config, "subcpu", 8_MHz_XTAL / 2)); // NEC D780C-1 - subcpu.set_addrmap(AS_PROGRAM, &mbc200_state::mbc200_sub_mem); - subcpu.set_addrmap(AS_IO, &mbc200_state::mbc200_sub_io); + subcpu.set_addrmap(AS_PROGRAM, &mbc200_state::sub_mem); + subcpu.set_addrmap(AS_IO, &mbc200_state::sub_io); /* video hardware */ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); @@ -359,9 +361,9 @@ void mbc200_state::mbc200(machine_config &config) /* ROM definition */ ROM_START( mbc200 ) - ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASEFF ) - ROM_REGION( 0x1000, "roms", 0 ) + ROM_REGION( 0x1000, "maincpu", 0 ) ROM_LOAD( "d2732a.bin", 0x0000, 0x1000, CRC(bf364ce8) SHA1(baa3a20a5b01745a390ef16628dc18f8d682d63b)) + ROM_REGION( 0x3000, "subcpu", ROMREGION_ERASEFF ) ROM_LOAD( "m5l2764.bin", 0x0000, 0x2000, CRC(377300a2) SHA1(8563172f9e7f84330378a8d179f4138be5fda099)) ROM_END @@ -369,4 +371,5 @@ ROM_END /* Driver */ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1982, mbc200, 0, 0, mbc200, mbc200, mbc200_state, empty_init, "Sanyo", "MBC-200", 0 ) +COMP( 1982, mbc200, 0, 0, mbc200, mbc200, mbc200_state, empty_init, "Sanyo", "MBC-200", MACHINE_SUPPORTS_SAVE ) + diff --git a/src/mame/drivers/meritum.cpp b/src/mame/drivers/meritum.cpp index 27938d4b5ff..a91fc301bf8 100644 --- a/src/mame/drivers/meritum.cpp +++ b/src/mame/drivers/meritum.cpp @@ -12,7 +12,7 @@ Meritum III hires graphics mode added; only pre-production units were made. Split from trs80.cpp on 2018-07-15 It is quite similar to the TRS80 Model 1 Level II, however instead of the -external interface, Intel pheripheral chips were used (i8251, i8253, i8255), +external interface, Intel peripheral chips were used (i8251, i8253, i8255), and 2KB of ROM with new subroutines. Model II has an additional 8255 to act as a floppy interface, plus it has more @@ -85,14 +85,14 @@ public: void meritum2(machine_config &config); private: - void port_ff_w(uint8_t data); - uint8_t port_ff_r(); - uint8_t keyboard_r(offs_t offset); + void port_ff_w(u8 data); + u8 port_ff_r(); + u8 keyboard_r(offs_t offset); TIMER_CALLBACK_MEMBER(cassette_data_callback); DECLARE_QUICKLOAD_LOAD_MEMBER(quickload_cb); - uint32_t screen_update_meritum1(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - uint32_t screen_update_meritum2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + u32 screen_update_meritum1(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + u32 screen_update_meritum2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void mem_map(address_map &map); void io_map(address_map &map); @@ -104,8 +104,8 @@ private: bool m_cassette_data; emu_timer *m_cassette_data_timer; double m_old_cassette_val; - virtual void machine_start() override; - virtual void machine_reset() override; + void machine_start() override; + void machine_reset() override; required_device m_maincpu; required_device m_screen; required_region_ptr m_p_chargen; @@ -226,13 +226,13 @@ static INPUT_PORTS_START( meritum ) PORT_BIT(0x01, 0x01, IPT_KEYBOARD) PORT_NAME("NMI") PORT_CODE(KEYCODE_BACKSPACE) PORT_WRITE_LINE_DEVICE_MEMBER("nmigate", input_merger_device, in_w<1>) INPUT_PORTS_END -uint32_t meritum_state::screen_update_meritum1(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +u32 meritum_state::screen_update_meritum1(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) /* lores characters are in the character generator. Each character is 6x12 (basic characters are 6x7 excluding descenders/ascenders). */ { - uint8_t y,ra,chr,gfx; - uint16_t sy=0,ma=0,x; - uint8_t cols = m_mode ? 32 : 64; - uint8_t skip = m_mode ? 2 : 1; + u8 y,ra,chr,gfx; + u16 sy=0,ma=0,x; + u8 cols = m_mode ? 32 : 64; + u8 skip = m_mode ? 2 : 1; if (m_mode != m_size_store) { @@ -244,7 +244,7 @@ uint32_t meritum_state::screen_update_meritum1(screen_device &screen, bitmap_ind { for (ra = 0; ra < 12; ra++) { - uint16_t *p = &bitmap.pix16(sy++); + u16 *p = &bitmap.pix16(sy++); for (x = ma; x < ma + 64; x+=skip) { @@ -275,12 +275,12 @@ uint32_t meritum_state::screen_update_meritum1(screen_device &screen, bitmap_ind return 0; } -uint32_t meritum_state::screen_update_meritum2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +u32 meritum_state::screen_update_meritum2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - uint8_t y,ra,chr,gfx; - uint16_t sy=0,ma=0,x; - uint8_t cols = m_mode ? 32 : 64; - uint8_t skip = m_mode ? 2 : 1; + u8 y,ra,chr,gfx; + u16 sy=0,ma=0,x; + u8 cols = m_mode ? 32 : 64; + u8 skip = m_mode ? 2 : 1; if (m_mode != m_size_store) { @@ -326,7 +326,7 @@ TIMER_CALLBACK_MEMBER(meritum_state::cassette_data_callback) m_old_cassette_val = new_val; } -uint8_t meritum_state::port_ff_r() +u8 meritum_state::port_ff_r() { /* ModeSel and cassette data d7 cassette data from tape @@ -335,7 +335,7 @@ uint8_t meritum_state::port_ff_r() return (m_mode ? 0 : 0x40) | (m_cassette_data ? 0x80 : 0) | 0x3f; } -void meritum_state::port_ff_w(uint8_t data) +void meritum_state::port_ff_w(u8 data) { /* Standard output port of Model I d3 ModeSel bit @@ -359,7 +359,7 @@ void meritum_state::port_ff_w(uint8_t data) } } -uint8_t meritum_state::keyboard_r(offs_t offset) +u8 meritum_state::keyboard_r(offs_t offset) { u8 i, result = 0; @@ -374,6 +374,10 @@ void meritum_state::machine_start() { m_cassette_data_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(meritum_state::cassette_data_callback),this)); m_cassette_data_timer->adjust( attotime::zero, 0, attotime::from_hz(11025) ); + save_item(NAME(m_mode)); + save_item(NAME(m_size_store)); + save_item(NAME(m_cassette_data)); + save_item(NAME(m_old_cassette_val)); } void meritum_state::machine_reset() @@ -404,9 +408,9 @@ QUICKLOAD_LOAD_MEMBER(meritum_state::quickload_cb) { address_space &program = m_maincpu->space(AS_PROGRAM); - uint8_t type, length; - uint8_t data[0x100]; - uint8_t addr[2]; + u8 type, length; + u8 data[0x100]; + u8 addr[2]; void *ptr; while (!image.image_feof()) @@ -455,7 +459,7 @@ QUICKLOAD_LOAD_MEMBER(meritum_state::quickload_cb) /**************************** F4 CHARACTER DISPLAYER ***********************************************************/ -static const gfx_layout meritum_charlayout = +static const gfx_layout charlayout = { 6, 12, /* 6 x 12 characters */ 256, /* 256 characters */ @@ -469,7 +473,7 @@ static const gfx_layout meritum_charlayout = }; static GFXDECODE_START(gfx_meritum) - GFXDECODE_ENTRY( "chargen", 0, meritum_charlayout, 0, 1 ) + GFXDECODE_ENTRY( "chargen", 0, charlayout, 0, 1 ) GFXDECODE_END @@ -587,6 +591,6 @@ ROM_END // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1983, meritum1, 0, trs80l2, meritum1, meritum, meritum_state, empty_init, "Mera-Elzab", "Meritum I (Model 1)", 0 ) -COMP( 1985, meritum2, meritum1, 0, meritum2, meritum, meritum_state, empty_init, "Mera-Elzab", "Meritum I (Model 2)", 0 ) -COMP( 1985, meritum_net, meritum1, 0, meritum2, meritum, meritum_state, empty_init, "Mera-Elzab", "Meritum I (Model 2) (network)", 0 ) +COMP( 1983, meritum1, 0, trs80l2, meritum1, meritum, meritum_state, empty_init, "Mera-Elzab", "Meritum I (Model 1)", MACHINE_SUPPORTS_SAVE ) +COMP( 1985, meritum2, meritum1, 0, meritum2, meritum, meritum_state, empty_init, "Mera-Elzab", "Meritum I (Model 2)", MACHINE_SUPPORTS_SAVE ) +COMP( 1985, meritum_net, meritum1, 0, meritum2, meritum, meritum_state, empty_init, "Mera-Elzab", "Meritum I (Model 2) (network)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/mes.cpp b/src/mame/drivers/mes.cpp index dfefe69f66b..24b69b6866a 100644 --- a/src/mame/drivers/mes.cpp +++ b/src/mame/drivers/mes.cpp @@ -31,7 +31,9 @@ public: void mes(machine_config &config); private: - uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void machine_reset() override; + void machine_start() override; + u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void kbd_put(u8 data); u8 port00_r(); u8 port08_r(); @@ -41,9 +43,8 @@ private: u8 m_term_data; u8 m_port08; - virtual void machine_reset() override; required_device m_maincpu; - required_shared_ptr m_p_videoram; + required_shared_ptr m_p_videoram; required_region_ptr m_p_chargen; }; @@ -63,7 +64,7 @@ u8 mes_state::port08_r() void mes_state::mem_map(address_map &map) { map.unmap_value_high(); - map(0x0000, 0x0fff).rom().region("roms", 0); + map(0x0000, 0x0fff).rom(); map(0x1000, 0xefff).ram(); map(0xf000, 0xffff).ram().share("videoram"); } @@ -82,6 +83,12 @@ void mes_state::io_map(address_map &map) static INPUT_PORTS_START( mes ) INPUT_PORTS_END +void mes_state::machine_start() +{ + save_item(NAME(m_term_data)); + save_item(NAME(m_port08)); +} + void mes_state::machine_reset() { m_port08 = 0; @@ -92,14 +99,14 @@ void mes_state::machine_reset() Also the screen dimensions are a guess. */ uint32_t mes_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - uint8_t y,ra,chr,gfx; - uint16_t sy=0,ma=0,x; + u8 y,ra,chr,gfx; + u16 sy=0,ma=0,x; for (y = 0; y < 25; y++) { for (ra = 0; ra < 10; ra++) { - uint16_t *p = &bitmap.pix16(sy++); + u16 *p = &bitmap.pix16(sy++); for (x = ma; x < ma + 80; x++) { @@ -160,10 +167,10 @@ void mes_state::mes(machine_config &config) /* ROM definition */ ROM_START( mes ) - ROM_REGION( 0x1000, "roms", ROMREGION_ERASEFF ) + ROM_REGION( 0x1000, "maincpu", 0 ) ROM_LOAD( "mescpu.bin", 0x0000, 0x1000, CRC(b6d90cf4) SHA1(19e608af5bdaabb00a134e1106b151b00e2a0b04)) - ROM_REGION( 0x2000, "xebec", ROMREGION_ERASEFF ) + ROM_REGION( 0x2000, "xebec", 0 ) ROM_LOAD( "mesxebec.bin", 0x0000, 0x2000, CRC(061b7212) SHA1(c5d600116fb7563c69ebd909eb9613269b2ada0f)) /* character generator not dumped, using the one from 'c10' for now */ @@ -174,4 +181,4 @@ ROM_END /* Driver */ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 198?, mes, 0, 0, mes, mes, mes_state, empty_init, "Schleicher", "MES", MACHINE_NOT_WORKING | MACHINE_NO_SOUND) +COMP( 198?, mes, 0, 0, mes, mes, mes_state, empty_init, "Schleicher", "MES", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/mits680b.cpp b/src/mame/drivers/mits680b.cpp index 41e41c7c028..581a3239a50 100644 --- a/src/mame/drivers/mits680b.cpp +++ b/src/mame/drivers/mits680b.cpp @@ -93,4 +93,4 @@ ROM_END /* Driver */ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1976, mits680b, 0, 0, mits680b, mits680b, mits680b_state, empty_init, "MITS", "Altair 680b", MACHINE_NOT_WORKING | MACHINE_NO_SOUND) +COMP( 1976, mits680b, 0, 0, mits680b, mits680b, mits680b_state, empty_init, "MITS", "Altair 680b", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/modellot.cpp b/src/mame/drivers/modellot.cpp index 762468eecdc..8e8e710fe06 100644 --- a/src/mame/drivers/modellot.cpp +++ b/src/mame/drivers/modellot.cpp @@ -53,35 +53,41 @@ class modellot_state : public driver_device public: modellot_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) - , m_p_videoram(*this, "videoram") , m_maincpu(*this, "maincpu") + , m_rom(*this, "maincpu") + , m_ram(*this, "mainram") + , m_p_videoram(*this, "videoram") , m_p_chargen(*this, "chargen") { } void modellot(machine_config &config); private: - uint8_t port77_r(); - uint8_t portff_r(); + u8 port77_r(); + u8 portff_r(); void kbd_put(u8 data); - uint32_t screen_update_modellot(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + u32 screen_update_modellot(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void io_map(address_map &map); void mem_map(address_map &map); - uint8_t m_term_data; - virtual void machine_reset() override; - required_shared_ptr m_p_videoram; + u8 m_term_data; + void machine_start() override; + void machine_reset() override; + memory_passthrough_handler *m_rom_shadow_tap; required_device m_maincpu; + required_region_ptr m_rom; + required_shared_ptr m_ram; + required_shared_ptr m_p_videoram; required_region_ptr m_p_chargen; }; void modellot_state::mem_map(address_map &map) { map.unmap_value_high(); - map(0x0000, 0xbfff).ram(); // 48k ram + map(0x0000, 0xbfff).ram().share("mainram"); // 48k ram map(0xc000, 0xc3ff).ram().share("videoram"); - map(0xe000, 0xffff).rom(); + map(0xe000, 0xffff).rom().region("maincpu", 0); } void modellot_state::io_map(address_map &map) @@ -97,14 +103,14 @@ void modellot_state::io_map(address_map &map) static INPUT_PORTS_START( modellot ) INPUT_PORTS_END -uint8_t modellot_state::port77_r() +u8 modellot_state::port77_r() { return 4; } -uint8_t modellot_state::portff_r() +u8 modellot_state::portff_r() { - uint8_t data = (m_term_data) ? m_term_data ^ 0x7f : 0xff; + u8 data = (m_term_data) ? (m_term_data ^ 0x7f) : 0xff; m_term_data = 0; return data; } @@ -117,10 +123,31 @@ void modellot_state::kbd_put(u8 data) void modellot_state::machine_reset() { m_term_data = 1; - m_maincpu->set_state_int(Z80_PC, 0xe000); + + 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(0xe000, 0xe7ff, "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 modellot_state::machine_start() +{ + save_item(NAME(m_term_data)); } -const gfx_layout modellot_charlayout = +const gfx_layout charlayout = { 8, 16, /* 8x16 characters */ 128, /* 128 characters */ @@ -133,20 +160,20 @@ const gfx_layout modellot_charlayout = }; static GFXDECODE_START( gfx_modellot ) - GFXDECODE_ENTRY( "chargen", 0x0000, modellot_charlayout, 0, 1 ) + GFXDECODE_ENTRY( "chargen", 0x0000, charlayout, 0, 1 ) GFXDECODE_END -uint32_t modellot_state::screen_update_modellot(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +u32 modellot_state::screen_update_modellot(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - uint8_t y,ra,chr,gfx,inv; - uint16_t sy=0,ma=0,x; + u8 y,ra,chr,gfx,inv; + u16 sy=0,ma=0,x; for (y = 0; y < 16; y++) { for (ra = 0; ra < 16; ra++) { - uint16_t *p = &bitmap.pix16(sy++); + u16 *p = &bitmap.pix16(sy++); for (x = 0; x < 64; x++) { @@ -207,10 +234,10 @@ void modellot_state::modellot(machine_config &config) /* ROM definition */ ROM_START( modellot ) - ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASEFF ) //ROM_LOAD( "fdc8119.u3", 0x0000, 0x0400, CRC(a8aee944) SHA1(f2cc598ed2e7a1a620e2f3f53c1a573965f6af26)) - ROM_LOAD( "dt49-48.u1", 0xe000, 0x0400, CRC(2441c438) SHA1(832994a4214a744b7e19e5f74000c95ae65e3759)) - ROM_LOAD( "ht20.u2", 0xe400, 0x0400, CRC(497c0495) SHA1(d03beebc4c31284729f6eac3bdf1fbf44adf7fff)) + ROM_LOAD( "dt49-48.u1", 0x0000, 0x0400, CRC(2441c438) SHA1(832994a4214a744b7e19e5f74000c95ae65e3759)) + ROM_LOAD( "ht20.u2", 0x0400, 0x0400, CRC(497c0495) SHA1(d03beebc4c31284729f6eac3bdf1fbf44adf7fff)) ROM_REGION( 0x0800, "chargen", ROMREGION_INVERT ) ROM_LOAD( "gcem1.u3", 0x0000, 0x0200, CRC(e7739268) SHA1(091ef69282abe657d5f38c70a572964f5200a1d5)) @@ -220,4 +247,5 @@ ROM_START( modellot ) ROM_END /* Driver */ -COMP( 1979, modellot, 0, 0, modellot, modellot, modellot_state, empty_init, "General Processor", "Modello T", MACHINE_IS_SKELETON ) +COMP( 1979, modellot, 0, 0, modellot, modellot, modellot_state, empty_init, "General Processor", "Modello T", MACHINE_IS_SKELETON | MACHINE_SUPPORTS_SAVE ) + diff --git a/src/mame/drivers/pulsar.cpp b/src/mame/drivers/pulsar.cpp index 68102fb59ee..65ace2fa1f0 100644 --- a/src/mame/drivers/pulsar.cpp +++ b/src/mame/drivers/pulsar.cpp @@ -193,6 +193,10 @@ INPUT_PORTS_END void pulsar_state::machine_reset() { + + m_rom_in_map = true; + m_rtc->cs_w(1); // always enabled + 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) @@ -209,9 +213,6 @@ void pulsar_state::machine_reset() // return the original data return data; }); - - m_rom_in_map = true; - m_rtc->cs_w(1); // always enabled } void pulsar_state::machine_start() -- cgit v1.2.3