diff options
author | AJR <ajrhacker@users.noreply.github.com> | 2019-05-11 14:37:00 -0400 |
---|---|---|
committer | AJR <ajrhacker@users.noreply.github.com> | 2019-05-11 14:41:10 -0400 |
commit | 5c9d51b8606b34a592017591ef78306c978cc999 (patch) | |
tree | 23f24b5a89b94e37ac34c3fc9ff1be892d15154d | |
parent | 037714e412b304304aeea901af31108f8b6df5bb (diff) |
pk8020: Major update
- Emulate programmable logic device used for banked address decoding
- Improve serial port/USART hookup
- Save state support
- Massive code cleanup
-rw-r--r-- | src/mame/drivers/pk8020.cpp | 373 | ||||
-rw-r--r-- | src/mame/includes/pk8020.h | 86 | ||||
-rw-r--r-- | src/mame/machine/pk8020.cpp | 937 | ||||
-rw-r--r-- | src/mame/video/pk8020.cpp | 122 |
4 files changed, 517 insertions, 1001 deletions
diff --git a/src/mame/drivers/pk8020.cpp b/src/mame/drivers/pk8020.cpp index 734ce7c32a6..dd2fdb1a85b 100644 --- a/src/mame/drivers/pk8020.cpp +++ b/src/mame/drivers/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 @@ -15,9 +15,10 @@ #include "bus/rs232/rs232.h" #include "cpu/i8085/i8085.h" +#include "machine/clock.h" #include "machine/i8255.h" +#include "machine/pit8253.h" #include "formats/pk8020_dsk.h" -#include "machine/ram.h" #include "screen.h" #include "softlist.h" #include "speaker.h" @@ -25,6 +26,7 @@ /* Address maps */ void pk8020_state::pk8020_mem(address_map &map) { + map(0x0000, 0xffff).rw(FUNC(pk8020_state::memory_r), FUNC(pk8020_state::memory_w)); } void pk8020_state::pk8020_io(address_map &map) @@ -33,118 +35,145 @@ void pk8020_state::pk8020_io(address_map &map) map.unmap_value_high(); } +void pk8020_state::devices_map(address_map &map) +{ + map(0x00, 0x03).mirror(4).rw("ct", FUNC(pit8253_device::read), FUNC(pit8253_device::write)); + map(0x08, 0x0b).mirror(4).rw("iop3", FUNC(i8255_device::read), FUNC(i8255_device::write)); + map(0x10, 0x11).mirror(6).rw("ios1", FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0x18, 0x1b).mirror(4).rw(m_fdc, FUNC(fd1793_device::read), FUNC(fd1793_device::write)); + map(0x20, 0x21).mirror(6).rw("ios2", FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0x28, 0x29).mirror(6).rw(m_inr, FUNC(pic8259_device::read), FUNC(pic8259_device::write)); + map(0x30, 0x33).mirror(4).rw("iop2", FUNC(i8255_device::read), FUNC(i8255_device::write)); + map(0x38, 0x3b).mirror(4).rw("iop1", FUNC(i8255_device::read), FUNC(i8255_device::write)); +} + /* Input ports */ static INPUT_PORTS_START( pk8020 ) PORT_START("LINE0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("@") PORT_CODE(KEYCODE_F9) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("G") PORT_CODE(KEYCODE_G) + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("@") PORT_CODE(KEYCODE_F9) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G") PORT_CODE(KEYCODE_G) + PORT_START("LINE1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("H") PORT_CODE(KEYCODE_H) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("J") PORT_CODE(KEYCODE_J) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("K") PORT_CODE(KEYCODE_K) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("L") PORT_CODE(KEYCODE_L) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("N") PORT_CODE(KEYCODE_N) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("O") PORT_CODE(KEYCODE_O) + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("H") PORT_CODE(KEYCODE_H) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("J") PORT_CODE(KEYCODE_J) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("K") PORT_CODE(KEYCODE_K) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("L") PORT_CODE(KEYCODE_L) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("N") PORT_CODE(KEYCODE_N) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("O") PORT_CODE(KEYCODE_O) + PORT_START("LINE2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("P") PORT_CODE(KEYCODE_P) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("R") PORT_CODE(KEYCODE_R) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("S") PORT_CODE(KEYCODE_S) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("T") PORT_CODE(KEYCODE_T) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("U") PORT_CODE(KEYCODE_U) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("V") PORT_CODE(KEYCODE_V) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("W") PORT_CODE(KEYCODE_W) + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("P") PORT_CODE(KEYCODE_P) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("R") PORT_CODE(KEYCODE_R) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("S") PORT_CODE(KEYCODE_S) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("T") PORT_CODE(KEYCODE_T) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("U") PORT_CODE(KEYCODE_U) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("V") PORT_CODE(KEYCODE_V) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("W") PORT_CODE(KEYCODE_W) + PORT_START("LINE3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("X") PORT_CODE(KEYCODE_X) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("[") PORT_CODE(KEYCODE_OPENBRACE) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("\\") PORT_CODE(KEYCODE_BACKSLASH) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("]") PORT_CODE(KEYCODE_CLOSEBRACE) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("^") PORT_CODE(KEYCODE_TILDE) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("_") PORT_CODE(KEYCODE_EQUALS) + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("X") PORT_CODE(KEYCODE_X) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("[") PORT_CODE(KEYCODE_OPENBRACE) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\\") PORT_CODE(KEYCODE_BACKSLASH) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("]") PORT_CODE(KEYCODE_CLOSEBRACE) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("^") PORT_CODE(KEYCODE_TILDE) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("_") PORT_CODE(KEYCODE_EQUALS) + PORT_START("LINE4") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_4) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("5") PORT_CODE(KEYCODE_5) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("6") PORT_CODE(KEYCODE_6) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("7") PORT_CODE(KEYCODE_7) + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_4) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("5") PORT_CODE(KEYCODE_5) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("6") PORT_CODE(KEYCODE_6) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("7") PORT_CODE(KEYCODE_7) + PORT_START("LINE5") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("8") PORT_CODE(KEYCODE_8) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(":") PORT_CODE(KEYCODE_QUOTE) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(";") PORT_CODE(KEYCODE_COLON) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(",") PORT_CODE(KEYCODE_COMMA) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("-") PORT_CODE(KEYCODE_MINUS) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(".") PORT_CODE(KEYCODE_STOP) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("?") PORT_CODE(KEYCODE_SLASH) + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("8") PORT_CODE(KEYCODE_8) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(":") PORT_CODE(KEYCODE_QUOTE) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(";") PORT_CODE(KEYCODE_COLON) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(",") PORT_CODE(KEYCODE_COMMA) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("-") PORT_CODE(KEYCODE_MINUS) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(".") PORT_CODE(KEYCODE_STOP) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("?") PORT_CODE(KEYCODE_SLASH) + PORT_START("LINE6") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("STRN") PORT_CODE(KEYCODE_MINUS_PAD) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("STOP") PORT_CODE(KEYCODE_F12) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("IZ") PORT_CODE(KEYCODE_ASTERISK) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("VZ") PORT_CODE(KEYCODE_SLASH_PAD) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Backspace") PORT_CODE(KEYCODE_BACKSPACE) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Tab") PORT_CODE(KEYCODE_TAB) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("STRN") PORT_CODE(KEYCODE_MINUS_PAD) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("STOP") PORT_CODE(KEYCODE_F12) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("IZ") PORT_CODE(KEYCODE_ASTERISK) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("VZ") PORT_CODE(KEYCODE_SLASH_PAD) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Backspace") PORT_CODE(KEYCODE_BACKSPACE) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Tab") PORT_CODE(KEYCODE_TAB) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) + PORT_START("LINE7") - // All keys in this line are reversed logic - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Left Shift") PORT_CODE(KEYCODE_LSHIFT) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Alf") PORT_CODE(KEYCODE_F11) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Graf") PORT_CODE(KEYCODE_F10) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Prf") PORT_CODE(KEYCODE_ESC) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Sel") PORT_CODE(KEYCODE_RCONTROL) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Upr") PORT_CODE(KEYCODE_LCONTROL) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("OO") PORT_CODE(KEYCODE_LALT) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Right Shift") PORT_CODE(KEYCODE_RSHIFT) + // All keys in this line are reversed logic + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Left Shift") PORT_CODE(KEYCODE_LSHIFT) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Alf") PORT_CODE(KEYCODE_F11) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Graf") PORT_CODE(KEYCODE_F10) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Prf") PORT_CODE(KEYCODE_ESC) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Sel") PORT_CODE(KEYCODE_RCONTROL) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Upr") PORT_CODE(KEYCODE_LCONTROL) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("OO") PORT_CODE(KEYCODE_LALT) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Right Shift") PORT_CODE(KEYCODE_RSHIFT) + PORT_START("LINE8") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Num 0") PORT_CODE(KEYCODE_0_PAD) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Num 1") PORT_CODE(KEYCODE_1_PAD) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Num 2") PORT_CODE(KEYCODE_2_PAD) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Num 3") PORT_CODE(KEYCODE_3_PAD) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Num 4") PORT_CODE(KEYCODE_4_PAD) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Num 5") PORT_CODE(KEYCODE_5_PAD) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Num 6") PORT_CODE(KEYCODE_6_PAD) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Num 7") PORT_CODE(KEYCODE_7_PAD) + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Num 0") PORT_CODE(KEYCODE_0_PAD) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Num 1") PORT_CODE(KEYCODE_1_PAD) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Num 2") PORT_CODE(KEYCODE_2_PAD) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Num 3") PORT_CODE(KEYCODE_3_PAD) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Num 4") PORT_CODE(KEYCODE_4_PAD) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Num 5") PORT_CODE(KEYCODE_5_PAD) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Num 6") PORT_CODE(KEYCODE_6_PAD) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Num 7") PORT_CODE(KEYCODE_7_PAD) + PORT_START("LINE9") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Num 8") PORT_CODE(KEYCODE_8_PAD) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Num 9") PORT_CODE(KEYCODE_9_PAD) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Num .") PORT_CODE(KEYCODE_DEL_PAD) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Num 8") PORT_CODE(KEYCODE_8_PAD) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Num 9") PORT_CODE(KEYCODE_9_PAD) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Num .") PORT_CODE(KEYCODE_DEL_PAD) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_START("LINE10") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F4") PORT_CODE(KEYCODE_F4) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F5") PORT_CODE(KEYCODE_F5) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F4") PORT_CODE(KEYCODE_F4) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F5") PORT_CODE(KEYCODE_F5) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_START("LINE11") - PORT_BIT(0xFF, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_START("LINE12") - PORT_BIT(0xFF, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_START("LINE13") - PORT_BIT(0xFF, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_START("LINE14") - PORT_BIT(0xFF, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_START("LINE15") - PORT_BIT(0xFF, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNUSED) INPUT_PORTS_END @@ -192,11 +221,18 @@ static void pk8020_floppies(device_slot_interface &device) void pk8020_state::pk8020(machine_config &config) { /* basic machine hardware */ - I8080(config, m_maincpu, 20_MHz_XTAL / 8); + I8080(config, m_maincpu, 20_MHz_XTAL / 8); // КР580ВМ80А m_maincpu->set_addrmap(AS_PROGRAM, &pk8020_state::pk8020_mem); m_maincpu->set_addrmap(AS_IO, &pk8020_state::pk8020_io); m_maincpu->set_vblank_int("screen", FUNC(pk8020_state::pk8020_interrupt)); - m_maincpu->set_irq_acknowledge_callback("pic8259", FUNC(pic8259_device::inta_cb)); + m_maincpu->set_irq_acknowledge_callback("inr", FUNC(pic8259_device::inta_cb)); + + PLS100(config, m_decplm); // КР556РТ2 (82S100 equivalent; D31) + + ADDRESS_MAP_BANK(config, m_devbank); + m_devbank->set_addrmap(0, &pk8020_state::devices_map); + m_devbank->set_data_width(8); + m_devbank->set_addr_width(6); /* video hardware */ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); @@ -210,47 +246,54 @@ void pk8020_state::pk8020(machine_config &config) GFXDECODE(config, "gfxdecode", m_palette, gfx_pk8020); PALETTE(config, m_palette, FUNC(pk8020_state::pk8020_palette), 16); - I8255(config, m_ppi8255_1); - m_ppi8255_1->in_pa_callback().set(FUNC(pk8020_state::pk8020_porta_r)); - m_ppi8255_1->out_pb_callback().set(FUNC(pk8020_state::pk8020_portb_w)); - m_ppi8255_1->in_pc_callback().set(FUNC(pk8020_state::pk8020_portc_r)); - m_ppi8255_1->out_pc_callback().set(FUNC(pk8020_state::pk8020_portc_w)); + i8255_device &iop1(I8255(config, "iop1")); // КР580ВВ55А (D17) + iop1.in_pa_callback().set(FUNC(pk8020_state::ppi_porta_r)); + iop1.out_pb_callback().set(FUNC(pk8020_state::floppy_control_w)); + iop1.out_pc_callback().set(FUNC(pk8020_state::video_page_w)); + + i8255_device &iop2(I8255(config, "iop2")); // КР580ВВ55А (D16) + iop2.out_pc_callback().set(FUNC(pk8020_state::ppi_2_portc_w)); - I8255(config, m_ppi8255_2); - m_ppi8255_2->out_pc_callback().set(FUNC(pk8020_state::pk8020_2_portc_w)); + I8255(config, "iop3"); // КР580ВВ55А (D2) - I8255(config, m_ppi8255_3); + pit8253_device &ct(PIT8253(config, "ct")); // КР580ВИ53 + ct.set_clk<0>(20_MHz_XTAL / 10); + ct.out_handler<0>().set(FUNC(pk8020_state::pit_out0)); + ct.set_clk<1>(20_MHz_XTAL / 10); + ct.out_handler<1>().set("ios1", FUNC(i8251_device::write_txc)); + ct.out_handler<1>().append("ios1", FUNC(i8251_device::write_rxc)); + ct.set_clk<2>((20_MHz_XTAL / 8) / 164); + ct.out_handler<2>().set(m_inr, FUNC(pic8259_device::ir5_w)); - PIT8253(config, m_pit8253, 0); - m_pit8253->set_clk<0>(20_MHz_XTAL / 10); - m_pit8253->out_handler<0>().set(FUNC(pk8020_state::pk8020_pit_out0)); - m_pit8253->set_clk<1>(20_MHz_XTAL / 10); - m_pit8253->out_handler<1>().set(FUNC(pk8020_state::pk8020_pit_out1)); - m_pit8253->set_clk<2>((20_MHz_XTAL / 8) / 164); - m_pit8253->out_handler<2>().set(m_pic8259, FUNC(pic8259_device::ir5_w)); + PIC8259(config, m_inr); // КР580ВН59 + m_inr->out_int_callback().set_inputline(m_maincpu, 0); - PIC8259(config, m_pic8259, 0); - m_pic8259->out_int_callback().set_inputline(m_maincpu, 0); + i8251_device &ios1(I8251(config, "ios1", 20_MHz_XTAL / 10)); // КР580ВВ51А (D10) + ios1.txd_handler().set("v24", FUNC(rs232_port_device::write_txd)); + ios1.dtr_handler().set("v24", FUNC(rs232_port_device::write_rts)); + ios1.rxrdy_handler().set(m_inr, FUNC(pic8259_device::ir1_w)); + ios1.txrdy_handler().set(m_inr, FUNC(pic8259_device::ir2_w)); - I8251(config, m_rs232, 0); - m_rs232->txd_handler().set("rs232", FUNC(rs232_port_device::write_txd)); - m_rs232->rxrdy_handler().set(m_pic8259, FUNC(pic8259_device::ir1_w)); - m_rs232->txrdy_handler().set(m_pic8259, FUNC(pic8259_device::ir2_w)); + rs232_port_device &v24(RS232_PORT(config, "v24", default_rs232_devices, nullptr)); + v24.rxd_handler().set("ios1", FUNC(i8251_device::write_rxd)); + v24.dsr_handler().set("ios1", FUNC(i8251_device::write_dsr)); - rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, nullptr)); - rs232.rxd_handler().set(m_rs232, FUNC(i8251_device::write_rxd)); - rs232.cts_handler().set(m_rs232, FUNC(i8251_device::write_cts)); - rs232.dsr_handler().set(m_rs232, FUNC(i8251_device::write_dsr)); + i8251_device &ios2(I8251(config, "ios2", 20_MHz_XTAL / 10)); // КР580ВВ51А (D11) + ios2.txd_handler().set("line", FUNC(rs232_port_device::write_txd)); + ios2.rxrdy_handler().set(m_inr, FUNC(pic8259_device::ir3_w)); - I8251(config, m_lan, 0); + rs232_port_device &line(RS232_PORT(config, "line", default_rs232_devices, nullptr)); + line.rxd_handler().set("ios2", FUNC(i8251_device::write_rxd)); - FD1793(config, m_wd1793, 20_MHz_XTAL / 20); - m_wd1793->intrq_wr_callback().set(m_pic8259, FUNC(pic8259_device::ir7_w)); + clock_device &c1(CLOCK(config, "c1", 20_MHz_XTAL / 8 / 4)); + c1.signal_handler().set("ios2", FUNC(i8251_device::write_txc)); + c1.signal_handler().append("ios2", FUNC(i8251_device::write_rxc)); - FLOPPY_CONNECTOR(config, "wd1793:0", pk8020_floppies, "qd", pk8020_state::floppy_formats); - FLOPPY_CONNECTOR(config, "wd1793:1", pk8020_floppies, "qd", pk8020_state::floppy_formats); - FLOPPY_CONNECTOR(config, "wd1793:2", pk8020_floppies, "qd", pk8020_state::floppy_formats); - FLOPPY_CONNECTOR(config, "wd1793:3", pk8020_floppies, "qd", pk8020_state::floppy_formats); + KR1818VG93(config, m_fdc, 20_MHz_XTAL / 20); // КР1818ВГ93 + m_fdc->intrq_wr_callback().set(m_inr, FUNC(pic8259_device::ir7_w)); + + for (auto &floppy : m_floppy) + FLOPPY_CONNECTOR(config, floppy, pk8020_floppies, "qd", pk8020_state::floppy_formats); SOFTWARE_LIST(config, "flop_list").set_original("korvet_flop"); @@ -268,50 +311,66 @@ void pk8020_state::pk8020(machine_config &config) /* ROM definition */ ROM_START( korvet ) - ROM_REGION( 0x16000, "maincpu", ROMREGION_ERASEFF ) + ROM_REGION(0x6000, "maincpu", ROMREGION_ERASEFF) ROM_DEFAULT_BIOS("v11") ROM_SYSTEM_BIOS(0, "v11", "v1.1") - ROMX_LOAD( "korvet11.rom", 0x10000, 0x6000, CRC(81bdc2af) SHA1(c3484c3f1f3d252475979283c073286b8661d2b9), ROM_BIOS(0)) + ROMX_LOAD("korvet11.rom", 0x0000, 0x6000, CRC(81bdc2af) SHA1(c3484c3f1f3d252475979283c073286b8661d2b9), ROM_BIOS(0)) ROM_SYSTEM_BIOS(1, "v20", "v2.0") - ROMX_LOAD( "korvet20.rom", 0x10000, 0x6000, CRC(d6c36a45) SHA1(dba67e63457251814ad5c0fe6bb6d584eea5c7d2), ROM_BIOS(1)) + ROMX_LOAD("korvet20.rom", 0x0000, 0x6000, CRC(d6c36a45) SHA1(dba67e63457251814ad5c0fe6bb6d584eea5c7d2), ROM_BIOS(1)) ROM_SYSTEM_BIOS(2, "cpm", "cpm") - ROMX_LOAD( "cpm.rom", 0x10000, 0x4000, CRC(7a38d7f6) SHA1(fec6623291a38990b003e818683cd5edfb494c36), ROM_BIOS(2)) - ROM_REGION( 0x2000, "gfx1", 0 ) - ROM_LOAD( "korvet2.fnt", 0x0000, 0x2000, CRC(fb1cd3d4) SHA1(58f1d6e393253b1e8b497ce0880b6eff6d85b42a)) + ROMX_LOAD("cpm.rom", 0x0000, 0x4000, CRC(7a38d7f6) SHA1(fec6623291a38990b003e818683cd5edfb494c36), ROM_BIOS(2)) + + ROM_REGION(0x2000, "gfx1", 0) + ROM_LOAD("korvet2.fnt", 0x0000, 0x2000, CRC(fb1cd3d4) SHA1(58f1d6e393253b1e8b497ce0880b6eff6d85b42a)) + + ROM_REGION(0xf5, "decplm", 0) + ROM_LOAD("kr556rt2.d31", 0x00, 0xf5, CRC(3eae3879) SHA1(87f419e26d73d7b2f937c3fcae0415b74da37d97) BAD_DUMP) // devised from documentation ROM_END ROM_START( neiva ) - ROM_REGION( 0x16000, "maincpu", ROMREGION_ERASEFF ) - ROM_LOAD( "neiva_d22.bin", 0x10000, 0x2000, CRC(9cc28f67) SHA1(68f390e846e1290df68419d522088d5325682945)) - ROM_LOAD( "neiva_d23.bin", 0x12000, 0x2000, CRC(31b53dc4) SHA1(607f2a2d8b1de469125c6c02b9ffc65649b753a2)) - ROM_LOAD( "neiva_d24.bin", 0x14000, 0x2000, CRC(d05c80df) SHA1(1ec2fa9983be5579abff7247fc9b98fe50661bd9)) - ROM_REGION( 0x2000, "gfx1", 0 ) - ROM_LOAD( "neiva_d21.bin", 0x0000, 0x2000, CRC(fb1cd3d4) SHA1(58f1d6e393253b1e8b497ce0880b6eff6d85b42a)) + ROM_REGION(0x6000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD("neiva_d22.bin", 0x0000, 0x2000, CRC(9cc28f67) SHA1(68f390e846e1290df68419d522088d5325682945)) + ROM_LOAD("neiva_d23.bin", 0x2000, 0x2000, CRC(31b53dc4) SHA1(607f2a2d8b1de469125c6c02b9ffc65649b753a2)) + ROM_LOAD("neiva_d24.bin", 0x4000, 0x2000, CRC(d05c80df) SHA1(1ec2fa9983be5579abff7247fc9b98fe50661bd9)) + + ROM_REGION(0x2000, "gfx1", 0) + ROM_LOAD("neiva_d21.bin", 0x0000, 0x2000, CRC(fb1cd3d4) SHA1(58f1d6e393253b1e8b497ce0880b6eff6d85b42a)) + + ROM_REGION(0xf5, "decplm", 0) + ROM_LOAD("kr556rt2.d31", 0x00, 0xf5, CRC(3eae3879) SHA1(87f419e26d73d7b2f937c3fcae0415b74da37d97) BAD_DUMP) ROM_END ROM_START( kontur ) - ROM_REGION( 0x16000, "maincpu", ROMREGION_ERASEFF ) + ROM_REGION(0x6000, "maincpu", ROMREGION_ERASEFF) ROM_SYSTEM_BIOS(0, "v1", "v1") - ROMX_LOAD( "kontur.rom", 0x10000, 0x2000, CRC(92cd441e) SHA1(9a0f9079256cefc6169ae4ba2114841d1f380480), ROM_BIOS(0)) + ROMX_LOAD("kontur.rom", 0x0000, 0x2000, CRC(92cd441e) SHA1(9a0f9079256cefc6169ae4ba2114841d1f380480), ROM_BIOS(0)) ROM_SYSTEM_BIOS(1, "v2", "v2") - ROMX_LOAD( "kontur2.rom", 0x10000, 0x2000, CRC(5256d101) SHA1(22022a3c6882dbc5ea28d7815f00c182bbaef9e1), ROM_BIOS(1)) - ROM_REGION( 0x2000, "gfx1", 0 ) - ROM_LOAD( "kontur.fnt", 0x0000, 0x2000, CRC(14d33790) SHA1(6d5fcb214805c5fc44ef98a97219158ff7826ac0)) + ROMX_LOAD("kontur2.rom", 0x0000, 0x2000, CRC(5256d101) SHA1(22022a3c6882dbc5ea28d7815f00c182bbaef9e1), ROM_BIOS(1)) + + ROM_REGION(0x2000, "gfx1", 0) + ROM_LOAD("kontur.fnt", 0x0000, 0x2000, CRC(14d33790) SHA1(6d5fcb214805c5fc44ef98a97219158ff7826ac0)) + + ROM_REGION(0xf5, "decplm", 0) + ROM_LOAD("kr556rt2.d31", 0x00, 0xf5, CRC(3eae3879) SHA1(87f419e26d73d7b2f937c3fcae0415b74da37d97) BAD_DUMP) ROM_END ROM_START( bk8t ) - ROM_REGION( 0x16000, "maincpu", ROMREGION_ERASEFF ) - ROM_LOAD( "kor1.bin", 0x10000, 0x2000, CRC(f1e16ddc) SHA1(e3a10c9ce3f333928eb0d5f9b84e159e41fae6ca)) - ROM_LOAD( "kor2.bin", 0x12000, 0x2000, CRC(d4431d97) SHA1(08f79785846369d410a4183f0d60b856d6d70199)) - ROM_LOAD( "kor3.bin", 0x14000, 0x2000, CRC(74781903) SHA1(caaa638afe80eb83fc30b07dd6d1e40b66ddc6d1)) - ROM_REGION( 0x2000, "gfx1", 0 ) - ROM_LOAD( "kor4.bin", 0x0000, 0x2000, CRC(d164bada) SHA1(c334e50fd31b1f42c7668b89772487971a6875cb)) + ROM_REGION(0x6000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD("kor1.bin", 0x0000, 0x2000, CRC(f1e16ddc) SHA1(e3a10c9ce3f333928eb0d5f9b84e159e41fae6ca)) + ROM_LOAD("kor2.bin", 0x2000, 0x2000, CRC(d4431d97) SHA1(08f79785846369d410a4183f0d60b856d6d70199)) + ROM_LOAD("kor3.bin", 0x4000, 0x2000, CRC(74781903) SHA1(caaa638afe80eb83fc30b07dd6d1e40b66ddc6d1)) + + ROM_REGION(0x2000, "gfx1", 0) + ROM_LOAD("kor4.bin", 0x0000, 0x2000, CRC(d164bada) SHA1(c334e50fd31b1f42c7668b89772487971a6875cb)) + + ROM_REGION(0xf5, "decplm", 0) + ROM_LOAD("kr556rt2.d31", 0x00, 0xf5, CRC(3eae3879) SHA1(87f419e26d73d7b2f937c3fcae0415b74da37d97) BAD_DUMP) ROM_END /* Driver */ /* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ -COMP( 1987, korvet, 0, 0, pk8020, pk8020, pk8020_state, empty_init, "<unknown>", "PK8020 Korvet", 0) -COMP( 1987, neiva, korvet, 0, pk8020, pk8020, pk8020_state, empty_init, "<unknown>", "PK8020 Neiva", 0) -COMP( 1987, kontur, korvet, 0, pk8020, pk8020, pk8020_state, empty_init, "<unknown>", "PK8020 Kontur", 0) -COMP( 1987, bk8t, korvet, 0, pk8020, pk8020, pk8020_state, empty_init, "<unknown>", "BK-8T", 0) +COMP( 1987, korvet, 0, 0, pk8020, pk8020, pk8020_state, empty_init, "<unknown>", "PK8020 Korvet", MACHINE_SUPPORTS_SAVE) +COMP( 1987, neiva, korvet, 0, pk8020, pk8020, pk8020_state, empty_init, "<unknown>", "PK8020 Neiva", MACHINE_SUPPORTS_SAVE) +COMP( 1987, kontur, korvet, 0, pk8020, pk8020, pk8020_state, empty_init, "<unknown>", "PK8020 Kontur", MACHINE_SUPPORTS_SAVE) +COMP( 1987, bk8t, korvet, 0, pk8020, pk8020, pk8020_state, empty_init, "<unknown>", "BK-8T", MACHINE_SUPPORTS_SAVE) diff --git a/src/mame/includes/pk8020.h b/src/mame/includes/pk8020.h index 23ffb6f3cd5..ac1036b11c9 100644 --- a/src/mame/includes/pk8020.h +++ b/src/mame/includes/pk8020.h @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:Miodrag Milanovic +// copyright-holders:Miodrag Milanovic, AJR /***************************************************************************** * * includes/pk8020.h @@ -12,10 +12,10 @@ #include "imagedev/cassette.h" #include "imagedev/floppy.h" +#include "machine/bankdev.h" #include "machine/i8251.h" -#include "machine/i8255.h" #include "machine/pic8259.h" -#include "machine/pit8253.h" +#include "machine/pla.h" #include "machine/ram.h" #include "machine/wd_fdc.h" #include "sound/spkrdev.h" @@ -29,22 +29,17 @@ public: pk8020_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_ppi8255_1(*this, "ppi8255_1"), - m_ppi8255_2(*this, "ppi8255_2"), - m_ppi8255_3(*this, "ppi8255_3"), - m_rs232(*this, "i8251line"), - m_lan(*this, "i8251lan"), + m_decplm(*this, "decplm"), + m_devbank(*this, "devbank"), m_ram(*this, RAM_TAG), - m_wd1793(*this, "wd1793"), - m_floppy0(*this, "wd1793:0"), - m_floppy1(*this, "wd1793:1"), - m_floppy2(*this, "wd1793:2"), - m_floppy3(*this, "wd1793:3"), - m_pit8253(*this, "pit8253"), - m_pic8259(*this, "pic8259"), + m_ios(*this, "ios%u", 1U), + m_fdc(*this, "fdc"), + m_floppy(*this, "fdc:%u", 0U), + m_inr(*this, "inr"), m_speaker(*this, "speaker"), m_region_maincpu(*this, "maincpu"), m_region_gfx1(*this, "gfx1"), + m_io_port(*this, "LINE%u", 0U), m_palette(*this, "palette") { } @@ -53,34 +48,40 @@ public: protected: virtual void machine_start() override; virtual void machine_reset() override; + virtual void video_start() override; private: DECLARE_FLOPPY_FORMATS(floppy_formats); - DECLARE_READ8_MEMBER(keyboard_r); - DECLARE_READ8_MEMBER(sysreg_r); - DECLARE_WRITE8_MEMBER(sysreg_w); - DECLARE_READ8_MEMBER(text_r); - DECLARE_WRITE8_MEMBER(text_w); - DECLARE_READ8_MEMBER(gzu_r); - DECLARE_WRITE8_MEMBER(gzu_w); - DECLARE_READ8_MEMBER(devices_r); - DECLARE_WRITE8_MEMBER(devices_w); + uint8_t keyboard_r(offs_t offset); + void sysreg_w(offs_t offset, uint8_t data); + void color_w(uint8_t data); + void palette_w(uint8_t data); + void video_page_w(uint8_t data); + uint8_t text_r(offs_t offset); + void text_w(offs_t offset, uint8_t data); + uint8_t gzu_r(offs_t offset); + void gzu_w(offs_t offset, uint8_t data); + uint8_t devices_r(offs_t offset); + void devices_w(offs_t offset, uint8_t data); + uint8_t memory_r(offs_t offset); + void memory_w(offs_t offset, uint8_t data); void pk8020_palette(palette_device &palette) const; uint32_t screen_update_pk8020(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); INTERRUPT_GEN_MEMBER(pk8020_interrupt); - DECLARE_READ8_MEMBER(pk8020_porta_r); - DECLARE_WRITE8_MEMBER(pk8020_portc_w); - DECLARE_WRITE8_MEMBER(pk8020_portb_w); - DECLARE_READ8_MEMBER(pk8020_portc_r); - DECLARE_WRITE8_MEMBER(pk8020_2_portc_w); - DECLARE_WRITE_LINE_MEMBER(pk8020_pit_out0); - DECLARE_WRITE_LINE_MEMBER(pk8020_pit_out1); - void pk8020_set_bank(uint8_t data); + uint8_t ppi_porta_r(); + void floppy_control_w(uint8_t data); + void ppi_2_portc_w(uint8_t data); + DECLARE_WRITE_LINE_MEMBER(pit_out0); + + static const char *plm_select_name(uint8_t data); + void log_bank_select(uint8_t bank, offs_t start, offs_t end, uint8_t rdecplm, uint8_t wdecplm); void pk8020_io(address_map &map); void pk8020_mem(address_map &map); + void devices_map(address_map &map); + uint8_t m_bank_select; uint8_t m_color; uint8_t m_video_page; uint8_t m_wide; @@ -89,28 +90,21 @@ private: uint8_t m_text_attr; uint8_t m_takt; uint8_t m_video_page_access; - uint8_t m_portc_data; uint8_t m_sound_gate; uint8_t m_sound_level; required_device<cpu_device> m_maincpu; - required_device<i8255_device> m_ppi8255_1; - required_device<i8255_device> m_ppi8255_2; - required_device<i8255_device> m_ppi8255_3; - required_device<i8251_device> m_rs232; - required_device<i8251_device> m_lan; + required_device<pls100_device> m_decplm; + required_device<address_map_bank_device> m_devbank; required_device<ram_device> m_ram; - required_device<fd1793_device> m_wd1793; - required_device<floppy_connector> m_floppy0; - required_device<floppy_connector> m_floppy1; - required_device<floppy_connector> m_floppy2; - required_device<floppy_connector> m_floppy3; - required_device<pit8253_device> m_pit8253; - required_device<pic8259_device> m_pic8259; + required_device_array<i8251_device, 2> m_ios; + required_device<kr1818vg93_device> m_fdc; + required_device_array<floppy_connector, 4> m_floppy; + required_device<pic8259_device> m_inr; required_device<speaker_sound_device> m_speaker; required_memory_region m_region_maincpu; required_region_ptr<uint8_t> m_region_gfx1; - ioport_port *m_io_port[16]; + required_ioport_array<16> m_io_port; required_device<palette_device> m_palette; }; 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); } diff --git a/src/mame/video/pk8020.cpp b/src/mame/video/pk8020.cpp index c640cd501f9..b4915f1135b 100644 --- a/src/mame/video/pk8020.cpp +++ b/src/mame/video/pk8020.cpp @@ -11,7 +11,127 @@ #include "emu.h" #include "includes/pk8020.h" -#include "machine/ram.h" + +void pk8020_state::video_start() +{ + m_color = 0; + m_text_attr = 0; + + save_item(NAME(m_color)); + save_item(NAME(m_video_page)); + save_item(NAME(m_wide)); + save_item(NAME(m_font)); + save_item(NAME(m_attr)); + save_item(NAME(m_text_attr)); + save_item(NAME(m_video_page_access)); +} + +void pk8020_state::color_w(uint8_t data) +{ + // Color + m_color = data; +} + +void pk8020_state::palette_w(uint8_t data) +{ + // 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) ); +} + +void pk8020_state::video_page_w(uint8_t data) +{ + 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); +} + +uint8_t pk8020_state::text_r(offs_t offset) +{ + if (m_attr == 3) m_text_attr=m_ram->pointer()[0x40400+offset]; + return m_ram->pointer()[0x40000+offset]; +} + +void pk8020_state::text_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; + } +} + +uint8_t pk8020_state::gzu_r(offs_t offset) +{ + 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; +} + +void pk8020_state::gzu_w(offs_t offset, uint8_t data) +{ + 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; + + 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; + } + } +} uint32_t pk8020_state::screen_update_pk8020(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { |