ALIGN 8,0x90 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; DU4 IRQ54,IRQ55,IRQ56,IRQ57; DU4 IRQ58,IRQ59,IRQ5A,IRQ5B; DU4 IRQ5C,IRQ5D,IRQ5E,IRQ5F; ////***************** INTERRUPT ROUTINES *************** ALIGN 8,0x90 IRQ00: PUSHAD MOV EDX,0 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ01: PUSHAD MOV EDX,1 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ02: PUSHAD MOV EDX,2 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ03: PUSHAD MOV EDX,3 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ04: PUSHAD MOV EDX,4 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ05: PUSHAD MOV EDX,5 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ06: PUSHAD MOV EDX,6 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ07: PUSHAD MOV EDX,7 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ08: PUSHAD MOV EDX,8 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ09: PUSHAD MOV EDX,9 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ0A: PUSHAD MOV EDX,0x0A JMP U4 IRQFAULT ALIGN 8,0x90 IRQ0B: PUSHAD MOV EDX,0x0B JMP U4 IRQFAULT ALIGN 8,0x90 IRQ0C: PUSHAD MOV EDX,0x0C JMP U4 IRQFAULT ALIGN 8,0x90 IRQ0D: PUSHAD MOV EDX,0x0D JMP U4 IRQFAULT ALIGN 8,0x90 IRQ0E: PUSHAD MOV EDX,0x0E JMP U4 IRQFAULT ALIGN 8,0x90 IRQ0F: PUSHAD MOV EDX,0x0F JMP U4 IRQFAULT ALIGN 8,0x90 IRQ10: PUSHAD MOV EDX,0x10 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ11: PUSHAD MOV EDX,0x11 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ12: PUSHAD MOV EDX,0x12 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ13: PUSHAD MOV EDX,0x13 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ14: PUSHAD MOV EDX,0x14 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ15: PUSHAD MOV EDX,0x15 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ16: PUSHAD MOV EDX,0x16 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ17: PUSHAD MOV EDX,0x17 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ18: PUSHAD MOV EDX,0x18 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ19: PUSHAD MOV EDX,0x19 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ1A: PUSHAD MOV EDX,0x1A JMP U4 IRQFAULT ALIGN 8,0x90 IRQ1B: PUSHAD MOV EDX,0x1B JMP U4 IRQFAULT ALIGN 8,0x90 IRQ1C: PUSHAD MOV EDX,0x1C JMP U4 IRQFAULT ALIGN 8,0x90 IRQ1D: PUSHAD MOV EDX,0x1D JMP U4 IRQFAULT ALIGN 8,0x90 IRQ1E: PUSHAD MOV EDX,0x1E JMP U4 IRQFAULT ALIGN 8,0x90 IRQ1F: PUSHAD MOV EDX,0x1F JMP U4 IRQFAULT ALIGN 8,0x90 IRQ20: STI CLD PUSHAD MOV EAX,U4 [SYS_EXTERN_TABLE] MOV EAX,U4 EXT_IRQ00*4[EAX] OR EAX,EAX JZ @@2 MOV EBP,ESP PUSH 0 PUSH U4 SP_EIP[EBP] CALL EAX ADD ESP,8 @@2: MOV AL,0x20 //ACKNOWLEDGE INTERRUPT OUT 0x20,AL POPAD BT U4 [SYS_FLAGS],SYSf_PREEMPTIVE JC IRQ_SWAP_IN_NEXT IRET IRQ_SWAP_IN_NEXT: CLI CALL SAVE_CONTEXT //PREEMPTIVE MOV EBP,ESP MOV EAX,[EBP] MOV U4 FS:[TSS_EIP],EAX MOV EAX,8[EBP] MOV U4 FS:[TSS_EFLAGS],EAX ADD EBP,12 MOV U4 FS:[TSS_ESP],EBP MOV ESI,U4 FS:[TSS_NEXT_TSS] MOV AX,U2 TSS_FS[ESI] MOV FS,AX JMP U4 SWAP_IN_NEXT_PART2 ALIGN 8,0x90 IRQ21:: CLD PUSHAD CALL U4 CP_KBD_HANDLER+4 MOV AL,0x20 //ACKNOWLEDGE INTERRUPT OUT 0x20,AL POPAD IRET ALIGN 8,0x90 IRQ22: PUSHAD MOV EDX,0x22 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ23: CLD PUSHAD MOV EAX,U4 [SYS_EXTERN_TABLE] MOV EAX,U4 EXT_IRQ03*4[EAX] OR EAX,EAX JZ @@231 CALL EAX @@231: MOV AL,0x20 //ACKNOWLEDGE INTERRUPT OUT 0x20,AL POPAD IRET ALIGN 8,0x90 IRQ24: CLD PUSHAD MOV EAX,U4 [SYS_EXTERN_TABLE] MOV EAX,U4 EXT_IRQ04*4[EAX] OR EAX,EAX JZ @@241 CALL EAX @@241: MOV AL,0x20 //ACKNOWLEDGE INTERRUPT OUT 0x20,AL POPAD IRET ALIGN 8,0x90 IRQ25: PUSHAD MOV EDX,0x25 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ26: CLD PUSHAD MOV EAX,U4 [SYS_EXTERN_TABLE] MOV EAX,U4 EXT_IRQ06*4[EAX] OR EAX,EAX JZ @@261 CALL EAX @@261: MOV AL,0x20 //ACKNOWLEDGE INTERRUPT OUT 0x20,AL POPAD IRET ALIGN 8,0x90 IRQ27: CLD PUSHAD MOV EAX,U4 [SYS_EXTERN_TABLE] MOV EAX,U4 EXT_IRQ07*4[EAX] OR EAX,EAX JZ @@271 CALL EAX @@271: MOV AL,0x20 //ACKNOWLEDGE INTERRUPT OUT 0x20,AL POPAD IRET ALIGN 8,0x90 IRQ28: PUSHAD MOV EDX,0x28 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ29: PUSHAD MOV EDX,0x29 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ2A: PUSHAD MOV EDX,0x2A JMP U4 IRQFAULT ALIGN 8,0x90 IRQ2B: PUSHAD MOV EDX,0x2B JMP U4 IRQFAULT ALIGN 8,0x90 IRQ2C: CLD PUSHAD MOV EAX,U4 [SYS_EXTERN_TABLE] MOV EAX,U4 EXT_IRQ0C*4[EAX] OR EAX,EAX JZ @@2C1 CALL EAX @@2C1: MOV AL,0x20 OUT 0xA0,AL MOV AL,0x20 OUT 0x20,AL POPAD IRET ALIGN 8,0x90 IRQ2D: PUSHAD MOV EDX,0x2D JMP U4 IRQFAULT ALIGN 8,0x90 IRQ2E: CLD PUSHAD MOV EAX,U4 [SYS_EXTERN_TABLE] MOV EAX,U4 EXT_IRQ0E*4[EAX] OR EAX,EAX JZ @@2E1 CALL EAX @@2E1: MOV AL,0x20 OUT 0xA0,AL MOV AL,0x20 OUT 0x20,AL POPAD IRET ALIGN 8,0x90 IRQ2F: CLD PUSHAD MOV EAX,U4 [SYS_EXTERN_TABLE] MOV EAX,U4 EXT_IRQ0F*4[EAX] OR EAX,EAX JZ @@2F1 CALL EAX @@2F1: MOV AL,0x20 OUT 0xA0,AL MOV AL,0x20 OUT 0x20,AL POPAD IRET //************************************ SOFTWARE INT'S ****************************** TEST_AND_ENABLE_IRQS: PUSH EBP MOV EBP,ESP //16[ebp]=flags //12[ebp]=cs // 8[ebp]=iret // 4[ebp]=ret // 0[ebp]=ebp BT U4 16[EBP],9 JNC @@TEI1 STI @@TEI1: POP EBP RET ALIGN 8,0x90 IRQ30: CALL TEST_AND_ENABLE_IRQS PUSHAD PUSH 0 PUSH ESI CALL CP_PUT_SYSTEXT+4 ADD ESP,8 POPAD IRET ALIGN 8,0x90 IRQ31: CALL TEST_AND_ENABLE_IRQS PUSHAD CALL PUT_I1 POPAD IRET ALIGN 8,0x90 IRQ32: CALL TEST_AND_ENABLE_IRQS PUSHAD MOV ESI,MSG_GETCHAR CALL FIND_EXTERN JNZ @@3210 CALL GET_KEY INT I_PUT_I1 XOR EDX,EDX JMP @@3220 @@3210: PUSH 0 PUSH 0 CALL ESI ADD ESP,8 @@3220: MOV EBP,ESP MOV U4 SP_EAX[EBP],EAX MOV U4 SP_EDX[EBP],EDX POPAD IRET COUT_JOIN:: OR EBX,EBX JZ U4 @@100 @@20: MOV EDX,U4 [EBP] MOV EAX,U4 8[EBP] PUSHAD CMP EDX,IT_NUM_IT+IT_I1 JNE @@25 PUSH ESI MOV ESI,EAX CALL PUT_STRING POP ESI JMP @@29 @@25: CMP EDX,IT_U8 JE @@26 CMP EDX,IT_I8 JNE @@24 @@26: MOV EAX,U4 12[EBP] CALL PUT_HEX MOV EAX,U4 8[EBP] CALL PUT_HEX JMP @@29 @@24: CMP EDX,IT_U4 JE @@21 CMP EDX,IT_I4 JNE @@21A @@21: CALL PUT_HEX JMP @@29 @@21A: CMP EDX,IT_U2 JE @@22 CMP EDX,IT_I2 JNE @@22A @@22: CALL PUT_HEX_U2 JMP @@29 @@22A: CMP EDX,IT_U1 JNE @@23 CALL PUT_HEX_U1 JMP @@29 @@23: CMP EDX,IT_DOUBLE JNE @@30 PUSH U4 12[EBP] PUSH U4 8[EBP] CALL CP_PUT_FLOAT+4 ADD ESP,8 JMP @@29 @@30: CMP EDX,IT_I1 JNE @@21 CALL PUT_I1 @@29: POPAD SUB EBP,16 DEC EBX JNZ U4 @@20 @@100: RET ALIGN 8,0x90 IRQ33:: CALL TEST_AND_ENABLE_IRQS //COUT PUSH EBP MOV EBP,ESP MOV EBX,EAX //GET PARAM CNT ADD EBX,EBX LEA EBP,16-16[EBP+EBX*8] MOV EBX,EAX //GET PARAM CNT CALL COUT_JOIN POP EBP IRET ALIGN 8,0x90 IRQ34: CALL TEST_AND_ENABLE_IRQS PUSHAD SUB ESP,16 //Space for param1 & param2 PUSH EDX //mask PUSH EAX //mask MOV EAX,ESP ADD EAX,16 PUSH 0 PUSH 0 PUSH 0 //¶m2 PUSH EAX //¶m2 SUB EAX,8 PUSH 0 //¶m1 PUSH EAX //¶m1 MOV ESI,MSG_PEEK_MSG CALL FIND_EXTERN CALL ESI ADD ESP,32 POP EBX //param1 ADD ESP,4 POP EDX //param2 ADD ESP,4 MOV EBP,ESP MOV U4 SP_EAX[EBP],EAX MOV U4 SP_EBX[EBP],EBX MOV U4 SP_EDX[EBP],EDX POPAD IRET ALIGN 8,0x90 IRQ35: CALL TEST_AND_ENABLE_IRQS PUSHAD SUB ESP,16 //Space for param1 & param2 PUSH EDX //mask PUSH EAX //mask MOV EAX,ESP ADD EAX,16 PUSH 0 PUSH 0 PUSH 0 //¶m2 PUSH EAX //¶m2 SUB EAX,8 PUSH 0 //¶m1 PUSH EAX //¶m1 MOV ESI,MSG_GET_MSG_NO_WAIT CALL FIND_EXTERN CALL ESI ADD ESP,32 POP EBX //param1 ADD ESP,4 POP EDX //param2 MOV EBP,ESP ADD ESP,4 MOV U4 SP_EAX[EBP],EAX MOV U4 SP_EBX[EBP],EBX MOV U4 SP_EDX[EBP],EDX POPAD IRET ALIGN 8,0x90 IRQ36:: CALL TEST_AND_ENABLE_IRQS PUSHAD MOV ESI,MSG_FLUSH_MSGS CALL FIND_EXTERN XOR EAX,EAX OR ESI,ESI JZ @@1 CALL ESI @@1: MOV EBP,ESP MOV U4 SP_EDX[EBP],EDX MOV U4 SP_EAX[EBP],EAX POPAD IRET CP_FLUSH_MSGS:: INT I_FLUSH_MSGS RET ALIGN 8,0x90 IRQ37: CALL TEST_AND_ENABLE_IRQS PUSHAD SUB ESP,16 //Space for param1 & param2 PUSH EDX //mask PUSH EAX //mask MOV EAX,ESP ADD EAX,16 PUSH 0 PUSH 0 PUSH 0 //¶m2 PUSH EAX //¶m2 SUB EAX,8 PUSH 0 //¶m1 PUSH EAX //¶m1 MOV ESI,MSG_GET_MSG CALL FIND_EXTERN CALL ESI ADD ESP,32 POP EBX //param1 ADD ESP,4 POP EDX //param2 ADD ESP,4 MOV EBP,ESP MOV U4 SP_EAX[EBP],EAX MOV U4 SP_EBX[EBP],EBX MOV U4 SP_EDX[EBP],EDX POPAD IRET ALIGN 8,0x90 IRQ38:: CALL TEST_AND_ENABLE_IRQS CALL PUT_STRING IRET ALIGN 8,0x90 IRQ39:: CALL TEST_AND_ENABLE_IRQS PUSH EBP MOV EBP,ESP MOV EBX,EAX //GET PARAM CNT ADD EBX,EBX LEA EBP,16-16[EBP+EBX*8] MOV EBX,EAX //GET PARAM CNT CALL COUT_JOIN CALL CRLF POP EBP IRET ALIGN 8,0x90 //I_DEBUG IRQ3A:: CLI CLD PUSHAD CALL SAVE_CONTEXT MOV EAX,U4 [SYS_EXTERN_TABLE] MOV EAX,U4 EXT_DEBUG*4[EAX] OR EAX,EAX JZ @@3A1 CALL EAX @@3A1: POPAD IRET ALIGN 8,0x90 IRQ3B: PUSHAD MOV EDX,0x3B JMP U4 IRQFAULT ALIGN 8,0x90 IRQ3C: PUSHAD MOV EDX,0x3C JMP U4 IRQFAULT ALIGN 8,0x90 IRQ3D: PUSHAD MOV EDX,0x3D JMP U4 IRQFAULT ALIGN 8,0x90 IRQ3E: PUSHAD MOV EDX,0x3E JMP U4 IRQFAULT ALIGN 8,0x90 IRQ3F: PUSHAD MOV EDX,0x3F JMP U4 IRQFAULT ALIGN 8,0x90 IRQ40: PUSHAD MOV EDX,0x40 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ41: PUSHAD MOV EDX,0x41 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ42: PUSHAD MOV EDX,0x42 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ43: PUSHAD MOV EDX,0x43 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ44: PUSHAD MOV EDX,0x44 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ45: PUSHAD MOV EDX,0x45 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ46: PUSHAD MOV EDX,0x46 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ47: PUSHAD MOV EDX,0x47 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ48: PUSHAD MOV EDX,0x48 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ49: PUSHAD MOV EDX,0x49 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ4A: PUSHAD MOV EDX,0x4A JMP U4 IRQFAULT ALIGN 8,0x90 IRQ4B: PUSHAD MOV EDX,0x4B JMP U4 IRQFAULT ALIGN 8,0x90 IRQ4C: PUSHAD MOV EDX,0x4C JMP U4 IRQFAULT ALIGN 8,0x90 IRQ4D: PUSHAD MOV EDX,0x4D JMP U4 IRQFAULT ALIGN 8,0x90 IRQ4E: PUSHAD MOV EDX,0x4E JMP U4 IRQFAULT ALIGN 8,0x90 IRQ4F: PUSHAD MOV EDX,0x4F JMP U4 IRQFAULT ALIGN 8,0x90 IRQ50: PUSHAD MOV EDX,0x50 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ51: PUSHAD MOV EDX,0x51 JMP U4 IRQFAULT ALIGN 8,0x90 IRQ52: PUSHAD MOV EDX,0x52 JMP IRQFAULT ALIGN 8,0x90 IRQ53: PUSHAD MOV EDX,0x53 JMP IRQFAULT ALIGN 8,0x90 IRQ54: PUSHAD MOV EDX,0x54 JMP IRQFAULT ALIGN 8,0x90 IRQ55: PUSHAD MOV EDX,0x55 JMP IRQFAULT ALIGN 8,0x90 IRQ56: PUSHAD MOV EDX,0x56 JMP IRQFAULT ALIGN 8,0x90 IRQ57: PUSHAD MOV EDX,0x57 JMP IRQFAULT ALIGN 8,0x90 IRQ58: PUSHAD MOV EDX,0x58 JMP IRQFAULT ALIGN 8,0x90 IRQ59: PUSHAD MOV EDX,0x59 JMP IRQFAULT ALIGN 8,0x90 IRQ5A: PUSHAD MOV EDX,0x5A JMP IRQFAULT ALIGN 8,0x90 IRQ5B: PUSHAD MOV EDX,0x5B JMP IRQFAULT ALIGN 8,0x90 IRQ5C: PUSHAD MOV EDX,0x5C JMP IRQFAULT ALIGN 8,0x90 IRQ5D: PUSHAD MOV EDX,0x5D JMP IRQFAULT ALIGN 8,0x90 IRQ5E: PUSHAD MOV EDX,0x5E JMP IRQFAULT ALIGN 8,0x90 IRQ5F: PUSHAD MOV EDX,0x5F JMP IRQFAULT FAULT_DESC: DU1 "FAULT TASK",0; CP_FAULT:: PUSHAD MOV EBP,ESP MOV EDX,U4 SP_PARAM1[EBP] IRQFAULT:: CLD PUSH EDX //Save IRQNUM MOV U4 [SYS_CUR_FOCUS_TASK],0 MOV EAX,U4 FS:[TSS_DBG] OR EAX,EAX JNZ @@10 PUSH 0 PUSH U4 DEFAULT_STACK PUSH 0 PUSH 0 ///Use parent account PUSH 0 PUSH U4 FS:[TSS_ABSOLUTE_ADDRESS] PUSH 0 PUSH U4 FAULT_DESC PUSH 0 PUSH U4 CP_FAULT_CMD_LINE+4 CALL CP_SPAWN_TASK+4 ADD ESP,40 @@10: POP U4 TSS_USER_AUX0[EAX] PUSH 0 PUSH EAX MOV EAX,U4 [SYS_EXTERN_TABLE] MOV EAX,U4 EXT_WINDOW_TO_TOP*4[EAX] OR EAX,EAX JZ @@20 CALL EAX @@20: ADD ESP,8 POPAD BTS U4 FS:[TSS_TASK_FLAGS],TSSf_SUSPENDED JMP U4 IRQ_SWAP_IN_NEXT GET_MACHINE_REGS:: PUSH EBP MOV EBP,ESP MOV EBX,SF_PARAM1[EBP] DU1 0x0F,0x20,0xC0; MOV U4 [EBX],EAX DU1 0x0F,0x20,0xD0; MOV U4 4[EBX],EAX DU1 0x0F,0x20,0xD8; MOV U4 8[EBX],EAX DU1 0x0F,0x20,0xE0; MOV U4 12[EBX],EAX DU1 0x0F,0x21,0xC0; MOV U4 16[EBX],EAX DU1 0x0F,0x21,0xC8; MOV U4 20[EBX],EAX DU1 0x0F,0x21,0xD0; MOV U4 24[EBX],EAX DU1 0x0F,0x21,0xD8; MOV U4 28[EBX],EAX DU1 0x0F,0x21,0xF0; MOV U4 32[EBX],EAX DU1 0x0F,0x21,0xF8; MOV U4 36[EBX],EAX POP EBP RET