home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_01_01 / 1n01044a < prev    next >
Text File  |  1990-05-17  |  5KB  |  185 lines

  1.         PAGE ,132
  2.  
  3. ;  Figure 7
  4. ;
  5. ;  Misc. serial I/O status functions
  6.  
  7.  
  8. %       .MODEL  memodel,lang            ;Add model and language support via
  9.                                         ;command line macros, e.g.
  10.                                         ;MASM /Dmemodel=LARGE /Dlang=C
  11.  
  12. ; Offsets from the port base address for various registers
  13. MCR             equ     4               ;modem control register
  14. MSR             equ     6               ;modem status register
  15.  
  16. ;bit masks for Modem Control Register
  17. MCR_DTR         equ     1               ;DTR bit
  18. MCR_RTS         equ     2               ;RTS bit
  19.  
  20. ;bit masks for Modem Status Register
  21. MSR_CTS         equ     10h
  22. MSR_DSR         equ     20h
  23. MSR_RING        equ     40h
  24. MSR_RLSD        equ     80h
  25.  
  26.         .CONST
  27.  
  28. _gpa_tbl        equ     THIS WORD
  29.         dw      3f8h                    ;serial port 1
  30.         dw      2f8h                    ;serial port 2
  31.         dw      3e8h                    ;serial port 3
  32.         dw      2e8h                    ;serial port 4
  33.  
  34.         .CODE
  35.  
  36. ;
  37. ;  Local function to return a port address
  38. ;
  39. ;  Call with port number (0, 1, 2, or 3) in DX
  40. ;  Returns actual port address in DX or 0 if invalid input
  41. ;
  42.  
  43. _get_port_adr:
  44.         push    DS
  45.         push    BX
  46.         cmp     DX,4                    ;In range (0-3)?
  47.         jnc     _gpa_bad                ;No, return an error
  48.         shl     DX,1                    ;Make it an index
  49.         mov     BX,DX
  50.         mov     DX,_gpa_tbl[bx] 
  51. _gpa_ex:
  52.         pop     BX
  53.         pop     DS
  54.         or      DX,DX                   ;Set E flag if error
  55.         ret
  56. _gpa_bad:
  57.         mov     DX,0
  58.         jmp     _gpa_ex
  59.  
  60. ;
  61. ;  Procedure to set/reset DTR
  62. ;  Call with port number (0-3) and state (0=False,  Anything else=True)
  63. ;
  64.  
  65. setdtr  PROC    USES BX DX, port:WORD, state:WORD
  66.         mov     DX,port                 ;Get port number
  67.         call    _get_port_adr           ;Valid?
  68.         je      sdxt                    ;No, exit
  69.         add     DX,MCR
  70.         in      AL,DX
  71.         mov     BX,state
  72.         or      BX,BX                   ;Set?
  73.         jnz     sd1
  74.         and     AL,NOT MCR_DTR
  75.         jmp     sd2
  76. sd1:
  77.         or      AL,MCR_DTR
  78. sd2:
  79.         out     DX,AL
  80. sdxt:
  81.         ret
  82. setdtr  ENDP
  83.  
  84. ;
  85. ;  Procedure to set/reset RTS
  86. ;  Call with port number (0-3) and state (0=False,  Anything else=True)
  87. ;
  88.  
  89. setrts  PROC    USES BX DX, port:WORD, state:WORD
  90.         mov     DX,port                 ;Get port number
  91.         call    _get_port_adr           ;Valid?
  92.         je      srxt                    ;No, exit
  93.         add     DX,MCR
  94.         in      AL,dx
  95.         mov     BX,state
  96.         or      BX,BX                   ;Set?
  97.         jnz     sr1
  98.         and     AL,NOT MCR_RTS
  99.         jmp     sr2
  100. sr1:
  101.         or      AL,MCR_RTS
  102. sr2:
  103.         out     DX,AL
  104. srxt:
  105.         ret
  106. setrts  ENDP
  107.  
  108. ;
  109. ;  Function to return DCD
  110. ;  Call with port number (0-3)
  111. ;
  112.  
  113. chkdcd  PROC    USES DX, port:WORD
  114.         mov     DX,port                 ;Get port number
  115.         call    _get_port_adr           ;Valid?
  116.         je      dcdbad                  ;No, exit
  117.         add     DX,MSR
  118.         in      AL,DX
  119.         and     AX,MSR_RLSD
  120. dcdex:
  121.         ret
  122. dcdbad:
  123.         xor     AX,AX
  124.         jmp     dcdex
  125. chkdcd  ENDP
  126.  
  127. ;
  128. ;  Function to return DSR
  129. ;  Call with port number (0-3)
  130. ;
  131.  
  132. chkdsr  PROC    USES DX, port:WORD
  133.         mov     DX,port                 ;get port number
  134.         call    _get_port_adr           ;Valid?
  135.         je      dsrbad                  ;No, exit
  136.         add     DX,MSR
  137.         in      AL,DX
  138.         and     AX,MSR_DSR
  139. dsrex:
  140.         ret
  141. dsrbad:
  142.         xor     AX,AX
  143.         jmp     dsrex
  144. chkdsr  ENDP
  145.  
  146. ;
  147. ;  Function to return CTS
  148. ;  Call with port number (0-3)
  149. ;
  150.  
  151. chkcts  PROC    USES DX, port:WORD
  152.         mov     DX,port                 ;Get port number
  153.         call   _get_port_adr            ;Valid?
  154.         je      ctsbad                  ;No, exit
  155.         add     DX,MSR
  156.         in      AL,DX
  157.         and     AX,MSR_CTS
  158. ctsex:
  159.         ret
  160. ctsbad:
  161.         xor     AX,AX
  162.         jmp     ctsex
  163. chkcts  ENDP
  164.  
  165. ;
  166. ;  Function to return ring indicator
  167. ;  Call with port number (0-3)
  168. ;
  169.  
  170. chkring PROC    USES DX, port:WORD
  171.         mov     DX,port                 ;Get port number
  172.         call    _get_port_adr           ;Valid?
  173.         je      ribad                   ;No, exit
  174.         add     DX,MSR
  175.         in      AL,DX
  176.         and     AX,MSR_RING
  177. riex:
  178.         ret
  179. ribad:
  180.         xor     AX,AX
  181.         jmp     riex
  182. chkring ENDP
  183.  
  184.         end
  185.