bml3: adjusted keyboard, fixes Insect Hunter.

This commit is contained in:
Robbbert 2021-05-21 01:37:26 +10:00
parent 269b62055e
commit 3c655c7113
2 changed files with 28 additions and 24 deletions

View File

@ -76,7 +76,7 @@ Compaibility flags:
</part> </part>
</software> </software>
<software name="insecth" supported="partial"><!-- keyboard sometimes not working --> <software name="insecth">
<description>Insect Hunter</description> <description>Insect Hunter</description>
<year>1986</year> <year>1986</year>
<publisher>&lt;unknown&gt;</publisher> <publisher>&lt;unknown&gt;</publisher>

View File

@ -10,7 +10,6 @@
- implement sound as a bml3bus slot device - implement sound as a bml3bus slot device
- account for hardware differences between MB-6890, MB-6891 and MB-6892 - account for hardware differences between MB-6890, MB-6891 and MB-6892
(e.g. custom font support on the MB-6892) (e.g. custom font support on the MB-6892)
- MP1805 fdc crashes if a disk is inserted.
**************************************************************************************/ **************************************************************************************/
@ -65,7 +64,7 @@
// D80_CLOCK / 105.0 // 153600 Hz // D80_CLOCK / 105.0 // 153600 Hz
// Frequencies for cassette mode: // Frequencies for cassette mode:
// / 13440 //1200 // / 13440 // 1200
// / 6720 // 2400 // / 6720 // 2400
// / 3360 // 4800 // / 3360 // 4800
// / 1680 // 9600 // / 1680 // 9600
@ -90,6 +89,7 @@ public:
, m_banke(*this, "banke") , m_banke(*this, "banke")
, m_bankf(*this, "bankf") , m_bankf(*this, "bankf")
, m_bankg(*this, "bankg") , m_bankg(*this, "bankg")
, m_io_keyboard(*this, "X%u", 0U)
{ } { }
void bml3mk2(machine_config &config); void bml3mk2(machine_config &config);
@ -126,7 +126,6 @@ private:
MC6845_UPDATE_ROW(crtc_update_row); MC6845_UPDATE_ROW(crtc_update_row);
// INTERRUPT_GEN_MEMBER(irq);
INTERRUPT_GEN_MEMBER(timer_firq); INTERRUPT_GEN_MEMBER(timer_firq);
TIMER_DEVICE_CALLBACK_MEMBER(kansas_r); TIMER_DEVICE_CALLBACK_MEMBER(kansas_r);
TIMER_DEVICE_CALLBACK_MEMBER(kansas_w); TIMER_DEVICE_CALLBACK_MEMBER(kansas_w);
@ -139,11 +138,12 @@ private:
u8 m_psg_latch; u8 m_psg_latch;
u8 m_attr_latch; u8 m_attr_latch;
u8 m_vres_reg; u8 m_vres_reg;
bool m_keyb_interrupt_disabled; bool m_keyb_interrupt_enabled;
bool m_keyb_nmi_disabled; // not used yet bool m_keyb_nmi_disabled; // not used yet
bool m_keyb_counter_operation_disabled; bool m_keyb_counter_operation_disabled;
u8 m_keyb_empty_scan; u8 m_keyb_empty_scan;
u8 m_keyb_scancode; u8 m_keyb_scancode;
u16 m_kbt = 0;
bool m_keyb_capslock_led_on; bool m_keyb_capslock_led_on;
bool m_keyb_hiragana_led_on; bool m_keyb_hiragana_led_on;
bool m_keyb_katakana_led_on; bool m_keyb_katakana_led_on;
@ -174,6 +174,7 @@ private:
required_memory_bank m_banke; required_memory_bank m_banke;
required_memory_bank m_bankf; required_memory_bank m_bankf;
required_memory_bank m_bankg; required_memory_bank m_bankg;
required_ioport_array<4> m_io_keyboard;
}; };
u8 bml3_state::mc6845_r(offs_t offset) u8 bml3_state::mc6845_r(offs_t offset)
@ -200,6 +201,7 @@ void bml3_state::mc6845_w(offs_t offset, u8 data)
u8 bml3_state::keyboard_r() u8 bml3_state::keyboard_r()
{ {
m_maincpu->set_input_line(M6809_IRQ_LINE, CLEAR_LINE);
u8 ret = m_keyb_scancode; u8 ret = m_keyb_scancode;
if (!machine().side_effects_disabled()) if (!machine().side_effects_disabled())
m_keyb_scancode &= 0x7f; m_keyb_scancode &= 0x7f;
@ -212,7 +214,7 @@ void bml3_state::keyboard_w(u8 data)
m_keyb_hiragana_led_on = BIT(data, 1); m_keyb_hiragana_led_on = BIT(data, 1);
m_keyb_capslock_led_on = BIT(data, 2); m_keyb_capslock_led_on = BIT(data, 2);
m_keyb_counter_operation_disabled = BIT(data, 3); m_keyb_counter_operation_disabled = BIT(data, 3);
m_keyb_interrupt_disabled = !BIT(data, 6); m_keyb_interrupt_enabled = BIT(data, 6);
m_keyb_nmi_disabled = !BIT(data, 7); m_keyb_nmi_disabled = !BIT(data, 7);
} }
@ -471,7 +473,7 @@ static INPUT_PORTS_START( bml3 )
PORT_DIPSETTING( 0x0002, "60 kiB (32 kiB + 28 kiB)" ) PORT_DIPSETTING( 0x0002, "60 kiB (32 kiB + 28 kiB)" )
*/ */
PORT_START("key1") //0x00-0x1f PORT_START("X0") //0x00-0x1f
PORT_BIT(0x00000001,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') PORT_BIT(0x00000001,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
PORT_BIT(0x00000002,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Up") PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_BIT(0x00000002,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Up") PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
PORT_BIT(0x00000004,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("? PAD") PORT_BIT(0x00000004,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("? PAD")
@ -505,7 +507,7 @@ static INPUT_PORTS_START( bml3 )
PORT_BIT(0x40000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Delete PAD") //backspace PORT_BIT(0x40000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Delete PAD") //backspace
PORT_BIT(0x80000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\xC2\xA5") PORT_CODE(KEYCODE_TAB) // yen sign PORT_BIT(0x80000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\xC2\xA5") PORT_CODE(KEYCODE_TAB) // yen sign
PORT_START("key2") //0x20-0x3f PORT_START("X1") //0x20-0x3f
PORT_BIT(0x00000001,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("U") PORT_CODE(KEYCODE_U) PORT_CHAR('U') PORT_CHAR('u') PORT_BIT(0x00000001,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("U") PORT_CODE(KEYCODE_U) PORT_CHAR('U') PORT_CHAR('u')
PORT_BIT(0x00000002,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("R") PORT_CODE(KEYCODE_R) PORT_CHAR('R') PORT_CHAR('r') PORT_BIT(0x00000002,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("R") PORT_CODE(KEYCODE_R) PORT_CHAR('R') PORT_CHAR('r')
PORT_BIT(0x00000004,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') PORT_CHAR('y') PORT_BIT(0x00000004,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') PORT_CHAR('y')
@ -539,7 +541,7 @@ static INPUT_PORTS_START( bml3 )
PORT_BIT(0x40000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("6 PAD") PORT_CODE(KEYCODE_6_PAD) PORT_BIT(0x40000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("6 PAD") PORT_CODE(KEYCODE_6_PAD)
PORT_BIT(0x80000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("- PAD") PORT_CODE(KEYCODE_MINUS_PAD) PORT_BIT(0x80000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("- PAD") PORT_CODE(KEYCODE_MINUS_PAD)
PORT_START("key3") //0x40-0x5f PORT_START("X2") //0x40-0x5f
PORT_BIT(0x00000001,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M) PORT_CHAR('M') PORT_CHAR('m') PORT_BIT(0x00000001,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M) PORT_CHAR('M') PORT_CHAR('m')
PORT_BIT(0x00000002,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("V") PORT_CODE(KEYCODE_V) PORT_CHAR('V') PORT_CHAR('v') PORT_BIT(0x00000002,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("V") PORT_CODE(KEYCODE_V) PORT_CHAR('V') PORT_CHAR('v')
PORT_BIT(0x00000004,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("N") PORT_CODE(KEYCODE_N) PORT_CHAR('N') PORT_CHAR('n') PORT_BIT(0x00000004,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("N") PORT_CODE(KEYCODE_N) PORT_CHAR('N') PORT_CHAR('n')
@ -563,7 +565,7 @@ static INPUT_PORTS_START( bml3 )
PORT_BIT(0x00100000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("PF5") PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) PORT_CHAR(UCHAR_MAMEKEY(F10)) PORT_BIT(0x00100000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("PF5") PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) PORT_CHAR(UCHAR_MAMEKEY(F10))
PORT_BIT(0xffe00000,IP_ACTIVE_HIGH,IPT_UNKNOWN) PORT_BIT(0xffe00000,IP_ACTIVE_HIGH,IPT_UNKNOWN)
PORT_START("key4") PORT_START("X3")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Break") PORT_CODE(KEYCODE_END) PORT_CHAR(UCHAR_MAMEKEY(END)) PORT_CHANGED_MEMBER(DEVICE_SELF, bml3_state, nmi_button, 0) PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Break") PORT_CODE(KEYCODE_END) PORT_CHAR(UCHAR_MAMEKEY(END)) PORT_CHANGED_MEMBER(DEVICE_SELF, bml3_state, nmi_button, 0)
INPUT_PORTS_END INPUT_PORTS_END
@ -660,8 +662,6 @@ MC6845_UPDATE_ROW( bml3_state::crtc_update_row )
TIMER_DEVICE_CALLBACK_MEMBER(bml3_state::keyboard_callback) TIMER_DEVICE_CALLBACK_MEMBER(bml3_state::keyboard_callback)
{ {
static const char *const portnames[3] = { "key1","key2","key3" };
int i,port_i;
bool trigger = false; bool trigger = false;
if(!BIT(m_keyb_scancode, 7)) if(!BIT(m_keyb_scancode, 7))
@ -684,9 +684,9 @@ TIMER_DEVICE_CALLBACK_MEMBER(bml3_state::keyboard_callback)
} }
else if (m_keyb_scancode < 32*3) else if (m_keyb_scancode < 32*3)
{ {
port_i = m_keyb_scancode / 32; u8 port_i = m_keyb_scancode / 32;
i = m_keyb_scancode % 32; u8 i = m_keyb_scancode % 32;
if((ioport(portnames[port_i])->read()>>i) & 1) if(BIT(m_io_keyboard[port_i]->read(),i))
{ {
m_keyb_empty_scan = 2; m_keyb_empty_scan = 2;
trigger = true; trigger = true;
@ -694,16 +694,18 @@ TIMER_DEVICE_CALLBACK_MEMBER(bml3_state::keyboard_callback)
} }
if (trigger) if (trigger)
{ {
m_kbt = 0xfff;
m_keyb_scancode |= 0x80; m_keyb_scancode |= 0x80;
if (!m_keyb_interrupt_disabled) if (m_keyb_interrupt_enabled)
m_maincpu->set_input_line(M6809_IRQ_LINE, HOLD_LINE); m_maincpu->set_input_line(M6809_IRQ_LINE, HOLD_LINE);
} }
/* Don't need this apparently... }
else else
{ {
m_maincpu->set_input_line(M6809_IRQ_LINE, CLEAR_LINE); if (m_kbt > 0)
} m_kbt--;
*/ if (m_kbt == 1)
m_keyb_scancode &= 0x7f;
} }
} }
@ -753,7 +755,7 @@ void bml3_state::machine_start()
save_item(NAME(m_psg_latch)); save_item(NAME(m_psg_latch));
save_item(NAME(m_attr_latch)); save_item(NAME(m_attr_latch));
save_item(NAME(m_vres_reg)); save_item(NAME(m_vres_reg));
save_item(NAME(m_keyb_interrupt_disabled)); save_item(NAME(m_keyb_interrupt_enabled));
save_item(NAME(m_keyb_nmi_disabled)); save_item(NAME(m_keyb_nmi_disabled));
save_item(NAME(m_keyb_counter_operation_disabled)); save_item(NAME(m_keyb_counter_operation_disabled));
save_item(NAME(m_keyb_empty_scan)); save_item(NAME(m_keyb_empty_scan));
@ -761,6 +763,7 @@ void bml3_state::machine_start()
save_item(NAME(m_keyb_capslock_led_on)); save_item(NAME(m_keyb_capslock_led_on));
save_item(NAME(m_keyb_hiragana_led_on)); save_item(NAME(m_keyb_hiragana_led_on));
save_item(NAME(m_keyb_katakana_led_on)); save_item(NAME(m_keyb_katakana_led_on));
save_item(NAME(m_kbt));
save_item(NAME(m_cassbit)); save_item(NAME(m_cassbit));
save_item(NAME(m_cassold)); save_item(NAME(m_cassold));
save_item(NAME(m_cass_data)); save_item(NAME(m_cass_data));
@ -796,7 +799,7 @@ void bml3_state::machine_reset()
m_psg_latch = 0; m_psg_latch = 0;
m_attr_latch = 0; m_attr_latch = 0;
m_vres_reg = 0; m_vres_reg = 0;
m_keyb_interrupt_disabled = 0; m_keyb_interrupt_enabled = 0;
m_keyb_nmi_disabled = 0; m_keyb_nmi_disabled = 0;
m_keyb_counter_operation_disabled = 0; m_keyb_counter_operation_disabled = 0;
m_keyb_empty_scan = 0; m_keyb_empty_scan = 0;
@ -809,6 +812,7 @@ void bml3_state::machine_reset()
m_cassbit = 0; m_cassbit = 0;
m_cassold = 0; m_cassold = 0;
m_nmi = 0; m_nmi = 0;
m_kbt = 0;
} }
void bml3_state::piaA_w(uint8_t data) void bml3_state::piaA_w(uint8_t data)