(nw) micral: don't write in regions

This commit is contained in:
Robbbert 2020-06-08 00:20:06 +10:00
parent 30c89549f8
commit c393eadd21

View File

@ -73,8 +73,9 @@ public:
micral_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_beep(*this, "beeper")
, m_p_videoram(*this, "vram")
, m_p_chargen(*this, "chargen")
, m_uart(*this, "uart")
, m_crtc(*this, "crtc")
@ -82,10 +83,9 @@ public:
void micral(machine_config &config);
void init_micral();
private:
DECLARE_MACHINE_RESET(micral);
virtual void machine_reset() override;
virtual void machine_start() override;
u8 keyin_r();
u8 status_r();
u8 unk_r();
@ -100,9 +100,12 @@ private:
u16 s_curpos;
u8 s_command;
u8 s_data;
std::unique_ptr<u8[]> m_vram;
memory_passthrough_handler *m_rom_shadow_tap;
required_device<cpu_device> m_maincpu;
required_region_ptr<u8> m_rom;
required_shared_ptr<u8> m_ram;
//required_device<beep_device> m_beep;
required_region_ptr<u8> m_p_videoram;
required_region_ptr<u8> m_p_chargen;
required_device<ay31015_device> m_uart;
required_device<crt5037_device> m_crtc;
@ -131,7 +134,7 @@ u8 micral_state::video_r(offs_t offset)
if (offset)
return 0x07;
else
return m_p_videoram[s_curpos];
return m_vram[s_curpos];
}
void micral_state::video_w(offs_t offset, u8 data)
@ -146,10 +149,10 @@ void micral_state::video_w(offs_t offset, u8 data)
s_curpos = (s_curpos & 0xff) | ((s_data & 0x1f) << 8);
else
if (s_command == 0xa0)
m_p_videoram[s_curpos] = s_data;
m_vram[s_curpos] = s_data;
//if (s_command < 0x10)
//m_crtc->write(space, s_command, s_data);
//m_crtc->write(s_command, s_data);
}
else
{
@ -161,9 +164,8 @@ void micral_state::video_w(offs_t offset, u8 data)
void micral_state::mem_map(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0xf7ff).ram();
map(0xf800, 0xfeff).rom();
map(0xff00, 0xffef).ram();
map(0x0000, 0xffef).ram().share("mainram");
map(0xf800, 0xfeff).rom().region("maincpu", 0);
map(0xfff6, 0xfff7); // .nopw(); // unknown ports
map(0xfff8, 0xfff9).rw(FUNC(micral_state::video_r), FUNC(micral_state::video_w));
map(0xfffa, 0xfffa).r(FUNC(micral_state::keyin_r));
@ -335,7 +337,7 @@ uint32_t micral_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap
gfx = 0;
if (ra < 9)
{
chr = m_p_videoram[x+ma];
chr = m_vram[x+ma];
gfx = m_p_chargen[(chr<<4) | ra ];
if (((s_curpos & 0xff)==x) && ((s_curpos >> 8)==y))
gfx ^= 0xff;
@ -356,21 +358,8 @@ uint32_t micral_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap
return 0;
}
void micral_state::init_micral()
void micral_state::machine_reset()
{
//uint8_t *main = memregion("maincpu")->base();
//membank("bankr0")->configure_entry(1, &main[0xf800]);
//membank("bankr0")->configure_entry(0, &main[0x10000]);
//membank("bankw0")->configure_entry(0, &main[0xf800]);
}
MACHINE_RESET_MEMBER( micral_state, micral )
{
//membank("bankr0")->set_entry(0); // point at rom
//membank("bankw0")->set_entry(0); // always write to ram
m_maincpu->set_state_int(Z80_PC, 0xf800);
// no idea if these are hard-coded, or programmable
m_uart->write_xr(0);
m_uart->write_xr(1);
@ -382,6 +371,32 @@ MACHINE_RESET_MEMBER( micral_state, micral )
m_uart->write_eps(1);
m_uart->write_cs(1);
m_uart->write_cs(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(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 micral_state::machine_start()
{
m_vram = make_unique_clear<u8[]>(0x2000);
save_pointer(NAME(m_vram), 0x2000);
save_item(NAME(s_curpos));
save_item(NAME(s_command));
save_item(NAME(s_data));
}
void micral_state::micral(machine_config &config)
@ -394,8 +409,6 @@ void micral_state::micral(machine_config &config)
keyboard.set_addrmap(AS_PROGRAM, &micral_state::mem_kbd);
keyboard.set_addrmap(AS_IO, &micral_state::io_kbd);
MCFG_MACHINE_RESET_OVERRIDE(micral_state, micral)
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
screen.set_refresh_hz(60);
@ -428,13 +441,11 @@ void micral_state::micral(machine_config &config)
}
ROM_START( micral )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "8022g.rom", 0xf800, 0x0800, CRC(882732a9) SHA1(3f37b82c450a54aedec209bd46fcbcf131c86313) )
ROM_REGION( 0x0800, "maincpu", 0 )
ROM_LOAD( "8022g.rom", 0x0000, 0x0800, CRC(882732a9) SHA1(3f37b82c450a54aedec209bd46fcbcf131c86313) )
ROM_REGION( 0x400, "keyboard", 0 )
ROM_LOAD( "2010221.rom", 0x000, 0x400, CRC(65123378) SHA1(401f0a648b78bf1662a1cd2546e83ba8e3cb7a42) )
ROM_REGION( 0x2000, "vram", ROMREGION_ERASEFF )
ROM_REGION( 0x0400, "keyboard", 0 )
ROM_LOAD( "2010221.rom", 0x0000, 0x0400, CRC(65123378) SHA1(401f0a648b78bf1662a1cd2546e83ba8e3cb7a42) )
// Using the chargen from 'c10' for now.
ROM_REGION( 0x2000, "chargen", 0 )
@ -442,14 +453,12 @@ ROM_START( micral )
ROM_END
ROM_START( questarm )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "qm_547_1.rom", 0xf800, 0x0800, CRC(8e6dc953) SHA1(b31375af8c6769578d2000fff3e751e94e7ae4d4) )
ROM_REGION( 0x0800, "maincpu", 0 )
ROM_LOAD( "qm_547_1.rom", 0x0000, 0x0800, CRC(8e6dc953) SHA1(b31375af8c6769578d2000fff3e751e94e7ae4d4) )
// using the keyboard ROM from 'micral' for now
ROM_REGION( 0x400, "keyboard", 0 )
ROM_LOAD( "2010221.rom", 0x000, 0x400, CRC(65123378) SHA1(401f0a648b78bf1662a1cd2546e83ba8e3cb7a42) )
ROM_REGION( 0x2000, "vram", ROMREGION_ERASEFF )
ROM_REGION( 0x0400, "keyboard", 0 )
ROM_LOAD( "2010221.rom", 0x0000, 0x0400, CRC(65123378) SHA1(401f0a648b78bf1662a1cd2546e83ba8e3cb7a42) )
// Using the chargen from 'c10' for now.
ROM_REGION( 0x2000, "chargen", 0 )
@ -459,5 +468,5 @@ ROM_END
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
COMP( 1981, micral, 0, 0, micral, micral, micral_state, init_micral, "Bull R2E", "Micral 80-22G", MACHINE_IS_SKELETON )
COMP( 1982, questarm, micral, 0, micral, micral, micral_state, init_micral, "Honeywell Bull", "Questar/M", MACHINE_IS_SKELETON )
COMP( 1981, micral, 0, 0, micral, micral, micral_state, empty_init, "Bull R2E", "Micral 80-22G", MACHINE_IS_SKELETON | MACHINE_SUPPORTS_SAVE )
COMP( 1982, questarm, micral, 0, micral, micral, micral_state, empty_init, "Honeywell Bull", "Questar/M", MACHINE_IS_SKELETON | MACHINE_SUPPORTS_SAVE )