void PIC_Startup() { outb(PIC__IOPort__Master__Command, PIC__Command__ConfigMode | PIC__Command__Initialize); IOWAIT(); outb(PIC__IOPort__Slave__Command, PIC__Command__ConfigMode | PIC__Command__Initialize); IOWAIT(); outb(PIC__IOPort__Master__Data, IDT__IRQ__RemappedBase); IOWAIT(); outb(PIC__IOPort__Slave__Data, IDT__IRQ__RemappedBase + 0x08); IOWAIT(); outb(PIC__IOPort__Master__Data, PIC__Line__MasterToSlave); IOWAIT(); outb(PIC__IOPort__Slave__Data, PIC__Line__SlaveToMaster); IOWAIT(); outb(PIC__IOPort__Master__Data, PIC__Mode__Microprocessor8086); IOWAIT(); outb(PIC__IOPort__Slave__Data, PIC__Mode__Microprocessor8086); IOWAIT(); outb(PIC__IOPort__Master__Data, 0x00); IOWAIT(); outb(PIC__IOPort__Slave__Data, 0x00); IOWAIT(); }
void Console_AsyncEntryPoint() { while(TRUE) { Atomic_AquireLock(&gConsoleQueueTopLock); if (TopEntry) { Atomic_ReleaseLock(&gConsoleQueueTopLock); char* iterator = TopEntry->strToWrite; bool_t useLength = TopEntry->strLength > 0; while (*iterator) { Console_WriteCharacter(*iterator); ++iterator; if (useLength) { --TopEntry->strLength; if (TopEntry->strLength == 0) break; } } Atomic_AquireLock(&gConsoleQueueTopLock); ConsoleWriteEntry* nEtry = TopEntry; TopEntry = TopEntry->NextEntry; Atomic_ReleaseLock(&gConsoleQueueTopLock); free(nEtry->strToWrite); free(nEtry); } else { Atomic_ReleaseLock(&gConsoleQueueTopLock); IOWAIT(); IOWAIT(); IOWAIT(); IOWAIT(); IOWAIT(); IOWAIT(); IOWAIT(); } } }
void IDT_WaitForInterrupt(UINT8 pInterrupt) { while (gIDTWaiting[pInterrupt]) IOWAIT(); }