(MESS) apple3: rewrote keyboard handling from scratch using Curt's AY-5-3600 device. Much, much better. [R. Belmont]

This commit is contained in:
R. Belmont 2014-02-09 06:15:29 +00:00
parent 73c35febef
commit 58a32ed83e
3 changed files with 337 additions and 91 deletions

View File

@ -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
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')
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("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)

View File

@ -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<cpu_device> m_maincpu;
required_device<m6502_device> m_maincpu;
required_device<ram_device> m_ram;
required_device<via6522_device> m_via_0;
required_device<via6522_device> m_via_1;
required_device<ay3600n_device> m_ay3600;
required_device<mos6551_device> m_acia;
required_device<applefdc_base_device> m_fdc;
required_device<ay3600_device> m_ay3600;
required_device<speaker_sound_device> m_speaker;
required_device<dac_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;
};

View File

@ -55,8 +55,6 @@ static void apple3_update_drives(device_t *device);
READ8_MEMBER(apple3_state::apple3_c0xx_r)
{
mos6551_device *acia = machine().device<mos6551_device>("acia");
applefdc_base_device *fdc = machine().device<applefdc_base_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<mos6551_device>("acia");
applefdc_base_device *fdc = machine().device<applefdc_base_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);
}
}
}