home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / mex / mxo-on2.lbr / MXO-ON2.ZZ0 / MXO-ON2.Z80
Text File  |  1987-11-25  |  33KB  |  1,323 lines

  1. ;     Title  'MEX Overlay for ON! computer Version SM 2.0'
  2. ;
  3. REV    EQU    20        ; Overlay revision level
  4. ;
  5. ;
  6. ;  MEX Overlay for ON! Computers, external smartmodems,
  7. ;  either Anchor or Hayes-compatible.
  8. ;
  9. ;  A full-featured SET command processor is implemented.
  10. ;  The following table outlines the SET command options:
  11. ;
  12. ;
  13. ;    SET Command
  14. ;
  15. ;    ANCHOR                Sets modem to respond to
  16. ;                    Anchor modem commands; although
  17. ;                    Anchor modems are considered Hayes
  18. ;                    compatible, there ARE a few
  19. ;                    differences which require special
  20. ;                    processing considerations.
  21. ;
  22. ;    DELAY <N>            Number of seconds to wait before
  23. ;                    aborting a call in progress
  24. ;
  25. ;    BAUD <RATE>            Set modem to Baud rate specified.
  26. ;                    Baud rates supported are 300,
  27. ;                    1200, 2400, 4800, 9600, and 19200
  28. ;
  29. ;    ORIG                Set modem to Originate mode
  30. ;    ANSWER                Set modem to Auto-answer mode
  31. ;    TONE                Set modem to Tone dialing
  32. ;    PULSE                Set modem to Pulse dialing
  33. ;    MONITOR             Turn Hayes monitor ON
  34. ;    QUIET                Turn Hayes monitor OFF
  35. ;    PARITY                Set Parity to Odd, Even, or Off
  36. ;    STOPBITS            Set number of Stop Bits to 1, 1.5, 2
  37. ;    LENGTH                Set word length to 5, 6, 7, 8
  38. ;
  39. ;    MANUAL ORIG <or> ANSWER     Place modem in active state and
  40. ;                    generate Answer or Originate
  41. ;                    carrier tone
  42. ;
  43. ;
  44. ;  This overlay includes the smartmodem dialing routine from
  45. ;  MXO-SM13.ASM by Ron Fowler which has been slightly modified
  46. ;  to allow programmable delay for answer.  (Note that this is
  47. ;  different from the "ATS7=nn".).
  48. ;
  49. ;  This overlay is intended to be fully compatible with the
  50. ;  MEX structure and should be readily upward compatible with
  51. ;  the predicted MEX 2.0.
  52. ;
  53. ;  Calling conventions for the various overlay entry points
  54. ;  are detailed more fully in the PMMI overlay (MXO-PMxx.ASM,
  55. ;  where xx=revision number).
  56. ;
  57. ;  History:
  58. ;  November 24, 1987    MXO-ON2.Z80    (release version)
  59. ;
  60. ;        Fixed buglet in PBAUD - Bruce Morgen
  61. ;
  62. ;  October 8, 1987    MXO-ON2.Z80    (not released)
  63. ;
  64. ;        SET ANSWER now sets the NDELAY variable to 12 via the
  65. ;        SET DELAY code and waits for a connect indication from
  66. ;        the modem before proceeding.  A control-C abort results
  67. ;        in a DISCON call, the restoration of the original SET
  68. ;        DELAY condition, and a SET ORIGINATE sequence.
  69. ;
  70. ;                        Bruce Morgen
  71. ;
  72. ;  July 20, 1987
  73. ;        Adapted for ON! computer as MXO-ON1.Z80 - Bruce Morgen
  74. ;
  75. ;  12/20/84 4.0  Fixed bugs in send break and initialization routines.
  76. ;                           -- Kim Levitt
  77. ;
  78. ;  11/25/84 3.0  Added SILENT option to quiet that damn beep-beep-
  79. ;         beep while dialing out. Speaker will come on at
  80. ;         end of dialing.
  81. ;                           -- Kim Levitt
  82. ;
  83. ;  9/19/84  2.0  Fixed bug in DISCON routine that left DTR/RTS off,
  84. ;         added "soft" abort (any key except ^C) to abort a
  85. ;         CALL in progress, but not repeats or next CALL cmds.
  86. ;                           -- Kim Levitt
  87. ;
  88. ;  9/9/84   1.0  The universal Kaypro overlay distributed previously
  89. ;         combined support for both the internal modem on the 4'84
  90. ;         and external smartmodems.  This overlay supports external
  91. ;         smartmodems only, and thus provides more flexibility for
  92. ;         expansion and adaptability to new MEX releases.  The only
  93. ;         additional feature of this overlay is support for
  94. ;         entering Terminal mode via generation of manual Originate
  95. ;         or Answer carrier tones.  Clarity of documentation for
  96. ;         the SET command has also been improved.
  97. ;                        Terry Carroll
  98. ;
  99. ;
  100. ;  Credits:
  101. ;
  102. ;  M7KP-1 overlay structure by Irv Hoff
  103. ;  Smartmodem dialing routine by Ron Fowler
  104. ;  Parity, Length and Stopbits routines by Norm Saunders
  105. ;  MXO-KP overlay structure by John Smith
  106. ;  Art work by Terry Carroll
  107. ;  Bug fix/feature added by Kim Levitt
  108. ;  Based on an idea by an inspired hacker
  109. ;  Music by John Williams
  110. ;  Directed by Stanley Kubrick
  111. ;
  112. ;------------------------------------------------------------
  113. ;
  114. ; Miscellaneous equates
  115. ;
  116. NO    EQU    0
  117. YES    EQU    0FFH
  118. ;
  119. TPA    EQU    100H
  120. ;
  121. CR    EQU    13
  122. LF    EQU    10
  123. TAB    EQU    9
  124. ;
  125. ; Silent dial option:
  126. ;
  127. SILENT    EQU    YES        ; If yes, speaker is silenced during dial
  128. ;
  129. ; (NOTE: This may not work on all "smart" modems, it works on the
  130. ;  Hayes.. Set it to NO if it doesn't dial out ok...)
  131. ;
  132. ; ON! port definitions
  133. ;
  134. EXPORT    EQU    92H        ; Base external port
  135. EXTCT1    EQU    EXPORT+1    ; External modem status port
  136. EXTDAT    EQU    EXPORT        ; External modem data port
  137. ;
  138. ; ON! bit definitions
  139. ;
  140. MDRCVB    EQU    01H        ; Modem receive bit (dav)
  141. MDRCVR    EQU    01H        ; Modem receive ready
  142. MDSNDB    EQU    04H        ; Modem send bit
  143. MDSNDR    EQU    04H        ; Modem send ready bit
  144. ;
  145. ; ON! baud rates.  Low order byte is baud rate generator divisor,
  146. ;  High order byte is the Dart divisor (WR4, 1 stop bit).
  147. ;
  148. BD300    EQU    0C400H        ; /64, /32
  149. BD1200    EQU    04400H        ; /16, /32
  150. BD2400    EQU    08410H        ; /32, /8
  151. BD4800    EQU    04410H        ; /16, /8
  152. BD9600    EQU    0C420H        ; /64, /1
  153. BD19200    EQU    08420H        ; /32, /1
  154. ;
  155.  
  156. ; MEX Service Processor
  157. ;
  158. MEX    EQU    0D00H        ; Address of the service processor
  159. INMDM    EQU    255        ; Get char from port to a, cy=no more in 100 ms
  160. TIMER    EQU    254        ; Delay 100ms * reg b
  161. TMDINP    EQU    253        ; B=# secs to wait for char, cy=no char
  162. CHEKCC    EQU    252        ; Check for ^C from kbd, Z=present
  163. SNDRDY    EQU    251        ; Test for modem-send ready
  164. RCVRDY    EQU    250        ; Test for modem-receive ready
  165. SNDCHR    EQU    249        ; Send a character to the modem (after sndrdy)
  166. RCVCHR    EQU    248        ; Recv a char from modem (after rcvrdy)
  167. LOOKUP    EQU    247        ; Table search: see cmdtbl comments for info
  168. PARSFN    EQU    246        ; Parse filename from input stream
  169. BDPARS    EQU    245        ; Parse baud-rate from input stream
  170. SBLANK    EQU    244        ; Scan input stream to next non-blank
  171. EVALA    EQU    243        ; Evaluate numeric from input stream
  172. LKAHED    EQU    242        ; Get nxt char w/o removing from input
  173. GNC    EQU    241        ; Get char from input, cy=1 if none
  174. ILP    EQU    240        ; Inline print
  175. DECOUT    EQU    239        ; Decimal output
  176. PRBAUD    EQU    238        ; Print baud rate
  177. ;
  178. CONOUT    EQU    2        ; Simulated BDOS function 2: console char out
  179. PRINT    EQU    9        ; Simulated BDOS function 9: print string
  180. INBUF    EQU    10        ; Input buffer, same structure as BDOS 10
  181. ;
  182. DCONIO    EQU    6        ; BDOS direct console io function #
  183. DCONIN    EQU    0FFH        ; BDOS dconio flag for input
  184. BDOS    EQU    5        ; BDOS function caller
  185. ;
  186. ;
  187.     ORG    TPA        ; We begin
  188. ;
  189.     DS    3        ; MEX has a jmp start here
  190. ;
  191.     DS    2        ; Not used by MEX
  192. TPULSE:    DB    'T'        ; T=touch, P=pulse (used by this overlay)
  193. CLOCK:    DB    46        ; Clock speed x .1, up to 25.5 mhz.
  194. MSPEED:    DB    5        ; Sets display time for sending a file
  195.                 ; 0=110 1=300  2=450  3=600  4=710
  196.                 ; 5=1200 6=2400 7=4800 8=9600 9=19200
  197. BYTDLY:    DB    5        ; Default time to send character in
  198.                 ; Terminal mode file transfer (0-9)
  199.                 ; 0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms
  200. CRDLY:    DB    5        ; End-of-line delay after crlf in terminal
  201.                 ; Mode file transfer for slow bbs systems
  202.                 ; 0=0 delay, 1=100 ms, 5=500 ms, 9=900 ms
  203. COLUMS:    DB    5        ; Number of directory columns
  204. SETFL:    DB    YES        ; Yes=user-defined set command
  205. SCRTST:    DB    YES        ; Yes=if home cursor and clear screen
  206.                 ; Routine at CLRSCRN
  207.     DB    0        ; Was once acknak, now spare
  208. BAKFLG:    DB    YES        ; Yes=make .BAK file
  209. CRCDFL:    DB    YES        ; Yes=default to CRC checking
  210.                 ; No=default to checksum checking
  211. TOGCRC:    DB    YES        ; Yes=allow toggling of checksum to CRC
  212. CVTBS:    DB    NO        ; Yes=convert backspace to rub
  213. TOGLBK:    DB    YES        ; Yes=allow toggling of bksp to rub
  214. ADDLF:    DB    NO        ; No=no lf after cr to send file in
  215.                 ; Terminal mode (added by remote echo)
  216. TOGLF:    DB    YES        ; Yes=allow toggling of lf after cr
  217. TRNLOG:    DB    NO        ; Yes=allow transmission of logon
  218.                 ; Write logon sequence at location logon
  219. SAVCCP:    DB    YES        ; Yes=do not overwrite ccp
  220. LOCNXT:    DB    NO        ; Yes=local cmd if extchr precedes
  221.                 ; No=not local cmd if extchr precedes
  222. TOGLOC:    DB    YES        ; Yes=allow toggling of locnxtchr
  223. LSTTST:    DB    YES        ; Yes=allow toggling of printer on/off
  224.                 ; In terminal mode. set to no if using
  225.                 ; The printer port for the modem
  226. XOFTST:    DB    NO        ; Yes=allow testing of XOFF from remote
  227.                 ; While sending a file in terminal mode
  228. XONWT:    DB    NO        ; Yes=wait for xon after sending cr while
  229.                 ; Transmitting a file in terminal mode
  230. TOGXOF:    DB    YES        ; Yes=allow toggling of XOFF testing
  231. IGNCTL:    DB    NO        ; Yes=do not send control characters
  232.                 ; Above ctl-m to CRT in terminal mode
  233.                 ; No=send any incoming ctl-char to CRT
  234. EXTRA1:    DB    0        ; For future expansion
  235. EXTRA2:    DB    0        ; For future expansion
  236. BRKCHR:    DB    '@'-40H        ; ^@ = send a 300 ms. break tone
  237. NOCONN:    DB    'N'-40H        ; ^N = disconnect from phone line
  238. LOGCHR:    DB    'L'-40H        ; ^L = send logon
  239. LSTCHR:    DB    'P'-40H        ; ^P = toggle printer
  240. UNSVCH:    DB    'R'-40H        ; ^R = close input text buffer
  241. TRNCHR:    DB    'T'-40H        ; ^T = transmit file to remote
  242. SAVCHR:    DB    'Y'-40H        ; ^Y = open input text buffer
  243. EXTCHR:    DB    '^'-40H        ; ^^ = send next character
  244. ;
  245.     DS    2        ; Not used
  246. ;
  247. ; Low-level modem I/O routines.
  248. ;
  249. INCTL1:    LD    A,10H        ; In modem control port
  250.     OUT    (EXTCT1),A
  251.     IN    A,(EXTCT1)
  252.     RET
  253. INCEND:    DS    10-[INCEND-INCTL1]
  254. ;
  255. OTDATA:    OUT    (EXTDAT),A    ; Out modem data port
  256.     RET
  257. OTDEND:    DS    10-[OTDEND-OTDATA]
  258. ;
  259. INPORT:    IN    A,(EXTDAT)    ; In modem data port
  260.     RET
  261. INPEND:    DS    10-[INPEND-INPORT]
  262. ;
  263. ; Bit-test routines.
  264. ;
  265. MASKR:    AND    MDRCVB
  266.     RET            ; Bit to test for receive ready
  267. TESTR:    CP    MDRCVR
  268.     RET            ; Value of receive bit when ready
  269. MASKS:    AND    MDSNDB
  270.     RET            ; Bit to test for send ready
  271. TESTS:    CP    MDSNDR
  272.     RET            ; Value of send bit when ready
  273. ;
  274.     DS    12
  275. ;
  276. LOGON:    DS    2        ; Needed for MDM compat, not ref'd by MEX
  277. DIALV:    JP    DIAL
  278. DISCV:    JP    DISCON
  279. GOODBV:    JP    GOODBYE        ; Called before exit to CP/M
  280. INMODV:    JP    NITMOD        ; Initialization. called at cold-start
  281. NEWBDV:    JP    PBAUD        ; Set baud rate
  282. NOPARV:    RET
  283.     NOP
  284.     NOP            ; Set modem for no-parity
  285. PARITV:    RET
  286.     NOP
  287.     NOP            ; Set modem parity
  288. SETUPV:    JP    SETCMD        ; Set cmd: jump to a ret if you don't write SET
  289. SPMENV:    RET
  290.     NOP
  291.     NOP            ; Not used with MEX
  292. VERSNV:    JP    SYSVER        ; Overlay's voice in the sign-on message
  293. BREAKV:    JP    SBREAK        ; Send a break
  294. ;
  295. ; MDM calls supported in MEX 1.0 but not recommended for use.
  296. ;
  297. ILPRTV:    DS    3        ; Replace with MEX function 9
  298. INBUFV:    DS    3        ; Replace with MEX function 10
  299. ILCMPV:    DS    3        ; Replace with table lookup funct. 247
  300. INMDMV:    DS    3        ; Replace with MEX function 255
  301. NXSCRV:    DS    3        ; Not supported by MEX (returns w/no action)
  302. TIMERV:    DS    3        ; Replace with MEX function 254
  303. ;
  304. CLREOS:    LD    DE,EOSMSG
  305.     LD    C,PRINT
  306.     CALL    MEX
  307.     RET
  308. ;
  309. CLS:    LD    DE,CLSMSG
  310.     LD    C,PRINT
  311.     CALL    MEX
  312.     RET
  313. ;------------------------------------------------------------
  314. ;
  315. ; end of fixed area
  316. ;
  317. ;------------------------------------------------------------
  318. ;
  319. ; Print out the overlay version
  320. ;
  321. SYSVER:    CALL    MILP
  322.     DB    'ON! Overlay Version SM '
  323.     DB    REV/10+'0'
  324.     DB    '.'
  325.     DB    REV MOD    10+'0'
  326.     DB    CR,LF,LF
  327.     DB    0
  328.     RET
  329. ;
  330. ; Break, disconnect and goodbye routines
  331. ;
  332. SBREAK:    LD    A,5
  333.     OUT    (EXTCT1),A
  334.     LD    A,(REG5)
  335.     OR    9AH        ; Send a break
  336.     OUT    (EXTCT1),A
  337.     LD    B,3        ; Delay 300 ms.
  338.     CALL    MTIME
  339.     LD    A,5
  340.     OUT    (EXTCT1),A
  341.     LD    A,(REG5)
  342.     OUT    (EXTCT1),A    ; Stop break
  343.     RET
  344. ;
  345. ; Disconnect Routine
  346. ;
  347. DISCON:    LD    A,(MODMTYP)
  348.     OR    A
  349.     JR    Z,DISCONH
  350. ;
  351. ; Disconnect Anchor Modem.
  352. ; Anchor does not respond to DTR so the only way to disconnect is through
  353. ; standard Smartmodem disconnect commands
  354. ;
  355. DISCONA:LD    B,20
  356.     CALL    MTIME        ; Wait 2 seconds
  357.     LD    HL,SMATN    ; Send '+++'
  358.     CALL    SMSEND
  359.     LD    B,40        ; Wait 4 more seconds (Anchor is slow)
  360.     CALL    MTIME
  361.     LD    HL,SMDISC    ; Send 'ATH'
  362.     CALL    SMSEND
  363.     LD    B,10        ; Wait 1 second
  364.     CALL    MTIME
  365.     RET
  366. ;
  367. ; Disconnect Hayes, etc.
  368. ;
  369. DISCONH:LD    A,5
  370.     OUT    (EXTCT1),A    ; Send to the status port
  371.     LD    A,68H        ; Turn off DTR/RTS
  372.     OUT    (EXTCT1),A
  373.     LD    B,10        ; Delay 1 sec.
  374.     CALL    MTIME
  375.     LD    A,5
  376.     OUT    (EXTCT1),A
  377.     LD    A,0EAH        ; Turn 'em back on again
  378.     OUT    (EXTCT1),A
  379. GOODBYE:RET
  380. ;
  381. ; GOODBYE routines are called by MEX prior to exit to CP/M
  382. ;    (re-use DISCONH's RET to save space)
  383. ;GOODBYE:RET            ; NOTE: EXIT TO CP/M with no change to
  384.                 ; connect status or settings (parity, etc)
  385. ;
  386. ; Initialize RS-232 port, Smartmodem, and default modes.
  387. ;
  388. NITMOD:    CALL    NITSIO        ; Don't assume initialized dart chip!
  389.     CALL    INCTL1        ; See if modem is connected, i.e., returning
  390.     AND    08H        ; To active modem from CPM
  391.     RET    NZ        ; Skip if connected
  392.     LD    A,(MSPEED)    ; Get default baud rate
  393.     CALL    PBAUD        ; Set it
  394.     LD    A,(MONFLG)    ; Get monitor default
  395.     OR    A
  396.     LD    A,'0'        ; Speaker off
  397.     JR    Z,NITMOD4
  398.     INC    A        ; Speaker on (A='1')
  399. NITMOD4:LD    (SMINIT+3),A    ; Put it in sminit string
  400.     LD    A,(ANSFLG)    ; Get mode default
  401.     OR    A
  402.     LD    A,'0'        ; Originate
  403.     JR    Z,NITMOD5
  404.     INC    A        ; Answer (A='1')
  405. NITMOD5:LD    (SMINIT+8),A    ; Put it in sminit string
  406.     LD    HL,SMINIT
  407. SINIT:    CALL    SMSEND        ; Send the init string
  408. SMTLP1:    LD    C,INMDM        ; Wait for modem response
  409.     CALL    MEX
  410.     JR    NC,SMTLP1    ; Eat everything until silence for
  411.     RET            ; 100 msec
  412. ;
  413. ;    Initialize the Zilog DART chip
  414. ;
  415. NITSIO:    XOR    A        ; Select reg. 0
  416.     OUT    (EXTCT1),A
  417.     LD    A,(REG0)    ; Command byte
  418.     OUT    (EXTCT1),A
  419.     LD    A,04H        ; Select reg. 4
  420.     OUT    (EXTCT1),A
  421.     LD    A,(REG4)    ; Receive/transmit control byte
  422.     OUT    (EXTCT1),A
  423.     LD    A,03H        ; Select reg. 3
  424.     OUT    (EXTCT1),A
  425.     LD    A,(REG3)    ; Receiver logic byte
  426.     OUT    (EXTCT1),A
  427.     LD    A,05H        ; Select reg. 5
  428.     OUT    (EXTCT1),A
  429.     LD    A,(REG5)    ; Transmitter logic byte
  430.     OUT    (EXTCT1),A
  431.     RET
  432. ;
  433. ; Set command processor
  434. ;
  435. SETCMD:    LD    C,SBLANK    ; Any arguments?
  436.     CALL    MEX
  437.     JP    C,SETSHO    ; If not, display default(s)
  438.     LD    DE,CMDTBL
  439.     LD    C,LOOKUP
  440.     CALL    MEX        ; Parse the argument
  441.     PUSH    HL        ; Save any parsed arguments on stack
  442.     RET    NC        ; If we have one, return to it
  443.     POP    HL        ; Oops, input not found in table
  444. SETERR:    LD    DE,SETEMS
  445.     LD    C,PRINT
  446.     CALL    MEX
  447.     JP    CRLF        ; Jp = call!ret
  448. ;    RET
  449. SETEMS:    DB    CR,LF,'SET command error',CR,LF,'$'
  450. ;
  451. ; Argument table
  452. ;
  453. CMDTBL:    DB    '?'+80H        ; Help
  454.     DW    SETHELP
  455.     DB    'ORI','G'+80H    ; Originate mode
  456.     DW    ORIG
  457.     DB    'ANSWE','R'+80H    ; Answer mode
  458.     DW    ANS
  459.     DB    'TON','E'+80H    ; Tone dialing
  460.     DW    STTONE
  461.     DB    'PULS','E'+80H    ; Pulse dialing
  462.     DW    STPULSE
  463.     DB    'MONITO','R'+80H ; Monitor on
  464.     DW    MONIT
  465.     DB    'QUIE','T'+80H    ; Monitor off
  466.     DW    QUIET
  467.     DB    'BAU','D'+80H    ; Set baud
  468.     DW    STBAUD
  469.     DB    'DELA','Y'+80H    ; Set delay
  470.     DW    DELAY
  471.     DB    'PARIT','Y'+80H    ; Set parity
  472.     DW    STPRTY
  473.     DB    'STOPBIT','S'+80H ; Set stopbits
  474.     DW    STSTOP
  475.     DB    'LENGT','H'+80H    ; Set length
  476.     DW    STBITS
  477.     DB    'ANCHO','R'+80H    ; Set to Anchor modem
  478.     DW    SETANCH
  479.     DB    'MANUA','L'+80H    ; Set to manual mode
  480.     DW    MANUAL
  481.     DB    0        ; Table terminator
  482. ;
  483. ;
  484. ;  "SET (no args): PRINT CURRENT STATISTICS
  485. ;
  486. SETSHO:    CALL    MILP
  487.     DB    CR,LF
  488.     DB    'SET values:',CR,LF,0
  489.     CALL    CRLF
  490.     CALL    MDMSHOW
  491.     CALL    CRLF
  492.     CALL    MDSHOW
  493.     CALL    CRLF
  494.     CALL    TPSHOW
  495.     CALL    CRLF
  496.     CALL    BDSHOW
  497.     CALL    CRLF
  498.     CALL    DLSHOW
  499.     CALL    CRLF
  500.     CALL    MONSHO
  501.     CALL    CRLF
  502.     CALL    CRLF
  503.     CALL    SHPRTY
  504.     CALL    CRLF
  505.     CALL    SHSTOP
  506.     CALL    CRLF
  507.     CALL    SHBITS
  508.     CALL    CRLF
  509.     JP    CRLF        ; JP = CALL!RET
  510. ;
  511. ; "SET ?" processor
  512. ;
  513. SETHELP:CALL    MILP
  514.     DB    CR,LF,'SET ANCHOR    - Set modem to respond to Anchor commands'
  515.     DB    CR,LF,'SET ORIG      - Set modem to Originate mode'
  516.     DB    CR,LF,'                (Disable auto-answer mode)'
  517.     DB    CR,LF,'SET ANSWER    - Set modem to auto-answer mode'
  518.     DB    CR,LF,'SET TONE      - Set modem for Touchtone dialing'
  519.     DB    CR,LF,'SET PULSE     - Set modem for Pulse dialing'
  520.     DB    CR,LF,'SET DELAY     - <N> seconds to wait for answer'
  521.     DB    CR,LF,'SET PARITY    - OFF, EVEN or ODD'
  522.     DB    CR,LF,'SET STOPBITS  - 1, 1.5 or 2'
  523.     DB    CR,LF,'SET LENGTH    - 5, 6, 7 or 8'
  524.     DB    CR,LF,'SET QUIET     - Turn Modem monitor OFF'
  525.     DB    CR,LF,'SET MONITOR   - Turn Modem monitor ON'
  526.     DB    CR,LF,'SET BAUD      - 300, 1200, 2400, 4800, 9600, 19200'
  527.     DB    CR,LF,'SET MANUAL    - ORIG or ANSWER'
  528.     DB    CR,LF,'                Manually generate Answer or Originate '
  529.     DB    'carrier tone'
  530.     DB    CR,LF,LF,0
  531.     RET
  532. ;
  533. ; SET ANCHOR processor
  534. ;
  535. SETANCH:LD    A,0FFH
  536.     LD    (MODMTYP),A
  537.     LD    A,041H
  538.     LD    (DIALAB),A
  539.     XOR    A
  540.     LD    (MONFLG),A
  541. MDMSHOW:LD    A,(MODMTYP)
  542.     OR    A
  543.     JR    Z,MDMSHOH
  544.     CALL    MILP
  545.     DB    'Anchor Modem',0
  546.     RET
  547. MDMSHOH:CALL    MILP
  548.     DB    'Hayes-compatible Smartmodem',0
  549.     RET
  550. ;
  551. ; Set manual processor
  552. ; Note: manual mode does not change the auto-answer status of the modem
  553. ;
  554. MANUAL:    LD    C,SBLANK    ; Check for orig <or> answer
  555.     CALL    MEX        ;
  556.     JP    C,SETERR    ; If none, print error
  557.     LD    DE,MANTBL    ; Check for proper syntax
  558.     LD    C,LOOKUP
  559.     CALL    MEX
  560.     PUSH    HL        ; Match found, go do it!
  561.     RET    NC        ;
  562.     POP    HL        ; No match: fix stack and
  563.     JP    SETERR        ; Print error
  564. ;
  565. MANORIG:LD    B,30        ; Force 3 second delay on originate end
  566.     CALL    MTIME
  567.     LD    HL,SMATD    ; Send out 'ATD'
  568.     CALL    SINIT
  569.     CALL    MILP
  570.     DB    CR,LF,'Manual originate mode,',CR,LF
  571.     DB    'Awaiting answer tone.'
  572.     DB    CR,LF,LF,0
  573.     JR    GOMAN
  574. MANANS:    LD    HL,SMATA    ; Send out 'ATD'
  575.     CALL    SINIT
  576.     CALL    MILP
  577.     DB    CR,LF,'Manual answer mode, carrier tone sent',CR,LF,LF,0
  578.     JR    GOMAN
  579. ;
  580. SMATD:    DB    'ATD',CR,0
  581. SMATA:    DB    'ATA',CR,0
  582. ;
  583. GOMAN:    LD    B,20
  584.     CALL    MTIME
  585.     CALL    MILP
  586.     DB    'Enter Terminal Mode at the next command prompt',CR,LF
  587.     DB    'to check status of the connection',CR,LF,LF
  588.     DB    'To return to voice mode,',CR,LF
  589.     DB    'disconnect from terminal mode <ESC N>,',CR,LF
  590.     DB    'or from the command line <DSC>',CR,LF,LF,0
  591.     RET
  592. ;
  593. ; Manual originate / answer command table
  594. ;
  595. MANTBL:    DB    'ORI','G'+80H    ; Manual originate mode
  596.     DW    MANORIG
  597.     DB    'ANSWE','R'+80H    ; Manual answer mode
  598.     DW    MANANS
  599.     DB    0
  600. ;
  601. ; "SET BAUD" processor
  602. ;
  603. STBAUD:    LD    C,BDPARS    ; Function code: parse a baudrate
  604.     CALL    MEX        ; Let MEX look up code
  605.     JP    C,SETERR    ; Jump if invalid code
  606.     CALL    PBAUD        ; No, try to set it
  607.     JP    C,SETERR    ; If not one of ours, bomb out
  608. BDSHOW:    LD    A,(MSPEED)    ; Get current baud rate
  609.     LD    C,PRBAUD    ; Let MEX print it
  610.     JP    MEX
  611. ;    RET
  612. ;
  613. ; This routine sets baud rate passed as MSPEED code in A.
  614. ; Returns CY=1 if baud rate not supported.
  615. ;
  616. ;
  617. ;
  618. PBAUD:    PUSH    HL
  619.     PUSH    DE
  620.     PUSH    BC
  621.     OR    A
  622.     JR    Z,NO$BAUD    ; No speed selected
  623.     CP    10
  624.     JR    NC,NO$BAUD    ; Out of range
  625.     LD    B,A
  626. ;
  627. ; Speed value in range, set it up
  628. ;
  629.     LD    DE,BD300
  630.     DEC    A
  631.     JR    Z,SETBAUD    ; Set 300 bps
  632.     DEC    A
  633.     JR    Z,NO$BAUD    ; Skip 450 bps
  634.     DEC    A
  635.     JR    Z,NO$BAUD    ; Skip 600 bps
  636.     DEC    A
  637.     JR    Z,NO$BAUD    ; Skip 710 bps
  638.     LD    DE,BD1200
  639.     DEC    A
  640.     JR    Z,SETBAUD    ; Set 1200 bps
  641.     LD    DE,BD2400
  642.     DEC    A
  643.     JR    Z,SETBAUD    ; Set 2400 bps
  644.     LD    DE,BD4800
  645.     DEC    A
  646.     JR    Z,SETBAUD    ; Set 4800 bps
  647.     LD    DE,BD9600
  648.     DEC    A
  649.     JR    Z,SETBAUD    ; Set 9600 bps
  650.     LD    DE,BD19200
  651.     DEC    A
  652.     JR    Z,SETBAUD    ; Set 19200 bps
  653. NO$BAUD:
  654.     SCF
  655.     JR    ERR$RET
  656. ;
  657. ; Set up the baud rate requested
  658. ;
  659. SETBAUD:
  660.     CALL    SELBNK        ; A=0 returns system port data
  661.     AND    0CFH        ; Mask rate generator  xx00xxxxb
  662.     OR    E        ; Selected rate
  663.     PUSH    BC
  664.     LD    C,A        ; Return it in c
  665.     CALL    SELBNK        ; A<=>0 sets new rate
  666.     POP    BC
  667.     LD    A,4
  668.     OUT    (EXTCT1),A    ; Select wr4
  669.     LD    A,D        ; Get dart divisor, 1 stop bit
  670.     OUT    (EXTCT1),A
  671.     LD    A,3
  672.     OUT    (EXTCT1),A    ; Wr3
  673.     LD    A,0C1H        ; 8 bits, rx enable
  674.     OUT    (EXTCT1),A
  675.     LD    A,5
  676.     OUT    (EXTCT1),A    ; Wr5
  677.     LD    A,0EAH        ; Dtr, 8 bits, tx enable, rts
  678.     OUT    (EXTCT1),A
  679.     LD    A,B
  680.     LD    (MSPEED),A
  681.     OR    A        ; Clear carry
  682. ;
  683. ERR$RET:
  684.     POP    BC
  685.     POP    DE
  686.     POP    HL
  687.     RET
  688. ;
  689. ; SELBNK  routine in the ON bios gets/sets the baud rate clock
  690. ;  This routine also affects the bank port and the terminal speed.
  691. ;   Please don't play around with it.
  692. ;
  693. SELBNK:
  694.     LD    HL,(1)        ; Bios jump table
  695.     LD    L,33H        ; Offset to selbnk jump
  696.     JP    (HL)        ; Do it, return to caller
  697.  
  698.  
  699. ;
  700. ; SET MODEM STATUS TO ENABLE OR DISABLE AUTO-ANSWER
  701. ;
  702. ;
  703. SMO:    DB    'ATS0=0',CR,0
  704. SMA:    DB    'ATS0=1',CR,0
  705. ADELAY:    DS    1
  706. ;
  707. ANS:    LD    A,(ANSFLG)    ; Already in auto-answer?
  708.     OR    A
  709.     JR    NZ,NOTORI    ; Then no set delay stuff
  710.     CPL            ; A=FFh
  711.     LD    (ANSFLG),A    ; Set ans flag
  712.     LD    A,(NDELAY)    ; Save originate mode's delay
  713.     LD    (ADELAY),A
  714.     LD    A,12        ; 12 seconds seems about right
  715.     CALL    IDELAY        ; Set delay 12
  716. NOTORI:    LD    HL,SMA        ; Send out ATS0=1
  717.     CALL    SINIT
  718.     CALL    MDSHOW        ; Display mode
  719. ANSLOO:    CALL    RESULT        ; Poll modem
  720.     OR    A        ; Connect?
  721.     RET    Z        ; Then just return to MEX
  722.     CP    3        ; Control-C abort?
  723.     JR    NZ,ANSLOO    ; If not, loop
  724.     CALL    DISCON        ; Otherwise, hang up
  725. ;    fall    through
  726. ORIG:    LD    A,(ANSFLG)    ; Already in originate mode?
  727.     OR    A
  728.     JR    Z,NOTANS    ; Then no set delay stuff
  729.     LD    A,(ADELAY)
  730.     CALL    IDELAY
  731.     XOR    A
  732.     LD    (ANSFLG),A    ; Set orig flag
  733. NOTANS:    LD    HL,SMO        ; Send out ATS0=0
  734.     CALL    SINIT
  735.     CALL    CRLF
  736. ;    fall    through
  737. MDSHOW:    LD    A,(ANSFLG)
  738.     OR    A
  739.     JR    Z,MDORIG
  740.     CALL    MILP
  741.     DB    CR,LF,'Auto-answer mode, ^C aborts',CR,LF,0
  742.     RET
  743. MDORIG:    CALL    MILP
  744.     DB    'Originate mode, auto-answer off',CR,LF,0
  745.     RET
  746. ;
  747. ;
  748. ; Monitor control processor
  749. ;
  750. QUIET:    XOR    A
  751.     LD    (MONFLG),A
  752.     LD    HL,SMQT
  753.     CALL    SINIT
  754.     JR    MONSHO
  755. ;
  756. MONIT:    LD    A,0FFH
  757.     LD    (MONFLG),A
  758.     LD    HL,SMMON
  759.     CALL    SINIT
  760. ;
  761. MONSHO:    CALL    MILP
  762.     DB    'Monitor Speaker O',0
  763.     LD    A,(MONFLG)
  764.     OR    A
  765.     JR    Z,MONOFF
  766.     CALL    MILP
  767.     DB    'N',0
  768.     RET
  769. ;
  770. MONOFF:    CALL    MILP
  771.     DB    'FF',0
  772.     RET
  773. ;
  774. SMQT:    DB    'ATM0',CR,0
  775. SMMON:    DB    'ATM1',CR,0
  776. ;
  777. ; Set dial processor
  778. ;
  779. STTONE:    LD    B,'T'
  780.     JR    SDIAL1
  781. ;
  782. STPULSE:LD    B,'P'
  783. ;
  784. SDIAL1:    LD    A,(TPULSE)
  785.     CP    B
  786.     JR    Z,TPSHOW
  787.     LD    A,B
  788.     LD    (TPULSE),A
  789.     CP    'P'
  790.     LD    A,01010000B    ; Pulse dial
  791.     JR    Z,SDIAL2
  792.     LD    A,01000000B    ; Tone dial
  793. ;
  794. SDIAL2:    LD    (DIALWD),A
  795. ;
  796. TPSHOW:    LD    A,(DIALWD)
  797.     AND    00010000B
  798.     JR    Z,TPTONE
  799.     CALL    MILP
  800.     DB    'Pulse Dialing',0
  801.     RET
  802. TPTONE:    CALL    MILP
  803.     DB    'Touchtone Dialing',0
  804.     RET
  805. ;
  806. ; Set delay processor
  807. ;
  808. DELAY:    LD    C,EVALA
  809.     CALL    MEX
  810.     LD    A,H
  811.     OR    A
  812.     JP    NZ,SETERR
  813.     LD    A,L
  814. IDELAY:    LD    (NDELAY),A
  815. DLSHOW:    CALL    MILP
  816.     DB    'Answer Delay is ',0
  817.     LD    A,(NDELAY)
  818.     LD    L,A
  819.     LD    H,0
  820.     LD    C,DECOUT
  821.     CALL    MEX
  822.     CALL    MILP
  823.     DB    ' seconds',0
  824.     RET
  825. ;
  826. ;    SET PARITY command: reset transmit/receive parity
  827. ;
  828. ;        Parity is controlled by bits 0 and 1 of
  829. ;        the byte sent to the SIO write-register
  830. ;        4 as follows:
  831. ;
  832. ;           Parity    Bit 1       Bit 0
  833. ;             Off      -         0
  834. ;             Odd      0         1
  835. ;             Even      1         1
  836. ;
  837. STPRTY:    LD    C,SBLANK    ; Check for parity code
  838.     CALL    MEX        ;
  839.     JP    C,SETERR    ; If none, print error
  840.     LD    DE,PARTBL    ; Check for proper syntax
  841.     LD    C,LOOKUP
  842.     CALL    MEX
  843.     PUSH    HL        ; Match found, go do it!
  844.     RET    NC        ;
  845.     POP    HL        ; No match: fix stack and
  846.     JP    SETERR        ; Print error
  847. ;
  848. PROFF:    LD    A,(REG4)    ; Get register 4 byte
  849.     AND    0FEH        ; Reset bit 0
  850.     JR    PARTB1        ;
  851. PREVEN:    LD    A,(REG4)    ;
  852.     OR    003H        ; Set bits 0 & 1
  853.     JR    PARTB1        ;
  854. PRODD:    LD    A,(REG4)    ;
  855.     OR    001H        ; Set bit 0
  856.     AND    0FDH        ; Reset bit 1
  857. PARTB1:    LD    (REG4),A    ;
  858.     CALL    NITSIO        ; Re-initialize the usart
  859. ;    FALL    THRU        ; To SHPRTY
  860. ;    CALL    SHPRTY        ; Print the result
  861. ;    RET            ;
  862. SHPRTY:    CALL    MILP        ; Display parity
  863.     DB    'Parity:  ',TAB,' ',0
  864.     LD    A,(REG4)    ;
  865.     AND    001H        ; Test bit 0
  866.     OR    A        ; If bit0=0 then parity off
  867.     JR    NZ,SHPRT1    ;
  868.     CALL    MILP        ;
  869.     DB    'Off',0        ;
  870.     RET
  871. SHPRT1:    LD    A,(REG4)    ;
  872.     AND    002H        ; Test bit 1
  873.     OR    A        ; If bit1=0 then parity odd
  874.     JR    NZ,SHPRT2    ;
  875.     CALL    MILP        ;
  876.     DB    'Odd',0        ;
  877.     RET            ;
  878. SHPRT2:    CALL    MILP        ;
  879.     DB    'Even',0    ;
  880.     RET
  881. ;
  882. ;    SET PARITY command table
  883. ;
  884. PARTBL:    DB    'OF','F'+80H    ; "set parity off"
  885.     DW    PROFF
  886.     DB    'EVE','N'+80H    ; "set parity even"
  887.     DW    PREVEN
  888.     DB    'OD','D'+80H    ; "set parity odd"
  889.     DW    PRODD
  890.     DB    0        ; <<== end of parity table
  891. ;
  892. ;    SET STOPBITS command: reset number of stop bits
  893. ;
  894. ;        The number of stop bits is controlled by bits
  895. ;        2 and 3 of the byte sent to the SIO write-
  896. ;        register 4, as follows:
  897. ;
  898. ;            Stop bits       Bit 3    Bit 2
  899. ;            1         0          1
  900. ;               1.5         1          0
  901. ;            2         1          1
  902. ;
  903. ;
  904. STSTOP:    LD    C,SBLANK    ; Check for stop bits
  905.     CALL    MEX        ;
  906.     JP    C,SETERR    ; If none, print error
  907.     LD    DE,STPTBL    ; Check for proper syntax
  908.     LD    C,LOOKUP
  909.     CALL    MEX        ;
  910.     PUSH    HL        ; Match found, go do it!
  911.     RET    NC        ;
  912.     POP    HL        ; No match: fix stack and
  913.     JP    SETERR        ; Print error
  914. ;
  915. STOP01:    LD    A,(REG4)    ; Get register 4 byte
  916.     AND    0F7H        ; Reset bit 3
  917.     OR    004H        ; Set bit 2
  918.     JR    STSTP1        ;
  919. STOP02:    LD    A,(REG4)    ;
  920.     OR    00CH        ; Set bits 2 and 3
  921.     JR    STSTP1        ;
  922. STOP15:    LD    A,(REG4)    ;
  923.     OR    008H        ; Set bit 3
  924.     AND    0FBH        ; Reset bit 2
  925. STSTP1:    LD    (REG4),A    ;
  926.     CALL    NITSIO        ;
  927. ;    FALL    THRU        ; To SHSTOP
  928. ;    CALL    SHSTOP        ; Print the result
  929. ;    RET            ;
  930. SHSTOP:    CALL    MILP        ; Display stop-bits
  931.     DB    'Stop bits:',TAB,' ',0
  932.     LD    A,(REG4)    ;
  933.     AND    004H        ; Test bit 2
  934.     OR    A        ; If bit2=0 then 1.5
  935.     JR    NZ,SHSTP1    ;
  936.     CALL    MILP        ;
  937.     DB    '1.5',0        ;
  938.     RET
  939. SHSTP1:    LD    A,(REG4)    ;
  940.     AND    008H        ; Test bit 3
  941.     OR    A        ; If bit3=0 then 1
  942.     JR    NZ,SHSTP2    ;
  943.     CALL    MILP        ;
  944.     DB    '1',0        ;
  945.     RET
  946. SHSTP2:    CALL    MILP        ;
  947.     DB    '2',0        ;
  948.     RET
  949. ;
  950. ;    SET STOPBITS command table
  951. ;
  952. STPTBL:    DB    '1'+80H        ; "set stop 1"
  953.     DW    STOP01
  954.     DB    '2'+80H        ; "set stop 2"
  955.     DW    STOP02
  956.     DB    '1.','5'+80H    ; "set stop 1.5"
  957.     DW    STOP15
  958.     DB    0        ; <<== end of stop-bits table
  959. ;
  960. ;    SET LENGTH command: set bits per character
  961. ;
  962. ;        The number of bits per character is controlled for
  963. ;        the receiver circuit by bits 6 and 7 of the byte
  964. ;        sent to the SIO write-register 3 and for the trans-
  965. ;        mitter circuit by bits 5 and 6 of the byte sent to
  966. ;        the SIO write-register 5.  The assumption has been
  967. ;        made here that both transmission and reception will
  968. ;        be carried on at the same number of bits per charac-
  969. ;        ter.  The bit configurations are shown for register
  970. ;        3 only, but are the same for register 5:
  971. ;
  972. ;            BPC     Bit 7        Bit 6
  973. ;             5          0          0
  974. ;             6          1          0
  975. ;             7          0          1
  976. ;             8          1          1
  977. ;
  978. STBITS:    LD    C,SBLANK    ; Check for bits/char
  979.     CALL    MEX        ;
  980.     JP    C,SETERR    ; If none, print error
  981.     LD    DE,BITTBL    ; Check for proper syntax
  982.     LD    C,LOOKUP
  983.     CALL    MEX
  984.     PUSH    HL        ; Match found, go do it!
  985.     RET    NC        ;
  986.     POP    HL        ; No match: fix stack and
  987.     JP    SETERR        ; Print error
  988. ;
  989. BIT5:    LD    A,(REG3)    ;
  990.     AND    0BFH        ; Reset bit 6
  991.     AND    07FH        ; Reset bit 7
  992.     LD    (REG3),A    ;
  993.     LD    A,(REG5)    ;
  994.     AND    0DFH        ; Reset bit 5
  995.     AND    0BFH        ; Reset bit 6
  996.     JR    STBTS1        ;
  997. BIT6:    LD    A,(REG3)    ;
  998.     AND    0BFH        ; Reset bit 6
  999.     OR    080H        ; Set bit 7
  1000.     LD    (REG3),A    ;
  1001.     LD    A,(REG5)    ;
  1002.     AND    0DFH        ; Reset bit 5
  1003.     OR    040H        ; Set bit 6
  1004.     JR    STBTS1        ;
  1005. BIT7:    LD    A,(REG3)    ;
  1006.     OR    040H        ; Set bit 6
  1007.     AND    07FH        ; Reset bit 7
  1008.     LD    (REG3),A    ;
  1009.     LD    A,(REG5)    ;
  1010.     OR    020H        ; Set bit 5
  1011.     AND    0BFH        ; Reset bit 6
  1012.     JR    STBTS1        ;
  1013. BIT8:    LD    A,(REG3)    ;
  1014.     OR    040H        ; Set bit 6
  1015.     OR    080H        ; Set bit 7
  1016.     LD    (REG3),A    ;
  1017.     LD    A,(REG5)    ;
  1018.     OR    020H        ; Set bit 5
  1019.     OR    040H        ; Set bit 6
  1020. STBTS1:    LD    (REG5),A    ;
  1021.     CALL    NITSIO        ;
  1022. ;    FALL    THRU        ; To SHBITS
  1023. SHBITS:    CALL    MILP        ; Display bits/char
  1024.     DB    'Bits/char:',TAB,' ',0
  1025.     LD    A,(REG5)    ;
  1026.     AND    040H        ; Test bit 6
  1027.     OR    A        ; If bit6=0 then 6 bpc
  1028.     JR    NZ,SHBTS2    ;
  1029.     LD    A,(REG5)    ;
  1030.     AND    020H        ; Test bit 5
  1031.     OR    A        ; If bit5=0 then 5 bpc
  1032.     JR    NZ,SHBTS1    ;
  1033.     CALL    MILP        ;
  1034.     DB    '5',0        ;
  1035.     RET            ;
  1036. SHBTS1:    CALL    MILP        ;
  1037.     DB    '7',0        ;
  1038.     RET            ;
  1039. SHBTS2:    LD    A,(REG5)    ;
  1040.     AND    020H        ; Test bit 5
  1041.     OR    A        ; If bit5=0 then 6 bpc
  1042.     JR    NZ,SHBTS3    ;
  1043.     CALL    MILP        ;
  1044.     DB    '6',0        ;
  1045.     RET            ;
  1046. SHBTS3:    CALL    MILP        ;
  1047.     DB    '8',0        ;
  1048.     RET
  1049. ;
  1050. ;    SET LENGTH command table
  1051. ;
  1052. BITTBL:    DB    '5'+80H        ; "set bits 5"
  1053.     DW    BIT5
  1054.     DB    '6'+80H        ; "set bits 6"
  1055.     DW    BIT6
  1056.     DB    '7'+80H        ; "set bits 7"
  1057.     DW    BIT7
  1058.     DB    '8'+80H        ; "set bits 8"
  1059.     DW    BIT8
  1060.     DB    0        ; <<== end of bpc table
  1061. ;
  1062. ; Smartmodem dialing routine from Ron Fowler's MXO-SM10.ASM
  1063. ;
  1064. DIAL:    LD    HL,(DIALPT)    ; Fetch pointer
  1065.     CP    254        ; Start dial?
  1066.     JR    Z,STDIAL    ; Jump if so
  1067.     CP    255        ; End dial?
  1068.     JR    Z,ENDIAL    ; Jump if so
  1069. ;
  1070. ; Not start or end sequence, must be a digit to be sent to the modem
  1071. ;
  1072.     LD    (HL),A        ; Put char in buffer
  1073.     INC    HL        ; Advance pointer
  1074.     LD    (DIALPT),HL    ; Stuff pntr
  1075.     RET            ; All done
  1076. ;
  1077. ; Here on a start-dial sequence
  1078. ;
  1079. STDIAL:    LD    HL,DIALBF    ; Set up buffer pointer
  1080.     LD    (DIALPT),HL
  1081.     RET
  1082. ;
  1083. ; Here on an end-dial sequence
  1084. ;
  1085. ENDIAL:
  1086. ;
  1087.      IF    SILENT
  1088.     LD    A,(MONFLG)    ; Check monitor speaker flag
  1089.     OR    A        ; To see if on or off
  1090.     JR    Z,LEAVOFF    ; If off, leave it off
  1091.     LD    (HL),'M'    ; If we silenced speaker to dial,
  1092.     INC    HL        ; Turn it on again
  1093.     LD    (HL),'1'
  1094.     INC    HL
  1095. LEAVOFF:
  1096.      ENDIF
  1097. ;
  1098.     LD    (HL),CR        ; Stuff end-of-line into buffer
  1099.     INC    HL        ; Followed by terminator
  1100.     LD    (HL),0
  1101.     LD    A,(TPULSE)    ; Get overlay's touch-tone flag
  1102. ;
  1103.      IF    SILENT
  1104.     LD    (SMDIAL+5),A
  1105.      ENDIF
  1106. ;
  1107.      IF    NOT SILENT
  1108.     LD    (SMDIAL+3),A    ; Put into string
  1109.      ENDIF
  1110. ;
  1111.     LD    HL,SMDIAL    ; Point to dialing string
  1112.     CALL    SMSEND        ; Send it
  1113. ;
  1114. WAITSM:    LD    C,INMDM
  1115.     CALL    MEX        ; Catch any output from the modem
  1116.     JR    NC,WAITSM    ; Loop until no more characters
  1117. ;
  1118. ; THE FOLLOWING LOOP WAITS FOR A RESULT FROM THE MODEM.
  1119. ;
  1120. RESULT:    LD    A,(NDELAY)    ; Get delay count
  1121.     LD    C,A
  1122. SMWLP:    PUSH    BC
  1123.     LD    B,1        ; Check for a char, up to 1 sec wait
  1124.     LD    C,TMDINP    ; Do timed input
  1125.     CALL    MEX
  1126.     POP    BC
  1127.     JR    NC,SMTEST    ; Jump if modem had a char
  1128.     PUSH    BC        ; No, test for control-c from console
  1129.     LD    C,DCONIO
  1130.     LD    E,DCONIN    ; Use BDOS direct console input function
  1131.     CALL    BDOS
  1132.     POP    BC
  1133.     CP    'C'-40H        ; ^C?
  1134.     JR    NZ,SMNEXT    ; If not, jump
  1135.     LD    A,(DIALAB)    ; Quit dialing
  1136.     LD    B,A
  1137.     LD    C,SNDCHR
  1138.     CALL    MEX
  1139.     CALL    INCTL1        ; See if modem is connected, i.e., returning
  1140.     AND    08H        ; To active modem from CPM
  1141.     CALL    Z,SMDMOFF    ; No carrier, so shut down modem
  1142.     LD    A,3        ; Return abort code
  1143.     RET
  1144.  
  1145. SMNEXT:    OR    A        ; Any other key
  1146.     JR    NZ,SMTIMO    ; Yes, treat like timeout
  1147.     DEC    C        ; No
  1148.     JR    NZ,SMWLP    ; Continue
  1149. ;
  1150. ; NO MODEM RESPONSE WITHIN THE TIME SPECIFIED IN SET DELAY COMMAND
  1151. ;
  1152. SMTIMO:    LD    A,(DIALAB)
  1153.     LD    B,A
  1154.     LD    C,SNDCHR
  1155.     CALL    MEX
  1156.     CALL    INCTL1        ; See if modem is connected, i.e., returning
  1157.     AND    08H        ; To active modem from CPM
  1158.     CALL    Z,SMDMOFF    ; Shut down modem if we're not on pc pursuit
  1159.     LD    A,2        ; Return timeout code
  1160.     RET
  1161. ;
  1162. ; MODEM GAVE US A RESULT, CHECK IT
  1163. ;
  1164. SMTEST:    AND    7FH        ; Ignore any parity
  1165.     CALL    SMANAL        ; Test the result
  1166.     JR    C,RESULT    ; Go try again if unknown response
  1167.     LD    A,B        ; A=result
  1168.     PUSH    AF        ; Save it
  1169. SMTLP:    LD    C,INMDM        ; Eat any additional chars from smartmodem
  1170.     CALL    MEX
  1171.     JR    NC,SMTLP    ; Until 100ms of quiet time
  1172.     POP    AF        ; Return the code
  1173.     RET
  1174. ;
  1175. ; Analyze character returned from External Modem
  1176. ;
  1177. SMANAL:    PUSH    AF
  1178.     LD    A,(MODMTYP)
  1179.     OR    A
  1180.     JR    Z,SMANALH
  1181. ;
  1182. ; Analyze Modem response codes for Anchor modems.
  1183. ; Anchor echoes the digits as they are being dialed.  The returned digits
  1184. ; are interpreted as call return codes, shutting down the modem too early.
  1185. ;
  1186. SMANALA:POP    AF
  1187.     LD    B,0        ; Prep connect code
  1188.     CP    'C'        ; "connect"?
  1189.     RET    Z
  1190.     INC    B        ; Prep busy code B=1
  1191.     CP    'B'
  1192.     RET    Z
  1193.     INC    B        ; Prep no connect msg B=2
  1194.     CP    'N'        ; N=no connect
  1195.     RET    Z
  1196.     LD    B,4        ; Prep modem error
  1197.     CP    'E'        ; E=error
  1198.     RET    Z
  1199.     JR    WTLF
  1200. ;
  1201. ; Analyze Modem response codes for Hayes, etc.
  1202. ;
  1203. SMANALH:POP    AF
  1204.     LD    B,0        ; Prep connect code
  1205.     CP    'C'        ; "connect"?
  1206.     RET    Z
  1207.     CP    '1'        ; Numeric version of "CONNECT"
  1208.     RET    Z
  1209.     CP    '5'        ; Numeric version of "CONNECT 1200"
  1210.     RET    Z
  1211.     INC    B        ; Prep busy code B=1
  1212.     CP    'B'
  1213.     JR    NZ,NOBUSY    ; Not busy, check for no answer
  1214.     PUSH    BC        ; Otherwise, save return code
  1215.     LD    B,5        ; Wait 1/2 second
  1216.     CALL    MTIME
  1217.     LD    A,(DIALAB)    ; Abort possible firmware re-dial
  1218.     LD    B,A
  1219.     LD    C,SNDCHR
  1220.     CALL    MEX
  1221.     POP    BC        ; Get back return code
  1222.     XOR    A        ; Clear carry, return
  1223.     RET
  1224.  
  1225. NOBUSY:    INC    B        ; Prep no connect msg B=2
  1226.     CP    'N'        ; N=no connect
  1227.     RET    Z
  1228.     CP    '3'        ; Numeric version of "NO CONNECT"
  1229.     RET    Z
  1230.     LD    B,4        ; Prep modem error
  1231.     CP    'E'        ; E=error
  1232.     RET    Z
  1233.     CP    '4'        ; Numeric version of "ERROR"
  1234.     RET    Z
  1235. ;
  1236. ; UNKNOWN RESPONSE, RETURN CARRY TO CALLER. BUT FIRST,
  1237. ; FLUSH THE UNKNOWN RESPONSE LINE FROM THE MODEM.
  1238. ;
  1239. WTLF:    CP    LF        ; Linefeed?
  1240.     SCF
  1241.     RET    Z        ; End if so
  1242.     LD    C,INMDM        ; No. get next char
  1243.     CALL    MEX
  1244.     JR    NC,WTLF        ; Unless busy, loop
  1245.     RET
  1246. ;
  1247. ; Send string to the External Modem
  1248. ;
  1249. SMSEND:    LD    C,SNDRDY    ; Wait for modem ready
  1250.     CALL    MEX
  1251.     JR    NZ,SMSEND
  1252.     LD    A,(HL)        ; Fetch next character
  1253.     INC    HL
  1254.     OR    A        ; End?
  1255.     RET    Z        ; Done if so
  1256.     LD    B,A        ; No, position for sending
  1257.     LD    C,SNDCHR    ; Nope, send the character
  1258.     CALL    MEX
  1259.     JR    SMSEND
  1260. ;
  1261. ; Shut down (disconnect) External Modem
  1262. ;
  1263. SMDMOFF:LD    B,20        ; Two second wait to settle down
  1264.     CALL    MTIME
  1265.     LD    A,(MODMTYP)    ; Test modem type
  1266.     OR    A
  1267.     CALL    Z,DISCON    ; If Hayes type, do DTR disconnect
  1268.     RET            ; If Anchor, just return
  1269. ;
  1270. ; General utility routines
  1271. ;
  1272. CRLF:    CALL    MILP        ; Print carriage return, line feed
  1273.     DB    CR,LF,0
  1274.     RET
  1275. ;
  1276. MILP:    LD    C,ILP        ; In-line print
  1277.     JP    MEX
  1278. ;
  1279. MTIME:    LD    C,TIMER        ; MEX timer
  1280.     JP    MEX
  1281. ;
  1282. ;
  1283. ;==========================================================================
  1284. ;                 Data Area
  1285. ;==========================================================================
  1286. ;
  1287. ; Default UART parameters (Initalized for External RS-232)
  1288. ;
  1289. REG0:    DB    00011000B    ; Reset channel A
  1290. REG3:    DB    11000001B    ; Enable receive at 8 bits/char
  1291. REG4:    DB    01000100B    ; No parity, 1 stop bit, clock x16
  1292. REG5:    DB    11101010B    ; Enable transmit at 8 bits/char
  1293. ;
  1294. ; Miscellaneous Default Data
  1295. ;
  1296. SMDIAL:    DB    'AT'
  1297. ;
  1298.      IF    SILENT
  1299.     DB    'M0'        ; Turn off speaker during dialing
  1300.      ENDIF
  1301. ;
  1302.     DB    'DT'        ; Smartmodem dial prefix
  1303. ;
  1304. DIALBF:    DS    52        ; 2* 24 char max, + cr + null + slop
  1305. DIALPT:    DS    2        ; Dial position pointer
  1306. DIALWD:    DB    01000000B    ; Pulse/tone dial word
  1307. DIGIT:    DB    0        ; Save dialed digit
  1308. MSPDSV:    DB    0        ; Save external modem mspeed
  1309. MONFLG:    DB    0FFH        ; 0: monitor off - 0ffh: monitor on
  1310. ANSFLG:    DB    0        ; 0: originate     - 0ffh: answer
  1311. NDELAY:    DB    30        ; No. seconds for answer
  1312. MODMTYP:DB    0        ; 0=Hayes, etc., - 0ffh=Anchor modem
  1313. DIALAB:    DB    CR        ; Character to use to abort dial sequence
  1314. ;
  1315. SMATN:    DB    '+++',0        ; Smartmodem online 'attention'
  1316. SMDISC:    DB    'ATH',CR,0    ; Smartmodem disconnect (used by Anchor)
  1317. SMINIT:    DB    'ATM1 S0=0 S7=60 Q0 X1',CR,0 ; Modem init string
  1318. ;
  1319. EOSMSG:    DB    1BH,'Y$'    ; Clear to end-of-screen
  1320. CLSMSG:    DB    1BH,'+$'    ; Clear whole screen
  1321.  
  1322.     END
  1323.