home *** CD-ROM | disk | FTP | other *** search
- TITLE BADSCOP -- BAD VERSION OF COMMUNICATIONS TRACE UTILITY
- ; ***********************************************************************
- ; * *
- ; * BADSCOP -- *
- ; * THIS PROGRAM MONITORS THE ACTIVITY ON A SPECIFIED COMM PORT *
- ; * AND PLACES A COPY OF ALL COMM ACTIVITY IN A RAM BUFFER. EACH *
- ; * ENTRY IN THE BUFFER IS TAGGED TO INDICATE WHETHER THE BYTE *
- ; * WAS SENT BY OR RECEIVED BY THE SYSTEM. *
- ; * *
- ; * BADSCOP IS INSTALLED BY ENTERING *
- ; * *
- ; * BADSCOP *
- ; * *
- ; * THIS WILL INSTALL BADSCOP AND SET UP A 64K BUFFER TO BE USED *
- ; * FOR DATA LOGGING. REMEMBER THAT 2 BYTES ARE REQUIRED FOR *
- ; * EACH COMM BYTE, SO THE BUFFER IS ONLY 32K EVENTS LONG, OR ABOUT *
- ; * 30 SECONDS OF CONTINUOUS 9600 BAUD DATA. IN THE REAL WORLD, *
- ; * ASYNC DATA IS RARELY CONTINUOUS, SO THE BUFFER WILL PROBABLY *
- ; * HOLD MORE THAN 30 SECONDS WORTH OF DATA. *
- ; * *
- ; * WHEN INSTALLED, BADSCOP INTERCEPTS ALL INT 14H CALLS. IF THE *
- ; * PROGRAM HAS BEEN ACTIVATED AND THE INT IS EITHER SEND OR RE- *
- ; * CEIVE DATA, A COPY OF THE DATA BYTE, PROPERLY TAGGED, IS PLACED *
- ; * IN THE BUFFER. IN ANY CASE, DATA IS PASSED ON TO THE REAL *
- ; * INT 14H HANDLER. *
- ; * *
- ; * BADSCOP IS INVOKED BY ISSUING AN INT 60H CALL. THE INT HAS *
- ; * THE FOLLOWING CALLING SEQUENCE: *
- ; * *
- ; * AH -- COMMAND *
- ; * 0 -- STOP TRACING, PLACE STOP MARK IN BUFFER *
- ; * 1 -- FLUSH BUFFER AND START TRACE *
- ; * 2 -- RESUME TRACE *
- ; * 3 -- RETURN COMM BUFFER ADDRESSES *
- ; * DX -- COMM PORT (ONLY USED WITH AH = 1 or 2) *
- ; * 0 -- COM1 *
- ; * 1 -- COM2 *
- ; * *
- ; * THE FOLLOWING DATA IS RETURNED IN REPONSE TO AH = 3: *
- ; * *
- ; * CX -- BUFFER COUNT IN BYTES *
- ; * DX -- SEGMENT ADDRESS OF THE START OF THE BUFFER *
- ; * BX -- OFFSET ADDRESS OF THE START OF THE BUFFER *
- ; * *
- ; * THE COMM BUFFER IS FILLED WITH 2-BYTE DATA ENTRIES OF THE *
- ; * FOLLOWING FORM: *
- ; * *
- ; * BYTE 0 -- CONTROL *
- ; * BIT 0 -- ON FOR RECEIVED DATA, OFF FOR TRANS. *
- ; * BIT 7 -- STOP MARK -- INDICATES COLLECTION WAS *
- ; * INTERRUPTED AND RESUMED. *
- ; * BYTE 1 -- 8-BIT DATA *
- ; * *
- ; ***********************************************************************
-
- PUBLIC INITIALIZE,CONTROL,VECTOR_INIT,COMMSCOPE
- PUBLIC OLD_COMM_INT,COUNT,STATUS,PORT,BUFPNTR
-
- CSEG SEGMENT
- ASSUME CS:CSEG,DS:CSEG
- ORG 100H ;TO MAKE A COM FILE
-
- INITIALIZE:
- JMP VECTOR_INIT ;JUMP TO THE INITIALIZATION
- ; ROUTINE WHICH, TO SAVE SPACE,
- ; IS IN THE COMM BUFFER
-
- ;
- ; SYSTEM VARIABLES
- ;
- OLD_COMM_INT DD ? ;ADDRESS OF REAL COMM INT
- COUNT DW 0 ;BUFFER COUNT
- COMMSCOPE_INT EQU 60H ;COMMSCOPE CONTROL INT
- STATUS DB 0 ;PROCESSING STATUS
- ; 0 -- OFF
- ; 1 -- ON
- PORT DB 0 ;COMM PORT BEING TRACED
- BUFPNTR DW VECTOR_INIT ;NEXT BUFFER LOCATION
-
- SUBTTL DATA INTERRUPT HANDLER
- PAGE
- ; ***********************************************************************
- ; * *
- ; * COMMSCOPE *
- ; * THIS PROCEDURE INTERCEPTS ALL INT 14H CALLS AND LOGS THE DATA *
- ; * IF APPROPRIATE. *
- ; * *
- ; ***********************************************************************
- COMMSCOPE PROC NEAR
-
- TEST CS:STATUS,1 ;ARE WE ON?
- JZ OLD_JUMP ; NO, SIMPLY JUMP TO OLD HANDLER
-
- CMP AH,00H ;SKIP SETUP CALLS
- JE OLD_JUMP ; .
-
- CMP AH,03H ;SKIP STATUS REQUESTS
- JAE OLD_JUMP ; .
-
- CMP AH,02H ;IS THIS A READ REQUEST?
- JE GET_READ ; YES, GO PROCESS
-
- ;
- ; DATA WRITE REQUEST -- SAVE IF APPROPRIATE
- ;
- CMP DL,CS:PORT ;IS WRITE FOR PORT BEING TRACED?
- JNE OLD_JUMP ; NO, JUST PASS IT THROUGH
-
- PUSH DS ;SAVE CALLER'S REGISTERS
- PUSH BX ; .
- PUSH CS ;SET UP DS FOR OUR PROGRAM
- POP DS ; .
- MOV BX,BUFPNTR ;GET ADDRESS OF NEXT BUFFER LOCATION
- MOV [BX],BYTE PTR 0 ;MARK AS TRANSMITTED BYTE
- MOV [BX+1],AL ;SAVE DATA IN BUFFER
- INC COUNT ;INCREMENT BUFFER BYTE COUNT
- INC COUNT ; .
- INC BX ;POINT TO NEXT LOCATION
- INC BX ; .
- MOV BUFPNTR,BX ;SAVE NEW POINTER
- JNZ WRITE_DONE ;ZERO INDICATES BUFFER HAS WRAPPED
-
- MOV STATUS,0 ;TURN COLLECTION OFF -- BUFFER FULL
- WRITE_DONE:
- POP BX ;RESTORE CALLER'S REGISTERS
- POP DS ; .
- JMP OLD_JUMP ;PASS REQUEST ON TO BIOS ROUTINE
- ;
- ; PROCESS A READ DATA REQUEST AND WRITE TO BUFFER IF APPROPRIATE
- ;
- GET_READ:
- CMP DL,CS:PORT ;IS READ FOR PORT BEING TRACED?
- JNE OLD_JUMP ; NO, JUST PASS IT THROUGH
-
- PUSH DS ;SAVE CALLER'S REGISTERS
- PUSH BX ; .
- PUSH CS ;SET UP DS FOR OUR PROGRAM
- POP DS ; .
-
- PUSHF ;FAKE INT 14H CALL
- CLI ; .
- CALL OLD_COMM_INT ;PASS REQUEST ON TO BIOS
- TEST AH,80H ;VALID READ?
- JNZ READ_DONE ; NO, SKIP BUFFER UPDATE
-
- MOV BX,BUFPNTR ;GET ADDRESS OF NEXT BUFFER LOCATION
- MOV [BX],BYTE PTR 1 ;MARK AS RECEIVED BYTE
- MOV [BX+1],AL ;SAVE DATA IN BUFFER
- INC COUNT ;INCREMENT BUFFER BYTE COUNT
- INC COUNT ; .
- INC BX ;POINT TO NEXT LOCATION
- INC BX ; .
- MOV BUFPNTR,BX ;SAVE NEW POINTER
- JNZ READ_DONE ;ZERO INDICATES BUFFER HAS WRAPPED
-
- MOV STATUS,0 ;TURN COLLECTION OFF -- BUFFER FULL
- READ_DONE:
- POP BX ;RESTORE CALLER'S REGISTERS
- POP DS ; .
- IRET
-
- ;
- ; JUMP TO COMM BIOS ROUTINE
- ;
- OLD_JUMP:
- JMP OLD_COMM_INT
-
- COMMSCOPE ENDP
-
- SUBTTL CONTROL INTERRUPT HANDLER
- PAGE
- ; ***********************************************************************
- ; * *
- ; * CONTROL *
- ; * THIS ROUTINE PROCESSES CONTROL REQUESTS. *
- ; * *
- ; ***********************************************************************
-
- CONTROL PROC NEAR
- CMP AH,00H ;STOP REQUEST?
- JNE CNTL_START ; NO, CHECK START
- PUSH DS ;SAVE REGISTERS
- PUSH BX ; .
- PUSH CS ;SET DS FOR OUR ROUTINE
- POP DS
- MOV STATUS,0 ;TURN PROCESSING OFF
- MOV BX,BUFPNTR ;PLACE STOP MARK IN BUFFER
- MOV [BX],BYTE PTR 80H ; .
- MOV [BX+1],BYTE PTR 0FFH ; .
- INC COUNT ;INCREMENT COUNT
- INC COUNT ; .
- POP BX ;RESTORE REGISTERS
- POP DS ; .
- JMP CONTROL_DONE
-
- CNTL_START:
- CMP AH,01H ;START REQUEST?
- JNE CNTL_RESUME ; NO, CHECK RESUME
- MOV CS:PORT,DL ;SAVE PORT TO TRACE
- MOV CS:BUFPNTR,OFFSET VECTOR_INIT ;RESET BUFFER TO START
- MOV CS:COUNT,0 ;ZERO COUNT
- MOV CS:STATUS,1 ;START LOGGING
- JMP CONTROL_DONE
-
- CNTL_RESUME:
- CMP AH,02H ;RESUME REQUEST?
- JNE CNTL_STATUS ; NO, CHECK STATUS
- CMP CS:BUFPNTR,0 ;END OF BUFFER CONDITION?
- JE CONTROL_DONE ; YES, DO NOTHING
- MOV CS:PORT,DL ;SAVE PORT TO TRACE
- MOV CS:STATUS,1 ;START LOGGING
- JMP CONTROL_DONE
-
- CNTL_STATUS:
- CMP AH,03H ;RETURN STATUS REQUEST?
- JNE CONTROL_DONE ; NO, ERROR -- DO NOTHING
- MOV CX,CS:COUNT ;RETURN COUNT
- PUSH CS ;RETURN SEGMENT ADDR OF BUFFER
- POP DX ; .
- MOV BX,OFFSET VECTOR_INIT ;RETURN OFFSET ADDR OF BUFFER
-
- CONTROL_DONE:
- IRET
-
- CONTROL ENDP
-
-
- SUBTTL INITIALIZE INTERRUPT VECTORS
- PAGE
- ; ***********************************************************************
- ; * *
- ; * VECTOR_INIT *
- ; * THIS PROCEDURE INITIALIZES THE INTERRUPT VECTORS AND THEN *
- ; * EXITS VIA THE MS-DOS TERMINATE-AND-STAY-RESIDENT FUNCTION. *
- ; * A BUFFER OF 64K IS RETAINED. THE FIRST AVAILABLE BYTE *
- ; * IN THE BUFFER IS THE OFFSET OF VECTOR_INIT. *
- ; * *
- ; ***********************************************************************
-
- EVEN ;ASSURE BUFFER ON EVEN BOUNDARY
- VECTOR_INIT PROC NEAR
- ;
- ; GET ADDRESS OF COMM VECTOR (INT 14H)
- ;
- MOV AH,35H
- MOV AL,14H
- INT 21H
- ;
- ; SAVE OLD COMM INT ADDRESS
- ;
- MOV WORD PTR OLD_COMM_INT,BX
- MOV AX,ES
- MOV WORD PTR OLD_COMM_INT[2],AX
- ;
- ; SET UP COMM INT TO POINT TO OUR ROUTINE
- ;
- MOV DX,OFFSET COMMSCOPE
- MOV AH,25H
- MOV AL,14H
- INT 21H
- ;
- ; INSTALL CONTROL ROUTINE INT
- ;
- MOV DX,OFFSET CONTROL
- MOV AH,25H
- MOV AL,COMMSCOPE_INT
- INT 21H
- ;
- ; SET LENGTH TO 64K, EXIT AND STAY RESIDENT
- ;
- MOV AX,3100H ;TERM AND STAY RES COMMAND
- MOV DX,1000H ;64K RESERVED
- INT 21H ;DONE
- VECTOR_INIT ENDP
-
- CSEG ENDS
- END INITIALIZE
-