⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 irqfunc.asm

📁 访问32位PCI总线IRQ的例程
💻 ASM
字号:
;
; Interrupt vector hook functions for IBM-AT or compatible machine's & needs CPU 386 or later)
;

;use  TASM.EXE V2.01 or later
;
;      TASM /jSMART /jJUMPS /uM520 /jLOCALS /m8 /t
;
.386p
CGROUP	GROUP TEXT,_TEXT

_TEXT SEGMENT BYTE PUBLIC 'CODE' USE16
_TEXT ENDS

TEXT SEGMENT BYTE PUBLIC 'CODE' USE16
     ASSUME  CS:CGROUP,DS:NOTHING,ES:NOTHING

;**************************
; Hook IRQ vector
;
; unsigned long _hookIRQ(unsigned int IRQ,unsigned int CallBackRoutine);
;
;       入力    AX	IRQ Level (0-15)
;               BX      CallBackRoutine's Offset address
;       出力    BX:AX	Original Vector Address
;       破壊    None
;**************************
hookIRQ_ PROC C NEAR PUBLIC USES SI DS

    ASSUME DS:NOTHING, ES:NOTHING

	PUSHF
	CLI

	CMP	AX, 16
	JA	@@Error

	MOV	CS:[userDS], DS
	ADD	AX, AX
	MOV	SI, AX
	MOV	CS:[callBackRoutineAddress+SI], BX

	ADD	AX, AX
	MOV	SI, 8*4
	CMP	AX, 8*4
	JB	@@CalcVector
	MOV	SI, (70H-8)*4
@@CalcVector:
	ADD	SI, AX
	XOR	AX, AX
	MOV	DS, AX
	MOV	AX, OFFSET CGROUP:hookedIRQHandler
	MOV	BX, CS
	XCHG	AX, DS:[SI]
	XCHG	BX, DS:[SI+2]
	JMP	@@Exit
@@Error:
	XOR	AX, AX
	XOR	BX, BX
@@Exit:
	POPF
	RET

hookIRQ_ ENDP

;**************************
; Free IRQ vector for IBM-AT
;
; void _freeIRQ(unsigned int IRQ,unsigned long OriginalVector);
;
;       入力    AX	IRQ Level (0-15)
;               CX      OriginalVector's Offset address
;               DX      OriginalVector's Segment address
;       出力    None
;       破壊    AX
;**************************
freeIRQ_ PROC C NEAR PUBLIC USES SI DS

	PUSHF
	CLI
	CMP	AX, 16
	JA	@@Exit

	MOV	SI, 8*4
	CMP	AX, 8
	JB	@@CalcVector
	MOV	SI, (70H-8)*4
@@CalcVector:
	SHL	AX, 2
	ADD	SI, AX
	XOR	AX, AX
	MOV	DS, AX
	MOV	DS:[SI],CX
	MOV	DS:[SI+2],DX
@@Exit:
	POPF
	RET

freeIRQ_ ENDP

;**************************
; Mask/UnMask IRQ
;
;unsigned int _maskIRQ(unsigned int IRQ,unsigned int MaskStatus);
;
;       入力    AX	IRQ Level (0-15)
;		BX	Mask Status
;			0) UnMask
;			1) Mask
;       出力    AX	Previous mask status
;       破壊    None
;**************************
maskIRQ_ PROC C NEAR PUBLIC USES CX DX

	PUSHF
	CLI
	CMP	AX, 16
	JA	@@Exit

	MOV	CL, AL
	MOV	DX, 1
	ROL	DX, CL
	SHL	BX, CL
	MOV	CX, DX
	NOT	CX

	IN	AL, 0A1H
	MOV	AH, AL
	IN	AL, 021H
	AND	DX, AX
	AND	AX, CX
	OR	AX, BX
	CMP	AH, 0FFH
	JNE	@@SetMask	; Jump if not all mask slave.
	OR	AL, 1 SHL 2
@@SetMask:
	OUT	021H, AL
	MOV	AL, AH
	OUT	0A1H, AL

	TEST	DX, DX
	SETNZ	AL
	XOR	AH, AH
@@Exit:
	POPF
	RET

maskIRQ_ ENDP

;**************************
; IRQ0 vector
;
;       入力    None
;       出力    None
;       破壊    None
;**************************
hookedIRQHandler PROC FAR PUBLIC

    ASSUME  DS:NOTHING,ES:NOTHING,FS:NOTHING,GS:NOTHING

	PUSHAD
	PUSH	DS
	PUSH	ES
	PUSH	FS
	PUSH	GS

	MOV	AL, 0BH
	OUT	20H, AL
	OUT	0A0H, AL
	IN	AL, 0A0H
	MOV	AH, AL
	IN	AL, 20H
	
	DB	0FH,0BDH,0D8H	;BSR	BX, AX
	JZ	@@exit		; Jump if not in interrupt service

	ADD	BX, BX
	PUSH	AX
	MOV	DS, CS:[userDS]
	MOV	ES, CS:[userDS]
	CALL	CS:[callBackRoutineAddress+BX]
	POP	AX
	MOV	AL, 20H
	TEST	AH, AH
	JZ	@@EOIMaster
	OUT	0A0H, AL
@@EOIMaster:
	OUT	020H, AL

@@exit:
	POP	GS
	POP	FS
	POP	ES
	POP	DS
	POPAD
	IRET

hookedIRQHandler ENDP

userDS	DW	?
callBackRoutineAddress	DW	16 DUP(0)


TEXT ENDS

     END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -