mirror of
https://github.com/holub/mame
synced 2025-04-26 02:07:14 +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_WRITE_LINE_MEMBER( m68k_reset );
|
||||
DECLARE_WRITE_LINE_MEMBER( kbreset_w );
|
||||
|
||||
DECLARE_READ16_MEMBER( cia_r );
|
||||
DECLARE_WRITE16_MEMBER( cia_w );
|
||||
|
@ -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 )
|
||||
{
|
||||
|
@ -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")
|
||||
|
@ -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))
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user