$PJ,"Project: OSMain","/LT/OSMain/OS.SPZ"$
IRQ_VECTORS::
             DU4 IRQ00,IRQ01,IRQ02,IRQ03;
             DU4 IRQ04,IRQ05,IRQ06,IRQ07;
             DU4 IRQ08,IRQ09,IRQ0A,IRQ0B;
             DU4 IRQ0C,IRQ0D,IRQ0E,IRQ0F;

             DU4 IRQ10,IRQ11,IRQ12,IRQ13;
             DU4 IRQ14,IRQ15,IRQ16,IRQ17;
             DU4 IRQ18,IRQ19,IRQ1A,IRQ1B;
             DU4 IRQ1C,IRQ1D,IRQ1E,IRQ1F;

             DU4 IRQ20,IRQ21,IRQ22,IRQ23;
             DU4 IRQ24,IRQ25,IRQ26,IRQ27;
             DU4 IRQ28,IRQ29,IRQ2A,IRQ2B;
             DU4 IRQ2C,IRQ2D,IRQ2E,IRQ2F;

             DU4 IRQ30,IRQ31,IRQ32,IRQ33;
             DU4 IRQ34,IRQ35,IRQ36,IRQ37;
             DU4 IRQ38,IRQ39,IRQ3A,IRQ3B;
             DU4 IRQ3C,IRQ3D,IRQ3E,IRQ3F;

//Set $LK,"MAX_INITIAL_IDT","MN:MAX_INITIAL_IDT"$ if you add more

////***************** INTERRUPT ROUTINES ***************
IRQ00::        PUSH RDX
             XOR        EDX,EDX
             JMP        I4 IRQFAULT

IRQ01:        PUSH RDX
             MOV        RDX,1
             JMP        I4 IRQFAULT

HALT::
IRQ02:        //Halt
             XOR        ESI,ESI
             CALL        HALT_CPU

IRQ03:        PUSH RDX
             MOV        RDX,3
             JMP        I4 IRQFAULT

IRQ04:        PUSH RDX
             MOV        RDX,4
             JMP        I4 IRQFAULT

IRQ05:        PUSH RDX
             MOV        RDX,5
             JMP        I4 IRQFAULT

IRQ06:        PUSH RDX
             MOV        RDX,6
             JMP        I4 IRQFAULT

IRQ07:        PUSH RDX
             MOV        RDX,7
             JMP        I4 IRQFAULT

IRQ08:        PUSH RDX
             MOV        RDX,8
             JMP        I4 IRQFAULT

IRQ09:        PUSH RDX
             MOV        RDX,9
             JMP        I4 IRQFAULT

IRQ0A:        PUSH RDX
             MOV        RDX,0x0A
             JMP        I4 IRQFAULT

IRQ0B:        PUSH RDX
             MOV        RDX,0x0B
             JMP        I4 IRQFAULT

IRQ0C:        PUSH RDX
             MOV        RDX,0x0C
             JMP        I4 IRQFAULT

IRQ0D:        PUSH RDX
             MOV        RDX,0x0D
             JMP        I4 IRQFAULT

IRQ0E:        PUSH RDX
             MOV        RDX,0x0E
             JMP        I4 IRQFAULT

IRQ0F:        PUSH RDX
             MOV        RDX,0x0F
             JMP        I4 IRQFAULT

IRQ10:        PUSH RDX
             MOV        RDX,0x10
             JMP        I4 IRQFAULT

IRQ11:        PUSH RDX
             MOV        RDX,0x11
             JMP        I4 IRQFAULT

IRQ12:        PUSH RDX
             MOV        RDX,0x12
             JMP        I4 IRQFAULT

IRQ13:        PUSH RDX
             MOV        RDX,0x13
             JMP        I4 IRQFAULT

IRQ14:        PUSH RDX
             MOV        RDX,0x14
             JMP        I4 IRQFAULT

IRQ15:        PUSH RDX
             MOV        RDX,0x15
             JMP        I4 IRQFAULT

IRQ16:        PUSH RDX
             MOV        RDX,0x16
             JMP        I4 IRQFAULT

IRQ17:        PUSH RDX
             MOV        RDX,0x17
             JMP        I4 IRQFAULT

IRQ18:        PUSH RDX
             MOV        RDX,0x18
             JMP        I4 IRQFAULT

IRQ19:        PUSH RDX
             MOV        RDX,0x19
             JMP        I4 IRQFAULT

IRQ1A:        PUSH RDX
             MOV        RDX,0x1A
             JMP        I4 IRQFAULT

