#include <stdio.h>
#include <assert.h>

unsigned int microcode[]={
//#include "microcode-20090927.dat"
#include "microcode-20100209.dat"
0xffffffff
};

struct microcode_header_intel {
	unsigned int            hdrver;
	unsigned int            rev;
	unsigned int            date;
	unsigned int            sig;
	unsigned int            cksum;
	unsigned int            ldrver;
	unsigned int            pf;
	unsigned int            datasize;
	unsigned int            totalsize;
	unsigned int            reserved[3];
};

void main()
{
	int i=0;

	for (;;)
	{
		struct microcode_header_intel *s=(struct microcode_header_intel *)&microcode[i];

		int cpu_stepping;
		int cpu_model;
		int cpu_family;
		int cpu_type;
		int cpu_extmodel;
		int cpu_extfamily;


		if (microcode[i]==0xffffffff)
		{
			return;
		}
/*
		printf ("---\n");
		printf ("hdrver=%08X\n", s->hdrver);
		printf ("rev=%08X\n", s->rev);
		printf ("date=%08X\n", s->date);
		printf ("sig=%08X\n", s->sig);
		printf ("cksum=%08X\n", s->cksum);
		printf ("ldrver=%08X\n", s->ldrver);
		printf ("pf=%08X\n", s->pf);
		printf ("datasize=%08X\n", s->datasize);
		printf ("totalsize=%08X\n", s->totalsize);
*/
		cpu_stepping=s->sig&0xF;
		cpu_model=(s->sig>>4)&0xF;
		cpu_family=(s->sig>>8)&0xF;
		cpu_type=(s->sig>>12)&3;
		cpu_extmodel=(s->sig>>16)&0xF;
		cpu_extfamily=(s->sig>>20)&0xFF;

		assert (cpu_type==0);

		if (cpu_extmodel || cpu_extfamily)
			printf ("family=%d model=%d stepping=%d extmodel=%d extfamily=%d ",
				cpu_family, cpu_model, cpu_stepping, cpu_extmodel, cpu_extfamily);
		else
			printf ("family=%d model=%d stepping=%d ",
				cpu_family, cpu_model, cpu_stepping);

		printf ("date=%04x-%02x-%02x datasize=%d\n", 
			s->date&0xFFFF,
			(s->date>>24)&0xFF,
			(s->date>>16)&0xFF,
			(s->datasize==0) ? 2000*4 : s->datasize);

		if (s->datasize==0)
			i=i+2048;
		else
			i=i+(s->totalsize/4);
	};
};
