/*
 * Copyright(C) Paul und Scherer (mct.de/mct.net)
 *
 * This example demonstrates how to...
 *
 *  ... use the RTC to generate interrupts.
 */

#include <stdio.h>
#include <sys/m68k.h>
#include <target.h>

/*
 * Select which RTC counter to use to
 * generate an interrupt on change:
 *
 *  0 =1/64 second counter
 *  1 =     second counter
 *  2 =     minute counter
 *  3 =       hour counter
 */
#define COUNTER	1

static char const *unit[] =			/* units... */
{
	"1s/64",
	"s",
	"m",
	"h"
};

static long irqs;				/* IRQ counter */

/*
 * RTC interrupt service
 */
#pragma interrupt				/* handle as ISR! */
static void
rtc_isr(void)
{
	irqs++;					/* up IRQ count */
	RTC.ctld = 0;				/* clear int flag */
}
#pragma endinterrupt

/*
 * The RTC is setup to generate an interrupt,
 * whenever the selected counter changes, and
 * the IRQ count is displayed.
 */
int
main(void)
{
	long irqs_old = -1;			/* last IRQ count */

	EXCEPT_VEC(VEC_AUTO3) = rtc_isr;	/* set ISR addr */
	RTC.ctle = COUNTER<<2|2;		/* interrupt mode */
	RTC.ctld = 0;				/* clear int flag */
	INTERN.sim.pfpar |= 8;			/* enable IRQ3 line */
	ENABLE_CPU_INTERRUPTS;

	while (1) {
		if (irqs != irqs_old) {
			printf("[%s] IRQs: %lu\n",
				unit[COUNTER&3],
				irqs
			);
			irqs_old = irqs;	/* remember IRQ count */
		}
	}
}