IRQ1B:        PUSH RDX
             MOV        RDX,0x1B
             JMP        I4 IRQFAULT

IRQ1C:        PUSH RDX
             MOV        RDX,0x1C
             JMP        I4 IRQFAULT

IRQ1D:        PUSH RDX
             MOV        RDX,0x1D
             JMP        I4 IRQFAULT

IRQ1E:        PUSH RDX
             MOV        RDX,0x1E
             JMP        I4 IRQFAULT

IRQ1F:        PUSH RDX
             MOV        RDX,0x1F
             JMP        I4 IRQFAULT

IRQ20:        CALL        SAVE_CONTEXT                //PREEMPTIVE
             XOR        ESI,ESI
             MOV        RSI,FS:TSS_ADDRESS[RSI]
             MOV        RBP,RSP
             MOV        RBX,U8 [RBP]
             MOV        U8 TSS_RIP[RSI],RBX
             MOV        RAX,U8 16[RBP]
             MOV        U8 TSS_RFLAGS[RSI],RAX
             MOV        RAX,U8 24[RBP]
             MOV        U8 TSS_RSP[RSI],RAX

             XOR        EAX,EAX
             MOV        RCX,U8 GS:CPU_CACHED_ADDRESS[RAX]
             MOV        RDI,U8 CPU_UNCACHED_ADDRESS[RCX]
             INC        U8 CPU_TOTAL_JIFFIES[RDI]

             BT        U8 TSS_TASK_FLAGS[RSI],TSSf_IDLE
             JC        @@1a
             CMP        RBX,U4 IDLE_START
             JB        @@1
             CMP        RBX,U4 IDLE_END
             JA        @@1
@@1a:        INC        U8 CPU_IDLE_POINT_HITS[RDI]

@@1:        MOV        RAX,U8 CPU_NUM[RCX]
             OR        RAX,RAX
             JZ        @@3
             XOR        EAX,EAX
             MOV        EAX,U4 MP_EOI
             MOV        U4 [RAX],0
             JMP        @@5

@@3:        MOV        RAX,U8 [SYS_EXTERN_TABLE]
             MOV        RAX,U8 EXT_IRQ00*8[RAX]
             OR        RAX,RAX
             JZ        @@2
             PUSH        ESI
             CALL        RAX
             ADD        RSP,8
             CLI
@@2:        MOV        AL,0x20                  //ACKNOWLEDGE INTERRUPT
             OUT        0x20,AL

@@5:        MOV        RAX,SYS_SEMAS
             BT        U4 SYS_SEMA_SINGLE_USER*SEMA_STRUCT_SIZE[RAX],0
             JC        @@5C
             BT        U8 TSS_TASK_FLAGS[RSI],TSSf_PREEMPT
             JC        I4 RESTORE_NEXT_RSI_TASK
@@5C:        BTR        U8 TSS_TASK_FLAGS[RSI],TSSf_HAS_BEEN_SWAPPED
             JC        @@5B
             INC        U8 CPU_NO_PREEMPT_HITS[RDI]
@@5B:        JMP        I4 RESTORE_RSI_NO_PREEMPT_TASK

IRQ21:        CLD
             PUSH_C_REGS
             MOV        RAX,U8 [SYS_EXTERN_TABLE]
             CALL        U8 EXT_IRQ01*8[RAX]
             POP_C_REGS
             IRET

IRQ22:        PUSH RDX
             MOV        RDX,0x22
             JMP        I4 IRQFAULT

IRQ23:        CLD
             PUSH_C_REGS
             MOV        RAX,U8 [SYS_EXTERN_TABLE]
             MOV        RAX,U8 EXT_IRQ03*8[RAX]
             OR        RAX,RAX
             JZ        @@231
             CALL        RAX
@@231:        MOV        AL,0x20                  //ACKNOWLEDGE INTERRUPT
             OUT        0x20,AL
             POP_C_REGS
             IRET

IRQ24:        CLD
             PUSH_C_REGS
             MOV        RAX,U8 [SYS_EXTERN_TABLE]
             MOV        RAX,U8 EXT_IRQ04*8[RAX]
             OR        RAX,RAX
             JZ        @@241
             CALL        RAX
@@241:        MOV        AL,0x20                  //ACKNOWLEDGE INTERRUPT
             OUT        0x20,AL
             POP_C_REGS
             IRET

IRQ25:        CLD
             PUSH_C_REGS
             MOV        RAX,U8 [SYS_EXTERN_TABLE]
             MOV        RAX,U8 EXT_IRQ05*8[RAX]
             OR        RAX,RAX
             JZ        @@251
             CALL        RAX
@@251:        MOV        AL,0x20
             OUT        0x20,AL
             POP_C_REGS
             IRET

IRQ26:        CLD
             PUSH_C_REGS
             MOV        RAX,U8 [SYS_EXTERN_TABLE]
             MOV        RAX,U8 EXT_IRQ06*8[RAX]
             OR        RAX,RAX
             JZ        @@261
             CALL        RAX
@@261:        MOV        AL,0x20                  //ACKNOWLEDGE INTERRUPT
             OUT        0x20,AL
             POP_C_REGS
             IRET

IRQ27:        CLD
             PUSH_C_REGS
             MOV        RAX,U8 [SYS_EXTERN_TABLE]
             MOV        RAX,U8 EXT_IRQ07*8[RAX]
             OR        RAX,RAX
             JZ        @@271
             CALL        RAX
@@271:        MOV        AL,0x20                  //ACKNOWLEDGE INTERRUPT
             OUT        0x20,AL
             POP_C_REGS
             IRET

IRQ28:        PUSH RDX
             MOV        RDX,0x28
             JMP        I4 IRQFAULT

IRQ29:        PUSH RDX
             MOV        RDX,0x29
             JMP        I4 IRQFAULT

IRQ2A:        PUSH RDX
             MOV        RDX,0x2A
             JMP        I4 IRQFAULT


IRQ2B:        CLD
             PUSH_C_REGS
             MOV        RAX,U8 [SYS_EXTERN_TABLE]
             MOV        RAX,U8 EXT_IRQ0B*8[RAX]
             OR        RAX,RAX
             JZ        @@2B1
             CALL        RAX
@@2B1:        MOV        AL,0x20
             OUT        0xA0,AL
             OUT        0x20,AL
             POP_C_REGS
             IRET

IRQ2C:        CLD
             PUSH_C_REGS
             MOV        RAX,U8 [SYS_EXTERN_TABLE]
             CALL        U8 EXT_IRQ0C*8[RAX]
             POP_C_REGS
             IRET

IRQ2D:        CLD
             PUSH_C_REGS
             MOV        RAX,U8 [SYS_EXTERN_TABLE]
             MOV        RAX,U8 EXT_IRQ0D*8[RAX]
             OR        RAX,RAX
             JZ        @@2D1
             CALL        RAX
@@2D1:        MOV        AL,0x20
             OUT        0xA0,AL
             OUT        0x20,AL
             POP_C_REGS
             IRET

IRQ2E:        CLD
             PUSH_C_REGS
             MOV        RAX,U8 [SYS_EXTERN_TABLE]
             MOV        RAX,U8 EXT_IRQ0E*8[RAX]
             OR        RAX,RAX
             JZ        @@2E1
             CALL        RAX
@@2E1:        MOV        AL,0x20
             OUT        0xA0,AL
             OUT        0x20,AL
             POP_C_REGS
             IRET

IRQ2F:        CLD
             PUSH_C_REGS
             MOV        RAX,U8 [SYS_EXTERN_TABLE]
             MOV        RAX,U8 EXT_IRQ0F*8[RAX]
             OR        RAX,RAX
             JZ        @@2F1
             CALL        RAX
@@2F1:        MOV        AL,0x20
             OUT        0xA0,AL
             OUT        0x20,AL
             POP_C_REGS
             IRET


/*************************************/
IRQ30:        PUSH        EAX //called from MPInt
             WBINVD
             XOR        EAX,EAX
             MOV        EAX,U4 MP_EOI
             MOV        U4 [RAX],0
             POP        EAX
             IRET

IRQ31:        PUSH RDX
             MOV        RDX,0x31
             JMP        I4 IRQFAULT

IRQ32:        PUSH RDX
             MOV        RDX,0x32
             JMP        I4 IRQFAULT

IRQ33:        PUSH RDX
             MOV        RDX,0x33
             JMP        I4 IRQFAULT


COUT_PUT_DOUBLE:
             PUSH_C_REGS
             PUSH        U8 8[RBP]
             CALL        CP_PUT_FLOAT
             ADD        RSP,8
             POP_C_REGS
COUT_RETURN:
             RET
COUT_PUT_STR:
             PUSH        ESI
             MOV        RSI,RAX
             CALL        PUT_STR
             POP        ESI
             RET

