📄 initcode.inc
字号:
;=============================================================================
; InitIDT
; First, inits the IDT with 256 entries to a generic
; handler that does nothing (except IRETD) when called.
; Second, adds each of the basic IDT entries for included
; software and hardware interrupt handlers.
; ISRs loaded with device drivers must use SetIRQVector.
;
; IN : Nothing
; Out : Nothing
; Used : ALL registers and flags
;
InitIDT:
MOV ECX, 255 ;Last IDT Entry
InitID01:
PUSH ECX
MOV EAX, 08F00h ;DPL 3, TRAP GATE
MOV EBX, OSCodeSel
MOV ESI, OFFSET IntQ
CALL FAR PTR _AddIDTGate
POP ECX
LOOP InitID01
;Now we add each of the known interrupts
MOV ECX, 0 ;Divide By Zero
MOV EAX, 08F00h ;DPL 3, TRAP GATE
MOV EBX, OSCodeSel ;
MOV ESI, OFFSET IntDivBy0
CALL FAR PTR _AddIDTGate
MOV ECX, 1 ;Single Step
MOV EAX, 08F00h ;DPL 3, Trap gate
MOV EBX, OSCodeSel ;
MOV ESI, Offset IntDbgSS
CALL FAR PTR _AddIDTGate
;Trying 8E00 (Int gate vice trap gate which leave Ints disabled)
MOV ECX, 3 ;Breakpoint
MOV EAX, 08E00h ;DPL 3, Trap Gate (for Debugger) WAS 8F00
MOV EBX, OSCodeSel ;This will be filled in with TSS of Dbgr later
MOV ESI, OFFSET IntDebug
CALL FAR PTR _AddIDTGate
MOV ECX, 4 ;Overflow
MOV EAX, 08F00h ;DPL 3, TRAP GATE
MOV EBX, OSCodeSel ;
MOV ESI, OFFSET IntOverFlow
CALL FAR PTR _AddIDTGate
MOV ECX, 6 ;Invalid OPcode
MOV EAX, 08F00h ;DPL 3, TRAP GATE
MOV EBX, OSCodeSel ;
MOV ESI, OFFSET IntOpCode
CALL FAR PTR _AddIDTGate
MOV ECX, 8 ;Double Exception
MOV EAX, 08F00h ;DPL 3, TRAP GATE
MOV EBX, OSCodeSel ;
MOV ESI, OFFSET IntDblExc
CALL FAR PTR _AddIDTGate
MOV ECX, 0Ah ;Invalid TSS
MOV EAX, 08F00h ;DPL 3, TRAP GATE
MOV EBX, OSCodeSel ;
MOV ESI, OFFSET IntInvTSS
CALL FAR PTR _AddIDTGate
MOV ECX, 0Bh ;Seg Not Present
MOV EAX, 08F00h ;DPL 3, TRAP GATE
MOV EBX, OSCodeSel ;
MOV ESI, OFFSET IntNoSeg
CALL FAR PTR _AddIDTGate
MOV ECX, 0Ch ;Int Stack Overflow
MOV EAX, 08F00h ;DPL 3, TRAP GATE
MOV EBX, OSCodeSel ;
MOV ESI, OFFSET IntStkOvr
CALL FAR PTR _AddIDTGate
MOV ECX, 0Dh ;GP fault
MOV EAX, 08F00h ;DPL 3, TRAP GATE
MOV EBX, OSCodeSel ;
MOV ESI, OFFSET IntGP
CALL FAR PTR _AddIDTGate
MOV ECX, 0Eh ;Int Page Fault
MOV EAX, 08F00h ;DPL 3, TRAP GATE
MOV EBX, OSCodeSel ;
MOV ESI, OFFSET IntPgFlt
CALL FAR PTR _AddIDTGate
MOV ECX, 20h ;Int TIMER IRQ0
MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
MOV EBX, OSCodeSel ;
MOV ESI, OFFSET IntTimer
CALL FAR PTR _AddIDTGate
MOV ECX, 21h ;Int KEYBOARD IRQ1
MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
MOV EBX, OSCodeSel ;
MOV ESI, OFFSET IntKeyBrd
CALL FAR PTR _AddIDTGate
MOV ECX, 22h ;Int PICU 2 (from PICU) IRQ2
MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
MOV EBX, OSCodeSel ;
MOV ESI, OFFSET IntPICU2
CALL FAR PTR _AddIDTGate
MOV ECX, 23h ;Int COMM1 IRQ3
MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
MOV EBX, OSCodeSel ;
MOV ESI, OFFSET IntQ
CALL FAR PTR _AddIDTGate
MOV ECX, 24h ;Int COMM2 IRQ4
MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
MOV EBX, OSCodeSel ;
MOV ESI, OFFSET IntQ
CALL FAR PTR _AddIDTGate
MOV ECX, 25h ;Int LPT2 IRQ5
MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
MOV EBX, OSCodeSel ;
MOV ESI, OFFSET IntQ
CALL FAR PTR _AddIDTGate
MOV ECX, 26h ;Int Floppy IRQ6
MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
MOV EBX, OSCodeSel ;
MOV ESI, OFFSET IntQ ;FDD will set this himself
CALL FAR PTR _AddIDTGate
MOV ECX, 27h ;Int .......... IRQ7
MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
MOV EBX, OSCodeSel ;
MOV ESI, OFFSET IntQ
CALL FAR PTR _AddIDTGate
MOV ECX, 28h ;Int .......... IRQ8
MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
MOV EBX, OSCodeSel ;
MOV ESI, OFFSET IntQ
CALL FAR PTR _AddIDTGate
MOV ECX, 29h ;Int .......... IRQ9
MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
MOV EBX, OSCodeSel ;
MOV ESI, OFFSET IntQ
CALL FAR PTR _AddIDTGate
MOV ECX, 2Ah ;Int .......... IRQ10
MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
MOV EBX, OSCodeSel ;
MOV ESI, OFFSET IntQ
CALL FAR PTR _AddIDTGate
MOV ECX, 2Bh ;Int .......... IRQ11
MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
MOV EBX, OSCodeSel ;
MOV ESI, OFFSET IntQ
CALL FAR PTR _AddIDTGate
MOV ECX, 2Ch ;Int .......... IRQ12
MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
MOV EBX, OSCodeSel ;
MOV ESI, OFFSET IntQ
CALL FAR PTR _AddIDTGate
MOV ECX, 2Dh ;Int .......... IRQ13
MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
MOV EBX, OSCodeSel ;
MOV ESI, OFFSET IntQ
CALL FAR PTR _AddIDTGate
MOV ECX, 2Eh ;Int .......... IRQ14
MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
MOV EBX, OSCodeSel ;
MOV ESI, OFFSET IntQ
CALL FAR PTR _AddIDTGate
MOV ECX, 2Fh ;Int .......... IRQ15
MOV EAX, 08E00h ;DPL 3, INTERRUPT GATE
MOV EBX, OSCodeSel ;
MOV ESI, OFFSET IntQ
CALL FAR PTR _AddIDTGate
RETN
;=============================================================================
; InitOSPublics adds all OS primitives to the array of call gates. This can't
; before initcallgates, but MUST be called before the first far call to any
; OS primitive thorugh a call gate!!!
; IF YOU ADD AN OS PUBLIC MAKE SURE IT GETS PUT HERE!!!!!
;
; IN : Nothing
; Out : Nothing
; Used : ALL registers and flags
;
InitOSPublics PROC NEAR
MOV EAX, 0EC02h ;WaitMsg -- 2 DWord Params, DPL 3
MOV ECX, 40h
MOV DX, OSCodeSel
MOV ESI, OFFSET _WaitMsg
CALL FAR PTR _AddCallGate
MOV EAX, 0EC03h ;SendMsg -- 3 DWord Params, DPL 3
MOV ECX, 48h
MOV DX, OSCodeSel
MOV ESI, OFFSET _SendMsg
CALL FAR PTR _AddCallGate
MOV EAX, 08C03h ;ISendMsg -- 3 DWord params, DPL 0
MOV ECX, 50h
MOV DX, OSCodeSel
MOV ESI, OFFSET _ISendMsg
CALL FAR PTR _AddCallGate
; MOV EAX, 08C03h ;Reserved (was FSendMsg -- 3 DWord params, DPL 1)
; MOV ECX, 58h
; MOV DX, OSCodeSel
; MOV ESI, OFFSET _FSend
; CALL FAR PTR _AddCallGate
MOV EAX, 0EC0Ch ;Request -- 12 nDWord params
MOV ECX, 60h
MOV DX, OSCodeSel
MOV ESI, OFFSET _Request
CALL FAR PTR _AddCallGate
MOV EAX, 0EC02h ;Respond -- 2 nDWord params
MOV ECX, 68h
MOV DX, OSCodeSel
MOV ESI, OFFSET _Respond
CALL FAR PTR _AddCallGate
MOV EAX, 0EC02h ;Check -- 2 DWord Params, DPL 3
MOV ECX, 70h
MOV DX, OSCodeSel
MOV ESI, OFFSET _CheckMsg
CALL FAR PTR _AddCallGate
MOV EAX, 0EC07h ;NewTask -- 7 DWord param, DPL 3
MOV ECX, 78h
MOV DX, OSCodeSel
MOV ESI, OFFSET _NewTask
CALL FAR PTR _AddCallGate
MOV EAX, 0EC01h ;AllocExch -- 1 DWord param, DPL 3
MOV ECX, 80h
MOV DX, OSCodeSel
MOV ESI, OFFSET _AllocExch
CALL FAR PTR _AddCallGate
MOV EAX, 0EC01h ;DeAllocExch -- 1 DWord param, DPL 3
MOV ECX, 88h
MOV DX, OSCodeSel
MOV ESI, OFFSET _DeAllocExch
CALL FAR PTR _AddCallGate
MOV EAX, 0EC01h ;Sleep -- 1 DWord param, DPL 3
MOV ECX, 90h
MOV DX, OSCodeSel
MOV ESI, OFFSET _Sleep
CALL FAR PTR _AddCallGate
MOV EAX, 0EC02h ;Alarm -- 2 DWord params, DPL 3
MOV ECX, 98h
MOV DX, OSCodeSel
MOV ESI, OFFSET _Alarm
CALL FAR PTR _AddCallGate
MOV EAX, 0EC02h ;AllocOSPage -- 2 DWord params, DPL 3
MOV ECX, 0A0h
MOV DX, OSCodeSel
MOV ESI, OFFSET _AllocOSPage
CALL FAR PTR _AddCallGate
MOV EAX, 0EC02h ;AllocPage -- 2 DWord params, DPL 3
MOV ECX, 0A8h
MOV DX, OSCodeSel
MOV ESI, OFFSET _AllocPage
CALL FAR PTR _AddCallGate
MOV EAX, 0EC02h ;RegisterSvc -- 2 DWord params, DPL 3
MOV ECX, 0B0h
MOV DX, OSCodeSel
MOV ESI, OFFSET _RegisterSvc
CALL FAR PTR _AddCallGate
MOV EAX, 08C05h ;DMASetUp -- 5 DWord Params DPL 0
MOV ECX, 0B8h
MOV DX, OSCodeSel
MOV ESI, OFFSET _DMASetUp
CALL FAR PTR _AddCallGate
MOV EAX, 0EC02h ;ReadKBD -- 2 DWord Param DPL 3
MOV ECX, 0C0h
MOV DX, OSCodeSel
MOV ESI, OFFSET _ReadKBD
CALL FAR PTR _AddCallGate
MOV EAX, 08C00h ;AddCallGate -- 0 DWord Params DPL 0
MOV ECX, 0C8h
MOV DX, OSCodeSel
MOV ESI, OFFSET _AddCallGate
CALL FAR PTR _AddCallGate
MOV EAX, 08C00h ;AddIDTGate -- 0 DWord Params DPL 0
MOV ECX, 0D0h
MOV DX, OSCodeSel
MOV ESI, OFFSET _AddIDTGate
CALL FAR PTR _AddCallGate
MOV EAX, 08C01h ;EndOfIRQ -- 1 DWord Params DPL 0
MOV ECX, 0D8h
MOV DX, OSCodeSel
MOV ESI, OFFSET _EndOfIRQ
CALL FAR PTR _AddCallGate
MOV EAX, 08C01h ;MaskIRQ -- 1 DWord Params DPL 0
MOV ECX, 0E0h
MOV DX, OSCodeSel
MOV ESI, OFFSET _MaskIRQ
CALL FAR PTR _AddCallGate
MOV EAX, 08C01h ;UnMaskIRQ -- 1 DWord Params DPL 0
MOV ECX, 0E8h
MOV DX, OSCodeSel
MOV ESI, OFFSET _UnMaskIRQ
CALL FAR PTR _AddCallGate
MOV EAX, 08C02h ;SetIRQVector -- 2 DWord Params DPL 0
MOV ECX, 0F0h
MOV DX, OSCodeSel
MOV ESI, OFFSET _SetIRQVector
CALL FAR PTR _AddCallGate
MOV EAX, 08C02h ;GetIRQVector -- 2 DWord Params DPL 0
MOV ECX, 0F8h
MOV DX, OSCodeSel
MOV ESI, OFFSET _GetIRQVector
CALL FAR PTR _AddCallGate
MOV EAX, 08C04h ;InitDevDr -- 4 DWord Params DPL 0
MOV ECX, 100h
MOV DX, OSCodeSel
MOV ESI, OFFSET _InitDevDr
CALL FAR PTR _AddCallGate
MOV EAX, 0EC03h ;DeviceInit -- 3 DWord Params DPL 3
MOV ECX, 108h
MOV DX, OSCodeSel
MOV ESI, OFFSET _DeviceInit
CALL FAR PTR _AddCallGate
MOV EAX, 0EC05h ;DeviceOp -- 5 DWord Params DPL 3
MOV ECX, 110h
MOV DX, OSCodeSel
MOV ESI, OFFSET _DeviceOp
CALL FAR PTR _AddCallGate
MOV EAX, 0EC04h ;DeviceStat -- 4 DWord Params DPL 3
MOV ECX, 118h
MOV DX, OSCodeSel
MOV ESI, OFFSET _DeviceStat
CALL FAR PTR _AddCallGate
MOV EAX, 0EC00h ;Beep -- 0 DWord Params DPL 3
MOV ECX, 120h
MOV DX, OSCodeSel
MOV ESI, OFFSET _Beep
CALL FAR PTR _AddCallGate
MOV EAX, 0EC02h ;Tone -- 2 DWord Params DPL 3
MOV ECX, 128h
MOV DX, OSCodeSel
MOV ESI, OFFSET _Tone
CALL FAR PTR _AddCallGate
MOV EAX, 0EC01h ;KillAlarm -- 1 DWord Params DPL 3
MOV ECX, 130h
MOV DX, OSCodeSel
MOV ESI, OFFSET _KillAlarm
CALL FAR PTR _AddCallGate
MOV EAX, 0EC01h ;MicroDelay -- 1 DWord Params DPL 3
MOV ECX, 138h
MOV DX, OSCodeSel
MOV ESI, OFFSET _MicroDelay
CALL FAR PTR _AddCallGate
MOV EAX, 0EC05h ;SpawnTask -- 5 DWord param, DPL 3
MOV ECX, 140h
MOV DX, OSCodeSel
MOV ESI, OFFSET _SpawnTask
CALL FAR PTR _AddCallGate
MOV EAX, 0EC01h ;GetCMOSTime -- 1 DWord param, DPL 3
MOV ECX, 148h
MOV DX, OSCodeSel
MOV ESI, OFFSET _GetCMOSTime
CALL FAR PTR _AddCallGate
MOV EAX, 0EC01h ;GetTimerTick -- 1 DWord param, DPL 3
MOV ECX, 150h
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -