summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/watchdog.h
blob: 85f792203f86d7c3ad23a27abf9efc8dc1d7e070 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// license:BSD-3-Clause
// copyright-holders:Aaron Giles

#pragma once

#ifndef __WATCHDOG_H__
#define __WATCHDOG_H__


//**************************************************************************
//  DEVICE CONFIGURATION MACROS
//**************************************************************************

#define MCFG_WATCHDOG_ADD(_tag) \
	MCFG_DEVICE_ADD(_tag, WATCHDOG_TIMER, 0)
#define MCFG_WATCHDOG_MODIFY(_tag) \
	MCFG_DEVICE_MODIFY(_tag)
#define MCFG_WATCHDOG_VBLANK_INIT(_screen, _count) \
	watchdog_timer_device::static_set_vblank_count(*device, _screen, _count);
#define MCFG_WATCHDOG_TIME_INIT(_time) \
	watchdog_timer_device::static_set_time(*device, _time);


//**************************************************************************
//  TYPE DEFINITIONS
//**************************************************************************

// ======================> watchdog_timer_device

class watchdog_timer_device : public device_t
{
public:
	// construction/destruction
	watchdog_timer_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

	// inline configuration helpers
	static void static_set_vblank_count(device_t &device, const char *screen_tag, int32_t count);
	static void static_set_time(device_t &device, attotime time);

	// watchdog control
	void watchdog_reset();
	void watchdog_enable(bool enable = true);
	int32_t get_vblank_counter() const { return m_counter; }

	// read/write handlers
	DECLARE_WRITE8_MEMBER( reset_w );
	DECLARE_READ8_MEMBER( reset_r );
	DECLARE_WRITE16_MEMBER( reset16_w );
	DECLARE_READ16_MEMBER( reset16_r );
	DECLARE_WRITE32_MEMBER( reset32_w );
	DECLARE_READ32_MEMBER( reset32_r );

protected:
	// device-level overrides
	virtual void device_validity_check(validity_checker &valid) const override;
	virtual void device_start() override;
	virtual void device_reset() override;
	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;

private:
	// internal helpers
	void watchdog_fired();
	void watchdog_vblank(screen_device &screen, bool vblank_state);

	// configuration data
	int32_t                   m_vblank_count; // number of VBLANKs until resetting the machine
	attotime                m_time;         // length of time until resetting the machine
	const char *            m_screen_tag;   // the tag of the screen this timer tracks

	// internal state
	bool                    m_enabled;      // is the watchdog enabled?
	int32_t                   m_counter;      // counter for VBLANK tracking
	emu_timer *             m_timer;        // timer for triggering reset
};


//**************************************************************************
//  GLOBAL VARIABLES
//**************************************************************************

extern const device_type WATCHDOG_TIMER;


#endif