public static unsafe Thread CreateTask(uint xLoc, bool isRunning) { Native.ClearInterrupt(); uint *stack; Task *task = (Task *)(Heap.AllocateMem((uint)sizeof(Task))); task->Stack = Heap.AllocateMem(0x1000) + 0x1000;//Put pointer at end stack = (uint *)task->Stack; // Expand down stack // processor data *--stack = 0x202; // EFLAGS *--stack = 0x08; // CS *--stack = xLoc; // EIP // pusha *--stack = 0; // EDI *--stack = 0; // ESI *--stack = 0; // EBP *--stack = 0; // ESP *--stack = 0; // EBX *--stack = 0; // EDX *--stack = 0; // ECX *--stack = 0; // EAX // data segments *--stack = 0x10; // DS *--stack = 0x10; // ES *--stack = 0x10; // FS *--stack = 0x10; // GS task->Stack = (uint)stack; task->Address = (uint *)xLoc; task->state = (byte)(isRunning ? State.Alive : State.None); mTasks[Counter++] = *task; if (isRunning) { RunningTasks.Enqueue(Counter - 1); } Native.SetInterrupt(); return(new Thread(Counter - 1)); }