home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / mex / mxo-ep30.asm < prev    next >
Assembly Source File  |  1994-07-13  |  31KB  |  1,180 lines

  1. ; MXO-EP30.ASM -- Epson QX-10 overlay for MEX112.COM  10/06/84
  2. ;
  3. ; J. L. Bewley
  4. ;
  5. ; This file is an assembly source code overlay for use with
  6. ; Ron Fowler's MEX112.COM "Modem Executive" communications
  7. ; program.  (This overlay will work equally well with MEX110
  8. ; and MEX111.)  This overlay adapts the MEX program for
  9. ; use on the Epson QX-10 computer.  Several notable improvements
  10. ; over the older MXO-EP12.ASM overlay are present.  Most noticeably,
  11. ; the "SET" command has been expanded to allow setting the data
  12. ; word length (5, 6, 7, or 8 bits), parity (odd, even, off),
  13. ; stop bits (1, 1.5, or 2), turning the Hayes Smartmodem (tm)
  14. ; speaker on/off, setting the carrier detect time (15, 30, 45, or
  15. ; 60 seconds), setting the Baud rate (110, 300, 600, 1200, 2400,
  16. ; 4800, or 9600 bps), setting the modem mode (originate/answer),
  17. ; and setting the method of dialing (pulse/tone).  These features
  18. ; can be set only on the Hayes Smartmodem or truly compatible
  19. ; "compatibles."  I have only tested this overlay with the Hayes
  20. ; Smartmodem.  It should be noted by Epson QX-10 owners that
  21. ; this overlay will NOT work with the internal Comrex CR-103
  22. ; modem.  This overlay INCLUDES the Hayes modem overlay, revision
  23. ; level 1.1.
  24. ;
  25. ; Revision 3.0
  26. ; October 6, 1984
  27. ; James L. Bewley  (Jim)
  28. ; VP, Mile High Epson User's Group
  29. ; Denver, Colorado
  30. ;
  31. ; I can be reached at the TBBS HQ BBS system at (303) 690-4566
  32. ; (300/1200 bps., 24-hrs., Colorado)
  33. ;
  34. ; For this overlay to work properly, the DIP switches behind
  35. ; the front panel on the Hayes should be set as follows:
  36. ;
  37. ; Switch:
  38. ;   #1   #2   #3   #4   #5   #6   #7   #8
  39. ;   UP   UP   DN   UP   DN   UP   DN   DN
  40. ;
  41. ; In general, these switch settings are compatible with Valdocs.
  42. ;
  43. ;
  44. ; I want it made clear that the majority of the work done in this
  45. ; overlay was done by Norm Saunders, Smith-Quinn, and Mark Pulver
  46. ; whose collective efforts resulted in the MXO-KP30 overlay for
  47. ; the Kaypro computers.  I was so impressed with the final product
  48. ; of these folks' work that I took the liberty of modifying their
  49. ; Kaypro overlay for use on the Epson QX-10.  Mostly I just had
  50. ; to change a few equates and defaults at the beginning of the
  51. ; program and write a small bit of 8080 assembly code to handle
  52. ; the NEC 7201 Multi-Protocol Serial Controller chip used in
  53. ; the Epson QX-10.  This involved changing the baud rate tables
  54. ; from one-byte entries to two and modifying the indexing and
  55. ; loading code to accept these two-byte entries.  Norm Saunders
  56. ; indicates in his notes that he is accessible on the 
  57. ; Laurel SuperSystem at 301-953-3753.  In the comments in this
  58. ; overlay you will often see references to the "SIO" chip.  While
  59. ; the Epson QX-10 uses the NEC 7201 MPSC chip instead of the
  60. ; Zilog SIO chip, the "Serial Input/Output" comments are still
  61. ; appropriate.  Enjoy.   -- Jim Bewley
  62. ;
  63. ;
  64. ; It should be noted that this program initializes the Hayes
  65. ; modem to 1200 bps.  If you are using the Hayes 300 modem just
  66. ; load this program, type "SET BAUD 300", and then CLONE this
  67. ; setup back to disk.  You will then have a 300 baud version.
  68. ;
  69. ; To use this overlay with MEX112, first look at the equate tables
  70. ; and change any defaults you desire.  It should be acceptable for
  71. ; most folks just as it is.  Then, using ASM.COM, assemble this
  72. ; overlay to "MXO-EP30.HEX".  Finally, form your working copy of
  73. ; MEX (called MEX112QX.COM below) with MLOAD21 as follows:
  74. ;
  75. ;     MLOAD21 MEX112QX.COM=MEX112.COM,MXO-EP30.HEX
  76. ;
  77. ; Note the absence of the Smartmodem overlay.  This program,
  78. ; by necessity, includes the Smartmodem overlay.
  79. ;
  80. ;
  81. ;
  82. ;
  83. REV        EQU    30        ;overlay revision level
  84. ;
  85. ;======================================================================
  86. ;
  87. ;    Miscellaneous equates
  88. ;
  89. BELL        EQU    07H        ;bell
  90. CR        EQU    0DH        ;carriage return
  91. ESC        EQU    1BH        ;escape
  92. LF        EQU    0AH        ;linefeed
  93. TAB        EQU    09H        ;tab
  94. NO        EQU    0        ;
  95. YES        EQU    0FFH        ;
  96. FALSE        EQU    0        ;
  97. TRUE        EQU    NOT FALSE    ;
  98. TPA        EQU    0100H        ;
  99. MEXLOC        EQU    0D00H        ;start of MEX service processor
  100. ;
  101. ;    Epson QX-10 port definitions
  102. ;
  103. PORT        EQU    011H        ;Base serial input/output port
  104. MODCTL        EQU    PORT+2        ;Modem control port
  105. MODDAT        EQU    PORT        ;Modem data port
  106. ;
  107. ;    Epson QX-10 bit definitions
  108. ;
  109. MDRCVB        EQU    01H        ;Your bit to test for receive
  110. MDRCVR        EQU    01H        ;Your value when receive ready
  111. MDSNDB        EQU    04H        ;Your bit to test for send
  112. MDSNDR        EQU    04H        ;Your value when send ready        
  113. ;
  114. ;    MEX service processor functions
  115. ;
  116. MEX    EQU    MEXLOC        ;address of the service processor
  117. INMDM    EQU    255        ;get char from port to A, CY=no more in 100 ms
  118. TIMER    EQU    254        ;delay 100ms * reg B
  119. TMDINP    EQU    253        ;B=# secs to wait for char, CY=no char
  120. CHEKCC    EQU    252        ;check for ^C from KBD, Z=present
  121. SNDRDY    EQU    251        ;test for modem-send ready
  122. RCVRDY    EQU    250        ;test for modem-receive ready
  123. SNDCHR    EQU    249        ;send a character to the modem (after sndrdy)
  124. RCVCHR    EQU    248        ;recv a char from modem (after rcvrdy)
  125. LOOKUP    EQU    247        ;table search: see CMDTBL comments for info
  126. PARSFN    EQU    246        ;parse filename from input stream
  127. BDPARS    EQU    245        ;parse baud-rate from input stream
  128. SBLANK    EQU    244        ;scan input stream to next non-blank
  129. EVALA    EQU    243        ;evaluate numeric from input stream
  130. LKAHED    EQU    242        ;get nxt char w/o removing from input
  131. GNC    EQU    241        ;get char from input, CY=1 if none
  132. ILP    EQU    240        ;inline print
  133. DECOUT    EQU    239        ;decimal output
  134. PRBAUD    EQU    238        ;print baud rate
  135. CONOUT    EQU    2        ;simulated BDOS function 2: console char out
  136. PRINT    EQU    9        ;simulated BDOS function 9: print string
  137. INBUF    EQU    10        ;input buffer, same structure as BDOS 10
  138. ;
  139.         ORG    TPA
  140. ;
  141.         DS    3    ;(for  "JMP   START" instruction)
  142. ;
  143. ; The following variables are located at the beginning of the program
  144. ; to facilitate modification without the need of re-assembly.  They will
  145. ; be moved in MEX 2.0.
  146. ;
  147. SMODEM:        DW    TRUE    ;true=HAYES modem, false=non-dialing    103H
  148. TPULSE:        DB    'T'    ;T=touch, P=pulse (Smartmodem-only)    105H
  149. CLOCK:        DB    40    ;clock speed in MHz x10, 25.5 MHz max.
  150.                 ;20=2 MHh, 37=3.68 MHz, 40=4 MHz, etc.
  151. MSPEED:        DB    5    ;0=110 1=300 2=450 3=600 4=710 5=1200    107H
  152.                 ;6=2400 7=4800 8=19200 default display
  153.                 ;time for sending a file
  154. BYTDLY:        DB    5    ;0=0 delay  1=10ms  5=50 ms - 9=90 ms    108H
  155.                 ;default time to send character in ter-
  156.                 ;minal mode file transfer for slow BBS.
  157. CRDLY:        DB    5    ;0=0 delay 1=100 ms 5=500 ms - 9=900 ms 109H
  158.                 ;default time for extra wait after CRLF
  159.                 ;in terminal mode file transfer
  160. COLUMS:        DB    5    ;number of DIR columns shown        10AH
  161. SETFL:        DB    YES    ;yes=user-added SET command        10BH
  162. SCRTST:        DB    YES    ;yes=user-added cursor control routine     10CH
  163.         DB    0    ;spare (replaces ACKNAK)        10DH
  164. BAKFLG:        DB    NO    ;yes=change any file same name to .BAK    10EH
  165. CRCDFL:        DB    YES    ;yes=default to CRC checking        10FH
  166. TOGCRC:        DB    YES    ;yes=allow toggling of CRC to Checksum    110H
  167. CVTBS:        DB    NO    ;yes=convert backspace to rub        111H
  168. TOGLBK:        DB    NO    ;yes=allow toggling of bksp to rub    112H
  169. ADDLF:        DB    NO    ;no=no LF after CR to send file in    113H
  170.                 ;terminal mode (added by remote echo)
  171. TOGLF:        DB    YES    ;yes=allow toggling of LF after CR    114H
  172. TRNLOG:        DB    NO    ;yes=allow transmission of logon    115H
  173.                 ;write logon sequence at location LOGON
  174. SAVCCP:        DB    YES    ;yes=do not overwrite CCP        116H
  175. LOCNXT:        DB    NO    ;yes=local command if EXTCHR precedes    117H
  176.                 ;no=external command if EXTCHR precedes
  177. TOGLOC:        DB    YES    ;yes=allow toggling of LOCNXT        118H
  178. LSTTST:        DB    YES    ;yes=printer available on printer port    119H
  179. XOFTST:        DB    NO    ;yes=chks for XOFF from remote while    11AH
  180.                 ;sending a file in terminal mode
  181. XONWT:        DB    NO    ;yes=wait for XON after CR while    11BH
  182.                 ;sending a file in terminal mode
  183. TOGXOF:        DB    YES    ;yes=allow toggling of XOFF checking    11CH
  184. IGNCTL:        DB    YES    ;yes=CTL-chars above ^M not displayed    11DH
  185. EXTRA1:        DB    0    ;for future expansion            11EH
  186. EXTRA2:        DB    0    ;for future expansion            11FH
  187.         DS    8    ;not used by MEX            120H
  188. ;
  189.         DS    2        ;location for PMMI variables    128H
  190. ;
  191. ;    Low-level modem I/O routines
  192. ;
  193. INCTRL:        JMP    INSTAT        ;read USART status        12AH
  194.         DS    7        ;
  195. OTDATA:        JMP    OUTDAT        ;out modem data port        134H
  196.         DS    7        ;
  197. INPORT:        JMP    INDAT        ;in modem data port        13EH
  198.         DS    7        ;
  199. ;
  200. ;    Bit-test routines
  201. ;
  202. MASKR:        ANI    MDRCVB ! RET    ;bit to test for receive ready    148H
  203. TESTR:        CPI    MDRCVR ! RET    ;value of receive bit when rdy    14BH
  204. MASKS:        ANI    MDSNDB ! RET    ;bit to test for send ready    14EH
  205. TESTS:        CPI    MDSNDR ! RET    ;value of send bit when ready    151H
  206.         DS    12        ;
  207. ;
  208. ;    MEX10 vector to overlay-provided functions
  209. ;
  210. LOGON:        DS    2        ;not implemented in MEX        160H
  211. ;
  212.         IF  NOT SMODEM
  213. DIALV:        DS    3        ;dummied out for non-dialing    162H
  214. DISCV:        DS    3        ;modems                165H
  215. GOODBV:        JMP    GDBY        ;disconnect 212-type modems    168H
  216.         ENDIF
  217. ;
  218.         IF SMODEM
  219. DIALV:        JMP    DIAL        ;Hayes dialing routine        162H
  220. DISCV:        JMP    DISCON        ;Hayes disconnect routine    165H
  221. GOODBV:        RET ! NOP ! NOP        ;dummied out for Hayes modem    168H
  222.         ENDIF
  223. ;
  224. INMODV:        JMP    NITMOD        ;UART initialization        16BH
  225. NEWBDV:        JMP    PBAUD        ;Reset baud rate from library    16EH
  226. NOPARV:        RET  !    NOP  !    NOP    ;(by-passes PMMI routine)    171H
  227. PARITV:        RET  !    NOP  !    NOP    ;(by-passes PMMI routine)    174H
  228. SETUPV:        JMP    SETCMD        ;Kaypro SET command        177H
  229. SPMENV:        DS    3        ;not implemented in MEX        17AH
  230. VERSNV:        JMP    SYSVER        ;print signon message        17DH
  231. BREAKV:        JMP    BREAK        ;send a break tone        180H
  232. ;
  233. ; The following jump vector provides the overlay with access to special
  234. ; routines in MEX10 provided to maintain compatibility with MDM7 over-
  235. ; lays.  It is recommended that these routines be avoided as they will
  236. ; disappear in future versions of MEX.
  237. ;
  238. ILPRTV:        DS    3    ;replaced with MEX function 9        183H
  239. INBUFV:        DS    3    ;replaced with MEX function 10        186H
  240. ILCMPV:        DS    3    ;replaced with table lookup fnc 247    189H
  241. INMDMV:        DS    3    ;replaced with MEX function 255        18CH
  242. NXSCRV:        DS    3    ;not supported by MEX            18FH
  243. TIMERV:        DS    3    ;replaced with MEX function 254        192H
  244. ;
  245. ;    Clear-screen and clear-to-end-of-screen functions
  246. ;
  247. SCRN1:        JMP    CLREOS    ;clear to end of screen            195H
  248.         DS    6    ;                    198H
  249. ;
  250. SCRN2:        JMP    CLS    ;clear screen, home cursor        19EH
  251.         DS    6    ;                    1A1H
  252. ;
  253. ;---------------------------------------------------------------------------
  254. ;
  255. ;    *** End of fixed format area ***
  256. ;
  257. ;---------------------------------------------------------------------------
  258. ;
  259. ;    Modem I/O routines
  260. ;
  261. INSTAT:        MVI    A,10H        ;channel 0, reset interrupts.    
  262.         OUT    MODCTL        ;
  263.         IN    MODCTL        ;get the status bits
  264.         RET            ;
  265. OUTDAT:        OUT    MODDAT        ;out modem data port
  266.         RET            ;
  267. INDAT:        IN    MODDAT        ;in modem data port
  268.         RET            ;
  269. ;
  270. ;    Screen-handling routines
  271. ;
  272. CLREOS:        LXI    D,EOSMSG    ;
  273.         MVI    C,PRINT        ;
  274.         CALL    MEX        ;
  275.         RET            ;
  276. ;
  277. CLS:        LXI    D,CLSMSG    ;
  278.         MVI    C,PRINT        ;
  279.         CALL    MEX        ;
  280.         RET            ;
  281. ;
  282. ;    Print system version message
  283. ;
  284. SYSVER:        CALL    ILPRT        ;
  285.         DB    CR,LF,'Version for Epson QX-10 Computer',CR,LF
  286.         DB    'With HAYES external Smartmodem',CR,LF
  287.         DB    'Revision:  JLB-'
  288.         DB    REV/10+'0'
  289.         DB    '.'
  290.         DB    REV MOD 10 + '0'
  291.         DB    CR,LF,CR,LF
  292.         DB    'Type SET for Set-Command Syntax',CR,LF
  293.         DB    '(Set syntax by N. L. Saunders)'
  294.         DB    CR,LF,CR,LF,0
  295.         RET
  296. ;
  297. ;    Send BREAK function
  298. ;
  299. BREAK:        MVI    A,5        ;select SIO register 5
  300.         OUT    MODCTL
  301.         MVI    A,0FAH        ;send BREAK tone
  302. ;
  303.     IF NOT SMODEM
  304.         JMP    GDBY1
  305. ;
  306. ;    Set DTR low for 300ms (disconnects some modems)
  307. ;
  308. GDBY:        MVI    A,5        ;select SIO write-register 5
  309.         OUT    MODCTL        ;
  310.         LDA    REG5        ;get the register 5 control byte
  311.         ANI    07FH        ;reset bit 7 (pulls DTR low)
  312.     ENDIF
  313. ;
  314. GDBY1:        OUT    MODCTL
  315.         MVI    B,3        ;Delay 300 ms.
  316.         MVI    C,TIMER
  317.         CALL    MEX
  318.         MVI    A,5
  319.         OUT    MODCTL
  320.         LDA    REG5        ;Restore to normal
  321.         OUT    MODCTL
  322.         RET
  323. ;
  324. ;    Epson QX-10 Initialization Routines
  325. ;
  326. NITMOD:        CALL    NITSIO        ;initialize the SIO
  327.         CALL    NTBAUD        ;initialize the baud rate
  328. ;
  329.     IF SMODEM
  330.         CALL    NITMDM        ;initialize the Hayes
  331.     ENDIF
  332. ;
  333.         RET            ;
  334. ;
  335. ;    Initialize the NEC-7201 MPSC chip
  336. ;
  337. NITSIO:        MVI    A,00H        ;Select reg. 0
  338.         OUT    MODCTL
  339.         LDA    REG0        ;Command byte
  340.         OUT    MODCTL
  341.         MVI    A,04H        ;Select reg. 4
  342.         OUT    MODCTL
  343.         LDA    REG4        ;Receive/transmit control byte
  344.         OUT    MODCTL
  345.         MVI    A,03H        ;Select reg. 3
  346.         OUT    MODCTL
  347.         LDA    REG3        ;Receiver logic byte
  348.         OUT    MODCTL
  349.         MVI    A,05H        ;Select reg. 5
  350.         OUT    MODCTL
  351.         LDA    REG5        ;Transmitter logic byte
  352.         OUT    MODCTL
  353.         RET
  354. ;
  355. ;    Initialize the baudrate generator
  356. ;
  357. NTBAUD:        LDA    MSPEED        ;get the speed code
  358.         CALL    PBAUD        ;go set it
  359.         RET
  360. ;
  361. ;    Initialize the modem, if it's a Hayes-type
  362. ;
  363.     IF SMODEM
  364. NITMDM:        CALL    CRLF        ;
  365.         CALL    ILPRT        ;
  366.         DB    'Initializing modem:',CR,LF,0
  367.         CALL    STSPK1        ;
  368.         CALL    CRLF        ;
  369.         CALL    STDL30        ;initial delay = 30 secs.
  370.         CALL    CRLF        ;
  371.         CALL    STMOD1        ;
  372.         CALL    CRLF        ;
  373.         CALL    SHDIAL        ;
  374.         CALL    CRLF        ;
  375.         CALL    CRLF        ;
  376.         RET            ;
  377. ;
  378. ;    Send a string to the modem
  379. ;
  380. MDMSET:        CALL    SMSEND        ;send a string to the modem
  381. NITMD1:        MVI    C,INMDM        ;eat all feedback from the modem
  382.         CALL    MEX        ;
  383.         JNC    NITMD1        ;
  384.         RET            ;
  385.     ENDIF
  386. ;
  387. ;    Epson QX-10 SET command processor
  388. ;
  389. SETCMD:        MVI    C,SBLANK    ;check for SET arguments
  390.         CALL    MEX        ;
  391.         JC    SETHLP        ;if none, print help message
  392.         LXI    D,CMDTBL    ;parse the command
  393.         CALL    TSRCH        ;
  394.         PUSH    H        ;put returned address on stack
  395.         RNC            ;go there if table match found
  396.         POP    H        ;if no match, fix the stack and
  397. SETERR:        LXI    D,SETEMS    ;print an error message
  398.         MVI    C,PRINT        ;
  399.         CALL    MEX        ;
  400.         RET            ;
  401. ;
  402. ;    SET <no arguments>: print help message
  403. ;
  404. SETHLP:        LXI    D,HLPMSG    ;
  405.         MVI    C,PRINT        ;
  406.         CALL    MEX        ;
  407.         RET            ;
  408. ;
  409. HLPMSG:        DB    CR,LF,'SET command - Epson QX-10 version:',CR,LF,LF
  410.         DB    CR,LF,'SET BAUD 110 <or> 300 <or> 600 <or> 1200 <or>'
  411.         DB    CR,LF,'        2400 <or> 4800 <or> 9600'
  412.         DB    CR,LF,'SET PARITY OFF <or> EVEN <or> ODD'
  413.         DB    CR,LF,'SET STOPBITS 1 <or> 1.5 <or> 2'
  414.         DB    CR,LF,'SET LENGTH 5 <or> 6 <or> 7 <or> 8'
  415. ;
  416.     IF SMODEM
  417.         DB    CR,LF,'SET MONITOR ON <or> OFF'
  418.         DB    CR,LF,'SET DELAY 15 <or> 30 <or> 45 <or> 60'
  419.         DB    CR,LF,'SET MODE ORIG <or> ANSWER'
  420.         DB    CR,LF,'SET DIAL PULSE <or> TONE'
  421.     ENDIF
  422. ;
  423.         DB    CR,LF,'SET ?  (show current settings)'
  424.         DB    CR,LF,CR,LF,'$'
  425. ;
  426. ;    SET BAUD command: reset the baudrate generator
  427. ;
  428. STBAUD:        MVI    C,SBLANK    ;check for baudrate
  429.         CALL    MEX        ;
  430.         JC    SETERR        ;if none, print error message
  431.         LXI    D,BDTBL        ;check for acceptable rate
  432.         CALL    TSRCH        ;
  433.         JC    SETERR        ;if no match, print error
  434.         MOV    A,L        ;get file speed parameter
  435.         CALL    PBAUD        ;set the baudrate
  436.         CALL    SHBAUD        ;show the baud rate
  437.         JMP    CRLF
  438. SHBAUD:        CALL    ILPRT        ;display current baudrate
  439.         DB    'Baud rate:',TAB,' ',0
  440.         LDA    MSPEED
  441.         MVI    C,PRBAUD
  442.         JMP    MEX
  443. ;
  444. ;    Set the baud rate from the MSPEED code in reg. A
  445. ;    CY set if the specified rate is unsupported
  446. ;
  447. PBAUD:        PUSH    H        ;save all the registers
  448.         PUSH    D        ;
  449.         PUSH    B        ;
  450.         RLC            ;mult. MSPEED * 2 for Epson index
  451.         MOV    E,A        ;put MSPEED in DE
  452.         MVI    D,0        ;
  453.         LXI    H,BDTBL2    ;offset into the table
  454.         DAD    D        ;
  455.         MOV    A,M        ;get the baud-generator code
  456.         ORA    A        ;zero code is unsupported
  457.         STC            ;set carry in case it's unsupported
  458.         JZ    PBAUD1        ;if unsupported, then exit
  459.         PUSH    PSW        ;code is okay, set it!
  460.         MOV    A,M        ;get low byte
  461.         OUT    06H        ;send it
  462.         INX    H        ;increment index pointer
  463.         MOV    A,M        ;get high byte
  464.         OUT    06H        ;send it
  465.         POP    PSW        ;
  466.         MOV    A,E        ;get MSPEED code back
  467.         RRC            ;restore correct MSPEED value
  468.         STA    MSPEED        ;save it
  469.         ORA    A        ;return, no errors
  470. PBAUD1:        POP    B        ;
  471.         POP    D        ;
  472.         POP    H        ;
  473.         RET            ;
  474. ;
  475. ;    SET ? command: show all current settings
  476. ;
  477. STSHOW:        CALL    CRLF        ;
  478.         LXI    H,SHOTBL    ;get table of SHOW routines
  479. STSHW1:        MOV    E,M        ;get address of a routine
  480.         INX    H        ;
  481.         MOV    D,M        ;
  482.         INX    H        ;
  483.         MOV    A,D         ;
  484.         ORA    E        ;end of table?
  485.         RZ            ;if yes, we're done
  486.         PUSH    H        ;save the table pointer
  487.         XCHG            ;put address in HL
  488.         CALL    GOHL        ;go do it!
  489.         CALL    CRLF        ;print newline
  490.         MVI    C,CHEKCC    ;console abort?
  491.         CALL    MEX        ;
  492.         POP    H        ;
  493.         JNZ    STSHW1        ;if no abort then continue
  494.         RET            ;
  495. ;
  496. GOHL:        PCHL            ;
  497. ;
  498. ;    SET PARITY command: reset transmit/receive parity
  499. ;
  500. ;        Parity is controlled by bits 0 and 1 of
  501. ;        the byte sent to the SIO write-register
  502. ;        4 as follows:
  503. ;
  504. ;           Parity    Bit 1       Bit 0
  505. ;                 Off          -          0
  506. ;              Odd      0         1
  507. ;             Even      1         1
  508. ;
  509. STPRTY:        MVI    C,SBLANK    ;check for parity code
  510.         CALL    MEX        ;
  511.         JC    SETERR        ;if none, print error
  512.         LXI    D,PARTBL    ;check for proper syntax
  513.         CALL    TSRCH        ;
  514.         PUSH    H        ;match found, go do it!
  515.         RNC            ;
  516.         POP    H        ;no match: fix stack and
  517.         JMP    SETERR        ;  print error
  518. ;
  519. PROFF:        LDA    REG4        ;get register 4 byte
  520.         ANI    0FEH        ;reset bit 0
  521.         JMP    PARTB1        ;
  522. PREVEN:        LDA    REG4        ;
  523.         ORI    003H        ;set bits 0 & 1
  524.         JMP    PARTB1        ;
  525. PRODD:        LDA    REG4        ;
  526.         ORI    001H        ;set bit 0
  527.         ANI    0FDH        ;reset bit 1
  528. PARTB1:        STA    REG4        ;
  529.         CALL    NITSIO        ;re-initialize the USART
  530.         CALL    SHPRTY        ;print the result
  531.         JMP    CRLF        ;
  532. SHPRTY:        CALL    ILPRT        ;display parity
  533.         DB    'Parity:  ',TAB,' ',0
  534.         LDA    REG4        ;
  535.         ANI    001H        ;test bit 0
  536.         CPI    0        ;if bit0=0 then parity off
  537.         JNZ    SHPRT1        ;
  538.         CALL    ILPRT        ;
  539.         DB    'Off',0        ;
  540.         RET
  541. SHPRT1:        LDA    REG4        ;
  542.         ANI    002H        ;test bit 1
  543.         CPI    0        ;if bit1=0 then parity odd
  544.         JNZ    SHPRT2        ;
  545.         CALL    ILPRT        ;
  546.         DB    'Odd',0        ;
  547.         RET            ;
  548. SHPRT2:        CALL    ILPRT        ;
  549.         DB    'Even',0    ;
  550.         RET
  551. ;
  552. ;    SET STOPBITS command: reset number of stop bits
  553. ;
  554. ;        The number of stop bits is controlled by bits
  555. ;        2 and 3 of the byte sent to the SIO write-
  556. ;        register 4, as follows:
  557. ;
  558. ;            Stop bits       Bit 3    Bit 2
  559. ;            1         0            1
  560. ;               1.5         1          0
  561. ;            2         1          1
  562. ;
  563. ;
  564. STSTOP:        MVI    C,SBLANK    ;check for stop bits
  565.         CALL    MEX        ;
  566.         JC    SETERR        ;if none, print error
  567.         LXI    D,STPTBL    ;check for proper syntax
  568.         CALL    TSRCH        ;
  569.         PUSH    H        ;match found, go do it!
  570.         RNC            ;
  571.         POP    H        ;no match: fix stack and
  572.         JMP    SETERR        ;  print error
  573. ;
  574. STOP01:        LDA    REG4        ;get register 4 byte
  575.         ANI    0F7H        ;reset bit 3
  576.         ORI    004H        ;set bit 2
  577.         JMP    STSTP1        ;
  578. STOP02:        LDA    REG4        ;
  579.         ORI    00CH        ;set bits 2 and 3
  580.         JMP    STSTP1        ;
  581. STOP15:        LDA    REG4        ;
  582.         ORI    008H        ;set bit 3
  583.         ANI    0F8H        ;reset bit 2
  584. STSTP1:        STA    REG4        ;
  585.         CALL    NITSIO        ;
  586.         CALL    SHSTOP        ;print the result
  587.         JMP    CRLF        ;
  588. SHSTOP:        CALL    ILPRT        ;display stop-bits
  589.         DB    'Stop bits:',TAB,' ',0
  590.         LDA    REG4        ;
  591.         ANI    004H        ;test bit 2
  592.         CPI    0        ;if bit2=0 then 1.5
  593.         JNZ    SHSTP1        ;
  594.         CALL    ILPRT        ;
  595.         DB    '1.5',0        ;
  596.         RET
  597. SHSTP1:        LDA    REG4        ;
  598.         ANI    008H        ;test bit 3
  599.         CPI    0        ;if bit3=0 then 1
  600.         JNZ    SHSTP2        ;
  601.         CALL    ILPRT        ;
  602.         DB    '1',0        ;
  603.         RET
  604. SHSTP2:        CALL    ILPRT        ;
  605.         DB    '2',0        ;
  606.         RET
  607. ;
  608. ;    SET LENGTH command: set bits per character
  609. ;
  610. ;        The number of bits per character is controlled for
  611. ;        the receiver circuit by bits 6 and 7 of the byte
  612. ;        sent to the SIO write-register 3 and for the trans-
  613. ;        mitter circuit by bits 5 and 6 of the byte sent to
  614. ;        the SIO write-register 5.  The assumption has been
  615. ;        made here that both transmission and reception will
  616. ;        be carried on at the same number of bits per charac-
  617. ;        ter.  The bit configurations are shown for register
  618. ;        3 only, but are the same for register 5:
  619. ;
  620. ;            BPC        Bit 7        Bit 6
  621. ;             5          0          0
  622. ;             6          1             0
  623. ;             7          0          1
  624. ;             8          1          1
  625. ;
  626. STBITS:        MVI    C,SBLANK    ;check for bits/char
  627.         CALL    MEX        ;
  628.         JC    SETERR        ;if none, print error
  629.         LXI    D,BITTBL    ;check for proper syntax
  630.         CALL    TSRCH        ;
  631.         PUSH    H        ;match found, go do it!
  632.         RNC            ;
  633.         POP    H        ;no match: fix stack and
  634.         JMP    SETERR        ;  print error
  635. ;
  636. BIT5:        LDA    REG3        ;
  637.         ANI    0BFH        ;reset bit 6
  638.         ANI    07FH        ;reset bit 7
  639.         STA    REG3        ;
  640.         LDA    REG5        ;
  641.         ANI    0DFH        ;reset bit 5
  642.         ANI    0BFH        ;reset bit 6
  643.         JMP    STBTS1        ;
  644. BIT6:        LDA    REG3        ;
  645.         ANI    0BFH        ;reset bit 6
  646.         ORI    080H        ;set bit 7
  647.         STA    REG3        ;
  648.         LDA    REG5        ;
  649.         ANI    0DFH        ;reset bit 5
  650.         ORI    040H        ;set bit 6
  651.         JMP    STBTS1        ;
  652. BIT7:        LDA    REG3        ;
  653.         ORI    040H        ;set bit 6
  654.         ANI    07FH        ;reset bit 7
  655.         STA    REG3        ;
  656.         LDA    REG5        ;
  657.         ORI    020H        ;set bit 5
  658.         ANI    0BFH        ;reset bit 6
  659.         JMP    STBTS1        ;
  660. BIT8:        LDA    REG3        ;
  661.         ORI    040H        ;set bit 6
  662.         ORI    080H        ;set bit 7
  663.         STA    REG3        ;
  664.         LDA    REG5        ;
  665.         ORI    020H        ;set bit 5
  666.         ORI    040H        ;set bit 6
  667. STBTS1:        STA    REG5        ;
  668.         CALL    NITSIO        ;
  669.         CALL    SHBITS        ;print the result
  670.         JMP    CRLF
  671. SHBITS:        CALL    ILPRT        ;display bits/char
  672.         DB    'Bits/char:',TAB,' ',0
  673.         LDA    REG5        ;
  674.         ANI    040H        ;test bit 6
  675.         CPI    0        ;if bit6=0 then 6 bpc
  676.         JNZ    SHBTS2        ;
  677.         LDA    REG5        ;
  678.         ANI    020H        ;test bit 5
  679.         CPI    0        ;if bit5=0 then 5 bpc
  680.         JNZ    SHBTS1        ;
  681.         CALL    ILPRT        ;
  682.         DB    '5',0        ;
  683.         RET            ;
  684. SHBTS1:        CALL    ILPRT        ;
  685.         DB    '7',0        ;
  686.         RET            ;
  687. SHBTS2:        LDA    REG5        ;
  688.         ANI    020H        ;test bit 5
  689.         CPI    0        ;if bit5=0 then 6 bpc
  690.         JNZ    SHBTS3        ;
  691.         CALL    ILPRT        ;
  692.         DB    '6',0        ;
  693.         RET            ;
  694. SHBTS3:        CALL    ILPRT        ;
  695.         DB    '8',0        ;
  696.         RET
  697. ;
  698.     IF SMODEM
  699. ;
  700. ;    SET MONITOR command: turn Hayes speaker on and off
  701. ;                 to monitor dialing
  702. ;
  703. STSPKR:        MVI    C,SBLANK    ;
  704.         CALL    MEX        ;
  705.         JC    SETERR        ;
  706.         LXI    D,MONTBL    ;
  707.         CALL    TSRCH        ;
  708.         JC    SETERR        ;
  709.         MOV    A,L        ;
  710.         ADI    '0'        ;
  711.         STA    MONMSG+3    ;
  712. STSPK1:        LXI    H,MONMSG    ;
  713.         CALL    MDMSET        ;
  714. SHSPKR:        CALL    ILPRT        ;
  715.         DB    'Modem monitor:',TAB,' ',0
  716.         LDA    MONMSG+3    ;
  717.         CPI    0+'0'        ;if monflg=0 then speaker is off
  718.         JNZ    SHSPK1        ;
  719.         CALL    ILPRT        ;
  720.         DB    'Off',0        ;
  721.         RET            ;
  722. SHSPK1:        CALL    ILPRT        ;
  723.         DB    'On',0        ;
  724.         RET            ;
  725. ;
  726. ;    SET DELAY command: set wait-time for 'no answer'
  727. ;
  728. STDLY:        MVI    C,SBLANK    ;check for delay parameter
  729.         CALL    MEX        ;
  730.         JC    SETERR        ;
  731.         LXI    D,DLYTBL    ;
  732.         CALL    TSRCH        ;
  733.         PUSH    H        ;
  734.         RNC            ;
  735.         POP    H        ;
  736.         JMP    SETERR        ;
  737. STDL15:        LXI    H,DL15MS    ;delay 15 seconds
  738.         CALL    MDMSET        ;
  739.         MVI    A,15        ;
  740.         STA    NDELAY        ;
  741.         JMP    SHDLY        ;
  742. STDL30:        LXI    H,DL30MS    ;
  743.         CALL    MDMSET        ;
  744.         MVI    A,30        ;
  745.         STA    NDELAY        ;
  746.         JMP    SHDLY        ;
  747. STDL45:        LXI    H,DL45MS    ;
  748.         CALL    MDMSET        ;
  749.         MVI    A,45        ;
  750.         STA    NDELAY        ;
  751.         JMP    SHDLY        ;
  752. STDL60:        LXI    H,DL60MS    ;
  753.         CALL    MDMSET        ;
  754.         MVI    A,60        ;
  755.         STA    NDELAY        ;
  756. SHDLY:        CALL    ILPRT        ;
  757.         DB    'Modem delay:',TAB,' ',0
  758.         LDA    NDELAY        ;
  759.         CPI    15        ;
  760.         JNZ    SHDLY1        ;
  761.         CALL    ILPRT        ;
  762.         DB    '15 seconds',0
  763.         RET
  764. SHDLY1:        CPI    30        ;
  765.         JNZ    SHDLY2        ;
  766.         CALL    ILPRT        ;
  767.         DB    '30 seconds',0
  768.         RET
  769. SHDLY2:        CPI    45        ;
  770.         JNZ    SHDLY3        ;
  771.         CALL    ILPRT        ;
  772.         DB    '45 seconds',0
  773.         RET
  774. SHDLY3:        CALL    ILPRT        ;
  775.         DB    '60 seconds',0
  776.         RET            ;
  777. ;
  778. ;    SET MODE command (answer or originate)
  779. ;
  780. STMODE:        MVI    C,SBLANK    ;
  781.         CALL    MEX        ;
  782.         JC    SETERR        ;
  783.         LXI    D,MODTBL    ;
  784.         CALL    TSRCH        ;
  785.         JC    SETERR        ;
  786.         MOV    A,L        ;
  787.         ADI    '0'        ;
  788.         STA    MODMSG+5    ;
  789. STMOD1:        LXI    H,MODMSG    ;
  790.         CALL    MDMSET        ;
  791. SHMODE:        CALL    ILPRT        ;
  792.         DB    'Mode:   ',TAB,' ',0
  793.         LDA    MODMSG+5    ;
  794.         CPI    0+'0'        ;if zero, then originate mode
  795.         JNZ    SHMOD1        ;
  796.         CALL    ILPRT        ;
  797.         DB    'Originate',0    ;
  798.         RET            ;
  799. SHMOD1:        CALL    ILPRT        ;
  800.         DB    'Answer',0    ;
  801.         RET            ;
  802. ;
  803. ;    SET DIAL command (touch or pulse)
  804. SETDIA:        MVI    C,SBLANK    ;
  805.         CALL    MEX        ;
  806.         JC    SETERR        ;
  807.         LXI    D,DIALTB    ;
  808.         CALL    TSRCH        ;
  809.         JC    SETERR        ;
  810.         MOV    A,L        ;
  811.         STA    TPULSE        ;
  812. SHDIAL:        CALL    ILPRT        ;
  813.         DB    'Phone type:',TAB,' ',0
  814.         LDA    TPULSE        ;
  815.         CPI    'T'        ;
  816.         JNZ    SHDIL1        ;
  817.         CALL    ILPRT        ;
  818.         DB    'Touchtone',0
  819.         RET            ;
  820. SHDIL1:        CALL    ILPRT        ;
  821.         DB    'Pulse-dial',0    ;
  822.         RET            ;
  823.     ENDIF
  824. ;
  825. ; Newline on console
  826. ;
  827. CRLF:        MVI    A,CR
  828.         CALL    TYPE
  829.         MVI    A,LF        ;fall into TYPE
  830. ;
  831. ; type char in A on console
  832. ;
  833. TYPE:        PUSH    H        ;save 'em
  834.         PUSH    D
  835.         PUSH    B
  836.         MOV    E,A        ;align output character
  837.         MVI    C,CONOUT    ;print via MEX
  838.         CALL    MEX
  839.         POP    B
  840.         POP    D
  841.         POP    H
  842.         RET
  843. ;
  844. ; Compare next input-stream item in table @DE; CY=1
  845. ; if not found, else HL=matched data item
  846. ;
  847. TSRCH:        MVI    C,LOOKUP    ;get function code
  848.         JMP    MEX        ;pass to MEX processor
  849. ;
  850. ; Print in-line message ... blows away C register
  851. ;
  852. ILPRT:        MVI    C,ILP        ;get function code
  853.         JMP    MEX        ;go do it
  854. ;
  855.     IF SMODEM
  856. ;
  857. ;    Hayes Smartmodem 1200 dialling routines
  858. ;
  859. DIAL:        LHLD    DIALPT        ;Fetch pointer
  860.         CPI    254        ;Start dial?
  861.         JZ    STDIAL        ;jump if so
  862.         CPI    255        ;end dial?
  863.         JZ    ENDIAL        ;jump if so
  864. ;
  865. ; Not start or end sequence, must be a digit to be sent to the modem
  866. ;
  867.         MOV    M,A        ;put char in buffer
  868.         INX    H        ;advance pointer
  869.         SHLD    DIALPT        ;stuff pntr
  870.         RET            ;all done
  871. ;
  872. ; Here on a start-dial sequence
  873. ;
  874. STDIAL:        LXI    H,DIALBF    ;set up buffer pointer
  875.         SHLD    DIALPT
  876.         RET
  877. ;
  878. ; Here on an end-dial sequence
  879. ;
  880. ENDIAL:        MVI    M,CR        ;stuff end-of-line into buffer
  881.         INX    H        ;followed by terminator
  882.         MVI    M,0
  883.         LDA    TPULSE        ;get overlay's touch-tone flag
  884.         STA    SMDIAL+3    ;put into string
  885.         LXI    H,SMDIAL    ;point to dialing string
  886.         CALL    SMSEND        ;send it
  887. WAITSM:        MVI    C,INMDM
  888.         CALL    MEX        ;catch any output from the modem
  889.         JNC    WAITSM        ;loop until no more characters
  890. ;
  891. ; The following loop waits for a result from the modem (up to
  892. ; 60 seconds: you may change this value in the following line)
  893. ;
  894. RESULT:        MVI    C,60        ;<<== maximum time to wait for result
  895. SMWLP:        PUSH    B
  896.         MVI    B,1        ;check for a char, up to 1 sec wait
  897.         MVI    C,TMDINP    ;do timed input
  898.         CALL    MEX
  899.         POP    B
  900.         JNC    SMTEST        ;jump if modem had a char
  901.         PUSH    B        ;no, test for control-c from console
  902.         MVI    C,CHEKCC
  903.         CALL    MEX
  904.         POP    B
  905.         JNZ    SMNEXT        ;if not, jump
  906.         MVI    B,CR        ;yes, shut down the modem
  907.         MVI    C,SNDCHR
  908.         CALL    MEX
  909.         MVI    A,3        ;return abort code
  910.         RET
  911. SMNEXT:        DCR    C        ;no
  912.         JNZ    SMWLP        ;continue
  913. ;
  914. ; One minute with no modem response (or no connection)
  915. ;
  916. SMTIMO:        MVI    A,2        ;return timeout code
  917.         RET
  918. ;
  919. ; Modem gave us a result, check it
  920. ;
  921. SMTEST:        ANI    7FH        ;ignore any parity
  922.         CALL    SMANAL        ;test the result
  923.         JC    RESULT        ;go try again if unknown response
  924.         MOV    A,B        ;a=result 
  925.         PUSH    PSW        ;save it
  926. SMTLP:        MVI    C,INMDM        ;eat any additional chars from smartmodem
  927.         CALL    MEX
  928.         JNC    SMTLP        ;until 100ms of quiet time
  929.         POP    PSW        ;return the code
  930.         RET
  931. ;
  932. SMANAL:        MVI    B,0        ;prep connect code
  933.         CPI    'C'        ;"connect"?
  934.         RZ
  935.         CPI    '1'        ;numeric version of "connect"
  936.         RZ
  937.         CPI    '5'        ;or "connect 1200"
  938.         RZ
  939.         INR    B        ;prep busy code B=1
  940.         CPI    'B'
  941.         RZ
  942.         INR    B        ;prep no connect msg B=2
  943.         CPI    'N'        ;n=no connect
  944.         RZ
  945.         CPI    '3'        ;numeric version of "no connect"
  946.         RZ
  947.         MVI    B,4        ;prep modem error
  948.         CPI    'E'        ;e=error
  949.         RZ
  950.         CPI    '4'        ;numeric version of "error"
  951.         RZ
  952. ;
  953. ; Unknown response, return carry to caller. But first,
  954. ; flush the unknown response line from the modem.
  955. ;
  956. WTLF:        CPI    LF        ;linefeed?
  957.         STC
  958.         RZ            ;end if so
  959.         MVI    C,INMDM        ;no. get next char
  960.         CALL    MEX
  961.         JNC    WTLF        ;unless busy, loop
  962.         RET
  963. ;
  964. ; Following routine disconnects the modem using smartmodem
  965. ; codes. All registers are available for this function.
  966. ; Nothing returned to caller.
  967. ;
  968. ;
  969. DISCON:        MVI    B,20
  970.         MVI    C,TIMER        ;wait 2 seconds
  971.         CALL    MEX
  972.         LXI    H,SMATN        ;send '+++'
  973.         CALL    SMSEND
  974.         MVI    B,20        ;wait 2 more seconds
  975.         MVI    C,TIMER
  976.         CALL    MEX
  977.         LXI    H,SMDISC    ;send 'ATH'
  978.         CALL    SMSEND
  979.         MVI    B,1        ;wait 1 second
  980.         MVI    C,TIMER
  981.         CALL    MEX
  982.         RET
  983. ;
  984. ; Smartmodem utility routine: send string to modem
  985. ;
  986. SMSEND:        MVI    C,SNDRDY    ;wait for modem ready
  987.         CALL    MEX
  988.         JNZ    SMSEND
  989.         MOV    A,M        ;fetch next character
  990.         INX    H
  991.         ORA    A        ;end?
  992.         RZ            ;done if so
  993.         MOV    B,A        ;no, position for sending
  994.         MVI    C,SNDCHR    ;nope, send the character
  995.         CALL    MEX
  996.         JMP    SMSEND
  997. ;
  998.     ENDIF
  999. ;
  1000. ;    Data area
  1001. ;
  1002. EOSMSG:        DB    01BH,059H,0,0,0,'$'    ;clear to end-of-screen
  1003. CLSMSG:        DB    01AH,0,0,0,0,'$'    ;CLS, Home Cursor
  1004. ;
  1005. ; Default UART parameters in the following table
  1006. ;
  1007. REG0:        DB    00011000B    ;Reset channel A
  1008. REG3:        DB    11000001B    ;Enable receive at 8 bits/char
  1009. REG4:        DB    01000100B    ;No parity, 1 stop bit, clock X16
  1010. REG5:        DB    11101010B    ;Enable transmit at 8 bits/char
  1011. ;
  1012. SETEMS:        DB    CR,LF,'SET command error',BELL,CR,LF,CR,LF,'$'
  1013. ;
  1014.     IF SMODEM
  1015. MONMSG:        DB    'ATM1',CR,0
  1016. NDELAY:        DB    30        ;delay-time in seconds
  1017. DL15MS:        DB    'ATS7=15',CR,0
  1018. DL30MS:        DB    'ATS7=30',CR,0
  1019. DL45MS:        DB    'ATS7=45',CR,0
  1020. DL60MS:        DB    'ATS7=60',CR,0
  1021. MODMSG:        DB    'ATS0=0',CR,0
  1022. SMATN:        DB    '+++',0
  1023. SMDISC:        DB    'ATH',CR,0
  1024. SMDIAL:        DB    'ATDT '
  1025. DIALBF:        DS    52        ;2* 24 char max, + CR + NULL + slop
  1026. DIALPT:        DS    2        ;dial position pointer
  1027.      ENDIF
  1028. ;
  1029. ;
  1030. ;
  1031. ;    SET command -- master command table
  1032. ;
  1033. CMDTBL:        DB    '?'+80H        ;"set ?"
  1034.         DW    STSHOW        ;
  1035.         DB    'BAU','D'+80H    ;"set baud"
  1036.         DW    STBAUD        ;
  1037.         DB    'PARIT','Y'+80H    ;"set parity"
  1038.         DW    STPRTY        ;
  1039.         DB    'STOPBIT','S'+80H    ;"set stopbits"
  1040.         DW    STSTOP        ;
  1041.         DB    'LENGT','H'+80H    ;"set length"
  1042.         DW    STBITS        ;
  1043. ;
  1044.     IF SMODEM
  1045.         DB    'MONITO','R'+80H;"set monitor"
  1046.         DW    STSPKR
  1047.         DB    'DELA','Y'+80H    ;"set delay"
  1048.         DW    STDLY
  1049.         DB    'MOD','E'+80H    ;"set mode"
  1050.         DW    STMODE
  1051.         DB    'DIA','L'+80H    ;"set dial"
  1052.         DW    SETDIA
  1053.     ENDIF
  1054. ;
  1055.         DB    0        ;<<== end of CMDTBL
  1056. ;
  1057. ;    SET BAUD command table
  1058. ;
  1059. BDTBL:        DB    '11','0'+80H    ;"set baud 110"
  1060.         DW    0000H        ;
  1061.         DB    '30','0'+80H    ;"set baud 300"
  1062.         DW    0001H        ;
  1063.         DB    '60','0'+80H    ;"set baud 600"
  1064.         DW    0003H        ;
  1065.         DB    '120','0'+80H    ;"set baud 1200"
  1066.         DW    0005H        ;
  1067.         DB    '240','0'+80H    ;"set baud 2400"
  1068.         DW    0006H        ;
  1069.         DB    '480','0'+80H    ;"set baud 4800"
  1070.         DW    0007H        ;
  1071.         DB    '960','0'+80H    ;"set baud 9600"
  1072.         DW    0008H        ;
  1073.         DB    0        ;<<== end of baudrate table
  1074. ;
  1075. ;    PBAUD baudrate generator lookup table
  1076. ;
  1077. BDTBL2:        DW    0240H        ;110 baud
  1078.         DW    01A0H        ;300 baud
  1079.         DW    0000H        ;450 baud (not supported)
  1080.         DW    00D0H        ;600 baud
  1081.         DW    0000H        ;710 baud (not supported)
  1082.         DW    0068H        ;1200 baud
  1083.         DW    0034H        ;2400 baud
  1084.         DW    001AH        ;4800 baud
  1085.         DW    000DH        ;9600 baud
  1086.         DW    0000H        ;19200 baud (not supported)
  1087. ;
  1088. ;    Table of SHOW subroutine addresses
  1089. ;
  1090. SHOTBL:        DW    SHBAUD        ;show baud rate
  1091.         DW    SHPRTY        ;show parity setting
  1092.         DW    SHSTOP        ;show no. of stop bits
  1093.         DW    SHBITS        ;show bits/character
  1094. ;
  1095.     IF SMODEM
  1096.         DW    SHSPKR        ;show modem speaker status
  1097.         DW    SHDLY        ;show hangup delay
  1098.         DW    SHMODE        ;show answer or originate
  1099.         DW    SHDIAL        ;show pulse or tone
  1100.     ENDIF
  1101. ;
  1102.         DW    0        ;<<== end of show address list
  1103. ;
  1104. ;    SET PARITY command table
  1105. ;
  1106. PARTBL:        DB    'OF','F'+80H    ;"set parity off"
  1107.         DW    PROFF
  1108.         DB    'EVE','N'+80H    ;"set parity even"
  1109.         DW    PREVEN
  1110.         DB    'OD','D'+80H    ;"set parity odd"
  1111.         DW    PRODD
  1112.         DB    0        ;<<== end of parity table
  1113. ;
  1114. ;    SET STOPBITS command table
  1115. ;
  1116. STPTBL:        DB    '1'+80H        ;"set stop 1"
  1117.         DW    STOP01
  1118.         DB    '2'+80H        ;"set stop 2"
  1119.         DW    STOP02
  1120.         DB    '1.','5'+80H    ;"set stop 1.5"
  1121.         DW    STOP15
  1122.         DB    0        ;<<== End of stop-bits table
  1123. ;
  1124. ;    SET LENGTH command table
  1125. ;
  1126. BITTBL:        DB    '5'+80H        ;"set bits 5"
  1127.         DW    BIT5
  1128.         DB    '6'+80H        ;"set bits 6"
  1129.         DW    BIT6
  1130.         DB    '7'+80H        ;"set bits 7"
  1131.         DW    BIT7
  1132.         DB    '8'+80H        ;"set bits 8"
  1133.         DW    BIT8
  1134.         DB    0        ;<<== end of bpc table
  1135. ;
  1136.     IF SMODEM
  1137. ;
  1138. ;    SET MONITOR command table
  1139. ;
  1140. MONTBL:        DB    'O','N'+80H    ;"set monitor on"
  1141.         DW    0001H
  1142.         DB    'OF','F'+80H    ;"set monitor off"
  1143.         DW    0000H
  1144.         DB    0        ;<<== end of monitor table
  1145. ;
  1146. ;    SET DELAY command table
  1147. ;
  1148. DLYTBL:        DB    '1','5'+80H    ;"set delay 15"
  1149.         DW    STDL15
  1150.         DB    '3','0'+80H    ;"set delay 30"
  1151.         DW    STDL30
  1152.         DB    '4','5'+80H    ;"set delay 45"
  1153.         DW    STDL45
  1154.         DB    '6','0'+80H    ;"set delay 60"
  1155.         DW    STDL60
  1156.         DB    0        ;<<== end of delay table
  1157. ;
  1158. ;    SET MODE command table
  1159. ;
  1160. MODTBL:        DB    'ORI','G'+80H    ;"set mode orig"
  1161.         DW    0000H
  1162.         DB    'ANSWE','R'+80H    ;"set mode answer"
  1163.         DW    0001H
  1164.         DB    0        ;<<== end of mode table
  1165. ;
  1166. ;    SET DIAL command table
  1167. ;
  1168. DIALTB:        DB    'TON','E'+80H    ;"set dial tone"
  1169.         DW    0054H
  1170.         DB    'PULS','E'+80H    ;"set dial pulse"
  1171.         DW    0050H
  1172.         DB    0        ;<<== end of dial table
  1173.     ENDIF
  1174. ;
  1175.     END
  1176.  
  1177.  
  1178.  
  1179.