[comp.sys.ibm.pc] Display interrupt vectors

ralf@B.GP.CS.CMU.EDU (Ralf Brown) (02/14/88)

Steve Conklin sent me this because he can't post.  Please direct any 
correspondence to him at {backbone}!ingr!tesla!steve, not to me.

#! /bin/sh
#
# this is a shell archive, meaning:
# 1. remove everything above the #! /bin/sh line
# 2. save the resulting text in a file
# 3. execute the file with /bin/sh (not csh) to create the files:
#	INTS.DOC
#	INTS.ASM
#	INTS.EXE.UU
# created: 14:44:53 (02/09/88)
# on node: tesla
# by:      steve (Steve Conklin @ Intergraph)
export PATH; PATH=/bin:/usr/bin:
if test -f 'INTS.DOC'
then
	echo "shar: will not over-write existing file:'INTS.DOC'"
else
	echo "x - INTS.DOC"
	cat <<\!SHAR_EOF! >'INTS.DOC'
INTS will show you the contents of the zero-page interrupt vectors on a
PC or clone. It will print a list of the interrupt numbers, with the
associated segment:offset addresses. If the vector contains a zero, that
interrupt will not be displayed. If it is non-zero, the first location
of the interrupt service routine is examined, and if it is an IRET (interrupt
return) instruction, then "--> IRET" is printed next to the address.

All values are printed in hexadecimal.

The most common use of this routine is to determine which interrupts a TSR
is stealing. To do this, run ints with and without the TSR loaded, directing
output into files, then compare the two files.

Glancing thru the code now, I see some things that might be redundant, but
it works, so I'm not going to fix it. 

Constructive comments are welcome.

		Steve Conklin		{uunet,ihnp4}!ingr!tesla!steve
		Intergraph Corp.
		Huntsville, AL 35807
		(205) 772-6888

Relax, Don't worry, Have a homebrew.


!SHAR_EOF!
	if [ ` wc -c < 'INTS.DOC'` -ne     971 ]
	then
		echo "'INTS.DOC' damaged in transit"
		echo "	received: `wc -c < INTS.DOC` characters"
		echo "	original:     971 characters"
	fi
fi
if test -f 'INTS.ASM'
then
	echo "shar: will not over-write existing file:'INTS.ASM'"
else
	echo "x - INTS.ASM"
	cat <<\!SHAR_EOF! >'INTS.ASM'
PAGE 60,132
TITLE INTS.ASM - A program to list interrupt vectors
;INTS.ASM
; This program should list the interrupt vectors found in page zero.
; It runs under DOS 3.2, and should work with all 3.x versions -
; I think that the only thing that makes it version dependent is the
; terminate with return code function.
;
; Steve Conklin - 12/6/86
; uunet!ingr!tesla!steve
; Intergraph Corp. (205) 772-6888
;
;
CRLF	EQU	0D0AH

DATA_SEG	SEGMENT

XLAT_TABLE	DB	'0123456789ABCDEF'

HEADER		DB	'Listing of interrupt vectors for MS-DOS'
		DW	CRLF
		DW	CRLF
		DB	'Vectors containing 0000:0000 will not be listed.'
		DW	CRLF
		DW	CRLF
		DB	'INT   VECTOR'
		DW	CRLF
		DB	'---   ------'
		DW	CRLF 
		DB	'$'

INT_MSG		DB	' '
INT_VAL		DB	'XX'
		DB	' - '
VEC_SEG		DB	'XXXX:'
VEC_OFF		DB	'XXXX'
		DB	'$'

IRET_MSG	DB	' --> IRET'
		DB	'$'

DATA_SEG	ENDS


CODE_SEG	SEGMENT
	ASSUME	CS:CODE_SEG,DS:DATA_SEG

START:

	MOV	AX,DATA_SEG		;set up data segment register
	MOV	DS,AX

	MOV	DX,OFFSET HEADER	;offset of sign-on
	MOV	AH,09H			;request 09 - send string to std out
	INT	21H			;print it


	MOV	AL,00			;start with int vector 00

DO_IT:

	MOV	AH,35h			;int 21h request 35h - return vector
	MOV	DI,OFFSET INT_VAL	;Put INT value in string
	CALL	BYTEHEX			;

	INT	21H

	PUSH	AX			;see if vector is 0000:0000
	PUSH	ES			;and don't print it if it is
	POP	AX			;
	CMP	AX,0000H		;
	JNE	O_K			;
	MOV	AX,BX			;
	CMP	AX,0000H		;
	JNE	O_K			;
	POP	AX			;
	JMP	SKIP_IT			;
O_K:	POP	AX			;

	PUSH	AX

	MOV	AX,ES			;get vector CS in AX
	MOV	DI,OFFSET VEC_SEG	;convert and put in string
	CALL	BINHEX			;

	MOV	AX,BX			;get vector IP in AX
	MOV	DI,OFFSET VEC_OFF	;convert and put in string
	CALL	BINHEX			;

	MOV	AH,09H			;print string to std out
	MOV	DX,OFFSET INT_MSG
	INT	21H			;print it

;see if vector points to an IRET, and print something if it does.

	MOV	AX,ES:[BX]		;get the word at ES:BX
	CMP	AL,0CFH			;IRET is CF hex
	JNE	FINI
	MOV	AH,09H			;print string to std out
	MOV	DX,OFFSET IRET_MSG
	INT	21H			;print it

;finish up

FINI:
	CALL	SEND_CRLF		;print a newline

	POP AX

SKIP_IT:
	CMP	AL,255
	JE	DONE
	INC	AL
	JMP	DO_IT
DONE:
	MOV	AH,4CH			;terminate process
	MOV	AL,00H			;normal return code
	INT	21H
	


; SEND_CRLF will send a carriage return and line feed to std out

