xerox820.cpp: Use memory view for bankswitching

This commit is contained in:
AJR 2021-05-24 10:08:40 -04:00
parent da1bd3b0ec
commit b410116212
2 changed files with 20 additions and 57 deletions

View File

@ -64,45 +64,6 @@
/* Read/Write Handlers */
void xerox820_state::bankswitch(int bank)
{
address_space &program = m_maincpu->space(AS_PROGRAM);
uint8_t *ram = m_ram->pointer();
if (bank)
{
/* ROM */
program.install_rom(0x0000, 0x0fff, m_rom->base());
program.unmap_readwrite(0x1000, 0x1fff);
program.install_ram(0x3000, 0x3fff, m_video_ram);
}
else
{
/* RAM */
program.install_ram(0x0000, 0x3fff, ram);
}
}
void xerox820ii_state::bankswitch(int bank)
{
address_space &program = m_maincpu->space(AS_PROGRAM);
uint8_t *ram = m_ram->pointer();
if (bank)
{
/* ROM */
program.install_rom(0x0000, 0x1fff, m_rom->base());
program.unmap_readwrite(0x2000, 0x2fff);
program.install_ram(0x3000, 0x3fff, m_video_ram);
program.unmap_readwrite(0x4000, 0xbfff);
}
else
{
/* RAM */
program.install_ram(0x0000, 0xbfff, ram);
}
}
uint8_t xerox820_state::fdc_r(offs_t offset)
{
return m_fdc->read(offset) ^ 0xff;
@ -175,7 +136,10 @@ void xerox820ii_state::sync_w(offs_t offset, uint8_t data)
void xerox820_state::xerox820_mem(address_map &map)
{
map.unmap_value_high();
map(0x3000, 0x3fff).ram().share("video_ram");
map(0x0000, 0x3fff).view(m_view);
m_view[0](0x0000, 0x3fff).ram();
m_view[1](0x0000, 0x0fff).rom().region(Z80_TAG, 0);
m_view[1](0x3000, 0x3fff).ram().share("video_ram");
map(0x4000, 0xffff).ram();
}
@ -194,7 +158,10 @@ void xerox820_state::xerox820_io(address_map &map)
void xerox820ii_state::xerox820ii_mem(address_map &map)
{
map.unmap_value_high();
map(0x3000, 0x3fff).ram().share("video_ram");
map(0x0000, 0xbfff).view(m_view);
m_view[0](0x0000, 0xbfff).ram();
m_view[1](0x0000, 0x1fff).rom().region(Z80_TAG, 0);
m_view[1](0x3000, 0x3fff).ram().share("video_ram");
map(0xc000, 0xffff).ram();
}
@ -217,6 +184,9 @@ void xerox820ii_state::xerox168_mem(address_map &map)
void xerox820_state::mk83_mem(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x2fff).view(m_view);
m_view[0](0x0000, 0x2fff).ram();
m_view[1](0x0000, 0x0fff).rom().region(Z80_TAG, 0);
map(0x3000, 0x6fff).ram();
map(0x7000, 0x7fff).ram().share("video_ram");
map(0x8000, 0xffff).ram();
@ -312,7 +282,7 @@ void xerox820_state::kbpio_pa_w(uint8_t data)
m_ncset2 = !BIT(data, 6);
/* bank switching */
bankswitch(BIT(data, 7));
m_view.select(BIT(data, 7));
}
void bigboard_state::kbpio_pa_w(uint8_t data)
@ -413,7 +383,7 @@ QUICKLOAD_LOAD_MEMBER(xerox820_state::quickload_cb)
if (image.length() >= 0xfd00)
return image_init_result::FAIL;
bankswitch(0);
m_view.select(0);
/* Avoid loading a program if CP/M-80 is not in memory */
if ((prog_space.read_byte(0) != 0xc3) || (prog_space.read_byte(5) != 0xc3))
@ -544,14 +514,14 @@ void xerox820_state::machine_start()
void xerox820_state::machine_reset()
{
bankswitch(1);
m_view.select(1);
m_fdc->reset();
}
void bigboard_state::machine_reset()
{
bankswitch(1);
m_view.select(1);
/* bigboard has a one-pulse output to drive a user-supplied beeper */
m_beeper->set_state(0);
@ -561,7 +531,7 @@ void bigboard_state::machine_reset()
void xerox820ii_state::machine_reset()
{
bankswitch(1);
m_view.select(1);
m_fdc->reset();
@ -684,9 +654,6 @@ void xerox820_state::xerox820(machine_config &config)
XEROX_820_KEYBOARD(config, m_kb, 0);
m_kb->kbstb_wr_callback().set(m_kbpio, FUNC(z80pio_device::strobe_b));
/* internal ram */
RAM(config, m_ram).set_default_size("64K");
// software lists
SOFTWARE_LIST(config, "flop_list").set_original("xerox820");
QUICKLOAD(config, "quickload", "com,cpm", attotime::from_seconds(3)).set_load_callback(FUNC(xerox820_state::quickload_cb));
@ -793,9 +760,6 @@ void xerox820ii_state::xerox820ii(machine_config &config)
INPUT_BUFFER(config, "sasi_data_in");
INPUT_BUFFER(config, "sasi_ctrl_in");
/* internal ram */
RAM(config, m_ram).set_default_size("64K");
// software lists
SOFTWARE_LIST(config, "flop_list").set_original("xerox820ii");
QUICKLOAD(config, "quickload", "com,cpm", attotime::from_seconds(3)).set_load_callback(FUNC(xerox820_state::quickload_cb));
@ -808,7 +772,7 @@ void xerox820ii_state::xerox168(machine_config &config)
i8086.set_addrmap(AS_PROGRAM, &xerox820ii_state::xerox168_mem);
/* internal ram */
m_ram->set_default_size("192K").set_extra_options("320K");
RAM(config, m_ram).set_default_size("192K").set_extra_options("320K");
}
void xerox820_state::mk83(machine_config & config)

View File

@ -65,6 +65,7 @@ public:
m_rom(*this, Z80_TAG),
m_char_rom(*this, "chargen"),
m_video_ram(*this, "video_ram"),
m_view(*this, "view"),
m_fdc_irq(0),
m_fdc_drq(0),
m_8n5(0),
@ -104,7 +105,7 @@ protected:
required_device<z80ctc_device> m_ctc;
required_device<z80sio_device> m_sio;
required_device<wd_fdc_device_base> m_fdc;
required_device<ram_device> m_ram;
optional_device<ram_device> m_ram;
required_device<palette_device> m_palette;
required_device<floppy_connector> m_floppy0;
required_device<floppy_connector> m_floppy1;
@ -112,8 +113,8 @@ protected:
required_memory_region m_rom;
required_memory_region m_char_rom;
required_shared_ptr<uint8_t> m_video_ram;
memory_view m_view;
virtual void bankswitch(int bank);
void update_nmi();
/* video state */
@ -181,8 +182,6 @@ public:
protected:
virtual void machine_reset() override;
void bankswitch(int bank) override;
required_device<speaker_sound_device> m_speaker;
required_device<scsi_port_device> m_sasibus;
};