summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Robbbert <Robbbert@users.noreply.github.com>2020-06-11 23:40:23 +1000
committer Robbbert <Robbbert@users.noreply.github.com>2020-06-11 23:40:23 +1000
commit476a9518fa71b2fbd286c8ae4d52f37a51109791 (patch)
treef2748a6badb97b1d11658c0d05f0bcffc5ffd040
parentd3a7b0ddc1272c2e0e2417a4c6906d6f7c23bd88 (diff)
(nw) more cleanups
-rw-r--r--src/mame/drivers/applix.cpp45
-rw-r--r--src/mame/drivers/cd2650.cpp40
-rw-r--r--src/mame/drivers/dmax8000.cpp65
-rw-r--r--src/mame/drivers/dms86.cpp11
-rw-r--r--src/mame/drivers/elekscmp.cpp9
-rw-r--r--src/mame/drivers/evmbug.cpp13
-rw-r--r--src/mame/drivers/fc100.cpp37
-rw-r--r--src/mame/drivers/ft68m.cpp2
-rw-r--r--src/mame/drivers/h19.cpp24
-rw-r--r--src/mame/drivers/h8.cpp59
-rw-r--r--src/mame/drivers/hpz80unk.cpp54
-rw-r--r--src/mame/drivers/imsai.cpp63
-rw-r--r--src/mame/drivers/instruct.cpp14
-rw-r--r--src/mame/drivers/mc8020.cpp2
14 files changed, 271 insertions, 167 deletions
diff --git a/src/mame/drivers/applix.cpp b/src/mame/drivers/applix.cpp
index edb5bb822f0..0c9dee9418a 100644
--- a/src/mame/drivers/applix.cpp
+++ b/src/mame/drivers/applix.cpp
@@ -109,7 +109,7 @@ public:
private:
virtual void machine_reset() override;
- virtual void video_start() override;
+ virtual void machine_start() override;
u8 applix_inputs_r();
void palette_w(offs_t offset, u16 data, u16 mem_mask = ~0);
void analog_latch_w(u16 data);
@@ -154,11 +154,11 @@ private:
u8 m_palette_latch[4];
required_shared_ptr<u16> m_base;
- void applix_mem(address_map &map);
+ void main_mem(address_map &map);
void keytronic_pc3270_io(address_map &map);
void keytronic_pc3270_program(address_map &map);
- void subcpu_io(address_map &map);
- void subcpu_mem(address_map &map);
+ void sub_io(address_map &map);
+ void sub_mem(address_map &map);
u8 m_pb;
u8 m_analog_latch;
@@ -454,7 +454,7 @@ void applix_state::fdc_cmd_w(u16 data)
m_data_or_cmd = 1;
}
-void applix_state::applix_mem(address_map &map)
+void applix_state::main_mem(address_map &map)
{
map.unmap_value_high();
map.global_mask(0xffffff);
@@ -480,14 +480,14 @@ void applix_state::applix_mem(address_map &map)
//FFFFC0, FFFFFF disk controller board
}
-void applix_state::subcpu_mem(address_map &map)
+void applix_state::sub_mem(address_map &map)
{
map(0x0000, 0x5fff).rom();
map(0x6000, 0x7fff).ram();
map(0x8000, 0xffff).bankrw("bank1");
}
-void applix_state::subcpu_io(address_map &map)
+void applix_state::sub_io(address_map &map)
{
map.global_mask(0xff);
map(0x00, 0x07).r(FUNC(applix_state::port00_r)); //PORTR
@@ -784,8 +784,29 @@ void applix_state::applix_palette(palette_device &palette) const
}
-void applix_state::video_start()
+void applix_state::machine_start()
{
+ save_item(NAME(m_video_latch));
+ save_item(NAME(m_pa));
+ save_item(NAME(m_palette_latch));
+ save_item(NAME(m_pb));
+ save_item(NAME(m_analog_latch));
+ save_item(NAME(m_dac_latch));
+ save_item(NAME(m_port08));
+ save_item(NAME(m_data_to_fdc));
+ save_item(NAME(m_data_from_fdc));
+ save_item(NAME(m_data));
+ save_item(NAME(m_data_or_cmd));
+ save_item(NAME(m_buffer_empty));
+ save_item(NAME(m_fdc_cmd));
+ save_item(NAME(m_clock_count));
+ save_item(NAME(m_cp));
+ save_item(NAME(m_p1));
+ save_item(NAME(m_p1_data));
+ save_item(NAME(m_p2));
+ save_item(NAME(m_p3));
+ save_item(NAME(m_last_write_addr));
+ save_item(NAME(m_cass_data));
}
MC6845_UPDATE_ROW( applix_state::crtc_update_row )
@@ -857,11 +878,11 @@ void applix_state::applix(machine_config &config)
{
/* basic machine hardware */
M68000(config, m_maincpu, 30_MHz_XTAL / 4); // MC68000-P10 @ 7.5 MHz
- m_maincpu->set_addrmap(AS_PROGRAM, &applix_state::applix_mem);
+ m_maincpu->set_addrmap(AS_PROGRAM, &applix_state::main_mem);
z80_device &subcpu(Z80(config, "subcpu", 16_MHz_XTAL / 2)); // Z80H
- subcpu.set_addrmap(AS_PROGRAM, &applix_state::subcpu_mem);
- subcpu.set_addrmap(AS_IO, &applix_state::subcpu_io);
+ subcpu.set_addrmap(AS_PROGRAM, &applix_state::sub_mem);
+ subcpu.set_addrmap(AS_IO, &applix_state::sub_io);
i8051_device &kbdcpu(I8051(config, "kbdcpu", 11060250));
kbdcpu.set_addrmap(AS_PROGRAM, &applix_state::keytronic_pc3270_program);
@@ -991,7 +1012,7 @@ void applix_state::init_applix()
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-COMP( 1986, applix, 0, 0, applix, applix, applix_state, init_applix, "Applix Pty Ltd", "Applix 1616", 0 )
+COMP( 1986, applix, 0, 0, applix, applix, applix_state, init_applix, "Applix Pty Ltd", "Applix 1616", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/cd2650.cpp b/src/mame/drivers/cd2650.cpp
index edc03be75fd..f5469448101 100644
--- a/src/mame/drivers/cd2650.cpp
+++ b/src/mame/drivers/cd2650.cpp
@@ -75,9 +75,9 @@ public:
void cd2650(machine_config &config);
private:
- void cd2650_data(address_map &map);
- void cd2650_io(address_map &map);
- void cd2650_mem(address_map &map);
+ void data_map(address_map &map);
+ void io_map(address_map &map);
+ void mem_map(address_map &map);
u8 keyin_r();
void kbd_put(u8 data);
DECLARE_WRITE_LINE_MEMBER(tape_deck_on_w);
@@ -85,12 +85,13 @@ private:
TIMER_DEVICE_CALLBACK_MEMBER(kansas_w);
TIMER_DEVICE_CALLBACK_MEMBER(kansas_r);
DECLARE_QUICKLOAD_LOAD_MEMBER(quickload_cb);
- uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
u8 m_term_data;
bool m_cassbit;
bool m_cassold;
u8 m_cass_data[4];
- virtual void machine_reset() override;
+ void machine_reset() override;
+ void machine_start() override;
required_device<s2650_device> m_maincpu;
required_shared_ptr<u8> m_p_videoram;
required_region_ptr<u8> m_p_chargen;
@@ -145,20 +146,20 @@ u8 cd2650_state::keyin_r()
return ret;
}
-void cd2650_state::cd2650_mem(address_map &map)
+void cd2650_state::mem_map(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x0fff).rom().region("roms", 0);
map(0x1000, 0x7fff).ram().share("videoram");
}
-void cd2650_state::cd2650_io(address_map &map)
+void cd2650_state::io_map(address_map &map)
{
map.unmap_value_high();
//map(0x80, 0x84) disk i/o
}
-void cd2650_state::cd2650_data(address_map &map)
+void cd2650_state::data_map(address_map &map)
{
map(S2650_DATA_PORT, S2650_DATA_PORT).r(FUNC(cd2650_state::keyin_r)).w("outlatch", FUNC(f9334_device::write_nibble_d3));
}
@@ -173,22 +174,29 @@ void cd2650_state::machine_reset()
m_term_data = 0x80;
}
-uint32_t cd2650_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+void cd2650_state::machine_start()
+{
+ save_item(NAME(m_term_data));
+ save_item(NAME(m_cassbit));
+ save_item(NAME(m_cassold));
+ save_item(NAME(m_cass_data));
+}
+
+u32 cd2650_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
/* The video is unusual in that the characters in each line are spaced at 16 bytes in memory,
thus line 1 starts at 1000, line 2 at 1001, etc. There are 16 lines of 80 characters.
Further, the letters have bit 6 set low, thus the range is 01 to 1A.
When the bottom of the screen is reached, it does not scroll, it just wraps around. */
- uint16_t offset = 0;
u8 y,ra,chr,gfx;
- uint16_t sy=0,x,mem;
+ u16 offset=0,sy=0,x,mem;
for (y = 0; y < 16; y++)
{
for (ra = 0; ra < CHARACTER_LINES; ra++)
{
- uint16_t *p = &bitmap.pix16(sy++);
+ u16 *p = &bitmap.pix16(sy++);
for (x = 0; x < 80; x++)
{
@@ -317,9 +325,9 @@ void cd2650_state::cd2650(machine_config &config)
{
/* basic machine hardware */
S2650(config, m_maincpu, XTAL(14'192'640) / 12); // 1.182720MHz according to RE schematic
- m_maincpu->set_addrmap(AS_PROGRAM, &cd2650_state::cd2650_mem);
- m_maincpu->set_addrmap(AS_IO, &cd2650_state::cd2650_io);
- m_maincpu->set_addrmap(AS_DATA, &cd2650_state::cd2650_data);
+ m_maincpu->set_addrmap(AS_PROGRAM, &cd2650_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &cd2650_state::io_map);
+ m_maincpu->set_addrmap(AS_DATA, &cd2650_state::data_map);
m_maincpu->sense_handler().set(FUNC(cd2650_state::cass_r));
m_maincpu->flag_handler().set([this] (bool state) { m_cassbit = state; });
@@ -381,4 +389,4 @@ ROM_END
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-COMP( 1977, cd2650, 0, 0, cd2650, cd2650, cd2650_state, empty_init, "Central Data", "2650 Computer System", 0 )
+COMP( 1977, cd2650, 0, 0, cd2650, cd2650, cd2650_state, empty_init, "Central Data", "2650 Computer System", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/dmax8000.cpp b/src/mame/drivers/dmax8000.cpp
index cb2b1eaa797..f8380edbe8d 100644
--- a/src/mame/drivers/dmax8000.cpp
+++ b/src/mame/drivers/dmax8000.cpp
@@ -42,26 +42,30 @@ public:
dmax8000_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_fdc(*this, "fdc")
, m_floppy0(*this, "fdc:0")
{ }
void dmax8000(machine_config &config);
- void init_dmax8000();
-
private:
- DECLARE_MACHINE_RESET(dmax8000);
- void port0c_w(uint8_t data);
- void port0d_w(uint8_t data);
- void port14_w(uint8_t data);
- void port40_w(uint8_t data);
+ void machine_reset() override;
+ void machine_start() override;
+ void port0c_w(u8 data);
+ void port0d_w(u8 data);
+ void port14_w(u8 data);
+ void port40_w(u8 data);
DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
- void dmax8000_io(address_map &map);
- void dmax8000_mem(address_map &map);
+ void io_map(address_map &map);
+ void mem_map(address_map &map);
+ bool m_rom_in_map;
required_device<cpu_device> m_maincpu;
+ required_region_ptr<u8> m_rom;
+ required_shared_ptr<u8> m_ram;
required_device<fd1793_device> m_fdc;
required_device<floppy_connector> m_floppy0;
};
@@ -72,7 +76,7 @@ WRITE_LINE_MEMBER( dmax8000_state::fdc_drq_w )
if (state) printf("DRQ ");
}
-void dmax8000_state::port0c_w(uint8_t data)
+void dmax8000_state::port0c_w(u8 data)
{
printf("Port0c=%X\n", data);
m_fdc->dden_w(BIT(data, 6));
@@ -86,28 +90,28 @@ void dmax8000_state::port0c_w(uint8_t data)
}
}
-void dmax8000_state::port0d_w(uint8_t data)
+void dmax8000_state::port0d_w(u8 data)
{
printf("Port0d=%X\n", data);
}
-void dmax8000_state::port14_w(uint8_t data)
+void dmax8000_state::port14_w(u8 data)
{
printf("Port14=%X\n", data);
}
-void dmax8000_state::port40_w(uint8_t data)
+void dmax8000_state::port40_w(u8 data)
{
- membank("bankr0")->set_entry(BIT(data, 0));
+ m_rom_in_map = BIT(~data, 0);
}
-void dmax8000_state::dmax8000_mem(address_map &map)
+void dmax8000_state::mem_map(address_map &map)
{
- map(0x0000, 0x0fff).bankr("bankr0").bankw("bankw0");
+ 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, 0xffff).ram();
}
-void dmax8000_state::dmax8000_io(address_map &map)
+void dmax8000_state::io_map(address_map &map)
{
map.global_mask(0xff);
map.unmap_value_high();
@@ -129,21 +133,15 @@ void dmax8000_state::dmax8000_io(address_map &map)
static INPUT_PORTS_START( dmax8000 )
INPUT_PORTS_END
-MACHINE_RESET_MEMBER( dmax8000_state, dmax8000 )
+void dmax8000_state::machine_reset()
{
- membank("bankr0")->set_entry(0); // point at rom
- membank("bankw0")->set_entry(0); // always write to ram
- m_maincpu->reset();
+ m_rom_in_map = 1;
m_maincpu->set_input_line_vector(0, 0xee); // Z80 - fdc vector
}
-void dmax8000_state::init_dmax8000()
+void dmax8000_state::machine_start()
{
- uint8_t *main = memregion("maincpu")->base();
-
- membank("bankr0")->configure_entry(1, &main[0x0000]);
- membank("bankr0")->configure_entry(0, &main[0x10000]);
- membank("bankw0")->configure_entry(0, &main[0x0000]);
+ save_item(NAME(m_rom_in_map));
}
static void floppies(device_slot_interface &device)
@@ -156,9 +154,8 @@ void dmax8000_state::dmax8000(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, 4'000'000); // no idea what crystal is used, but 4MHz clock is confirmed
- m_maincpu->set_addrmap(AS_PROGRAM, &dmax8000_state::dmax8000_mem);
- m_maincpu->set_addrmap(AS_IO, &dmax8000_state::dmax8000_io);
- MCFG_MACHINE_RESET_OVERRIDE(dmax8000_state, dmax8000)
+ m_maincpu->set_addrmap(AS_PROGRAM, &dmax8000_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &dmax8000_state::io_map);
z80ctc_device &ctc(Z80CTC(config, "ctc", 4_MHz_XTAL));
ctc.set_clk<0>(4_MHz_XTAL / 2); // 2MHz
@@ -201,12 +198,12 @@ void dmax8000_state::dmax8000(machine_config &config)
/* ROM definition */
ROM_START( dmax8000 )
- ROM_REGION( 0x11000, "maincpu", 0 )
- ROM_LOAD( "rev1_0.rom", 0x10000, 0x001000, CRC(acbec83f) SHA1(fce0a4307a791250dbdc6bb6a190f7fec3619d82) )
- // ROM_LOAD( "rev1_1.rom", 0x10000, 0x001000, CRC(2eb98a61) SHA1(cdd9a58f63ee7e3d3dd1c4ae3fd4376b308fd10f) ) // this is a hacked rom to speed up the serial port
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "rev1_0.rom", 0x0000, 0x001000, CRC(acbec83f) SHA1(fce0a4307a791250dbdc6bb6a190f7fec3619d82) )
+ // ROM_LOAD( "rev1_1.rom", 0x0000, 0x001000, CRC(2eb98a61) SHA1(cdd9a58f63ee7e3d3dd1c4ae3fd4376b308fd10f) ) // this is a hacked rom to speed up the serial port
ROM_END
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-COMP( 1981, dmax8000, 0, 0, dmax8000, dmax8000, dmax8000_state, init_dmax8000, "Datamax", "Datamax 8000", MACHINE_NOT_WORKING )
+COMP( 1981, dmax8000, 0, 0, dmax8000, dmax8000, dmax8000_state, empty_init, "Datamax", "Datamax 8000", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/dms86.cpp b/src/mame/drivers/dms86.cpp
index 01951546250..6fa3d516384 100644
--- a/src/mame/drivers/dms86.cpp
+++ b/src/mame/drivers/dms86.cpp
@@ -2,9 +2,9 @@
// copyright-holders:Robbbert
/***************************************************************************
- Digital Microsystems DMS-86
+Digital Microsystems DMS-86
- 11/01/2010 Skeleton driver.
+2010-01-11 Skeleton driver.
Monitor commands:
A Display incoming terminal data in hex
@@ -63,7 +63,7 @@ private:
void mem_map(address_map &map);
u8 m_term_data;
- virtual void machine_reset() override;
+ void machine_start() override;
required_device<cpu_device> m_maincpu;
required_device<generic_terminal_device> m_terminal;
required_device_array<z80sio_device, 2> m_sio;
@@ -128,8 +128,9 @@ static INPUT_PORTS_START( dms86 )
INPUT_PORTS_END
-void dms86_state::machine_reset()
+void dms86_state::machine_start()
{
+ save_item(NAME(m_term_data));
}
void dms86_state::kbd_put(u8 data)
@@ -180,4 +181,4 @@ ROM_END
/* Driver */
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
-COMP( 1982, dms86, 0, 0, dms86, dms86, dms86_state, empty_init, "Digital Microsystems", "DMS-86", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW )
+COMP( 1982, dms86, 0, 0, dms86, dms86, dms86_state, empty_init, "Digital Microsystems", "DMS-86", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/elekscmp.cpp b/src/mame/drivers/elekscmp.cpp
index 3150a72dcdc..0031f8ee9c0 100644
--- a/src/mame/drivers/elekscmp.cpp
+++ b/src/mame/drivers/elekscmp.cpp
@@ -69,6 +69,11 @@ private:
void elekscmp_state::machine_start()
{
m_digit.resolve();
+
+ save_item(NAME(m_cassinbit));
+ save_item(NAME(m_cassoutbit));
+ save_item(NAME(m_cassold));
+ save_item(NAME(m_cass_data));
}
void elekscmp_state::hex_display_w(offs_t offset, u8 data)
@@ -214,7 +219,7 @@ void elekscmp_state::elekscmp(machine_config &config)
/* ROM definition */
ROM_START( elekscmp )
- ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
+ ROM_REGION( 0x0600, "maincpu", 0 )
ROM_LOAD( "elbug.001", 0x0000, 0x0200, CRC(f733da28) SHA1(b65d98be03eab80478167964beec26bb327bfdf3))
ROM_LOAD( "elbug.002", 0x0200, 0x0200, CRC(529c0b88) SHA1(bd72dd890cd974e1744ca70aa3457657374cbf76))
ROM_LOAD( "elbug.003", 0x0400, 0x0200, CRC(13585ad1) SHA1(93f722b3e84095a1b701b04bf9018c891933b9ff))
@@ -223,4 +228,4 @@ ROM_END
/* Driver */
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
-COMP( 1977, elekscmp, 0, 0, elekscmp, elekscmp, elekscmp_state, empty_init, "Elektor Electronics", "Elektor SC/MP", 0 )
+COMP( 1977, elekscmp, 0, 0, elekscmp, elekscmp, elekscmp_state, empty_init, "Elektor Electronics", "Elektor SC/MP", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/evmbug.cpp b/src/mame/drivers/evmbug.cpp
index 192976bab4d..71f31e7f9c9 100644
--- a/src/mame/drivers/evmbug.cpp
+++ b/src/mame/drivers/evmbug.cpp
@@ -42,6 +42,7 @@ private:
void mem_map(address_map &map);
virtual void machine_reset() override;
+ virtual void machine_start() override;
uint8_t m_term_data;
uint8_t m_term_out;
bool m_rin;
@@ -115,6 +116,14 @@ void evmbug_state::machine_reset()
m_maincpu->reset_line(ASSERT_LINE);
}
+void evmbug_state::machine_start()
+{
+ save_item(NAME(m_term_data));
+ save_item(NAME(m_term_out));
+ save_item(NAME(m_rin));
+ save_item(NAME(m_rbrl));
+}
+
void evmbug_state::evmbug(machine_config &config)
{
// basic machine hardware
@@ -133,11 +142,11 @@ void evmbug_state::evmbug(machine_config &config)
/* ROM definition */
ROM_START( evmbug )
- ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
+ ROM_REGION( 0x8000, "maincpu", 0 )
ROM_LOAD( "evmbug.bin", 0x0000, 0x8000, CRC(a239ec56) SHA1(65b500d7d0f897ce0c320cf3ec32ff4042774599) )
ROM_END
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-COMP( 19??, evmbug, 0, 0, evmbug, evmbug, evmbug_state, empty_init, "Texas Instruments", "TMAM6095", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
+COMP( 19??, evmbug, 0, 0, evmbug, evmbug, evmbug_state, empty_init, "Texas Instruments", "TMAM6095", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/fc100.cpp b/src/mame/drivers/fc100.cpp
index 36f39b38c9a..67a08b7f92a 100644
--- a/src/mame/drivers/fc100.cpp
+++ b/src/mame/drivers/fc100.cpp
@@ -87,8 +87,8 @@ private:
{
return m_p_chargen[(ch * 16 + line) & 0xfff];
}
- void fc100_io(address_map &map);
- void fc100_mem(address_map &map);
+ void io_map(address_map &map);
+ void mem_map(address_map &map);
virtual void machine_start() override;
virtual void machine_reset() override;
@@ -120,7 +120,7 @@ private:
};
-void fc100_state::fc100_mem(address_map &map)
+void fc100_state::mem_map(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x5fff).rom().region("roms", 0);
@@ -130,7 +130,7 @@ void fc100_state::fc100_mem(address_map &map)
map(0xc000, 0xffff).ram().share("videoram");
}
-void fc100_state::fc100_io(address_map &map)
+void fc100_state::io_map(address_map &map)
{
map.unmap_value_high();
map.global_mask(0xff);
@@ -455,15 +455,6 @@ TIMER_DEVICE_CALLBACK_MEMBER( fc100_state::kansas_r)
void fc100_state::machine_start()
{
- m_ag = 0;
- m_gm2 = 0;
- m_gm1 = 0;
- m_gm0 = 0;
- m_as = 0;
- m_css = 0;
- m_intext = 0;
- m_inv = 0;
-
if (m_cart->exists())
m_maincpu->space(AS_PROGRAM).install_read_handler(0x6000, 0x6fff, read8sm_delegate(*m_cart, FUNC(generic_slot_device::read_rom)));
@@ -475,10 +466,24 @@ void fc100_state::machine_start()
save_item(NAME(m_css));
save_item(NAME(m_intext));
save_item(NAME(m_inv));
+ save_item(NAME(m_cass_data));
+ save_item(NAME(m_cassbit));
+ save_item(NAME(m_cassold));
+ save_item(NAME(m_key_pressed));
+ save_item(NAME(m_banksw_unlocked));
}
void fc100_state::machine_reset()
{
+ m_ag = 0;
+ m_gm2 = 0;
+ m_gm1 = 0;
+ m_gm0 = 0;
+ m_as = 0;
+ m_css = 0;
+ m_intext = 0;
+ m_inv = 0;
+
m_cass_data[0] = m_cass_data[1] = m_cass_data[2] = m_cass_data[3] = 0;
m_cassbit = 0;
m_cassold = 0;
@@ -513,8 +518,8 @@ void fc100_state::fc100(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(7'159'090)/2);
- m_maincpu->set_addrmap(AS_PROGRAM, &fc100_state::fc100_mem);
- m_maincpu->set_addrmap(AS_IO, &fc100_state::fc100_io);
+ m_maincpu->set_addrmap(AS_PROGRAM, &fc100_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &fc100_state::io_map);
/* video hardware */
M5C6847P1(config, m_vdg, XTAL(7'159'090)/3); // Clock not verified
@@ -581,4 +586,4 @@ ROM_END
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-CONS( 1982, fc100, 0, 0, fc100, fc100, fc100_state, init_fc100, "Goldstar", "FC-100", MACHINE_NOT_WORKING )
+CONS( 1982, fc100, 0, 0, fc100, fc100, fc100_state, init_fc100, "Goldstar", "FC-100", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/ft68m.cpp b/src/mame/drivers/ft68m.cpp
index 62fdc128e53..632140cfc69 100644
--- a/src/mame/drivers/ft68m.cpp
+++ b/src/mame/drivers/ft68m.cpp
@@ -133,4 +133,4 @@ ROM_END
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-COMP( 198?, ft68m, 0, 0, ft68m, ft68m, ft68m_state, empty_init, "Forward Technology", "FT-68M", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW )
+COMP( 198?, ft68m, 0, 0, ft68m, ft68m, ft68m_state, empty_init, "Forward Technology", "FT-68M", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/h19.cpp b/src/mame/drivers/h19.cpp
index 8dd9f74013c..e86e4948c1b 100644
--- a/src/mame/drivers/h19.cpp
+++ b/src/mame/drivers/h19.cpp
@@ -116,7 +116,7 @@ private:
void mem_map(address_map &map);
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
- virtual void machine_reset() override;
+ virtual void machine_start() override;
required_device<palette_device> m_palette;
required_device<cpu_device> m_maincpu;
@@ -369,8 +369,12 @@ INPUT_PORTS_END
#define KB_STATUS_KEYBOARD_STROBE_MASK 0x80
-void h19_state::machine_reset()
+void h19_state::machine_start()
{
+ save_item(NAME(m_transchar));
+ save_item(NAME(m_strobe));
+ save_item(NAME(m_keyclickactive));
+ save_item(NAME(m_bellactive));
}
@@ -570,7 +574,7 @@ void h19_state::h19(machine_config &config)
/* ROM definition */
ROM_START( h19 )
- ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASEFF )
// Original
ROM_LOAD( "2732_444-46_h19code.bin", 0x0000, 0x1000, CRC(f4447da0) SHA1(fb4093d5b763be21a9580a0defebed664b1f7a7b))
@@ -585,7 +589,7 @@ ROM_END
ROM_START( super19 )
// Super H19 ROM
- ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASEFF )
ROM_LOAD( "2732_super19_h447.bin", 0x0000, 0x1000, CRC(6c51aaa6) SHA1(5e368b39fe2f1af44a905dc474663198ab630117))
ROM_REGION( 0x0800, "chargen", 0 )
@@ -599,7 +603,7 @@ ROM_END
ROM_START( watz19 )
// Watzman ROM
- ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASEFF )
ROM_LOAD( "watzman.bin", 0x0000, 0x1000, CRC(8168b6dc) SHA1(bfaebb9d766edbe545d24bc2b6630be4f3aa0ce9))
ROM_REGION( 0x0800, "chargen", 0 )
@@ -612,7 +616,7 @@ ROM_END
ROM_START( ultra19 )
// ULTRA ROM
- ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
+ ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASEFF )
ROM_LOAD( "2532_h19_ultra_firmware.bin", 0x0000, 0x1000, CRC(8ad4cdb4) SHA1(d6e1fc37a1f52abfce5e9adb1819e0030bed1df3))
ROM_REGION( 0x0800, "chargen", 0 )
@@ -625,11 +629,11 @@ ROM_END
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-COMP( 1979, h19, 0, 0, h19, h19, h19_state, empty_init, "Heath Inc", "Heathkit H-19", 0 )
+COMP( 1979, h19, 0, 0, h19, h19, h19_state, empty_init, "Heath Inc", "Heathkit H-19", MACHINE_SUPPORTS_SAVE )
//Super-19 ROM - ATG Systems, Inc - Adv in Sextant Issue 4, Winter 1983. With the magazine lead-time, likely released late 1982.
-COMP( 1982, super19, h19, 0, h19, h19, h19_state, empty_init, "Heath Inc", "Heathkit H-19 w/ Super-19 ROM", 0 )
+COMP( 1982, super19, h19, 0, h19, h19, h19_state, empty_init, "Heath Inc", "Heathkit H-19 w/ Super-19 ROM", MACHINE_SUPPORTS_SAVE )
// Watzman ROM - HUG p/n 885-1121, announced in REMark Issue 33, Oct. 1982
-COMP( 1982, watz19, h19, 0, h19, h19, h19_state, empty_init, "Heath Inc", "Heathkit H-19 w/ Watzman ROM", 0 )
+COMP( 1982, watz19, h19, 0, h19, h19, h19_state, empty_init, "Heath Inc", "Heathkit H-19 w/ Watzman ROM", MACHINE_SUPPORTS_SAVE )
// ULTRA ROM - Software Wizardry, Inc., (c) 1983 William G. Parrott, III
-COMP( 1983, ultra19, h19, 0, h19, h19, h19_state, empty_init, "Heath Inc", "Heathkit H-19 w/ ULTRA ROM", 0 )
+COMP( 1983, ultra19, h19, 0, h19, h19, h19_state, empty_init, "Heath Inc", "Heathkit H-19 w/ ULTRA ROM", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/h8.cpp b/src/mame/drivers/h8.cpp
index 7eec43ceb8e..bb2c3279643 100644
--- a/src/mame/drivers/h8.cpp
+++ b/src/mame/drivers/h8.cpp
@@ -75,27 +75,27 @@ public:
DECLARE_INPUT_CHANGED_MEMBER(button_0);
private:
- uint8_t portf0_r();
- void portf0_w(uint8_t data);
- void portf1_w(uint8_t data);
- void h8_status_callback(uint8_t data);
+ u8 portf0_r();
+ void portf0_w(u8 data);
+ void portf1_w(u8 data);
+ void h8_status_callback(u8 data);
DECLARE_WRITE_LINE_MEMBER(h8_inte_callback);
TIMER_DEVICE_CALLBACK_MEMBER(h8_irq_pulse);
TIMER_DEVICE_CALLBACK_MEMBER(kansas_r);
TIMER_DEVICE_CALLBACK_MEMBER(kansas_w);
- void h8_io(address_map &map);
- void h8_mem(address_map &map);
+ void io_map(address_map &map);
+ void mem_map(address_map &map);
- uint8_t m_digit;
- uint8_t m_segment;
- uint8_t m_irq_ctl;
+ u8 m_digit;
+ u8 m_segment;
+ u8 m_irq_ctl;
bool m_ff_b;
- uint8_t m_cass_data[4];
+ u8 m_cass_data[4];
bool m_cassbit;
bool m_cassold;
virtual void machine_reset() override;
- virtual void machine_start() override { m_digits.resolve(); }
+ virtual void machine_start() override;
required_device<i8080_cpu_device> m_maincpu;
required_device<i8251_device> m_uart;
required_device<cassette_image_device> m_cass;
@@ -115,7 +115,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(h8_state::h8_irq_pulse)
m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, ASSERT_LINE, 0xcf); // I8080
}
-uint8_t h8_state::portf0_r()
+u8 h8_state::portf0_r()
{
// reads the keyboard
@@ -123,7 +123,7 @@ uint8_t h8_state::portf0_r()
// - if 0 and RTM pressed, causes int10
// - if 0 and RST pressed, resets cpu
- uint8_t i,keyin,data = 0xff;
+ u8 i,keyin,data = 0xff;
keyin = ioport("X0")->read();
if (keyin != 0xff)
@@ -145,7 +145,7 @@ uint8_t h8_state::portf0_r()
return data;
}
-void h8_state::portf0_w(uint8_t data)
+void h8_state::portf0_w(u8 data)
{
// this will always turn off int10 that was set by the timer
// d0-d3 = digit select
@@ -166,7 +166,7 @@ void h8_state::portf0_w(uint8_t data)
if (!BIT(data, 4)) m_irq_ctl |= 2;
}
-void h8_state::portf1_w(uint8_t data)
+void h8_state::portf1_w(u8 data)
{
//d7 segment dot
//d6 segment f
@@ -181,7 +181,7 @@ void h8_state::portf1_w(uint8_t data)
if (m_digit) m_digits[m_digit] = m_segment;
}
-void h8_state::h8_mem(address_map &map)
+void h8_state::mem_map(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x0fff).rom(); // main rom
@@ -190,7 +190,7 @@ void h8_state::h8_mem(address_map &map)
map(0x2000, 0x9fff).ram(); // main ram
}
-void h8_state::h8_io(address_map &map)
+void h8_state::io_map(address_map &map)
{
map.unmap_value_high();
map.global_mask(0xff);
@@ -251,6 +251,19 @@ void h8_state::machine_reset()
m_ff_b = 1;
}
+void h8_state::machine_start()
+{
+ m_digits.resolve();
+
+ save_item(NAME(m_digit));
+ save_item(NAME(m_segment));
+ save_item(NAME(m_irq_ctl));
+ save_item(NAME(m_ff_b));
+ save_item(NAME(m_cass_data));
+ save_item(NAME(m_cassbit));
+ save_item(NAME(m_cassold));
+}
+
WRITE_LINE_MEMBER( h8_state::h8_inte_callback )
{
// operate the ION LED
@@ -258,7 +271,7 @@ WRITE_LINE_MEMBER( h8_state::h8_inte_callback )
m_irq_ctl &= 0x7f | ((state) ? 0 : 0x80);
}
-void h8_state::h8_status_callback(uint8_t data)
+void h8_state::h8_status_callback(u8 data)
{
/* This is rather messy, but basically there are 2 D flipflops, one drives the other,
the data is /INTE while the clock is /M1. If the system is in Single Instruction mode,
@@ -309,7 +322,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(h8_state::kansas_r)
{
/* cassette - turn 1200/2400Hz to a bit */
m_cass_data[1]++;
- uint8_t cass_ws = (m_cass->input() > +0.03) ? 1 : 0;
+ u8 cass_ws = (m_cass->input() > +0.03) ? 1 : 0;
if (cass_ws != m_cass_data[0])
{
@@ -323,8 +336,8 @@ void h8_state::h8(machine_config &config)
{
/* basic machine hardware */
I8080(config, m_maincpu, H8_CLOCK);
- m_maincpu->set_addrmap(AS_PROGRAM, &h8_state::h8_mem);
- m_maincpu->set_addrmap(AS_IO, &h8_state::h8_io);
+ m_maincpu->set_addrmap(AS_PROGRAM, &h8_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &h8_state::io_map);
m_maincpu->out_status_func().set(FUNC(h8_state::h8_status_callback));
m_maincpu->out_inte_func().set(FUNC(h8_state::h8_inte_callback));
@@ -379,5 +392,5 @@ ROM_END
/* Driver */
-/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS, INIT COMPANY FULLNAME FLAGS */
-COMP( 1977, h8, 0, 0, h8, h8, h8_state, empty_init, "Heath Company", "Heathkit H8 Digital Computer", 0 )
+/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS, INIT COMPANY FULLNAME FLAGS */
+COMP( 1977, h8, 0, 0, h8, h8, h8_state, empty_init, "Heath Company", "Heathkit H8 Digital Computer", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/hpz80unk.cpp b/src/mame/drivers/hpz80unk.cpp
index 4466112a797..1aead9076b4 100644
--- a/src/mame/drivers/hpz80unk.cpp
+++ b/src/mame/drivers/hpz80unk.cpp
@@ -61,56 +61,57 @@ public:
void hpz80unk(machine_config &config);
private:
- uint8_t port00_r();
- uint8_t port02_r();
- uint8_t port03_r();
- uint8_t port0d_r();
- uint8_t portfc_r();
-
- void hpz80unk_io(address_map &map);
- void hpz80unk_mem(address_map &map);
-
- uint8_t m_port02_data;
- virtual void machine_reset() override;
+ u8 port00_r();
+ u8 port02_r();
+ u8 port03_r();
+ u8 port0d_r();
+ u8 portfc_r();
+
+ void io_map(address_map &map);
+ void mem_map(address_map &map);
+
+ u8 m_port02_data;
+ void machine_reset() override;
+ void machine_start() override;
required_device<cpu_device> m_maincpu;
- required_shared_ptr<uint8_t> m_p_rom;
+ required_shared_ptr<u8> m_p_rom;
required_device_array<ay51013_device, 3> m_uart;
};
-uint8_t hpz80unk_state::port00_r()
+u8 hpz80unk_state::port00_r()
{
return (m_uart[0]->dav_r() << 1) | (m_uart[0]->tbmt_r()) | 0xfc;
}
-uint8_t hpz80unk_state::port02_r()
+u8 hpz80unk_state::port02_r()
{
m_port02_data ^= 1;
return m_port02_data;
}
-uint8_t hpz80unk_state::port03_r()
+u8 hpz80unk_state::port03_r()
{
return (m_uart[1]->dav_r() << 1) | (m_uart[1]->tbmt_r()) | 0xfc;
}
-uint8_t hpz80unk_state::port0d_r()
+u8 hpz80unk_state::port0d_r()
{
return (m_uart[2]->dav_r() << 1) | (m_uart[2]->tbmt_r()) | 0xfc;
}
-uint8_t hpz80unk_state::portfc_r()
+u8 hpz80unk_state::portfc_r()
{
return 0xfe; // or it halts
}
-void hpz80unk_state::hpz80unk_mem(address_map &map)
+void hpz80unk_state::mem_map(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0xbfff).ram();
map(0xc000, 0xffff).rom().share("rom");
}
-void hpz80unk_state::hpz80unk_io(address_map &map)
+void hpz80unk_state::io_map(address_map &map)
{
map.unmap_value_high();
map.global_mask(0xff);
@@ -138,10 +139,15 @@ static INPUT_PORTS_START( hpz80unk )
INPUT_PORTS_END
+void hpz80unk_state::machine_start()
+{
+ save_item(NAME(m_port02_data));
+}
+
void hpz80unk_state::machine_reset()
{
- uint8_t* user1 = memregion("user1")->base();
- memcpy((uint8_t*)m_p_rom, user1, 0x4000);
+ u8* user1 = memregion("user1")->base();
+ memcpy((u8*)m_p_rom, user1, 0x4000);
m_maincpu->set_pc(0xc000);
// no idea if these are hard-coded, or programmable
@@ -167,8 +173,8 @@ void hpz80unk_state::hpz80unk(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(4'000'000));
- m_maincpu->set_addrmap(AS_PROGRAM, &hpz80unk_state::hpz80unk_mem);
- m_maincpu->set_addrmap(AS_IO, &hpz80unk_state::hpz80unk_io);
+ m_maincpu->set_addrmap(AS_PROGRAM, &hpz80unk_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &hpz80unk_state::io_map);
AY51013(config, m_uart[0]); // COM2502
m_uart[0]->read_si_callback().set("rs232a", FUNC(rs232_port_device::rxd_r));
@@ -223,4 +229,4 @@ ROM_END
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-COMP( 1977, hpz80unk, 0, 0, hpz80unk, hpz80unk, hpz80unk_state, empty_init, "Hewlett-Packard", "unknown Z80-based mainframe", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW )
+COMP( 1977, hpz80unk, 0, 0, hpz80unk, hpz80unk, hpz80unk_state, empty_init, "Hewlett-Packard", "unknown Z80-based mainframe", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/imsai.cpp b/src/mame/drivers/imsai.cpp
index 9e17fbb565c..f8b32f2beb9 100644
--- a/src/mame/drivers/imsai.cpp
+++ b/src/mame/drivers/imsai.cpp
@@ -30,6 +30,7 @@ public:
imsai_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_terminal(*this, "terminal")
, m_pit(*this, "pit")
{ }
@@ -38,31 +39,33 @@ public:
private:
void kbd_put(u8 data);
- uint8_t keyin_r();
- uint8_t status_r();
- void control_w(uint8_t data);
+ u8 keyin_r();
+ u8 status_r();
+ void control_w(u8 data);
- void imsai_io(address_map &map);
- void imsai_mem(address_map &map);
+ void io_map(address_map &map);
+ void mem_map(address_map &map);
- uint8_t m_term_data;
- virtual void machine_reset() override;
+ u8 m_term_data;
+ void machine_reset() override;
+ void machine_start() override;
+ memory_passthrough_handler *m_rom_shadow_tap;
required_device<cpu_device> m_maincpu;
+ required_region_ptr<u8> m_rom;
required_device<generic_terminal_device> m_terminal;
required_device<pit8253_device> m_pit;
};
-void imsai_state::imsai_mem(address_map &map)
+void imsai_state::mem_map(address_map &map)
{
map.unmap_value_high();
- map(0x0000, 0x07ff).rom().region("prom", 0);
map(0xd000, 0xd0ff).ram();
map(0xd100, 0xd103).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write));
- map(0xd800, 0xdfff).rom().region("prom", 0);
+ map(0xd800, 0xdfff).rom().region("maincpu", 0);
}
-void imsai_state::imsai_io(address_map &map)
+void imsai_state::io_map(address_map &map)
{
map.unmap_value_high();
map.global_mask(0xff);
@@ -79,14 +82,14 @@ void imsai_state::imsai_io(address_map &map)
static INPUT_PORTS_START( imsai )
INPUT_PORTS_END
-uint8_t imsai_state::keyin_r()
+u8 imsai_state::keyin_r()
{
- uint8_t ret = m_term_data;
+ u8 ret = m_term_data;
m_term_data = 0;
return ret;
}
-uint8_t imsai_state::status_r()
+u8 imsai_state::status_r()
{
return (m_term_data) ? 3 : 1;
}
@@ -96,21 +99,43 @@ void imsai_state::kbd_put(u8 data)
m_term_data = data;
}
-void imsai_state::control_w(uint8_t data)
+void imsai_state::control_w(u8 data)
{
}
void imsai_state::machine_reset()
{
m_term_data = 0;
+
+ 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(0xd800, 0xdfff, "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();
+
+ // remove from the memory map
+ m_maincpu->space(AS_PROGRAM).unmap_readwrite(0x0000, 0x07ff);
+ }
+
+ // return the original data
+ return data;
+ });
+}
+
+void imsai_state::machine_start()
+{
+ save_item(NAME(m_term_data));
}
void imsai_state::imsai(machine_config &config)
{
/* basic machine hardware */
I8085A(config, m_maincpu, XTAL(6'000'000));
- m_maincpu->set_addrmap(AS_PROGRAM, &imsai_state::imsai_mem);
- m_maincpu->set_addrmap(AS_IO, &imsai_state::imsai_io);
+ m_maincpu->set_addrmap(AS_PROGRAM, &imsai_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &imsai_state::io_map);
/* video hardware */
GENERIC_TERMINAL(config, m_terminal, 0);
@@ -129,7 +154,7 @@ void imsai_state::imsai(machine_config &config)
/* ROM definition */
ROM_START( imsai )
- ROM_REGION( 0x800, "prom", 0 ) // 2716 or 2708 program PROM
+ ROM_REGION( 0x800, "maincpu", 0 ) // 2716 or 2708 program PROM
ROM_LOAD( "vdb-80.rom", 0x0000, 0x0800, CRC(0afc4683) SHA1(a5419aaee00badf339d7c627f50ef8b2538e42e2) )
ROM_REGION( 0x200, "decode", 0 ) // 512x4 address decoder ROM
@@ -142,4 +167,4 @@ ROM_END
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-COMP( 1978, imsai, 0, 0, imsai, imsai, imsai_state, empty_init, "Imsai", "MPU-B", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW )
+COMP( 1978, imsai, 0, 0, imsai, imsai, imsai_state, empty_init, "Imsai", "MPU-B", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/instruct.cpp b/src/mame/drivers/instruct.cpp
index 4ed3252d4f2..af29922cd67 100644
--- a/src/mame/drivers/instruct.cpp
+++ b/src/mame/drivers/instruct.cpp
@@ -87,7 +87,8 @@ private:
void io_map(address_map &map);
void mem_map(address_map &map);
- virtual void machine_reset() override;
+ void machine_reset() override;
+ void machine_start() override;
uint16_t m_lar;
uint8_t m_digit;
u8 m_seg;
@@ -332,6 +333,15 @@ void instruct_state::machine_reset()
m_maincpu->set_state_int(S2650_PC, 0x1800);
}
+void instruct_state::machine_start()
+{
+ save_item(NAME(m_lar));
+ save_item(NAME(m_digit));
+ save_item(NAME(m_seg));
+ save_item(NAME(m_cassin));
+ save_item(NAME(m_irqstate));
+}
+
QUICKLOAD_LOAD_MEMBER(instruct_state::quickload_cb)
{
uint16_t i, exec_addr, quick_length, read_;
@@ -455,4 +465,4 @@ ROM_END
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-COMP( 1978, instruct, 0, 0, instruct, instruct, instruct_state, empty_init, "Signetics", "Signetics Instructor 50", 0 )
+COMP( 1978, instruct, 0, 0, instruct, instruct, instruct_state, empty_init, "Signetics", "Signetics Instructor 50", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/mc8020.cpp b/src/mame/drivers/mc8020.cpp
index dd249bea3ad..2a72b138d99 100644
--- a/src/mame/drivers/mc8020.cpp
+++ b/src/mame/drivers/mc8020.cpp
@@ -337,7 +337,7 @@ void mc8020_state::mc8020(machine_config &config)
/* ROM definition */
ROM_START( mc8020 )
- ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
+ ROM_REGION( 0x6000, "maincpu", ROMREGION_ERASEFF )
ROM_SYSTEM_BIOS(0, "ver1", "Version 1")
ROMX_LOAD( "s01.rom", 0x0000, 0x0400, CRC(0f1c1a62) SHA1(270c0a9e8e165658f3b09d40a3e8bb3dc1b88184), ROM_BIOS(0))
ROMX_LOAD( "s02.rom", 0x0400, 0x0400, CRC(93b5811c) SHA1(8559d24072c9b5908a2627ff986d818308f51d59), ROM_BIOS(0))