summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/timer.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/timer.h')
-rw-r--r--src/emu/timer.h220
1 files changed, 143 insertions, 77 deletions
diff --git a/src/emu/timer.h b/src/emu/timer.h
index d48540d71bc..af56bf054b4 100644
--- a/src/emu/timer.h
+++ b/src/emu/timer.h
@@ -19,19 +19,7 @@
#ifndef __TIMER_H__
#define __TIMER_H__
-
-/***************************************************************************
- CONSTANTS
-***************************************************************************/
-
-/* timer types */
-enum
-{
- TIMER_TYPE_PERIODIC = 0,
- TIMER_TYPE_SCANLINE,
- TIMER_TYPE_GENERIC
-};
-
+#include "devlegcy.h"
/***************************************************************************
@@ -57,7 +45,7 @@ enum
/* macros for a timer callback functions */
#define TIMER_CALLBACK(name) void name(running_machine *machine, void *ptr, int param)
-#define TIMER_DEVICE_CALLBACK(name) void name(running_device *timer, void *ptr, INT32 param)
+#define TIMER_DEVICE_CALLBACK(name) void name(timer_device &timer, void *ptr, INT32 param)
@@ -65,41 +53,19 @@ enum
TYPE DEFINITIONS
***************************************************************************/
-/* a timer callback looks like this */
-typedef void (*timer_fired_func)(running_machine *machine, void *ptr, INT32 param);
-typedef void (*timer_device_fired_func)(running_device *timer, void *ptr, INT32 param);
-
+// forward declarations
+class emu_timer;
+class timer_device;
-/*-------------------------------------------------
- timer_config - configuration of a single
- timer
--------------------------------------------------*/
-typedef struct _timer_config timer_config;
-struct _timer_config
-{
- int type; /* type of timer */
- timer_device_fired_func callback; /* the timer's callback function */
- void *ptr; /* the pointer parameter passed to the timer callback */
-
- /* periodic timers only */
- UINT64 start_delay; /* delay before the timer fires for the first time */
- UINT64 period; /* period of repeated timer firings */
- INT32 param; /* the integer parameter passed to the timer callback */
-
- /* scanline timers only */
- const char *screen; /* the name of the screen this timer tracks */
- UINT32 first_vpos; /* the first vertical scanline position the timer fires on */
- UINT32 increment; /* the number of scanlines between firings */
-};
+// a timer callback looks like this
+typedef void (*timer_fired_func)(running_machine *machine, void *ptr, INT32 param);
+typedef void (*timer_device_fired_func)(timer_device &timer, void *ptr, INT32 param);
-/* opaque type for representing a timer */
-typedef struct _emu_timer emu_timer;
-typedef struct _timer_execution_state timer_execution_state;
-struct _timer_execution_state
+struct timer_execution_state
{
attotime nextfire; /* time that the head of the timer list will fire */
attotime basetime; /* global basetime; everything moves forward from here */
@@ -108,43 +74,43 @@ struct _timer_execution_state
-/***************************************************************************
- TIMER DEVICE CONFIGURATION MACROS
-***************************************************************************/
+//**************************************************************************
+// TIMER DEVICE CONFIGURATION MACROS
+//**************************************************************************
#define MDRV_TIMER_ADD(_tag, _callback) \
MDRV_DEVICE_ADD(_tag, TIMER, 0) \
- MDRV_DEVICE_CONFIG_DATA32(timer_config, type, TIMER_TYPE_GENERIC) \
- MDRV_DEVICE_CONFIG_DATAPTR(timer_config, callback, _callback) \
+ MDRV_DEVICE_INLINE_DATA16(timer_device_config::INLINE_TYPE, timer_device_config::TIMER_TYPE_GENERIC) \
+ MDRV_DEVICE_INLINE_DATAPTR(timer_device_config::INLINE_CALLBACK, _callback)
#define MDRV_TIMER_ADD_PERIODIC(_tag, _callback, _period) \
MDRV_DEVICE_ADD(_tag, TIMER, 0) \
- MDRV_DEVICE_CONFIG_DATA32(timer_config, type, TIMER_TYPE_PERIODIC) \
- MDRV_DEVICE_CONFIG_DATAPTR(timer_config, callback, _callback) \
- MDRV_DEVICE_CONFIG_DATA64(timer_config, period, UINT64_ATTOTIME_IN_##_period)
+ MDRV_DEVICE_INLINE_DATA16(timer_device_config::INLINE_TYPE, timer_device_config::TIMER_TYPE_PERIODIC) \
+ MDRV_DEVICE_INLINE_DATAPTR(timer_device_config::INLINE_CALLBACK, _callback) \
+ MDRV_DEVICE_INLINE_DATA64(timer_device_config::INLINE_PERIOD, UINT64_ATTOTIME_IN_##_period)
#define MDRV_TIMER_ADD_SCANLINE(_tag, _callback, _screen, _first_vpos, _increment) \
MDRV_DEVICE_ADD(_tag, TIMER, 0) \
- MDRV_DEVICE_CONFIG_DATA32(timer_config, type, TIMER_TYPE_SCANLINE) \
- MDRV_DEVICE_CONFIG_DATAPTR(timer_config, callback, _callback) \
- MDRV_DEVICE_CONFIG_DATAPTR(timer_config, screen, _screen) \
- MDRV_DEVICE_CONFIG_DATA32(timer_config, first_vpos, _first_vpos) \
- MDRV_DEVICE_CONFIG_DATA32(timer_config, increment, _increment)
+ MDRV_DEVICE_INLINE_DATA16(timer_device_config::INLINE_TYPE, timer_device_config::TIMER_TYPE_SCANLINE) \
+ MDRV_DEVICE_INLINE_DATAPTR(timer_device_config::INLINE_CALLBACK, _callback) \
+ MDRV_DEVICE_INLINE_DATAPTR(timer_device_config::INLINE_SCREEN, _screen) \
+ MDRV_DEVICE_INLINE_DATA16(timer_device_config::INLINE_FIRST_VPOS, _first_vpos) \
+ MDRV_DEVICE_INLINE_DATA16(timer_device_config::INLINE_INCREMENT, _increment)
#define MDRV_TIMER_MODIFY(_tag) \
MDRV_DEVICE_MODIFY(_tag)
#define MDRV_TIMER_CALLBACK(_callback) \
- MDRV_DEVICE_CONFIG_DATAPTR(timer_config, callback, _callback)
+ MDRV_DEVICE_INLINE_DATA32(timer_device_config::INLINE_CALLBACK, _callback)
#define MDRV_TIMER_START_DELAY(_start_delay) \
- MDRV_DEVICE_CONFIG_DATA64(timer_config, start_delay, UINT64_ATTOTIME_IN_##_start_delay)
+ MDRV_DEVICE_INLINE_DATA64(timer_device_config::INLINE_DELAY, UINT64_ATTOTIME_IN_##_start_delay)
#define MDRV_TIMER_PARAM(_param) \
- MDRV_DEVICE_CONFIG_DATA32(timer_config, param, _param)
+ MDRV_DEVICE_INLINE_DATA32(timer_device_config::INLINE_PARAM, _param)
#define MDRV_TIMER_PTR(_ptr) \
- MDRV_DEVICE_CONFIG_DATAPTR(timer_config, ptr, _ptr)
+ MDRV_DEVICE_INLINE_DATAPTR(timer_device_config::INLINE_PTR, _ptr)
@@ -193,11 +159,9 @@ emu_timer *_timer_alloc_internal(running_machine *machine, timer_fired_func call
/* adjust the time when this timer will fire and disable any periodic firings */
void timer_adjust_oneshot(emu_timer *which, attotime duration, INT32 param);
-void timer_device_adjust_oneshot(running_device *timer, attotime duration, INT32 param);
/* adjust the time when this timer will fire and specify a period for subsequent firings */
void timer_adjust_periodic(emu_timer *which, attotime start_delay, INT32 param, attotime period);
-void timer_device_adjust_periodic(running_device *timer, attotime start_delay, INT32 param, attotime period);
@@ -215,31 +179,24 @@ void _timer_pulse_internal(running_machine *machine, attotime period, void *ptr,
/* reset the timing on a timer */
void timer_reset(emu_timer *which, attotime duration);
-void timer_device_reset(running_device *timer);
/* enable/disable a timer */
int timer_enable(emu_timer *which, int enable);
-int timer_device_enable(running_device *timer, int enable);
/* determine if a timer is enabled */
int timer_enabled(emu_timer *which);
-int timer_device_enabled(running_device *timer);
/* returns the callback parameter of a timer */
int timer_get_param(emu_timer *which);
-int timer_device_get_param(running_device *timer);
/* changes the callback parameter of a timer */
void timer_set_param(emu_timer *which, int param);
-void timer_device_set_param(running_device *timer, int param);
/* returns the callback pointer of a timer */
void *timer_get_ptr(emu_timer *which);
-void *timer_device_get_ptr(running_device *timer);
/* changes the callback pointer of a timer */
void timer_set_ptr(emu_timer *which, void *ptr);
-void timer_device_set_ptr(running_device *timer, void *ptr);
@@ -247,29 +204,138 @@ void timer_device_set_ptr(running_device *timer, void *ptr);
/* return the time since the last trigger */
attotime timer_timeelapsed(emu_timer *which);
-attotime timer_device_timeelapsed(running_device *timer);
/* return the time until the next trigger */
attotime timer_timeleft(emu_timer *which);
-attotime timer_device_timeleft(running_device *timer);
/* return the current time */
attotime timer_get_time(running_machine *machine);
/* return the time when this timer started counting */
attotime timer_starttime(emu_timer *which);
-attotime timer_device_starttime(running_device *timer);
/* return the time when this timer will fire next */
attotime timer_firetime(emu_timer *which);
-attotime timer_device_firetime(running_device *timer);
-/* ----- timer device interface ----- */
-/* device get info callback */
-#define TIMER DEVICE_GET_INFO_NAME(timer)
-DEVICE_GET_INFO( timer );
+// ======================> timer_device_config
+
+class timer_device_config : public device_config
+{
+ friend class timer_device;
+
+ // construction/destruction
+ timer_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock);
+
+public:
+ // allocators
+ static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock);
+ virtual device_t *alloc_device(running_machine &machine) const;
+
+ // basic information getters
+ virtual const char *name() const { return "Timer"; }
+
+ // indexes to inline data
+ enum
+ {
+ INLINE_TYPE,
+ INLINE_CALLBACK,
+ INLINE_PERIOD,
+ INLINE_SCREEN,
+ INLINE_FIRST_VPOS,
+ INLINE_INCREMENT,
+ INLINE_DELAY,
+ INLINE_PARAM,
+ INLINE_PTR
+ };
+
+ // timer types
+ enum timer_type
+ {
+ TIMER_TYPE_PERIODIC,
+ TIMER_TYPE_SCANLINE,
+ TIMER_TYPE_GENERIC
+ };
+
+private:
+ // device_config overrides
+ virtual void device_config_complete();
+ virtual bool device_validity_check(const game_driver &driver) const;
+
+ // configuration data
+ timer_type m_type; // type of timer
+ timer_device_fired_func m_callback; // the timer's callback function
+ void * m_ptr; // the pointer parameter passed to the timer callback
+
+ // periodic timers only
+ UINT64 m_start_delay; // delay before the timer fires for the first time
+ UINT64 m_period; // period of repeated timer firings
+ INT32 m_param; // the integer parameter passed to the timer callback
+
+ // scanline timers only
+ const char * m_screen; // the name of the screen this timer tracks
+ UINT32 m_first_vpos; // the first vertical scanline position the timer fires on
+ UINT32 m_increment; // the number of scanlines between firings
+};
+
+
+
+// ======================> timer_device
+
+class timer_device : public device_t
+{
+ friend class timer_device_config;
+
+ // construction/destruction
+ timer_device(running_machine &_machine, const timer_device_config &config);
+
+public:
+ // property getters
+ int param() const { return timer_get_param(m_timer); }
+ void *ptr() const { return m_ptr; }
+ bool enabled() const { return (timer_enabled(m_timer) != 0); }
+
+ // property setters
+ void set_param(int param) { assert(m_config.m_type == timer_device_config::TIMER_TYPE_GENERIC); timer_set_param(m_timer, param); }
+ void set_ptr(void *ptr) { m_ptr = ptr; }
+ void enable(bool enable = true) { timer_enable(m_timer, enable); }
+
+ // adjustments
+ void reset() { adjust(attotime_never, 0, attotime_never); }
+ void adjust(attotime duration, INT32 param = 0, attotime period = attotime_never) { assert(m_config.m_type == timer_device_config::TIMER_TYPE_GENERIC); timer_adjust_periodic(m_timer, duration, param, period); }
+
+ // timing information
+ attotime time_elapsed() const { return timer_timeelapsed(m_timer); }
+ attotime time_left() const { return timer_timeleft(m_timer); }
+ attotime start_time() const { return timer_starttime(m_timer); }
+ attotime fire_time() const { return timer_firetime(m_timer); }
+
+private:
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+ // internal helpers
+ static TIMER_CALLBACK( static_periodic_timer_callback ) { reinterpret_cast<timer_device *>(ptr)->periodic_timer_callback(param); }
+ void periodic_timer_callback(int param);
+
+ static TIMER_CALLBACK( static_scanline_timer_callback ) { reinterpret_cast<timer_device *>(ptr)->scanline_timer_callback(param); }
+ void scanline_timer_callback(int scanline);
+
+ // internal state
+ const timer_device_config &m_config;
+ emu_timer * m_timer; // the backing timer
+ void * m_ptr; // the pointer parameter passed to the timer callback
+
+ // scanline timers only
+ screen_device *m_screen; // pointer to the screen
+ bool m_first_time; // indicates that the system is starting
+};
+
+
+// device type definition
+const device_type TIMER = timer_device_config::static_alloc_device_config;
#endif /* __TIMER_H__ */