COUT_JMP_TABLE:
             DU8        PUT_HEX_U4;
             DU8        PUT_HEX_U4;
             DU8        PUT_CHAR;
             DU8        PUT_HEX_U1;
             DU8        PUT_HEX_U2;
             DU8        PUT_HEX_U2;
             DU8        PUT_HEX_U4;
             DU8        PUT_HEX_U4;
             DU8        PUT_HEX_U8;
             DU8        PUT_HEX_U8;
             DU8        COUT_PUT_DOUBLE;
             DU8        PUT_HEX_U4;

//ptr types
             DU8        PUT_HEX_U4;
             DU8        PUT_HEX_U4;
             DU8        COUT_PUT_STR;

COUT_JOIN::
             OR        RBX,RBX
             JZ        @@100
@@20:        MOV        RDX,U8 [RBP]
             MOV        RAX,U8 8[RBP]
             CMP        RDX,IT_I1+IT_NUM_IT
             JBE        @@21
             XOR        EDX,EDX
@@21:        CALL        U8 COUT_JMP_TABLE[RDX*8]
             SUB        RBP,16
             DEC        RBX
             JNZ        @@20
@@100:        RET

//I_COUT
IRQ34::        PUSH        EBP
             MOV        RBP,RSP
             BT        U8 24[RBP],9
             JNC        @@I34
             STI
@@I34:
             MOV        RBP,U8 32[RBP]
             MOV        RBX,RAX         //GET ARG CNT
             ADD        RBX,RBX
             LEA        RBP,-16[RBP+RBX*8]
             MOV        RBX,RAX         //GET ARG CNT
             CALL        COUT_JOIN
             POP        EBP
             IRET


//I_COUTLN
IRQ35::        PUSH        EBP
             MOV        RBP,RSP
             BT        U8 24[RBP],9
             JNC        @@I35
             STI
@@I35:
             MOV        RBP,U8 32[RBP]
             MOV        RBX,RAX         //GET ARG CNT
             ADD        RBX,RBX
             LEA        RBP,-16[RBP+RBX*8]
             MOV        RBX,RAX         //GET ARG CNT
             CALL        COUT_JOIN
             CALL        CRLF
             POP        EBP
             IRET

IRQ36:        PUSH RDX
             MOV        RDX,0x36
             JMP        IRQFAULT

IRQ37:        PUSH RDX
             MOV        RDX,0x37
             JMP        IRQFAULT

IRQ38:        PUSH RDX
             MOV        RDX,0x38
             JMP        IRQFAULT

IRQ39:        PUSH RDX
             MOV        RDX,0x39
             JMP        IRQFAULT

IRQ3A:        PUSH RDX
             MOV        RDX,0x3A
             JMP        IRQFAULT

IRQ3B:        PUSH RDX
             MOV        RDX,0x3B
             JMP        IRQFAULT

IRQ3C:        PUSH RDX
             MOV        RDX,0x3C
             JMP        IRQFAULT

IRQ3D:        PUSH RDX
             MOV        RDX,0x3D
             JMP        IRQFAULT

IRQ3E:        PUSH RDX
             MOV        RDX,0x3E
             JMP        IRQFAULT

IRQ3F:        PUSH RDX
             MOV        RDX,0x3F
             JMP        IRQFAULT

//************************************ SOFTWARE INT'S ******************************

IRQFAULT::
             PUSH        EAX
             XOR        EAX,EAX
             MOV        FS:U4 TSS_FAULT_NUM[RAX],EDX
             POP        EAX
             POP        EDX
             CALL        SAVE_CONTEXT
             XOR        ESI,ESI
             MOV        RSI,FS:TSS_ADDRESS[RSI]
             MOV        RBP,RSP
             MOV        RAX,U8 [RBP]
             MOV        U8 TSS_RIP[RSI],RAX
             MOV        RAX,U8 16[RBP]
             MOV        U8 TSS_RFLAGS[RSI],RAX
             MOV        RAX,U8 24[RBP]
             MOV        U8 TSS_RSP[RSI],RAX
             MOV        RSP,RAX
             MOV        RAX,TSS_RAX[RSI]
             MOV        RBP,TSS_RBP[RSI]
             MOV        RSI,TSS_RSI[RSI]
             CALL        CP_FAULT2
             JMP        I4 RESTORE_FS_TASK_WITH_KEY_CHECK
Home

Kernel
StartUp
Scheduler
Memory
MultiCore
Interrupts
BitMaps
Screen
Plot
Compiler Frontend
Compiler Mid
Compiler Backend
Interrupt Handlers