#include<unistd.h>
#include<sys/types.h>
#include<sys/mman.h>
#include<sys/time.h>
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include "logo.h"

void blt(int, int, int, int);
volatile unsigned short *regs;

int main(int argc, char **argv) {
	unsigned long rnd;
	unsigned short *fb;
	int randomdat[10000];
	struct timeval begin, end;
	int i = 0, x, y, usecs;
	int fd = open("/dev/mem", O_RDWR|O_SYNC);

	regs = (unsigned short *)mmap(0, 4096, 
			PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0x72000000);
	fb = (unsigned short *)mmap(0, 800 * 600 * 2, 
			PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0x72200000);
	regs += (0x30 / sizeof(unsigned short));
	regs[4] = 0x302;
	for (y = 0; y < 80; y++)
		for (x = 0; x < 250; x++) {
			unsigned short d = logo[i++];
			if (d == 0x0) d &= ~0x20;
			else d |= 0x20;
			fb[(y * 800) + x] = d;
		}
	regs[4] = 0x1340;
	blt(0x0, 0x0, 799, 300);
	regs[4] = 0x1300;
	blt(0x100000, 0, 249, 80);
	exit(0);

	srand(time());
	for (i = 0; i < 10000; i++) randomdat[i] = rand() & 0x7ffff;
	gettimeofday(&begin, NULL);
	for (i = 0; i < 10000; i++) {
		blt(0x100000, randomdat[i], 249, 80);
	}
	gettimeofday(&end, NULL);
	usecs = (end.tv_sec - begin.tv_sec) * 1000000;
	usecs = usecs + (end.tv_usec - begin.tv_usec);
	printf("Did 10000 bit-blts in %d.%06d second.\n", usecs / 1000000,
	  usecs % 1000000); 
	regs[4] = 0x1340;
	close(fd);
}

void blt(int src, int dest, int width, int height) {
	regs[0] = (src >> 16) | ((dest >> 16) << 6) | ((width >> 7) << 13);
	regs[1] = (height & 0x1ff) | (width << 9);
	regs[2] = src & 0xffff;
	regs[3] = dest & 0xffff;
}
