home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / comm / bnu202.zip / FECHO.ASM < prev    next >
Assembly Source File  |  1992-10-15  |  6KB  |  371 lines

  1. ;
  2. ; FECHO    Echo to a COM Port
  3. ;
  4.  
  5. COM equ 1
  6.  
  7. ifdef ??version
  8.     masm51
  9.     quirks
  10. endif
  11.  
  12. _code    segment byte
  13.   if COM
  14.     org    0100H
  15.   endif
  16.     assume    cs:_code
  17. _go:
  18.     jmp _start
  19.  
  20. PortNum    dw 0        ; Assumes port 0
  21. ChgBaud    dw -1        ; -1 means don't change
  22. Share    dw 0        ; FOSSIL is shared
  23. IsInit    dw 0        ; FOSSIL is initialised
  24. Carrier    dw 0        ; Don't check carrier if non-zero
  25. DoEcho    dw 0        ; Echo to screen as well
  26.  
  27. RateTbl    dw 0043H    ; 300 baud
  28.     dw 0063H    ; 600 baud
  29.     dw 0083H    ; 1200 baud
  30.     dw 00a3H    ; 2400 baud
  31.     dw 00c3H    ; 4800 baud
  32.     dw 00e3H    ; 9600 baud
  33.     dw 0003H    ; 19200 baud
  34.     dw 0023H    ; 38400 baud
  35. BaudTbl    dw 300
  36.     dw 600
  37.     dw 1200
  38.     dw 2400
  39.     dw 4800
  40.     dw 9600
  41.     dw 19200
  42.     dw 38400
  43. _bmark    equ $
  44.  
  45. UseText    db 'FECHO v1.10   Echo line to a port via FOSSIL',13,10
  46.     db '              Copyright (C) 1992  David Nugent & Unique Computing Ptd Ltd',13,10,10
  47.     db 'Usage: fecho [/Pn] [/Bnnn] [/S] [/N] <string>',13,10,10
  48.     db '   Where:  /Pn    Optional port number: 0=COM1 1=COM2 ... (default is 0, COM1)',13,10
  49.     db '           /Bnnnn Optional baud rate (default is current baud rate)',13,10
  50.     db '           /S     Leaves FOSSIL driver active on exit',13,10
  51.     db '           /N     Proceed even if carrier is not present',13,10
  52.     db '           /E     Echo output to screen (as well)',13,10
  53.     db 10
  54.  
  55. _utend    equ $
  56.  
  57. NoFoss    db 13,10,'fecho: No FOSSIL loaded!',13,10
  58. _nfend    equ $
  59. NoPort    db 13,10,'fecho: FOSSIL init error (port not available)?',13,10
  60. _nport    equ $
  61. NoCarr    db 13,10,'fecho: No carrier - lost caller?',13,10
  62. _ncarr    equ $
  63. SndErr    db 13,10,'fecho: Error sending string!',13,10
  64. _serr    equ $
  65. TimErr    db 13,10,'fecho: Timeout waiting for output to clear!',13,10
  66. _terr    equ $
  67. InBaud    db 13,10,'fecho: Invalid baud rate specified',31,10
  68. _vbaud    equ $
  69.  
  70. _start:
  71.  
  72. ; Scan the command line for switches
  73.  
  74.   if COM
  75.     assume ds:_code, es:_code
  76.   else
  77.     mov ax,cs
  78.     mov ds,ax
  79.     assume ds:_code,es:nothing
  80.   endif
  81.     mov SI,080H
  82.     mov AL,ES:[SI]
  83.     inc SI
  84.     mov DI,SI
  85.     mov CL,AL
  86.     xor CH,CH
  87.     cmp CX,1
  88.     jg @S
  89.     jmp Usage
  90. @S:
  91.     mov AL,byte ptr ES:[SI]
  92.     cmp AL,020H
  93.     je @F
  94.     cmp AL,009H
  95.     jne @N
  96. @@:
  97.     inc SI
  98.     loop @S
  99.     jmp Usage
  100. @N:
  101.     cmp AL,'/'
  102.     jne _ChkFossil
  103.     inc SI
  104.     dec CX
  105.     mov AL,byte ptr ES:[SI]
  106.     inc SI
  107.     dec CX
  108.     cmp CX,1
  109.     jg @F
  110.     jmp Usage
  111. @@:
  112.     cmp AL,'a'
  113.     jb @F
  114.     cmp AL,'z'
  115.     ja @F
  116.     sub AL,32
  117. @@:
  118.     cmp AL,'P'
  119.     jne @F
  120.     jmp @Port
  121. @@:
  122.     cmp AL,'B'
  123.     jne @F
  124.     jmp @Baud
  125. @@:
  126.     cmp AL,'S'
  127.     je @Share
  128.     cmp AL,'E'
  129.     je @Echo
  130.     cmp AL,'N'
  131.     je @F
  132.     jmp Usage
  133. @@:
  134.     inc Carrier
  135.     jmp @S
  136. @Echo:
  137.     inc DoEcho
  138.     jmp @S
  139. @Share:
  140.     inc Share
  141.     jmp @S
  142. ;
  143. ; Check that a FOSSIL exists
  144. ;
  145. _ChkFossil:
  146.     push ES
  147.     mov AX,03514H                ; Check INT 14H vector
  148.     int 021H
  149.     cmp ES:[BX+6],01954H
  150.     pop ES
  151.     je @F
  152.     mov DX,offset NoFoss
  153.     mov CX,_nfend - NoFoss
  154.     jmp Error
  155. @@:
  156.     mov AH,04H
  157.     mov DX,PortNum
  158.     int 014H                ; Initialise FOSSIL driver
  159.     cmp AX,01954H
  160.     je @F
  161.     mov DX,offset NoPort
  162.     mov CX,_nport - NoPort
  163.     jmp SHORT Error
  164. @@:
  165.     cmp ChgBaud,-1
  166.     je @M
  167.     mov AL,byte ptr ChgBaud            ; Set baud rate
  168.     mov DX,PortNum
  169.     xor AH,AH
  170.     int 014H
  171. @M:
  172.     inc IsInit
  173.     cmp Carrier,0
  174.     jne @F
  175.     mov DX,PortNum                ; Get FOSSIL status
  176.     mov AH,03H
  177.     int 014H
  178.     and AL,080H                ; Check for carrier
  179.     jne @F
  180. @cl:
  181.     mov DX,offset NoCarr
  182.     mov CX,_ncarr - NoCarr
  183.     jmp SHORT Error
  184. @@:
  185.     mov AL,byte ptr ES:[SI]
  186.     call @Send
  187.     inc SI
  188.     loop @M                    ; Go get next one
  189.  
  190.     mov AL,13                ; Send CR
  191.     call @Send
  192.     mov AL,10                ; Send LF
  193.     call @Send
  194.  
  195.     xor CX,CX                ; Large timeout value
  196. @H:
  197.     mov AH,03H
  198.     int 014H
  199.     cmp Carrier,0
  200.     jne @F
  201.     test AL,080H                ; Is carrier up?
  202.     jz @cl
  203. @@:
  204.     and AH,40H                ; Is TX buffer empty yet?
  205.     jnz @F
  206.     loop @H
  207. @to:
  208.     mov DX,offset TimErr            ; Transmitter timed out
  209.     mov CX,_terr - TimErr
  210.     jmp SHORT Error
  211.  
  212. @@:
  213.     xor AL,AL
  214.     jmp SHORT Exit
  215.  
  216. ;---------
  217.  
  218. Usage:
  219.     mov DX,offset UseText
  220.     mov CX,_utend - UseText
  221.  
  222. ;---------
  223.  
  224. Error:
  225.     mov BX,2
  226.     call Write
  227.     mov BX,1
  228.     cmp IsInit,0
  229.     je Exit
  230.     mov AL,1
  231.  
  232. ; -------
  233.  
  234. Exit:
  235.     cmp Share,0
  236.     jne @F
  237.     cmp IsInit,0
  238.     je @F
  239.     mov AH,05H
  240.     mov DX,PortNum
  241.     int 014H
  242. @@:
  243.     mov AH,04CH
  244.     int 021H
  245.  
  246. ; -------
  247.  
  248. Write:
  249.     mov AH,040H
  250.     int 021H
  251.     ret
  252.  
  253. ;
  254. ; Parse port number
  255. ;
  256. @Port:
  257.     mov AL,byte ptr ES:[DI]
  258.     inc SI
  259.     dec CX
  260.     sub AL,'0'
  261.     xor AH,AH
  262.     mov PortNum,AX
  263.     jmp @S
  264. ;
  265. ; Parse baud rate
  266. ;
  267. @Baud:
  268.     xor DX,DX
  269.     xor AH,AH
  270. @L:
  271.     jcxz @F
  272.     mov AL,byte ptr ES:[SI]
  273.     cmp AL,'0'
  274.     jb @F
  275.     cmp AL,'9'
  276.     ja @F
  277.     inc SI
  278.     dec CX
  279.     sub AL,'0'
  280.     mov BX,DX
  281.     shl DX,1
  282.     shl DX,1
  283.     add DX,BX
  284.     shl DX,1
  285.     add DX,AX
  286.     jmp @L
  287. @@:
  288.     push CX
  289.     mov CX,(_bmark - BaudTbl)/2
  290.     mov BX,offset BaudTbl
  291. @@:
  292.     cmp DX,[BX]
  293.     je  @F
  294.     add BX,2
  295.     loop @B
  296.     pop CX
  297.     mov DX,offset InBaud
  298.     mov CX,_vbaud - InBaud
  299.     jmp SHORT Error
  300.  
  301. @@:
  302.     sub BX,BaudTbl - RateTbl
  303.     mov AX,[BX]
  304.     mov ChgBaud,AX
  305.     pop CX
  306.     jmp @S
  307.  
  308. ;
  309. ; Send a character to the port
  310. ;
  311.  
  312. @Send:
  313.     push CX
  314.     mov CX,512                ; Attempt sending 512 times
  315. @X:
  316.     push AX
  317.     mov AH,0BH                ; TX chr no wait
  318.     mov DX,PortNum
  319.     int 014H
  320.     or AL,AL                ; Character sent?
  321.     jne @F
  322.     pop AX
  323.     loop @X
  324.  
  325.     pop CX
  326.     pop AX                    ; Pop return address
  327.     mov DX,offset SndErr
  328.     mov CX,_serr - SndErr
  329.     jmp Error
  330. @@:
  331.     pop AX
  332.     cmp AL,13                ; Delay after CR or LF
  333.     je @F
  334.     cmp AL,10
  335.     jne @K
  336. @@:
  337.     xor CX,CX
  338.     mov AH,03H                ; Wait until its sent
  339. @@:
  340.     push AX
  341.     mov DX,PortNum
  342.     int 014H
  343.     and AH,040H
  344.     pop AX
  345.     jne @F
  346.     loop @B
  347.     jmp @to
  348. @@:
  349.     mov CX,3
  350.     push ES
  351.     mov BX,ES:[046cH]
  352. @Q:
  353.     sti
  354. @@:
  355.     cmp BX,ES:[046cH]
  356.     jne @B
  357.     loop @B
  358.     pop ES
  359. @K:
  360.     cmp DoEcho,0
  361.     je @F
  362.     mov AH,13H
  363.     int 014H
  364. @@:
  365.     pop CX                    ; Character sent
  366.     ret
  367.  
  368. _code    ends
  369.  
  370. end    _go
  371.