home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 3 Comm / 03-Comm.zip / IS16550.ZIP / IS16550.ASM next >
Assembly Source File  |  1989-06-16  |  5KB  |  190 lines

  1. comment *
  2.  
  3.         Copyright (C) 1989 George A. Stanislav.
  4.         All Rights Reserved.
  5.  
  6.         Purpose: Determine if a serial port uses the NS16550AN UART.
  7.         Let user enter the port number on the command line, e.g.
  8.  
  9.                 is16550 COM1, COM2
  10.  
  11.         Support ports COM1-COM4.
  12.  
  13. *
  14.  
  15. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  16. ;;
  17. ;;      Define port FIFO Control Register addresses
  18. ;;
  19. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  20.  
  21. COM1    equ     03FAh
  22. COM2    equ     02FAh
  23. COM3    equ     03EAh   ; on most systems
  24. COM4    equ     02EAh   ; on most systems as well
  25.  
  26. eos     macro
  27.  
  28.         db      13, 10, 10, '$'         ; end of string
  29.  
  30. endm
  31.  
  32. code    segment para public 'CODE'
  33.  
  34.         org     100h
  35.  
  36.         assume  cs:code, ds:code, es:code, ss:code
  37.  
  38. begin:
  39.         jmp     start
  40.  
  41. copr    db      13, 27, '[2J', 13
  42.         db      'Copyright (C) 1989 George A. Stanislav. ', 13, 10
  43.         db      'All Rights Reserved.', 13, 10, 10, '$', 8, ' ', 13, 26
  44. comsg   db      'COM'
  45. comno   db      '1: $'
  46. is16    db      'NS16550 detected. Suggested replacement: NS16550AN.'
  47.         eos
  48. is16AN  db      "NS16550AN or equivalent detected. You're in good shape."
  49.         eos
  50. isnot   db      'NS16550 NOT detected. If buffering is needed, replacement'
  51.         db      13, 10, '      with an NS16550AN is suggested.'
  52.         eos
  53. dunno   db      "Couldn't determine."
  54.         eos
  55. noport  db      'No UART/serial port detected.'
  56.         eos
  57.  
  58. results dw      isnot
  59.         dw      dunno
  60.         dw      is16
  61.         dw      is16AN
  62.  
  63. ports   dw      COM1
  64.         dw      COM2
  65.         dw      COM3
  66.         dw      COM4
  67.  
  68. flag    db      0
  69.  
  70. start:
  71.  
  72.         lea     dx, copr
  73.         mov     ah, 9
  74.         int     21h
  75.  
  76. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  77. ;;
  78. ;;      Figure out and process command line parameters
  79. ;;
  80. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  81.  
  82.         mov     si, 80h         ; address of parameters
  83.         lodsb                   ; size of parameters
  84.         sub     ah, ah
  85.         mov     cx, ax          ; good for a loop as well as JCXZ
  86.  
  87.         jcxz    default         ; no parameters, deefault to COM1
  88.  
  89. bigloop:
  90.  
  91.         lodsb                   ; read next character from command line
  92.  
  93.         cmp     al, '1'         ; skip anything but '1' - '4'
  94.         jb      nextchar
  95.  
  96.         cmp     al, '4'
  97.         ja      nextchar
  98.  
  99.         mov     byte ptr comno, al
  100.         sub     al, '1'
  101.         call    main
  102.  
  103. nextchar:
  104.         loop    bigloop
  105.         cmp     byte ptr flag, 0        ; did we do anything?
  106.         je      default                 ; nope, use default
  107.  
  108. done:
  109.         mov     ax, 4C00h
  110.         int     21h                     ; exit
  111.  
  112. default:
  113.         sub     al, al
  114.         call    main
  115.         jmp     done
  116.  
  117.  
  118. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  119. ;;
  120. ;;      Main procedure. Test for the 16550 chip.
  121. ;;
  122. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  123.  
  124. main    proc    near
  125.  
  126.         push    cx
  127.  
  128.         cbw
  129.         shl     ax, 1                   ; word pointer
  130.         mov     bx, ax
  131.         push    word ptr ports[bx]      ; put port address on stack
  132.  
  133.         lea     dx, comsg
  134.         mov     ah, 9
  135.         int     21h
  136.  
  137.         pop     dx              ; restore port address
  138.  
  139. ; Save the original value in the UART register inasmuch as possible
  140.  
  141.         in      al, dx
  142.         mov     di, ax
  143.  
  144. ; Try to turn the FIFO buffering on
  145.  
  146.         mov     al, 0C1h
  147.         out     dx, al
  148.  
  149. ; Check if FIFO buffering is on
  150.  
  151.         in      al, dx
  152.  
  153. ; Restore original value, save this one in BX
  154.  
  155.         mov     bl, al
  156.         mov     ax, di
  157.         out     dx, al
  158.  
  159. ; Our answer is hidden in bits 6 and 7 of BL. The values are:
  160. ;
  161. ;       00      = no 16550
  162. ;       10      = 16550
  163. ;       11      = 16550A
  164. ;
  165. ; However, if BL = FF, there is probably no serial port at that address
  166. ;
  167.         lea     dx, noport
  168.         cmp     bl, 0FFh
  169.         je      printit
  170.         and     bx, 11000000b   ; clean up everything else
  171.         mov     cl, 5
  172.         shr     bx, cl  ; convert to pointer
  173.  
  174.         mov     dx, results[bx]
  175. printit:
  176.         mov     ah, 9
  177.         int     21h
  178.  
  179.         or      byte ptr flag, 1
  180.  
  181.         pop     cx
  182.         ret
  183.  
  184. main    endp
  185.  
  186. code    ends
  187.  
  188.         end     begin
  189.  
  190.