//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 registers 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;