agat.cpp: Native keyboard, video and floppy improvements. (#7449)

This commit is contained in:
shattered 2020-11-10 01:58:10 +00:00 committed by GitHub
parent 275671e393
commit c73e27e699
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 414 additions and 340 deletions

View File

@ -1645,6 +1645,8 @@ createMESSProjects(_target, _subtarget, "agat")
files {
MAME_DIR .. "src/mame/drivers/agat.cpp",
MAME_DIR .. "src/mame/includes/apple2.h",
MAME_DIR .. "src/mame/machine/agatkeyb.cpp",
MAME_DIR .. "src/mame/machine/agatkeyb.h",
MAME_DIR .. "src/mame/video/agat7.cpp",
MAME_DIR .. "src/mame/video/agat7.h",
MAME_DIR .. "src/mame/video/agat9.cpp",

View File

@ -384,7 +384,7 @@ uint8_t a2bus_agat_fdc_device::read_cnxx(uint8_t offset)
*/
uint8_t a2bus_agat_fdc_device::d14_i_b()
{
u8 data = 0x3;
u8 data = 0x0;
// all signals active low
if (floppy)
@ -421,6 +421,16 @@ void a2bus_agat_fdc_device::d14_o_c(uint8_t data)
{
m_unit = BIT(data, 3);
switch (m_unit)
{
case 0:
floppy = floppy0 ? floppy0->get_device() : nullptr;
break;
case 1:
floppy = floppy1 ? floppy1->get_device() : nullptr;
break;
}
if (floppy)
{
floppy->dir_w(!BIT(data, 2));

View File

@ -14,7 +14,6 @@
Apple modes is different and pixel stretching is not done.
To do (common):
- native keyboard (at least two variants)
- video: use palette rom
- video: text modes use 7x8 character cell and 224x256 raster
- video: vertical raster splits (used at least by Rapira)
@ -31,7 +30,7 @@
To do (agat9):
- accurate lc emulation (what do writes do? etc.)
- 840k floppy: support 2nd drive, writing, motor off, the rest of .aim format
- 840k floppy: support writing, motor off, the rest of .aim format
- memory expansion boards, a2bus_inh_w
- hw variant: video status readback ("Moscow")
- hw variant: agat9a model (via http://agatcomp.ru/Images/case.shtml)
@ -39,6 +38,7 @@
- does cassette output work?
- what do floating bus reads do?
- why prodos does not boot?
- why spriteos does not see printer card?
Slot devices -- 1st party:
- agat7: apple2 video card -- decimal 3.089.121 -- http://agatcomp.ru/Images/new_j121.shtml
@ -51,7 +51,6 @@
- HDC, etc. via http://agatcomp.ru/Hard/losthard.shtml
- network cards -- via http://agatcomp.ru/Images/new_net.shtml
- sound cards (5-voice synth card, MIDI i/o card) via http://agatcomp.ru/Images/new_sound.shtml
- Nippel Clock (mc146818) -- https://archive.org/details/Nippel_Clock_Agat
- Nippel Mouse -- http://agatcomp.ru/Images/new_mouse.shtml
- Nippel ADC (digital oscilloscope) -- via http://agatcomp.ru/Images/new_IO.shtml
- Nippel Co-processor (R65C02 clone + dual-ported RAM) -- via http://agatcomp.ru/Images/new_IO.shtml
@ -78,7 +77,7 @@
#include "imagedev/cassette.h"
#include "machine/bankdev.h"
#include "machine/kb3600.h"
#include "machine/agatkeyb.h"
#include "machine/timer.h"
#include "sound/spkrdev.h"
@ -97,7 +96,6 @@
#define A7_CPU_TAG "maincpu"
#define A7_KBDC_TAG "ay3600"
#define A7_SPEAKER_TAG "speaker"
#define A7_CASSETTE_TAG "tape"
#define A7_UPPERBANK_TAG "inhbank"
@ -112,27 +110,18 @@ public:
: driver_device(mconfig, type, tag)
, m_maincpu(*this, A7_CPU_TAG)
, m_ram(*this, RAM_TAG)
, m_ay3600(*this, A7_KBDC_TAG)
, m_a2bus(*this, "a2bus")
, m_joy1x(*this, "joystick_1_x")
, m_joy1y(*this, "joystick_1_y")
, m_joy2x(*this, "joystick_2_x")
, m_joy2y(*this, "joystick_2_y")
, m_joybuttons(*this, "joystick_buttons")
, m_kbspecial(*this, "keyb_special")
, m_kbrepeat(*this, "keyb_repeat")
, m_speaker(*this, A7_SPEAKER_TAG)
, m_cassette(*this, A7_CASSETTE_TAG)
, m_upperbank(*this, A7_UPPERBANK_TAG)
{ }
INTERRUPT_GEN_MEMBER(agat_vblank);
TIMER_DEVICE_CALLBACK_MEMBER(ay3600_repeat);
DECLARE_READ_LINE_MEMBER(ay3600_shift_r);
DECLARE_READ_LINE_MEMBER(ay3600_control_r);
DECLARE_WRITE_LINE_MEMBER(ay3600_data_ready_w);
DECLARE_WRITE_LINE_MEMBER(ay3600_ako_w);
uint8_t c080_r(offs_t offset);
void c080_w(offs_t offset, uint8_t data);
@ -164,14 +153,14 @@ public:
uint8_t controller_strobe_r();
void controller_strobe_w(uint8_t data);
void kbd_put(u8 data);
DECLARE_WRITE_LINE_MEMBER( kbd_meta );
protected:
required_device<cpu_device> m_maincpu;
required_device<ram_device> m_ram;
required_device<ay3600_device> m_ay3600;
required_device<a2bus_device> m_a2bus;
required_ioport m_joy1x, m_joy1y, m_joy2x, m_joy2y, m_joybuttons;
required_ioport m_kbspecial;
required_ioport m_kbrepeat;
required_device<speaker_sound_device> m_speaker;
required_device<cassette_image_device> m_cassette;
required_device<address_map_bank_device> m_upperbank;
@ -188,9 +177,8 @@ protected:
double m_joystick_x2_time;
double m_joystick_y2_time;
uint16_t m_lastchar, m_strobe;
uint8_t m_transchar;
bool m_anykeydown;
uint8_t m_transchar, m_strobe;
bool m_meta;
int m_inh_slot;
int m_cnxx_slot;
@ -365,6 +353,9 @@ void agat_base_state::machine_start()
m_cassette_state = 0;
m_cassette->output(-1.0f);
m_inh_bank = 0;
m_transchar = 0;
m_strobe = 0;
m_meta = false;
// precalculate joystick time constants
m_x_calibration = attotime::from_usec(12).as_double();
@ -387,13 +378,11 @@ void agat_base_state::machine_start()
save_item(NAME(m_joystick_y1_time));
save_item(NAME(m_joystick_x2_time));
save_item(NAME(m_joystick_y2_time));
save_item(NAME(m_lastchar));
save_item(NAME(m_strobe));
save_item(NAME(m_transchar));
save_item(NAME(m_inh_slot));
save_item(NAME(m_inh_bank));
save_item(NAME(m_cnxx_slot));
save_item(NAME(m_anykeydown));
}
void agat7_state::machine_start()
@ -419,7 +408,6 @@ void agat9_state::machine_start()
void agat_base_state::machine_reset()
{
m_anykeydown = false;
m_agat_interrupts = false;
}
@ -466,6 +454,20 @@ void agat9_state::machine_reset()
I/O
***************************************************************************/
void agat_base_state::kbd_put(u8 data)
{
if (!m_strobe)
{
m_transchar = data;
m_strobe = 0x80;
}
}
WRITE_LINE_MEMBER( agat_base_state::kbd_meta )
{
m_meta = state;
}
uint8_t agat7_state::keyb_data_r()
{
return m_strobe ? (m_transchar | m_strobe) : 0;
@ -479,7 +481,7 @@ uint8_t agat9_state::keyb_data_r()
uint8_t agat_base_state::keyb_strobe_r()
{
// reads any key down, clears strobe
uint8_t rv = m_transchar | (m_anykeydown ? 0x80 : 0x00);
uint8_t rv = m_strobe;
if (!machine().side_effects_disabled())
m_strobe = 0;
return rv;
@ -554,8 +556,8 @@ uint8_t agat_base_state::flags_r(offs_t offset)
case 2: // button 1
return (m_joybuttons->read() & 0x20) ? 0x80 : 0;
case 3: // button 2
return ((m_joybuttons->read() & 0x40) || !(m_kbspecial->read() & 0x06)) ? 0x80 : 0;
case 3: // meta key
return m_meta ? 0 : 0x80;
case 4: // joy 1 X axis
return (machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0;
@ -1101,132 +1103,6 @@ void agat9_state::inhbank_map(address_map &map)
KEYBOARD
***************************************************************************/
READ_LINE_MEMBER(agat_base_state::ay3600_shift_r)
{
// either shift key
if (m_kbspecial->read() & 0x06)
{
return ASSERT_LINE;
}
return CLEAR_LINE;
}
READ_LINE_MEMBER(agat_base_state::ay3600_control_r)
{
if (m_kbspecial->read() & 0x08)
{
return ASSERT_LINE;
}
return CLEAR_LINE;
}
static const uint8_t a2_key_remap[0x40][4] =
{
/* norm shft ctrl both */
{ 0x33,0x23,0x33,0x23 }, /* 3 # 00 */
{ 0x34,0x24,0x34,0x24 }, /* 4 $ 01 */
{ 0x35,0x25,0x35,0x25 }, /* 5 % 02 */
{ 0x36,'&', 0x35,'&' }, /* 6 & 03 */
{ 0x37,0x27,0x37,0x27 }, /* 7 ' 04 */
{ 0x38,0x28,0x38,0x28 }, /* 8 ( 05 */
{ 0x39,0x29,0x39,0x29 }, /* 9 ) 06 */
{ 0x30,0x30,0x30,0x30 }, /* 0 07 */
{ 0x3a,0x2a,0x3b,0x2a }, /* : * 08 */
{ 0x2d,0x3d,0x2d,0x3d }, /* - = 09 */
{ 0x51,0x51,0x11,0x11 }, /* q Q 0a */
{ 0x57,0x57,0x17,0x17 }, /* w W 0b */
{ 0x45,0x45,0x05,0x05 }, /* e E 0c */
{ 0x52,0x52,0x12,0x12 }, /* r R 0d */
{ 0x54,0x54,0x14,0x14 }, /* t T 0e */
{ 0x59,0x59,0x19,0x19 }, /* y Y 0f */
{ 0x55,0x55,0x15,0x15 }, /* u U 10 */
{ 0x49,0x49,0x09,0x09 }, /* i I 11 */
{ 0x4f,0x4f,0x0f,0x0f }, /* o O 12 */
{ 0x50,0x50,0x10,0x10 }, /* p P 13 */
{ 0x44,0x44,0x04,0x04 }, /* d D 14 */
{ 0x46,0x46,0x06,0x06 }, /* f F 15 */
{ 0x47,0x47,0x07,0x07 }, /* g G 16 */
{ 0x48,0x48,0x08,0x08 }, /* h H 17 */
{ 0x4a,0x4a,0x0a,0x0a }, /* j J 18 */
{ 0x4b,0x4b,0x0b,0x0b }, /* k K 19 */
{ 0x4c,0x4c,0x0c,0x0c }, /* l L 1a */
{ ';' ,0x2b,';' ,0x2b }, /* ; + 1b */
{ 0x08,0x08,0x08,0x08 }, /* Left 1c */
{ 0x15,0x15,0x15,0x15 }, /* Right 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 */
{ 0x2f,0x3f,0x2f,0x3f }, /* / ? 27 */
{ 0x53,0x53,0x13,0x13 }, /* s S 28 */
{ 0x32,0x22,0x32,0x00 }, /* 2 " 29 */
{ 0x31,0x21,0x31,0x31 }, /* 1 ! 2a */
{ 0x1b,0x1b,0x1b,0x1b }, /* Escape 2b */
{ 0x41,0x41,0x01,0x01 }, /* a A 2c */
{ 0x20,0x20,0x20,0x20 }, /* Space 2d */
{ 0x19,0x19,0x19,0x19 }, /* Up */
{ 0x1a,0x1a,0x1a,0x1a }, /* Down */
{ 0x10,0x10,0x10,0x10 }, /* KP1 */
{ 0x0d,0x0d,0x0d,0x0d }, /* Enter 31 */
{ 0x11,0x11,0x11,0x11 }, /* KP2 */
{ 0x12,0x12,0x12,0x12 }, /* KP3 */
{ 0x13,0x13,0x13,0x13 }, /* KP4 */
{ 0x14,0x14,0x14,0x14 }, /* KP5 */
{ 0x1c,0x1c,0x1c,0x1c }, /* KP6 */
{ 0x1d,0x1d,0x1d,0x1d }, /* KP7 */
{ 0x1e,0x1e,0x1e,0x1e }, /* KP8 */
{ 0x1f,0x1f,0x1f,0x1f }, /* KP9 */
{ 0x01,0x01,0x01,0x01 }, /* KP0 */
{ 0x02,0x02,0x02,0x02 }, /* KP. */
{ 0x03,0x03,0x03,0x03 }, /* KP= */
{ 0x04,0x04,0x04,0x04 }, /* PF1 */
{ 0x05,0x05,0x05,0x05 }, /* PF2 */
{ 0x06,0x06,0x06,0x06 }, /* PF3 */
};
WRITE_LINE_MEMBER(agat_base_state::ay3600_data_ready_w)
{
if (state == ASSERT_LINE)
{
int mod = 0;
m_lastchar = m_ay3600->b_r();
mod = (m_kbspecial->read() & 0x06) ? 0x01 : 0x00;
mod |= (m_kbspecial->read() & 0x08) ? 0x02 : 0x00;
m_transchar = a2_key_remap[m_lastchar & 0x3f][mod];
if (m_transchar != 0)
{
m_strobe = 0x80;
}
}
}
WRITE_LINE_MEMBER(agat_base_state::ay3600_ako_w)
{
m_anykeydown = (state == ASSERT_LINE) ? true : false;
}
TIMER_DEVICE_CALLBACK_MEMBER(agat_base_state::ay3600_repeat)
{
// is the key still down?
if (m_anykeydown)
{
if (m_kbrepeat->read() & 1)
{
m_strobe = 0x80;
}
}
}
INTERRUPT_GEN_MEMBER(agat_base_state::agat_vblank)
{
if (m_agat_interrupts)
@ -1314,149 +1190,7 @@ static INPUT_PORTS_START( agat7_joystick )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_PLAYER(2) PORT_CODE(JOYCODE_BUTTON1)
INPUT_PORTS_END
/*
Apple II / II Plus key matrix (from "The Apple II Circuit Description")
| Y0 | Y1 | Y2 | Y3 | Y4 | Y5 | Y6 | Y7 | Y8 | Y9 |
| | | | | | | | | | |
----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
X0 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | :* | - |
----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
X1 | Q | W | E | R | T | Y | U | I | O | P |
----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
X2 | D | F | G | H | J | K | L | ;+ |LEFT |RIGHT|
----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
X3 | Z | X | C | V | B | N | M | ,< | .> | /? |
----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
X4 | S | 2 | 1 | ESC | A |SPACE| | | |ENTER|
----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
*/
static INPUT_PORTS_START( agat7_common )
PORT_START("X0")
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#')
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$')
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%')
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&')
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'')
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(')
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')')
PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0')
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR(':') PORT_CHAR('*')
PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('-') PORT_CHAR('=')
PORT_START("X1")
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') PORT_CHAR('q')
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('W') PORT_CHAR('w')
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('E') PORT_CHAR('e')
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('R') PORT_CHAR('r')
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('T') PORT_CHAR('t')
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') PORT_CHAR('y')
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('U') PORT_CHAR('u')
PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('I') PORT_CHAR('i')
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('O') PORT_CHAR('o')
PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('P') PORT_CHAR('p')
PORT_START("X2")
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('D') PORT_CHAR('d')
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('F') PORT_CHAR('f')
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('G') PORT_CHAR('g')
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('H') PORT_CHAR('h')
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('J') PORT_CHAR('j')
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('K') PORT_CHAR('k')
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('L') PORT_CHAR('l')
PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+')
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_RIGHT) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
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_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('S') PORT_CHAR('s')
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('\"')
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!')
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Esc") PORT_CODE(KEYCODE_ESC) PORT_CHAR(27)
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('A') PORT_CHAR('a')
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_DOWN) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Num 1") PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD))
PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
PORT_START("X5")
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Num 2") PORT_CODE(KEYCODE_8_PAD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD))
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Num 3") PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD))
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Num 4") PORT_CODE(KEYCODE_4_PAD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD))
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Num 5") PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD))
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Num 6") PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD))
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Num 7") PORT_CODE(KEYCODE_1_PAD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD))
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Num 8") PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD))
PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Num 9") PORT_CODE(KEYCODE_3_PAD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD))
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Num 0") PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD))
PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Num .") PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD))
PORT_START("X6")
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Num =") PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD))
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("PF1") PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHAR(UCHAR_MAMEKEY(SLASH_PAD))
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("PF2") PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR(UCHAR_MAMEKEY(ASTERISK))
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("PF3") PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD))
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("X7")
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("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_UNUSED)
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)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RESET") PORT_CODE(KEYCODE_F12) PORT_CHAR(UCHAR_MAMEKEY(F12))
INPUT_PORTS_END
static INPUT_PORTS_START(agat7)
PORT_INCLUDE(agat7_common)
PORT_START("keyb_repeat")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("REPT") PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\')
/* other devices */
PORT_INCLUDE(agat7_joystick)
INPUT_PORTS_END
@ -1478,7 +1212,8 @@ static void agat9_cards(device_slot_interface &device)
device.option_add("a9fdc140", A2BUS_AGAT9_FDC); // Disk II clone -- decimal 3.089.173 (reworked for agat9)
device.option_add("a9fdchle", A2BUS_AGAT840K_HLE); // 840K floppy controller -- decimal 7.104.351 or 3.089.023?
device.option_add("a9fdc", A2BUS_AGAT_FDC); // 840K floppy controller LLE
device.option_add("a9nclock", A2BUS_NIPPELCLOCK); // Nippel Clock (mc146818)
device.option_add("a7ports", A2BUS_AGAT7_PORTS); // Serial-parallel card -- decimal 3.089.106
device.option_add("nclock", A2BUS_NIPPELCLOCK); // Nippel Clock (mc146818)
}
void agat7_state::agat7(machine_config &config)
@ -1500,24 +1235,10 @@ void agat7_state::agat7(machine_config &config)
/* /INH banking */
ADDRESS_MAP_BANK(config, m_upperbank).set_map(&agat7_state::inhbank_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x3000);
/* keyboard controller -- XXX must be replaced */
AY3600(config, m_ay3600, 0);
m_ay3600->x0().set_ioport("X0");
m_ay3600->x1().set_ioport("X1");
m_ay3600->x2().set_ioport("X2");
m_ay3600->x3().set_ioport("X3");
m_ay3600->x4().set_ioport("X4");
m_ay3600->x5().set_ioport("X5");
m_ay3600->x6().set_ioport("X6");
m_ay3600->x7().set_ioport("X7");
m_ay3600->x8().set_ioport("X8");
m_ay3600->shift().set(FUNC(agat_base_state::ay3600_shift_r));
m_ay3600->control().set(FUNC(agat_base_state::ay3600_control_r));
m_ay3600->data_ready().set(FUNC(agat_base_state::ay3600_data_ready_w));
m_ay3600->ako().set(FUNC(agat_base_state::ay3600_ako_w));
/* repeat timer. 10 Hz per Mymrin's book */
TIMER(config, "repttmr").configure_periodic(FUNC(agat_base_state::ay3600_repeat), attotime::from_hz(10));
agat_keyboard_device &keyboard(AGAT_KEYBOARD(config, "keyboard", 0));
keyboard.out_callback().set(FUNC(agat_base_state::kbd_put));
keyboard.out_meta_callback().set(FUNC(agat_base_state::kbd_meta));
keyboard.out_reset_callback().set([this](bool state) { m_maincpu->reset(); });
/*
* slot 0 is reserved for SECAM encoder or Apple II compat card.
@ -1560,24 +1281,10 @@ void agat9_state::agat9(machine_config &config)
/* /INH banking */
ADDRESS_MAP_BANK(config, m_upperbank).set_map(&agat9_state::inhbank_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x10000);
/* keyboard controller -- XXX must be replaced */
AY3600(config, m_ay3600, 0);
m_ay3600->x0().set_ioport("X0");
m_ay3600->x1().set_ioport("X1");
m_ay3600->x2().set_ioport("X2");
m_ay3600->x3().set_ioport("X3");
m_ay3600->x4().set_ioport("X4");
m_ay3600->x5().set_ioport("X5");
m_ay3600->x6().set_ioport("X6");
m_ay3600->x7().set_ioport("X7");
m_ay3600->x8().set_ioport("X8");
m_ay3600->shift().set(FUNC(agat_base_state::ay3600_shift_r));
m_ay3600->control().set(FUNC(agat_base_state::ay3600_control_r));
m_ay3600->data_ready().set(FUNC(agat_base_state::ay3600_data_ready_w));
m_ay3600->ako().set(FUNC(agat_base_state::ay3600_ako_w));
/* repeat timer. 10 Hz per Mymrin's book */
TIMER(config, "repttmr").configure_periodic(FUNC(agat_base_state::ay3600_repeat), attotime::from_hz(10));
agat_keyboard_device &keyboard(AGAT_KEYBOARD(config, "keyboard", 0));
keyboard.out_callback().set(FUNC(agat_base_state::kbd_put));
keyboard.out_meta_callback().set(FUNC(agat_base_state::kbd_meta));
keyboard.out_reset_callback().set([this](bool state) { m_maincpu->reset(); });
A2BUS(config, m_a2bus, 0);
m_a2bus->set_space(m_maincpu, AS_PROGRAM);
@ -1647,5 +1354,5 @@ ROM_START( agat9 )
ROM_END
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
COMP( 1983, agat7, apple2, 0, agat7, agat7, agat7_state, empty_init, "Agat", "Agat-7", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_CONTROLS)
COMP( 1983, agat7, apple2, 0, agat7, agat7, agat7_state, empty_init, "Agat", "Agat-7", MACHINE_IMPERFECT_GRAPHICS)
COMP( 1988, agat9, apple2, 0, agat9, agat7, agat9_state, empty_init, "Agat", "Agat-9", MACHINE_NOT_WORKING)

View File

@ -0,0 +1,285 @@
// license:BSD-3-Clause
// copyright-holders:Sergey Svishchev
/***************************************************************************
Agat keyboard HLE
***************************************************************************/
#include "emu.h"
#include "machine/agatkeyb.h"
#include "machine/keyboard.ipp"
/***************************************************************************
REUSABLE I/O PORTS
***************************************************************************/
INPUT_PORTS_START( agat_keyboard )
PORT_START("AGATKBD_MOD")
PORT_BIT(0x0001U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL))
PORT_BIT(0x0002U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
PORT_BIT(0x0004U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Meta") PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT)) PORT_CHANGED_MEMBER(DEVICE_SELF, agat_keyboard_device, meta_changed, 0)
PORT_BIT(0x0008U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Reset") PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10)) PORT_CHANGED_MEMBER(DEVICE_SELF, agat_keyboard_device, reset_changed, 0)
PORT_START("AGATKBD_ROW0")
PORT_BIT(0x0001U, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT(0x0002U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Num 0") PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD))
PORT_BIT(0x0004U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Num .") PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD))
PORT_BIT(0x0008U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Num =") PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD))
PORT_BIT(0x0010U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F1") PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHAR(UCHAR_MAMEKEY(SLASH_PAD))
PORT_BIT(0x0020U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F2") PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR(UCHAR_MAMEKEY(ASTERISK))
PORT_BIT(0x0040U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F3") PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD))
PORT_BIT(0x0080U, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT(0x0100U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
PORT_BIT(0x0200U, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT(0x0400U, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT(0x0800U, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT(0x1000U, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT(0x2000U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
PORT_BIT(0x4000U, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT(0x8000U, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("AGATKBD_ROW1")
PORT_BIT(0x0001U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Num 1") PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD))
PORT_BIT(0x0002U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Num 2") PORT_CODE(KEYCODE_8_PAD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD))
PORT_BIT(0x0004U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Num 3") PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD))
PORT_BIT(0x0008U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Num 4") PORT_CODE(KEYCODE_4_PAD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD))
PORT_BIT(0x0010U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Num 5") PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD))
PORT_BIT(0x0020U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(UTF8_RIGHT) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
PORT_BIT(0x0040U, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT(0x0080U, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT(0x0100U, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT(0x0200U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
PORT_BIT(0x0400U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(UTF8_DOWN) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
PORT_BIT(0x0800U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ESC) PORT_NAME("Escape") PORT_CHAR(UCHAR_MAMEKEY(ESC))
PORT_BIT(0x1000U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Num 6") PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD))
PORT_BIT(0x2000U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Num 7") PORT_CODE(KEYCODE_1_PAD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD))
PORT_BIT(0x4000U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Num 8") PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD))
PORT_BIT(0x8000U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Num 9") PORT_CODE(KEYCODE_3_PAD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD))
PORT_START("AGATKBD_ROW2")
PORT_BIT(0x0001U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
PORT_BIT(0x0002U, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT(0x0004U, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT(0x0008U, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT(0x0010U, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT(0x0020U, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT(0x0040U, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT(0x0080U, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT(0x0100U, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT(0x0200U, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT(0x0400U, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT(0x0800U, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT(0x1000U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<')
PORT_BIT(0x2000U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('=')
PORT_BIT(0x4000U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>')
PORT_BIT(0x8000U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?')
PORT_START("AGATKBD_ROW3")
PORT_BIT(0x0001U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0')
PORT_BIT(0x0002U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!')
PORT_BIT(0x0004U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"')
PORT_BIT(0x0008U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#')
PORT_BIT(0x0010U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$')
PORT_BIT(0x0020U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%')
PORT_BIT(0x0040U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&')
PORT_BIT(0x0080U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'')
PORT_BIT(0x0100U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(')
PORT_BIT(0x0200U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')')
PORT_BIT(0x0400U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(':') PORT_CHAR('*')
PORT_BIT(0x0800U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+')
PORT_BIT(0x1000U, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT(0x2000U, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT(0x4000U, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT(0x8000U, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("AGATKBD_ROW4")
PORT_BIT(0x0001U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TAB) PORT_CHAR('@')
PORT_BIT(0x0002U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') PORT_CHAR('a')
PORT_BIT(0x0004U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') PORT_CHAR('b')
PORT_BIT(0x0008U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') PORT_CHAR('c')
PORT_BIT(0x0010U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') PORT_CHAR('d')
PORT_BIT(0x0020U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') PORT_CHAR('e')
PORT_BIT(0x0040U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') PORT_CHAR('f')
PORT_BIT(0x0080U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') PORT_CHAR('g')
PORT_BIT(0x0100U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') PORT_CHAR('h')
PORT_BIT(0x0200U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') PORT_CHAR('i')
PORT_BIT(0x0400U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') PORT_CHAR('j')
PORT_BIT(0x0800U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') PORT_CHAR('k')
PORT_BIT(0x1000U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') PORT_CHAR('l')
PORT_BIT(0x2000U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') PORT_CHAR('m')
PORT_BIT(0x4000U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') PORT_CHAR('n')
PORT_BIT(0x8000U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') PORT_CHAR('o')
PORT_START("AGATKBD_ROW5")
PORT_BIT(0x0001U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') PORT_CHAR('p')
PORT_BIT(0x0002U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') PORT_CHAR('q')
PORT_BIT(0x0004U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') PORT_CHAR('r')
PORT_BIT(0x0008U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') PORT_CHAR('s')
PORT_BIT(0x0010U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') PORT_CHAR('t')
PORT_BIT(0x0020U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') PORT_CHAR('u')
PORT_BIT(0x0040U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') PORT_CHAR('v')
PORT_BIT(0x0080U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') PORT_CHAR('w')
PORT_BIT(0x0100U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') PORT_CHAR('x')
PORT_BIT(0x0200U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') PORT_CHAR('y')
PORT_BIT(0x0400U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') PORT_CHAR('z')
PORT_BIT(0x0800U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{')
PORT_BIT(0x1000U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|')
PORT_BIT(0x2000U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}')
PORT_BIT(0x4000U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_CHAR('^')
PORT_BIT(0x8000U, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('_')
INPUT_PORTS_END
/***************************************************************************
DEVICE TYPE GLOBALS
***************************************************************************/
DEFINE_DEVICE_TYPE(AGAT_KEYBOARD, agat_keyboard_device, "agat_keyboard", "Agat Keyboard")
/***************************************************************************
IMPLEMENTATION
***************************************************************************/
agat_keyboard_device::agat_keyboard_device(
machine_config const &mconfig,
device_type type,
char const *tag,
device_t *owner,
u32 clock)
: device_t(mconfig, type, tag, owner, clock)
, device_matrix_keyboard_interface(mconfig, *this,
"AGATKBD_ROW0", "AGATKBD_ROW1", "AGATKBD_ROW2", "AGATKBD_ROW3", "AGATKBD_ROW4", "AGATKBD_ROW5")
, m_modifiers(*this, "AGATKBD_MOD")
, m_last_modifiers(0U)
, m_keyboard_cb(*this)
, m_out_meta_cb(*this)
, m_out_reset_cb(*this)
{
}
agat_keyboard_device::agat_keyboard_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock)
: agat_keyboard_device(mconfig, AGAT_KEYBOARD, tag, owner, clock)
{
}
ioport_constructor agat_keyboard_device::device_input_ports() const
{
return INPUT_PORTS_NAME(agat_keyboard);
}
void agat_keyboard_device::device_start()
{
m_keyboard_cb.resolve();
m_out_meta_cb.resolve();
m_out_reset_cb.resolve();
save_item(NAME(m_last_modifiers));
save_item(NAME(m_meta));
}
void agat_keyboard_device::device_reset()
{
reset_key_state();
m_last_modifiers = 0;
m_meta = false;
start_processing(attotime::from_hz(1'000)); // XXX
typematic_stop();
}
void agat_keyboard_device::key_make(u8 row, u8 column)
{
send_translated((row << 4) | column);
typematic_start(row, column, typematic_delay(), typematic_period());
}
void agat_keyboard_device::key_repeat(u8 row, u8 column)
{
send_translated((row << 4) | column);
}
INPUT_CHANGED_MEMBER(agat_keyboard_device::meta_changed)
{
if (oldval)
{
m_meta ^= 1;
m_out_meta_cb(m_meta);
}
}
INPUT_CHANGED_MEMBER(agat_keyboard_device::reset_changed)
{
if ((m_modifiers->read() & 9) == 9)
{
m_out_reset_cb(true);
}
}
bool agat_keyboard_device::translate(u8 code, u16 &translated) const
{
u16 const modifiers(m_modifiers->read());
bool const ctrl(modifiers & 0x01U);
bool const shift(modifiers & 0x02U);
if (shift)
{
if (code == 0x20)
{
translated = code;
}
else
{
translated = code < 0x40 ? (code ^ 0x10) : (code ^ 0x20);
}
}
else
{
translated = (code < 0x20) ? code : (ctrl ? (code & 0x1f) : code);
}
// logerror("code %02x c %d s %d m %d -> %02x\n", code, ctrl, shift, m_meta, translated);
return true;
}
void agat_keyboard_device::will_scan_row(u8 row)
{
u16 const modifiers(m_modifiers->read());
if (modifiers != m_last_modifiers)
typematic_restart(typematic_delay(), typematic_period());
m_last_modifiers = modifiers;
}
void agat_keyboard_device::send_translated(u8 code)
{
u16 translated;
if (translate(code, translated))
m_keyboard_cb(translated);
}
attotime agat_keyboard_device::typematic_delay() const
{
return attotime::from_msec(250); // XXX
}
attotime agat_keyboard_device::typematic_period() const
{
return attotime::from_hz(10);
}

View File

@ -0,0 +1,70 @@
// license:BSD-3-Clause
// copyright-holders:Sergey Svishchev
#ifndef MAME_MACHINE_AGATKEYB_H
#define MAME_MACHINE_AGATKEYB_H
#pragma once
#include "machine/keyboard.h"
/***************************************************************************
DEVICE TYPE GLOBALS
***************************************************************************/
DECLARE_DEVICE_TYPE(AGAT_KEYBOARD, agat_keyboard_device)
/***************************************************************************
TYPE DECLARATIONS
***************************************************************************/
class agat_keyboard_device : public device_t, protected device_matrix_keyboard_interface<6U>
{
public:
agat_keyboard_device(
const machine_config &mconfig,
const char *tag,
device_t *owner,
u32 clock);
virtual ioport_constructor device_input_ports() const override;
auto out_callback() { return m_keyboard_cb.bind(); }
auto out_meta_callback() { return m_out_meta_cb.bind(); }
auto out_reset_callback() { return m_out_reset_cb.bind(); }
DECLARE_INPUT_CHANGED_MEMBER(meta_changed);
DECLARE_INPUT_CHANGED_MEMBER(reset_changed);
protected:
agat_keyboard_device(
const machine_config &mconfig,
device_type type,
char const *tag,
device_t *owner,
u32 clock);
virtual void device_start() override;
virtual void device_reset() override;
virtual void key_make(u8 row, u8 column) override;
virtual void key_repeat(u8 row, u8 column) override;
required_ioport m_modifiers;
private:
virtual void will_scan_row(u8 row) override;
bool translate(u8 code, u16 &translated) const;
void send_translated(u8 code);
attotime typematic_delay() const;
attotime typematic_period() const;
bool m_meta;
u16 m_last_modifiers;
devcb_write8 m_keyboard_cb;
devcb_write_line m_out_meta_cb;
devcb_write_line m_out_reset_cb;
};
#endif // MAME_MACHINE_AGATKEYB_H

View File

@ -112,32 +112,32 @@ void agat7video_device::do_io(int offset)
{
case 0:
m_video_mode = GRAPHICS_LORES;
m_start_address = (offset & 0x30) << 9;
logerror("offset %04X, video mode 0 (GRAPHICS_LORES)\n", m_start_address);
m_start_address = (offset & 0x3c) << 9;
logerror("offset %02X -> %04X, video mode 0 (GRAPHICS_LORES)\n", offset, m_start_address);
break;
case 1:
m_video_mode = GRAPHICS_HIRES;
m_start_address = ((offset & 0x3f) - 0x01) << 9;
logerror("offset %04X, video mode 1 (GRAPHICS_HIRES)\n", m_start_address);
m_start_address = ((offset & 0x31) - 0x01) << 9;
logerror("offset %02X -> %04X, video mode 1 (GRAPHICS_HIRES)\n", offset, m_start_address);
break;
case 2:
if (offset > 0x80) {
m_video_mode = TEXT_HIRES;
m_start_address = (offset - 0x82) << 9;
logerror("offset %04X, video mode 2 (TEXT_HIRES)\n", m_start_address);
logerror("offset %02X -> %04X, video mode 2 (TEXT_HIRES)\n", offset, m_start_address);
} else {
m_video_mode = TEXT_LORES;
m_start_address = (offset - 0x02) << 9;
logerror("offset %04X, video mode 2 (TEXT_LORES)\n", m_start_address);
logerror("offset %02X -> %04X, video mode 2 (TEXT_LORES)\n", offset, m_start_address);
}
break;
case 3:
m_video_mode = GRAPHICS_MONO;
m_start_address = ((offset - 0x03) & 0x30) << 9;
logerror("offset %04X, video mode 3 (GRAPHICS_MONO)\n", m_start_address);
logerror("offset %02X -> %04X, video mode 3 (GRAPHICS_MONO)\n", offset, m_start_address);
break;
}
}