summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/pk8020.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/machine/pk8020.cpp')
-rw-r--r--src/mame/machine/pk8020.cpp937
1 files changed, 140 insertions, 797 deletions
diff --git a/src/mame/machine/pk8020.cpp b/src/mame/machine/pk8020.cpp
index 634735ecf2f..ba719d13f0d 100644
--- a/src/mame/machine/pk8020.cpp
+++ b/src/mame/machine/pk8020.cpp
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Miodrag Milanovic
+// copyright-holders:Miodrag Milanovic, AJR
/***************************************************************************
PK-8020 driver by Miodrag Milanovic
@@ -12,819 +12,106 @@
#include "emu.h"
#include "includes/pk8020.h"
-#include "cpu/i8085/i8085.h"
+#define DESCRIBE_DECPLM 1
-READ8_MEMBER(pk8020_state::keyboard_r)
-{
- uint8_t retVal=0x00;
- uint8_t line = 0;
- if (offset & 0x100) line=8;
-
- if (offset & 0x0001) retVal|=m_io_port[line]->read();
- line++;
- if (offset & 0x0002) retVal|=m_io_port[line]->read();
- line++;
- if (offset & 0x0004) retVal|=m_io_port[line]->read();
- line++;
- if (offset & 0x0008) retVal|=m_io_port[line]->read();
- line++;
- if (offset & 0x0010) retVal|=m_io_port[line]->read();
- line++;
- if (offset & 0x0020) retVal|=m_io_port[line]->read();
- line++;
- if (offset & 0x0040) retVal|=m_io_port[line]->read();
- line++;
- if (offset & 0x0080) retVal|=m_io_port[line]->read();
- line++;
-
- return retVal;
-}
-READ8_MEMBER(pk8020_state::sysreg_r)
-{
- return m_ram->pointer()[offset];
-}
-WRITE8_MEMBER(pk8020_state::sysreg_w)
+uint8_t pk8020_state::keyboard_r(offs_t offset)
{
- if (BIT(offset,7)==0) {
- pk8020_set_bank(data >> 2);
- } else if (BIT(offset,6)==0) {
- // Color
- m_color = data;
- } else if (BIT(offset,2)==0) {
- // Palette set
- uint8_t number = data & 0x0f;
- uint8_t color = data >> 4;
- uint8_t i = (color & 0x08) ? 0x3F : 0;
- uint8_t r = ((color & 0x04) ? 0xC0 : 0) + i;
- uint8_t g = ((color & 0x02) ? 0xC0 : 0) + i;
- uint8_t b = ((color & 0x01) ? 0xC0 : 0) + i;
- m_palette->set_pen_color( number, rgb_t(r,g,b) );
+ uint8_t result = 0xff;
+
+ if (BIT(offset, 8))
+ {
+ for (uint8_t line = 8; line < 16; line++)
+ if (BIT(offset, line - 8))
+ result &= m_io_port[line]->read();
+ }
+ else
+ {
+ for (uint8_t line = 0; line < 8; line++)
+ if (BIT(offset, line))
+ result &= m_io_port[line]->read();
}
-}
-READ8_MEMBER(pk8020_state::text_r)
-{
- if (m_attr == 3) m_text_attr=m_ram->pointer()[0x40400+offset];
- return m_ram->pointer()[0x40000+offset];
+ return result ^ 0xff;
}
-WRITE8_MEMBER(pk8020_state::text_w)
+void pk8020_state::sysreg_w(offs_t offset, uint8_t data)
{
- uint8_t *ram = m_ram->pointer();
- ram[0x40000+offset] = data;
- switch (m_attr) {
- case 0: break;
- case 1: ram[0x40400+offset]=0x01;break;
- case 2: ram[0x40400+offset]=0x00;break;
- case 3: ram[0x40400+offset]=m_text_attr;break;
+ if (!BIT(offset, 7))
+ {
+ m_bank_select = data & 0xfc;
+ logerror("%s: Bank select = %02X\n", machine().describe_context(), (data >> 2) & 0x1f);
}
-}
-READ8_MEMBER(pk8020_state::gzu_r)
-{
- uint8_t *addr = m_ram->pointer() + 0x10000 + (m_video_page_access * 0xC000);
- uint8_t p0 = addr[offset];
- uint8_t p1 = addr[offset + 0x4000];
- uint8_t p2 = addr[offset + 0x8000];
- uint8_t retVal = 0;
- if(m_color & 0x80) {
- // Color mode
- if (!(m_color & 0x10)) {
- p0 ^= 0xff;
- }
- if (!(m_color & 0x20)) {
- p1 ^= 0xff;
- }
- if (!(m_color & 0x40)) {
- p2 ^= 0xff;
- }
- retVal = (p0 & p1 & p2) ^ 0xff;
- } else {
- // Plane mode
- if (m_color & 0x10) {
- retVal |= p0;
- }
- if (m_color & 0x20) {
- retVal |= p1;
- }
- if (m_color & 0x40) {
- retVal |= p2;
- }
- }
- return retVal;
+ if (!BIT(offset, 6))
+ color_w(data);
+ if (!BIT(offset, 2))
+ palette_w(data);
}
-WRITE8_MEMBER(pk8020_state::gzu_w)
+uint8_t pk8020_state::memory_r(offs_t offset)
{
- uint8_t *addr = m_ram->pointer() + 0x10000 + (m_video_page_access * 0xC000);
- uint8_t *plane_0 = addr;
- uint8_t *plane_1 = addr + 0x4000;
- uint8_t *plane_2 = addr + 0x8000;
+ uint8_t select = m_decplm->read(bitswap<13>((offset & 0xff00) | m_bank_select, 2, 5, 6, 4, 12, 3, 13, 8, 9, 11, 15, 10, 14) | 0x8000);
+ uint8_t result = 0xff;
- if(m_color & 0x80)
- {
- // Color mode
- plane_0[offset] = (plane_0[offset] & ~data) | ((m_color & 2) ? data : 0);
- plane_1[offset] = (plane_1[offset] & ~data) | ((m_color & 4) ? data : 0);
- plane_2[offset] = (plane_2[offset] & ~data) | ((m_color & 8) ? data : 0);
- } else {
- // Plane mode
- uint8_t mask = (m_color & 1) ? data : 0;
- if (!(m_color & 0x02)) {
- plane_0[offset] = (plane_0[offset] & ~data) | mask;
- }
- if (!(m_color & 0x04)) {
- plane_1[offset] = (plane_1[offset] & ~data) | mask;
- }
- if (!(m_color & 0x08)) {
- plane_2[offset] = (plane_2[offset] & ~data) | mask;
- }
- }
-}
+ if (!BIT(select, 2))
+ result &= m_region_maincpu->base()[offset & 0x1fff];
+ if (!BIT(select, 3))
+ result &= m_region_maincpu->base()[(offset & 0x1fff) | 0x2000];
+ if (!BIT(select, 0))
+ result &= m_region_maincpu->base()[(offset & 0x1fff) | 0x4000];
+ if (!BIT(select, 1))
+ result &= keyboard_r(offset);
+ if (!BIT(select, 4))
+ result &= m_devbank->read8(offset);
-READ8_MEMBER(pk8020_state::devices_r)
-{
- switch(offset & 0x38)
- {
- case 0x00: return m_pit8253->read(offset & 3);
- case 0x08: return m_ppi8255_3->read(offset & 3);
- case 0x10: return m_rs232->read(offset & 1);
- case 0x18: return m_wd1793->read(offset & 0x03);
- case 0x20: return m_lan->read(offset & 1);
- case 0x28: return m_pic8259->read(offset & 1);
- case 0x30: return m_ppi8255_2->read(offset & 3);
- case 0x38: return m_ppi8255_1->read(offset & 3);
- }
- return 0xff;
-}
+ if ((select & 0xc0) == 0x00)
+ result &= m_ram->pointer()[offset];
+ else if ((select & 0xc0) == 0x40)
+ result &= gzu_r(offset & 0x3fff);
+ else if ((select & 0xc0) == 0x80)
+ result &= text_r(offset & 0x3ff);
-WRITE8_MEMBER(pk8020_state::devices_w)
-{
- switch(offset & 0x38)
- {
- case 0x00: m_pit8253->write(offset & 3, data); break;
- case 0x08: m_ppi8255_3->write(offset & 3,data); break;
- case 0x10: m_rs232->write(offset & 1, data); break;
- case 0x18: m_wd1793->write(offset & 0x03, data); break;
- case 0x20: m_lan->write(offset & 1, data); break;
- case 0x28: m_pic8259->write(offset & 1,data);break;
- case 0x30: m_ppi8255_2->write(offset & 3,data); break;
- case 0x38: m_ppi8255_1->write(offset & 3,data); break;
- }
+ return result;
}
-void pk8020_state::pk8020_set_bank(uint8_t data)
+void pk8020_state::memory_w(offs_t offset, uint8_t data)
{
- address_space &space = m_maincpu->space(AS_PROGRAM);
- uint8_t *mem = m_region_maincpu->base();
- uint8_t *ram = m_ram->pointer();
-
- switch(data & 0x1F) {
- case 0x00 :
- {
- // ROM
- space.install_read_bank (0x0000, 0x37ff, "bank1");
- space.install_write_bank(0x0000, 0x37ff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // Keyboard
- space.install_read_handler (0x3800, 0x39ff, read8_delegate(FUNC(pk8020_state::keyboard_r),this));
- space.install_write_bank(0x3800, 0x39ff, "bank3");
- membank("bank3")->set_base(ram + 0x3800);
- // System reg
- space.install_read_handler (0x3a00, 0x3aff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0x3a00, 0x3aff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- // Devices
- space.install_read_handler (0x3b00, 0x3bff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0x3b00, 0x3bff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // Text Video Memory
- space.install_read_handler (0x3c00, 0x3fff, read8_delegate(FUNC(pk8020_state::text_r),this));
- space.install_write_handler(0x3c00, 0x3fff, write8_delegate(FUNC(pk8020_state::text_w),this));
- // RAM
- space.install_read_bank (0x4000, 0xffff, "bank4");
- space.install_write_bank(0x4000, 0xffff, "bank5");
- membank("bank4")->set_base(ram + 0x4000);
- membank("bank5")->set_base(ram + 0x4000);
- }
- break;
- case 0x01 : {
- // ROM
- space.install_read_bank (0x0000, 0x1fff, "bank1");
- space.install_write_bank(0x0000, 0x1fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x2000, 0xffff, "bank3");
- space.install_write_bank(0x2000, 0xffff, "bank4");
- membank("bank3")->set_base(ram + 0x2000);
- membank("bank4")->set_base(ram + 0x2000);
- }
- break;
- case 0x02 : {
- // ROM
- space.install_read_bank (0x0000, 0x3fff, "bank1");
- space.install_write_bank(0x0000, 0x3fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x4000, 0xffff, "bank3");
- space.install_write_bank(0x4000, 0xffff, "bank4");
- membank("bank3")->set_base(ram + 0x4000);
- membank("bank4")->set_base(ram + 0x4000);
- }
- break;
- case 0x03 : {
- // RAM
- space.install_read_bank (0x0000, 0xffff, "bank1");
- space.install_write_bank(0x0000, 0xffff, "bank2");
- membank("bank1")->set_base(ram);
- membank("bank2")->set_base(ram);
- }
- break;
- case 0x04 :
- case 0x05 :
- {
- // ROM
- space.install_read_bank (0x0000, 0x1fff, "bank1");
- space.install_write_bank(0x0000, 0x1fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x2000, 0xf7ff, "bank3");
- space.install_write_bank(0x2000, 0xf7ff, "bank4");
- membank("bank3")->set_base(ram + 0x2000);
- membank("bank4")->set_base(ram + 0x2000);
- // Keyboard
- space.install_read_handler (0xf800, 0xf9ff, read8_delegate(FUNC(pk8020_state::keyboard_r),this));
- space.install_write_bank(0xf800, 0xf9ff, "bank5");
- membank("bank5")->set_base(ram + 0xf800);
- // System reg
- space.install_read_handler (0xfa00, 0xfaff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- // Devices
- space.install_read_handler (0xfb00, 0xfbff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // Text Video Memory
- space.install_read_handler (0xfc00, 0xffff, read8_delegate(FUNC(pk8020_state::text_r),this));
- space.install_write_handler(0xfc00, 0xffff, write8_delegate(FUNC(pk8020_state::text_w),this));
- }
- break;
- case 0x06 :
- {
- // ROM
- space.install_read_bank (0x0000, 0x3fff, "bank1");
- space.install_write_bank(0x0000, 0x3fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x4000, 0xf7ff, "bank3");
- space.install_write_bank(0x4000, 0xf7ff, "bank4");
- membank("bank3")->set_base(ram + 0x4000);
- membank("bank4")->set_base(ram + 0x4000);
- // Keyboard
- space.install_read_handler (0xf800, 0xf9ff, read8_delegate(FUNC(pk8020_state::keyboard_r),this));
- space.install_write_bank(0xf800, 0xf9ff, "bank5");
- membank("bank5")->set_base(ram + 0xf800);
- // System reg
- space.install_read_handler (0xfa00, 0xfaff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- // Devices
- space.install_read_handler (0xfb00, 0xfbff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // Text Video Memory
- space.install_read_handler (0xfc00, 0xffff, read8_delegate(FUNC(pk8020_state::text_r),this));
- space.install_write_handler(0xfc00, 0xffff, write8_delegate(FUNC(pk8020_state::text_w),this));
- }
- break;
- case 0x07 :
- {
- // RAM
- space.install_read_bank (0x0000, 0xf7ff, "bank1");
- space.install_write_bank(0x0000, 0xf7ff, "bank2");
- membank("bank1")->set_base(ram);
- membank("bank2")->set_base(ram);
- // Keyboard
- space.install_read_handler (0xf800, 0xf9ff, read8_delegate(FUNC(pk8020_state::keyboard_r),this));
- space.install_write_bank(0xf800, 0xf9ff, "bank3");
- membank("bank3")->set_base(ram + 0xf800);
- // System reg
- space.install_read_handler (0xfa00, 0xfaff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- // Devices
- space.install_read_handler (0xfb00, 0xfbff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // Text Video Memory
- space.install_read_handler (0xfc00, 0xffff, read8_delegate(FUNC(pk8020_state::text_r),this));
- space.install_write_handler(0xfc00, 0xffff, write8_delegate(FUNC(pk8020_state::text_w),this));
- }
- break;
- case 0x08 :
- {
- // ROM
- space.install_read_bank (0x0000, 0x3fff, "bank1");
- space.install_write_bank(0x0000, 0x3fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // Keyboard
- space.install_read_handler (0x3800, 0x39ff, read8_delegate(FUNC(pk8020_state::keyboard_r),this));
- space.install_write_bank(0x3800, 0x39ff, "bank3");
- membank("bank3")->set_base(ram + 0x3800);
- // System reg
- space.install_read_handler (0x3a00, 0x3aff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0x3a00, 0x3aff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- // Devices
- space.install_read_handler (0x3b00, 0x3bff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0x3b00, 0x3bff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // Text Video Memory
- space.install_read_handler (0x3c00, 0x3fff, read8_delegate(FUNC(pk8020_state::text_r),this));
- space.install_write_handler(0x3c00, 0x3fff, write8_delegate(FUNC(pk8020_state::text_w),this));
- // RAM
- space.install_read_bank (0x4000, 0xbfff, "bank4");
- space.install_write_bank(0x4000, 0xbfff, "bank5");
- membank("bank4")->set_base(ram + 0x4000);
- membank("bank5")->set_base(ram + 0x4000);
- // Video RAM
- space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
-
- }
- break;
- case 0x09 :
- {
- // ROM
- space.install_read_bank (0x0000, 0x1fff, "bank1");
- space.install_write_bank(0x0000, 0x1fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x2000, 0xbfff, "bank3");
- space.install_write_bank(0x2000, 0xbfff, "bank4");
- membank("bank3")->set_base(ram + 0x2000);
- membank("bank4")->set_base(ram + 0x2000);
- // Video RAM
- space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
- }
- break;
- case 0x0A :
- {
- // ROM
- space.install_read_bank (0x0000, 0x3fff, "bank1");
- space.install_write_bank(0x0000, 0x3fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x4000, 0xbfff, "bank3");
- space.install_write_bank(0x4000, 0xbfff, "bank4");
- membank("bank3")->set_base(ram + 0x4000);
- membank("bank4")->set_base(ram + 0x4000);
- // Video RAM
- space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
- }
- break;
- case 0x0B :
- {
- // RAM
- space.install_read_bank (0x0000, 0xbfff, "bank1");
- space.install_write_bank(0x0000, 0xbfff, "bank2");
- membank("bank1")->set_base(ram + 0x0000);
- membank("bank2")->set_base(ram + 0x0000);
- // Video RAM
- space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
- }
- break;
- case 0x0C :
- case 0x0D :
- {
- // ROM
- space.install_read_bank (0x0000, 0x1fff, "bank1");
- space.install_write_bank(0x0000, 0x1fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x2000, 0x3fff, "bank3");
- space.install_write_bank(0x2000, 0x3fff, "bank4");
- membank("bank3")->set_base(ram + 0x2000);
- membank("bank4")->set_base(ram + 0x2000);
- // Video RAM
- space.install_read_handler (0x4000, 0x7fff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0x4000, 0x7fff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
- // RAM
- space.install_read_bank (0x8000, 0xfdff, "bank5");
- space.install_write_bank(0x8000, 0xfdff, "bank6");
- membank("bank5")->set_base(ram + 0x8000);
- membank("bank6")->set_base(ram + 0x8000);
- // Devices
- space.install_read_handler (0xfe00, 0xfeff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0xfe00, 0xfeff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // System reg
- space.install_read_handler (0xff00, 0xffff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- }
- break;
- case 0x0E :
- {
- // ROM
- space.install_read_bank (0x0000, 0x3fff, "bank1");
- space.install_write_bank(0x0000, 0x3fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // Video RAM
- space.install_read_handler (0x4000, 0x7fff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0x4000, 0x7fff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
- // RAM
- space.install_read_bank (0x8000, 0xfdff, "bank5");
- space.install_write_bank(0x8000, 0xfdff, "bank6");
- membank("bank5")->set_base(ram + 0x8000);
- membank("bank6")->set_base(ram + 0x8000);
- // Devices
- space.install_read_handler (0xfe00, 0xfeff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0xfe00, 0xfeff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // System reg
- space.install_read_handler (0xff00, 0xffff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- }
- break;
- case 0x0F :
- {
- // RAM
- space.install_read_bank (0x0000, 0x3fff, "bank1");
- space.install_write_bank(0x0000, 0x3fff, "bank2");
- membank("bank1")->set_base(ram + 0x0000);
- membank("bank2")->set_base(ram + 0x0000);
- // Video RAM
- space.install_read_handler (0x4000, 0x7fff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0x4000, 0x7fff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
- // RAM
- space.install_read_bank (0x8000, 0xfdff, "bank3");
- space.install_write_bank(0x8000, 0xfdff, "bank4");
- membank("bank3")->set_base(ram + 0x8000);
- membank("bank4")->set_base(ram + 0x8000);
- // Devices
- space.install_read_handler (0xfe00, 0xfeff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0xfe00, 0xfeff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // System reg
- space.install_read_handler (0xff00, 0xffff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- }
- break;
- case 0x10 :
- {
- // ROM
- space.install_read_bank (0x0000, 0x5fff, "bank1");
- space.install_write_bank(0x0000, 0x5fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x6000, 0xf7ff, "bank3");
- space.install_write_bank(0x6000, 0xf7ff, "bank4");
- membank("bank3")->set_base(ram + 0x6000);
- membank("bank4")->set_base(ram + 0x6000);
- // Keyboard
- space.install_read_handler (0xf800, 0xf9ff, read8_delegate(FUNC(pk8020_state::keyboard_r),this));
- space.install_write_bank(0xf800, 0xf9ff, "bank5");
- membank("bank5")->set_base(ram + 0xf800);
- // System reg
- space.install_read_handler (0xfa00, 0xfaff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- // Devices
- space.install_read_handler (0xfb00, 0xfbff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // Text Video Memory
- space.install_read_handler (0xfc00, 0xffff, read8_delegate(FUNC(pk8020_state::text_r),this));
- space.install_write_handler(0xfc00, 0xffff, write8_delegate(FUNC(pk8020_state::text_w),this));
- }
- break;
- case 0x11 :
- {
- // ROM
- space.install_read_bank (0x0000, 0x1fff, "bank1");
- space.install_write_bank(0x0000, 0x1fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x2000, 0xf7ff, "bank3");
- space.install_write_bank(0x2000, 0xf7ff, "bank4");
- membank("bank3")->set_base(ram + 0x2000);
- membank("bank4")->set_base(ram + 0x2000);
- // Keyboard
- space.install_read_handler (0xf800, 0xf9ff, read8_delegate(FUNC(pk8020_state::keyboard_r),this));
- space.install_write_bank(0xf800, 0xf9ff, "bank5");
- membank("bank5")->set_base(ram + 0xf800);
- // System reg
- space.install_read_handler (0xfa00, 0xfaff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- // Devices
- space.install_read_handler (0xfb00, 0xfbff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // Text Video Memory
- space.install_read_handler (0xfc00, 0xffff, read8_delegate(FUNC(pk8020_state::text_r),this));
- space.install_write_handler(0xfc00, 0xffff, write8_delegate(FUNC(pk8020_state::text_w),this));
- }
- break;
- case 0x12 :
- {
- // ROM
- space.install_read_bank (0x0000, 0x3fff, "bank1");
- space.install_write_bank(0x0000, 0x3fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x4000, 0xf7ff, "bank3");
- space.install_write_bank(0x4000, 0xf7ff, "bank4");
- membank("bank3")->set_base(ram + 0x4000);
- membank("bank4")->set_base(ram + 0x4000);
- // Keyboard
- space.install_read_handler (0xf800, 0xf9ff, read8_delegate(FUNC(pk8020_state::keyboard_r),this));
- space.install_write_bank(0xf800, 0xf9ff, "bank5");
- membank("bank5")->set_base(ram + 0xf800);
- // System reg
- space.install_read_handler (0xfa00, 0xfaff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- // Devices
- space.install_read_handler (0xfb00, 0xfbff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // Text Video Memory
- space.install_read_handler (0xfc00, 0xffff, read8_delegate(FUNC(pk8020_state::text_r),this));
- space.install_write_handler(0xfc00, 0xffff, write8_delegate(FUNC(pk8020_state::text_w),this));
- }
- break;
- case 0x13 :
- {
- // RAM
- space.install_read_bank (0x0000, 0xf7ff, "bank1");
- space.install_write_bank(0x0000, 0xf7ff, "bank2");
- membank("bank1")->set_base(ram + 0x0000);
- membank("bank2")->set_base(ram + 0x0000);
- // Keyboard
- space.install_read_handler (0xf800, 0xf9ff, read8_delegate(FUNC(pk8020_state::keyboard_r),this));
- space.install_write_bank(0xf800, 0xf9ff, "bank3");
- membank("bank3")->set_base(ram + 0xf800);
- // System reg
- space.install_read_handler (0xfa00, 0xfaff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- // Devices
- space.install_read_handler (0xfb00, 0xfbff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // Text Video Memory
- space.install_read_handler (0xfc00, 0xffff, read8_delegate(FUNC(pk8020_state::text_r),this));
- space.install_write_handler(0xfc00, 0xffff, write8_delegate(FUNC(pk8020_state::text_w),this));
- }
- break;
- case 0x14 :
- {
- // ROM
- space.install_read_bank (0x0000, 0x5fff, "bank1");
- space.install_write_bank(0x0000, 0x5fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x6000, 0xfdff, "bank3");
- space.install_write_bank(0x6000, 0xfdff, "bank4");
- membank("bank3")->set_base(ram + 0x6000);
- membank("bank4")->set_base(ram + 0x6000);
- // Devices
- space.install_read_handler (0xfe00, 0xfeff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0xfe00, 0xfeff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // System reg
- space.install_read_handler (0xff00, 0xffff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- }
- break;
- case 0x15 :
- {
- // ROM
- space.install_read_bank (0x0000, 0x1fff, "bank1");
- space.install_write_bank(0x0000, 0x1fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x2000, 0xfdff, "bank3");
- space.install_write_bank(0x2000, 0xfdff, "bank4");
- membank("bank3")->set_base(ram + 0x2000);
- membank("bank4")->set_base(ram + 0x2000);
- // Devices
- space.install_read_handler (0xfe00, 0xfeff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0xfe00, 0xfeff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // System reg
- space.install_read_handler (0xff00, 0xffff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- }
- break;
- case 0x16 :
- {
- // ROM
- space.install_read_bank (0x0000, 0x3fff, "bank1");
- space.install_write_bank(0x0000, 0x3fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x4000, 0xfdff, "bank3");
- space.install_write_bank(0x4000, 0xfdff, "bank4");
- membank("bank3")->set_base(ram + 0x4000);
- membank("bank4")->set_base(ram + 0x4000);
- // Devices
- space.install_read_handler (0xfe00, 0xfeff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0xfe00, 0xfeff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // System reg
- space.install_read_handler (0xff00, 0xffff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- }
- break;
- case 0x17 :
- {
- // RAM
- space.install_read_bank (0x0000, 0xfdff, "bank1");
- space.install_write_bank(0x0000, 0xfdff, "bank2");
- membank("bank1")->set_base(ram);
- membank("bank2")->set_base(ram);
- // Devices
- space.install_read_handler (0xfe00, 0xfeff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0xfe00, 0xfeff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // System reg
- space.install_read_handler (0xff00, 0xffff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- }
- break;
- case 0x18 :
- {
- // ROM
- space.install_read_bank (0x0000, 0x5fff, "bank1");
- space.install_write_bank(0x0000, 0x5fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x6000, 0xbeff, "bank3");
- space.install_write_bank(0x6000, 0xbeff, "bank4");
- membank("bank3")->set_base(ram + 0x6000);
- membank("bank4")->set_base(ram + 0x6000);
- // System reg
- space.install_read_handler (0xbf00, 0xbfff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xbf00, 0xbfff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- // Video RAM
- space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
- }
- break;
- case 0x19 :
- {
- // ROM
- space.install_read_bank (0x0000, 0x1fff, "bank1");
- space.install_write_bank(0x0000, 0x1fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x2000, 0xbeff, "bank3");
- space.install_write_bank(0x2000, 0xbeff, "bank4");
- membank("bank3")->set_base(ram + 0x2000);
- membank("bank4")->set_base(ram + 0x2000);
- // System reg
- space.install_read_handler (0xbf00, 0xbfff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xbf00, 0xbfff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- // Video RAM
- space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
- }
- break;
- case 0x1A :
- {
- // ROM
- space.install_read_bank (0x0000, 0x3fff, "bank1");
- space.install_write_bank(0x0000, 0x3fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x4000, 0xbeff, "bank3");
- space.install_write_bank(0x4000, 0xbeff, "bank4");
- membank("bank3")->set_base(ram + 0x4000);
- membank("bank4")->set_base(ram + 0x4000);
- // System reg
- space.install_read_handler (0xbf00, 0xbfff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xbf00, 0xbfff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- // Video RAM
- space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
- }
- break;
- case 0x1B :
- {
- // RAM
- space.install_read_bank (0x0000, 0xbeff, "bank1");
- space.install_write_bank(0x0000, 0xbeff, "bank2");
- membank("bank1")->set_base(ram);
- membank("bank2")->set_base(ram);
- // System reg
- space.install_read_handler (0xbf00, 0xbfff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xbf00, 0xbfff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- // Video RAM
- space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
- }
- break;
- case 0x1C :
- {
- // ROM
- space.install_read_bank (0x0000, 0x5fff, "bank1");
- space.install_write_bank(0x0000, 0x5fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x6000, 0xbfff, "bank3");
- space.install_write_bank(0x6000, 0xbfff, "bank4");
- membank("bank3")->set_base(ram + 0x6000);
- membank("bank4")->set_base(ram + 0x6000);
- // Video RAM
- space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
- }
- break;
- case 0x1D :
- {
- // ROM
- space.install_read_bank (0x0000, 0x1fff, "bank1");
- space.install_write_bank(0x0000, 0x1fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x2000, 0xbfff, "bank3");
- space.install_write_bank(0x2000, 0xbfff, "bank4");
- membank("bank3")->set_base(ram + 0x2000);
- membank("bank4")->set_base(ram + 0x2000);
- // Video RAM
- space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
- }
- break;
- case 0x1E :
- {
- // ROM
- space.install_read_bank (0x0000, 0x3fff, "bank1");
- space.install_write_bank(0x0000, 0x3fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x4000, 0xbfff, "bank3");
- space.install_write_bank(0x4000, 0xbfff, "bank4");
- membank("bank3")->set_base(ram + 0x4000);
- membank("bank4")->set_base(ram + 0x4000);
- // Video RAM
- space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
- }
- break;
- case 0x1F :
- {
- // RAM
- space.install_read_bank (0x0000, 0xbfff, "bank1");
- space.install_write_bank(0x0000, 0xbfff, "bank2");
- membank("bank1")->set_base(ram);
- membank("bank2")->set_base(ram);
- // Video RAM
- space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
- }
- break;
+ uint8_t select = m_decplm->read(bitswap<13>((offset & 0xff00) | m_bank_select, 2, 5, 6, 4, 12, 3, 13, 8, 9, 11, 15, 10, 14) | 0x2000);
- }
-}
+ if (!BIT(select, 5))
+ sysreg_w(offset, data);
+ if (!BIT(select, 4))
+ m_devbank->write8(offset, data);
-READ8_MEMBER(pk8020_state::pk8020_porta_r)
-{
- return 0xf0 | (m_takt <<1) | (m_text_attr)<<3;
+ if ((select & 0xc0) == 0x00)
+ m_ram->pointer()[offset] = data;
+ else if ((select & 0xc0) == 0x40)
+ gzu_w(offset & 0x3fff, data);
+ else if ((select & 0xc0) == 0x80)
+ text_w(offset & 0x3ff, data);
}
-WRITE8_MEMBER(pk8020_state::pk8020_portc_w)
+uint8_t pk8020_state::ppi_porta_r()
{
- m_video_page_access =(data>>6) & 3;
- m_attr = (data >> 4) & 3;
- m_wide = (data >> 3) & 1;
- m_font = (data >> 2) & 1;
- m_video_page = (data & 3);
-
-
- m_portc_data = data;
+ return 0xf0 | (m_takt <<1) | (m_text_attr)<<3;
}
-WRITE8_MEMBER(pk8020_state::pk8020_portb_w)
+void pk8020_state::floppy_control_w(uint8_t data)
{
floppy_image_device *floppy = nullptr;
// Turn all motors off
- if (m_floppy0->get_device()) m_floppy0->get_device()->mon_w(1);
- if (m_floppy1->get_device()) m_floppy1->get_device()->mon_w(1);
- if (m_floppy2->get_device()) m_floppy2->get_device()->mon_w(1);
- if (m_floppy3->get_device()) m_floppy3->get_device()->mon_w(1);
+ for (int n = 0; n < 4; n++)
+ if (m_floppy[n]->get_device())
+ m_floppy[n]->get_device()->mon_w(1);
- if (BIT(data, 0)) floppy = m_floppy0->get_device();
- if (BIT(data, 1)) floppy = m_floppy1->get_device();
- if (BIT(data, 2)) floppy = m_floppy2->get_device();
- if (BIT(data, 3)) floppy = m_floppy3->get_device();
+ for (int n = 0; n < 4; n++)
+ if (BIT(data, n))
+ floppy = m_floppy[n]->get_device();
- m_wd1793->set_floppy(floppy);
+ m_fdc->set_floppy(floppy);
if (floppy)
{
@@ -835,20 +122,15 @@ WRITE8_MEMBER(pk8020_state::pk8020_portb_w)
// todo: at least bit 5 and bit 7 is connected to something too...
}
-READ8_MEMBER(pk8020_state::pk8020_portc_r)
-{
- return m_portc_data;
-}
-
-WRITE8_MEMBER(pk8020_state::pk8020_2_portc_w)
+void pk8020_state::ppi_2_portc_w(uint8_t data)
{
m_sound_gate = BIT(data,3);
m_speaker->level_w(m_sound_gate ? m_sound_level : 0);
}
-WRITE_LINE_MEMBER(pk8020_state::pk8020_pit_out0)
+WRITE_LINE_MEMBER(pk8020_state::pit_out0)
{
m_sound_level = state;
@@ -856,27 +138,88 @@ WRITE_LINE_MEMBER(pk8020_state::pk8020_pit_out0)
}
-WRITE_LINE_MEMBER(pk8020_state::pk8020_pit_out1)
+const char *pk8020_state::plm_select_name(uint8_t data)
{
+ switch (data)
+ {
+ case 0xfb:
+ case 0xf7:
+ case 0xfe:
+ return "ROM";
+
+ case 0x3f:
+ return "RAM";
+
+ case 0xfd:
+ return "keyboard";
+
+ case 0xdf:
+ return "system reg";
+
+ case 0xef:
+ return "devices";
+
+ case 0xbf:
+ return "text video memory";
+
+ case 0x7f:
+ return "video RAM";
+
+ default:
+ return "multiple/unknown";
+ }
}
+void pk8020_state::log_bank_select(uint8_t bank, offs_t start, offs_t end, uint8_t rdecplm, uint8_t wdecplm)
+{
+ if (rdecplm == wdecplm)
+ logerror("Bank select %02X, %04X-%04Xh: read/write %s (%02X)\n", bank, start, end, plm_select_name(rdecplm), rdecplm);
+ else
+ logerror("Bank select %02X, %04X-%04Xh: read %s (%02X), write %s (%02X)\n", bank, start, end, plm_select_name(rdecplm), rdecplm, plm_select_name(wdecplm), wdecplm);
+}
void pk8020_state::machine_start()
{
- static const char *const keynames[] = {
- "LINE0", "LINE1", "LINE2", "LINE3", "LINE4", "LINE5", "LINE6", "LINE7",
- "LINE8", "LINE9", "LINE10", "LINE11", "LINE12", "LINE13", "LINE14", "LINE15"
- };
+ m_ios[0]->write_cts(0);
+ m_ios[1]->write_cts(0);
+ m_ios[1]->write_dsr(0);
+ m_takt = 0;
+
+ save_item(NAME(m_bank_select));
+ save_item(NAME(m_takt));
+ save_item(NAME(m_sound_gate));
+ save_item(NAME(m_sound_level));
- for ( int i = 0; i < 16; i++ )
+ if (DESCRIBE_DECPLM)
{
- m_io_port[i] = ioport(keynames[i]);
+ for (uint8_t bank = 0; bank < 0x20; bank++)
+ {
+ uint8_t rdecplm = 0;
+ uint8_t wdecplm = 0;
+ offs_t start = 0x0000;
+
+ for (offs_t offset = 0x0000; offset < 0x10000; offset += 0x100)
+ {
+ uint8_t rdecplm_test = m_decplm->read(bitswap<13>((offset & 0xff00) | (bank << 2), 2, 5, 6, 4, 12, 3, 13, 8, 9, 11, 15, 10, 14) | 0x8000);
+ uint8_t wdecplm_test = m_decplm->read(bitswap<13>((offset & 0xff00) | (bank << 2), 2, 5, 6, 4, 12, 3, 13, 8, 9, 11, 15, 10, 14) | 0x2000);
+
+ if (rdecplm != rdecplm_test || wdecplm != wdecplm_test)
+ {
+ if (offset != 0x0000)
+ log_bank_select(bank, start, offset - 1, rdecplm, wdecplm);
+ rdecplm = rdecplm_test;
+ wdecplm = wdecplm_test;
+ start = offset;
+ }
+ }
+ log_bank_select(bank, start, 0xffff, rdecplm, wdecplm);
+ }
}
}
void pk8020_state::machine_reset()
{
- pk8020_set_bank(0);
+ m_bank_select = 0;
m_sound_gate = 0;
m_sound_level = 0;
@@ -885,5 +228,5 @@ void pk8020_state::machine_reset()
INTERRUPT_GEN_MEMBER(pk8020_state::pk8020_interrupt)
{
m_takt ^= 1;
- m_pic8259->ir4_w(1);
+ m_inr->ir4_w(1);
}