home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / cpm86 / c86xr2.a86 < prev    next >
Text File  |  2020-01-01  |  16KB  |  574 lines

  1. ; * * * * * * * * * * * * * * *  version 2.9  * * * * * * * * * * * * * * *
  2. ; [35a] Kermit now sets a default baud rate.
  3. ; [35b] Implemented the SET BAUD command.
  4. ; [35c] Implemented the baud rate function to the SHOW command.
  5. ;       The above was done to make operation compatable with CPM-80 version
  6. ;       and simplify use by non computer orientated users.
  7. ;       Mark Woollard, 4/12/85, Animal and Grassland Research Institute
  8. ; * * * * * * * * * * * * * * *  version 2.8  * * * * * * * * * * * * * * *
  9. ; [34] Insert milli-second wait-loop for Break-timing - label MSWAIT:
  10. ; [33] Fix printer on hanging system problem by letting CP/M handle the
  11. ;    interrupts from the 7201 that we don't care about.  Thanks to
  12. ;    Paul Ford, U. of Chicago Graduate School of Business
  13. ; * * * * * * * * * * * * * * *  version 2.7  * * * * * * * * * * * * * * *
  14. ; [30d] Add SET PORT command, currently unimplemented.
  15. ; [30c] Isolate all machine dependencies in KERIO.
  16. ;    RonB, 04/18/84
  17. ; * * * * * * * * * * * * * * *  version 2.6  * * * * * * * * * * * * * * *
  18. ; [28e] Switch to local stack on interrupts.
  19. ;    RonB, 03/28/84
  20. ; * * * * * * * * * * * * * * *  version 2.4  * * * * * * * * * * * * * * *
  21. ; [20b] Add PRTBRK to send break & set correct clock rate for NEC.
  22. ; [20d] Add a pseudo time-out to PRTOUT so it doesn't loop forever.
  23. ;    RonB,03/02/84
  24. ; [19a] Add XON/XOFF type flow control
  25. ; [19b]    Clear screen and beginning and end of program.
  26. ; [19e]    Add PRTBRK to send break to port (Rainbow only)
  27. ; [19g]    Put in EQU for clock rate for timing loops.
  28. ;    Rg, 2/84     <Oc.Garland%CU20B@Columbia-20>
  29. ; * * * * * * * * * * * * * * *  version 2.3  * * * * * * * * * * * * * * *
  30. ;  [par] Added calls to set parity, strip parity on input if
  31. ;    other than none parity is called for.
  32. ;     JD, 2/84
  33. ; * * * * * * * * * * * * * * *  version 2.2  * * * * * * * * * * * * * * *
  34. ;  [2]    Add a de-initialization routine for the serial port, to restore
  35. ;    changed interrupt vectors, etc.
  36. ;    RonB,12/23/83
  37. ;  [1]    Add I/O support for the NEC Advanced Personal Computer
  38. ;    RonB,12/23/83
  39. ; * * * * * * * * * * * * * * *  version 2.0  * * * * * * * * * * * * * * *
  40.  
  41. ; This module contains all the low level communications port I/O
  42. ; routines.
  43.  
  44. ; The following is the I/O code for the DEC Rainbow.
  45.  
  46.         CSEG $
  47.  
  48. ; Clock rate *10 for timing loops    ;[19g]
  49. clckrt    equ    48        ;[19g]  4.8 Mhz
  50.  
  51. ; Interrupt vector locations, in data segment
  52. mnstat    EQU    042H        ;Status port.
  53. mndata    EQU    040H        ;Data port.
  54. mnctrl    EQU    002H        ;Control port.
  55.  
  56. ; Interrupt vector locations.  These are all in data segment 0.
  57.  
  58. mnoff    EQU    90H        ;Main data port interrupt routine offset.
  59. mnseg    EQU    92H        ;Main data port interrupt routine segment.
  60.  
  61. output    EQU    04H        ;Bit for output ready.
  62. input    EQU    01H        ;Bit for input ready.
  63.  
  64. outlmt    EQU    1000H        ;Number of times to check output status
  65.                 ; before giving up on send.        ;[20d]
  66.  
  67. defbd    EQU    0BH        ; [35a] Default baud rate, 0=50 baud, 1=75,
  68.                 ; 2=110, 3=134.5, 4=150, 5=200, 6=300, 7=600
  69.                 ; 8=1200, 9=1800, 10=2000, 11=2400, 12=3600
  70.                 ; 13=4800, 14=9600 and 15=19200
  71.  
  72. ; Input data from port.  Preserves all ACs and returns char in
  73. ; AL.  Gets the char from the ring buffer.  Assumes a char is
  74. ; already there.
  75.  
  76. inchr:    push    bx
  77.     cli            ;Disable interrupts while were are playing.
  78.     dec    mnchrn        ;Decrement the number of chars in the buffer.
  79.     mov    bx, mnchop    ;Get the pointer into the buffer.
  80.     inc    bx        ;Increment to the next char.
  81.     cmp    bx, offset mnchrs+mnchnd ;Past the end?
  82.     jb    inchr2
  83.     mov    bx, offset mnchrs ;If so wrap around to the start.
  84. inchr2:    mov    mnchop, bx    ;Save the updated pointer.
  85.     mov    al, [bx]    ;Get the character.
  86.     sti            ;All done, we can restore interrupts.
  87.     pop    bx
  88.     cmp    parflg,parnon    ;[par] no parity?
  89.     je    inchr3        ;[par] yup, don't bother stripping
  90.     and    al,7fh        ;[par] checking parity, strip off
  91. inchr3:    cmp    floctl, floxon    ; do flow control?        [19a] start
  92.     je    inchr4        ;If yes jump
  93.     ret
  94. inchr4:    cmp    xofsnt, true    ;Have we sent an XOFF
  95.     je    inchr5        ;Jump if yes
  96.     ret
  97. inchr5:    cmp    mnchrn, mntrg1    ;Under the low trigger point?
  98.     jb    inchr6        ;yes - jump
  99.     ret
  100. inchr6:    push    ax        ;save current character
  101.     mov    al, xon
  102.     call    prtout        ;send an XON
  103.     mov    xofsnt, false    ;turn off the flag
  104.     pop    ax        ;get back character
  105.     ret            ;                [19a] end
  106.  
  107.  
  108. ; Output data to port. Trashes DX and prints char in AL.
  109.  
  110. outchr:    mov    dx, mndata
  111.     out    dx, al
  112.     ret
  113.  
  114.  
  115. ; Test if data is available from port.
  116.  
  117. instat:    cmp    mnchrn, 0    ;Any chars in the buffer?
  118.     jnz    inst2
  119.      ret
  120. inst2:    jmp    rskp
  121.  
  122.  
  123. ; Test if port is ready to send next char.  Returns RETSKP if ready.
  124. ; Trashes dx.
  125.  
  126. outwt:    cmp    floctl, floxon    ;are we doing flow-control?    [19a] start
  127.     jne    outwta        ;no - go on
  128.     cmp    xofrcv, true    ;are we being held?
  129.     jne    outwta        ;no - ok go on
  130.     ret            ;held - say we're busy.    [19a] end
  131. outwta:    push    ax
  132.     mov    dx, mnstat
  133.     in    al, dx
  134.     test    al, output
  135.     pop    ax
  136.     jnz    outwt2
  137.      ret
  138. outwt2:    jmp    rskp
  139.  
  140.  
  141. ; Output the character, checking first to make sure the port is clear.
  142.  
  143. prtout:    call    dopar        ;[par]
  144.     push    dx
  145.     push    cx                        ;[20d] begin
  146.     mov    cx,outlmt
  147. prtou2:    call    outwt        ;Wait until the port is ready
  148.      loop    prtou2        ; or too much time has passed.
  149.      nop
  150.     call    outchr        ;Output it.
  151.     pop    cx                        ;[20d] end
  152.     pop    dx
  153.     ret
  154.  
  155.  
  156. mnax    dw    0        ;Storage in CSEG        ;[28e] begin
  157. mnsp    dw    0        ;  for use by interrupt handler
  158. mnsseg    dw    0
  159. mndseg    dw    0
  160.  
  161. ; This routine handles the interrupts on input.
  162.  
  163. mnint:    cli
  164.     mov    cs:mnax, ax    ;Save interrupt stack location.
  165.     mov    ax, sp
  166.     mov    cs:mnsp, ax
  167.     mov    ax, ss
  168.     mov    cs:mnsseg, ax
  169.     mov    ax, cs:mndseg    ;Switch to our internal stack.
  170.     mov    ss, ax
  171.     mov    sp, offset mnstk
  172.     push    ds        ;Save all registers.
  173.     push    es
  174.     push    bp
  175.     push    di
  176.     push    si
  177.     push    dx
  178.     push    cx
  179.     push    bx
  180.     mov    ds, ax
  181.     call    mnproc        ;Process the character.
  182.     mov    dx, mnstat    ;Get the status port.
  183.     mov    al, 38H
  184.     out    dx, al        ;Tell the port we finished with the interrupt.
  185.     pop    bx        ;Restore all registers.
  186.     pop    cx
  187.     pop    dx
  188.     pop    si
  189.     pop    di
  190.     pop    bp
  191.     pop    es
  192.     pop    ds
  193.     mov    ax, cs:mnsp    ;Restore the original stack.
  194.     mov    sp, ax
  195.     mov    ax, cs:mnsseg
  196.     mov    ss, ax
  197.     mov    ax, cs:mnax
  198.     iret            ;Return from the interrupt.    ;[28e] end
  199.  
  200.  
  201. ; This routine (called by MNINT) gets a char from the main port
  202. ; and puts it in the infamous circular buffer.
  203.  
  204. mnproc:    mov    dx, mnstat
  205.     in    al, dx        ;Get the port status.
  206.     test    al, input    ;Any there?
  207.     jnz    mnpro2        ;Yup, go take care of it.
  208.  
  209. ;[33] Begin addition
  210. ; If not a received character, simulate an interrupt transferring
  211. ; control to the CPM routine. Let it handle worrisome things like
  212. ; someone turning on the printer.
  213.  
  214.      pushf            ; Save flags, like an int.
  215.      callf dword ptr mnoldo    ; Call CPM's routine.
  216.      ret            ; Now back to MNINT.
  217.  
  218. ;[33] End addition
  219.  
  220. mnpro2:    mov    al, 1        ;Point to RR1.
  221.     out    dx, al
  222.     in    al, dx        ;Read RR1.
  223.     mov    ah, al        ;Save it.
  224.     mov    al, 30H        ;Reset any errors.
  225.     out    dx, al
  226.     mov    dx, mndata
  227.     in    al, dx        ;Read the char.
  228.     cmp    floctl, floxon    ;are we doing flow-control ?    [19a] start
  229.     jne    mnpr2b        ;no - go on
  230.     cmp    al, xoff    ;is it an XOFF?
  231.     jne    mnpr2a        ;no - go on
  232.     mov    xofrcv, true    ;set the flag
  233.     ret
  234. mnpr2a:    cmp    al, xon        ;an XON?
  235.     jne    mnpr2b        ;no
  236.     mov    xofrcv, false    ;clear the flag
  237.     ret            ;                [19a] end
  238. mnpr2b:    cmp    mnchrn, mnchnd    ;Is the buffer full?
  239.     je    mnperr        ;If so, take care of the error.
  240.     inc    mnchrn        ;Increment the character count.
  241.     mov    bx, mnchip    ;Get the buffer input pointer.
  242.     inc    bx        ;Increment it.
  243.     cmp    bx, offset mnchrs+mnchnd ;Past the end?
  244.     jb    mnpro3
  245.     mov    bx, offset mnchrs ;Yes, point to the start again.
  246. mnpro3:    mov    mnchip, bx    ;Save the pointer.
  247.     mov    [bx], al    ;Put the character in the buffer.
  248.     cmp    floctl, floxon    ;do flow control?        [19a] start
  249.     je    mnpro4        ;If yes jump
  250.     ret
  251. mnpro4:    cmp    xofsnt, true    ;Have we sent an XOFF
  252.     jnz    mnpro5
  253.     ret            ;return if we have
  254. mnpro5:    cmp    mnchrn, mntrg2    ;Past the High trigger point?
  255.     ja    mnpro6        ;yes - jump
  256.     ret
  257. mnpro6:    mov    al, xoff
  258.     call    prtout        ;send an XOFF
  259.     mov    xofsnt, true    ;set the flag
  260.     ret            ;                [19a] End
  261.  
  262. mnperr:    ret            ;Just return on an error for now.
  263.  
  264.  
  265. ; prtbrk - send a break        ;                [19e] start
  266.  
  267. prtbrk:                ;
  268.     mov    dx, mnstat    ;status reg. address for port
  269.     mov    al, 15H        ;select reg. 5
  270.     out    dx, al        ;
  271.     mov    al, 0FAH    ;8 bits, TX, Break, RTS, & DTR
  272.     out    dx, al        ;Turn Break on
  273.     mov    ax, 275        ;.. for 275 millisec's        [34]
  274.     call    mswait        ;                [34]
  275.     mov    al, 15H        ;select reg. 5
  276.     out    dx, al        ;
  277.     mov    al, 0EAH    ;same as above without Break
  278.     out    dx, al        ;turn it off
  279.     ret            ;                 [19e] end
  280.  
  281. mswait:                ;                [34] start
  282.     mov    cx,5*clckrt    ; inner loop count for 1 millisec.
  283. mswai1:
  284.     sub    cx,1        ;** inner loop takes 20 clock cycles
  285.     jnz    mswai1        ;**
  286.     dec    ax        ; outer loop counter
  287.     jnz    mswait        ; wait another millisecond
  288.     ret            ;                [34] end
  289. ;
  290. ; Init the 7201 for 8 bits, no parity, and 1 stop bit.
  291.  
  292. serini:    call    ansmod        ;Switch from VT52 to ANSI mode    ;[30c]
  293.  
  294.     mov    ax, ds
  295.     mov    cs:mndseg, ax    ;Save the data segment somewhere in CSEG.
  296.     push    ds        ;Save the data segment.
  297.     mov    ax, 0
  298.     mov    ds, ax        ;We want DSEG = 0.
  299.     cli            ;Turn off interrupts.
  300.     mov    bx, .mnoff    ;[33] Get original interrupt offset.
  301.     mov    es, .mnseg    ;[33] Get original interrupt segment.
  302.     mov    ax, offset mnint;Point to the interrupt routine offset.
  303.     mov    .mnoff, ax    ;Put in the main port interrupt offset addr.
  304.     mov    ax, cs        ;Get our code segment.
  305.     mov    .mnseg, ax    ;Put in the main port interrupt segment addr.
  306.     sti            ;Restore interrupts.
  307.     pop    ds        ;Restore data segment.
  308.  
  309.     mov    mnoldo, bx    ;[33] Stash original serial interrupt offset.
  310.     mov    mnolds, es    ;[33] Stash original segment.
  311.  
  312.     mov    dx, mnstat    ;Point to status port.
  313.     mov    al, 18H
  314.     out    dx, al        ;Reset the port.
  315.     mov    al, 14H
  316.     out    dx, al        ;Select register 4.
  317.     mov    al, 44H        ;16X clock, 1 stop bit, no parity.
  318.     out    dx, al
  319.     mov    al, 13H
  320.     out    dx, al        ;Select register 3.
  321.     mov    al, 0C1H    ;8 bits/char, RX enable.
  322.     out    dx, al
  323.     mov    al, 15H
  324.     out    dx, al        ;Select register 5.
  325.     mov    al, 0EAH    ;8 bits/char, TX enable, RTS and DTR.
  326.     out    dx, al
  327.     mov    al, 11H
  328.     out    dx, al        ;Select register 1.
  329.     mov    al, 18H
  330.     out    dx, al        ;Enable interrupt processing on this port.
  331.     mov    dx, mnctrl    ;point to comm control port
  332.     mov    al, 0F0H    ;set RTS & DTR high
  333.     out    dx, al
  334.     mov    al,defbd    ; [35a] Get default baud
  335.     mov    dl,al        ; Save it
  336.     mov    cl,4        ; Move low nibble into high
  337.     shl    al,cl        ;
  338.     or    al,dl        ; Replace low nibble
  339.     out    6,al        ; Write to baud control port
  340.     mov    baudrt,al    ; Save it for show baud         ;[35a] end
  341.     ret
  342.  
  343. serfin:    
  344.     call    clrscr        ;[19b] clear screen        ;[30c]
  345.  
  346.     ret            ;Nothing to deinitialize on Rainbow.
  347.  
  348. ; This routine clears the serial port input buffer.  It is called to
  349. ; clear out excess NAKs that can result from server mode operation.
  350.  
  351. cfibf:    mov    mnchrn, 0    ;Say no characters in the buffer.
  352.     mov    mnchip, offset mnchrs-1+mnchnd ;Reset input pointer.
  353.     mov    mnchop, offset mnchrs-1+mnchnd ;Reset output pointer.
  354.     ret
  355.  
  356.     DSEG $
  357.  
  358. mnchnd    equ    256        ;[19a] Size of circular buffer.
  359. mntrg1    equ    64        ;[19a] Low trigger point for Auto XON/XOFF
  360. mntrg2    equ    192        ;[19a] High trigger point for Auto XON/XOFF
  361.  
  362. floctl    db    1        ;[19a] If floctl=floxon do Auto XON/XOFF logic
  363. xofsnt    db    0        ;[19a] set if XOFF was sent
  364. xofrcv    db    0        ;[19a] set if XOFF was recieved
  365.  
  366. mnchrn    DW    0        ;[19a] Number of chars in the buffer.
  367. mnchrs    RB    mnchnd        ;Circular character buffer for input.
  368. mnchip    DW    mnchrs-1+mnchnd    ;Input pointer into character buffer.
  369. mnchop    DW    mnchrs-1+mnchnd    ;Output pointer into character buffer.
  370.  
  371. mnoldo    RW    1        ;[33] CPM's 7201 interrupt vector offset
  372. mnolds    RW    1        ;[33] and segment.
  373.  
  374.     rw    32        ;Interrupt stack        ;[28e]
  375. mnstk    dw    0        ;bottom of stack        ;[28e]
  376.  
  377. baudrt    rb    1        ;Current baud rate
  378.  
  379.     CSEG $
  380.  
  381. ; The following routines do the SET and SHOW for the machine dependent
  382. ; features of Kermit.  At present there are only two:  baud rate setting
  383. ; and port selection.
  384.  
  385. ;    This is the SET BAUD rate subcommand (not implemented in Rainbow)
  386.  
  387. bdset:    mov    ah, cmcfm
  388.     call    comnd            ;Get a confirm.
  389.     jmp    bdset1            ; Didn't get a confirm.
  390.     jmp    bdset2            ; [35b] Go and ask for baud
  391. bdset1:    mov    dx, offset ermes3    ; Tell user unknown command option
  392.     call    tcrmsg
  393.     jmp    rskp
  394. bdset2:    mov    dx, offset bdlst    ; Print list of baud speeds
  395.     call    tmsg
  396. bdstrt:    mov    cl,1            ; Get a response from keyboard
  397.     int    224
  398.     and    al,5fH            ; Force upper case
  399.     cmp    al,'A'
  400.     jnb    bdset3            ; AL >= 'A'...
  401.     jmp    bdset4            ; Response too low
  402. bdset3:    cmp    al,'P'
  403.     jle    bdset5            ; AL <= 'P'...
  404. bdset4:    mov    dx,offset rtrmss    ; Incorrect response so delete char
  405.     call    tmsg            ; typed and make keyboard beep
  406.     jmp    bdstrt            ; Go and try again...
  407. bdset5:    sub    al,'A'            ; Convert to internal baud rate code
  408.     mov    dl,al            ; Save AL
  409.     mov    cl,4            ; Move lower nibble into upper
  410.     shl    al,cl
  411.     or    al,dl            ; replace lower nibble
  412.     out    6,al            ; Write to baud port
  413.     mov    baudrt,al        ; Save for SHOW BAUD         ;[35b] end
  414.     jmp    rskp
  415.  
  416. ;    This is the SET PORT subcommand (not implemented in Rainbow)
  417.  
  418. prtset:    mov    ah, cmcfm
  419.     call    comnd        ;Get a confirm.
  420.      jmp    $+3        ; Didn't get a confirm.
  421.     mov    dx, offset infms6 ;Tell user it's not implemented
  422.     call    tcrmsg
  423.     jmp    rskp
  424.  
  425.  
  426. ; The following procedures implement the SHOW command for the system
  427. ; dependent features of baud rate and port selection.
  428.  
  429. ; SHOW BAUD command
  430.  
  431. shobd:    mov    dx, offset bdst        ;[35c] Print 'Baud rate:'
  432.     call    tcrmsg
  433.     mov    al,baudrt        ; Get current baud rate
  434.     and    al,0FH            ; Mask off high nibble
  435.     mov    cl,6            ; Multiply by 6
  436.     mul    cl
  437.     add    ax, offset bdmss2    ; Set up DX as an offset into
  438.     mov    dx,ax            ; the list of baud strings
  439.     call    tmsg            ; Print the string
  440.     ret                ;             ;[35c] end
  441.  
  442. shoprt:    ret            ;Port selection not implemented.
  443.  
  444.  
  445.  
  446.  
  447. ; The following routines do screen control.  These are isolated here because
  448. ; the screen control sequences are likely to vary from system to system, even
  449. ; though the Rainbow and APC (the only systems implemented to date) both use
  450. ; ANSI sequences for this purpose.
  451.  
  452.     CSEG $
  453.  
  454. ; POSCUR - positions cursor to row and col (each 1 byte) pointed to by dx.
  455.  
  456. poscur:    mov    bx, dx        ;Do ANSI cursor positioning.
  457.     mov    cl, 10
  458.     mov    al, [bx]    ;Get row value
  459.     sub    ah, ah
  460.     div    cl        ;units digit in ah, tens digit in al
  461.     add    ax, '00'    ;Convert both to ASCII
  462.     mov    word ptr anspos+2, ax    ;Save reversed (al,ah)
  463.     mov    al, 1[bx]    ;Do same for column value
  464.     sub    ah, ah
  465.     div    cl
  466.     add    ax, '00'
  467.     mov    word ptr anspos+5, ax
  468.     mov    dx, offset anspos ;Print cursor positioning string.
  469.     call    tmsg
  470.     ret
  471.  
  472. ; CLRSCR - homes cursor and clears screen.
  473.  
  474. clrscr:    mov    dx, offset anscls
  475.     call    tmsg
  476.     ret
  477.  
  478. ; CLRLIN - clears from cursor to end of line.
  479.  
  480. clrlin:    mov    dl, cr        ;Go to beginning of line
  481.     call    bout
  482. clreol:    mov    dx, offset ansclr ;Clear from cursor to end of line
  483.     call    tmsg
  484.     ret
  485.  
  486. ; REVON - turns on reverse video display
  487.  
  488. revon:    mov    dx, offset ansron
  489.     call    tmsg
  490.     ret
  491.  
  492. ; REVOFF - turns off reverse video display
  493.  
  494. revoff:    mov    dx, offset ansrof
  495.     call    tmsg
  496.     ret
  497.  
  498. ; BLDON - turns on bold (highlighted) display
  499.  
  500. bldon:    mov    dx, offset ansbon
  501.     call    tmsg
  502.     ret
  503.  
  504. ; BLDOFF - turns off bold (highlighted) display
  505.  
  506. bldoff:    mov    dx, offset ansbof
  507.     call    tmsg
  508.     ret
  509.  
  510. ; ANSMOD - enters ANSI mode from VT52 mode
  511.  
  512. ansmod:    mov    dx, offset ansion
  513.     call    tmsg
  514.     ret
  515.  
  516.     DSEG $
  517.  
  518. anspos    db    esc,'[00;00H$'        ;Position cursor to row and column
  519. anscls    db    esc,'[H',esc,'[J$'    ;Home cursor and clear screen
  520. ansclr    db    esc,'[K$'        ;Clear from cursor to end of line
  521. ansron    db    esc,'[7m$'        ;Turn on reverse video
  522. ansrof    db    esc,'[m$'        ;Turn off reverse video
  523. ansbon    db    esc,'[1m$'        ;Turn on bold (highlight) display
  524. ansbof    db    esc,'[m$'        ;Turn off bold display
  525. ansion    db    esc,'<$'        ;Enter ANSI mode
  526.  
  527. ; Here tab expansion is done if necessary.  If not, just return retskp.
  528.  
  529.     CSEG $
  530. dotab:    jmp rskp
  531.  
  532.     DSEG $
  533. delstr    db    ' ',10O,10O,'$'    ;Delete string.
  534.  
  535. system    db    '                DEC Rainbow-100$'
  536.  
  537. bdlst    db    esc,'[H',esc,'[J','Baud rates available :'    ;[35b] Baud rate list
  538.     db    cr,lf,cr,lf,'       A)    50'            ;for SET BAUD
  539.     db    cr,lf,'       B)    75'
  540.     db    cr,lf,'       C)   110'
  541.     db    cr,lf,'       D)   134.5'
  542.     db    cr,lf,'       E)   150'
  543.     db    cr,lf,'       F)   200'
  544.     db    cr,lf,'       G)   300'
  545.     db    cr,lf,'       H)   600'
  546.     db    cr,lf,'       I)  1200'
  547.     db    cr,lf,'       J)  1800'
  548.     db    cr,lf,'       K)  2000'
  549.     db    cr,lf,'       L)  2400'
  550.     db    cr,lf,'       M)  3600'
  551.     db    cr,lf,'       N)  4800'
  552.     db    cr,lf,'       O)  9600'
  553.     db    cr,lf,'       P) 19200'
  554.     db    cr,lf,cr,lf,'Enter choice > $'
  555.  
  556. rtrmss    db    8,' ',8,7,'$'        ;[35b] Delete char and beep string
  557.  
  558. bdmss2    db    '50   $'        ;[35c] Used by SHOW BAUD option
  559.     db    '75   $'
  560.     db    '110  $'
  561.     db    '134.5$'
  562.     db    '150  $'
  563.     db    '200  $'
  564.     db    '300  $'
  565.     db    '600  $'
  566.     db    '1200 $'
  567.     db    '1800 $'
  568.     db    '2000 $'
  569.     db    '2400 $'
  570.     db    '3600 $'
  571.     db    '4800 $'
  572.     db    '9600 $'
  573.     db    '19200$'
  574.