//See $LK,"PCI",A="HI:PCI"$.

#if mp_count > 1
#define DEST_CPU				1
#else
#define DEST_CPU				0
#endif

#assert I_USER == 0x40

interrupt U0 IntMy40()
{
	lock {progress1++;}
	*(dev.uncached_alias + LAPIC_EOI)(U32 *) = 0;
}

interrupt U0 IntMy41()
{
	lock {progress2++;}
	*(dev.uncached_alias + LAPIC_EOI)(U32 *) = 0;
}

interrupt U0 IntMy42()
{
	lock {progress3++;}
	*(dev.uncached_alias + LAPIC_EOI)(U32 *) = 0;
}

interrupt U0 IntMy43()
{
	lock {progress4++;}
	*(dev.uncached_alias + LAPIC_EOI)(U32 *) = 0;
}

I64 vect[4] = {&IntMy40, &IntMy41, &IntMy42, &IntMy43};

U0 Main()
{
	I64  i;
	U8  *da = dev.uncached_alias + IOAPIC_REG;
	U32 *_d = dev.uncached_alias + IOAPIC_DATA;

	ProgressBarsReset;
	for (i = I_USER; i < I_USER + 4; i++)
		IntEntrySet(i, vect[i&3], IDTET_IRQ);

		//There are like 4*6 vects.  Bus zero
		//has the first four vects.
	for (i = IOREDTAB; i < IOREDTAB + 4 * 2; i += 2)
	{
		*da = i + 1;
		*_d = dev.mp_apic_ids[DEST_CPU] << 24;
		*da = i;
		*_d = 0x4000 + 0x40 + (i - IOREDTAB) / 2;
	}

	Sleep(1000);
	"The keyboard and timer seem to be active.\n"
	"IntA:%d IntB:%d IntC:%d IntD:%d\n\n"
	"IntB is my keyboard and regs a single KEY-UP.\n"
	"Rerun and press a few keys.\n", progress1, progress2, progress3, progress4;

	//Disable vects
	for (i = IOREDTAB; i < IOREDTAB + 4 * 2; i += 2)
	{
		*da = i + 1;
		*_d = dev.mp_apic_ids[DEST_CPU] << 24;
		*da = i;
		*_d = 0x14000 + 0x40 + (i - IOREDTAB) / 2;
	}
	ProgressBarsReset;
}

Main;
