home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / mskermit / mspspd.asm < prev    next >
Assembly Source File  |  2020-01-01  |  5KB  |  228 lines

  1.     PAGE    60, 132
  2. TITLE    XonXoff    22-Jun-89    XON/XOFF Printer Interface        |
  3. SUBTTL    Original Author:  Frank Whaley                    |
  4.  
  5. ;-----------------------------------------------------------------------|
  6. ;                                    |
  7. ;    XON/XOFF Serial Printer Interface                |
  8. ;                                    |
  9. ;        Installs replacement INT 17H printer driver with    |
  10. ;         interrupt-driven serial XON/XOFF communications    |
  11. ;         on COM1.  Leaves baud rate and other parameters    |
  12. ;         as found.  Contains no provision for de-installing.    |
  13. ;                                    |
  14. ;        This source code officially placed in the public    |
  15. ;         domain on 22-Jun-89 by Frank Whaley.            |
  16. ;                                    |
  17. ;        To build:                        |
  18. ;         MASM XONXOFF;                        |
  19. ;         LINK XONXOFF;                        |
  20. ;         DEL XONXOFF.OBJ                    |
  21. ;         EXE2BIN XONXOFF.EXE XONXOFF.COM            |
  22. ;         DEL XONXOFF.EXE                    |
  23. ;-----------------------------------------------------------------------|
  24.  
  25. IERport    EQU    03F9H            ; Interrupt Enable Register
  26. LSRport    EQU    03FDH            ; Line Status Register
  27. MCRport    EQU    03FCH            ; Modem Control Register
  28. MSRport    EQU    03FEH            ; Modem Status Register
  29. RBRport    EQU    03F8H            ; Receiver Buffer Register
  30. THRport EQU    RBRport            ; Transmit Holding Register
  31. Imask    EQU    0EFH            ; interrupt enable mask
  32. IIRport    EQU    03FAH            ; Interrupt Identification Register
  33.  
  34. BrkInt    EQU    6            ; break interrupt
  35. EOI    EQU    20H            ; End Of Interrupt
  36. InpInt    EQU    4            ; input interrupt
  37. INTA00    EQU    20H
  38. INTA01    EQU    21H
  39. THRE    EQU    20H            ; Transmit Holding Register Empty
  40.  
  41. XOFF    EQU    'S' - 40H
  42. XON    EQU    'Q' - 40H
  43.  
  44. ;-----------------------------------------------------------------------|
  45. ;    The Usual Stuff                            |
  46. ;-----------------------------------------------------------------------|
  47.  
  48. cGroup    Group    Code
  49.  
  50. Code    Segment Public 'Code'
  51.  
  52.     Assume    CS:Code, DS:Code, ES:Code, SS:Code
  53.  
  54.     Org    100H
  55.  
  56. XonXoff:
  57.     JMP    Install            ; install traps
  58.  
  59. Ready    DB    80H            ; ready flag
  60.  
  61.     PAGE
  62. ;-----------------------------------------------------------------------|
  63. ;    Printer interrupt handler                    |
  64. ;                                    |
  65. ;    ENTRY :    as for printer interrupt (INT 17H)            |
  66. ;                                    |
  67. ;    EXIT :    ditto                            |
  68. ;                                    |
  69. ;-----------------------------------------------------------------------|
  70.  
  71. Handler    Proc    Far
  72.  
  73.     TEST    AH,AH            ; output request ??
  74.     JNZ    Hand3            ; if NZ: return status
  75.  
  76.     STI
  77.  
  78. Hand1:
  79.     TEST    CS:Ready,0FFH        ; ready ??
  80.     JZ    Hand1            ; wait until ready
  81.  
  82.     CLI
  83.     PUSH    BX            ; (+1) save
  84.     PUSH    DX            ; (+2)
  85.     MOV    BL,AL            ; save char
  86.     MOV    DX,LSRport
  87.  
  88. Hand2:
  89.     IN    AL,DX            ; get line status
  90.     TEST    AL,THRE            ; transmit holding register empty ??
  91.     JZ    Hand2            ; if Z: uart not ready yet, loop
  92.  
  93.     MOV    AL,BL
  94.     MOV    DX,THRport        ; transmit port
  95.     OUT    DX,AL            ; transmit
  96.  
  97.     POP    DX            ; (+1) restore
  98.     POP    BX            ; (+0)
  99.  
  100. Hand3:
  101.     MOV    AH,CS:Ready
  102.     OR    AH,10H            ; always selected
  103.     IRET
  104.  
  105. Handler    EndP
  106.  
  107.     PAGE
  108. ;-----------------------------------------------------------------------|
  109. ;    Serial interrupt server                        |
  110. ;                                    |
  111. ;    ENTRY :    as from serial interrupt                |
  112. ;                                    |
  113. ;    EXIT :    all registers preserved                    |
  114. ;                                    |
  115. ;-----------------------------------------------------------------------|
  116.  
  117. Server    Proc    Far
  118.  
  119.     PUSH    DX            ; (+1) all what i use
  120.     PUSH    AX            ; (+2)
  121.  
  122.     MOV    DX,IIRport
  123.     IN    AL,DX
  124.     AND    AL,0FEH            ; skip interrupt pending
  125.     TEST    AL,AL            ; modem status ??
  126.     JZ    Serv2            ; if Z: read MSR
  127.  
  128.     CMP    AL,BrkInt        ; break ??
  129.     JE    Serv3            ; if E: just clear interrupt
  130.  
  131.     CMP    AL,InpInt        ; input data received ??
  132.     JE    Serv4            ; if E: get and queue input
  133.  
  134. Serv1:
  135.     MOV    AL,EOI            ; signal end-of-interrupt
  136.     OUT    INTA00,AL
  137.  
  138.     POP    AX            ; (+1) restore
  139.     POP    DX            ; (+0)
  140.     IRET
  141.  
  142. Serv2:                    ; read MSR
  143.     MOV    DX,MSRport        ; just read port to clear interrupt
  144.     IN    AL,DX
  145.     JMP    SHORT Serv1
  146.  
  147. Serv3:                    ; break received
  148.     MOV    DX,LSRport
  149.     IN    AL,DX
  150.     JMP    SHORT Serv1
  151.  
  152. Serv4:                    ; look for XON/XOFF
  153.     MOV    DX,RBRport
  154.     IN    AL,DX            ; AL = input
  155.     AND    AL,7FH
  156.     XOR    AH,AH            ; assume not ready
  157.     CMP    AL,XOFF
  158.     JE    Serv5            ; if E: not ready
  159.  
  160.     MOV    AH,80H            ; assume ready
  161.     CMP    AL,XON
  162.     JE    Serv5            ; if E: is ready
  163.  
  164.     JMP    SHORT Serv1        ; otherwise no change
  165.  
  166. Serv5:
  167.     MOV    CS:Ready,AH        ; set flag
  168.     JMP    SHORT Serv1
  169.  
  170. Server    EndP
  171.  
  172.     PAGE
  173. ;-----------------------------------------------------------------------|
  174. ;    XON/XOFF Printer Interface                    |
  175. ;                                    |
  176. ;    ENTRY :    normal COM program entry                |
  177. ;                                    |
  178. ;    EXIT :    Terminate / Stay Resident                |
  179. ;                                    |
  180. ;-----------------------------------------------------------------------|
  181.  
  182. Install    Proc    Near
  183.  
  184.     MOV    ES,DS:2CH        ; free our environment
  185.     MOV    AH,49H
  186.     INT    21H
  187.  
  188.     MOV    DX,Offset Handler    ; first take over INT 17 vector
  189.     MOV    AX,2517H
  190.     INT    21H
  191.  
  192.     MOV    DX,Offset Server    ; now COM1 vector
  193.     MOV    AX,250CH
  194.     INT    21H
  195.  
  196.     CLI
  197.     MOV    DX,MCRport        ; get status of MCR
  198.     IN    AL,DX
  199.     OR    AL,0BH            ; set DTR, RTS, OUT2
  200.     OUT    DX,AL            ; init MCR
  201.  
  202.     MOV    DX,LSRport        ; clear pending status
  203.     IN    AL,DX
  204.     MOV    DX,RBRport
  205.     IN    AL,DX
  206.     MOV    DX,IIRport
  207.     IN    AL,DX
  208.     MOV    DX,MSRport
  209.     IN    AL,DX
  210.  
  211.     IN    AL,INTA01
  212.     AND    AL,Imask
  213.     OUT    INTA01,AL
  214.  
  215.     MOV    AL,1            ; select Data Available interrupt
  216.     MOV    DX,IERport
  217.     OUT    DX,AL
  218.     STI
  219.  
  220.     MOV    DX,Offset Install    ; DS:DX -> end of "keep" area
  221.     INT    27H            ; terminate / stay resident
  222.  
  223. Install    EndP
  224.  
  225. Code    EndS
  226.  
  227.     END    XonXoff            ; of XonXoff.asm
  228.