Example #1
0
UINT64 msm6242_device::bump(int rtc_register, UINT64 delta, UINT64 register_min, UINT64 register_range)
{
	UINT64 carry = 0;

	if (delta > 0)
	{
		// get the register value
		UINT64 register_value = (rtc_register == RTC_TICKS)
			? m_tick
			: get_clock_register(rtc_register);

		// increment the value
		UINT64 new_register_value = ((register_value - register_min + delta) % register_range) + register_min;

		// calculate the cary
		carry = ((register_value - register_min) + delta) / register_range;

		// store the new register value
		if (rtc_register == RTC_TICKS)
			m_tick = (UINT16) new_register_value;
		else
			set_clock_register(rtc_register, (int) new_register_value);
	}

	return carry;
}
Example #2
0
void msm6242_device::update_timer()
{
	UINT64 callback_ticks = 0;
	attotime callback_time = attotime::never;

	// we only need to call back if the IRQ flag is on, and we have a handler
	if (!m_out_int_handler.isnull() && m_irq_flag == 1)
	{
		switch(m_irq_type)
		{
			case IRQ_HOUR:
				callback_ticks += (59 - get_clock_register(RTC_MINUTE)) * (0x8000 * 60);
				// fall through

			case IRQ_MINUTE:
				callback_ticks += (59 - get_clock_register(RTC_SECOND)) * 0x8000;
				// fall through

			case IRQ_SECOND:
				callback_ticks += 0x8000 - m_tick;
				break;

			case IRQ_64THSECOND:
				callback_ticks += 0x200 - (m_tick % 0x200);
				break;
		}
	}

	// if set, convert ticks to an attotime
	if (callback_ticks > 0)
	{
		// get the current time
		UINT64 curtime = current_time();

		// we need the absolute callback time, in ticks
		UINT64 absolute_callback_ticks = curtime + callback_ticks;

		// convert that to an attotime
		attotime absolute_callback_time = attotime::from_ticks(absolute_callback_ticks, clock());

		// and finally get the delta as an attotime
		callback_time = absolute_callback_time - machine().time();
	}

	m_timer->adjust(callback_time);
}
Example #3
0
void device_rtc_interface::adjust_seconds()
{
	int seconds = get_clock_register(RTC_SECOND);

	set_clock_register(RTC_SECOND, 0);

	if (seconds >= 30)
	{
		advance_minutes();
	}
	else
	{
		clock_updated();
	}
}
Example #4
0
UINT8 msm6242_device::get_clock_nibble(int rtc_register, bool high)
{
	int value = get_clock_register(rtc_register);
	value /= high ? 10 : 1;
	return (UINT8) ((value % 10) & 0x0F);
}
Example #5
0
void hp98035_io_card::log_current_time(void)
{
	LOG(("Time = %d:%d:%d:%d:%d\n" , get_clock_register(RTC_MONTH) ,
		 get_clock_register(RTC_DAY) , get_clock_register(RTC_HOUR) ,
		 get_clock_register(RTC_MINUTE) , get_clock_register(RTC_SECOND)));
}
Example #6
0
void hp98035_io_card::clock_short_press(void)
{
	LOG(("Short press:%u\n" , m_clock_keys));

	bool regen = false;
	int tmp;

	switch (m_clock_state) {
	case CLOCK_OFF:
		if (m_clock_keys == KEY_READ_MASK) {
			m_clock_state = CLOCK_HHMM;
			regen = true;
		} else if (m_clock_keys == KEY_SET_MASK) {
			m_clock_state = CLOCK_HH;
			regen = true;
		}
		break;

	case CLOCK_SS:
		if (m_clock_keys == KEY_SET_MASK) {
			m_clock_state = CLOCK_HH;
			regen = true;
		} else if (m_clock_keys == (KEY_CHG_MASK | KEY_READ_MASK)) {
			tmp = get_clock_register(RTC_SECOND);
			tmp++;
			if (tmp >= 60) {
				tmp = 0;
			}
			set_clock_register(RTC_SECOND , tmp);
			log_current_time();
			//m_clock_1s_div = 0;
			regen = true;
		}
		break;

	case CLOCK_HH:
		if (m_clock_keys == KEY_SET_MASK) {
			m_clock_state = CLOCK_MIN;
			regen = true;
		} else if (m_clock_keys == (KEY_CHG_MASK | KEY_READ_MASK)) {
			tmp = get_clock_register(RTC_HOUR);
			tmp++;
			if (tmp >= 24) {
				tmp = 0;
			}
			set_clock_register(RTC_HOUR , tmp);
			log_current_time();
			regen = true;
		}
		break;

	case CLOCK_MIN:
		if (m_clock_keys == KEY_SET_MASK) {
			m_clock_state = CLOCK_MON;
			regen = true;
		} else if (m_clock_keys == (KEY_CHG_MASK | KEY_READ_MASK)) {
			tmp = get_clock_register(RTC_MINUTE);
			tmp++;
			if (tmp >= 60) {
				tmp = 0;
			}
			set_clock_register(RTC_MINUTE , tmp);
			set_clock_register(RTC_SECOND , 0);
			//m_clock_1s_div = 0;
			log_current_time();
			regen = true;
		}
		break;

	case CLOCK_MON:
		if (m_clock_keys == KEY_SET_MASK) {
			m_clock_state = CLOCK_DOM;
			regen = true;
		} else if (m_clock_keys == (KEY_CHG_MASK | KEY_READ_MASK)) {
			tmp = get_clock_register(RTC_MONTH);
			tmp++;
			if (tmp >= 13) {
				tmp = 1;
			}
			set_clock_register(RTC_MONTH , tmp);
			log_current_time();
			regen = true;
		}
		break;

	case CLOCK_DOM:
		if (m_clock_keys == KEY_SET_MASK) {
			m_clock_state = CLOCK_OFF;
			regen = true;
		} else if (m_clock_keys == (KEY_CHG_MASK | KEY_READ_MASK)) {
			tmp = get_clock_register(RTC_DAY);
			tmp++;
			if (tmp > gregorian_days_in_month(get_clock_register(RTC_MONTH) , 0)) {
				tmp = 1;
			}
			set_clock_register(RTC_DAY , tmp);
			log_current_time();
			regen = true;
		}
		break;

	default:
		break;
	}

	if (regen) {
		regen_clock_image();
	}
}
Example #7
0
void hp98035_io_card::regen_clock_image(void)
{
	int tmp;
	bool pm;

	switch (m_clock_state) {
	case CLOCK_OFF:
		m_clock_digits[ 0 ] = SEVEN_SEG_OFF;
		m_clock_digits[ 1 ] = SEVEN_SEG_OFF;
		m_clock_digits[ 2 ] = SEVEN_SEG_OFF;
		m_clock_segh = false;
		break;

	case CLOCK_HHMM:
		tmp = get_clock_register(RTC_HOUR);
		if (tmp == 0) {
			tmp = 12;
		} else if (tmp > 12) {
			tmp -= 12;
		}
		set_lhs_digits(tmp);
		set_rhs_digits(get_clock_register(RTC_MINUTE));
		break;

	case CLOCK_SS:
		m_clock_segh = false;
		m_clock_digits[ 2 ] = SEVEN_SEG_OFF;
		set_rhs_digits(get_clock_register(RTC_SECOND));
		break;

	case CLOCK_HH:
		tmp = get_clock_register(RTC_HOUR);
		pm = tmp >= 12;
		if (tmp == 0) {
			tmp = 12;
		} else if (tmp > 12) {
			tmp -= 12;
		}
		set_lhs_digits(tmp);
		m_clock_digits[ 1 ] = SEVEN_SEG_OFF;
		m_clock_digits[ 0 ] = pm ? SEVEN_SEG_P : SEVEN_SEG_A;
		break;

	case CLOCK_MIN:
		m_clock_segh = false;
		m_clock_digits[ 2 ] = SEVEN_SEG_OFF;
		set_rhs_digits(get_clock_register(RTC_MINUTE));
		break;

	case CLOCK_MON:
		tmp = get_clock_register(RTC_MONTH);
		set_lhs_digits(tmp);
		m_clock_digits[ 0 ] = SEVEN_SEG_OFF;
		m_clock_digits[ 1 ] = SEVEN_SEG_OFF;
		break;

	case CLOCK_DOM:
		m_clock_segh = false;
		m_clock_digits[ 2 ] = SEVEN_SEG_OFF;
		set_rhs_digits(get_clock_register(RTC_DAY));
		break;

	default:
		m_clock_state = CLOCK_OFF;
		break;
	}
	LOG(("St=%d segh=%d %02x:%02x:%02x\n" , m_clock_state ,  m_clock_segh , m_clock_digits[ 2 ] ,
		 m_clock_digits[ 1 ] , m_clock_digits[ 0 ]));
}