📄 int386.asm
字号:
MOV AL,[RTABLE-1+ECX]
CALL32F SEL_CODE32,OUCH
MOV AL,'S'
CALL32F SEL_CODE32,OUCH
MOV AL,'='
CALL32F SEL_CODE32,OUCH
POP EAX
CALL32F SEL_CODE32,HEXOUT2
PUSH ECX
MOV ECX,6
LSP1: MOV AL,' '
CALL32F SEL_CODE32,OUCH
LOOP LSP1
POP ECX
LOOP INTL1
CALL32F SEL_CODE32,CRLF
XOR ECX,ECX
INTL2: CMP CL,5
JNZ SHORT NOCRINT
CALL32F SEL_CODE32,CRLF
NOCRINT:
MOV AL,'E'
CALL32F SEL_CODE32,OUCH
MOV AL,[GTABLE+ECX*2]
CALL32F SEL_CODE32,OUCH
MOV AL,[GTABLE+1+ECX*2]
CALL32F SEL_CODE32,OUCH
MOV AL,'='
CALL32F SEL_CODE32,OUCH
POP EAX
CALL32F SEL_CODE32,HEXOUT4
MOV AL,' '
CALL32F SEL_CODE32,OUCH
INC CL
CMP CL,8
JNE SHORT INTL2
MOV EBX,OFFSET MESSAGEA
CALL32F SEL_CODE32,MESSOUT
POP EAX
CALL32F SEL_CODE32,HEXOUT
MOV EBX,OFFSET TASKM
CALL32F SEL_CODE32,MESSOUT
STR AX
CALL32F SEL_CODE32,HEXOUT2
CALL32F SEL_CODE32,CRLF
;stack dump
MOV AX,SS
MOVZX EAX,AX
LSL EDX,EAX
JNZ SHORT INTABT
MOV EBX,OFFSET STKM
CALL32F SEL_CODE32,MESSOUT
XOR CL,CL
MOV SI,64
INTL3: CMP ESP,EDX
JAE SHORT INTABT
DEC SI
JZ SHORT INTABT
TEST CL,7
JNZ SHORT NOSCR
CALL32F SEL_CODE32,CRLF
NOSCR:
POP EAX
CALL32F SEL_CODE32,HEXOUT4
INC CL
MOV AL,' '
CALL32F SEL_CODE32,OUCH
JMP SHORT INTL3
INTABT:
;check for memory dump request
MOV AX,SEL_DATA
MOV DS,AX
ASSUME DS:DAT32
MOV AX,WORD PTR DUMP_SEG
OR AX,AX
JZ SHORT NOMEMDUMP
;come here to do memory dump
CALL32F SEL_CODE32,CRLF
PUSH DS
PUSH CS
POP DS
MOV EBX,OFFSET MEMMESS
CALL32F SEL_CODE32,MESSOUT
CALL32F SEL_CODE32,CRLF
POP DS
MOV AX,WORD PTR DUMP_SEG
MOV ES,AX
CALL32F SEL_CODE32,HEXOUT2
MOV AL,':'
CALL32F SEL_CODE32,OUCH
MOV EDX,DUMP_OFF
MOV EAX,EDX
CALL32F SEL_CODE32,HEXOUT4
MOV ECX,DUMP_CNT
DUMPLOOP:
MOV AL,' '
CALL32F SEL_CODE32,OUCH
MOV EAX,ES:[EDX] ;get word
CALL32F SEL_CODE32,HEXOUT4
ADD EDX,4
SUB ECX,4
JA SHORT DUMPLOOP
CALL32F SEL_CODE32,CRLF
NOMEMDUMP:
MOV AL,20H ;Send EOI signal
CMP _PC386,0
JNZ SHORT NOTANAT2
OUT 0A0H,AL
NOTANAT2:
OUT 20H,AL ;just in case hardware did it
MOV AL,7FH ;return 7f to dos
BACK2DOS
;*****************************************************************************
;* Here emulation input a data from a port *
;*****************************************************************************
CHECKINPORT PROC FAR
PUSH EBX
PUSH ECX
PUSH EDX
PUSH ESI
PUSH EDI
MOV BYTE PTR GS:_CURTYPE,AL
MOV WORD PTR GS:_CURPORT,DX
MOV ESI,GS:CURBLOCKADDR
MOV EDI,ESI
MOV EBX,GS:BYTESCOUNTER
CMPINPORT:
MOV AL,BYTE PTR GS:_CURTYPE
CMP AL,BYTE PTR ES:[ESI+EBX+4] ;DATA TYPE
JNZ INSEARCHNEXTBLOCK
MOV DX,WORD PTR GS:_CURPORT
CMP DX,WORD PTR ES:[ESI+EBX+5] ;PORT NO
JNZ INSEARCHNEXTBLOCK
MOV GS:CURBLOCKADDR,ESI
MOV GS:BYTESCOUNTER,EBX
CMP AL,0
JZ INBYTE
CMP AL,1
JZ INWORD
CMP AL,2
JZ INDWORD
MOV AL,GS:_CURTYPE
POP EDI
POP ESI
POP EDX
POP ECX
POP EBX
STC
RETF
INBYTE:
MOV EAX,GS:BYTESCOUNTER
ADD EAX,4
CMP EAX,ES:[ESI]
JB INNOTCIRCLE1
MOV EAX,0
INNOTCIRCLE1:
MOV GS:BYTESCOUNTER,EAX
MOV AL,BYTE PTR ES:[ESI+EBX+7]
POP EDI
POP ESI
POP EDX
POP ECX
POP EBX
CLC
RETF
INWORD:
MOV EAX,GS:BYTESCOUNTER
ADD EAX,5
CMP EAX,ES:[ESI]
JB INNOTCIRCLE2
MOV EAX,0
INNOTCIRCLE2:
MOV GS:BYTESCOUNTER,EAX
MOV AX,WORD PTR ES:[ESI+EBX+7]
POP EDI
POP ESI
POP EDX
POP ECX
POP EBX
CLC
RETF
INDWORD:
MOV EAX,GS:BYTESCOUNTER
ADD EAX,7
CMP EAX,ES:[ESI]
JB INNOTCIRCLE3
MOV EAX,0
INNOTCIRCLE3:
MOV GS:BYTESCOUNTER,EAX
MOV EAX,DWORD PTR ES:[ESI+EBX+7]
POP EDI
POP ESI
POP EDX
POP ECX
POP EBX
CLC
RETF
INSEARCHNEXTBLOCK:
MOV EAX,ES:[EDI]
ADD EDI,EAX
ADD EDI,4
MOV EAX,ES:[EDI]
CMP EAX,EBX
JB INEMULATIONERROR
MOV EDX,EBX
MOV EBX,0
CMPINLOOP:
CMP EBX,EDX
JZ INEQUAL
MOV AL,ES:[ESI+EBX+4]
CMP AL,ES:[EDI+EBX+4]
JNZ INNOTEQUAL
INC EBX
JMP CMPINLOOP
INEQUAL:
MOV EBX,EDX
MOV ESI,EDI
JMP CMPINPORT
INNOTEQUAL:
MOV EBX,EDX
JMP INSEARCHNEXTBLOCK
INEMULATIONERROR:
MOV AL,GS:_CURTYPE
POP EDI
POP ESI
POP EDX
POP ECX
POP EBX
STC
RETF
CHECKINPORT ENDP
;*****************************************************************************
;* Here emulation output a data to a port *
;*****************************************************************************
CHECKOUTPORT PROC FAR
PUSH EBX
PUSH ECX
PUSH EDX
PUSH ESI
PUSH EDI
MOV BYTE PTR GS:_CURTYPE,BL ;current type
MOV WORD PTR GS:_CURPORT,DX ;current port
MOV DWORD PTR GS:_CURVALUE,EAX ;current output value
MOV ESI,GS:CURBLOCKADDR
MOV EDI,ESI
MOV EBX,GS:BYTESCOUNTER
CMPOUTPORT:
MOV AL,BYTE PTR GS:_CURTYPE
CMP AL,BYTE PTR ES:[ESI+EBX+4] ;DATA TYPE
JNZ OUTSEARCHNEXTBLOCK
MOV DX,WORD PTR GS:_CURPORT
CMP DX,WORD PTR ES:[ESI+EBX+5] ;PORT NO
JNZ OUTSEARCHNEXTBLOCK
CMP AL,10H
JZ OUTBYTE
CMP AL,11H
JZ OUTWORD
CMP AL,12H
JZ OUTDWORD
POP EDI
POP ESI
POP EDX
POP ECX
POP EBX
STC
RETF
OUTBYTE:
MOV EAX,DWORD PTR GS:_CURVALUE
CMP AL,BYTE PTR ES:[ESI+EBX+7]
JNZ OUTSEARCHNEXTBLOCK
MOV GS:CURBLOCKADDR,ESI
MOV GS:BYTESCOUNTER,EBX
MOV EAX,GS:BYTESCOUNTER
ADD EAX,4
CMP EAX,ES:[ESI]
JB OUTNOTCIRCLE1
MOV EAX,0
OUTNOTCIRCLE1:
MOV GS:BYTESCOUNTER,EAX
POP EDI
POP ESI
POP EDX
POP ECX
POP EBX
CLC
RETF
OUTWORD:
MOV EAX,DWORD PTR GS:_CURVALUE
CMP AX,WORD PTR ES:[ESI+EBX+7]
JNZ OUTSEARCHNEXTBLOCK
MOV GS:CURBLOCKADDR,ESI
MOV GS:BYTESCOUNTER,EBX
MOV EAX,GS:BYTESCOUNTER
ADD EAX,5
CMP EAX,ES:[ESI]
JB OUTNOTCIRCLE2
MOV EAX,0
OUTNOTCIRCLE2:
MOV GS:BYTESCOUNTER,EAX
POP EDI
POP ESI
POP EDX
POP ECX
POP EBX
CLC
RETF
OUTDWORD:
MOV EAX,DWORD PTR GS:_CURVALUE
CMP EAX,DWORD PTR ES:[ESI+EBX+7]
JNZ OUTSEARCHNEXTBLOCK
MOV GS:CURBLOCKADDR,ESI
MOV GS:BYTESCOUNTER,EBX
MOV EAX,GS:BYTESCOUNTER
ADD EAX,7
CMP EAX,ES:[ESI]
JB OUTNOTCIRCLE3
MOV EAX,0
OUTNOTCIRCLE3:
MOV GS:BYTESCOUNTER,EAX
POP EDI
POP ESI
POP EDX
POP ECX
POP EBX
CLC
RETF
OUTSEARCHNEXTBLOCK:
MOV EAX,ES:[EDI]
ADD EDI,EAX
ADD EDI,4
MOV EAX,ES:[EDI]
CMP EAX,EBX
JB OUTEMULATIONERROR
MOV EDX,EBX
MOV EBX,0
CMPOUTLOOP:
CMP EBX,EDX
JZ OUTEQUAL
MOV AL,ES:[ESI+EBX+4]
CMP AL,ES:[EDI+EBX+4]
JNZ OUTNOTEQUAL
INC EBX
JMP CMPOUTLOOP
OUTEQUAL:
MOV EBX,EDX
MOV ESI,EDI
JMP CMPOUTPORT
OUTNOTEQUAL:
MOV EBX,EDX
JMP OUTSEARCHNEXTBLOCK
OUTEMULATIONERROR:
POP EDI
POP ESI
POP EDX
POP ECX
POP EBX
STC
RETF
CHECKOUTPORT ENDP
ISREND EQU $
ISR ENDS
ISRLEN EQU (ISREND-ISRBEG)-1
IDTLEN EQU (IDTEND-IDTBEG)-1
INTLEN EQU (INT1-INT0)
PUBLIC ISRLEN,IDTLEN,INT0,INT1
PUBLIC IDTBEG,INTLEN,MESSAGEA
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -