⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tl_event.c

📁 gameboy 模拟器的源代码
💻 C
字号:
/*** thinlib (c) 2001 Matthew Conte (matt@conte.com)****** tl_event.c**** event handling routines**** $Id: $*/#include "tl_types.h"#include "tl_event.h"#include "tl_djgpp.h"/* maximum of 8 event handling callbacks */#define  MAX_CALLBACKS     8#define  EVENT_QUEUE_MAX   256#define  EVENT_QUEUE_MASK  (EVENT_QUEUE_MAX - 1)#define  EVENT_QUEUE_EMPTY (event_queue.head == event_queue.tail)typedef struct event_queue_s{   int head;   int tail;   thin_event_t event[EVENT_QUEUE_MAX];} event_queue_t;static event_queue_t event_queue;static event_callback_t event_callback[MAX_CALLBACKS];/* add an event. */void thin_event_add(thin_event_t *event){   event_queue.event[event_queue.head] = *event;   event_queue.head = (event_queue.head + 1) & EVENT_QUEUE_MASK;}THIN_LOCKED_FUNC(thin_event_add)/* get an event from the event queue.  returns 0 if no events. */int thin_event_get(thin_event_t *event){   if (EVENT_QUEUE_EMPTY)   {      event->type = THIN_NOEVENT;      return 0;   }   *event = event_queue.event[event_queue.tail];   event_queue.tail = (event_queue.tail + 1) & EVENT_QUEUE_MASK;   return 1;}/* gather up all pollable events */void thin_event_gather(void){   int i;   for (i = 0; i < MAX_CALLBACKS; i++)   {      if (NULL == event_callback[i])         return;      event_callback[i]();   }}/* return an ID of an event callback */event_id thin_event_add_callback(event_callback_t callback){   event_id id;   for (id = 0; id < MAX_CALLBACKS; id++)   {      if (NULL == event_callback[id])         break;   }   /* no event callbacks available */   if (id == MAX_CALLBACKS)      return (event_id) -1;   event_callback[id] = callback;   return id;}/* remove an event callback */void thin_event_remove_callback(event_id id){   THIN_ASSERT(id >= 0 && id < MAX_CALLBACKS);   if (id < 0 || id >= MAX_CALLBACKS)      return;   THIN_ASSERT(NULL != event_callback[id]);   event_callback[id] = NULL;   /* move all other callbacks down */   for (; id < MAX_CALLBACKS - 1; id++)   {      event_callback[id] = event_callback[id + 1];      event_callback[id + 1] = NULL;   }}/* set up the event handling system */void thin_event_init(void){   int i;   /* some modules call thin_event_add from an ISR, so we must   ** lock everythig that is touched within that function, as   ** well as the code itself.   */   THIN_LOCK_FUNC(thin_event_add);   THIN_LOCK_VAR(event_queue);   for (i = 0; i < MAX_CALLBACKS; i++)      event_callback[i] = NULL;   event_queue.head = event_queue.tail = 0;}/*** $Log: $*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -