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_CUSTOM_INPUT_MEMBER( floppy_drive_status );
DECLARE_WRITE_LINE_MEMBER( m68k_reset ); DECLARE_WRITE_LINE_MEMBER( m68k_reset );
DECLARE_WRITE_LINE_MEMBER( kbreset_w );
DECLARE_READ16_MEMBER( cia_r ); DECLARE_READ16_MEMBER( cia_r );
DECLARE_WRITE16_MEMBER( cia_w ); DECLARE_WRITE16_MEMBER( cia_w );

View File

@ -268,6 +268,17 @@ void amiga_state::machine_reset()
m_overlay->set_bank(1); 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 // simple mirror of region 0xf80000 to 0xfbffff
READ16_MEMBER( amiga_state::rom_mirror_r ) 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_DEVICE_ADD("kbd", AMIGAKBD, 0)
MCFG_AMIGA_KEYBOARD_KCLK_CALLBACK(DEVWRITELINE("cia_0", mos8520_device, cnt_w)) 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_KDAT_CALLBACK(DEVWRITELINE("cia_0", mos8520_device, sp_w))
MCFG_AMIGA_KEYBOARD_KRST_CALLBACK(WRITELINE(amiga_state, kbreset_w))
// software // software
MCFG_SOFTWARE_LIST_ADD("wb_list", "amiga_workbench") MCFG_SOFTWARE_LIST_ADD("wb_list", "amiga_workbench")

View File

@ -18,6 +18,7 @@
***************************************************************************/ ***************************************************************************/
#include "amigakbd.h" #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 ) static INPUT_PORTS_START( a500_us_keyboard )
PORT_START("special") PORT_START("special")
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED) 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(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(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(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_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(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) 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__), : device_t(mconfig, AMIGAKBD, "Amiga 500 Keyboard with 6570-036 MPU", tag, owner, clock, "amigakbd", __FILE__),
m_write_kclk(*this), m_write_kclk(*this),
m_write_kdat(*this), m_write_kdat(*this),
m_write_krst(*this),
m_mpu(*this, "mos6570_036"), m_mpu(*this, "mos6570_036"),
m_special(*this, "special"),
m_row_d6(*this, "row_d6"), m_row_d6(*this, "row_d6"),
m_row_d5(*this, "row_d5"), m_row_d5(*this, "row_d5"),
m_row_d4(*this, "row_d4"), 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_row_c0(*this, "row_c0"),
m_timer(NULL), m_timer(NULL),
m_watchdog(NULL), m_watchdog(NULL),
m_reset(NULL),
m_kdat(1), m_kdat(1),
m_kclk(1), m_kclk(1),
m_port_c(0xff), m_port_c(0xff),
@ -292,8 +296,10 @@ void amigakbd_device::device_start()
{ {
m_write_kclk.resolve_safe(); m_write_kclk.resolve_safe();
m_write_kdat.resolve_safe(); m_write_kdat.resolve_safe();
m_write_krst.resolve_safe();
m_timer = timer_alloc(0, NULL); m_timer = timer_alloc(0, NULL);
m_watchdog = timer_alloc(1, 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) switch (tid)
{ {
// 6500/1 internal timer
case 0: case 0:
switch (m_control & 0x03) switch (m_control & 0x03)
{ {
@ -348,10 +355,16 @@ void amigakbd_device::device_timer(emu_timer &timer, device_timer_id tid, int pa
} }
break; break;
// watchdog
case 1: case 1:
m_mpu->reset(); m_mpu->reset();
m_watchdog->adjust(attotime::from_msec(54)); m_watchdog->adjust(attotime::from_msec(54));
break; 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 // 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() void amigakbd_device::update_irqs()
{ {
if ((m_control & PA1_INT_ENABLED) && (m_control & PA1_NEGATIVE_EDGE)) if ((m_control & PA1_INT_ENABLED) && (m_control & PA1_NEGATIVE_EDGE))

View File

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