📄 int386.asm
字号:
;****************************************************************************
;* *
;* cane - A softdog killer *
;* Copyright (C) 1996, by Li Wen_Xian *
;* All rights reserved. *
;* *
;* This file is: INT386.ASM, the VM interrupt handlers *
;* *
;****************************************************************************
INCLUDE EQUMAC.INC
INT386_FILE EQU 1
INCLUDE EXTERNAL.INC
;fake segment for far ret interrupts
;(this segment has no descriptor in GDT/LDT)
QISR SEGMENT PARA PUBLIC 'CODE16' USE16
ASSUME CS:QISR
;push sacrifical words for IRET to eat.
;PL0 stack controls return anyway
QIRET:
PUSH 0
PUSH 0
PUSH 0
IRET
QISR ENDS
;IDT segment
IDTABLE SEGMENT
IDTBEG EQU $
DQ TOPINT+1 DUP (0)
IDTEND EQU $
IDTABLE ENDS
;ISR segment
DEFINT MACRO N
INT&N LABEL FAR
DB 6AH
DB N
JMP NEAR PTR INTDUMP
ENDM
ISR SEGMENT
ASSUME CS:ISR
ISRBEG EQU $
;This code defines interrupt handlers form 0 to TOPINT
;(TOPINT is defined in EQUMAC.INC)
;The interrupt code assumes these routines are the same
;size -- even if the assembler tells you that some of
;them can be compatcted with an override -- don't do it
;Also, don't let the assembler make multiple passes to
;compact this code automatically.
INTNO = 0
REPT TOPINT+1
DEFINT %INTNO
INTNO = INTNO+1
ENDM
;Debug dump messages
MESSAGEA DB 'INT=',0
STKM DB 'Stack dump:',0
TASKM DB 'TR=',0
RTABLE DB 'G'
DB 'F'
DB 'D'
DB 'E'
GTABLE DB 'DISIBPSPBXDXCXAX'
MEMMESS DB 'Memory Dump:',0
;****************************************************************************
;All interrupts come here *
;We check for the interrupt # pushed on the stack and *
;vector accordingly. This adds some interrupt latency, *
;but simplifies IDT construction. *
;****************************************************************************
INTDUMP LABEL NEAR
PUSHAD
PUSH ES
PUSH FS
PUSH GS
MOV AX,SEL_DATA0 ;ES ---> SEL_DATA0
MOV ES,AX
MOV AX,SEL_DATA ;FS ---> SEL_DATA
MOV FS,AX
MOV ECX,[ESP+2CH]
AND ECX,000000FFH
MOV [ESP+2CH],ECX ;interrupt no.
MOV ECX,[ESP+2CH] ;INT No
CMP ECX,00H ;DIVIDE BY 0 INTERRUPT
JZ INT00H
CMP ECX,01H ;STEP
JZ INTNN
CMP ECX,02H ;NMI
JZ INTNN
CMP ECX,03H ;BREAKPOINT INTERRUPT
JZ INTNN
CMP ECX,04H ;OVERFLOW INTERRUPT
JZ INTNN
CMP ECX,08H
JB NOTINT08_0F
CMP ECX,0FH
JA NOTINT08_0F
SUB CL,08H
MOV AL,0BH ;write OCW3
OUT 20H,AL
IN AL,20H ;READ ISR
SHR AL,CL
AND AL,01H
JZ NOTHARDINT
INTNN:
MOV EAX,[ESP+38H] ;OLD FLAGS
AND EAX,0FFFFFEFFH ;CLEAR TF
MOV [ESP+38H],EAX
MOV EAX,[ESP+40H] ;OLD SS
SHL EAX,4
MOV EBX,[ESP+3CH] ;OLD ESP
SUB EBX,6
AND EBX,0FFFFH
ADD EBX,EAX
MOV ECX,[ESP+38H] ;OLD FLAGS
MOV EAX,[ESP+34H] ;OLD CS
AND EAX,0FFFFH
SHL ECX,10H
OR EAX,ECX
MOV ES:[EBX+2],EAX
MOV EAX,[ESP+30H] ;OLD EIP
MOV ES:[EBX],AX
MOV EAX,[ESP+3CH] ;OLD ESP
SUB EAX,6
AND EAX,0FFFFH
MOV [ESP+3CH],EAX ;NEW ESP
MOV EAX,[ESP+38H] ;FLAGS
AND EAX,0FFFFFDFFH ;CLEAR IF
MOV [ESP+38H],EAX
MOV EBX,[ESP+2CH] ;INT NO
MOV EAX,ES:[EBX*4]
MOV EDX,EAX
SHR EDX,10H
AND EAX,0FFFFH
MOV [ESP+30H],EAX
MOV [ESP+34H],EDX
POP GS
POP FS
POP ES
POPAD
ADD ESP,4
IRETD
INT00H:
MOV EAX,[ESP+38H] ;OLD FLAGS
AND EAX,0FFFFF606H ;CLEAR EXCEPT DF IF PF
MOV [ESP+38H],EAX
JMP INTNN
NOTINT08_0F:
CMP ECX,70H ;8259A 2
JB NOTHARDINT
CMP ECX,77H
JA NOTHARDINT
SUB CL,70H
MOV AL,0BH ;WRITE OCW3
OUT 20H,AL
IN AL,20H ;READ ISR
SHR AL,2
AND AL,01H
JZ NOTHARDINT
MOV AL,0BH ;WRITE OCW3
OUT 0A0H,AL
IN AL,0A0H ;READ ISR
SHR AL,CL
AND AL,01H
JZ NOTHARDINT
JMP INTNN
NOTHARDINT:
MOV EAX,[ESP+34H] ;OLD CS
SHL EAX,4
MOV EBX,[ESP+30H] ;OLD EIP
ADD EBX,EAX
MOV EAX,ES:[EBX-4] ;the interrupt instruction
AND EAX,00FF0000H
CMP EAX,00CD0000H
JNZ NOTINTNN
MOV EAX,ES:[EBX-4]
SHR EAX,24
CMP EAX,[ESP+2CH]
JNZ NOTINTNN
CMP EAX,15H
JZ INT15H
CMP EAX,21H
JZ INT21H
JMP INTNN
INT21H:
MOV AX,WORD PTR [ESP+28H]
CMP AX,0FEFEH
JZ GETPSP
CMP AX,0FEFFH
JZ BACKTOREAL
CMP AX,0FEFDH
JZ GETBUFADDR
CMP AX,0FEFCH
JZ SETBUFADDR
JMP INTNN
SETBUFADDR:
MOV AX,SEL_UDATA
MOV GS,AX
MOV EAX,[ESP+1CH] ;OLD EBX
MOV GS:PORTDATAADDR,EAX
ADD EAX,2
MOV GS:CURBLOCKADDR,EAX
MOV WORD PTR [ESP+28H],0 ;set eax
POP GS
POP FS
POP ES
POPAD
ADD ESP,4
IRETD
GETBUFADDR:
MOV AX,SEL_UDATA
MOV GS,AX
MOV EAX,GS:PORTDATAADDR
MOV [ESP+24H],EAX ;ecx the address
MOV AX,0H
MOV WORD PTR [ESP+28H],AX
POP GS
POP FS
POP ES
POPAD
ADD ESP,4
IRETD
GETPSP:
MOV AX,FS:_PSP
MOV WORD PTR [ESP+28H],AX
POP GS
POP FS
POP ES
POPAD
ADD ESP,4
IRETD
BACKTOREAL:
MOV AL,20H
CMP FS:_PC386,0
JNZ SHORT NOTANAT1
OUT 0A0H,AL
NOTANAT1:
OUT 20H,AL ;just in case hardware did it
MOV EAX,SEG _RTCSIP
SHL EAX,4
MOV EBX,OFFSET _RTCSIP
ADD EBX,EAX
MOV AX,WORD PTR [ESP+30H] ;OLD IP
MOV WORD PTR ES:[EBX],AX
MOV AX,WORD PTR [ESP+34H] ;OLD CS
MOV WORD PTR ES:[EBX+2],AX
MOV AX,WORD PTR [ESP+38H] ;OLD FLAG
MOV WORD PTR ES:[EBX+4],AX
MOV AX,WORD PTR [ESP+44H] ;OLD ES
MOV WORD PTR ES:[EBX+6],AX
MOV AX,WORD PTR [ESP+48H] ;OLD DS
MOV WORD PTR ES:[EBX+8],AX
MOV AX,WORD PTR [ESP+40H] ;OLD SS
MOV WORD PTR ES:[EBX+0AH],AX
MOV AX,WORD PTR [ESP+14H] ;OLD BP
MOV WORD PTR ES:[EBX+0CH],AX
MOV AX,WORD PTR [ESP+3CH] ;OLD SP
MOV WORD PTR ES:[EBX+0EH],AX
MOV AX,WORD PTR [ESP+0CH] ;OLD DI
MOV WORD PTR ES:[EBX+10H],AX
MOV AX,WORD PTR [ESP+10H] ;OLD SI
MOV WORD PTR ES:[EBX+12H],AX
MOV AX,WORD PTR [ESP+20H] ;OLD DX
MOV WORD PTR ES:[EBX+14H],AX
MOV AX,WORD PTR [ESP+24H] ;OLD CX
MOV WORD PTR ES:[EBX+16H],AX
MOV AX,WORD PTR [ESP+1CH] ;OLD BX
MOV WORD PTR ES:[EBX+18H],AX
MOV AX,WORD PTR [ESP+28H] ;OLD AX
MOV WORD PTR ES:[EBX+1AH],AX
POP GS
POP FS
POP ES
POPAD
ADD ESP,4
BACK2REAL
INT15H:
MOV EAX,[ESP+28H] ;OLD EAX
SHR EAX,8
AND EAX,0FFH ;OLD AH
CMP EAX,87H
JZ TRANSDATA
CMP EAX,88H
JZ MEMORYCHECK
JMP INTNN
TRANSDATA:
MOV AX,SEL_GDT ;GS ---> SEL_GDT
MOV GS,AX
MOV EAX,[ESP+44H] ;OLD ES
AND EAX,0FFFFH
SHL EAX,4
MOV EBX,[ESP+10H] ;OLD SI
AND EBX,0FFFFH
ADD EBX,EAX
MOV EAX,ES:[EBX+10H] ;SOURCE
MOV GS:[SEL_15S],EAX
MOV EAX,ES:[EBX+14H]
MOV GS:[SEL_15S+4],EAX
MOV EAX,ES:[EBX+18H] ;DESTINATION
MOV GS:[SEL_15D],EAX
MOV EAX,ES:[EBX+1CH]
MOV GS:[SEL_15D+4],EAX
MOV CX,WORD PTR [ESP+24H] ;TRANS LEN
MOVZX ECX,CX
PUSH DS
MOV AX,SEL_15S
MOV DS,AX ;SOURCE TRANS
MOV AX,SEL_15D
MOV ES,AX ;DESTINATION TRANS
XOR ESI,ESI
XOR EDI,EDI
CLD
REP MOVSW
POP DS
MOV [ESP+28H],EAX
POP GS
POP FS
POP ES
POPAD
ADD ESP,4
IRETD
MEMORYCHECK:
MOV AL,31H
OUT 70H,AL
IN AL,71H
SHL EAX,8
MOV AL,30H
OUT 70H,AL
IN AL,71H
AND EAX,0FFFFH
MOV [ESP+28H],EAX
POP GS
POP FS
POP ES
POPAD
ADD ESP,4
IRETD
NOTINTNN: ; Is trap
MOV ECX,[ESP+2CH]
CMP ECX,0DH
JNZ NOTGP
;Is 13, general protect error
MOV EAX,[ESP+34H+4] ;OLD CS
AND EAX,0FFFFH
SHL EAX,4
MOV EBX,[ESP+30H+4] ;OLD EIP
ADD EBX,EAX
MOV EAX,ES:[EBX] ;current instruction
AND EAX,0FFH
CMP EAX,0FH
JNZ NOTMOV ;NOT mov instruction
MOV EAX,ES:[EBX] ;current instruction
SHR EAX,8
AND EAX,0FFH
CMP EAX,22H
JZ SKIPINSTRUCTION
CMP EAX,23H
JZ SKIPINSTRUCTION
CMP EAX,26H
JZ SKIPINSTRUCTION
CMP EAX,20H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -