Amiga: Add keyboard reset circuit. You can now reset the Amiga with the

usual Ctrl-Amiga-Amiga key combination.
This commit is contained in:
Dirk Best 2014-09-22 09:18:33 +00:00
parent f304226c6c
commit 11e723d07a
5 changed files with 51 additions and 3 deletions

View File

@ -437,6 +437,7 @@ public:
DECLARE_CUSTOM_INPUT_MEMBER( floppy_drive_status );
DECLARE_WRITE_LINE_MEMBER( m68k_reset );
DECLARE_WRITE_LINE_MEMBER( kbreset_w );
DECLARE_READ16_MEMBER( cia_r );
DECLARE_WRITE16_MEMBER( cia_w );

View File

@ -268,6 +268,17 @@ void amiga_state::machine_reset()
m_overlay->set_bank(1);
}
WRITE_LINE_MEMBER( amiga_state::kbreset_w )
{
// this is connected to the gary chip, gary then resets the 68k, agnus, paula and the cias
if (!state)
{
m_sound->reset();
machine_reset();
m_maincpu->reset();
}
}
// simple mirror of region 0xf80000 to 0xfbffff
READ16_MEMBER( amiga_state::rom_mirror_r )
{

View File

@ -1293,6 +1293,7 @@ static MACHINE_CONFIG_START( amiga_base, amiga_state )
MCFG_DEVICE_ADD("kbd", AMIGAKBD, 0)
MCFG_AMIGA_KEYBOARD_KCLK_CALLBACK(DEVWRITELINE("cia_0", mos8520_device, cnt_w))
MCFG_AMIGA_KEYBOARD_KDAT_CALLBACK(DEVWRITELINE("cia_0", mos8520_device, sp_w))
MCFG_AMIGA_KEYBOARD_KRST_CALLBACK(WRITELINE(amiga_state, kbreset_w))
// software
MCFG_SOFTWARE_LIST_ADD("wb_list", "amiga_workbench")

View File

@ -18,6 +18,7 @@
***************************************************************************/
#include "amigakbd.h"
#include "machine/rescap.h"
//**************************************************************************
@ -79,11 +80,11 @@ const rom_entry *amigakbd_device::device_rom_region() const
static INPUT_PORTS_START( a500_us_keyboard )
PORT_START("special")
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LWIN) PORT_CHAR(UCHAR_MAMEKEY(LWIN)) PORT_NAME("Left Amiga")
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LWIN) PORT_CHAR(UCHAR_MAMEKEY(LWIN)) PORT_NAME("Left Amiga") PORT_CHANGED_MEMBER(DEVICE_SELF, amigakbd_device, check_reset, NULL)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT))
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2) PORT_NAME("Ctrl")
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RWIN) PORT_CHAR(UCHAR_MAMEKEY(RWIN)) PORT_NAME("Right Amiga")
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2) PORT_NAME("Ctrl") PORT_CHANGED_MEMBER(DEVICE_SELF, amigakbd_device, check_reset, NULL)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RWIN) PORT_CHAR(UCHAR_MAMEKEY(RWIN)) PORT_NAME("Right Amiga") PORT_CHANGED_MEMBER(DEVICE_SELF, amigakbd_device, check_reset, NULL)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RALT) PORT_CHAR(UCHAR_MAMEKEY(RALT))
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
@ -256,7 +257,9 @@ amigakbd_device::amigakbd_device(const machine_config &mconfig, const char *tag,
: device_t(mconfig, AMIGAKBD, "Amiga 500 Keyboard with 6570-036 MPU", tag, owner, clock, "amigakbd", __FILE__),
m_write_kclk(*this),
m_write_kdat(*this),
m_write_krst(*this),
m_mpu(*this, "mos6570_036"),
m_special(*this, "special"),
m_row_d6(*this, "row_d6"),
m_row_d5(*this, "row_d5"),
m_row_d4(*this, "row_d4"),
@ -274,6 +277,7 @@ amigakbd_device::amigakbd_device(const machine_config &mconfig, const char *tag,
m_row_c0(*this, "row_c0"),
m_timer(NULL),
m_watchdog(NULL),
m_reset(NULL),
m_kdat(1),
m_kclk(1),
m_port_c(0xff),
@ -292,8 +296,10 @@ void amigakbd_device::device_start()
{
m_write_kclk.resolve_safe();
m_write_kdat.resolve_safe();
m_write_krst.resolve_safe();
m_timer = timer_alloc(0, NULL);
m_watchdog = timer_alloc(1, NULL);
m_reset = timer_alloc(2, NULL);
}
//-------------------------------------------------
@ -321,6 +327,7 @@ void amigakbd_device::device_timer(emu_timer &timer, device_timer_id tid, int pa
{
switch (tid)
{
// 6500/1 internal timer
case 0:
switch (m_control & 0x03)
{
@ -348,10 +355,16 @@ void amigakbd_device::device_timer(emu_timer &timer, device_timer_id tid, int pa
}
break;
// watchdog
case 1:
m_mpu->reset();
m_watchdog->adjust(attotime::from_msec(54));
break;
// keyboard reset timer
case 2:
m_write_krst(1);
break;
}
}
@ -360,6 +373,18 @@ void amigakbd_device::device_timer(emu_timer &timer, device_timer_id tid, int pa
// IMPLEMENTATION
//**************************************************************************
INPUT_CHANGED_MEMBER( amigakbd_device::check_reset )
{
UINT8 keys = m_special->read();
// ctrl-amiga-amiga pressed?
if (!BIT(keys, 6) && !BIT(keys, 3) && !BIT(keys, 2))
{
m_write_krst(0);
m_reset->adjust(PERIOD_OF_555_MONOSTABLE(RES_K(47), CAP_U(10)));
}
}
void amigakbd_device::update_irqs()
{
if ((m_control & PA1_INT_ENABLED) && (m_control & PA1_NEGATIVE_EDGE))

View File

@ -29,6 +29,9 @@
#define MCFG_AMIGA_KEYBOARD_KDAT_CALLBACK(_write) \
devcb = &amigakbd_device::set_kdat_wr_callback(*device, DEVCB_##_write);
#define MCFG_AMIGA_KEYBOARD_KRST_CALLBACK(_write) \
devcb = &amigakbd_device::set_krst_wr_callback(*device, DEVCB_##_write);
//**************************************************************************
// TYPE DEFINITIONS
@ -46,6 +49,8 @@ public:
{ return downcast<amigakbd_device &>(device).m_write_kclk.set_callback(object); }
template<class _Object> static devcb_base &set_kdat_wr_callback(device_t &device, _Object object)
{ return downcast<amigakbd_device &>(device).m_write_kdat.set_callback(object); }
template<class _Object> static devcb_base &set_krst_wr_callback(device_t &device, _Object object)
{ return downcast<amigakbd_device &>(device).m_write_krst.set_callback(object); }
DECLARE_WRITE_LINE_MEMBER( kdat_w );
@ -64,6 +69,8 @@ public:
DECLARE_READ8_MEMBER( control_r );
DECLARE_WRITE8_MEMBER( control_w );
DECLARE_INPUT_CHANGED_MEMBER( check_reset );
protected:
// device-level overrides
virtual const rom_entry *device_rom_region() const;
@ -97,9 +104,11 @@ private:
devcb_write_line m_write_kclk;
devcb_write_line m_write_kdat;
devcb_write_line m_write_krst;
required_device<m6502_device> m_mpu;
required_ioport m_special;
required_ioport m_row_d6;
required_ioport m_row_d5;
required_ioport m_row_d4;
@ -118,6 +127,7 @@ private:
emu_timer *m_timer;
emu_timer *m_watchdog;
emu_timer *m_reset;
int m_kdat;
int m_kclk;