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

  1.         TITLE   COMMSCOP -- COMMUNICATIONS TRACE UTILITY
  2. ; ***********************************************************************
  3. ; *                                                                     *
  4. ; *  COMMSCOPE --                                                       *
  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. ; *     COMMSCOPE IS INSTALLED BY ENTERING                              *
  11. ; *                                                                     *
  12. ; *                      COMMSCOP                                       *
  13. ; *                                                                     *
  14. ; *     THIS WILL INSTALL COMMSCOP 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, COMMSCOP 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. ; *     COMMSCOP 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 RESPONSE 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. CSEG    SEGMENT
  57.         ASSUME  CS:CSEG,DS:CSEG
  58.         ORG     100H                    ;TO MAKE A COMM FILE
  59.  
  60. INITIALIZE:
  61.         JMP     VECTOR_INIT             ;JUMP TO THE INITIALIZATION
  62.                                         ; ROUTINE WHICH, TO SAVE SPACE,
  63.                                         ; IS IN THE COMM BUFFER
  64.  
  65. ;
  66. ;  SYSTEM VARIABLES
  67. ;
  68. OLD_COMM_INT    DD      ?               ;ADDRESS OF REAL COMM INT
  69. COUNT           DW      0               ;BUFFER COUNT
  70. COMMSCOPE_INT   EQU     60H             ;COMMSCOPE CONTROL INT
  71. STATUS          DB      0               ;PROCESSING STATUS
  72.                                         ; 0 -- OFF
  73.                                         ; 1 -- ON
  74. PORT            DB      0               ;COMM PORT BEING TRACED
  75. BUFPNTR         DW      VECTOR_INIT     ;NEXT BUFFER LOCATION
  76.  
  77.         SUBTTL  DATA INTERRUPT HANDLER
  78. PAGE
  79. ; ***********************************************************************
  80. ; *                                                                     *
  81. ; *  COMMSCOPE                                                          *
  82. ; *     THIS PROCEDURE INTERCEPTS ALL INT 14H CALLS AND LOGS THE DATA   *
  83. ; *     IF APPROPRIATE.                                                 *
  84. ; *                                                                     *
  85. ; ***********************************************************************
  86. COMMSCOPE       PROC    NEAR
  87.  
  88.         TEST    CS:STATUS,1             ;ARE WE ON?
  89.         JZ      OLD_JUMP                ; NO, SIMPLY JUMP TO OLD HANDLER
  90.  
  91.         CMP     AH,00H                  ;SKIP SETUP CALLS
  92.         JE      OLD_JUMP                ; .
  93.  
  94.         CMP     AH,03H                  ;SKIP STATUS REQUESTS
  95.         JAE     OLD_JUMP                ; .
  96.  
  97.         CMP     AH,02H                  ;IS THIS A READ REQUEST?
  98.         JE      GET_READ                ; YES, GO PROCESS
  99.  
  100. ;
  101. ;  DATA WRITE REQUEST -- SAVE IF APPROPRIATE
  102. ;
  103.         CMP     DL,CS:PORT              ;IS WRITE FOR PORT BEING TRACED?
  104.         JNE     OLD_JUMP                ; NO, JUST PASS IT THROUGH
  105.  
  106.         PUSH    DS                      ;SAVE CALLER'S REGISTERS
  107.         PUSH    BX                      ; .
  108.         PUSH    CS                      ;SET UP DS FOR OUR PROGRAM
  109.         POP     DS                      ; .
  110.         MOV     BX,BUFPNTR              ;GET ADDR OF NEXT BUFFER LOC
  111.         MOV     [BX],BYTE PTR 0         ;MARK AS TRANSMITTED BYTE
  112.         MOV     [BX+1],AL               ;SAVE DATA IN BUFFER
  113.         INC     COUNT                   ;INCREMENT BUFFER BYTE COUNT
  114.         INC     COUNT                   ; .
  115.         INC     BX                      ;POINT TO NEXT LOCATION
  116.         INC     BX                      ; .
  117.         MOV     BUFPNTR,BX              ;SAVE NEW POINTER
  118.         JNZ     WRITE_DONE              ;ZERO MEANS BUFFER HAS WRAPPED
  119.      
  120.         MOV     STATUS,0                ;TURN COLLECTION OFF
  121. WRITE_DONE:
  122.         POP     BX                      ;RESTORE CALLER'S REGISTERS
  123.         POP     DS                      ; .
  124.         JMP     OLD_JUMP                ;PASS REQUEST ON TO BIOS ROUTINE
  125. ;
  126. ;  PROCESS A READ DATA REQUEST AND WRITE TO BUFFER IF APPROPRIATE
  127. ;
  128. GET_READ:
  129.         CMP     DL,CS:PORT              ;IS READ FOR PORT BEING TRACED?
  130.         JNE     OLD_JUMP                ; NO, JUST PASS IT THROUGH
  131.  
  132.         PUSH    DS                      ;SAVE CALLER'S REGISTERS
  133.         PUSH    BX                      ; .
  134.         PUSH    CS                      ;SET UP DS FOR OUR PROGRAM
  135.         POP     DS                      ; .
  136.  
  137.         PUSHF                           ;FAKE INT 14H CALL
  138.         CLI                             ; .
  139.         CALL    OLD_COMM_INT            ;PASS REQUEST ON TO BIOS 
  140.         TEST    AH,80H                  ;VALID READ?
  141.         JNZ     READ_DONE               ; NO, SKIP BUFFER UPDATE
  142.  
  143.         MOV     BX,BUFPNTR              ;GET ADDR OF NEXT BUFFER LOC
  144.         MOV     [BX],BYTE PTR 1         ;MARK AS RECEIVED BYTE
  145.         MOV     [BX+1],AL               ;SAVE DATA IN BUFFER
  146.         INC     COUNT                   ;INCREMENT BUFFER BYTE COUNT
  147.         INC     COUNT                   ; .
  148.         INC     BX                      ;POINT TO NEXT LOCATION
  149.         INC     BX                      ; .
  150.         MOV     BUFPNTR,BX              ;SAVE NEW POINTER
  151.         JNZ     READ_DONE               ;ZERO MEANS BUFFER HAS WRAPPED
  152.      
  153.         MOV     STATUS,0                ;TURN COLLECTION OFF
  154. READ_DONE:
  155.         POP     BX                      ;RESTORE CALLER'S REGISTERS
  156.         POP     DS                      ; .
  157.         IRET     
  158.  
  159. ;
  160. ;  JUMP TO COMM BIOS ROUTINE
  161. ;
  162. OLD_JUMP:
  163.         JMP     CS:OLD_COMM_INT
  164.  
  165. COMMSCOPE ENDP
  166.  
  167.         SUBTTL  CONTROL INTERRUPT HANDLER
  168. PAGE
  169. ; ***********************************************************************
  170. ; *                                                                     *
  171. ; *  CONTROL                                                            *
  172. ; *     THIS ROUTINE PROCESSES CONTROL REQUESTS.                        *
  173. ; *                                                                     *
  174. ; ***********************************************************************
  175.  
  176. CONTROL PROC    NEAR
  177.         CMP     AH,00H                  ;STOP REQUEST?
  178.         JNE     CNTL_START              ; NO, CHECK START
  179.         PUSH    DS                      ;SAVE REGISTERS
  180.         PUSH    BX                      ; .
  181.         PUSH    CS                      ;SET DS FOR OUR ROUTINE
  182.         POP     DS
  183.         MOV     STATUS,0                ;TURN PROCESSING OFF
  184.         MOV     BX,BUFPNTR              ;PLACE STOP MARK IN BUFFER
  185.         MOV     [BX],BYTE PTR 80H       ; .
  186.         MOV     [BX+1],BYTE PTR 0FFH    ; .
  187.         INC     BX                      ;INCREMENT BUFFER POINTER
  188.         INC     BX                      ; .
  189.         MOV     BUFPNTR,BX              ; .
  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. CSEG    ENDS
  276.         END     INITIALIZE
  277.