//See 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 Terry's 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;