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

#include <stdio.h>
#include <conio.h>
#include <sys/arm7tdmi.h>
#include <target.h>

static long ticks;				// tick counter

/*
 * Timer0 interrupt service
 */
static void __attribute__((interrupt))		// handle as ISR!
t0_isr(void)
{
	Intern_t0ir = 1;			// clear int flag
	Intern_vicvectaddr = 0;			// reset VIC priority logic
	ticks++;				// up tick count
}

/*
 * Timer0 is setup to generate an interrupt every 10ms (=tick).
 * The tick count may be monitored anytime by pressing any key.
 */
int
main(void)
{
	Intern_vicvectaddr0 = (long)t0_isr;	// set ISR addr
	Intern_vicintenable = 0x10;		// enable t0 int
	Intern_vicvectcntl0 = 0x24;		//  vector

	Intern_t0mr0  = _PCLK/100-1;		// set MR0 to 10ms
	Intern_t0mcr |= 3;			// int on MR0, reset
	Intern_t0tcr  = 1;			// go...

	ENABLE_INTERRUPTS;			// enable core ints

	puts("Hit any key to display tick count...");
	while (1) {
		getch();
		printf("ticks: %10lu [10ms]\n", ticks);
	}
}

