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

📄 ticket.c

📁 这个是延伸mame的在wince平台下的游戏模拟器的代码
💻 C
字号:
/***************************************************************************

  machine.c

  Functions to emulate a prototypical ticket dispenser hardware.

  Right now, this is an *extremely* basic ticket dispenser.
  TODO:	Active Bit may not be Bit 7 in all applications.
  	    Add a ticket dispenser interface instead of passing a bunch
		of arguments to ticket_dispenser_init.
		Add sound, graphical output?
***************************************************************************/

#include "driver.h"
#include "machine/ticket.h"

unsigned int dispensed_tickets = 0;

static int status;
static int power;
static int time_msec;
static int motoron;
static int ticketdispensed;
static int ticketnotdispensed;
static void *timer;

static int active_bit = 0x80;

/* Callback routine used during ticket dispensing */
static void ticket_dispenser_toggle(int parm);


/***************************************************************************
  ticket_dispenser_init

***************************************************************************/
void ticket_dispenser_init(int msec, int motoronhigh, int statusactivehigh)
{
	time_msec          = msec;
	motoron            = motoronhigh  ? active_bit : 0;
	ticketdispensed    = statusactivehigh ? active_bit : 0;
	ticketnotdispensed = ticketdispensed ^ active_bit;

	status = ticketnotdispensed;
	power  = 0x00;
}

/***************************************************************************
  ticket_dispenser_r
***************************************************************************/
int ticket_dispenser_r(int offset)
{
	return status;
}

/***************************************************************************
  ticket_dispenser_w
***************************************************************************/
void ticket_dispenser_w(int offset, int data)
{
	/* On an activate signal, start dispensing! */
	if ((data & active_bit) == motoron)
	{
		if (!power)
		{
			timer = timer_set (TIME_IN_MSEC(time_msec), 0, ticket_dispenser_toggle);
			power = 1;

			status = ticketnotdispensed;
		}
	}
	else
	{
		if (power)
		{
			timer_remove(timer);
			osd_led_w(2,0);
			power = 0;
		}
	}
}


/***************************************************************************
  ticket_dispenser_toggle

  How I think this works:
  When a ticket dispenses, there is N milliseconds of status = high,
  and N milliseconds of status = low (a wait cycle?).
***************************************************************************/
static void ticket_dispenser_toggle(int parm)
{

	/* If we still have power, keep toggling ticket states. */
	if (power)
	{
		status ^= active_bit;
		timer = timer_set (TIME_IN_MSEC(time_msec), 0, ticket_dispenser_toggle);
	}

	if (status == ticketdispensed)
	{
		osd_led_w(2,1);
		dispensed_tickets++;

	}
	else
	{
		osd_led_w(2,0);
	}
}

⌨️ 快捷键说明

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