#include <sys/io.h>
#include <stdio.h>
//#include "emu.c"

unsigned char read_cr(unsigned char idx) {
	int port = 0x3b4;
	if (inb(0x3cc) & 1) {
		port = 0x3d4;
	} 
	outb(idx, port);
	return inb(port + 1);
}

unsigned char read_sr(unsigned char idx) {
	outb(idx, 0x3c4);
	return inb(0x3c5);
}

unsigned char read_gr(unsigned char idx) {
	outb(idx, 0x3ce);
	return inb(0x3cf);
}


void write_cr(unsigned char val, unsigned char idx) {
	int port = 0x3b4;
	if (inb(0x3cc) & 1) {
		port = 0x3d4;
	} 
	outb(idx, port);
	outb(val, port + 1);
}

void write_sr(unsigned char val, unsigned char idx) {
	outb(idx, 0x3c4);
	outb(val, 0x3c5);
}

void write_gr(unsigned char val, unsigned char idx) {
	outb(idx, 0x3ce);
	outb(val, 0x3cf);
}


void setup_eck_pll(unsigned int word) {
		/* fifo control */
		write_cr(read_cr(0x17) & ~0x80, 0x17);

		write_sr((word >> 8)  & 0xff, 0x48);
		write_sr((word >> 16) & 0xff, 0x47);
		write_sr(word & 0xff, 0x49);

/*
	b80803
		write_sr(0x8, 0x48);
		write_sr(0xb8, 0x47);
		write_sr(0x3, 0x49);
*/
		/* fifo control */
		write_cr(read_cr(0x17) | 0x80, 0x17);

		/* reset ECK PLL */
		write_sr(read_sr(0x40) | 0x1, 0x40);
		write_sr(read_sr(0x40) & ~0x1, 0x40);
		/* rewrite Miscellaneous Output Register */
		outb(inb(0x3cc), 0x3c2);
}

