public static void Initialize()
        {
            var context = new ProcessContext.Context();

            context.type                    = ProcessContext.Context_Type.PROCESS;
            context.tid                     = ProcessContext.m_NextCID++;
            context.name                    = "Boot";
            context.esp                     = 0;
            context.stacktop                = 0;
            context.state                   = ProcessContext.Thread_State.ALIVE;
            context.arg                     = 0;
            context.priority                = 0;
            context.age                     = 0;
            context.parent                  = 0;
            ProcessContext.m_ContextList    = context;
            ProcessContext.m_CurrentContext = context;

            IOPort counter0 = new IOPort(0x40);
            IOPort cmd      = new IOPort(0x43);

            int divisor = 1193182 / 25;

            cmd.Byte      = (0x06 | 0x30);
            counter0.Byte = (byte)divisor;
            counter0.Byte = (byte)(divisor >> 8);

            IOPort pA1 = new IOPort(0xA1);
            IOPort p21 = new IOPort(0xA1);

            pA1.Byte = 0x00;
            p21.Byte = 0x00;
        }
 public static void SwitchTask()
 {
     interruptCount++;
     if (ProcessContext.m_CurrentContext != null)
     {
         ProcessContext.Context ctx  = ProcessContext.m_ContextList;
         ProcessContext.Context last = ctx;
         while (ctx != null)
         {
             if (ctx.state == ProcessContext.Thread_State.DEAD)
             {
                 last.next = ctx.next;
                 break;
             }
             last = ctx;
             ctx  = ctx.next;
         }
         ctx = ProcessContext.m_ContextList;
         while (ctx != null)
         {
             if (ctx.state == ProcessContext.Thread_State.WAITING_SLEEP)
             {
                 ctx.arg -= 1000 / 25;
                 if (ctx.arg <= 0)
                 {
                     ctx.state = ProcessContext.Thread_State.ALIVE;
                 }
             }
             ctx.age++;
             ctx = ctx.next;
         }
         ProcessContext.m_CurrentContext.esp = INTs.mStackContext;
         tryagain :;
         if (ProcessContext.m_CurrentContext.next != null)
         {
             ProcessContext.m_CurrentContext = ProcessContext.m_CurrentContext.next;
         }
         else
         {
             ProcessContext.m_CurrentContext = ProcessContext.m_ContextList;
         }
         if (ProcessContext.m_CurrentContext.state != ProcessContext.Thread_State.ALIVE)
         {
             goto tryagain;
         }
         ProcessContext.m_CurrentContext.age = ProcessContext.m_CurrentContext.priority;
         INTs.mStackContext = ProcessContext.m_CurrentContext.esp;
     }
     Global.PIC.EoiMaster();
     Global.PIC.EoiSlave();
 }