SEND_CRLF	PROC	NEAR

	PUSH	AX
	PUSH	DX

	MOV	AH,02H			;send char to active display
	MOV	DL,0DH			;carriage return
	INT	21H			;do it
	MOV	DL,0AH			;line feed
	INT	21H			;do it

	POP	DX
	POP	AX

	RET

SEND_CRLF	ENDP



; BINHEX will take the value in AX and convert it into four hex ASCII
; bytes and put them at the location given in DS:DI, MSB first.

BINHEX	PROC	NEAR

	PUSH	BX
	PUSH	CX
	PUSH	DX
	PUSH	ES
	PUSH	AX
	PUSH	AX

	MOV	AX,DS		;ES is segment for string store instruction
	MOV	ES,AX		;so copy DS there
	POP	AX

	MOV	BX,OFFSET XLAT_TABLE	;set up for translation
	CLD				;make sure direction is set to inc DI


	MOV	DX,AX		;save a copy

	MOV	AL,DH		;then get the high byte into AL
	MOV	CL,4		;and shift the most sig. nybble into
	SHR	AL,CL		;the low nybble of AL (SHR shifts in zeros)
	XLAT	XLAT_TABLE	;do the translation
	STOSB			;move AL to ES:DI
	
	MOV	AL,DH		;get a copy of the next nybble into AL
	AND	AL,0FH		;and isolate it
	XLAT	XLAT_TABLE
	STOSB

	MOV	AL,DL		;third nybble
	MOV	CL,4		;shift it
	SHR	AL,CL
	XLAT	XLAT_TABLE
	STOSB

	MOV	AL,DL		;least significant nybble
	AND	AL,0FH		;isolate
	XLAT	XLAT_TABLE
	STOSB

	POP	AX
	POP	ES
	POP	DX
	POP	CX
	POP	BX

	RET

BINHEX	ENDP


; Bytehex will take the value in AL and convert it into two hex ASCII
; bytes and put them at the location given in DI, MSB first.

BYTEHEX	PROC	NEAR

	PUSH	BX
	PUSH	CX
	PUSH	DX
	PUSH	ES
	PUSH	AX
	PUSH	AX

	MOV	AX,DS		;ES is segment for string store instruction
	MOV	ES,AX		;
	POP	AX

	MOV	BX,OFFSET XLAT_TABLE	;set up for translation
	CLD				;make sure direction is set to inc DI


	MOV	DX,AX		;save a copy

	MOV	AL,DL		;first nybble
	MOV	CL,4		;shift it
	SHR	AL,CL
	XLAT	XLAT_TABLE
	STOSB

	MOV	AL,DL		;last nybble
	AND	AL,0FH		;isolate
	XLAT	XLAT_TABLE
	STOSB

	POP	AX
	POP	ES
	POP	DX
	POP	CX
	POP	BX

	RET

BYTEHEX	ENDP


	CODE_SEG	ENDS
	END	START		;Make sure we start at "START" first time.

!SHAR_EOF!
	if [ ` wc -c < 'INTS.ASM'` -ne    4143 ]
	then
		echo "'INTS.ASM' damaged in transit"
		echo "	received: `wc -c < INTS.ASM` characters"
		echo "	original:    4143 characters"
	fi
fi
if test -f 'INTS.EXE.UU'
then
	echo "shar: will not over-write existing file:'INTS.EXE.UU'"
else
	echo "x - INTS.EXE.UU"
	cat <<\!SHAR_EOF! >'INTS.EXE.UU'
begin 664 INTS.EXE
M35IV 0(  0 @    __\     66,     '@    $  0                  
M                                                            
M                                                            
M                                                            
M                                                            
M                                                            
M                                                            
M                                                            
M                                                            
M                                                            
M                                                            
M                      "X#0".V+H0 +0)S2&P +0UOXT Z)  S2%0!E@]
M  !U"XO#/0  =018ZRR06%",P+^2 .@^ (O#OY< Z#8 M FZC #-(2:+!SS/
M=0>T";J< ,TAZ \ 6#S_= 3^P.NPM$RP ,TA4%*T K(-S2&R"LTA6EC#4U%2
M!E!0C-B.P%B[  #\B]"*QK$$TNC7JHK&) _7JHK"L032Z->JBL(D#]>J6 =:
M65O#4U%2!E!0C-B.P%B[  #\B]"*PK$$TNC7JHK") _7JE@'6EE;PP      
M,#$R,S0U-C<X.4%"0T1%1DQI<W1I;F<@;V8@:6YT97)R=7!T('9E8W1O<G,@
M9F]R($U3+41/4PH-"@U696-T;W)S(&-O;G1A:6YI;F<@,# P,#HP,# P('=I
M;&P@;F]T(&)E(&QI<W1E9"X*#0H-24Y4(" @5D5#5$]2"@TM+2T@(" M+2TM
?+2T*#20@6%@@+2!86%A8.EA86%@D("TM/B!)4D54)$]2
 
end
!SHAR_EOF!
	if [ ` wc -c < 'INTS.EXE.UU'` -ne    1249 ]
	then
		echo "'INTS.EXE.UU' damaged in transit"
		echo "	received: `wc -c < INTS.EXE.UU` characters"
		echo "	original:    1249 characters"
	fi
fi
exit 0
# end of shell archive


-- 
{harvard,uunet,ucbvax}!b.gp.cs.cmu.edu!ralf -=-=- AT&T: (412)268-3053 (school) 
ARPA: RALF@B.GP.CS.CMU.EDU |"Tolerance means excusing the mistakes others make.
FIDO: Ralf Brown at 129/31 | Tact means not noticing them." --Arthur Schnitzler
BITnet: RALF%B.GP.CS.CMU.EDU@CMUCCVMA -=-=- DISCLAIMER? I claimed something?