; --------------------------------------- ;
; VECTORS.ASM                             ;
;                                         ;
; Version 1.0                             ;
;                                         ;
; IC v2.0+ Installable Command            ;
;                                         ;
; Display contents of all 256 interrupt   ;
; vectors.                                ;
;                                         ;
; Copyright (C) 1992, Geoff Friesen B.Sc. ;
; All rights reserved.                    ;
;                                         ;
; Developed with: Borland TASM 2.5        ;
; --------------------------------------- ;

_TEXT           SEGMENT BYTE PUBLIC 'CODE'
		ASSUME  cs:_TEXT, ds:_TEXT, es:_TEXT, ss:_TEXT
		ORG     100h

CR              EQU     13
LF              EQU     10

CLINE		EQU	10ah
; HEXW		EQU	10ch
STDINIT		EQU	10eh

_vectors:
		lea     dx, msg
		mov     ah, 9
		int     21h
		int     20h

msg             DB      "NONCOM$"

code_entry      DW      _code
help_entry      DW      _help
byline_entry    DW      _byline
setup_entry     DW      _setup
cleanup_entry   DW      _cleanup

colon		DB	":$"
crlf		DB	CR, LF, '$'
space		DB	" $"

int0		DB	"Divide by zero$"
int1		DB	"Single-step$"
int2		DB	"NMI$"
int3		DB	"Breakpoint$"
int4		DB	"Overflow$"
int5		DB	"Bound/Print screen$"
int8		DB	"IRQ 0 - Timer$"
int9		DB	"IRQ 1 - Keyboard$"
intb		DB	"IRQ 3 - COM2$"
intc		DB	"IRQ 4 - COM1$"
intd		DB	"IRQ 5 - Fixed disk (XT) or LPT2 (AT+)$"
inte		DB	"IRQ 6 - Disk controller$"
intf		DB	"IRQ 7 - LPT1$"
int10		DB	"Video$"
int11		DB	"Equipment$"
int12		DB	"Memory$"
int13		DB	"Disk$"
int14		DB	"RS-232$"
int16		DB	"Keyboard$"
int17		DB	"Printer$"
int1a		DB	"Time of day / SND API$"
int20		DB	"DOS program terminate$"
int21		DB	"DOS services$"
int22		DB	"DOS terminate address$"
int23		DB	"DOS control-break$"
int24		DB	"DOS critical error handler$"
int25		DB	"DOS absolute disk read$"
int26		DB	"DOS absolute disk write$"
int27		DB	"DOS TSR$"
int2f		DB	"DOS multiplex interrupt$"
int33		DB	"Mouse$"
int67		DB	"EMS$"

ints		DW	int0
		DW	int1
		DW	int2
		DW	int3
		DW	int4
		DW	int5
		DW	2 DUP (0)
		DW	int8
		DW	int9
		DW	0
		DW	intb
		DW	intc
		DW	intd
		DW	inte
		DW	intf
		DW	int10
		DW	int11
		DW	int12
		DW	int13
		DW	int14
		DW	0
		DW	int16
		DW	int17
		DW	2 DUP (0)
		DW	int1a
		DW	5 DUP (0)
		DW	int20
		DW	int21
		DW	int22
		DW	int23
		DW	int24
		DW	int25
		DW	int26
		DW	int27
		DW	7 DUP (0)
		DW	int2f
		DW	3 DUP (0)
		DW	int33
		DW	51 DUP (0)
		DW	int67
		DW	152 DUP (0)

_code           PROC    NEAR
		push	cs
		pop	ds

		mov	ax, 0
		mov	es, ax

		xor	bx, bx		; Point to interrupt table.
_code1:
		mov	ax, bx		; Display interrupt number.
		shr	ax, 1
		shr	ax, 1
		call	hexw

		lea	dx, space	; Display space separator.
		mov	ah, 9
		int	21h

		mov	ax, es:[bx+2]	; Display address segment.
		call	hexw

		lea	dx, colon	; Display colon separator.
		mov	ah, 9
		int	21h

		mov	ax, es:[bx]	; Display address offset.
		call	hexw

		lea	dx, space	; Display space separator.
		mov	ah, 9
		int	21h

		lea	si, ints	; Display interrupt description.
		mov	ax, bx
		shr	ax, 1
		add	si, ax
		mov	dx, ds:[si]

		cmp	dx, 0		; Description defined?
		jz	_code2		; No, branch.

		mov	ah, 9
		int	21h
_code2:
		lea	dx, crlf	; Display CR/LF.
		mov	ah, 9
		int	21h

		add	bx, 4		; Point to next vector.
		cmp	bx, 0400h	; End of table?
		jnz	_code1		; No, branch.

		ret
_code		ENDP

; ----------------------------------------- ;
; HEXW: Display word in hexadecimal format. ;
;                                           ;
; Entry: AX - word to be displayed          ;
;                                           ;
; Exit: AX, CX, and DX destroyed            ;
; ----------------------------------------- ;

hexw            PROC    NEAR
		push    bx

		push	ax

		mov     al, ah          ; Display most-significant byte.
		call    hexb

		pop     ax

		call    hexb            ; Display least-significant byte.

		pop     bx

		ret
hexw            ENDP

; ----------------------------------------- ;
; HEXB: Display byte in hexadecimal format. ;
;                                           ;
; Entry: AL - byte to be displayed          ;
;                                           ;
; Exit: AX and CX destroyed                 ;
; ----------------------------------------- ;

hexb            PROC    NEAR
		mov     ch, al
		mov     cl, 4
		shr     al, cl

		call    hexb1

		mov     al, ch
		and     al, 0fh
hexb1:
		mov     cl, '0'

		cmp     al, 9
		jbe     hexb2

		mov     cl, 37h
hexb2:
		add     al, cl
		call	outc

		ret
hexb            ENDP

; ---------------------------------------- ;
; OUTC: Send character to standard output. ;
;                                          ;
; Entry: AL - character to output          ;
;                                          ;
; Exit: AH and DX destroyed                ;
; ---------------------------------------- ;

buffer		DB	?
		DB	'$'

outc		PROC	NEAR
		mov	buffer, al
		lea	dx, buffer
		mov	ah, 9
		int	21h

		ret
outc		ENDP

_help           DB      CR, LF
		DB      "VECTORS: Display contents of interrupt vectors"
		DB      CR, LF
		DB	CR, LF
		DB	"Syntax: VECTORS"
		DB	CR, LF
		DB	CR, LF
		DB	"The VECTORS command displays addresses for all"
		DB	CR, LF
		DB	"256 interrupt vectors in segment:offset format"
		DB	CR, LF
		DB	"and displays a descriptive message beside some"
		DB	CR, LF
		DB	"of these addresses identifying the interrupt."
		DB	CR, LF
		DB	'$'

_byline         DB      "VECTORS  - display contents of all 256 interrupt"
		DB	" vectors"
		DB      CR, LF
		DB      '$'

smsg		DB	CR, LF
		DB	"vectors: setting up"
		DB	CR, LF
		DB	'$'

_setup          PROC    NEAR
		lea	dx, smsg
		mov	ah, 9
		int	21h

		ret
_setup          ENDP

cmsg		DB	CR, LF
		DB	"vectors: cleaning up"
		DB	CR, LF
		DB	'$'

_cleanup        PROC    NEAR
		lea	dx, cmsg
		mov	ah, 9
		int	21h

		ret
_cleanup        ENDP

_TEXT           ENDS
		END     _vectors