view src/timer.c @ 25:fb14515266f4

Implemented timer and timer interrupts. Added get/setvbr instructions. Fixed assembler bug. Moved mnemonics into a separate source file
author Michael Pavone <pavone@retrodev.com>
date Thu, 31 Mar 2016 23:25:52 -0700
parents
children
line wrap: on
line source

#include <stdint.h>
#include <string.h>
#include <limits.h>
#include "timer.h"

void timer_init(timer *context, uint32_t clock_div)
{
	memset(context, 0, sizeof(timer));
	context->clock_inc = clock_div;
}

void timer_run(timer *context, uint32_t target)
{
	while (context->cycles < target)
	{
		if (context->current) {
			context->current--;
			if (!context->current) {
				context->pending = 1;
			}
		} else {
			context->current = context->load;
		}
		context->cycles += context->clock_inc;
	}
}

uint32_t timer_next_interrupt(timer *context)
{
	if (context->pending) {
		return 0;
	}
	if (context->current) {
		return context->cycles + context->current * context->clock_inc;
	}
	return UINT_MAX;
}

void timer_write(timer *context, uint16_t value)
{
	context->load = context->current = value;
	context->pending = 0;
}