From 58a32ed83e5bc0c6739e774691747364d192c8bb Mon Sep 17 00:00:00 2001 From: "R. Belmont" Date: Sun, 9 Feb 2014 06:15:29 +0000 Subject: [PATCH] (MESS) apple3: rewrote keyboard handling from scratch using Curt's AY-5-3600 device. Much, much better. [R. Belmont] --- src/mess/drivers/apple3.c | 230 ++++++++++++++++++++++++++----------- src/mess/includes/apple3.h | 19 ++- src/mess/machine/apple3.c | 179 +++++++++++++++++++++++++---- 3 files changed, 337 insertions(+), 91 deletions(-) diff --git a/src/mess/drivers/apple3.c b/src/mess/drivers/apple3.c index 029740a5d6d..f2a8c72a290 100644 --- a/src/mess/drivers/apple3.c +++ b/src/mess/drivers/apple3.c @@ -47,6 +47,23 @@ static const struct a2bus_interface a2bus_intf = DEVCB_NULL }; +static AY3600_INTERFACE( ay3600_intf ) +{ + DEVCB_INPUT_PORT("X0"), + DEVCB_INPUT_PORT("X1"), + DEVCB_INPUT_PORT("X2"), + DEVCB_INPUT_PORT("X3"), + DEVCB_INPUT_PORT("X4"), + DEVCB_INPUT_PORT("X5"), + DEVCB_INPUT_PORT("X6"), + DEVCB_INPUT_PORT("X7"), + DEVCB_INPUT_PORT("X8"), + DEVCB_DRIVER_LINE_MEMBER(apple3_state, ay3600_shift_r), + DEVCB_DRIVER_LINE_MEMBER(apple3_state, ay3600_control_r), + DEVCB_DRIVER_LINE_MEMBER(apple3_state, ay3600_data_ready_w), + DEVCB_NULL +}; + static MACHINE_CONFIG_START( apple3, apple3_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6502, 2000000) /* 2 MHz */ @@ -72,7 +89,7 @@ static MACHINE_CONFIG_START( apple3, apple3_state ) MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", apple3_state, apple3_interrupt, "screen", 0, 1) /* keyboard controller */ - MCFG_DEVICE_ADD("ay3600", AY3600N, 0) + MCFG_AY3600_ADD("ay3600", 0, ay3600_intf) /* slot bus */ MCFG_A2BUS_BUS_ADD("a2bus", "maincpu", a2bus_intf) @@ -111,77 +128,162 @@ MACHINE_CONFIG_END static INPUT_PORTS_START( apple3 ) - PORT_START("keyb_0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Delete") PORT_CODE(KEYCODE_BACKSPACE)PORT_CHAR(8) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Tab") PORT_CODE(KEYCODE_TAB) PORT_CHAR(9) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_DOWN) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_RIGHT) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Esc") PORT_CODE(KEYCODE_ESC) PORT_CHAR(27) + /* + KB3600 Keyboard matrix (KB3600 has custom layout mask ROM, Apple p/n 341-0035) - PORT_START("keyb_1") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('\"') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') + | Y0 | Y1 | Y2 | Y3 | Y4 | Y5 | Y6 | Y7 | Y8 | Y9 | + | | | | | | | | | | | + ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| + X0 | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | + ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| + X1 | TAB | Q | W | E | R | T | Y | U | I | O | + ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| + X2 | A | S | D | F | H | G | J | K | ;: | L | + ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| + X3 | Z | X | C | V | B | N | M | <, | >. | ?/ | + ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| + X4 | | KP9 | | KP8 | | KP7 | \| | += | 0 | -_ | + ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| + X5 | | KP6 | | KP5 | | KP4 | `~ | ]} | P | [{ | + ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| + X6 | | KP3 | KP. | KP2 | KP0 | KP1 |RETRN| UP |BACKS| '" | + ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| + X7 | | |KPENT|SPACE| | KP- |RIGHT|DOWN |LEFT | | + ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| + */ - PORT_START("keyb_2") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^') - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*') - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') +/* + Esc + 0x00 - PORT_START("keyb_3") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_TILDE) PORT_CHAR('`') PORT_CHAR('~') - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('A') PORT_CHAR('a') - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('B') PORT_CHAR('b') + ` 1 2 3 4 5 6 7 8 9 0 - = BACKSPACE + 0x38 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x30 0x31 0x2f 0x104 - PORT_START("keyb_4") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('C') PORT_CHAR('c') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('D') PORT_CHAR('d') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('E') PORT_CHAR('e') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('F') PORT_CHAR('f') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('G') PORT_CHAR('g') - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('H') PORT_CHAR('h') - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('I') PORT_CHAR('i') - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('J') PORT_CHAR('j') + Tab Q W E R T Y U I O P [ ] \ + 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f 0x10 0x11 0x12 0x13 0x3a 0x3b 0x39 0x2e - PORT_START("keyb_5") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('K') PORT_CHAR('k') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('L') PORT_CHAR('l') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('M') PORT_CHAR('m') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('N') PORT_CHAR('n') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('O') PORT_CHAR('o') - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('P') PORT_CHAR('p') - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') PORT_CHAR('q') - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('R') PORT_CHAR('r') + A S D F G H J K L ; ' ENTER + 0x14 0x15 0x16 0x17 0x19 0x18 0x1a 0x1b 0x1d 0x1c 0x105 0x102 + + Z X C V B N M , . / + 0x1e 0x1f 0x20 0x21 0x22 0x23 0x24 0x25 0x26 0x27 + + SPACE UP LT DN RT KP- KP7 KP8 KP9 + 0x109 0x103 0x10e 0x10d 0x10c 0x10b 0x2d 0x2b 0x29 + + KP4 KP5 KP6 KP1 KP2 KP3 KPEN KP0 KP. + 0x37 0x35 0x33 0x101 0x3f 0x3d 0x108 0x100 0x3e +*/ + PORT_START("X0") + PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Esc") PORT_CODE(KEYCODE_ESC) PORT_CHAR(27) + PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') + PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('\"') + PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') + PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') + PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') + PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&') + PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'') + PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(') + PORT_BIT( 0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')') - PORT_START("keyb_6") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('S') PORT_CHAR('s') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('T') PORT_CHAR('t') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('U') PORT_CHAR('u') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('V') PORT_CHAR('v') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('W') PORT_CHAR('w') - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('X') PORT_CHAR('x') - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') PORT_CHAR('y') - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') PORT_CHAR('z') + PORT_START("X1") + PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Tab") PORT_CODE(KEYCODE_TAB) PORT_CHAR(9) + PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') PORT_CHAR('q') + PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('W') PORT_CHAR('w') + PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('E') PORT_CHAR('e') + PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('R') PORT_CHAR('r') + PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('T') PORT_CHAR('t') + PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') PORT_CHAR('y') + PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('U') PORT_CHAR('u') + PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('I') PORT_CHAR('i') + PORT_BIT( 0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('O') PORT_CHAR('o') + + PORT_START("X2") + PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('A') PORT_CHAR('a') + PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('S') PORT_CHAR('s') + PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('D') PORT_CHAR('d') + PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('F') PORT_CHAR('f') + PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('H') PORT_CHAR('h') + PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('G') PORT_CHAR('g') + PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('J') PORT_CHAR('j') + PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('K') PORT_CHAR('k') + PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') + PORT_BIT( 0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('L') PORT_CHAR('l') + + PORT_START("X3") + PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') PORT_CHAR('z') + PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('X') PORT_CHAR('x') + PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('C') PORT_CHAR('c') + PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('V') PORT_CHAR('v') + PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('B') PORT_CHAR('b') + PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('N') PORT_CHAR('n') + PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('M') PORT_CHAR('m') + PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') + PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') + PORT_BIT( 0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') + + PORT_START("X4") + PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) + PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) + PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) + PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') + PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+') + PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') + PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') + + PORT_START("X5") + PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) + PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) + PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) + PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_TILDE) PORT_CHAR('`') PORT_CHAR('~') + PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') + PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('P') PORT_CHAR('p') + PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') + + PORT_START("X6") + PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) + PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) + PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) + PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) + PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) + PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) + PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP) + PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Delete") PORT_CODE(KEYCODE_BACKSPACE)PORT_CHAR(8) + PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('\"') + + PORT_START("X7") + PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD)) + PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') + PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) + PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_RIGHT) PORT_CODE(KEYCODE_RIGHT) + PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_DOWN) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(10) + PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_LEFT) + PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_UNUSED) + + PORT_START("X8") + PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_UNUSED) PORT_START("keyb_special") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Caps Lock") PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Left Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Right Shift") PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Control") PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2) diff --git a/src/mess/includes/apple3.h b/src/mess/includes/apple3.h index 7928f5cbb6f..3e20b6ead4f 100644 --- a/src/mess/includes/apple3.h +++ b/src/mess/includes/apple3.h @@ -16,7 +16,7 @@ #include "machine/applefdc.h" #include "machine/mos6551.h" #include "machine/6522via.h" -#include "machine/ay3600.h" +#include "machine/kb3600.h" #include "sound/speaker.h" #include "sound/dac.h" @@ -41,19 +41,25 @@ public: m_ram(*this, RAM_TAG), m_via_0(*this, "via6522_0"), m_via_1(*this, "via6522_1"), + m_acia(*this, "acia"), + m_fdc(*this, "fdc"), m_ay3600(*this, "ay3600"), m_speaker(*this, SPEAKER_TAG), - m_dac(*this, DAC_TAG) + m_dac(*this, DAC_TAG), + m_kbspecial(*this, "keyb_special") { } - required_device m_maincpu; + required_device m_maincpu; required_device m_ram; required_device m_via_0; required_device m_via_1; - required_device m_ay3600; + required_device m_acia; + required_device m_fdc; + required_device m_ay3600; required_device m_speaker; required_device m_dac; + required_ioport m_kbspecial; UINT32 m_flags; UINT8 m_via_0_a; @@ -103,6 +109,9 @@ public: TIMER_DEVICE_CALLBACK_MEMBER(apple3_c040_tick); DECLARE_PALETTE_INIT(apple3); void apple3_irq_update(); + DECLARE_READ_LINE_MEMBER(ay3600_shift_r); + DECLARE_READ_LINE_MEMBER(ay3600_control_r); + DECLARE_WRITE_LINE_MEMBER(ay3600_data_ready_w); bool m_sync; UINT8 m_indir_opcode; @@ -113,6 +122,8 @@ public: UINT8 *m_bank6, *m_bank7; int m_speaker_state; int m_c040_time; + UINT16 m_lastchar, m_strobe; + UINT8 m_transchar; }; diff --git a/src/mess/machine/apple3.c b/src/mess/machine/apple3.c index 34c01e7428a..1d76086bf42 100644 --- a/src/mess/machine/apple3.c +++ b/src/mess/machine/apple3.c @@ -55,8 +55,6 @@ static void apple3_update_drives(device_t *device); READ8_MEMBER(apple3_state::apple3_c0xx_r) { - mos6551_device *acia = machine().device("acia"); - applefdc_base_device *fdc = machine().device("fdc"); UINT8 result = 0xFF; switch(offset) @@ -64,44 +62,51 @@ READ8_MEMBER(apple3_state::apple3_c0xx_r) /* keystrobe */ case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: - result = m_ay3600->keydata_strobe_r(); + result = (m_transchar & 0x7f) | m_strobe; break; /* modifier keys */ case 0x08: case 0x09: case 0x0A: case 0x0B: case 0x0C: case 0x0D: case 0x0E: case 0x0F: { - UINT8 tmp = m_ay3600->keymod_r(); + UINT8 tmp = m_kbspecial->read(); - result = 0x7e; - if (tmp & AY3600_KEYMOD_SHIFT) + result = 0x7c | (m_transchar & 0x80); + + if (m_strobe) { - result &= ~0x02; + result |= 1; } - if (tmp & AY3600_KEYMOD_CONTROL) + + if (tmp & 0x06) + { + result |= 0x02; + } + if (tmp & 0x08) { result &= ~0x04; } - if (tmp & AY3600_KEYMOD_CAPSLOCK) + if (tmp & 0x01) { result &= ~0x08; } - if (tmp & AY3600_KEYMOD_COMMAND) + if (tmp & 0x10) { result &= ~0x10; } - if (tmp & AY3600_KEYMOD_OPTION) + if (tmp & 0x20) { result &= ~0x20; } } + printf("modifier = %02x\n", result); break; case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: case 0x18: case 0x19: case 0x1A: case 0x1B: case 0x1C: case 0x1D: case 0x1E: case 0x1F: - m_ay3600->anykey_clearstrobe_r(); + m_strobe = 0; break; case 0x30: case 0x31: case 0x32: case 0x33: @@ -157,14 +162,14 @@ READ8_MEMBER(apple3_state::apple3_c0xx_r) case 0xE4: case 0xE5: case 0xE6: case 0xE7: case 0xE8: case 0xE9: case 0xEA: case 0xEB: case 0xEC: case 0xED: case 0xEE: case 0xEF: - result = fdc->read(offset); + result = m_fdc->read(offset); break; case 0xF0: case 0xF1: case 0xF2: case 0xF3: - result = acia->read(space, offset & 0x03); + result = m_acia->read(space, offset & 0x03); break; } return result; @@ -174,16 +179,13 @@ READ8_MEMBER(apple3_state::apple3_c0xx_r) WRITE8_MEMBER(apple3_state::apple3_c0xx_w) { - mos6551_device *acia = machine().device("acia"); - applefdc_base_device *fdc = machine().device("fdc"); - switch(offset) { case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: case 0x18: case 0x19: case 0x1A: case 0x1B: case 0x1C: case 0x1D: case 0x1E: case 0x1F: - m_ay3600->anykey_clearstrobe_r(); + m_strobe = 0; break; case 0x30: case 0x31: case 0x32: case 0x33: @@ -228,21 +230,20 @@ WRITE8_MEMBER(apple3_state::apple3_c0xx_w) case 0xE4: case 0xE5: case 0xE6: case 0xE7: case 0xE8: case 0xE9: case 0xEA: case 0xEB: case 0xEC: case 0xED: case 0xEE: case 0xEF: - fdc->write(offset, data); + m_fdc->write(offset, data); break; case 0xF0: case 0xF1: case 0xF2: case 0xF3: - acia->write(space, offset & 0x03, data); + m_acia->write(space, offset & 0x03, data); break; } } TIMER_DEVICE_CALLBACK_MEMBER(apple3_state::apple3_interrupt) { - m_via_1->write_ca2((m_ay3600->keydata_strobe_r() & 0x80) ? 1 : 0); m_via_1->write_cb1(machine().primary_screen->vblank()); m_via_1->write_cb2(machine().primary_screen->vblank()); } @@ -421,6 +422,8 @@ MACHINE_RESET_MEMBER(apple3_state,apple3) m_speaker_state = 0; m_speaker->level_w(0); m_c040_time = 0; + m_strobe = 0; + m_lastchar = 0x0d; } @@ -611,8 +614,6 @@ DRIVER_INIT_MEMBER(apple3_state,apple3) m_via_1->write_pb7(1); apple3_update_memory(); - - m_ay3600->set_runtime_config(false, false); // no keypad (yet), no repeat key } READ8_MEMBER(apple3_state::apple3_memory_r) @@ -864,3 +865,135 @@ TIMER_DEVICE_CALLBACK_MEMBER(apple3_state::apple3_c040_tick) } } +READ_LINE_MEMBER(apple3_state::ay3600_shift_r) +{ + // either shift key + if (m_kbspecial->read() & 0x06) + { + return ASSERT_LINE; + } + + return CLEAR_LINE; +} + +READ_LINE_MEMBER(apple3_state::ay3600_control_r) +{ + if (m_kbspecial->read() & 0x08) + { + return ASSERT_LINE; + } + + return CLEAR_LINE; +} + +static const UINT8 key_remap[0x50][4] = +{ +/* norm shft ctrl both */ + { 0x9b,0x9b,0x9b,0x9b }, /* Escape 00 */ + { 0x31,0x21,0x31,0x31 }, /* 1 ! 01 */ + { 0x32,0x40,0x32,0x00 }, /* 2 @ 02 */ + { 0x33,0x23,0x33,0x23 }, /* 3 # 03 */ + { 0x34,0x24,0x34,0x24 }, /* 4 $ 04 */ + { 0x35,0x25,0x35,0x25 }, /* 5 % 05 */ + { 0x36,0x5e,0x35,0x53 }, /* 6 ^ 06 */ + { 0x37,0x26,0x37,0x26 }, /* 7 & 07 */ + { 0x38,0x2a,0x38,0x2a }, /* 8 * 08 */ + { 0x39,0x28,0x39,0x28 }, /* 9 ( 09 */ + { 0x89,0x89,0x89,0x89 }, /* Tab 0a */ + { 0x51,0x51,0x11,0x11 }, /* q Q 0b */ + { 0x57,0x57,0x17,0x17 }, /* w W 0c */ + { 0x45,0x45,0x05,0x05 }, /* e E 0d */ + { 0x52,0x52,0x12,0x12 }, /* r R 0e */ + { 0x54,0x54,0x14,0x14 }, /* t T 0f */ + { 0x59,0x59,0x19,0x19 }, /* y Y 10 */ + { 0x55,0x55,0x15,0x15 }, /* u U 11 */ + { 0x49,0x49,0x09,0x09 }, /* i I 12 */ + { 0x4f,0x4f,0x0f,0x0f }, /* o O 13 */ + { 0x41,0x41,0x01,0x01 }, /* a A 14 */ + { 0x53,0x53,0x13,0x13 }, /* s S 15 */ + { 0x44,0x44,0x04,0x04 }, /* d D 16 */ + { 0x46,0x46,0x06,0x06 }, /* f F 17 */ + { 0x48,0x48,0x08,0x08 }, /* h H 18 */ + { 0x47,0x47,0x07,0x07 }, /* g G 19 */ + { 0x4a,0x4a,0x0a,0x0a }, /* j J 1a */ + { 0x4b,0x4b,0x0b,0x0b }, /* k K 1b */ + { 0x3b,0x3a,0x3b,0x3a }, /* ; : 1c */ + { 0x4c,0x4c,0x0c,0x0c }, /* l L 1d */ + { 0x5a,0x5a,0x1a,0x1a }, /* z Z 1e */ + { 0x58,0x58,0x18,0x18 }, /* x X 1f */ + { 0x43,0x43,0x03,0x03 }, /* c C 20 */ + { 0x56,0x56,0x16,0x16 }, /* v V 21 */ + { 0x42,0x42,0x02,0x02 }, /* b B 22 */ + { 0x4e,0x4e,0x0e,0x0e }, /* n N 23 */ + { 0x4d,0x4d,0x0d,0x0d }, /* m M 24 */ + { 0x2c,0x3c,0x2c,0x3c }, /* , < 25 */ + { 0x2e,0x3e,0x2e,0x3e }, /* . > 26 */ + { 0x3f,0x2f,0x3f,0x2f }, /* / ? 27 */ + { 0x00,0x00,0x00,0x00 }, /* 0x28 unused */ + { 0xb9,0xb9,0xb9,0xb9 }, /* 9 (KP) 29 */ + { 0x00,0x00,0x00,0x00 }, /* 0x2a unused */ + { 0xb8,0xb8,0xb8,0xb8 }, /* 8 (KP) 2b */ + { 0x00,0x00,0x00,0x00 }, /* 0x2c unused */ + { 0xb7,0xb7,0xb7,0xb7 }, /* 7 (KP) 2d */ + { 0x5c,0x7c,0x7f,0x1c }, /* \ | 2e */ + { 0x3d,0x2b,0x3d,0x2b }, /* = + 2f */ + { 0x30,0x29,0x30,0x29 }, /* 0 ) 30 */ + { 0x2d,0x5f,0x2d,0x1f }, /* - _ 31 */ + { 0x00,0x00,0x00,0x00 }, /* 0x32 unused */ + { 0xb6,0xb6,0xb6,0xb6 }, /* 6 (KP) 33 */ + { 0x00,0x00,0x00,0x00 }, /* 0x34 unused */ + { 0xb5,0xb5,0xb5,0xb5 }, /* 5 (KP) 35 */ + { 0x00,0x00,0x00,0x00 }, /* 0x36 unused */ + { 0xb4,0xb4,0xb4,0xb4 }, /* 4 (KP) 37 */ + { 0x27,0x22,0x27,0x22 }, /* ` ~ 38 */ + { 0x5d,0x7d,0x1d,0x1d }, /* ] } 39 */ + { 0x50,0x50,0x10,0x10 }, /* p P 3a */ + { 0x5b,0x7b,0x1b,0x1b }, /* [ { 3b */ + { 0x00,0x00,0x00,0x00 }, /* 0x3c unused */ + { 0xb3,0xb3,0xb3,0xb3 }, /* 3 (KP) 3d */ + { 0xae,0xae,0xae,0xae }, /* . (KP) 3e */ + { 0xb2,0xb2,0xb2,0xb2 }, /* 2 (KP) 3f */ + { 0xb0,0xb0,0xb0,0xb0 }, /* 0 (KP) 40 */ + { 0xb1,0xb1,0xb1,0xb1 }, /* 1 (KP) 41 */ + { 0x0d,0x0d,0x0d,0x0d }, /* Enter 42 */ + { 0x8b,0x8b,0x8b,0x8b }, /* Up 43 */ + { 0x00,0x00,0x00,0x00 }, /* 0x44 unused */ + { 0x3d,0x2b,0x3d,0x2b }, /* ' " 45 */ + { 0x00,0x00,0x00,0x00 }, /* 0x46 unused */ + { 0x00,0x00,0x00,0x00 }, /* 0x47 unused */ + { 0x8d,0x8d,0x8d,0x8d }, /* Ent(KP) 48 */ + { 0xa0,0xa0,0xa0,0xa0 }, /* Space 49 */ + { 0x00,0x00,0x00,0x00 }, /* 0x4a unused */ + { 0xad,0xad,0xad,0xad }, /* - (KP) 4b */ + { 0x95,0x95,0x95,0x95 }, /* Right 4c */ + { 0x8a,0x8a,0x8a,0x8a }, /* Down 4d */ + { 0x8b,0x8b,0x8b,0x8b }, /* Left 4e */ + { 0x00,0x00,0x00,0x00 } /* 0x4f unused */ +}; + +WRITE_LINE_MEMBER(apple3_state::ay3600_data_ready_w) +{ + m_via_1->write_ca2(state); + + if (state == ASSERT_LINE) + { + UINT16 trans; + int mod = 0; + m_lastchar = m_ay3600->b_r(); + + trans = m_lastchar & ~(0x1c0); // clear the 3600's control/shift stuff + trans |= (m_lastchar & 0x100)>>2; // bring the 0x100 bit down to the 0x40 place + + mod = (m_kbspecial->read() & 0x06) ? 0x01 : 0x00; + mod |= (m_kbspecial->read() & 0x08) ? 0x02 : 0x00; + + m_transchar = key_remap[trans][mod]; + + if (m_transchar != 0) + { + m_strobe = 0x80; +// printf("new char = %04x (%02x)\n", trans, m_transchar); + } + } +} +