apple2e.cpp: added F1-F12 keys to the Franklin ACE 500 and 2200. [R. Belmont, Joshua Bell]

This commit is contained in:
arbee 2022-11-05 21:39:09 -04:00
parent 0fab97a476
commit f4293f9da4

View File

@ -215,6 +215,7 @@ public:
m_kbdrom(*this, "keyboard"),
m_kbspecial(*this, "keyb_special"),
m_sysconfig(*this, "a2_config"),
m_franklin_fkeys(*this, "franklin_fkeys"),
m_speaker(*this, A2_SPEAKER_TAG),
m_cassette(*this, A2_CASSETTE_TAG),
m_upperbank(*this, A2_UPPERBANK_TAG),
@ -270,6 +271,7 @@ public:
optional_memory_region m_kbdrom;
required_ioport m_kbspecial;
required_ioport m_sysconfig;
optional_ioport m_franklin_fkeys;
required_device<speaker_sound_device> m_speaker;
optional_device<cassette_image_device> m_cassette;
memory_view m_upperbank, m_0000bank, m_0200bank, m_0400bank;
@ -421,7 +423,8 @@ private:
double m_joystick_x1_time, m_joystick_y1_time, m_joystick_x2_time, m_joystick_y2_time;
u16 m_lastchar, m_strobe;
u32 m_franklin_last_fkeys;
u16 m_lastchar, m_strobe, m_franklin_strobe;
u8 m_transchar;
bool m_anykeydown;
int m_repeatdelay;
@ -553,13 +556,13 @@ u8 apple2e_state::mig_r(u16 offset)
// MIG RAM window
if ((offset >= 0x200) && (offset < 0x220))
{
return m_migram[m_migpage + offset];
return m_migram[m_migpage + (offset & 0x1f)];
}
// increment MIG RAM window and return previous value
if ((offset >= 0x220) && (offset < 0x240))
{
u8 rv = m_migram[m_migpage + offset];
u8 rv = m_migram[m_migpage + (offset & 0x1f)];
m_migpage += 0x20;
m_migpage &= 0x7ff;
return rv;
@ -621,14 +624,14 @@ void apple2e_state::mig_w(u16 offset, u8 data)
// MIG RAM window
if ((offset >= 0x200) && (offset < 0x220))
{
m_migram[m_migpage + offset] = data;
m_migram[m_migpage + (offset & 0x1f)] = data;
return;
}
// increment MIG RAM window, but write value at old location first
if ((offset >= 0x220) && (offset < 0x240))
{
m_migram[m_migpage + offset] = data;
m_migram[m_migpage + (offset & 0x1f)] = data;
m_migpage += 0x20;
m_migpage &= 0x7ff; // make sure we wrap
return;
@ -1051,6 +1054,8 @@ void apple2e_state::machine_start()
save_item(NAME(m_joystick_y2_time));
save_item(NAME(m_lastchar));
save_item(NAME(m_strobe));
save_item(NAME(m_franklin_last_fkeys));
save_item(NAME(m_franklin_strobe));
save_item(NAME(m_transchar));
save_item(NAME(m_inh_slot));
save_item(NAME(m_inh_bank));
@ -1137,6 +1142,8 @@ void apple2e_state::machine_reset()
m_romswitch = false;
m_irqmask = 0;
m_strobe = 0;
m_franklin_last_fkeys = 0;
m_franklin_strobe = 0x80;
m_transchar = 0;
m_anykeydown = false;
m_repeatdelay = 10;
@ -1328,6 +1335,20 @@ TIMER_DEVICE_CALLBACK_MEMBER(apple2e_state::apple2_interrupt)
}
update_slotrom_banks();
}
// check Franklin F-keys
if ((m_isace500) || (m_isace2200))
{
const u32 uFkeys = m_franklin_fkeys->read();
if (uFkeys ^ m_franklin_last_fkeys)
{
m_transchar = count_leading_zeros_32(uFkeys) + 0x20;
m_strobe = 0x80;
m_franklin_strobe = 0;
m_franklin_last_fkeys = uFkeys;
}
}
}
}
@ -2016,6 +2037,16 @@ u8 apple2e_state::c000_r(offs_t offset)
}
break;
case 0x27: // Ace 2x00 F key strobe
if (m_isace2200)
{
m_strobe = 0;
const u8 rv = m_franklin_strobe;
m_franklin_strobe = 0x80;
return rv;
}
break;
case 0x60: // cassette in
case 0x68:
if (m_cassette)
@ -3145,7 +3176,13 @@ u8 apple2e_state::ace500_c0bx_r(offs_t offset)
// Alt key status (0=pressed). Reads as pressed for function keys.
case 0x4:
return 0xff;
{
m_strobe = 0;
const u8 rv = m_franklin_strobe;
m_franklin_strobe = 0x80;
return rv;
}
break;
// Used by the IRQ handler. Appears to return altzp status in bit 7, same as $C016.
case 0xc:
@ -4462,6 +4499,20 @@ static INPUT_PORTS_START( ace500 )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Solid F") PORT_CODE(KEYCODE_RALT)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RESET") PORT_CODE(KEYCODE_F12)
PORT_START("franklin_fkeys")
PORT_BIT(0x80000000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1))
PORT_BIT(0x40000000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2))
PORT_BIT(0x20000000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3))
PORT_BIT(0x10000000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4))
PORT_BIT(0x08000000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5))
PORT_BIT(0x04000000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6))
PORT_BIT(0x02000000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7))
PORT_BIT(0x01000000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8))
PORT_BIT(0x00800000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9))
PORT_BIT(0x00400000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10))
PORT_BIT(0x00200000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F11) PORT_CHAR(UCHAR_MAMEKEY(F11))
PORT_BIT(0x00100000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F12) PORT_CHAR(UCHAR_MAMEKEY(F12))
PORT_START(MOUSE_BUTTON_TAG) /* Mouse - button */
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_NAME("Mouse Button") PORT_CODE(MOUSECODE_BUTTON1)