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

  1. ;     Title  'MEX Overlay for the SB180 Version SM 2.0'
  2. ;
  3. REV    EQU    20        ;OVERLAY REVISION LEVEL
  4. ;
  5.     .HD64
  6. ;
  7. ;  Because the HD64180 adds several instructions not found in the Z80,
  8. ;  the ZAS (2.0 or later) assembler from Echelon is required for assembly.
  9. ;
  10. ;  MEX Overlay for the Micromint SB180, external smartmodems,
  11. ;  either Anchor or Hayes-compatible.
  12. ;  (Based on the Kaypro overlay version SM4.0)
  13. ;
  14. ;  NOTE: Because of a peculiarity in the way serial communication is
  15. ;  implemented in the HD64180 microprocessor, the modem DIP switches
  16. ;  must be set to assert carrier detect (DCD) high for the overlay to
  17. ;  function properly.  Consult your modem manual for the correct
  18. ;  setting.  No special cabling is required.  Because MEX114 does not
  19. ;  refer to the ZCPR3 termcap for terminal characteristics, the user
  20. ;  must alter the terminal-dependent macros CLRCRT and CLREND, which
  21. ;  currently are set up for an ADM-3A terminal.
  22. ;
  23. ;  A full-featured SET command processor is implemented.
  24. ;  The following table outlines the SET command options:
  25. ;
  26. ;        
  27. ;    SET Command
  28. ;
  29. ;    ANCHOR                Sets modem to respond to
  30. ;                    Anchor modem commands; although
  31. ;                    Anchor modems are considered Hayes
  32. ;                    compatible, there ARE a few
  33. ;                    differences which require special
  34. ;                    processing considerations.
  35. ;
  36. ;    DELAY <N>            Number of seconds to wait before
  37. ;                    aborting a call in progress
  38. ;
  39. ;    BAUD <RATE>            Set modem to Baud rate specified.
  40. ;                    Baud rates supported are 300, 600
  41. ;                    1200, 2400, 4800, 9600, 19200
  42. ;
  43. ;    MODE ANS <or> ORIG              Set modem to Originate mode or
  44. ;                    Set modem to Auto-answer mode
  45. ;    DIAL PULSE <or> TONE            Set modem to Tone dial mode
  46. ;                                       or to Pulse dialing mode
  47. ;    MONITOR    ON <or> OFF        Turn Hayes monitor ON/OFF
  48. ;    PARITY                          Set Parity to Odd, Even, or Off
  49. ;    STOPBITS                        Set number of Stop Bits to 1 or 2
  50. ;    LENGTH                 Set word length to 7 or 8
  51. ;
  52. ;    MANUAL ORIG <or> ANS        Place modem in active state and
  53. ;                    generate Answer or Originate
  54. ;                    carrier tone
  55. ;
  56. ;
  57. ;  This overlay includes the smartmodem dialing routine from
  58. ;  MXO-SM13.ASM by Ron Fowler which has been slightly modified
  59. ;  to allow programmable delay for answer.  (Note that this is
  60. ;  different from the "ATS7=nn".).
  61. ;
  62. ;  This overlay is intended to be fully compatible with the
  63. ;  MEX structure and should be readily upward compatible with
  64. ;  the predicted MEX 2.0.
  65. ;
  66. ;  Calling conventions for the various overlay entry points
  67. ;  are detailed more fully in the PMMI overlay (MXO-PMxx.ASM,
  68. ;  where xx=revision number).
  69. ;
  70. ;  History:
  71. ;
  72. ; SB180 versions:
  73. ;
  74. ;  01/20/86 2.0  Code cleaned up, routines condensed and regrouped
  75. ;         Set commands changed a bit. (Maintenance update)
  76. ;         It had to happen.
  77. ;                           -- Rob Milette, Montreal
  78. ;
  79. ;  10/09/85 1.0  Original SB180 version adapted from the Kaypro
  80. ;                version SM4.0.
  81. ;                           -- Ken Davidson
  82. ;
  83. ; Kaypro versions:
  84. ;
  85. ;  12/20/84 4.0  Fixed bugs in send break and initialization routines.
  86. ;                           -- Kim Levitt
  87. ;
  88. ;  11/25/84 3.0  Added SILENT option to quiet that damn beep-beep-
  89. ;         beep while dialing out. Speaker will come on at
  90. ;             end of dialing.
  91. ;                           -- Kim Levitt
  92. ;
  93. ;  9/19/84  2.0  Fixed bug in DISCON routine that left DTR/RTS off,
  94. ;         added "soft" abort (any key except ^C) to abort a
  95. ;         CALL in progress, but not repeats or next CALL cmds.
  96. ;                           -- Kim Levitt
  97. ;
  98. ;  9/9/84   1.0  The universal Kaypro overlay distributed previously
  99. ;         combined support for both the internal modem on the 4'84
  100. ;         and external smartmodems.  This overlay supports external
  101. ;          smartmodems only, and thus provides more flexibility for
  102. ;         expansion and adaptability to new MEX releases.  The only
  103. ;         additional feature of this overlay is support for 
  104. ;         entering Terminal mode via generation of manual Originate
  105. ;         or Answer carrier tones.  Clarity of documentation for
  106. ;                the SET command has also been improved.
  107. ;                        Terry Carroll
  108. ;
  109. ;
  110. ;  Credits:
  111. ;
  112. ;  M7KP-1 overlay structure by Irv Hoff
  113. ;  Smartmodem dialing routine by Ron Fowler
  114. ;  Parity, Length and Stopbits routines by Norm Saunders
  115. ;  MXO-KP overlay structure by John Smith
  116. ;  Art work by Terry Carroll
  117. ;  Bug fix/feature added by Kim Levitt
  118. ;  Adapted for the SB180 by Ken Davidson
  119. ;  Inevitable update by Rob Milette
  120. ;  Based on an idea by an inspired hacker
  121. ;  Music by John Williams
  122. ;  Directed by Stanley Kubrick
  123. ;
  124. ;----------------------------------------------------------------------
  125. ;
  126. ; Miscellaneous equates
  127. ;
  128. NO    EQU    0
  129. YES    EQU    0FFH
  130. ;
  131. TPA    EQU    100H
  132. ;
  133. CR    EQU    13
  134. LF    EQU    10
  135. TAB    EQU    9
  136. BELL    EQU    7
  137. ;
  138. ;
  139. ; Terminal-dependent macros (the SB180 can use any RS232-serial terminal)
  140. ;
  141. CLRCRT    MACRO    
  142.     DB    1AH        ;;byte or string to clear entire CRT
  143.     ENDM            ;;    alter as required (^Z)
  144. ;
  145. CLREND    MACRO    
  146.     DB    1BH,59H        ;;byte or string to clear to bottom of CRT
  147.     ENDM            ;;    alter as required (ESC Y)
  148. ;
  149. ; Don't change this... Have fun with the stuff up there...
  150. ;
  151. GETTBL    MACRO
  152.     PUSH    DE        ;used to get and save table address then
  153.     JP    SETTHAT        ;jump to routine for lookup table... huh?
  154.     ENDM
  155. ;
  156. ;
  157. ; Silent dial option:
  158. ;
  159. SILENT    EQU    YES        ;if YES, speaker is silenced during dial
  160. ;
  161. ; (NOTE: This may not work on all "smart" modems, it works on the
  162. ;  Hayes.. Set it to NO if it doesn't dial out ok...)
  163. ;
  164. ; HD64180 port definitions
  165. ;
  166. EXPORT    EQU    00H        ;base external port
  167. EXTCTL    EQU    EXPORT        ;external modem control port
  168. EXSTAT    EQU    EXPORT+4    ;external modem status port
  169. EXDATO    EQU    EXPORT+6    ;external modem data out port
  170. EXDATI    EQU    EXPORT+8    ;external modem data in port
  171. BAUDRP    EQU    EXPORT+2    ;external modem baud rate port
  172. ;
  173. ; HD64180 bit definitions
  174. ;
  175. MDRCVB    EQU    80H        ;modem receive bit (DAV)
  176. MDRCVR    EQU    80H        ;modem receive ready
  177. MDSNDB    EQU    02H        ;modem send bit
  178. MDSNDR    EQU    02H        ;modem send ready bit
  179. ;
  180. ; MEX Service Processor
  181. ;
  182. MEX    EQU    0D00H        ;address of the service processor
  183. INMDM    EQU    255        ;get char from port to A, CY=no more in 100 ms
  184. TIMER    EQU    254        ;delay 100ms * reg B
  185. TMDINP    EQU    253        ;B=# secs to wait for char, cy=no char
  186. CHEKCC    EQU    252        ;check for ^C from KBD, Z=present
  187. SNDRDY    EQU    251        ;test for modem-send ready
  188. RCVRDY    EQU    250        ;test for modem-receive ready
  189. SNDCHR    EQU    249        ;send a character to the modem (after sndrdy)
  190. RCVCHR    EQU    248        ;recv a char from modem (after rcvrdy)
  191. LOOKUP    EQU    247        ;table search: see CMDTBL comments for info
  192. PARSFN    EQU    246        ;parse filename from input stream
  193. BDPARS    EQU    245        ;parse baud-rate from input stream
  194. SBLANK    EQU    244        ;scan input stream to next non-blank
  195. EVALA    EQU    243        ;evaluate numeric from input stream
  196. LKAHED    EQU    242        ;get nxt char w/o removing from input
  197. GNC    EQU    241        ;get char from input, cy=1 if none
  198. ILP    EQU    240        ;inline print
  199. DECOUT    EQU    239        ;decimal output
  200. PRBAUD    EQU    238        ;print baud rate
  201. ;
  202. CONOUT    EQU    2        ;simulated BDOS function 2: console char out
  203. PRINT    EQU    9        ;simulated BDOS function 9: print string
  204. INBUF    EQU    10        ;input buffer, same structure as BDOS 10
  205. ;
  206. DCONIO    EQU    6        ;BDOS Direct Console IO function #
  207. DCONIN    EQU    0FFH        ;BDOS DCONIO Flag for input
  208. BDOS    EQU    5        ;BDOS Function caller
  209. ;
  210. ;
  211.     ORG    TPA        ;we begin
  212. ;
  213.     DS    3        ;MEX has a JMP START here
  214. ;
  215.     DS    2        ;not used by MEX
  216. TPULSE:    DB    'T'        ;T=touch, P=pulse (Used by this overlay)
  217. CLOCK:    DB    61        ;clock speed x .1, up to 25.5 mhz.
  218. MSPEED:    DB    1        ;sets display time for sending a file
  219.                 ;0=110    1=300  2=450  3=600  4=710
  220.                 ;5=1200 6=2400 7=4800 8=9600 9=19200
  221. BYTDLY:    DB    5        ;default time to send character in
  222.                 ;terminal mode file transfer (0-9)
  223.                 ;0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms
  224. CRDLY:    DB    5        ;end-of-line delay after CRLF in terminal
  225.                 ;mode file transfer for slow BBS systems
  226.                 ;0=0 delay, 1=100 ms, 5=500 ms, 9=900 ms
  227. COLUMS:    DB    5        ;number of directory columns
  228. SETFL:    DB    YES        ;yes=user-defined SET command
  229. SCRTST:    DB    YES        ;yes=if home cursor and clear screen
  230.                 ;routine at CLRSCRN
  231.     DB    0        ;was once ACKNAK, now spare
  232. BAKFLG:    DB    YES        ;yes=make .BAK file
  233. CRCDFL:    DB    YES        ;yes=default to CRC checking
  234.                 ;no=default to Checksum checking
  235. TOGCRC:    DB    YES        ;yes=allow toggling of Checksum to CRC
  236. CVTBS:    DB    NO        ;yes=convert backspace to rub
  237. TOGLBK:    DB    YES        ;yes=allow toggling of bksp to rub
  238. ADDLF:    DB    NO        ;no=no LF after CR to send file in
  239.                 ;terminal mode (added by remote echo)
  240. TOGLF:    DB    YES        ;yes=allow toggling of LF after CR
  241. TRNLOG:    DB    NO        ;yes=allow transmission of logon
  242.                 ;write logon sequence at location LOGON
  243. SAVCCP:    DB    YES        ;yes=do not overwrite CCP
  244. LOCNXT:    DB    NO        ;yes=local cmd if EXTCHR precedes
  245.                 ;no=not local cmd if EXTCHR precedes
  246. TOGLOC:    DB    YES        ;yes=allow toggling of LOCNXTCHR
  247. LSTTST:    DB    YES        ;yes=allow toggling of printer on/off
  248.                 ;in terminal mode. Set to no if using
  249.                 ;the printer port for the modem
  250. XOFTST:    DB    NO        ;yes=allow testing of XOFF from remote
  251.                 ;while sending a file in terminal mode
  252. XONWT:    DB    NO        ;yes=wait for XON after sending CR while
  253.                 ;transmitting a file in terminal mode    
  254. TOGXOF:    DB    YES        ;yes=allow toggling of XOFF testing
  255. IGNCTL:    DB    NO         ;yes=do not send control characters
  256.                 ;above CTL-M to CRT in terminal mode
  257.                 ;no=send any incoming CTL-char to CRT
  258. EXTRA1:    DB    0        ;for future expansion
  259. EXTRA2:    DB    0        ;for future expansion
  260. BRKCHR:    DB    '@'-40H        ;^@ = Send a 300 ms. break tone
  261. NOCONN:    DB    'N'-40H        ;^N = Disconnect from phone line
  262. LOGCHR:    DB    'L'-40H        ;^L = Send logon
  263. LSTCHR:    DB    'P'-40H        ;^P = Toggle printer
  264. UNSVCH:    DB    'R'-40H        ;^R = Close input text buffer
  265. TRNCHR:    DB    'T'-40H        ;^T = Transmit file to remote
  266. SAVCHR:    DB    'Y'-40H        ;^Y = Open input text buffer
  267. EXTCHR:    DB    '^'-40H        ;^^ = Send next character
  268. ;
  269.     DS    2        ;not used
  270. ;
  271. ; Low-level modem I/O routines.
  272. ;
  273. INCTL1:    JP    INC        ;in modem control port
  274.     DB    0,0,0,0,0,0,0    ;spares if needed for non-PMMI
  275. ;
  276. OTDATA:    JP    OUTD        ;out modem data port
  277.     DB    0,0,0,0,0,0,0    ;spares if needed for non=PMMI
  278. ;
  279. INPORT: JP    IND        ;in modem data port
  280.     DB    0,0,0,0,0,0,0    ;spares if needed for non-PMMI
  281. ;
  282. ; Bit-test routines. 
  283. ;
  284. MASKR:    AND    MDRCVB        ;bit to test for receive ready
  285.     RET
  286. TESTR:    CP    MDRCVR        ;value of receive bit when ready
  287.     RET
  288. MASKS:    AND    MDSNDB        ;bit to test for send ready
  289.     RET
  290. TESTS:    CP    MDSNDR        ;value of send bit when ready
  291.     RET
  292. ;
  293.     DS    12
  294. ;
  295. LOGON:    DS    2        ;needed for MDM compat, not ref'd by MEX
  296. DIALV:    JP    DIAL
  297. DISCV:    JP    DISCON
  298. GOODBV:    JP    GOODBYE        ;called before exit to CP/M
  299. INMODV:    JP    NITMOD        ;initialization. Called at cold-start
  300. NEWBDV:    JP    PBAUD        ;set baud rate
  301. NOPARV:    RET            ;set modem for no-parity
  302.     NOP
  303.     NOP
  304. PARITV:    RET            ;set modem parity
  305.     NOP
  306.     NOP
  307. SETUPV:    JP    SETCMD        ;SET cmd: jump to a RET if you don't write SET
  308. SPMENV:    RET            ;not used with MEX
  309.     NOP
  310.     NOP
  311. VERSNV:    JP    SYSVER        ;Overlay's voice in the sign-on message
  312. BREAKV:    JP    SBREAK        ;send a break
  313. ;
  314. ; MDM calls supported in MEX 1.0 but not recommended for use.
  315. ;
  316. ILPRTV:    DS    3        ;replace with MEX function 9
  317. INBUFV:    DS    3        ;replace with MEX function 10
  318. ILCMPV:    DS    3        ;replace with table lookup funct. 247
  319. INMDMV:    DS    3        ;replace with MEX function 255
  320. NXSCRV:    DS    3        ;not supported by MEX (returns w/no action)
  321. TIMERV:    DS    3        ;replace with MEX function 254
  322. ;
  323. CLREOS:    LD    DE,EOSMSG
  324.     LD    C,PRINT
  325.     CALL    MEX
  326.     RET
  327. ;
  328. CLS:    LD    DE,CLSMSG
  329.     LD    C,PRINT
  330.     CALL    MEX
  331.     RET
  332. ;------------------------------------------------------------
  333. ;
  334. ; end of fixed area
  335. ;
  336. ;------------------------------------------------------------
  337. ;
  338. ; Low level modem routine area
  339. ;
  340. INC:    IN0    A,(EXSTAT)
  341.     RET
  342. ;
  343. IND:    IN0    A,(EXDATI)
  344.     RET
  345. ;
  346. OUTD:    OUT0    (EXDATO),A
  347.     RET
  348. ;
  349. ; Print out the overlay version
  350. ;
  351. SYSVER:      CALL    MILP
  352.       DB    'SB180 Overlay (Hitachi HD64180)'
  353.       DB    CR,LF,' Hayes Smartmodem Version SM'
  354.       DB    REV/10+'0'
  355.       DB    '.'
  356.       DB    REV MOD 10+'0'
  357.       DB    CR,LF,LF
  358.       DB    0
  359.       RET
  360. ;
  361. ; Break, disconnect and goodbye routines
  362. ;  (The HD64180 doesn't support break transmit or receive.)
  363. ;
  364. SBREAK:      RET
  365. ;
  366. ; Disconnect Routine
  367. ;
  368. DISCON:      LD    A,(MODMTYP)
  369.       OR   A
  370.       JP    Z,DISCONH
  371. ;
  372. ; Disconnect Anchor Modem.
  373. ; Anchor does not respond to DTR so the only way to disconnect is through
  374. ; standard Smartmodem disconnect commands
  375. ;
  376. DISCONA:  LD    B,20    
  377.       CALL  MTIME        ;wait 2 seconds
  378.       LD    HL,SMATN        ;send '+++'
  379.       CALL    SMSEND
  380.       LD    B,40            ;wait 4 more seconds (Anchor is slow)
  381.       CALL  MTIME
  382.       LD    HL,SMDISC    ;send 'ATH'
  383.       CALL    SMSEND
  384.       LD    B,10        ;wait 1 second
  385.       CALL  MTIME
  386.       RET
  387. ;
  388. ; Disconnect Hayes, etc.
  389. ;
  390. DISCONH:  IN0    A,(EXTCTL)    ;Get current setting
  391.       OR    10H        ;Turn off DTR/RTS
  392.       OUT0    (EXTCTL),A
  393.       LD    B,10        ;DELAY 1 SEC.
  394.       CALL  MTIME
  395.       IN0    A,(EXTCTL)
  396.       AND    0EFH        ;Turn 'em back on again
  397.       OUT0    (EXTCTL),A
  398.       RET
  399. ;
  400. ; GOODBYE routines are called by MEX prior to exit to CP/M
  401. ;
  402. GOODBYE:  RET            ;NOTE: EXIT TO CP/M WITH NO CHANGE TO
  403.                 ;CONNECT STATUS OR SETTINGS (PARITY, ETC)
  404. ;
  405. ; Initialize RS-232 port, Smartmodem, and default modes.
  406. ;
  407.  
  408. ;NITMOD:   CALL    INC        ;SEE IF MODEM IS CONNECTED, I.E., RETURNING
  409. ;      AND    08H        ;   TO ACTIVE MODEM FROM CPM
  410. ;      RET    NZ            ;SKIP IF CONNECTED
  411. NITMOD:      CALL  NITSIO
  412.       LD    A,(MSPEED)    ;GET DEFAULT BAUD RATE
  413.       CALL    PBAUD        ;SET IT
  414.       LD    A,(MONFLG)    ;GET MONITOR DEFAULT
  415.       OR    A
  416.       LD    A,'0'        ;SPEAKER OFF
  417.       JP    Z,NITMOD4
  418.       LD    A,'1'        ;SPEAKER ON
  419. NITMOD4:  LD    (SMINIT+3),A    ;PUT IT IN SMINIT STRING
  420.       LD    A,(ANSFLG)    ;GET MODE DEFAULT
  421.       OR    A
  422.       LD    A,'0'        ;ORIGINATE
  423.       JP    Z,NITMOD5
  424.       LD    A,'1'        ;ANSWER
  425. NITMOD5:  LD    (SMINIT+8),A    ;PUT IT IN SMINIT STRING
  426.       LD    HL,SMINIT
  427. SINIT:      CALL    SMSEND        ;SEND THE INIT STRING
  428. SMTLP1:      LD    C,INMDM        ;WAIT FOR MODEM RESPONSE
  429.       CALL    MEX
  430.       JP    NC,SMTLP1    ;EAT EVERYTHING UNTIL SILENCE FOR
  431.       RET            ; 100 MSEC
  432. ;
  433. ;    Initialize the HD64180 chip
  434. ;
  435. NITSIO:      IN0    A,(EXTCTL)
  436.       AND    0EFH        ;Turn on RTS
  437.       OR    68H        ;Enable xmit, recv, clr errors
  438.       OUT0    (EXTCTL),A
  439.       RET
  440. ;
  441. ; Set command processor
  442. ;
  443. SETCMD:      LD    C,SBLANK    ;ANY ARGUMENTS?
  444.       CALL  MEX
  445.       JP    C,SETSHO    ;IF NOT, DISPLAY DEFAULT(S)
  446.       LD    DE,CMDTBL
  447.           LD    C,LOOKUP
  448.       CALL  MEX        ;PARSE THE ARGUMENT
  449.       PUSH    HL        ;SAVE ANY PARSED ARGUMENTS ON STACK
  450.       RET    NC        ;IF WE HAVE ONE, RETURN TO IT
  451.       POP    HL        ;OOPS, INPUT NOT FOUND IN TABLE
  452. SETERR:      LD    DE,SETEMS
  453.       LD    C,PRINT
  454.       CALL    MEX
  455.       CALL  CRLF
  456.       RET
  457. SETEMS:      DB    CR,LF,BELL,'SET command error',CR,'$'
  458. ;
  459. ; Argument table
  460. ;
  461. CMDTBL:   DB    '?'+80H            ; HELP
  462.       DW    SETHELP
  463.       DB    'MOD','E'+80H        ; SET AUTO-ANSWER/ORIGINATE MODE
  464.       DW    STMODE
  465.       DB    'DIA','L'+80H        ; SET PULSE/TONE DIALING
  466.       DW    DIALMOD
  467.       DB    'MONITO','R'+80H    ; SET MONITOR OFF/ON
  468.       DW    STMON
  469.       DB    'BAU','D'+80H        ; SET BAUD
  470.       DW    STBAUD
  471.       DB    'DELA','Y'+80H        ; SET DELAY
  472.       DW    DELAY
  473.       DB    'PARIT','Y'+80H        ; SET PARITY
  474.       DW    STPRTY
  475.       DB    'STOPBIT','S'+80H    ; SET STOPBITS
  476.       DW    STSTOP
  477.       DB    'LENGT','H'+80H        ; SET LENGTH
  478.       DW    STBITS
  479.       DB    'ANCHO','R'+80H        ; SET TO ANCHOR MODEM
  480.       DW    SETANCH
  481.       DB    'MANUA','L'+80H        ; SET TO MANUAL MODE
  482.       DW    MANUAL
  483.       DB    0            ;TABLE TERMINATOR
  484. ;
  485. ;
  486. ;  "SET (no args): PRINT CURRENT STATISTICS
  487. ;
  488. SETSHO:      CALL    MILP
  489.       DB    CR,LF,0
  490.       CALL    SYSVER
  491.       CALL  MILP
  492.       DB    'SET values:',CR,LF,0
  493.       CALL    CRLF
  494.       CALL  MDMSHOW
  495.       CALL    CRLF
  496.       CALL    MDSHOW
  497.       CALL    CRLF
  498.       CALL    TPSHOW
  499.       CALL    CRLF
  500.       CALL    BDSHOW
  501.       CALL  CRLF
  502.       CALL    DLSHOW
  503.       CALL    CRLF
  504.       CALL    MONSHO
  505.       CALL  CRLF
  506.       CALL  SHPRTY
  507.       CALL    CRLF
  508.       CALL    SHSTOP
  509.       CALL    CRLF
  510.       CALL  SHBITS
  511.       CALL    CRLF
  512.       CALL  CRLF
  513.       RET
  514. ;
  515. ; "SET ?" processor
  516. ;
  517. SETHELP:  CALL    MILP
  518.       DB    CR,LF,'SB180 (Hitachi HD64180) Smartmodem SM Overlay'
  519.       DB    CR,LF,LF,'SET command options:',CR,LF
  520.       DB    CR,LF,TAB,'ANCHOR    - Set modem for Anchor modem commands'
  521.       DB    CR,LF,TAB,'MODE      - ORIG, Originate mode '
  522.       DB    '(Disable auto-answer)'
  523.       DB    CR,LF,TAB,'          - ANS, Set modem to auto-answer mode'
  524.       DB    CR,LF,TAB,'DIAL      - TONE, Set modem for Touchtone dialing'
  525.       DB    CR,LF,TAB,'          - PULSE, Set modem to Pulse dialing'
  526.       DB    CR,LF,TAB,'DELAY     - <N> seconds to wait for answer'
  527.       DB    CR,LF,TAB,'PARITY    - OFF, EVEN or ODD'
  528.       DB    CR,LF,TAB,'STOPBITS  - 1 or 2, Set number of stop bits'
  529.       DB    CR,LF,TAB,'LENGTH    - 7 or 8, Set word length'
  530.       DB    CR,LF,TAB,'MONITOR   - ON or OFF, Modem monitor speaker'
  531.       DB    CR,LF,TAB,'BAUD      - 300, 600, 1200, 2400, '
  532.       DB    '4800, 9600 or 19200 bps'
  533.       DB    CR,LF,TAB,'MANUAL    - ORIG or ANS Manual Answer '
  534.       DB    'or Originate carrier'
  535.       DB    CR,LF,LF,0
  536.       RET
  537. ;
  538. ;  Common code segment used for routines using lookup tables..
  539. ;
  540. SETTHAT:  LD    C,SBLANK    ;check for code... What?
  541.       CALL    MEX        ;
  542.       POP    DE        ;get ADDR of table, will get destroyed
  543.                 ;if error detected on JP below
  544.       JP    C,SETERR    ;if none, print error
  545.       LD    C,LOOKUP    ;check for syntax
  546.       CALL    MEX
  547.       PUSH    HL        ;match found, go do it!
  548.       RET    NC        ;
  549.       POP    HL        ;no match: fix stack and
  550.       JP    SETERR        ;  print error
  551. ;
  552. ; SET ANCHOR processor
  553. ;
  554. SETANCH:  LD   A,0FFH
  555.       LD   (MODMTYP),A
  556.       LD   A,041H
  557.       LD    (DIALAB),A
  558.       LD   A,00H
  559.       LD   (MONFLG),A
  560. MDMSHOW:  CALL    MILP
  561.       DB    'Modem:  ',0
  562.       LD    A,(MODMTYP)
  563.       OR    A
  564.       JP    Z,MDMSHOH    
  565.       CALL    MILP
  566.       DB    'Anchor Modem',0
  567.       RET
  568. MDMSHOH:  CALL    MILP
  569.       DB    'Hayes Smartmodem',0
  570.       RET
  571. ;
  572. ; Set manual processor
  573. ; Note: manual mode does not change the auto-answer status of the modem
  574. ;
  575. MANUAL:      LD    DE,MANTBL    ;check for proper syntax
  576.       GETTBL
  577. ;***
  578. ;
  579. MANORIG:  LD    B,20        ;FORCE 2 SECOND DELAY ON ORIGINATE END
  580.       CALL  MTIME
  581.       LD    HL,SMATD    ;SEND OUT 'ATD'
  582.       CALL    SINIT
  583.       CALL  MILP
  584.       DB    CR,'Manual originate mode - Carrier sent',CR,LF,0
  585.       RET
  586. MANANS:      LD    HL,SMATA    ;SEND OUT 'ATA'
  587.       CALL    SINIT
  588.       CALL  MILP
  589.       DB    CR,'Manual answer mode - Carrier sent',CR,LF,0
  590.       RET
  591. ;
  592. SMATD:      DB    'ATD',CR,0
  593. SMATA:      DB    'ATA',CR,0
  594. ;
  595. ; Manual originate / answer command table
  596. ;
  597. MANTBL:   DB    'ORI','G'+80H        ;MANUAL ORIGINATE MODE
  598.       DW    MANORIG
  599.       DB    'AN','S'+80H        ;MANUAL ANSWER MODE
  600.       DW    MANANS
  601.       DB    0
  602. ;
  603. ; "SET BAUD" processor
  604. ;
  605. STBAUD:      LD    C,BDPARS    ;FUNCTION CODE: PARSE A BAUDRATE
  606.       CALL    MEX        ;LET MEX LOOK UP CODE
  607.       JP    C,SETERR    ;JUMP IF INVALID CODE
  608.       CALL    PBAUD        ;NO, TRY TO SET IT
  609.       JP    C,SETERR    ;IF NOT ONE OF OURS, BOMB OUT
  610. BDSHOW:   CALL    MILP
  611.       DB    'Modem Speed:  ',0
  612.       LD    A,(MSPEED)    ;GET CURRENT BAUD RATE
  613.       LD    C,PRBAUD    ;LET MEX PRINT IT
  614.       CALL    MEX
  615.       RET 
  616. ;
  617. ; This routine sets baud rate passed as MSPEED code in A.
  618. ; Returns CY=1 if baud rate not supported.
  619. ;
  620. PBAUD:      PUSH    HL        ;DON'T ALTER ANYBODY
  621.       PUSH    DE
  622.       PUSH     BC
  623.       LD    E,A        ;MSPEED CODE TO DE
  624.       LD    D,0
  625.       LD    HL,BAUDTB    ;OFFSET INTO TABLE
  626.       ADD    HL,DE
  627.       LD    A,(HL)        ;FETCH CODE
  628.       OR    A        ;0 MEANS UNSUPPORTED CODE
  629.       SCF            ;PREP CARRY IN CASE UNSUPPORTED
  630.       JP    Z,PBEXIT    ;EXIT IF BAD
  631.       OUT0    (BAUDRP),A    ;IF OK, SET IT
  632.       LD    A,E        ;GET MSPEED CODE BACK
  633.       LD    (MSPEED),A    ;SET IT
  634.       OR    A        ;RETURN NO ERRORS
  635. PBEXIT:      POP    BC
  636.       POP    DE
  637.       POP    HL
  638.       RET
  639. ;
  640. BAUDTB:      DB    0        ;110 (not supported)
  641.       DB    0DH        ;300
  642.       DB    0        ;450 (not supported)
  643.       DB    0CH        ;600
  644.       DB    0        ;710 (not supported)
  645.       DB    0BH        ;1200
  646.       DB    0AH        ;2400
  647.       DB    09H        ;4800
  648.       DB    08H        ;9600
  649.       DB    01H        ;19200 
  650. ;
  651. ; SET modem status, to enable or disable Auto-answer and originate
  652. ;
  653. STMODE:      LD    DE,MODETBL    ;check for proper syntax
  654.       GETTBL
  655. ;***
  656. ;
  657. MODETBL:  DB    'ORI','G'+80H    ;"set monitor off"
  658.       DW    ORIG
  659.       DB    'AN','S'+80H    ;"set monitor on"
  660.       DW    ANS
  661.       DB    0        ;<<== end of monitor table
  662. ;
  663. ORIG:      XOR    A
  664.       LD    (ANSFLG),A    ;SET ORIG FLAG
  665.       LD    HL,SMO        ;SEND OUT ATS0=0
  666.       CALL    SINIT
  667.       JP    MDSHOW
  668. ;
  669. SMO:      DB    'ATS0=0',CR,0
  670. SMA:      DB    'ATS0=1',CR,0
  671. ;
  672. ANS:      LD    A,0FFH
  673.       LD    (ANSFLG),A    ;SET ANS FLAG
  674.       LD    HL,SMA        ;SEND OUT ATS0=1
  675.       CALL    SINIT
  676. ;
  677. MDSHOW:      LD    A,(ANSFLG)
  678.       OR    A
  679.       JP    Z,MDORIG        
  680.       CALL    MILP
  681.       DB    'Auto-answer mode (Originate disabled)',0
  682.       RET
  683. MDORIG:      CALL    MILP
  684.       DB    'Originate mode (Auto-answer disabled)',0
  685.       RET
  686. ;
  687. ;
  688. ; Monitor control processor
  689. ;
  690. STMON:      LD    DE,MONTBL    ;check for proper syntax
  691.       GETTBL
  692. ;***
  693. ;
  694. MONTBL:      DB    'OF','F'+80H    ;"set monitor off"
  695.       DW    QUIET
  696.       DB    'O','N'+80H    ;"set monitor on"
  697.       DW    MONIT
  698.       DB    0        ;<<== end of monitor table
  699. ;
  700. QUIET:       XOR    A        ;Monitor off
  701.       LD    (MONFLG),A
  702.       LD    HL,SMQT
  703.       CALL    SINIT
  704.       JP    MONSHO
  705. ;
  706. MONIT:       LD    A,0FFH        ;Monitor on
  707.       LD    (MONFLG),A
  708.       LD    HL,SMMON
  709.       CALL    SINIT
  710. ;
  711. MONSHO:      CALL    MILP
  712.       DB    'Monitor Speaker ',0
  713.       LD    A,(MONFLG)
  714.       OR    A
  715.       JP    Z,MONOFF
  716.       CALL    MILP
  717.       DB    'ON',0
  718.       RET
  719. ;
  720. MONOFF:      CALL    MILP
  721.       DB    'OFF',0
  722.       RET
  723. ;
  724. SMQT:      DB    'ATM0',CR,0
  725. SMMON:      DB    'ATM1',CR,0
  726. ;
  727. ; Set dial processor
  728. ;
  729. DIALMOD:  LD    DE,DIALTBL
  730.       GETTBL
  731. ;
  732. DIALTBL:  DB    'PULS','E'+80H    ;"set pulse dial mode"
  733.       DW    STPULSE
  734.       DB    'TON','E'+80H    ;"set touchtone dial mode"
  735.       DW    STTONE
  736.       DB    0        ;<<== end of Dial mode table
  737. ;
  738. STTONE:      LD    B,'T'
  739.       JP    SDIAL1
  740. ;
  741. STPULSE:  LD    B,'P'
  742. ;
  743. SDIAL1:   LD    A,(TPULSE)
  744.       CP    B
  745.       JP    Z,TPSHOW
  746.       LD    A,B
  747.       LD    (TPULSE),A
  748.       CP    'P'
  749.       LD    A,01010000B    ;PULSE DIAL
  750.       JP    Z,SDIAL2
  751.       LD    A,01000000B    ;TONE DIAL
  752. ;
  753. SDIAL2:   LD    (DIALWD),A
  754. ;
  755. TPSHOW:      CALL    MILP
  756.       DB    'Dialing Mode:  ',0
  757.       LD    A,(DIALWD)
  758.       AND    00010000B
  759.       JP    Z,TPTONE
  760.       CALL    MILP
  761.       DB    'Pulse',0
  762.       RET
  763. TPTONE:      CALL    MILP
  764.       DB    'Touchtone',0      
  765.       RET
  766. ;
  767. ; Set delay processor
  768. ;
  769. DELAY:      LD    C,EVALA
  770.       CALL    MEX
  771.       LD    A,H
  772.       OR    A
  773.       JP    NZ,SETERR
  774.       LD    A,L
  775.       LD    (NDELAY),A
  776. DLSHOW:      CALL    MILP
  777.       DB    'Answer Delay is ',0
  778.       LD    A,(NDELAY)
  779.       LD    L,A
  780.       LD    H,0
  781.       LD    C,DECOUT
  782.       CALL    MEX
  783.       CALL    MILP
  784.       DB    ' seconds',0
  785.       RET
  786. ;
  787. ;    SET PARITY command: reset transmit/receive parity
  788. ;
  789. ;        Parity is controlled by bit 1 of EXTCTL and
  790. ;        bit 4 of BAUDRP as follows:
  791. ;
  792. ;                BAUDRP       EXTCTL
  793. ;           Parity    Bit 4       Bit 1
  794. ;                 Off          -          0
  795. ;              Odd      1         1
  796. ;             Even      0         1
  797. ;
  798. STPRTY:      LD    DE,PARTBL    ;check for proper syntax
  799.       GETTBL
  800. ;***
  801. ;
  802. PROFF:      IN0    A,(EXTCTL)
  803.       AND    0FDH        ;reset bit 1
  804.       PUSH    AF        ;save
  805.       IN0    A,(BAUDRP)    ;just load other reg
  806.       JP    PARTB1        ;
  807. PREVEN:      IN0    A,(EXTCTL)
  808.       OR    02H        ;set bit 1
  809.       PUSH    AF        ;save
  810.       IN0    A,(BAUDRP)
  811.       AND    0EFH        ;reset bit 4
  812.       JP    PARTB1        ;
  813. PRODD:      IN0    A,(EXTCTL)
  814.       OR    02H        ;set bit 1
  815.       PUSH    AF        ;save
  816.       IN0    A,(BAUDRP)
  817.       OR    10H        ;set bit 4
  818. PARTB1:      OUT0    (BAUDRP),A    ;set even/odd
  819.       POP    AF
  820.       OUT0    (EXTCTL),A    ;set parity/noparity
  821.       CALL    NITSIO        ;re-initialize the USART
  822.       CALL    SHPRTY        ;print the result
  823.       RET             ;
  824. SHPRTY:      CALL    MILP        ;display parity
  825.       DB    'Parity:  ',0
  826.       IN0    A,(EXTCTL)    ;
  827.       AND    02H        ;test bit 1
  828.       CP    0        ;if bit1=0 then parity off
  829.       JP    NZ,SHPRT1    ;
  830.       CALL    MILP        ;
  831.       DB    'Off',0        ;
  832.       RET
  833. SHPRT1:      IN0    A,(BAUDRP)    ;
  834.       AND    10H        ;test bit 4
  835.       CP    0        ;if bit4=0 then parity even
  836.       JP    Z,SHPRT2    ;
  837.       CALL    MILP        ;
  838.       DB    'Odd',0        ;
  839.       RET            ;
  840. SHPRT2:      CALL    MILP        ;
  841.       DB    'Even',0    ;
  842.       RET
  843. ;
  844. ;    SET PARITY command table
  845. ;
  846. PARTBL:      DB    'OF','F'+80H    ;"set parity off"
  847.       DW    PROFF
  848.       DB    'EVE','N'+80H    ;"set parity even"
  849.       DW    PREVEN
  850.       DB    'OD','D'+80H    ;"set parity odd"
  851.       DW    PRODD
  852.       DB    0        ;<<== end of parity table
  853. ;
  854. ;    SET STOPBITS command: reset number of stop bits
  855. ;
  856. ;        The number of stop bits is controlled by bit
  857. ;        0 of EXTCTL, as follows:
  858. ;
  859. ;            Stop bits       Bit 0
  860. ;            1         0
  861. ;            2         1
  862. ;
  863. ;
  864. STSTOP:      LD    DE,STPTBL    ;check for proper syntax
  865.       GETTBL
  866. ;***
  867. ;
  868. STOP01:      IN0    A,(EXTCTL)    ;get ctrl register
  869.       AND    0FEH        ;reset bit 0
  870.       JP    STSTP1        ;
  871. STOP02:      IN0    A,(EXTCTL)    ;
  872.       OR    01H        ;set bit 0
  873. STSTP1:      OUT0    (EXTCTL),A    ;
  874.       CALL    NITSIO        ;
  875.       CALL    SHSTOP        ;print the result
  876.       RET
  877. SHSTOP:      CALL    MILP        ;display stop-bits
  878.       DB    'Stop bits:  ',0
  879.       IN0    A,(EXTCTL)    ;
  880.       AND    01H        ;test bit 0
  881.       CP    0        ;if bit0=0 then 1
  882.       JP    NZ,SHSTP1    ;
  883.       CALL    MILP        ;
  884.       DB    '1',0        ;
  885.       RET
  886. SHSTP1:      CALL    MILP        ;
  887.       DB    '2',0        ;
  888.       RET
  889. ;
  890. ;    SET STOPBITS command table
  891. ;
  892. STPTBL:      DB    '1'+80H        ;"set stop 1"
  893.       DW    STOP01
  894.       DB    '2'+80H        ;"set stop 2"
  895.       DW    STOP02
  896.       DB    0        ;<<== End of stop-bits table
  897. ;
  898. ;    SET LENGTH command: set bits per character
  899. ;
  900. ;        The number of bits per character is controlled by
  901. ;        bit 2 of EXTCTL as follows:
  902. ;
  903. ;            BPC        Bit 2
  904. ;             7          0
  905. ;             8          1
  906. ;
  907. STBITS:      LD    DE,BITTBL    ;check for proper syntax
  908.       GETTBL
  909. ;***
  910. ;
  911. BIT7:      IN0    A,(EXTCTL)    ;
  912.       AND    0FBH        ;reset bit 2
  913.       JP    STBTS1        ;
  914. BIT8:      IN0    A,(EXTCTL)    ;
  915.       OR    04H        ;set bit 2
  916. STBTS1:      OUT0    (EXTCTL),A    ;
  917.       CALL    NITSIO        ;
  918.       CALL    SHBITS        ;print the result
  919.       RET
  920. SHBITS:      CALL    MILP        ;display bits/char
  921.       DB    'Bits/char:  ',0
  922.       IN0    A,(EXTCTL)    ;
  923.       AND    04H        ;test bit 2
  924.       CP    0        ;if bit2=0 then 7 bpc
  925.       JP    Z,SHBTS1    ;
  926.       CALL    MILP        ;
  927.       DB    '8',0        ;
  928.       RET            ;
  929. SHBTS1:      CALL    MILP        ;
  930.       DB    '7',0        ;
  931.       RET            ;
  932. ;
  933. ;    SET LENGTH command table
  934. ;
  935. BITTBL:      DB    '7'+80H        ;"set bits 7"
  936.       DW    BIT7
  937.       DB    '8'+80H        ;"set bits 8"
  938.       DW    BIT8
  939.       DB    0        ;<<== end of bpc table
  940. ;
  941. ; Smartmodem dialing routine from Ron Fowler's MXO-SM10.ASM
  942. ;
  943. DIAL:      LD    HL,(DIALPT)    ;FETCH POINTER
  944.       CP    254        ;START DIAL?
  945.       JP    Z,STDIAL    ;JUMP IF SO
  946.       CP    255        ;END DIAL?
  947.       JP    Z,ENDIAL    ;JUMP IF SO
  948. ;
  949. ; Not start or end sequence, must be a digit to be sent to the modem
  950. ;
  951.       LD    (HL),A        ;PUT CHAR IN BUFFER
  952.       INC    HL        ;ADVANCE POINTER
  953.       LD    (DIALPT),HL    ;STUFF PNTR
  954.       RET            ;ALL DONE
  955. ;
  956. ; Here on a start-dial sequence
  957. ;
  958. STDIAL:   LD    HL,DIALBF    ;SET UP BUFFER POINTER
  959.       LD    (DIALPT),HL
  960.       RET
  961. ;
  962. ; Here on an end-dial sequence
  963. ;
  964. ENDIAL:
  965. ;
  966.        IF    SILENT
  967.       LD    A,(MONFLG)    ;check monitor speaker flag
  968.       OR    A        ;to see if on or off
  969.       JP    Z,LEAVOFF    ;if off, leave it off
  970.       LD    (HL),'M'    ;if we silenced speaker to dial,
  971.       INC    HL        ;turn it on again
  972.       LD    (HL),'1'
  973.       INC    HL
  974. LEAVOFF:
  975.        ENDIF
  976. ;
  977.       LD    (HL),CR        ;STUFF END-OF-LINE INTO BUFFER
  978.       INC    HL        ;FOLLOWED BY TERMINATOR
  979.       LD    (HL),0
  980.       LD    A,(TPULSE)    ;GET OVERLAY'S TOUCH-TONE FLAG
  981. ;
  982.        IF    SILENT
  983.       LD    (SMDIAL+5),A
  984.        ENDIF
  985. ;
  986.        IF    NOT SILENT
  987.       LD    (SMDIAL+3),A    ;PUT INTO STRING
  988.        ENDIF
  989. ;
  990.       LD    HL,SMDIAL    ;POINT TO DIALING STRING
  991.       CALL    SMSEND        ;SEND IT
  992. ;
  993. WAITSM:      LD    C,INMDM
  994.       CALL    MEX        ;CATCH ANY OUTPUT FROM THE MODEM
  995.       JP    NC,WAITSM    ;LOOP UNTIL NO MORE CHARACTERS
  996. ;
  997. ; THE FOLLOWING LOOP WAITS FOR A RESULT FROM THE MODEM.
  998. ;
  999. RESULT:      LD    A,(NDELAY)    ;GET DELAY COUNT
  1000.       LD    C,A
  1001. SMWLP:      PUSH    BC
  1002.       LD    B,1        ;CHECK FOR A CHAR, UP TO 1 SEC WAIT
  1003.       LD    C,TMDINP    ;DO TIMED INPUT
  1004.       CALL    MEX
  1005.       POP    BC
  1006.       JP    NC,SMTEST    ;JUMP IF MODEM HAD A CHAR
  1007.       PUSH    BC        ;NO, TEST FOR CONTROL-C FROM CONSOLE
  1008.       LD    C,DCONIO
  1009.       LD    E,DCONIN    ;USE BDOS DIRECT CONSOLE INPUT FUNCTION
  1010.       CALL    BDOS
  1011.       POP    BC
  1012.       CP    'C'-40H        ;^C?
  1013.       JP    NZ,SMNEXT    ;IF NOT, JUMP
  1014.       CALL    SMDMOFF        ;YES, SHUT DOWN THE MODEM
  1015.       LD    A,3        ;RETURN ABORT CODE
  1016.       RET
  1017. SMNEXT:      CP    0        ;ANY OTHER KEY
  1018.       JP    NZ,SMTIMO    ;YES, TREAT LIKE TIMEOUT
  1019.       DEC    C        ;NO
  1020.       JP    NZ,SMWLP    ;CONTINUE
  1021. ;
  1022. ; NO MODEM RESPONSE WITHIN THE TIME SPECIFIED IN SET DELAY COMMAND
  1023. ;
  1024. SMTIMO:      CALL    SMDMOFF
  1025.       LD    A,2        ;RETURN TIMEOUT CODE
  1026.       RET
  1027. ;
  1028. ; MODEM GAVE US A RESULT, CHECK IT
  1029. ;
  1030. SMTEST:      AND    7FH        ;IGNORE ANY PARITY
  1031.       CALL    SMANAL        ;TEST THE RESULT
  1032.       JP    C,RESULT    ;GO TRY AGAIN IF UNKNOWN RESPONSE
  1033.       LD    A,B        ;A=RESULT 
  1034.       PUSH    AF        ;SAVE IT
  1035. SMTLP:      LD    C,INMDM        ;EAT ANY ADDITIONAL CHARS FROM SMARTMODEM
  1036.       CALL    MEX
  1037.       JP    NC,SMTLP    ;UNTIL 100MS OF QUIET TIME
  1038.       POP    AF        ;RETURN THE CODE
  1039.       RET
  1040. ;
  1041. ; Analyze character returned from External Modem
  1042. ;
  1043. SMANAL:   PUSH  AF
  1044.       LD    A,(MODMTYP)
  1045.       OR    A
  1046.       JP    Z,SMANALH
  1047. ;
  1048. ; Analyze Modem response codes for Anchor modems.
  1049. ; Anchor echoes the digits as they are being dialed.  The returned digits
  1050. ; are interpreted as call return codes, shutting down the modem too early.
  1051. ;
  1052. SMANALA:  POP   AF
  1053.           LD    B,0        ;PREP CONNECT CODE
  1054.       CP    'C'        ;"CONNECT"?
  1055.       RET    Z
  1056.       INC    B        ;PREP BUSY CODE B=1
  1057.       CP    'B'
  1058.       RET    Z
  1059.       INC    B        ;PREP NO CONNECT MSG B=2
  1060.       CP    'N'        ;N=NO CONNECT
  1061.       RET    Z
  1062.       LD    B,4        ;PREP MODEM ERROR
  1063.       CP    'E'        ;E=ERROR
  1064.       RET    Z
  1065.       JP    WTLF
  1066. ;
  1067. ; Analyze Modem response codes for Hayes, etc.
  1068. ;
  1069. SMANALH:  POP   AF
  1070.           LD    B,0        ;PREP CONNECT CODE
  1071.       CP    'C'        ;"CONNECT"?
  1072.       RET    Z
  1073.       CP    '1'        ;NUMERIC VERSION OF "CONNECT"
  1074.       RET    Z
  1075.       CP    '5'        ;NUMERIC VERSION OF "CONNECT 1200"
  1076.       RET    Z
  1077.       INC    B        ;PREP BUSY CODE B=1
  1078.       CP    'B'
  1079.       RET    Z
  1080.       INC    B        ;PREP NO CONNECT MSG B=2
  1081.       CP    'N'        ;N=NO CONNECT
  1082.       RET    Z
  1083.       CP    '3'        ;NUMERIC VERSION OF "NO CONNECT"
  1084.       RET    Z
  1085.       LD    B,4        ;PREP MODEM ERROR
  1086.       CP    'E'        ;E=ERROR
  1087.       RET    Z
  1088.       CP    '4'        ;NUMERIC VERSION OF "ERROR"
  1089.       RET    Z
  1090. ;
  1091. ; UNKNOWN RESPONSE, RETURN CARRY TO CALLER. BUT FIRST,
  1092. ; FLUSH THE UNKNOWN RESPONSE LINE FROM THE MODEM.
  1093. ;
  1094. WTLF:      CP    LF        ;LINEFEED?
  1095.       SCF
  1096.       RET    Z        ;END IF SO
  1097.       LD    C,INMDM        ;NO. GET NEXT CHAR
  1098.       CALL    MEX
  1099.       JP    NC,WTLF        ;UNLESS BUSY, LOOP
  1100.       RET
  1101. ;
  1102. ; Send string to the External Modem
  1103. ;
  1104. SMSEND:      LD    C,SNDRDY    ;WAIT FOR MODEM READY
  1105.       CALL    MEX
  1106.       JP    NZ,SMSEND
  1107.       LD    A,(HL)        ;FETCH NEXT CHARACTER
  1108.       INC    HL
  1109.       OR    A        ;END?
  1110.       RET    Z        ;DONE IF SO
  1111.       LD    B,A        ;NO, POSITION FOR SENDING
  1112.       LD    C,SNDCHR    ;NOPE, SEND THE CHARACTER
  1113.       CALL    MEX
  1114.       JP    SMSEND
  1115. ;
  1116. ; Shut down (disconnect) External Modem
  1117. ;
  1118. SMDMOFF:  LD    A,(DIALAB)
  1119.       LD    B,A
  1120.       LD    C,SNDCHR
  1121.       CALL    MEX
  1122.       LD    B,20        ;TWO SECOND WAIT TO SETTLE DOWN
  1123.       CALL    MTIME
  1124.       LD    A,(MODMTYP)    ;TEST MODEM TYPE
  1125.       OR    A
  1126.       JP    Z,DISCON    ;IF HAYES TYPE, JUMP TO DISCON
  1127.       RET            ;IF ANCHOR, RETURN
  1128. ;
  1129. ; General utility routines
  1130. ;
  1131. MILP:      LD    C,ILP        ;IN-LINE PRINT
  1132.       JP    MEX
  1133.       RET
  1134. ;
  1135. MTIME:      LD    C,TIMER        ;MEX TIMER
  1136.       JP    MEX
  1137.       RET
  1138. ;
  1139. CRLF:      CALL    MILP        ;PRINT CARRIAGE RETURN, LINE FEED
  1140.       DB    CR,LF,0
  1141.       RET
  1142. ;
  1143. ;==========================================================================
  1144. ;                            Data Area
  1145. ;==========================================================================
  1146. ;
  1147. ; Miscellaneous Default Data
  1148. ;
  1149. SMDIAL:      DB    'AT'
  1150. ;
  1151.        IF    SILENT
  1152.       DB    'M0'        ;Turn off speaker during dialing
  1153.        ENDIF
  1154. ;
  1155.       DB    'DT'        ;Smartmodem dial prefix
  1156. ;
  1157. DIALBF:      DS    52        ;2* 24 CHAR MAX, + CR + NULL + SLOP
  1158. DIALPT:      DS    2        ;DIAL POSITION POINTER
  1159. DIALWD:      DB    01000000B    ;PULSE/TONE DIAL WORD
  1160. DIGIT      DB    0        ;SAVE DIALED DIGIT
  1161. MSPDSV:      DB    0        ;SAVE EXTERNAL MODEM MSPEED
  1162. MONFLG:      DB    0FFH        ;0: MONITOR OFF - 0FFH: MONITOR ON
  1163. ANSFLG:      DB    0        ;0: ORIGINATE   - 0FFH: ANSWER
  1164. NDELAY:      DB    30        ;NO. SECONDS FOR ANSWER
  1165. MODMTYP:  DB    0        ;0=HAYES, ETC., - 0FFH=ANCHOR MODEM
  1166. DIALAB:      DB    CR        ;CHARACTER TO USE TO ABORT DIAL SEQUENCE
  1167. ;
  1168. SMATN:    DB    '+++',0        ;Smartmodem online 'attention'
  1169. SMDISC:      DB    'ATH',CR,0    ;Smartmodem disconnect (used by Anchor)
  1170. SMINIT:   DB    'ATM1 S0=0 S7=60 Q0 X1',CR,0    ;MODEM INIT STRING
  1171. ;
  1172. EOSMSG:      CLREND            ;CLEAR TO END-OF-SCREEN
  1173.       DB    '$'
  1174. CLSMSG:      CLRCRT            ;CLEAR WHOLE SCREEN
  1175.       DB    '$'
  1176. ;
  1177.       END
  1178. TRING
  1179. ;
  1180. EOSMSG:      CLREND