home *** CD-ROM | disk | FTP | other *** search
/ Master Technician / MASTER_TECHNICIAN.ISO / mtech / library / online / hardware / comtest / getmod.asm < prev    next >
Encoding:
Assembly Source File  |  1993-08-14  |  3.7 KB  |  258 lines

  1. ;GETMOD.ASM
  2.  
  3. PUBLIC    _GET_BYTE
  4. PUBLIC    _SEND_BYTE
  5. PUBLIC    _SP_INSTALL
  6. PUBLIC    _SP_UNINSTALL
  7.  
  8. CODE SEGMENT BYTE 'CODE'
  9. ASSUME CS:CODE
  10.  
  11. COM1_VECT    EQU 4*0CH
  12. COM2_VECT    EQU 4*0BH
  13.  
  14. VECTOR:            DW 0000
  15. COM_NUM:            DW    0000
  16. COM_PORT:        DW 0000
  17. OLD_INT_SEG:    DW    0000
  18. OLD_INT_OFF:    DW    0000
  19. BUFF_SIZE:        DW 0000
  20. BUFF_SEG:        DW    0000
  21. BUFF_OFF:        DW 0000
  22. DATSEG:            DW    0000
  23. EXTRASEG:        DW    0000
  24. BITMASK:            DW    0000
  25. OLD_BITMASK:    DW    0000
  26.  
  27. _GET_BYTE    PROC FAR
  28.     PUSH    BP
  29.     MOV    BP,SP
  30.     PUSH    DX
  31.  
  32.     MOV    DX,CS:WORD PTR COM_PORT
  33.     SUB    AH,AH
  34.     IN        AL,DX
  35.  
  36.     POP    DX
  37.     POP    BP
  38.     RET
  39. _GET_BYTE ENDP
  40.  
  41. _SEND_BYTE    PROC FAR
  42.     PUSH    BP
  43.     MOV    BP,SP
  44.     PUSH    BX
  45.     PUSH    CX
  46.     PUSH    DX
  47.  
  48.     CALL    GET_TIME
  49.     MOV    BH,20H
  50.     MOV    BL,AL
  51.  
  52.     MOV    DX,CS:WORD PTR COM_PORT
  53.     ADD    DX,5                    ;DX=LINE STATUS
  54.     MOV    AX,[BP+6]
  55.     CMP    AL,00
  56.     JZ        EXIT_SEND_BYTE
  57.     MOV    AH,AL
  58. WAIT_SEND_BYTE:
  59.     IN        AL,DX
  60.     TEST    AL,00011100B        ;TEST FOR ERRORS OR BREAK-DETECT.
  61.     JNZ    EXIT_SEND_BYTE
  62.     TEST    AL,00100000B        ;TEST FOR TRANSMITTER HOLD REGISTER EMPTY.
  63.     JNZ    WAIT_NO_MORE
  64.     CALL    GET_TIME                ;DO TIMEOUT TEST.
  65.     CMP    CL,BL
  66.     JE        WAIT_SEND_BYTE
  67.     MOV    BL,CL
  68.     DEC    BH
  69.     JNZ    WAIT_SEND_BYTE
  70.     OR        AH,80H
  71.     JMP    SHORT EXIT_SEND_BYTE
  72.  
  73. WAIT_NO_MORE:
  74.     SUB    DX,5
  75.     MOV    AL,AH
  76.     OUT    DX,AL
  77.     SUB    AX,AX
  78. EXIT_SEND_BYTE:
  79.     POP    DX
  80.     POP    CX
  81.     POP    BX
  82.     POP    BP
  83.     RET
  84. _SEND_BYTE ENDP
  85.  
  86.  
  87. GET_TIME PROC NEAR
  88.     PUSH    SI
  89.     PUSH    DS
  90.  
  91.     MOV    CX,40H
  92.     MOV    DS,CX
  93.     MOV    SI,006CH
  94.     MOV    CL,[SI]
  95.  
  96.     POP    DS
  97.     POP    SI
  98.     RET
  99. GET_TIME ENDP
  100.  
  101. GET_PORT PROC NEAR
  102.     PUSH    SI
  103.     PUSH    DS
  104.  
  105.     PUSH    AX
  106.     MOV    AX,40H
  107.     MOV    DS,AX
  108.     SUB    SI,SI
  109.     POP    AX
  110.     SHL    AL,1
  111.     ADD    SI,AX
  112.     LODSW
  113.     MOV    DX,AX
  114.  
  115.     POP    DS
  116.     POP    SI
  117.     RET
  118. GET_PORT ENDP
  119.  
  120. SP_HANDLER:
  121.     PUSHF
  122.     CLI
  123.     PUSH    AX
  124.     PUSH    BX
  125.     PUSH    CX
  126.     PUSH    DX
  127.     PUSH    DI
  128.     PUSH    SI
  129.     PUSH    DS
  130.     PUSH    ES
  131.     PUSH    BP
  132.  
  133.     MOV    DX,CS:WORD PTR COM_PORT
  134.     ADD    DX,2
  135. CHECK_INTERRUPT:
  136.     IN        AL,DX
  137.     TEST    AL,1
  138.     JNZ    SP_HANDLER_EXIT
  139.  
  140.     MOV    DS,CS:WORD PTR DATSEG
  141.     MOV    ES,CS:WORD PTR EXTRASEG
  142.     PUSH    DX
  143.  
  144. LONGCALL:
  145.     DB    9AH
  146.     DW    0000
  147.     DW    0000
  148.  
  149.     POP    DX
  150.     JMP    CHECK_INTERRUPT
  151. SP_HANDLER_EXIT:
  152.     MOV    AL,20H
  153.     OUT    20H,AL
  154.     POP    BP
  155.     POP    ES
  156.     POP    DS
  157.     POP    SI
  158.     POP    DI
  159.     POP    DX
  160.     POP    CX
  161.     POP    BX
  162.     POP    AX
  163.     POPF
  164.     IRET
  165.  
  166. _SP_INSTALL PROC FAR
  167.     CLI
  168.     PUSH    BP
  169.     MOV    BP,SP
  170.     PUSH    DX
  171.     PUSH    DI
  172.     PUSH    DS
  173.     PUSH    ES
  174.  
  175.     PUSH    DS
  176.     POP    AX
  177.     MOV    CS:WORD PTR DATSEG,AX
  178.     PUSH    ES
  179.     POP    AX
  180.     MOV    CS:WORD PTR EXTRASEG,AX
  181.  
  182.     MOV    AX,[BP+6]
  183.     MOV    CS:WORD PTR LONGCALL+1,AX            ;STORE OFFSET OF C HANDLER,
  184.     MOV    AX,[BP+8]
  185.     MOV    CS:WORD PTR LONGCALL+3,AX            ;STORE SEGMENT OF C HANDLER.
  186.     MOV    AX,[BP+10]
  187.     MOV    CS:WORD PTR COM_NUM,AX                ;STORE COM PORT ID NUMBER.
  188.  
  189.     MOV    CS:WORD PTR VECTOR,COM1_VECT    ;ASSUME COM1 OR COM3.
  190.     MOV    CS:WORD PTR BITMASK,0EFH
  191.     CMP    AX,0000
  192.     JZ        SET_VECT
  193.     CMP    AX,2
  194.     JZ        SET_VECT
  195.     MOV    CS:WORD PTR VECTOR,COM2_VECT    ;USE COM2 OR COM4.
  196.     MOV    CS:WORD PTR BITMASK,0F7H
  197. SET_VECT:
  198.     MOV    DI,CS:WORD PTR VECTOR
  199.     SUB    AX,AX
  200.     MOV    ES,AX
  201.     MOV    AX,ES:[DI]
  202.     MOV    CS:WORD PTR OLD_INT_OFF,AX
  203.     MOV    AX,OFFSET SP_HANDLER
  204.     STOSW
  205.     MOV    AX,ES:[DI]
  206.     MOV    CS:WORD PTR OLD_INT_SEG,AX
  207.     MOV    AX,CS
  208.     STOSW
  209.  
  210.     MOV    AX,CS:WORD PTR COM_NUM
  211.     CALL    GET_PORT
  212.     MOV    CS:WORD PTR COM_PORT,DX
  213.     ADD    DX,4            ;DX=MODEM CONTROL REGISTER (3FC).
  214.     MOV    AL,0BH
  215.     OUT    DX,AL
  216.     SUB    DX,3            ;DX=INTERUPT ENABLE REGISTER (3F9).
  217.     MOV    AL,01H        ;INTERRUPT ON RECEIVE ONLY.
  218.     OUT    DX,AL
  219.  
  220.     IN        AL,21H
  221.     MOV    CS:WORD PTR OLD_BITMASK,AX
  222.     AND    AX,CS:WORD PTR BITMASK
  223.     OUT    21H,AL
  224.  
  225.     POP    ES
  226.     POP    DS
  227.     POP    DI
  228.     POP    DX
  229.     POP    BP
  230.     STI
  231.     RET
  232. _SP_INSTALL ENDP
  233.  
  234. _SP_UNINSTALL PROC FAR
  235.     CLI
  236.     PUSH    DI
  237.     PUSH    ES
  238.  
  239.     MOV    AX,CS:WORD PTR OLD_BITMASK
  240.     OUT    21H,AL
  241.  
  242.     SUB    AX,AX
  243.     MOV    ES,AX
  244.     MOV    DI,CS:WORD PTR VECTOR
  245.     MOV    AX,CS:WORD PTR OLD_INT_OFF
  246.     STOSW
  247.     MOV    AX,CS:WORD PTR OLD_INT_SEG
  248.     STOSW
  249.  
  250.     POP    ES
  251.     POP    DI
  252.     STI
  253.     RET
  254. _SP_UNINSTALL ENDP
  255.  
  256.     CODE ENDS
  257.     END
  258.