mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-24 12:35:31 +00:00
This commit is contained in:
parent
34aa9c7186
commit
a71d09ee27
4 changed files with 30 additions and 32 deletions
|
|
@ -12,6 +12,9 @@ namespace Cosmos.Core {
|
||||||
static internal PciBus PciBus;
|
static internal PciBus PciBus;
|
||||||
|
|
||||||
static public void Init() {
|
static public void Init() {
|
||||||
|
// Drag this stuff in to the compiler manually until we add the always include attrib
|
||||||
|
INTs.Dummy();
|
||||||
|
|
||||||
CPU = new CPU();
|
CPU = new CPU();
|
||||||
|
|
||||||
CPU.CreateGDT();
|
CPU.CreateGDT();
|
||||||
|
|
@ -19,9 +22,6 @@ namespace Cosmos.Core {
|
||||||
CPU.CreateIDT(true);
|
CPU.CreateIDT(true);
|
||||||
CPU.InitFloat();
|
CPU.InitFloat();
|
||||||
|
|
||||||
// Drag this stuff in to the compiler manually until we add the always include attrib
|
|
||||||
INTs.Dummy();
|
|
||||||
|
|
||||||
//Init Heap first - Hardware loads devices and they need heap
|
//Init Heap first - Hardware loads devices and they need heap
|
||||||
// drag in the heap:
|
// drag in the heap:
|
||||||
Heap.Initialize();
|
Heap.Initialize();
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ namespace Cosmos.Core {
|
||||||
protected IOGroup.PIC Slave = new IOGroup.PIC(true);
|
protected IOGroup.PIC Slave = new IOGroup.PIC(true);
|
||||||
|
|
||||||
protected enum Cmd {
|
protected enum Cmd {
|
||||||
Init = 0x11,
|
Init = 0x10,
|
||||||
EOI = 0x20
|
EOI = 0x20
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -29,50 +29,45 @@ namespace Cosmos.Core {
|
||||||
}
|
}
|
||||||
|
|
||||||
public PIC() {
|
public PIC() {
|
||||||
Init(Master, 0x20, 4);
|
// MTW: to disable PIT, send 0x01 to Master mask
|
||||||
Init(Slave, 0x28, 2);
|
Init(Master, 0x20, 4, 0xFF);
|
||||||
|
Init(Slave, 0x28, 2, 0xFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void Init(IOGroup.PIC aPIC, byte aBase, byte aIDunno){
|
protected void Init(IOGroup.PIC aPIC, byte aBase, byte aIDunno, byte aMask){
|
||||||
// We need to remap the PIC interrupt lines to the CPU. The BIOS sets
|
// We need to remap the PIC interrupt lines to the CPU. The BIOS sets
|
||||||
// them in a way compatible for 16 bit mode, but in a way that causes problems
|
// them in a way compatible for 16 bit mode, but in a way that causes problems
|
||||||
// for 32 bit mode.
|
// for 32 bit mode.
|
||||||
// The only way to remap them however is to completely reinitialize the PICs.
|
// The only way to remap them however is to completely reinitialize the PICs.
|
||||||
|
|
||||||
|
byte xOldMask = Master.Data.Byte;
|
||||||
|
|
||||||
//#define ICW1_ICW4 0x01 /* ICW4 (not) needed */
|
//#define ICW1_ICW4 0x01 /* ICW4 (not) needed */
|
||||||
//#define ICW1_SINGLE 0x02 /* Single (cascade) mode */
|
//#define ICW1_SINGLE 0x02 /* Single (cascade) mode */
|
||||||
//#define ICW1_INTERVAL4 0x04 /* Call address interval 4 (8) */
|
//#define ICW1_INTERVAL4 0x04 /* Call address interval 4 (8) */
|
||||||
//#define ICW1_LEVEL 0x08 /* Level triggered (edge) mode */
|
//#define ICW1_LEVEL 0x08 /* Level triggered (edge) mode */
|
||||||
//#define ICW1_INIT 0x10 /* Initialization - required! */
|
Master.Cmd.Byte = (byte)Cmd.Init | 0x01;
|
||||||
|
IOPort.Wait();
|
||||||
|
|
||||||
|
// ICW2
|
||||||
|
Master.Data.Byte = aBase;
|
||||||
|
IOPort.Wait();
|
||||||
|
|
||||||
|
// ICW3
|
||||||
|
// Somehow tells them about master/slave relationship
|
||||||
|
Master.Data.Byte = aIDunno;
|
||||||
|
IOPort.Wait();
|
||||||
|
|
||||||
//#define ICW4_8086 0x01 /* 8086/88 (MCS-80/85) mode */
|
|
||||||
//#define ICW4_AUTO 0x02 /* Auto (normal) EOI */
|
//#define ICW4_AUTO 0x02 /* Auto (normal) EOI */
|
||||||
//#define ICW4_BUF_SLAVE 0x08 /* Buffered mode/slave */
|
//#define ICW4_BUF_SLAVE 0x08 /* Buffered mode/slave */
|
||||||
//#define ICW4_BUF_MASTER 0x0C /* Buffered mode/master */
|
//#define ICW4_BUF_MASTER 0x0C /* Buffered mode/master */
|
||||||
//#define ICW4_SFNM 0x10 /* Special fully nested (not) */
|
//#define ICW4_SFNM 0x10 /* Special fully nested (not) */
|
||||||
|
//0x01 8086/88 (MCS-80/85) mode
|
||||||
byte xOldMask = Master.Data.Byte;
|
|
||||||
|
|
||||||
// outb(PIC1_COMMAND, ICW1_INIT+ICW1_ICW4); // starts the initialization sequence
|
|
||||||
Master.Cmd.Byte = (byte)Cmd.Init | 0x01;
|
|
||||||
IOPort.Wait();
|
|
||||||
|
|
||||||
Master.Data.Byte = aBase;
|
|
||||||
IOPort.Wait();
|
|
||||||
|
|
||||||
Master.Data.Byte = aIDunno;
|
|
||||||
IOPort.Wait();
|
|
||||||
|
|
||||||
// 8086/88 (MCS-80/85) mode
|
|
||||||
Master.Data.Byte = 0x01;
|
Master.Data.Byte = 0x01;
|
||||||
IOPort.Wait();
|
IOPort.Wait();
|
||||||
|
|
||||||
//// Masks - 0 = receive all IRQ's
|
// Set mask
|
||||||
//// MTW: to disable PIT, send 0x01 to DataPort1
|
Master.Data.Byte = aMask;
|
||||||
//IO.PortData1.Byte = 0x01;
|
|
||||||
//IO.PortData2.Byte = 0x00;
|
|
||||||
// Restore saved masks.
|
|
||||||
Master.Data.Byte = xOldMask;
|
|
||||||
IOPort.Wait();
|
IOPort.Wait();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,10 @@
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<a href="http://wiki.osdev.org/PIC">http://wiki.osdev.org/PIC</a></p>
|
<a href="http://wiki.osdev.org/PIC">http://wiki.osdev.org/PIC</a><br />
|
||||||
|
<a href="http://wiki.osdev.org/I_Cant_Get_Interrupts_Working">
|
||||||
|
http://wiki.osdev.org/I_Cant_Get_Interrupts_Working</a><br />
|
||||||
|
</p>
|
||||||
<p>
|
<p>
|
||||||
APIC<br />
|
APIC<br />
|
||||||
<a href="http://wiki.osdev.org/APIC">http://wiki.osdev.org/APIC</a><br />
|
<a href="http://wiki.osdev.org/APIC">http://wiki.osdev.org/APIC</a><br />
|
||||||
|
|
|
||||||
|
|
@ -18,11 +18,11 @@
|
||||||
<Framework>MicrosoftNET</Framework>
|
<Framework>MicrosoftNET</Framework>
|
||||||
<UseInternalAssembler>False</UseInternalAssembler>
|
<UseInternalAssembler>False</UseInternalAssembler>
|
||||||
<DebugMode>Source</DebugMode>
|
<DebugMode>Source</DebugMode>
|
||||||
<EnableGDB>False</EnableGDB>
|
<EnableGDB>True</EnableGDB>
|
||||||
<TraceMode>
|
<TraceMode>
|
||||||
</TraceMode>
|
</TraceMode>
|
||||||
<VMWareFlavor>Workstation</VMWareFlavor>
|
<VMWareFlavor>Workstation</VMWareFlavor>
|
||||||
<StartCosmosGDB>False</StartCosmosGDB>
|
<StartCosmosGDB>True</StartCosmosGDB>
|
||||||
<TraceAssemblies>Cosmos</TraceAssemblies>
|
<TraceAssemblies>Cosmos</TraceAssemblies>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue