Files
TempleOS-Rijn/LT/OSMain/IRQHandlers.ASZ
T
2018-09-08 21:45:20 +02:00

839 lines
12 KiB
Plaintext

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<<ST1
FSTP U8 16[RBX]
FFREE
FINCSTP
FLDCW U4 2[RBX]
FWAIT
ADD RSP,16
POP RAX
IRET
IRQ44: //MUL
PUSH RDX
PUSH RAX
MOV RBX,RSP
FLD U8 8[RBX]
FLD U8 [RBX]
FMULP
FSTP U8 [RBX]
FWAIT
POP RAX
ADD RSP,8
IRET
IRQ45: //DIV
PUSH RDX
PUSH RAX
MOV RBX,RSP
FLD U8 8[RBX]
FLD U8 [RBX]
FDIVP
FSTP U8 [RBX]
FWAIT
POP RAX
ADD RSP,8
IRET
IRQ46: //MOD
PUSH RDX
PUSH RAX
MOV RBX,RSP
FLD U8 [RBX]
FLD U8 8[RBX]
@@DMOD: FPREM
FSTSW
FWAIT
TEST AX,0x400
JNZ @@DMOD
FSTP U8 [RBX]
FFREE
FINCSTP
FWAIT
POP RAX
ADD RSP,8
IRET
IRQ47: //ADD
PUSH RDX
PUSH RAX
MOV RBX,RSP
FLD U8 [RBX]
FLD U8 8[RBX]
FADDP
FSTP U8 [RBX]
FWAIT
POP RAX
ADD RSP,8
IRET
IRQ48: //SUB
PUSH RDX
PUSH RAX
MOV RBX,RSP
FLD U8 8[RBX]
FLD U8 [RBX]
FSUBP
FSTP U8 [RBX]
FWAIT
POP RAX
ADD RSP,8
IRET
IRQ49: //LESS
PUSH RDX
PUSH RAX
MOV RBX,RSP
FLD U8 [RBX]
FLD U8 8[RBX]
FCOMIP
FWAIT
MOV RAX,0
ADC RAX,0
FFREE
FINCSTP
FWAIT
ADD RSP,16
IRET
IRQ4A: //GREATER
PUSH RDX
PUSH RAX
MOV RBX,RSP
FLD U8 8[RBX]
FLD U8 [RBX]
FCOMIP
FWAIT
MOV RAX,0
ADC RAX,0
FFREE
FINCSTP
FWAIT
ADD RSP,16
IRET
IRQ4B: //LESS_EQUAL
PUSH RDX
PUSH RAX
MOV RBX,RSP
FLD U8 8[RBX]
FLD U8 [RBX]
FCOMIP
FWAIT
MOV RAX,1
SBB RAX,0
FFREE
FINCSTP
FWAIT
ADD RSP,16
IRET
IRQ4C: //GREATER_EQUAL
PUSH RDX
PUSH RAX
MOV RBX,RSP
FLD U8 [RBX]
FLD U8 8[RBX]
FCOMIP
FWAIT
MOV RAX,1
SBB RAX,0
FFREE
FINCSTP
FWAIT
ADD RSP,16
IRET
IRQ4D: //TO_INT_RAX
PUSH RAX
MOV RBX,RSP
FLD U8 [RBX]
FISTP U8 [RBX]
FWAIT
POP RAX
IRET
IRQ4E: //TO_DOUBLE_RAX
PUSH RAX
MOV RBX,RSP
FILD U8 [RBX]
FSTP U8 [RBX]
FWAIT
POP RAX
IRET
IRQ4F: //TO_INT_RDX
PUSH RDX
MOV RBX,RSP
FLD U8 [RBX]
FISTP U8 [RBX]
FWAIT
POP RDX
IRET
IRQ50: //TO_DOUBLE_RDX
PUSH RDX
MOV RBX,RSP
FILD U8 [RBX]
FSTP U8 [RBX]
FWAIT
POP RDX
IRET
IRQ51: //TO_INT_RCX
PUSH RCX
MOV RBX,RSP
FLD U8 [RBX]
FISTP U8 [RBX]
FWAIT
POP RCX
IRET
IRQ52: //TO_DOUBLE_RCX
PUSH RCX
MOV RBX,RSP
FILD U8 [RBX]
FSTP U8 [RBX]
FWAIT
POP RCX
IRET
IRQ53: PUSH RDX
MOV RDX,0x53
JMP U1 IRQFAULT
//************************************ SOFTWARE INT'S ******************************
IRQFAULT::
PUSH RAX
XOR EAX,EAX
MOV RAX,FS:TSS_ABSOLUTE_ADDRESS[RAX]
MOV U4 TSS_FAULT_NUM[RAX],EDX
POP RAX
POP RDX
CALL SAVE_CONTEXT
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
MOV RSP,RAX
MOV RAX,TSS_RAX[RSI]
MOV RBP,TSS_RBP[RSI]
MOV RSI,TSS_RSI[RSI]
CALL CP_FAULT2
JMP U4 CONT_SWAP2