void main(void) {
	volatile unsigned char tmp;

	iopl(3);

//	sr[0x2d] = 0xaa;

	/* unlock vga */
	outb(0x1, 0x3c3);


	/* Scratch ? */
	write_sr(0x0, 0x32);
	/* unlock ext regs */
	write_sr(read_sr(0x10) | 0x1, 0x10);
	/* k8m800 contain here some fix, ignore */

	/* PMU setup  should be | 0x3f*/
	write_sr(read_sr(0x2d) | 0xbf, 0x2d);

	/* first BIOS table */

	write_sr(0x08, 0x16);
	write_sr(0x1f, 0x17);
	write_sr(0x0e, 0x18);
	write_sr(0x82, 0x1a);
	write_sr(0x00, 0x1f);
	write_sr(0x40, 0x20);
	write_sr(0x40, 0x21);
	write_sr(0x1f, 0x22);
	write_sr(0x40, 0x41);
	write_sr(0x30, 0x42);
	write_sr(0x1f, 0x50);
	write_cr(0x00, 0x33);
	write_cr(0x0c, 0x30);
	write_cr(0x80, 0x41);
	write_cr(0x80, 0x9d);
	write_cr(0x80, 0x42);
	write_cr(0x80, 0x9e);
	write_sr(0x7f, 0x19);
	write_sr(0x30, 0x1b);
	write_sr(0x01, 0x1e);
	write_sr(0x01, 0x2c);
	write_sr(0x00, 0x2a);
	write_sr(0xff, 0x2d);
	write_sr(0xfb, 0x2e);
	write_sr(0xff, 0x3f);
	write_cr(0x31, 0x36);
	write_cr(0x00, 0x34);
	write_cr(0x00, 0x48);
	write_cr(0x00, 0x62);
	write_cr(0x00, 0x63);
	write_cr(0x00, 0x64);
	write_cr(0x00, 0xa3);
	write_cr(0x00, 0x67);
	write_cr(0x41, 0x6a);
	write_cr(0x00, 0x91);
	write_cr(0x00, 0xd3);
	write_sr(0xf5, 0x51);
	write_sr(0x08, 0x40);
	write_cr(0x00, 0x40);
	write_cr(0x90, 0x43);
	write_sr(0x00, 0x3e);
	write_cr(0x00, 0x97);
	write_cr(0x00, 0x74);

	/* if the bit 3 is not set run remaining part */
	if (!(read_sr(0x32) & 0x4)) {
		write_cr(0x01, 0x3b);
		write_cr(0x04, 0x3d);
		write_cr(0x00, 0x3e);
		write_cr(0x02, 0x3f);
		write_cr(0x00, 0x4b);
		write_cr(0x00, 0x4c);
		write_cr(0x00, 0x4d);
		write_cr(0x10, 0x4e);
		write_sr(0x00, 0x32);
		write_sr(0x00, 0x33);
		write_sr(0x40, 0x34);
		write_sr(0x04, 0x39);
		write_sr(0x00, 0x3a);
		write_cr(0x00, 0x49);
		write_cr(0x00, 0x4a);
		write_cr(0x00, 0x4f);
		write_cr(0x08, 0x3c);
	}

	/* third table is shortest due to an 0xff should | 0x1*/
	write_cr(read_cr(0x32) | 0x11, 0x32);
	write_cr(read_cr(0x88) | 0x20, 0x88);

	/* for dualcore only:
	write_cr(read_cr(0x42) & ~0x80, 0x42);
	write_cr(read_cr(0x9e) & ~0x80, 0x9e);
	*/

	write_cr(0x1, 0x3b);

	/* Scratch ? */
	write_cr(0x4, 0x3d);

	/* here we need to obtain the memory speed grade 0x3d */

	if ((read_cr(0x3d) >> 4) > 3) {
		setup_eck_pll(0xad0403);
	} else {
		setup_eck_pll(0xb80803);
	}

	/* this is done only if cold reset */

	/* dac backdoor off */
	write_cr(read_cr(0x47) | 0x4, 0x47);
	write_sr((read_sr(0x1) & 0xdf) | 0x20, 0x1);

	/* here may be some workaround but not present at all, maybe some other ROM have it */
	write_cr(read_cr(0x47) & ~0x4, 0x47);
	/* yes it is in this maybe wrong order */
	write_sr((read_sr(0x1) & 0xdf) & ~0x20, 0x1);


	/* clear bit 7 of scratch ????*/
	write_cr(read_cr(0x3d) & ~0x80, 0x3d);

	/*fifo setup */
	write_sr(read_sr(0x16) & ~0x40, 0x16);

	write_cr((read_cr(0x36) & ~0x30) | (0x3 << 4), 0x36);
	write_cr((read_cr(0x30) & ~0x4), 0x30);

	/* just read, hope compiler won't optimize that out */
	tmp = inb(0x3da);
	tmp = inb(0x3ba);

	outb(0x0, 0x3c0);


/* original bios has it but if I compile it in I get blank screen */
//	tmp = inb(0x3da);
	tmp = inb(0x3ba);


	/* just read, hope compiler won't optimize that out */
//	tmp = inb(0x3da) | inb(0x3ba);

	/* channel 1 & 2 clock mode */
	write_cr((read_cr(0x6b) & ~0xc8), 0x6b);

	write_sr(read_sr(0x1) | 0x20, 0x1);


//outb(0x30, 0x3d4);
//outb(0xc, 0x3d5);

//	return;
	/* here is std vga set mode thingie */


outw(0x349, 0x3b4);
outb(0x10, 0x3c4);
outb(0x10, 0x3c4);
//modify bytes  0
outb(0x0, 0x3c5);
outb(0x10, 0x3c4);
outb(0x10, 0x3c4);
//modify bytes  1
outb(0x1, 0x3c5);
outb(0x10, 0x3c4);
outb(0x10, 0x3c4);
//modify bytes  1
outb(0x1, 0x3c5);
outb(0x0, 0x3c0);
outb(0x36, 0x3b4);
//modify bytes  31
outb(0x31, 0x3b5);
outb(0x17, 0x3b4);
//modify bytes  0
outb(0x0, 0x3b5);
outb(0x47, 0x3b4);
outw(0x100, 0x3c4);
outb(0x1, 0x3c4);
outw(0x2001, 0x3c4);
outw(0x302, 0x3c4);
outw(0x3, 0x3c4);
outw(0x204, 0x3c4);
outb(0x67, 0x3c2);
outw(0x300, 0x3c4);
outw(0x2011, 0x3d4);
outw(0x5f00, 0x3d4);
outw(0x4f01, 0x3d4);
outw(0x5002, 0x3d4);
outw(0x8203, 0x3d4);
outw(0x5504, 0x3d4);
outw(0x8105, 0x3d4);
outw(0xbf06, 0x3d4);
outw(0x1f07, 0x3d4);
outw(0x8, 0x3d4);
outw(0x4f09, 0x3d4);
outw(0xd0a, 0x3d4);
outw(0xe0b, 0x3d4);
outw(0xc, 0x3d4);
outw(0xd, 0x3d4);
outw(0xe, 0x3d4);
outw(0xf, 0x3d4);
outw(0x9c10, 0x3d4);
outw(0x6e11, 0x3d4);
outw(0x8f12, 0x3d4);
outw(0x2813, 0x3d4);
outw(0x1f14, 0x3d4);
outw(0x9615, 0x3d4);
outw(0xb916, 0x3d4);
outw(0x2317, 0x3d4);
outw(0xff18, 0x3d4);
outb(0x10, 0x3c0);
outb(0xc, 0x3c0);
outb(0x12, 0x3c0);
outb(0xf, 0x3c0);
outb(0x13, 0x3c0);
outb(0x8, 0x3c0);
outb(0x14, 0x3c0);
outb(0x0, 0x3c0);
outw(0x0, 0x3ce);
outw(0x1, 0x3ce);
outw(0x2, 0x3ce);
outw(0x3, 0x3ce);
outw(0x4, 0x3ce);
outw(0x1005, 0x3ce);
outw(0xe06, 0x3ce);
outw(0x7, 0x3ce);
outw(0xff08, 0x3ce);
outb(0x47, 0x3d4);
outb(0x47, 0x3d4);
//modify bytes  0
outb(0x0, 0x3d5);
outw(0x100, 0x3c4);
outb(0x1, 0x3c4);
outw(0x2001, 0x3c4);
outb(0x67, 0x3c2);
outw(0x300, 0x3c4);
outw(0x2011, 0x3d4);
outw(0x5f00, 0x3d4);
outw(0x4f01, 0x3d4);
outw(0x5002, 0x3d4);
outw(0x8203, 0x3d4);
outw(0x5504, 0x3d4);
outw(0x8105, 0x3d4);
outw(0xbf06, 0x3d4);
outw(0x1f07, 0x3d4);
outw(0x8, 0x3d4);
outb(0x9, 0x3d4);
//modify bytes  4f
outb(0x4f, 0x3d5);
outw(0x9c10, 0x3d4);
outw(0x6e11, 0x3d4);
outw(0x8f12, 0x3d4);
outw(0x2813, 0x3d4);
outw(0x1f14, 0x3d4);
outw(0x9615, 0x3d4);
outw(0xb916, 0x3d4);
outw(0x2317, 0x3d4);
outw(0xff18, 0x3d4);

outb(0x15, 0x3c4);
//modify bytes  2
outb(0x2, 0x3c5);
outb(0x16, 0x3c4);
//modify bytes  8
outb(0x8, 0x3c5);
outb(0x17, 0x3c4);
//modify bytes  1f
outb(0x1f, 0x3c5);
outb(0x1a, 0x3c4);
//modify bytes  a
outb(0xa, 0x3c5);
outb(0x33, 0x3d4);
//modify bytes  e
outb(0xe, 0x3d5);
outb(0x35, 0x3d4);
//modify bytes  0
outb(0x0, 0x3d5);
outb(0x36, 0x3d4);
//modify bytes  31
outb(0x31, 0x3d5);
outb(0x47, 0x3d4);
//modify bytes  0
outb(0x0, 0x3d5);
outb(0x48, 0x3d4);
//modify bytes  0
outb(0x0, 0x3d5);
outb(0x34, 0x3d4);
//modify bytes  0
outb(0x0, 0x3d5);
outb(0x20, 0x3ce);
//modify bytes  0
outb(0x0, 0x3cf);
outb(0x21, 0x3ce);
//modify bytes  0
outb(0x0, 0x3cf);
outb(0x22, 0x3ce);
//modify bytes  0
outb(0x0, 0x3cf);
outb(0x15, 0x3c4);
//modify bytes  0
outb(0x0, 0x3c5);
outb(0x1a, 0x3c4);
//modify bytes  2
outb(0x2, 0x3c5);
outb(0x33, 0x3d4);
//modify bytes  8
outb(0x8, 0x3d5);
outb(0x11, 0x3d4);
//modify bytes  6e
outb(0x6e, 0x3d5);
outb(0x35, 0x3d4);
//modify bytes  0
outb(0x0, 0x3d5);
outw(0x2813, 0x3d4);
outb(0x49, 0x3d4);
outb(0x49, 0x3d4);
outb(0x15, 0x3c4);
outb(0x13, 0x3d4);
outb(0x35, 0x3d4);
outb(0x49, 0x3d4);
outb(0x15, 0x3c4);
outb(0x13, 0x3d4);
outb(0x35, 0x3d4);
outb(0x57, 0x3c4);
//modify bytes  0
outb(0x0, 0x3c5);
outw(0x6017, 0x3c4);
outb(0x16, 0x3c4);
//modify bytes  8
outb(0x8, 0x3c5);
outb(0x16, 0x3c4);
//modify bytes  28
outb(0x28, 0x3c5);
outb(0x1d, 0x3c4);
//modify bytes  0
outb(0x0, 0x3c5);
outw(0x541c, 0x3c4);
outb(0x22, 0x3c4);
//modify bytes  14
outb(0x14, 0x3c5);
outb(0x17, 0x3d4);
//modify bytes  a3
outb(0xa3, 0x3d5);

outb(0x0, 0x3c0);
outb(0x0, 0x3c0);
outb(0x1, 0x3c0);
outb(0x1, 0x3c0);
outb(0x2, 0x3c0);
outb(0x2, 0x3c0);
outb(0x3, 0x3c0);
outb(0x3, 0x3c0);
outb(0x4, 0x3c0);
outb(0x4, 0x3c0);
outb(0x5, 0x3c0);
outb(0x5, 0x3c0);
outb(0x6, 0x3c0);
outb(0x14, 0x3c0);
outb(0x7, 0x3c0);
outb(0x7, 0x3c0);
outb(0x8, 0x3c0);
outb(0x38, 0x3c0);
outb(0x9, 0x3c0);
outb(0x39, 0x3c0);
outb(0xa, 0x3c0);
outb(0x3a, 0x3c0);
outb(0xb, 0x3c0);
outb(0x3b, 0x3c0);
outb(0xc, 0x3c0);
outb(0x3c, 0x3c0);
outb(0xd, 0x3c0);
outb(0x3d, 0x3c0);
outb(0xe, 0x3c0);
outb(0x3e, 0x3c0);
outb(0xf, 0x3c0);
outb(0x3f, 0x3c0);
outb(0x10, 0x3c0);
outb(0xc, 0x3c0);
outb(0x11, 0x3c0);
outb(0x0, 0x3c0);
outb(0xff, 0x3c6);
//modify bytes  32
//up to here it does not work


outb(0x1a, 0x3c4);
outb(0x32, 0x3c5);
outb(0x0, 0x3c8);
outb(0x0, 0x3c9);
outb(0x0, 0x3c9);
outb(0x0, 0x3c9);
outb(0x1, 0x3c8);
outb(0x0, 0x3c9);
outb(0x0, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x2, 0x3c8);
outb(0x0, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x0, 0x3c9);
outb(0x3, 0x3c8);
outb(0x0, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x4, 0x3c8);
outb(0x2a, 0x3c9);
outb(0x0, 0x3c9);
outb(0x0, 0x3c9);
outb(0x5, 0x3c8);
outb(0x2a, 0x3c9);
outb(0x0, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x6, 0x3c8);
outb(0x2a, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x0, 0x3c9);
outb(0x7, 0x3c8);
outb(0x2a, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x8, 0x3c8);
outb(0x0, 0x3c9);
outb(0x0, 0x3c9);
outb(0x15, 0x3c9);
outb(0x9, 0x3c8);
outb(0x0, 0x3c9);
outb(0x0, 0x3c9);
outb(0x3f, 0x3c9);
outb(0xa, 0x3c8);
outb(0x0, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x15, 0x3c9);
outb(0xb, 0x3c8);
outb(0x0, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x3f, 0x3c9);
outb(0xc, 0x3c8);
outb(0x2a, 0x3c9);
outb(0x0, 0x3c9);
outb(0x15, 0x3c9);
outb(0xd, 0x3c8);
outb(0x2a, 0x3c9);
outb(0x0, 0x3c9);
outb(0x3f, 0x3c9);
outb(0xe, 0x3c8);
outb(0x2a, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x15, 0x3c9);
outb(0xf, 0x3c8);
outb(0x2a, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x3f, 0x3c9);
outb(0x10, 0x3c8);
outb(0x0, 0x3c9);
outb(0x15, 0x3c9);
outb(0x0, 0x3c9);
outb(0x11, 0x3c8);
outb(0x0, 0x3c9);
outb(0x15, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x12, 0x3c8);
outb(0x0, 0x3c9);
outb(0x3f, 0x3c9);
outb(0x0, 0x3c9);
outb(0x13, 0x3c8);
outb(0x0, 0x3c9);
outb(0x3f, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x14, 0x3c8);
outb(0x2a, 0x3c9);
outb(0x15, 0x3c9);
outb(0x0, 0x3c9);
outb(0x15, 0x3c8);
outb(0x2a, 0x3c9);
outb(0x15, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x16, 0x3c8);
outb(0x2a, 0x3c9);
outb(0x3f, 0x3c9);
outb(0x0, 0x3c9);
outb(0x17, 0x3c8);
outb(0x2a, 0x3c9);
outb(0x3f, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x18, 0x3c8);
outb(0x0, 0x3c9);
outb(0x15, 0x3c9);
outb(0x15, 0x3c9);
outb(0x19, 0x3c8);
outb(0x0, 0x3c9);
outb(0x15, 0x3c9);
outb(0x3f, 0x3c9);
outb(0x1a, 0x3c8);
outb(0x0, 0x3c9);
outb(0x3f, 0x3c9);
outb(0x15, 0x3c9);
outb(0x1b, 0x3c8);
outb(0x0, 0x3c9);


outb(0x3f, 0x3c9);
outb(0x3f, 0x3c9);
outb(0x1c, 0x3c8);
outb(0x2a, 0x3c9);
outb(0x15, 0x3c9);
outb(0x15, 0x3c9);
outb(0x1d, 0x3c8);
outb(0x2a, 0x3c9);
outb(0x15, 0x3c9);
outb(0x3f, 0x3c9);
outb(0x1e, 0x3c8);
outb(0x2a, 0x3c9);
outb(0x3f, 0x3c9);
outb(0x15, 0x3c9);
outb(0x1f, 0x3c8);
outb(0x2a, 0x3c9);
outb(0x3f, 0x3c9);
outb(0x3f, 0x3c9);
outb(0x20, 0x3c8);
outb(0x15, 0x3c9);
outb(0x0, 0x3c9);
outb(0x0, 0x3c9);
outb(0x21, 0x3c8);
outb(0x15, 0x3c9);
outb(0x0, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x22, 0x3c8);
outb(0x15, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x0, 0x3c9);
outb(0x23, 0x3c8);
outb(0x15, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x24, 0x3c8);
outb(0x3f, 0x3c9);
outb(0x0, 0x3c9);
outb(0x0, 0x3c9);
outb(0x25, 0x3c8);
outb(0x3f, 0x3c9);
outb(0x0, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x26, 0x3c8);
outb(0x3f, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x0, 0x3c9);
outb(0x27, 0x3c8);
outb(0x3f, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x28, 0x3c8);
outb(0x15, 0x3c9);
outb(0x0, 0x3c9);
outb(0x15, 0x3c9);
outb(0x29, 0x3c8);
outb(0x15, 0x3c9);
outb(0x0, 0x3c9);
outb(0x3f, 0x3c9);
outb(0x2a, 0x3c8);
outb(0x15, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x15, 0x3c9);
outb(0x2b, 0x3c8);
outb(0x15, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x3f, 0x3c9);
outb(0x2c, 0x3c8);
outb(0x3f, 0x3c9);
outb(0x0, 0x3c9);
outb(0x15, 0x3c9);
outb(0x2d, 0x3c8);
outb(0x3f, 0x3c9);
outb(0x0, 0x3c9);
outb(0x3f, 0x3c9);
outb(0x2e, 0x3c8);
outb(0x3f, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x15, 0x3c9);
outb(0x2f, 0x3c8);
outb(0x3f, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x3f, 0x3c9);

//from here it does not work

outb(0x30, 0x3c8);
outb(0x15, 0x3c9);
outb(0x15, 0x3c9);
outb(0x0, 0x3c9);
outb(0x31, 0x3c8);
outb(0x15, 0x3c9);
outb(0x15, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x32, 0x3c8);
outb(0x15, 0x3c9);
outb(0x3f, 0x3c9);
outb(0x0, 0x3c9);
outb(0x33, 0x3c8);
outb(0x15, 0x3c9);
outb(0x3f, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x34, 0x3c8);
outb(0x3f, 0x3c9);
outb(0x15, 0x3c9);
outb(0x0, 0x3c9);
outb(0x35, 0x3c8);
outb(0x3f, 0x3c9);
outb(0x15, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x36, 0x3c8);
outb(0x3f, 0x3c9);
outb(0x3f, 0x3c9);
outb(0x0, 0x3c9);
outb(0x37, 0x3c8);
outb(0x3f, 0x3c9);
outb(0x3f, 0x3c9);
outb(0x2a, 0x3c9);
outb(0x38, 0x3c8);
outb(0x15, 0x3c9);
outb(0x15, 0x3c9);
outb(0x15, 0x3c9);
outb(0x39, 0x3c8);
outb(0x15, 0x3c9);
outb(0x15, 0x3c9);
outb(0x3f, 0x3c9);
outb(0x3a, 0x3c8);
outb(0x15, 0x3c9);
outb(0x3f, 0x3c9);
outb(0x15, 0x3c9);
outb(0x3b, 0x3c8);
outb(0x15, 0x3c9);
outb(0x3f, 0x3c9);
outb(0x3f, 0x3c9);
outb(0x3c, 0x3c8);
outb(0x3f, 0x3c9);
outb(0x15, 0x3c9);
outb(0x15, 0x3c9);
outb(0x3d, 0x3c8);
outb(0x3f, 0x3c9);
outb(0x15, 0x3c9);
outb(0x3f, 0x3c9);
outb(0x3e, 0x3c8);
outb(0x3f, 0x3c9);
outb(0x3f, 0x3c9);
outb(0x15, 0x3c9);
outb(0x3f, 0x3c8);
outb(0x3f, 0x3c9);
outb(0x3f, 0x3c9);
outb(0x3f, 0x3c9);
outw(0x1, 0x3ce);
outw(0x3, 0x3ce);
outw(0x204, 0x3ce);
outw(0x5, 0x3ce);
outw(0x406, 0x3ce);
outw(0xff08, 0x3ce);
outw(0x402, 0x3c4);
outw(0x604, 0x3c4);
outw(0x302, 0x3c4);
outw(0x204, 0x3c4);
outw(0x1005, 0x3ce);
outw(0x4, 0x3ce);
outw(0xe06, 0x3ce);
outb(0x10, 0x3c4);
//here it still does not work

outb(0x10, 0x3c4);
//modify bytes  0
outb(0x0, 0x3c5);
outb(0x10, 0x3c4);
outb(0x10, 0x3c4);
//modify bytes  1
outb(0x1, 0x3c5);
outb(0x10, 0x3c4);
outb(0x10, 0x3c4);
//modify bytes  1
outb(0x1, 0x3c5);
outb(0x6a, 0x3d4);
//modify bytes  41
outb(0x41, 0x3d5);
//here it still does not work

outb(0x30, 0x3d4);
//modify bytes  c
outb(0xc, 0x3d5);
// HERE IT WORKS!!!!!



outb(0x16, 0x3d4);

outb(0x41, 0x3d4);
//modify bytes  b9
outb(0xb9, 0x3d5);
//here it works already!

outb(0x42, 0x3d4);
//modify bytes  b4
outb(0xb4, 0x3d5);
outb(0x9e, 0x3d4);
//modify bytes  b4
outb(0xb4, 0x3d5);
//here it works already!

outb(0x6b, 0x3d4);
//modify bytes  0
outb(0x0, 0x3d5);
outb(0x3d, 0x3d4);
outb(0x3d, 0x3d4);
outb(0x1, 0x3c4);
//modify bytes  0
outb(0x0, 0x3c5);
outb(0x16, 0x3c4);
//modify bytes  28
outb(0x28, 0x3c5);
outb(0x20, 0x3c0);
outb(0x3d, 0x3d4);
outb(0x3d, 0x3d4);
outb(0x36, 0x3d4);
//modify bytes  1
outb(0x1, 0x3d5);
outb(0x20, 0x3c0);

}