From 00869bcdc120d5975fa45c6e1ba349bb7a4c85c8 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Mon, 30 Apr 2012 17:23:43 +0200 Subject: [PATCH] The PIC can now be deprogrammed and reprogrammed. --- sortix/interrupt.cpp | 45 ++++++++++++++++++++++++++++++++------------ sortix/time.cpp | 6 +++--- 2 files changed, 36 insertions(+), 15 deletions(-) diff --git a/sortix/interrupt.cpp b/sortix/interrupt.cpp index 00a419ac..3bb01d81 100644 --- a/sortix/interrupt.cpp +++ b/sortix/interrupt.cpp @@ -87,6 +87,38 @@ const unsigned NUM_INTERRUPTS = 256UL; Handler interrupthandlers[NUM_INTERRUPTS]; void* interrupthandlerptr[NUM_INTERRUPTS]; +extern "C" void ReprogramPIC() +{ + uint8_t mastermask = 0; + uint8_t slavemask = 0; + CPU::OutPortB(PIC_MASTER + PIC_COMMAND, PIC_CMD_INIT | PIC_ICW1_ICW4); + CPU::OutPortB(PIC_SLAVE + PIC_COMMAND, PIC_CMD_INIT | PIC_ICW1_ICW4); + CPU::OutPortB(PIC_MASTER + PIC_DATA, IRQ0); + CPU::OutPortB(PIC_SLAVE + PIC_DATA, IRQ8); + CPU::OutPortB(PIC_MASTER + PIC_DATA, 0x04); // Slave PIC at IRQ2 + CPU::OutPortB(PIC_SLAVE + PIC_DATA, 0x02); // Cascade Identity + CPU::OutPortB(PIC_MASTER + PIC_DATA, PIC_MODE_8086); + CPU::OutPortB(PIC_SLAVE + PIC_DATA, PIC_MODE_8086); + CPU::OutPortB(PIC_MASTER + PIC_DATA, mastermask); + CPU::OutPortB(PIC_SLAVE + PIC_DATA, slavemask); +} + +extern "C" void DeprogramPIC() +{ + uint8_t mastermask = 0; + uint8_t slavemask = 0; + CPU::OutPortB(PIC_MASTER + PIC_COMMAND, PIC_CMD_INIT | PIC_ICW1_ICW4); + CPU::OutPortB(PIC_SLAVE + PIC_COMMAND, PIC_CMD_INIT | PIC_ICW1_ICW4); + CPU::OutPortB(PIC_MASTER + PIC_DATA, 0x08); + CPU::OutPortB(PIC_SLAVE + PIC_DATA, 0x70); + CPU::OutPortB(PIC_MASTER + PIC_DATA, 0x04); // Slave PIC at IRQ2 + CPU::OutPortB(PIC_SLAVE + PIC_DATA, 0x02); // Cascade Identity + CPU::OutPortB(PIC_MASTER + PIC_DATA, PIC_MODE_8086); + CPU::OutPortB(PIC_SLAVE + PIC_DATA, PIC_MODE_8086); + CPU::OutPortB(PIC_MASTER + PIC_DATA, mastermask); + CPU::OutPortB(PIC_SLAVE + PIC_DATA, slavemask); +} + void Init() { initialized = false; @@ -100,18 +132,7 @@ void Init() } // Remap the IRQ table on the PICs. - uint8_t mastermask = 0; - uint8_t slavemask = 0; - CPU::OutPortB(PIC_MASTER + PIC_COMMAND, PIC_CMD_INIT | PIC_ICW1_ICW4); - CPU::OutPortB(PIC_SLAVE + PIC_COMMAND, PIC_CMD_INIT | PIC_ICW1_ICW4); - CPU::OutPortB(PIC_MASTER + PIC_DATA, IRQ0); - CPU::OutPortB(PIC_SLAVE + PIC_DATA, IRQ8); - CPU::OutPortB(PIC_MASTER + PIC_DATA, 0x04); // Slave PIC at IRQ2 - CPU::OutPortB(PIC_SLAVE + PIC_DATA, 0x02); // Cascade Identity - CPU::OutPortB(PIC_MASTER + PIC_DATA, PIC_MODE_8086); - CPU::OutPortB(PIC_SLAVE + PIC_DATA, PIC_MODE_8086); - CPU::OutPortB(PIC_MASTER + PIC_DATA, mastermask); - CPU::OutPortB(PIC_SLAVE + PIC_DATA, slavemask); + ReprogramPIC(); RegisterRawHandler(0, isr0, false); RegisterRawHandler(1, isr1, false); diff --git a/sortix/time.cpp b/sortix/time.cpp index cd4c86e5..15707af6 100644 --- a/sortix/time.cpp +++ b/sortix/time.cpp @@ -54,7 +54,7 @@ namespace Sortix return microsecondssinceboot; } - void RequestIQR0() + extern "C" void RequestIRQ0() { // The value we send to the PIT is the value to divide it's input clock // (1193180 Hz) by, to get our required frequency. Important to note is @@ -95,7 +95,7 @@ namespace Sortix didUglyIRQ0Hack = false; - RequestIQR0(); + RequestIRQ0(); } void OnIRQ0(CPU::InterruptRegisters* Regs, void* /*user*/) @@ -114,7 +114,7 @@ namespace Sortix // TODO: There is a horrible bug that causes Sortix to only receive // one IRQ0 on my laptop, but it works in virtual machines. But // re-requesting an addtional time seems to work. Hacky and ugly. - if ( !didUglyIRQ0Hack ) { RequestIQR0(); didUglyIRQ0Hack = true; } + if ( !didUglyIRQ0Hack ) { RequestIRQ0(); didUglyIRQ0Hack = true; } } // TODO: Implement all the other useful functions regarding time.