home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / dos_ency / 18 / badscop.asm < prev    next >
Encoding:
Assembly Source File  |  1988-08-11  |  12.9 KB  |  278 lines

  1.         TITLE   BADSCOP -- BAD VERSION OF COMMUNICATIONS TRACE UTILITY
  2. ; ***********************************************************************
  3. ; *                                                                     *
  4. ; *  BADSCOP --                                                         *
  5. ; *     THIS PROGRAM MONITORS THE ACTIVITY ON A SPECIFIED COMM PORT     *
  6. ; *     AND PLACES A COPY OF ALL COMM ACTIVITY IN A RAM BUFFER.  EACH   *
  7. ; *     ENTRY IN THE BUFFER IS TAGGED TO INDICATE WHETHER THE BYTE      *
  8. ; *     WAS SENT BY OR RECEIVED BY THE SYSTEM.                          *
  9. ; *                                                                     *
  10. ; *     BADSCOP IS INSTALLED BY ENTERING                                *
  11. ; *                                                                     *
  12. ; *                     BADSCOP                                         *
  13. ; *                                                                     *
  14. ; *  THIS WILL INSTALL BADSCOP AND SET UP A 64K BUFFER TO BE USED       *
  15. ; *  FOR DATA LOGGING.  REMEMBER THAT 2 BYTES ARE REQUIRED FOR          *
  16. ; *  EACH COMM BYTE, SO THE BUFFER IS ONLY 32K EVENTS LONG, OR ABOUT    *
  17. ; *  30 SECONDS OF CONTINUOUS 9600 BAUD DATA.  IN THE REAL WORLD,       *
  18. ; *  ASYNC DATA IS RARELY CONTINUOUS, SO THE BUFFER WILL PROBABLY       *
  19. ; *  HOLD MORE THAN 30 SECONDS WORTH OF DATA.                           *
  20. ; *                                                                     *
  21. ; *  WHEN INSTALLED, BADSCOP INTERCEPTS ALL INT 14H CALLS.  IF THE      *
  22. ; *  PROGRAM HAS BEEN ACTIVATED AND THE INT IS EITHER SEND OR RE-       *
  23. ; *  CEIVE DATA, A COPY OF THE DATA BYTE, PROPERLY TAGGED, IS PLACED    *
  24. ; *  IN THE BUFFER.  IN ANY CASE, DATA IS PASSED ON TO THE REAL         *
  25. ; *  INT 14H HANDLER.                                                   *
  26. ; *                                                                     *
  27. ; *  BADSCOP IS INVOKED BY ISSUING AN INT 60H CALL.  THE INT HAS        *
  28. ; *  THE FOLLOWING CALLING SEQUENCE:                                    *
  29. ; *                                                                     *
  30. ; *       AH -- COMMAND                                                 *
  31. ; *             0 -- STOP TRACING, PLACE STOP MARK IN BUFFER            *
  32. ; *             1 -- FLUSH BUFFER AND START TRACE                       *
  33. ; *             2 -- RESUME TRACE                                       *
  34. ; *             3 -- RETURN COMM BUFFER ADDRESSES                       *
  35. ; *       DX -- COMM PORT (ONLY USED WITH AH = 1 or 2)                  *
  36. ; *             0 -- COM1                                               *
  37. ; *             1 -- COM2                                               *
  38. ; *                                                                     *
  39. ; *  THE FOLLOWING DATA IS RETURNED IN REPONSE TO AH = 3:               *
  40. ; *                                                                     *
  41. ; *       CX -- BUFFER COUNT IN BYTES                                   *
  42. ; *       DX -- SEGMENT ADDRESS OF THE START OF THE BUFFER              *
  43. ; *       BX -- OFFSET ADDRESS OF THE START OF THE BUFFER               *
  44. ; *                                                                     *
  45. ; *  THE COMM BUFFER IS FILLED WITH 2-BYTE DATA ENTRIES OF THE          *
  46. ; *  FOLLOWING FORM:                                                    *
  47. ; *                                                                     *
  48. ; *       BYTE 0 -- CONTROL                                             *
  49. ; *            BIT 0 -- ON FOR RECEIVED DATA, OFF FOR TRANS.            *
  50. ; *            BIT 7 -- STOP MARK -- INDICATES COLLECTION WAS           *
  51. ; *                  INTERRUPTED AND RESUMED.                           *
  52. ; *       BYTE 1 -- 8-BIT DATA                                          *
  53. ; *                                                                     *
  54. ; ***********************************************************************
  55.  
  56.         PUBLIC INITIALIZE,CONTROL,VECTOR_INIT,COMMSCOPE
  57.         PUBLIC OLD_COMM_INT,COUNT,STATUS,PORT,BUFPNTR
  58.  
  59. CSEG    SEGMENT
  60.         ASSUME  CS:CSEG,DS:CSEG
  61.         ORG     100H                    ;TO MAKE A COM FILE
  62.  
  63. INITIALIZE:
  64.         JMP     VECTOR_INIT             ;JUMP TO THE INITIALIZATION
  65.                                         ; ROUTINE WHICH, TO SAVE SPACE,
  66.                                         ; IS IN THE COMM BUFFER
  67.  
  68. ;
  69. ;  SYSTEM VARIABLES
  70. ;
  71. OLD_COMM_INT    DD      ?               ;ADDRESS OF REAL COMM INT
  72. COUNT           DW      0               ;BUFFER COUNT
  73. COMMSCOPE_INT   EQU     60H             ;COMMSCOPE CONTROL INT
  74. STATUS          DB      0               ;PROCESSING STATUS
  75.                                         ; 0 -- OFF
  76.                                         ; 1 -- ON
  77. PORT            DB      0               ;COMM PORT BEING TRACED
  78. BUFPNTR         DW      VECTOR_INIT     ;NEXT BUFFER LOCATION
  79.  
  80.         SUBTTL  DATA INTERRUPT HANDLER
  81. PAGE
  82. ; ***********************************************************************
  83. ; *                                                                     *
  84. ; *  COMMSCOPE                                                          *
  85. ; *  THIS PROCEDURE INTERCEPTS ALL INT 14H CALLS AND LOGS THE DATA      *
  86. ; *  IF APPROPRIATE.                                                    *
  87. ; *                                                                     *
  88. ; ***********************************************************************
  89. COMMSCOPE       PROC    NEAR
  90.  
  91.         TEST    CS:STATUS,1             ;ARE WE ON?
  92.         JZ      OLD_JUMP                ; NO, SIMPLY JUMP TO OLD HANDLER
  93.  
  94.         CMP     AH,00H                  ;SKIP SETUP CALLS
  95.         JE      OLD_JUMP                ; .
  96.  
  97.         CMP     AH,03H                  ;SKIP STATUS REQUESTS
  98.         JAE     OLD_JUMP                ; .
  99.  
  100.         CMP     AH,02H                  ;IS THIS A READ REQUEST?
  101.         JE      GET_READ                ; YES, GO PROCESS
  102.  
  103. ;
  104. ;  DATA WRITE REQUEST -- SAVE IF APPROPRIATE
  105. ;
  106.         CMP     DL,CS:PORT              ;IS WRITE FOR PORT BEING TRACED?
  107.         JNE     OLD_JUMP                ; NO, JUST PASS IT THROUGH
  108.  
  109.         PUSH    DS                      ;SAVE CALLER'S REGISTERS
  110.         PUSH    BX                      ; .
  111.         PUSH    CS                      ;SET UP DS FOR OUR PROGRAM
  112.         POP     DS                      ; .
  113.         MOV     BX,BUFPNTR              ;GET ADDRESS OF NEXT BUFFER LOCATION
  114.         MOV     [BX],BYTE PTR 0         ;MARK AS TRANSMITTED BYTE
  115.         MOV     [BX+1],AL               ;SAVE DATA IN BUFFER
  116.         INC     COUNT                   ;INCREMENT BUFFER BYTE COUNT
  117.         INC     COUNT                   ; .
  118.         INC     BX                      ;POINT TO NEXT LOCATION
  119.         INC     BX                      ; .
  120.         MOV     BUFPNTR,BX              ;SAVE NEW POINTER
  121.         JNZ     WRITE_DONE              ;ZERO INDICATES BUFFER HAS WRAPPED
  122.  
  123.         MOV     STATUS,0                ;TURN COLLECTION OFF -- BUFFER FULL
  124. WRITE_DONE:
  125.         POP     BX                      ;RESTORE CALLER'S REGISTERS
  126.         POP     DS                      ; .
  127.         JMP     OLD_JUMP                ;PASS REQUEST ON TO BIOS ROUTINE
  128. ;
  129. ;  PROCESS A READ DATA REQUEST AND WRITE TO BUFFER IF APPROPRIATE
  130. ;
  131. GET_READ:
  132.         CMP     DL,CS:PORT              ;IS READ FOR PORT BEING TRACED?
  133.         JNE     OLD_JUMP                ; NO, JUST PASS IT THROUGH
  134.  
  135.         PUSH    DS                      ;SAVE CALLER'S REGISTERS
  136.         PUSH    BX                      ; .
  137.         PUSH    CS                      ;SET UP DS FOR OUR PROGRAM
  138.         POP     DS                      ; .
  139.  
  140.         PUSHF                           ;FAKE INT 14H CALL
  141.         CLI                             ; .
  142.         CALL    OLD_COMM_INT            ;PASS REQUEST ON TO BIOS 
  143.         TEST    AH,80H                  ;VALID READ?
  144.         JNZ     READ_DONE               ; NO, SKIP BUFFER UPDATE
  145.  
  146.         MOV     BX,BUFPNTR              ;GET ADDRESS OF NEXT BUFFER LOCATION
  147.         MOV     [BX],BYTE PTR 1         ;MARK AS RECEIVED BYTE
  148.         MOV     [BX+1],AL               ;SAVE DATA IN BUFFER
  149.         INC     COUNT                   ;INCREMENT BUFFER BYTE COUNT
  150.         INC     COUNT                   ; .
  151.         INC     BX                      ;POINT TO NEXT LOCATION
  152.         INC     BX                      ; .
  153.         MOV     BUFPNTR,BX              ;SAVE NEW POINTER
  154.         JNZ     READ_DONE               ;ZERO INDICATES BUFFER HAS WRAPPED
  155.  
  156.         MOV     STATUS,0                ;TURN COLLECTION OFF -- BUFFER FULL
  157. READ_DONE:
  158.         POP     BX                      ;RESTORE CALLER'S REGISTERS
  159.         POP     DS                      ; .
  160.         IRET
  161.  
  162. ;
  163. ;  JUMP TO COMM BIOS ROUTINE
  164. ;
  165. OLD_JUMP:
  166.         JMP     OLD_COMM_INT
  167.  
  168. COMMSCOPE ENDP
  169.  
  170.         SUBTTL  CONTROL INTERRUPT HANDLER
  171. PAGE
  172. ; ***********************************************************************
  173. ; *                                                                     *
  174. ; *  CONTROL                                                            *
  175. ; *     THIS ROUTINE PROCESSES CONTROL REQUESTS.                        *
  176. ; *                                                                     *
  177. ; ***********************************************************************
  178.  
  179. CONTROL PROC    NEAR
  180.         CMP     AH,00H                  ;STOP REQUEST?
  181.         JNE     CNTL_START              ; NO, CHECK START
  182.         PUSH    DS                      ;SAVE REGISTERS
  183.         PUSH    BX                      ; .
  184.         PUSH    CS                      ;SET DS FOR OUR ROUTINE
  185.         POP     DS
  186.         MOV     STATUS,0                ;TURN PROCESSING OFF
  187.         MOV     BX,BUFPNTR              ;PLACE STOP MARK IN BUFFER
  188.         MOV     [BX],BYTE PTR 80H       ; .
  189.         MOV     [BX+1],BYTE PTR 0FFH    ; .
  190.         INC     COUNT                   ;INCREMENT COUNT
  191.         INC     COUNT                   ; .
  192.         POP     BX                      ;RESTORE REGISTERS
  193.         POP     DS                      ; .
  194.         JMP     CONTROL_DONE
  195.  
  196. CNTL_START:
  197.         CMP     AH,01H                  ;START REQUEST?
  198.         JNE     CNTL_RESUME             ; NO, CHECK RESUME
  199.         MOV     CS:PORT,DL              ;SAVE PORT TO TRACE
  200.         MOV     CS:BUFPNTR,OFFSET VECTOR_INIT   ;RESET BUFFER TO START
  201.         MOV     CS:COUNT,0              ;ZERO COUNT
  202.         MOV     CS:STATUS,1             ;START LOGGING
  203.         JMP     CONTROL_DONE
  204.  
  205. CNTL_RESUME:
  206.         CMP     AH,02H                  ;RESUME REQUEST?
  207.         JNE     CNTL_STATUS             ; NO, CHECK STATUS
  208.         CMP     CS:BUFPNTR,0            ;END OF BUFFER CONDITION?
  209.         JE      CONTROL_DONE            ; YES, DO NOTHING
  210.         MOV     CS:PORT,DL              ;SAVE PORT TO TRACE
  211.         MOV     CS:STATUS,1             ;START LOGGING
  212.         JMP     CONTROL_DONE
  213.  
  214. CNTL_STATUS:
  215.         CMP     AH,03H                  ;RETURN STATUS REQUEST?
  216.         JNE     CONTROL_DONE            ; NO, ERROR -- DO NOTHING
  217.         MOV     CX,CS:COUNT             ;RETURN COUNT
  218.         PUSH    CS                      ;RETURN SEGMENT ADDR OF BUFFER
  219.         POP     DX                      ; .
  220.         MOV     BX,OFFSET VECTOR_INIT   ;RETURN OFFSET ADDR OF BUFFER
  221.  
  222. CONTROL_DONE:
  223.         IRET
  224.  
  225. CONTROL ENDP
  226.  
  227.  
  228.         SUBTTL  INITIALIZE INTERRUPT VECTORS
  229. PAGE
  230. ; ***********************************************************************
  231. ; *                                                                     *
  232. ; *  VECTOR_INIT                                                        *
  233. ; *  THIS PROCEDURE INITIALIZES THE INTERRUPT VECTORS AND THEN          *
  234. ; *  EXITS VIA THE MS-DOS TERMINATE-AND-STAY-RESIDENT FUNCTION.         *
  235. ; *  A BUFFER OF 64K IS RETAINED.  THE FIRST AVAILABLE BYTE             *
  236. ; *  IN THE BUFFER IS THE OFFSET OF VECTOR_INIT.                        *
  237. ; *                                                                     *
  238. ; ***********************************************************************
  239.  
  240.         EVEN                            ;ASSURE BUFFER ON EVEN BOUNDARY
  241. VECTOR_INIT     PROC    NEAR
  242. ;
  243. ;  GET ADDRESS OF COMM VECTOR (INT 14H)
  244. ;
  245.         MOV     AH,35H
  246.         MOV     AL,14H
  247.         INT     21H
  248. ;
  249. ;  SAVE OLD COMM INT ADDRESS
  250. ;
  251.         MOV     WORD PTR OLD_COMM_INT,BX
  252.         MOV     AX,ES
  253.         MOV     WORD PTR OLD_COMM_INT[2],AX
  254. ;
  255. ;  SET UP COMM INT TO POINT TO OUR ROUTINE
  256. ;
  257.         MOV     DX,OFFSET COMMSCOPE
  258.         MOV     AH,25H
  259.         MOV     AL,14H
  260.         INT     21H
  261. ;
  262. ;  INSTALL CONTROL ROUTINE INT
  263. ;
  264.         MOV     DX,OFFSET CONTROL
  265.         MOV     AH,25H
  266.         MOV     AL,COMMSCOPE_INT
  267.         INT     21H
  268. ;
  269. ;  SET LENGTH TO 64K, EXIT AND STAY RESIDENT
  270. ;
  271.         MOV     AX,3100H                ;TERM AND STAY RES COMMAND
  272.         MOV     DX,1000H                ;64K RESERVED
  273.         INT     21H                     ;DONE
  274. VECTOR_INIT ENDP
  275.  
  276. CSEG    ENDS
  277.         END     INITIALIZE
  278.