; snoop.asm .MODEL SMALL ; ,C unecessary EXTRN PKTFIND:NEAR .STACK 100h .DATA crlf DB 0Dh,0Ah,'$' pktdrvr_avail DB 'A packet driver was found using interrupt 0x$' nopktdrvr_avail DB 'No packet driver was found.',0Dh,0Ah,'$' isr_number DB ? pktdrvr_func DB 'Packet driver functionality: $' pktdrvr_func_b DB 'basic $' pktdrvr_func_x DB 'extended $' pktdrvr_func_h DB 'high-performance $' pktdrvr_func_n DB 'not installed',0Dh,0Ah,'$' pktdrvr_vers DB 'Packet driver version: $' pktdrvr_class DB 'Packet driver class: $' pktdrvr_number DB 'Packet driver number: $' pktdrvr_type DB 'Packet driver type: $' pktdrvr_name DB 'Packet driver name: $' pktdrv_func DB ? pktdrv_vers DW ? pktdrv_class DB ? pktdrv_number DB ? pktdrv_type DW ? pktdrv_name_seg DW ? pktdrv_name_off DW ? .CODE CALL PKTFIND ; find pktdrvr int vect mov DX,SEG pktdrvr_avail ; point into data segment mov DS,DX ASSUME DS:SEG pktdrvr_avail cmp AL,0h ; did PKTFIND return 0? je NODRIVER ; no driver was found mov [isr_number],AL ; store int vect for later mov DX,OFFSET pktdrvr_avail ; print availability string mov AH,09h int 21h mov AL,[isr_number] ; reload value call HEX2ASCII ; convert int to ASCII hex mov DX,AX mov AH,2h ; display high-order nybble int 21h mov DL,DH ; display low-order nybble int 21h mov DX,OFFSET crlf mov AH,9h int 21h jmp CONTINUE ; continue NODRIVER: ; no driver, so say so: mov DX,OFFSET nopktdrvr_avail mov AH,09h int 21h mov AH,4ch ; and exit to DOS int 21h CONTINUE: mov AX,SEG pktdrv_func mov ES,AX mov AH,1h ; prepare to call pktdrvr mov AL,0ffh mov BX,0h int 60h ; what if not 60h? mov [ES:pktdrv_func],AL ; store return values for mov [ES:pktdrv_vers],BX ; later use mov [ES:pktdrv_class],CH mov [ES:pktdrv_number],CL mov [ES:pktdrv_type],DX mov [ES:pktdrv_name_seg],DS mov [ES:pktdrv_name_off],SI mov AX,SEG pktdrvr_func ; display "functionality" str mov DS,AX ASSUME DS:SEG pktdrvr_func mov DX,OFFSET pktdrvr_func mov AH,09h int 21h mov AL,[ES:pktdrv_func] ; restore functionality cmp AL,0ffh ; is pktdrvr installed? jne INSTALLED mov DX,OFFSET pktdrvr_func_n ; display "not installed" int 21h mov AH,4ch ; and exit to DOS int 21h INSTALLED: mov DX,OFFSET pktdrvr_func_b ; display "basic" string int 21h mov AL,[ES:pktdrv_func] ; check for extended and AL,2h jz NOTEXT mov DX,OFFSET pktdrvr_func_x ; display "extended" string int 21h NOTEXT: mov AL,[ES:pktdrv_func] ; check for high-performance and AL,4h jz NOTHP mov DX,OFFSET pktdrvr_func_h ; display "high perf" string int 21h NOTHP: mov DX,OFFSET crlf mov AH,9h int 21h mov DX,OFFSET pktdrvr_vers ; display "version" number mov AH,09h int 21h mov AX,[ES:pktdrv_vers] ; display high-order byte mov CH,AL mov AL,AH call HEX2ASCII mov DX,AX mov AH,2h ; display high-order nybble int 21h mov DL,DH ; display low-order nybble int 21h mov AL,CH ; display low_order byte call HEX2ASCII mov DX,AX mov AH,2h ; display high-order nybble int 21h mov DL,DH ; display low-order nybble int 21h mov DX,OFFSET crlf mov AH,9h int 21h mov DX,OFFSET pktdrvr_class ; display "class" mov AH,09h int 21h mov AL,[ES:pktdrv_class] ; display class byte call HEX2ASCII mov DX,AX mov AH,2h ; display high-order nybble int 21h mov DL,DH ; display low-order nybble int 21h mov DX,OFFSET crlf mov AH,9h int 21h mov DX,OFFSET pktdrvr_class ; display "number" mov AH,09h int 21h mov AL,[ES:pktdrv_number] ; display number byte call HEX2ASCII mov DX,AX mov AH,2h ; display high-order nybble int 21h mov DL,DH ; display low-order nybble int 21h mov DX,OFFSET crlf mov AH,9h int 21h mov DX,OFFSET pktdrvr_type ; display "type" number mov AH,09h int 21h mov AX,[ES:pktdrv_type] ; display high-order byte mov CH,AL mov AL,AH call HEX2ASCII mov DX,AX mov AH,2h ; display high-order nybble int 21h mov DL,DH ; display low-order nybble int 21h mov AL,CH ; display low_order byte call HEX2ASCII mov DX,AX mov AH,2h ; display high-order nybble int 21h mov DL,DH ; display low-order nybble int 21h mov DX,OFFSET crlf mov AH,9h int 21h mov DX,OFFSET pktdrvr_name ; display "name" mov AH,09h int 21h mov AX,[ES:pktdrv_name_seg] ; display name string mov DX,[ES:pktdrv_name_off] mov DS,AX mov AH,9h int 21h mov AX,SEG crlf mov DS,AX mov DX,OFFSET crlf mov AH,9h int 21h mov AH,4ch ; exit to DOS int 21h HEX2ASCII PROC ; AX contains 2 digit hex value to display ;USES? push CX mov AH,0h mov CL,10h div CL add AX,3030h cmp AL,39h jle CONTINUE1 add AL,7h CONTINUE1: cmp AH,39h jle CONTINUE2 add AH,7h CONTINUE2: pop CX ret HEX2ASCII ENDP END