ALIGN 8,OC_NOP 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; DU4 IRQ40,IRQ41,IRQ42,IRQ43; DU4 IRQ44,IRQ45,IRQ46,IRQ47; DU4 IRQ48,IRQ49,IRQ4A,IRQ4B; DU4 IRQ4C,IRQ4D,IRQ4E,IRQ4F; DU4 IRQ50,IRQ51,IRQ52,IRQ53; ////***************** INTERRUPT ROUTINES *************** ALIGN 8,OC_NOP IRQ00:: PUSH RDX XOR EDX,EDX JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ01: PUSH RDX MOV RDX,1 JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ02: //Halt XOR ESI,ESI CALL HALT_CPU ALIGN 8,OC_NOP IRQ03: PUSH RDX MOV RDX,3 JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ04: PUSH RDX MOV RDX,4 JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ05: PUSH RDX MOV RDX,5 JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ06: PUSH RDX MOV RDX,6 JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ07: PUSH RDX MOV RDX,7 JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ08: PUSH RDX MOV RDX,8 JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ09: PUSH RDX MOV RDX,9 JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ0A: PUSH RDX MOV RDX,0x0A JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ0B: PUSH RDX MOV RDX,0x0B JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ0C: PUSH RDX MOV RDX,0x0C JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ0D: PUSH RDX MOV RDX,0x0D JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ0E: PUSH RDX MOV RDX,0x0E JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ0F: PUSH RDX MOV RDX,0x0F JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ10: PUSH RDX MOV RDX,0x10 JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ11: PUSH RDX MOV RDX,0x11 JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ12: PUSH RDX MOV RDX,0x12 JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ13: PUSH RDX MOV RDX,0x13 JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ14: PUSH RDX MOV RDX,0x14 JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ15: PUSH RDX MOV RDX,0x15 JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ16: PUSH RDX MOV RDX,0x16 JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ17: PUSH RDX MOV RDX,0x17 JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ18: PUSH RDX MOV RDX,0x18 JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ19: PUSH RDX MOV RDX,0x19 JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ1A: PUSH RDX MOV RDX,0x1A JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ1B: PUSH RDX MOV RDX,0x1B JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ1C: PUSH RDX MOV RDX,0x1C JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ1D: PUSH RDX MOV RDX,0x1D JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ1E: PUSH RDX MOV RDX,0x1E JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ1F: PUSH RDX MOV RDX,0x1F JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ20: CLD PUSH RAX PUSH_C_REGS MOV RBP,RSP MOV RBX,U8 SC_RIP+8[RBP] XOR EAX,EAX MOV RDX,GS:CPU_ABSOLUTE_ADDRESS[RAX] MOV RAX,FS:TSS_ABSOLUTE_ADDRESS[RAX] BT U8 TSS_TASK_FLAGS[RAX],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[RDX] @@1: MOV RAX,U8 CPU_NUM[RDX] 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 RBX CALL RAX ADD RSP,8 @@2: MOV AL,0x20 //ACKNOWLEDGE INTERRUPT OUT 0x20,AL @@5: POP_C_REGS XOR EAX,EAX MOV RAX,FS:TSS_ABSOLUTE_ADDRESS[RAX] BT U8 TSS_TASK_FLAGS[RAX],TSSf_PREEMPT JC @@5A POP RAX IRET @@5A: POP RAX CLI CALL SAVE_CONTEXT //PREEMPTIVE XOR ESI,ESI MOV RSI,FS:TSS_ABSOLUTE_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 JMP U4 SIN_PART1 ALIGN 8,OC_NOP IRQ21: CLD PUSH_C_REGS CALL KBD_IRQ_HANDLER MOV AL,0x20 //ACKNOWLEDGE INTERRUPT OUT 0x20,AL POP_C_REGS IRET ALIGN 8,OC_NOP IRQ22: PUSH RDX MOV RDX,0x22 JMP U4 IRQFAULT ALIGN 8,OC_NOP 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 ALIGN 8,OC_NOP 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 ALIGN 8,OC_NOP IRQ25: PUSH RDX MOV RDX,0x25 JMP U4 IRQFAULT ALIGN 8,OC_NOP 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 ALIGN 8,OC_NOP 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 ALIGN 8,OC_NOP IRQ28: PUSH RDX MOV RDX,0x28 JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ29: PUSH RDX MOV RDX,0x29 JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ2A: PUSH RDX MOV RDX,0x2A JMP U4 IRQFAULT ALIGN 8,OC_NOP 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 MOV AL,0x20 OUT 0x20,AL POP_C_REGS IRET ALIGN 8,OC_NOP IRQ2C: PUSH RAX //keyboard MOV AL,0x20 OUT 0xA0,AL MOV AL,0x20 //ACKNOWLEDGE INTERRUPT OUT 0x20,AL POP RAX IRET ALIGN 8,OC_NOP IRQ2D: PUSH RDX MOV RDX,0x2D JMP U4 IRQFAULT ALIGN 8,OC_NOP 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 MOV AL,0x20 OUT 0x20,AL POP_C_REGS IRET ALIGN 8,OC_NOP 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 MOV AL,0x20 OUT 0x20,AL POP_C_REGS IRET /*************************************/ ALIGN 8,OC_NOP IRQ30: PUSH RDX MOV RDX,0x30 JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ31: PUSH RDX MOV RDX,0x31 JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ32: PUSH RDX MOV RDX,0x32 JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ33: PUSH RDX MOV RDX,0x33 JMP U4 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 RSI MOV RSI,RAX CALL PUT_STR POP RSI RET COUT_JMP_TABLE: DU8 COUT_RETURN; DU8 COUT_RETURN; DU8 PUT_HEX_U1; 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 COUT_RETURN; //pointer types DU8 COUT_RETURN; DU8 COUT_RETURN; DU8 COUT_PUT_STR; COUT_JOIN:: OR RBX,RBX JZ @@100 @@20: MOV RDX,U8 [RBP] MOV RAX,U8 8[RBP] CALL U8 COUT_JMP_TABLE[RDX*8] SUB RBP,16 DEC RBX JNZ @@20 @@100: RET //I_COUT ALIGN 8,OC_NOP IRQ34:: PUSH RBP MOV RBP,RSP BT U8 24[RBP],9 JNC @@I34 STI @@I34: MOV RBP,U8 32[RBP] MOV RBX,RAX //GET PARAM CNT ADD RBX,RBX LEA RBP,-16[RBP+RBX*8] MOV RBX,RAX //GET PARAM CNT CALL COUT_JOIN POP RBP IRET //I_COUTLN ALIGN 8,OC_NOP IRQ35:: PUSH RBP MOV RBP,RSP BT U8 24[RBP],9 JNC @@I35 STI @@I35: MOV RBP,U8 32[RBP] MOV RBX,RAX //GET PARAM CNT ADD RBX,RBX LEA RBP,-16[RBP+RBX*8] MOV RBX,RAX //GET PARAM CNT CALL COUT_JOIN CALL CRLF POP RBP IRET ALIGN 8,OC_NOP IRQ36: PUSH RDX MOV RDX,0x36 JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ37: PUSH RDX MOV RDX,0x37 JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ38: PUSH RDX MOV RDX,0x38 JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ39: PUSH RDX MOV RDX,0x39 JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ3A: PUSH RDX MOV RDX,0x3A JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ3B: PUSH RDX MOV RDX,0x3B JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ3C: PUSH RDX MOV RDX,0x3C JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ3D: PUSH RDX MOV RDX,0x3D JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ3E: PUSH RDX MOV RDX,0x3E JMP U4 IRQFAULT ALIGN 8,OC_NOP IRQ3F: PUSH RDX MOV RDX,0x3F JMP U4 IRQFAULT //************************************ SOFTWARE INT'S ****************************** ALIGN 8,OC_NOP IRQ40: //UNARY_MINUS PUSH RAX MOV RBX,RSP FLD U8 [RBX] FCHS FSTP U8 [RBX] FWAIT POP RAX IRET IRQ41: //INC PUSH RAX MOV RBX,RSP FLD U8 [RBX] FLD1 FADDP FSTP U8 [RBX] FWAIT POP RAX IRET IRQ42: //DEC PUSH RAX MOV RBX,RSP FLD1 FLD U8 [RBX] FSUBRP FSTP U8 [RBX] FWAIT POP RAX IRET IRQ43: //POWER PUSH RDX PUSH RAX PUSH 0 MOV RBX,RSP FSTCW U4 [RBX] FWAIT MOV AX,U2 [RBX] MOV U2 2[RBX],AX OR AX,0x0C00 MOV U2 [RBX],AX FLDCW U4 [RBX] FLD U8 8[RBX] FLD U8 16[RBX] FYL2X // y*log2(x) FST U8 16[RBX] FRNDINT FLD U8 16[RBX] FSUBRP F2XM1 FLD1 FADDP FSTP U8 8[RBX] FFREE FINCSTP FLD U8 16[RBX] FLD U8 8[RBX] FSCALE // ST0<