home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / MEX / MXM-2416.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  28KB  |  794 lines

  1. ;    title    'MEX Smartmodem 2400 / USR 2400 Overlay V2.6'
  2. ;
  3. ; MXM-2416.ASM:  Smartmodem 2400 overlay for MEX: revision 2.6.
  4. ;
  5. ; This is a modem overlay for the MEX communication program.  It
  6. ; supports 2400 baud auto-stepdown, and works with the Hayes 2400
  7. ; and US Robotics Courier.  Probably others as well.
  8. ;
  9. ; (SmarTEAM 2400 added in rev 1.9)
  10. ;
  11. ; This overlay is based on revisions to MXM-SM15 made by George
  12. ; Sipe (who developed the fallback technique, and the checksum
  13. ; concept for modem response) and Paul Traina (who added Courier
  14. ; 2400 support).
  15. ;
  16. ; See additional notes after update history, below.
  17. ;
  18. ;==========================================================================
  19. ;
  20. ; Update history (please use MXM-2401, MXM-2402, etc when revising).
  21. ;     Note to updaters: please do NOT use mixed upper-case opcodes
  22. ;     and operands with lower case comments.  Someone (I don't know
  23. ;     who, nor, for the love 'a Mike, WHY) loves to go through
  24. ;     source code and intermix case on EACH line!;        (rgf)
  25. ;
  26. ; To the anonymous idiot who released MXM-2412: the above is not a request,
  27. ; it's a *requirement*, stated politely, but a requirement nonetheless.  I
  28. ; did not ask for and will not accept an explanation of why you re-formatted
  29. ; this overlay.
  30. ;
  31. ; I can't track changes to the program when you modify every single line;
  32. ; since I couldn't track your changes AND since you didn't identify your-
  33. ; self, the -2412 release is UNAUTHORIZED, and unacceptable.  Thus,
  34. ; MXM-2413 is essentially a re-release of MXM-2411.
  35. ;
  36. ; When you write your own programs, format 'em any damned way you please.
  37. ; If you modify mine, do it my way or keep your hands off.
  38. ;
  39. ;                    --Ron Fowler (10/12/86)
  40. ;
  41. ; 11/22/86: MXM-2416 (rev 2.6) -- Keith Petersen: Made SSET response
  42. ;        strings shorter so overlay would fit into available space
  43. ;        when verbose response was true.
  44. ; 11/08/86: MXM-2415 (rev 2.5) -- Jim Lill: Tested FAST with SmarTEAM, works
  45. ;        although the time to send the dial speed string each time seems
  46. ;        longer than the time saved. Changed the SSET displays to gain a
  47. ;        few bytes so DISC could be TRUE. Otherwise, overlays overuns
  48. ;        0D00H limit. >>NOTE<<, this overlay may not assemble depending on
  49. ;        how equates are set. Space VERY limited.
  50. ; 11/01/86: MXM-2414 (rev 2.4) -- Howard Goldstein: Rearranged code below
  51. ;                  NOAUTO: to permit correct assembly
  52. ;                  for Hayes.  Fixed "fast" option:
  53. ;                  Was sending dial speed digits to
  54. ;                  modem in reverse order.
  55. ; 10/12/86: MXM-2413 (rev 2.3) -- Ron Fowler: Shortened update log (which had
  56. ;                  grown to occupy a substantial part of the
  57. ;                  size of the source file).  Re-issued around
  58. ;                  MXM-2412, as described above.
  59. ; 07/13/86: MXM-2411 (rev 2.1) -- Jim Lill
  60. ; 07/10/86: MXM-2410 (rev 2.0) -- Jim Lill
  61. ; 07/09/86: MXM-2409 (rev 1.9) -- Jim Lill
  62. ; 07/04/86: MXM-2408 (rev 1.8) -- Lee D. Rimar
  63. ; 06/26/86: MXM-2407 (rev 1.7) -- Jim Lill [GEnie: JIMLILL], Jeff Laing
  64. ; 03/02/86: MXM-2406 (rev 1.6) -- Tim Farley
  65. ; 10/06/85: MXM-2405 (rev 1.5) -- Arun Baheti
  66. ; 08/23/85: MXM-2404 (rev 1.4) -- Nixy Kuttemperoor
  67. ; 08/21/85: MXM-2403 (rev 1.3) -- Kim Levitt
  68. ; 08/20/85: MXM-2402 (rev 1.2) -- Arun Baheti
  69. ; 08/16/85: MXM-2401 (rev 1.1) -- Kim Levitt
  70. ;
  71. ; 07/29/85: MXM-2400 (rev 1.0) released. (incorporated work done by
  72. ;        George Sipe and Paul Traina)    --Ron Fowler
  73. ;
  74. ;------------------------------------------------------------
  75. ;
  76. ; This overlay takes advantage of the capability of many 2400-baud
  77. ; (and perhaps some 1200 baud) modems to "fall back" when a call is
  78. ; made to a modem at a rate less than the highest rate supported by
  79. ; the calling modem.  The MEXBD equate (below) determines the highest
  80. ; baudrate supported by the modem (6 for 2400, 5 for 1200), and makes
  81. ; all calls at that baudrate.  If the remote modem answers at a lower
  82. ; rate, this overlay will switch to the lower rate. (You can turn
  83. ; this feature on or off with the SSET AUTO ON and SSET AUTO OFF com-
  84. ; mands, respectively.)
  85. ;
  86. ;
  87. ; If you set the USR24 equate, MEX will automatically use the Courier's
  88. ; adaptive dialing feature, and will always enable the modem's busy
  89. ; detector (which increases the frequency of "hits" when using re-
  90. ; peated dialing to a busy number). The USR24 equate also enables VOICE
  91. ; answer detection (if you've ever repeatedly used MEX to dial a wrong
  92. ; number, then discovered your error and felt bad for the poor guy on
  93. ; the other end, you should use this option) Also, you can set SHOWRNG
  94. ; TRUE and this overlay will print "RING" each time the distant end rings.
  95. ;
  96. ; Another feature for those of you using touch tone dialing on the USR
  97. ; is the ability to determine how fast to dial digits. This doesn't seem
  98. ; like much, but when you are autodialing a busy system, miliseconds can
  99. ; add up.
  100. ;
  101. ; If you use the USR24 or HAYES equates, you may want to customize the
  102. ; modem dial string prefix at the label SMDIAL.
  103. ;
  104. ;==========================================================================
  105. ;
  106. ; EXCEPTION TO AUTO BAUD STEPDOWN
  107. ;
  108. ; The exception is when you are currently set at a baud rate less than
  109. ; 1200bd since neither the smartmodem or the courier will step down
  110. ; below 1200bd, in which case the call is made at the current baud rate.
  111. ; If your modem is unlike the smartmodem or the courier and will stepdown
  112. ; to lower baud rates then change the LBAUD equate below to the lowest
  113. ; rate which your modem will step down to.
  114. ;
  115. ;------------------------------------------------------------
  116. ;
  117. ; This module adapts MEX for the DC Hayes Smartmodem (as well
  118. ; as many others -- including US Robotics -- that use a similar
  119. ; command language).  The main function of this module is to pro-
  120. ; vide dialing capability; the disconnect vector is ancillary.
  121. ; You may use this module as a model to develop dialing routines
  122. ; for non-standard modems (e.g., the Racal-Vadic).  The only
  123. ; pertinent entry point is the DIAL routine; you'll find entry
  124. ; specs for that below.
  125. ;
  126. ; The only conditional you might want to change in this module is
  127. ; the DISC equate below -- if left on, MEX will use the
  128. ; Smartmodem's disconnect code.  If you prefer to provide your own
  129. ; in your overlay's DISCV vector (e.g., by dropping DTR), then set
  130. ; DISC to FALSE and re-assemble.  (If you don't understand this,
  131. ; then play it safe, and leave the equate set as it is).  NOTE:
  132. ; Note that MexPlus supports both "hardware" (DTR) AND "software"
  133. ; (Smartmodem) disconnection: always set DISC to TRUE for MexPlus.
  134. ;
  135. false    equ    0
  136. true    equ    not false
  137. ;
  138. crfl    equ    true        ;set true for SM13 style flush (see 1.7 notes)
  139. spkdef    equ    1        ;set 1 for spkr ON as default,     0=OFF
  140. abfdef    equ    1        ;set 1 for autobaud fallback ON, 0=OFF
  141. spabrt    equ    true        ;set true if only space bar should abort
  142.                 ;current dial.    If false, any key except ^C.
  143. fast    equ    false        ;set true for fast dialing on USR or SmarTEAM
  144. dspeed    equ    40        ;milliseconds for each digit if fast equ yes
  145.                 ;My phone system will take 38, but 40 should
  146.                 ;be safe for any phone system (50min for Team)
  147. wait    equ    60        ;maximum time to wait for result. 45 secs good
  148.                 ;unless your using MCI etc then try 60 (60max)
  149. hayes    equ    false        ;set to true if using a Hayes Smartmodem 2400
  150. usr24    equ    true         ;set to true if using a US Robotics 2400 modem
  151. team    equ    false        ;set to true if using a SmarTEAM 2400 modem
  152. showrng    equ    true        ;set true to type RING every time remote rings
  153. maxbd    equ    6        ;maximum baudrate: 1=300, 3=600, 5=1200, 6=2400
  154. lbaud    equ    5        ;minimum stepdown baud
  155. wordres    equ    true         ;true = interpret word ("verbose") result codes
  156. numres    equ    false        ;true = interpret numeric result codes
  157. disc    equ    true        ;<<== change to false if you disc. with DTR
  158.                 ;always set true for MEXPLUS
  159. ;
  160. ; NOTE:     This overlay converted for MEXPLUS compatiblility
  161. ;        and 8086 translation 2/20/85 by Al Jewer.
  162. ;
  163. yes    equ    0ffh        ;this is for 8086 translator - do not change
  164. no    equ    0
  165. i8080    equ    yes        ;define processor type
  166. i8086    equ    no
  167. tpulsv    equ    0105h        ;tone/pulse flag in modem overlay
  168. mspeed    equ    0107h        ;mspeed location in modem overlay
  169. ndiscv    equ    015fh        ;new (MexPlus) smart modem disconnect here
  170. dialv    equ    0162h        ;location of dial vector in overlay
  171. discv    equ    0165h        ;location of hardware disconnect vector
  172. newbdv    equ    016eh        ;location of the set baud vector
  173. dialoc    equ    0b00h        ;dialing code goes here
  174. mexloc    equ    0d00h        ;"CALL MEX" here
  175. smtabl    equ    0d55h        ;Smartmodem init, de-init and sset vectors
  176. ;
  177. ; Standard control code equates
  178. ;
  179. lf    equ    'J'-'@'        ;linefeed
  180. cr    equ    'M'-'@'        ;carriage return
  181. ;
  182. ; MEX service processor stuff ... MEX supports an overlay service
  183. ; processor, located at 0D00h (and maintained at this address from
  184. ; version to version).    If your overlay needs to call bdos for any
  185. ; reason, it should call MEX instead;  function calls below about
  186. ; 240 are simply passed on to the bdos (console and list i/o calls
  187. ; are specially handled to allow modem port queueing, which is why
  188. ; you should call MEX instead of bdos).  MEX uses function calls
  189. ; above about 244 for special overlay services (described below).
  190. ;
  191. ; Some sophisticated overlays may need to do file i/o;    if so, use
  192. ; the parsfn MEX call with a pointer to the fcb in de to parse out
  193. ; the name.  This fcb should support a spare byte immediately pre-
  194. ; ceeding the actual fcb (to contain user # information).  If you've
  195. ; used mex-10 for input instead of bdos-10 (or you're parsing part
  196. ; of a set command line that's already been input), then MEX will
  197. ; take care of du specs, and set up the fcb accordingly.  There-
  198. ; after all file i/o calls done through the MEX service processor
  199. ; will handle drive and user with no further effort necessary on
  200. ; the part of the programmer.
  201. ;
  202. inmdm    equ    255        ;get char from port to a, cy=no more in 100 ms
  203. timer    equ    254        ;delay 100ms * reg b
  204. tmdinp    equ    253        ;B=# secs to wait for char, cy=no char
  205. chekcc    equ    252        ;check for ^c from kbd, z=present
  206. sndrdy    equ    251        ;test for modem-send ready
  207. rcvrdy    equ    250        ;test for modem-receive ready
  208. sndchr    equ    249        ;send a character to the modem (after sndrdy)
  209. rcvchr    equ    248        ;recv a char from modem (after rcvrdy)
  210. lookup    equ    247        ;table search: see cmdtbl comments for info
  211. parsfn    equ    246        ;parse filename from input stream
  212. bdpars    equ    245        ;parse baud-rate from input stream
  213. sblank    equ    244        ;scan input stream to next non-blank
  214. evala    equ    243        ;evaluate numeric from input stream
  215. lkahed    equ    242        ;get nxt char w/o removing from input
  216. gnc    equ    241        ;get char from input, cy=1 if none
  217. ilp    equ    240        ;inline print
  218. decout    equ    239        ;decimal output
  219. prbaud    equ    238        ;print baud rate
  220. prntbl    equ    237        ;print table
  221. prid    equ    236        ;print [mex] id
  222. onoff    equ    235        ;parse on/off fm input strm a=0 or 1 (c=err)
  223.                 ;doesn't seem to be in mex 1.12?
  224. ;
  225. kbdin    equ    1        ;keyboard input
  226. conout    equ    2        ;simulated bdos function 2: console char out
  227. dconio    equ    6        ;direct console i/o: passed through to bdos
  228. dconin    equ    yes        ;flag in E register for input on func 6
  229. print    equ    9        ;simulated bdos function 9: print string
  230. inbuf    equ    10        ;input buffer, same structure as bdos 10
  231. kstat    equ    11        ;keyboard status
  232. ;
  233. ; ***** Code starts here *****
  234. ;
  235. ;
  236. ; NOTE:     This file contains control characters used by our
  237. ;        8080-8086 translator, XLAT.  These are in the form
  238. ;        of "\" characters inserted as the first character
  239. ;        of the comment field.  Please do not change or
  240. ;        delete these, so that future versions of this
  241. ;        overlay will directly convert to 8086 operation.
  242. ;        Thanks - Al Jewer.
  243. ;
  244. ; For MEXPLUS, the first byte of the overlay MUST contain a "jump"
  245. ; opcode.  The is a 0C3H for 8080 and an 0E9H for 8086.  MEXPLUS
  246. ; checks this byte before it loads the overlay, to make sure you
  247. ; don't load the wrong type of overlay.  This byte will not affect
  248. ; pre-MEXPLUS versions.
  249. ;
  250. ; Also, MEXPLUS contains a new vector at 15FH which is the smart-
  251. ; modem disconnect vector (now separate from the hardware vector at
  252. ; 165H).  The hardware vector typically toggles the DTR line to
  253. ; cause a hangup, while the smart-modem vector sends the hangup
  254. ; string to the modem.    MEXPLUS will ignore the vector at 165H in
  255. ; this overlay.
  256. ;
  257.     org    100h        ;base of tpa
  258. ;
  259. if i8080
  260.     db    0c3h        ;define 8080 overlay
  261. endif            ;I8080
  262. ;
  263. if i8086
  264.     db    0e9h        ;8086 flag
  265. endif            ;I8086
  266. ;
  267.     org    tpulsv
  268.     db    'T'        ;touchtone flag
  269.             ;use 'T' for tone, 'P' for pulse or ' ' if USR
  270.             ;and you wish "adaptive" dialing.
  271. ;
  272. if disc                ;if providing disconnect code
  273.     org    ndiscv        ;Smartmodem disconnect vector (MexPlus)
  274.     jmp    discon
  275. endif
  276. if not disc            ;if not providing disconnect code
  277.     org    ndiscv        ;fix sm25..sm24 had no org here
  278.     ret            ;for MEXPLUS, in case somebody screws up....
  279. endif                ;disc
  280. ;
  281.     org    dialv        ;overlay the dialing vector
  282.     jmp    dial
  283. ;
  284. if disc                ;if providing disconnect code
  285.     org    discv        ;overlay the vector (mex 1.1x)
  286.     jmp    discon
  287. endif                ;disc
  288. ;
  289.     org    dialoc
  290. ;
  291. ; The following is a "signature" word that identifies this overlay (for
  292. ; multiple-modem selection based on processor number in a TurboDOS sys-
  293. ; tem).  If you use this overlay to develop a non-autobaud overlay for
  294. ; a different modem, either move this block to the end of the program,
  295. ; or contact NightOwl Software (414-563-4013) for assignment of a dif-
  296. ; ferent signature ID).
  297. ;
  298.     dw    3746        ;signature of MXM-2400.
  299. abdflg:    db    abfdef        ;auto baud rate on/off flag
  300. mbaud:    db    maxbd        ;maximum baudrate
  301. spkflg:    db    spkdef        ;monitor speaker on/off flag
  302. ;
  303. if usr24 and numres and    (not fast)
  304. smdial:    db    'ATX6V0Q0M'    ;combined all init codes
  305. msmark:    db    '3D'        ;with dial command
  306. tpmark:    db    ' ',0
  307. endif
  308. ;
  309. if usr24 and numres and    fast
  310. inimsg:    db    'ATX6V0Q0S11='
  311.     db    dspeed/10+'0',(dspeed mod 10)+'0'
  312.     db    cr,0
  313. smdial:db    'ATM'
  314. msmark:    db    '3D'
  315. tpmark:    db    ' ',0
  316. endif
  317. ;
  318. if usr24 and wordres and (not fast)
  319. smdial:    db    'ATX6V1Q0M'    ;combined all init codes
  320. msmark:    db    '3D'        ;with dial command
  321. tpmark:    db    ' ',0
  322. endif
  323. ;
  324. if usr24 and wordres and fast
  325. inimsg:    db    'ATX6V1Q0S11='
  326.     db    dspeed/10+'0',(dspeed mod 10)+'0'
  327.     db    cr,0
  328. smdial:    db    'ATM'
  329. msmark:    db    '3D'
  330. tpmark:    db    ' ',0
  331. endif
  332. ;
  333. if hayes and numres
  334. smdial:    db    'ATX4V0M'
  335. msmark:    db    '0Q0&C0D'
  336. tpmark:    db    ' ',0
  337. endif
  338. ;
  339. if hayes and wordres
  340. smdial:    db    'ATX4V1M'
  341. msmark:    db    '3Q0&D2D'
  342. tpmark:    db    ' ',0
  343. endif
  344. ;
  345. if team    and numres and (not fast)
  346. smdial:    db    'ATX4V0M'
  347. msmark:    db    '0Q0&C0D'
  348. tpmark:    db    ' ',0
  349. endif
  350. ;
  351. if team    and numres and fast        ;added in 2.1
  352. inimsg:    db    'ATX4V0Q0&C0S11='
  353.     db    dspeed/10+'0',(dspeed mod 10)+'0'
  354.     db    cr,0
  355. smdial:db    'ATM'
  356. msmark:    db    '0D'
  357. tpmark:    db    ' ',0
  358. endif
  359. ;
  360. if team    and wordres and    (not fast)
  361. smdial:    db    'ATX4V1M'
  362. msmark:    db    '0Q0&C0D'
  363. tpmark:    db    ' ',0
  364. endif
  365. ;
  366. if team    and wordres and    fast        ;added in 2.1
  367. inimsg:    db    'ATX4V1Q0&C0S11='
  368.     db    dspeed/10+'0',(dspeed mod 10)+'0'
  369.     db    cr,0
  370. smdial:    db    'ATM'
  371. msmark:    db    '0D'
  372. tpmark:    db    ' ',0
  373. endif
  374. ;
  375. if not (usr24 or hayes or team)
  376. smdial:    db    'ATM'
  377. msmark:    db    '3D'
  378. tpmark:    db    'T',0        ;Smartmodem dial string
  379. endif
  380. ;
  381. ;------------------------------------------------------------
  382. ;
  383. ; This is the DIAL routine called by MEX to dial a digit.  The digit
  384. ; to be dialed is passed in the A register.  Note that two special
  385. ; codes must be intercepted as non-digits: 254 (start dial
  386. ; sequence) and 255 (end-dial sequence).  Mex will always call DIAL
  387. ; with 254 in the accumulator prior to dialing a number.  Mex will
  388. ; also call dial with 255 in A as an indication that dialing is
  389. ; complete.  Thus, the overlay may use these values to "block" the
  390. ; number, holding it in a buffer until it is completely assembled
  391. ; (in fact, that's the scheme employed here for the Smartmodem).
  392. ;
  393. ; After the 254-start-dial sequence, MEX will call the overlay with
  394. ; digits, one-at-a-time.  MEX will make no assumptions about the
  395. ; digits, and will send each to the DIAL routine un-inspected (some
  396. ; modems, like the Smartmodem, allow special non-numeric characters
  397. ; in the phone number, and MEX may make no assumptions about
  398. ; these).
  399. ;
  400. ; After receiving the end-dial sequence (255) the overlay must take
  401. ; whatever end-of-dial actions are necessary *including* waiting
  402. ; for carrier at the distant end.  The overlay should monitor the
  403. ; keyboard during this wait (using the MEX keystat service call),
  404. ; and return an exit code to MEX in the A register, as follows:
  405. ;
  406. ;    0 - Carrier detected, connection established
  407. ;    1 - Far end busy (only for modems that can detect this)
  408. ;    2 - No answer (or timed out waiting for modem response)
  409. ;    3 - Keyboard abort (^C only: all others should be ignored)
  410. ;    4 - Error reported by modem
  411. ;    5 - No ring detected (only for modems that can detect this condition)
  412. ;    6 - No dial tone (only for modems that can detect this condition)
  413. ;
  414. ; <No other codes should be returned after an end-dial sequence>
  415. ;
  416. ; The overlay should not loop forever in the carrier-wait routine,
  417. ; but instead use either the overlay timer vector, or the INMDMV
  418. ; (timed 100 ms character wait) service call routine.
  419. ;
  420. ; The DIAL routine is free to use any of the registers, but must
  421. ; return the above code after an end-dial sequence
  422. ;
  423. ;
  424. dial:    cpi    255        ;end dial?
  425.     jz    endial        ;\jump if so
  426.     cpi    254        ;start dial?
  427.     jnz    smchr        ;go send to modem if not
  428.     lda    mspeed        ;get present baud rate
  429.     cpi    lbaud        ;see if below min. stepdown
  430.     jc    dial2        ;if so no autobaud
  431.     lda    abdflg        ;get autobaud rate flag
  432.     ora    a        ;set psw
  433.     lda    mbaud        ;get maximum baud rate
  434.     cnz    newbdv        ;set it if autobaud rate flag <> 0
  435. dial2:    lda    tpulsv        ;get overlay's touch-tone flag
  436.     sta    tpmark        ;put into string
  437.     lda    spkflg        ;check monitor speaker flag
  438.     ora    a
  439.     mvi    a,'3'
  440.     jnz    spkon        ;if on, use M3 mode
  441.     mvi    a,'0'
  442. spkon:    sta    msmark
  443. ;
  444. if fast    and (usr24 or team)    ;need to separate init command
  445.     lxi    h,inimsg    ;point to init command
  446.     call    smstr        ;send it
  447.     call    flush        ;flush modem response
  448.     call    flush        ;
  449. endif    ;fast and (usr24 or team)
  450. ;
  451.     lxi    h,smdial    ;point to dialing string
  452.     jmp    smstr        ;send it
  453. ;
  454. ; Here on an end-dial sequence
  455. ;
  456. endial:    mvi    a,cr        ;send end-of-line to the modem
  457.     call    smchr
  458.     call    flush        ;flush any pending modem output
  459. ;
  460. ; The following loop waits for a result from the modem (up to 60
  461. ; seconds:  you may change this value in the following line).  Note
  462. ; that the Smartmodem has an internal 30 second timeout for a
  463. ; carrier on the other end.  You can change by playing with the S7
  464. ; variable (i.e. send the smartmodem "AT S7=20" to lower the 30
  465. ; second wait to 20 seconds).
  466. ;
  467.     mvi    e,wait        ;<<== maximum time to wait for result
  468. smwlt:    mvi    d,0        ;clear response checksum
  469. smwlp:    lxi    b,1*256+tmdinp    ;b=1 second, C=tmdinp func code
  470.     call    mex
  471.     jnc    smlog        ;\jump if modem had a char
  472.     mvi    c,kstat        ;check for keypress
  473.     call    mex
  474.     ora    a
  475.     jz    smnext        ;\jump if no keypress
  476.     mvi    e,dconin
  477.     mvi    c,dconio    ;get key hit, with no echo
  478.     call    mex
  479.     cpi    'C'-40h        ;is ^C?
  480.     jnz    nocc        ;\jump if not
  481.     mvi    a,3        ;prep return code
  482.     jmp    abcom        ;\finish in common code
  483. nocc:
  484. ;
  485.     if    spabrt
  486.     cpi    ' '        ;space bar?
  487.     jnz    smnext        ;\ignore all others
  488.     endif
  489. ;
  490.     mvi    a,2        ;prep return code
  491. abcom:    push    psw        ;\save return code
  492.     lxi    b,cr*256+sndchr    ;b=cr, c=sndchr func code
  493.     call    mex
  494.     pop    psw        ;\return abort code
  495.     ret
  496. smnext:    dcr    e        ;no
  497.     jnz    smwlp        ;\continue
  498. ;
  499. ; wait (equ) seconds with no modem response (or no connection)
  500. ;
  501.     mvi    a,2        ;return timeout code
  502.     ret
  503. ;
  504. ; modem gave us a result, check for end and save it
  505. ;
  506. smlog:    ani    7fh        ;ignore any parity
  507.     cpi    ' '        ;see if end of message
  508.     jc    smrslt        ;\jump when control character
  509.     add    d        ;add to checksum
  510.     mov    d,a        ;save response checksum
  511.     jmp    smwlp        ;\continue
  512. ;
  513. ; result code completely presented
  514. ;
  515. smrslt:    mov    a,d        ;get result checksum
  516.     ora    a        ;see if accumulated yet
  517.     jz    smwlp        ;\continue if no result yet
  518.     call    flush        ;flush any pending modem output
  519.     lxi    h,rctab-2    ;get pointer to result table
  520. smrlp:    inx    h        ;\advance to next entry
  521.     inx    h        ;\
  522.     mov    a,m        ;get table entry
  523.     inx    h        ;\bump to response
  524.     cpi    0ffh        ;check for end of table
  525.     jnz    smok        ;\jump if not
  526.     mvi    a,4        ;else return error reported by modem
  527.     ret
  528. smok:    cmp    d        ;check for match with checksum
  529.     jnz    smrlp        ;\loop if no match
  530.     lda    abdflg        ;got a match.  Get autobaud rate flag
  531.     ora    a        ;set z on flag
  532.     jz    noauto        ;\jump if not auto-baud mode
  533.     mov    a,m        ;get newbdv-code
  534.     cpi    0FFH        ;null?
  535.     cnz    newbdv        ;set it if not
  536. noauto:    inx    h        ;\bump over newbdv-code
  537.     mov    a,m        ;get MEX response code
  538.      if    not (usr24 or team)
  539.     ret            ;don't try to interpret extended codes
  540.      endif
  541. ;
  542.      if    usr24 or team
  543.     cpi    8
  544.     jz    ring        ;\say phone is ringing
  545.     cpi    7        ;say we found a human
  546.     rnz            ;\r3\otherwise it's a normal mex code
  547.      endif
  548. ;
  549. ;
  550. if usr24            ;Courier can do voice
  551. voice:    call    ilprt        ;whoops, we have ourselves a human.
  552.     db    'VOICE ',0    ;print a warning
  553.     mvi    a,3        ;return with abort so doesn't repeat..
  554. r3:    ret
  555. endif
  556. ;
  557. if (usr24 or team) and showrng    ;Courier and SmarTEAM do ring detect
  558. ring:    call    ilprt        ;just print nice ring message,
  559.     db    'RING ',0    ;it's not an error, just phone ringing..
  560.     jmp    smwlt        ;go to main loop
  561. endif
  562. ;
  563. if (usr24 or team) and not showrng
  564. ring:    jmp    smwlt        ;\just clear the checksum and continue
  565. endif
  566. ;
  567. ; The following table is used to interpret the calculated result code
  568. ; checksum which is reported by the modem (and excludes all control
  569. ; characters).    For numeric responses, the checksum is the same as
  570. ; the numeric response (in most cases).  For word responses, the
  571. ; checksum is as listed in the table.  The table format consists of
  572. ; triplets:  result-checksum, newbdv-code, MEX-response.  Note that
  573. ; with this scheme, "CONNECT 0600" and "CONNECT 2400" appear the
  574. ; same, further "RING" and "0" ("OK") appear the same.    These
  575. ; should not normally cause any difficulties however.
  576. ;
  577. rctab:
  578. if    wordres
  579.     db    09ah,0ffh,4    ;"OK" - error reported by modem
  580.     db    00ah,1,0    ;"CONNECT" - carrier detected
  581.     db    030h,0ffh,4    ;"RING" - error reported by modem
  582.     db    0c5h,0ffh,2    ;"NO CARRIER" - no answer
  583.     db    08ah,0ffh,4    ;"ERROR" - error reported by modem
  584.     db    0edh,5,0    ;"CONNECT 1200" - carrier detected
  585.     db    00dh,0ffh,6    ;"NO DIALTONE" - error reported by modem
  586.     db    043h,0ffh,1    ;"BUSY" - far end busy
  587.     db    08dh,0ffh,2    ;"NO ANSWER" - no answer
  588.     db    0f0h,6,0    ;"CONNECT 2400" - carrier detected
  589. endif                ;wordres
  590. ;
  591. if wordres and usr24
  592.     db    076h,0ffh,7    ;"VOICE" - mex doesn't support...we do
  593. endif
  594. ;
  595. if wordres and (usr24 or team)
  596.     db    00eh,0ffh,8    ;"RINGING" - mex doesn't support..we do
  597. endif
  598. ;
  599. if numres
  600.     db    '1',  1,0    ;"CONNECT" - carrier detected
  601.     db    '2',255,4    ;"RING" - error reported by modem
  602.     db    '3',255,2    ;"NO CARRIER" - no answer
  603.     db    '4',255,4    ;"ERROR" - error reported by modem
  604.     db    '5',  5,0    ;"CONNECT 1200" - carrier detected
  605.     db    '6',255,6    ;"NO DIALTONE" - error reported by modem
  606.     db    '7',255,1    ;"BUSY" - far end busy
  607.     db    '8',255,2    ;"NO ANSWER" - no answer
  608.     db    '9',  3,0    ;"CONNECT 0600" - carrier detected
  609.     db    '1'+'0',  6,0    ;"CONNECT 2400" - carrier detected
  610. endif
  611. ;
  612. if numres and usr24
  613. x    db    '1'+'2',255,7    ;"VOICE" - say there is a voice
  614. endif
  615. ;
  616. if numres and (usr24 or    team)
  617.     db    '1'+'1',255,8    ;"RINGING" - remote modem ringing
  618. endif                ;numres
  619. ;
  620. ;
  621.     db    0ffh        ;end of table
  622. ;
  623. ; Following routine disconnects the modem using Smartmodem
  624. ; codes.  All registers are available for this function.
  625. ; Nothing returned to caller.
  626. ;
  627. if disc
  628. discon:    mvi    b,20
  629.     mvi    c,timer        ;wait 2 seconds
  630.     call    mex
  631.     lxi    h,smatn        ;send '+++'
  632.     call    smstr
  633.     mvi    b,20        ;wait 2 more seconds
  634.     mvi    c,timer
  635.     call    mex
  636.     lxi    h,smdisc    ;send 'ath'
  637.     call    smstr
  638.     mvi    b,1        ;wait 1 second
  639.     mvi    c,timer
  640.     jmp    mex
  641. ;
  642. smatn:    db    '+++',0        ;Smartmodem attention string
  643. smdisc:    db    'ATH',cr,0    ;Smartmodem hang-up string
  644. ;
  645. endif                ;disc
  646. ;
  647. ; Smartmodem utility routine:  send string to modem
  648. ;
  649. smstr:    mov    a,m        ;fetch next character
  650.     inx    h        ;\
  651.     ora    a        ;end?
  652.     rz            ;\r1\done if so
  653.     call    smchr        ;otherwise send the character
  654.     jmp    smstr        ;\
  655. ;
  656. ; Smartmodem utility routine:  send character to modem
  657. ;
  658. smchr:    push    psw        ;save character
  659. smrdy:    mvi    c,sndrdy    ;wait for modem ready
  660.     call    mex
  661.     jnz    smrdy        ;\
  662.     pop    psw        ;restore character
  663.     mov    b,a        ;position for sending
  664.     mvi    c,sndchr    ;send the character
  665.     jmp    mex
  666. ;
  667. ; Smartmodem utility routine:  flush pending modem output
  668. ;
  669. flush:    mvi    c,inmdm        ;catch any output from the modem
  670.     call    mex
  671. ;
  672. if  crfl
  673.     jc    r1        ;jump if no input
  674.     cpi    lf        ;got some, waiting for <cr>
  675.     jnz    flush        ;eat characters until getting one
  676. endif
  677. ;
  678. if not crfl
  679.     jnc    flush        ;\loop until no more characters
  680. endif
  681. ;
  682. r1:    ret
  683. ;
  684. ; This routine performs the MEX inline print function.
  685. ;
  686. ilprt:    mvi    c,ilp
  687.     jmp    mex
  688. ;
  689. ;----------------------------------------------------------------
  690. ;
  691. ; Next is the SSET command processor.
  692. ;
  693. sset:    mvi    c,sblank    ;Any arguments?
  694.     call    mex
  695.     jc    telall        ;\tell current status if not
  696.     lxi    d,cmdtbl    ;point command table
  697.     mvi    c,lookup    ;see if command found
  698.     call    mex
  699.     jc    seterr        ;\complain if not
  700.     pchl            ;else go to service routine
  701. ;
  702. seterr:    call    ilprt        ;print error message
  703.     db    'SSET: AFB ON/OFF - SPKR ON/OFF',cr,lf,0
  704.     ret
  705. ;
  706. ; This is the SSET command table.
  707. ;
  708. cmdtbl:    db    'AF','B'+80h    ;Autobaud mode on/off
  709.     dw    setbd
  710.     db    'SPK','R'+80h    ;monitor speaker on/off
  711.     dw    setspk
  712.     db    0        ;Table terminator
  713. ;
  714. ; Set message on/off processor.
  715. ;
  716. setspk:    lxi    h,spkblk    ;pointer for spkr on/off
  717.     jmp    boole        ;set on/off or show
  718. ;
  719. telall:
  720.     call    setspk        ;show speaker on/off
  721. ;
  722. setbd:    lxi    h,abdblk    ;load pointer
  723. ;
  724. ; Boolean SSET common code.
  725. ;
  726. boole:    mov    e,m        ;fetch address of boolean
  727.     inx    h        ;\
  728.     mov    d,m
  729.     inx    h        ;\HL addresses text
  730.     push    d        ;save it
  731.     push    h        ;save that pointer
  732.     mvi    c,sblank    ;any arguments?
  733.     call    mex
  734.     jc    tell        ;\jump if not
  735.     mvi    c,onoff        ;parse on/off from input stream
  736.     call    mex
  737.     pop    d        ;recall msg pointer
  738.     pop    h        ;boolean's adrs
  739.     jc    seterr        ;\complain if not on or off
  740.     push    h        ;resave
  741.     push    d
  742.     mov    m,a        ;update boolean
  743. tell:    pop    d        ;none, query only
  744.     mvi    c,print        ;print message
  745.     call    mex
  746.     pop    h        ;boolean location
  747.     mov    a,m
  748.     ora    a        ;is it off?
  749.     jz    izoff        ;\jump if so
  750.     call    ilprt        ;else print 'on'
  751.     db    'N',cr,lf,0
  752.     ret
  753. izoff:    call    ilprt        ;print 'off'
  754.     db    'FF',cr,lf,0
  755.     ret
  756. ;
  757. abdblk:    dw    abdflg
  758.     db    'AFB O$'
  759. ;
  760. spkblk:    dw    spkflg
  761.     db    'SPKR O$'
  762. ;
  763. justrt:    ret
  764. ;
  765. ; The following statement insures that we don't exceed our boundary.
  766. ; It's IFed around 8080 (with ";|") because the brain-damaged 8086
  767. ; (Microsoft) assembler forces a type on all variables; since '$' is
  768. ; an address and 0CFFH is a constant, MASM will refuse to assemble the
  769. ; statement. Someone at Microsoft should be strung up by his fingernails
  770. ; and baked in the late afternoon sun for forcing such ridiculous con-
  771. ; straints on ASSEMBLY language programmers!; (I imagine there's some
  772. ; way around this stupidty, but I have neither the time nor the in-
  773. ; clination to go digging through the MASM documentation to find it).
  774. ;
  775. endmxm:        ;this method works with ASM since "$" & "GT" don't work
  776. ;
  777. gap    equ    0CFFH-ENDMXM
  778. oops    equ    (gap AND 8000H)    SHR 15
  779. ;
  780.      if    i8080 and oops                ;|
  781.      lda    undef    ;error: overlay area past 0D00H ;|
  782.      endif                        ;|
  783. ;
  784.     org    mexloc        ;"CALL MEX"
  785. mex:
  786. ;
  787.     org    smtabl        ;table of smart modem vectors here
  788.     dw    justrt        ;Smartmodem init
  789.     dw    sset        ;SSET command
  790.     dw    justrt        ;Smartmodem exit
  791. ;
  792. ;
  793.     end
  794.