Previous 199869 Revisions Next

r32279 Monday 22nd September, 2014 at 09:18:33 UTC by Dirk Best
Amiga: Add keyboard reset circuit. You can now reset the Amiga with the
usual Ctrl-Amiga-Amiga key combination.
[src/mame/includes]amiga.h
[src/mame/machine]amiga.c
[src/mess/drivers]amiga.c
[src/mess/machine]amigakbd.c amigakbd.h

trunk/src/mame/machine/amiga.c
r32278r32279
268268   m_overlay->set_bank(1);
269269}
270270
271WRITE_LINE_MEMBER( amiga_state::kbreset_w )
272{
273   // this is connected to the gary chip, gary then resets the 68k, agnus, paula and the cias
274   if (!state)
275   {
276      m_sound->reset();
277      machine_reset();
278      m_maincpu->reset();
279   }
280}
281
271282// simple mirror of region 0xf80000 to 0xfbffff
272283READ16_MEMBER( amiga_state::rom_mirror_r )
273284{
trunk/src/mame/includes/amiga.h
r32278r32279
437437   DECLARE_CUSTOM_INPUT_MEMBER( floppy_drive_status );
438438
439439   DECLARE_WRITE_LINE_MEMBER( m68k_reset );
440   DECLARE_WRITE_LINE_MEMBER( kbreset_w );
440441
441442   DECLARE_READ16_MEMBER( cia_r );
442443   DECLARE_WRITE16_MEMBER( cia_w );
trunk/src/mess/machine/amigakbd.c
r32278r32279
1818***************************************************************************/
1919
2020#include "amigakbd.h"
21#include "machine/rescap.h"
2122
2223
2324//**************************************************************************
r32278r32279
7980static INPUT_PORTS_START( a500_us_keyboard )
8081   PORT_START("special")
8182   PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED)
82   PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LWIN)      PORT_CHAR(UCHAR_MAMEKEY(LWIN))      PORT_NAME("Left Amiga")
83   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)
8384   PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LALT)      PORT_CHAR(UCHAR_MAMEKEY(LALT))
8485   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT)    PORT_CHAR(UCHAR_SHIFT_1)
85   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL)  PORT_CHAR(UCHAR_SHIFT_2)            PORT_NAME("Ctrl")
86   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RWIN)      PORT_CHAR(UCHAR_MAMEKEY(RWIN))      PORT_NAME("Right Amiga")
86   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)
87   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)
8788   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RALT)      PORT_CHAR(UCHAR_MAMEKEY(RALT))
8889   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RSHIFT)    PORT_CHAR(UCHAR_SHIFT_1)
8990
r32278r32279
256257   : device_t(mconfig, AMIGAKBD, "Amiga 500 Keyboard with 6570-036 MPU", tag, owner, clock, "amigakbd", __FILE__),
257258   m_write_kclk(*this),
258259   m_write_kdat(*this),
260   m_write_krst(*this),
259261   m_mpu(*this, "mos6570_036"),
262   m_special(*this, "special"),
260263   m_row_d6(*this, "row_d6"),
261264   m_row_d5(*this, "row_d5"),
262265   m_row_d4(*this, "row_d4"),
r32278r32279
274277   m_row_c0(*this, "row_c0"),
275278   m_timer(NULL),
276279   m_watchdog(NULL),
280   m_reset(NULL),
277281   m_kdat(1),
278282   m_kclk(1),
279283   m_port_c(0xff),
r32278r32279
292296{
293297   m_write_kclk.resolve_safe();
294298   m_write_kdat.resolve_safe();
299   m_write_krst.resolve_safe();
295300   m_timer = timer_alloc(0, NULL);
296301   m_watchdog = timer_alloc(1, NULL);
302   m_reset = timer_alloc(2, NULL);
297303}
298304
299305//-------------------------------------------------
r32278r32279
321327{
322328   switch (tid)
323329   {
330   // 6500/1 internal timer
324331   case 0:
325332      switch (m_control & 0x03)
326333      {
r32278r32279
348355      }
349356      break;
350357
358   // watchdog
351359   case 1:
352360      m_mpu->reset();
353361      m_watchdog->adjust(attotime::from_msec(54));
354362      break;
363
364   // keyboard reset timer
365   case 2:
366      m_write_krst(1);
367      break;
355368   }
356369}
357370
r32278r32279
360373//  IMPLEMENTATION
361374//**************************************************************************
362375
376INPUT_CHANGED_MEMBER( amigakbd_device::check_reset )
377{
378   UINT8 keys = m_special->read();
379
380   // ctrl-amiga-amiga pressed?
381   if (!BIT(keys, 6) && !BIT(keys, 3) && !BIT(keys, 2))
382   {
383      m_write_krst(0);
384      m_reset->adjust(PERIOD_OF_555_MONOSTABLE(RES_K(47), CAP_U(10)));
385   }
386}
387
363388void amigakbd_device::update_irqs()
364389{
365390   if ((m_control & PA1_INT_ENABLED) && (m_control & PA1_NEGATIVE_EDGE))
trunk/src/mess/machine/amigakbd.h
r32278r32279
2929#define MCFG_AMIGA_KEYBOARD_KDAT_CALLBACK(_write) \
3030   devcb = &amigakbd_device::set_kdat_wr_callback(*device, DEVCB_##_write);
3131
32#define MCFG_AMIGA_KEYBOARD_KRST_CALLBACK(_write) \
33   devcb = &amigakbd_device::set_krst_wr_callback(*device, DEVCB_##_write);
3234
35
3336//**************************************************************************
3437//  TYPE DEFINITIONS
3538//**************************************************************************
r32278r32279
4649      { return downcast<amigakbd_device &>(device).m_write_kclk.set_callback(object); }
4750   template<class _Object> static devcb_base &set_kdat_wr_callback(device_t &device, _Object object)
4851      { return downcast<amigakbd_device &>(device).m_write_kdat.set_callback(object); }
52   template<class _Object> static devcb_base &set_krst_wr_callback(device_t &device, _Object object)
53      { return downcast<amigakbd_device &>(device).m_write_krst.set_callback(object); }
4954
5055   DECLARE_WRITE_LINE_MEMBER( kdat_w );
5156
r32278r32279
6469   DECLARE_READ8_MEMBER( control_r );
6570   DECLARE_WRITE8_MEMBER( control_w );
6671
72   DECLARE_INPUT_CHANGED_MEMBER( check_reset );
73
6774protected:
6875   // device-level overrides
6976   virtual const rom_entry *device_rom_region() const;
r32278r32279
97104
98105   devcb_write_line m_write_kclk;
99106   devcb_write_line m_write_kdat;
107   devcb_write_line m_write_krst;
100108
101109   required_device<m6502_device> m_mpu;
102110
111   required_ioport m_special;
103112   required_ioport m_row_d6;
104113   required_ioport m_row_d5;
105114   required_ioport m_row_d4;
r32278r32279
118127
119128   emu_timer *m_timer;
120129   emu_timer *m_watchdog;
130   emu_timer *m_reset;
121131
122132   int m_kdat;
123133   int m_kclk;
trunk/src/mess/drivers/amiga.c
r32278r32279
12931293   MCFG_DEVICE_ADD("kbd", AMIGAKBD, 0)
12941294   MCFG_AMIGA_KEYBOARD_KCLK_CALLBACK(DEVWRITELINE("cia_0", mos8520_device, cnt_w))
12951295   MCFG_AMIGA_KEYBOARD_KDAT_CALLBACK(DEVWRITELINE("cia_0", mos8520_device, sp_w))
1296   MCFG_AMIGA_KEYBOARD_KRST_CALLBACK(WRITELINE(amiga_state, kbreset_w))
12961297
12971298   // software
12981299   MCFG_SOFTWARE_LIST_ADD("wb_list", "amiga_workbench")

Previous 199869 Revisions Next


© 1997-2024 The MAME Team