mirror of
https://github.com/holub/mame
synced 2025-04-29 03:20:50 +03:00
Amiga: Add keyboard reset circuit. You can now reset the Amiga with the
usual Ctrl-Amiga-Amiga key combination.
This commit is contained in:
parent
f304226c6c
commit
11e723d07a
@ -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 );
|
||||||
|
@ -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 )
|
||||||
{
|
{
|
||||||
|
@ -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")
|
||||||
|
@ -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))
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user