fb:porticula NoPaste
core_irq.bi
Uploader: | ThePuppetMaster |
Datum/Zeit: | 26.08.2008 22:11:40 |
'###############################################################################################################
'###############################################################################################################
'### F B - C O R E
'###############################################################################################################
'###############################################################################################################
'### Version: 1.00.0
'### Revision: 0
'###############################################################################################################
'### (c) 2008 By.: /_\ DeltaLab's Germany [experimental computing]
'### Autor: Martin Wiemann
'### Date of Idea: 2008.08.16 - 17:55:38
'###############################################################################################################
'### Copy('s) of this code or a part of this IS allowed!!!
'###############################################################################################################
'###############################################################################################################
Dim Shared G_IRQ_Calls(16) as Any Ptr
'###############################################################################################################
Declare Sub _irq0()
Declare Sub _irq1()
Declare Sub _irq2()
Declare Sub _irq3()
Declare Sub _irq4()
Declare Sub _irq5()
Declare Sub _irq6()
Declare Sub _irq7()
Declare Sub _irq8()
Declare Sub _irq9()
Declare Sub _irq10()
Declare Sub _irq11()
Declare Sub _irq12()
Declare Sub _irq13()
Declare Sub _irq14()
Declare Sub _irq15()
Declare Sub IRQ_Handler(V_Fault as ISR_Info_Type)
'###############################################################################################################
Private Function IRQ_SetCallback(V_IRQID as UByte, V_CallbackPtr as Any Ptr) as Integer
If V_IRQID > 15 Then Return GURU_IRQ_IRQID_OutOfRange
If G_IRQ_Calls(V_IRQID) <> 0 Then Return GURU_IRQ_IRQID_CallbackAlrightInstalled
G_IRQ_Calls(V_IRQID) = V_CallbackPtr
Return GURU_NoError
End Function
'--------------------------------------------------------------------------------------------------------------------
Private Function IRQ_UnSetCallback(V_IRQID as UByte) as Integer
If V_IRQID > 15 Then Return GURU_IRQ_IRQID_OutOfRange
If G_IRQ_Calls(V_IRQID) = 0 Then Return GURU_IRQ_IRQID_NoCallbackInstalled
G_IRQ_Calls(V_IRQID) = 0
Return GURU_NoError
End Function
'###############################################################################################################
Private Sub IRQ_Init()
outb(&H20, &H11)
outb(&HA0, &H11)
outb(&H21, &H20)
outb(&HA1, &H28)
outb(&H21, &H04)
outb(&HA1, &H02)
outb(&H21, &H01)
outb(&HA1, &H01)
outb(&H21, &H0)
outb(&HA1, &H0)
Dim XSeg as UShort = &H08
Dim XFlag as UByte = &H8E
IDT(32) = IDT_Create_New(32, @_irq0, XSeg, XFlag)
IDT(33) = IDT_Create_New(33, @_irq1, XSeg, XFlag)
IDT(34) = IDT_Create_New(34, @_irq2, XSeg, XFlag)
IDT(35) = IDT_Create_New(35, @_irq3, XSeg, XFlag)
IDT(36) = IDT_Create_New(36, @_irq4, XSeg, XFlag)
IDT(37) = IDT_Create_New(37, @_irq5, XSeg, XFlag)
IDT(38) = IDT_Create_New(38, @_irq6, XSeg, XFlag)
IDT(39) = IDT_Create_New(39, @_irq7, XSeg, XFlag)
IDT(40) = IDT_Create_New(40, @_irq8, XSeg, XFlag)
IDT(41) = IDT_Create_New(41, @_irq9, XSeg, XFlag)
IDT(42) = IDT_Create_New(42, @_irq10, XSeg, XFlag)
IDT(43) = IDT_Create_New(43, @_irq11, XSeg, XFlag)
IDT(44) = IDT_Create_New(44, @_irq12, XSeg, XFlag)
IDT(45) = IDT_Create_New(45, @_irq13, XSeg, XFlag)
IDT(46) = IDT_Create_New(46, @_irq14, XSeg, XFlag)
IDT(47) = IDT_Create_New(47, @_irq15, XSeg, XFlag)
Asm
cli
lidt [IDT_Selector]
End Asm
End Sub
'###############################################################################################################
Public Sub IRQ_Handler(V_Info as ISR_Info_Type)
If G_IRQ_Calls(V_Info.V_int_no - 32) <> 0 Then
Dim XHandler as Sub ()
XHandler = G_IRQ_Calls(V_Info.V_int_no - 32)
XHandler()
Else: Core_GURU_Error(V_Info.V_int_no, "IRQ_HANDLER", "IRQ-RAISED", "No function callback installed", 1)
End If
If V_Info.V_int_no >= 40 Then Outb(&HA0, &H20)
Outb(&H20, &H20)
End Sub