home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / mex / mxo-xe36.azm / MXO-XE36.ASM
Assembly Source File  |  1988-03-27  |  43KB  |  1,549 lines

  1. ; Title  'MEX Overlay for the XEROX 820-I and 820-II Computers Version 3.6'
  2. ;
  3. ;
  4. REV    EQU    36        ; Overlay revision level
  5. ;
  6. ;  MEX Overlay for XEROX 820-I and XEROX 820-II Computers with
  7. ;  external modems. The table outlines the SET command options:
  8. ;
  9. ;    SET Command                 Available
  10. ;
  11. ;    DELAY <n> (seconds)            YES
  12. ;    BAUD <rate>                YES
  13. ;    ORIG (originate mode)            YES
  14. ;    ANSWER    (mode)                YES
  15. ;    TONE (dialing)                YES
  16. ;    PULSE (dialing)             YES
  17. ;    PBX (telephone system)            YES
  18. ;    STANDARD (telephone system)        YES
  19. ;    BLOCK (block call-waiting)        YES
  20. ;    MONITOR (speaker on)            YES
  21. ;    QUIET (speaker off)            YES
  22. ;    PARITY (Odd, Even, None)        YES
  23. ;    STOPBITS (1, 1.5, 2)            YES
  24. ;    LENGTH (5, 6, 7, or 8)            YES
  25. ;
  26. ;............
  27. ;
  28. ;  This overlay includes the smartmodem dialing routine from
  29. ;  MXO-SM10.ASM by Ron Fowler which has been slightly modified
  30. ;  to allow programmable delay for answer.  (Note that this is
  31. ;  different from the "ATS7=nn").
  32. ;
  33. ;  This overlay is intended to be fully compatible with the
  34. ;  MEX structure and should be readily upward compatible with
  35. ;  the predicted MEX 2.0.
  36. ;
  37. ;  Calling conventions for the various overlay entry points
  38. ;  are detailed more fully in the PMMI overlay (MXO-PMxx.ASM,
  39. ;  where xx=revision number).
  40. ;
  41. ;  Note that all overlays may freely use memory up to 0CFFH.
  42. ;  If your overlay must work with the MEX Smartmodem overlay
  43. ;  (MXO-SMXX.ASM), the physical modem overlay should terminate
  44. ;  by 0AFFH.
  45. ;
  46. ;  The SSET commands vector SSETV is at location 0D57H, see ORG
  47. ;  instruction and the SSETCMD section near the end of this overlay.
  48. ;
  49. ;  The program uses the RS-232 serial port, lines that are used are
  50. ;  shown below, pin-to-pin connections.
  51. ;    1 = ground (protective)
  52. ;    2 = Tx data to modem
  53. ;    3 = Rx data from modem
  54. ;    4 = RTS request to send to modem
  55. ;    5 = CTS clear to send from modem
  56. ;    7 = signal ground
  57. ;    8 = DCD data carrier detect from modem
  58. ;    20= DTR data terminal ready to modem
  59. ;
  60. ;  These are required to implement proper hand shaking.
  61. ;
  62. ;  History:
  63. ;  03/27/88     Added equates for the Anchor Volksmodem 12.  I found 
  64. ;               this modem accepts a very limited number of commands,
  65. ;               and has a fondness of returning to verbal response codes
  66. ;               as opposed to numeric.  It's slow, but it's sure.
  67. ;
  68. ;               Also, I am suggesting that the equates in BAUDTB: be set to
  69. ;               0 for baud rates that your modem cannot support.  I found
  70. ;               that when I accidently set a baud rate to 2400 on the
  71. ;               Volksmodem12 I was configuring that it locked the modem
  72. ;               completely.  This is to solve that.  If you get an error
  73. ;               when you try to set a higher, valid rate, check the equates
  74. ;               at this label.
  75. ;
  76. ;               Lastly, fixed a bug that has been bugging me for some time
  77. ;               with the SET LENGTH command.
  78. ;                                               Lee McEwen
  79. ;
  80. ;  11/21/87    Added equates for the Practical Peripherals PM2400SA
  81. ;        2400 baud modem.  This is one of the very good quality
  82. ;        inexpensive clone modems, but needs a few tricks to
  83. ;        use, particularly with DTR disconnects and numeric 
  84. ;        codes.
  85. ;
  86. ;        Also changed the SYSVER screen to something I rather
  87. ;        prefer.  Don't mean to step on toes.  Return it to
  88. ;        the original if you prefer....
  89. ;                        Lee McEwen
  90. ;                        (904) 272-3964
  91. ;
  92. ;  08/04/87    Minor changes to allow it to assemble with ASM or LASM.
  93. ;                        Bill Duerr
  94. ;
  95. ;  07/11/86    Added two new Equates to help support my Xerox 820-I
  96. ;        with the newer Model Hayes Smartmodem 1200.  The
  97. ;        reason for the equates are as follows:
  98. ;
  99. ;        NOBLINK was added for Xerox 820-I owners that don't
  100. ;        wish to see a BLINKY BLINKY Sys Ver at the begining
  101. ;        of MEX may be nice for Xerox 820-II but annoying for
  102. ;        Xerox 820-I Owners.
  103. ;
  104. ;        NEW1200 was added to insure that NUMERIC RESULTS would
  105. ;        be displayed after calling a phone number.  The reason for
  106. ;        this was because I run a PBBS Bulletin Board and when I
  107. ;        wish to use MEX I need to perform an "ATZ" to reset the
  108. ;        status of my MODEM after exiting BYE.  This Equate also
  109. ;        sets the Monitor Speaker to high volume for I can here it
  110. ;        in the noisy environment that my SYSTEM is in.
  111. ;
  112. ;                    - Carol L. Miller, Sr.
  113. ;                    - EDP Consultants,  - PBBS
  114. ;                    - (405) 237-9890
  115. ;
  116. ;
  117. ;  02/21/86    Added code that stores the baud rate being used on
  118. ;        exit to CP/M.  This vaule is recovered on return to
  119. ;        MEX.  This permits the proper calculation for the
  120. ;        transfer time when sending a file after a return.
  121. ;                        Harry Leman
  122. ;
  123. ;  02/08/86    Added code for the call-waiting block that will be
  124. ;        available at some later date.  The number '70' is
  125. ;        dialed prior to the number being called.  This will
  126. ;        disable the call-waiting signal to interrupt the call.
  127. ;        This feature will be active only during the current
  128. ;        call.  Corrected a problem with the pulse/tone flag so
  129. ;        that it is used while in the PBX function.  However
  130. ;        the pulse mode is always used to get through the PBX
  131. ;        but the pulse/tone flag is used after access to the
  132. ;        outside line.  The pulse/tone flag is also used for
  133. ;        the call-waiting block function, to dial the '70' and
  134. ;        the number to be called.
  135. ;                        Harry Leman
  136. ;
  137. ;  10/18/85    Added code for operating through a PBX system and
  138. ;        call waiting block function if supported by your
  139. ;        telephone company.  Also corrected display atributes
  140. ;        for the XEROX 820-II.
  141. ;                        Harry Leman
  142. ;
  143. ;  05/30/85    Added equates for 300/1200/ or USR2400 to initialize the
  144. ;        modem properly and take advantage of all available codes
  145. ;        from the different modems. Added auto baud set for 1200
  146. ;        baud fall-back when using a USR2400. Added equates for
  147. ;        ANCHOR 1200 for it's special ideocyncracies.
  148. ;                        Russ Pencin
  149. ;
  150. ;  05/28/85    Added the NOPAR and PARITY Mex calls. A few minor cleanups.
  151. ;                              Ron Carter
  152. ;
  153. ;  05/14/85    Appropriated all of the code from the MXO-KP28 overlay.
  154. ;        Removed code pertaining to internal modems. Added code
  155. ;        to support the U.S. Robotics Courier 2400 extended responce
  156. ;        messages (enabled by equate). This overlay will work on
  157. ;        both 820-I and 820-II              Russ Pencin TDC
  158. ;
  159. ;  Credits:
  160. ;
  161. ;  All of the individuals who perfected the KP28 overlay.
  162. ;  M7KP-1 overlay structure by Irv Hoff
  163. ;  Smartmodem dialing routine by Ron Fowler
  164. ;
  165. ;  Bug Reports:
  166. ;
  167. ;  Would appreciate a note of any problems be left on the
  168. ;  THE Dallas Connection RCP/M (214) 238-1016 (300/1200/2400)
  169. ;
  170. ;
  171. ;------------------------------------------------------------
  172. ;
  173. ; Misc equates
  174. ;
  175. NO    EQU    0
  176. YES    EQU    0FFH
  177. TPA    EQU    100H
  178. BELL    EQU    07H        ; Activate bell
  179. TAB    EQU    09H        ; Tab
  180. LF    EQU    0AH        ; Line feed
  181. CR    EQU    0DH        ; Carrage return
  182. CLCRT    EQU    1AH        ; Clear screen code
  183. ESC    EQU    1BH        ; Start of escape sequence
  184. DENABL    EQU    28H        ; Disables attribute display
  185. ENABL    EQU    29H        ; Enables attribute display
  186. CSPEED    EQU    003CH        ; Actual connect speed of modem
  187. MONITOR    EQU    0F00H        ; Entry of XEROX monitor
  188. MODE    EQU    0D54H        ; Contents of location indicates mode of MEX
  189.                 ; 00 - MEX in command mode
  190.                 ; 01 - MEX in terminal mode
  191.                 ; 02 - SENDOUT active
  192.                 ; 03 - Keysting being transmitted
  193.                 ; Christensen-protocol
  194.                 ; 04 - File transfer send
  195.                 ; 05 - File transfer receive
  196.                 ; CIS protocol
  197.                 ; 06 - File transfer, send
  198.                 ; 07 - File transfer, receive
  199. SSETV    EQU    0D57H        ; SSET vector as determined by using
  200.                 ; MEXPAT11.ASM, a DW at this location
  201.                 ; Should point to address of SSETCM,
  202.                 ; The command processor for the SSET cmd.
  203. ;
  204. ;  PLEASE SET THE FOLLOWING EQUATE TO YES IF YOU WISH TO DO "ATZ"'s
  205. ;  and want to set the following defaults before dialing.
  206. ;    V0 = Display NUMERIC RESULT CODES
  207. ;    L3 = Set Monitor Speaker Volume to High
  208. ;
  209. NEW1200    EQU    NO        ; Yes, if using newer Model of Hayes 1200
  210. NOBLINK    EQU    NO         ; Yes, If using Xerox 820-I and you don't
  211.                 ; Wish to have a blinking SYSVER Message
  212. ;
  213. ;  PLEASE SET ONLY ONE OF THE FOLLOWING SEVEN EQUATES TO YES !
  214. ;
  215. USR2400    EQU    NO         ; Yes, if using A U.S.Robotics 2400
  216. PM2400SA EQU    YES        ; Yes, if Practical Peripherals 2400
  217. B1200    EQU    NO        ; Yes, if using a Hayes 1200 compatible
  218. B300    EQU    NO        ; Yes, if using a Hayes 300 compatible
  219. ANCHOR    EQU    NO        ; Yes, if using an Anchor XII modem
  220. VOLKS12 EQU     NO              ; Yes, if using an Anchor Volksmodem 12
  221. PRO1200    EQU    NO        ; Yes, if Prometheus 1200 modem
  222. ;
  223.      IF    ANCHOR OR VOLKS12
  224. DIALAB    EQU    041H            ; Special Anchor Modem dial abort
  225.      ENDIF
  226. ;
  227.      IF    NOT ANCHOR AND NOT VOLKS12
  228. DIALAB    EQU    CR        ; All others use CR to abort dial
  229.      ENDIF
  230. ;
  231. ; XEROX 820 port definitions
  232. ;
  233. DATPORT    EQU    04H        ; Base data port
  234. CTLPORT    EQU    DATPORT+2    ; Modem status port
  235. BAUDRP    EQU    00H        ; Modem baud rate port
  236. ;
  237. ; XEROX 820 bit definitions
  238. ;
  239. MDRCVB    EQU    01H        ; Modem receive bit (DAV)
  240. MDRCVR    EQU    01H        ; Modem receive ready
  241.      IF    NOT PRO1200
  242. MDSNDB    EQU    04H        ; Modem send bit
  243. MDSNDR    EQU    04H        ; Modem send ready bit
  244.      ENDIF
  245.      IF    PRO1200
  246. MDSNDB    EQU    24H        ; Mask for pin 5, CTC to allow 1200 baud
  247. MDSNDR    EQU    24H        ; Port and 300 baud phone, command ATB1
  248.      ENDIF
  249. ;
  250. ; MEX Service Processor
  251. ;
  252. MEX    EQU    0D00H        ; Address of the service processor
  253. INMDM    EQU    255        ; Get char from port to A, CY=no more in 100 ms
  254. TIMER    EQU    254        ; Delay 100ms * reg B
  255. TMDINP    EQU    253        ; B=# secs to wait for char, cy=no char
  256. CHEKCC    EQU    252        ; Check for ^C from KBD, Z=present
  257. SNDRDY    EQU    251        ; Test for modem-send ready
  258. RCVRDY    EQU    250        ; Test for modem-receive ready
  259. SNDCHR    EQU    249        ; Send a character to the modem (after sndrdy)
  260. RCVCHR    EQU    248        ; Recv a char from modem (after rcvrdy)
  261. LOOKUP    EQU    247        ; Table search: see CMDTBL comments for info
  262. PARSFN    EQU    246        ; Parse filename from input stream
  263. BDPARS    EQU    245        ; Parse baud-rate from input stream
  264. SBLANK    EQU    244        ; Scan input stream to next non-blank
  265. EVALA    EQU    243        ; Evaluate numeric from input stream
  266. LKAHED    EQU    242        ; Get nxt char w/o removing from input
  267. GNC    EQU    241        ; Get char from input, cy=1 if none
  268. ILP    EQU    240        ; Inline print
  269. DECOUT    EQU    239        ; Decimal output
  270. PRBAUD    EQU    238        ; Print baud rate
  271. PRNTBL    EQU    237        ; Prints table in columnar format, table
  272.                 ; Pointer passed in HL, returns CY=1 if
  273.                 ; Output aborted with ^C
  274. PRID    EQU    236        ; Prints current MEX ID on console
  275.                 ;
  276. CONOUT    EQU    2        ; Simulated BDOS function 2: console char out
  277. PRINT    EQU    9        ; Simulated BDOS function 9: print string
  278. INBUF    EQU    10        ; Input buffer, same structure as BDOS 10
  279. ;==========================================================================
  280. ;        Start of actual overlay
  281. ;==========================================================================
  282.     ORG    TPA        ; We begin
  283. ;
  284.     DS    3        ; MEX has a JMP START here
  285.     DS    2        ; Not used by MEX
  286. TPULSE:    DB    'T'        ; T=touch, P=pulse (Used by this overlay)
  287. CLOCK:    DB    25        ; Clock speed x .1, up to 25.5 mhz.
  288. ;
  289.      IF    B300
  290. MSPEED:    DB    1        ; Sets display time for sending a file
  291.      ENDIF            ; 0=110  1=300    2=450  3=600  4=710
  292.                 ; 5=1200 6=2400 7=4800 8=9600 9=19200
  293.      IF    B1200 OR ANCHOR    OR PRO1200 OR VOLKS12
  294. MSPEED:    DB    5        ; SET 1200 BAUD
  295.      ENDIF
  296.      IF    USR2400 OR PM2400SA
  297. MSPEED:    DB    6        ; SET 2400 BAUD
  298.      ENDIF
  299. ;
  300. BYTDLY:    DB    4        ; Default time to send character in
  301.                 ; Terminal mode file transfer (0-9)
  302.                 ; 0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms
  303. CRDLY:    DB    5        ; End-of-line delay after CRLF in terminal
  304.                 ; Mode file transfer for slow BBS systems
  305.                 ; 0=0 delay, 1=100 ms, 5=500 ms, 9=900 ms
  306. COLUMS:    DB    5        ; Number of directory columns
  307. SETFL:    DB    YES        ; Yes=user-defined SET command
  308. SCRTST:    DB    YES        ; Yes=if home cursor and clear screen
  309.                 ; Routine at CLRSCRN
  310.     DB    0        ; Was once ACKNAK, now spare
  311. BAKFLG:    DB    YES        ; Yes=make .BAK file
  312. CRCDFL:    DB    YES        ; Yes=default to CRC checking
  313.                 ; No=default to Checksum checking
  314. TOGCRC:    DB    YES        ; Yes=allow toggling of Checksum to CRC
  315. CVTBS:    DB    NO        ; Yes=convert backspace to rub
  316. TOGLBK:    DB    YES        ; Yes=allow toggling of bksp to rub
  317. ADDLF:    DB    YES        ; No=no LF after CR to send file in
  318.                 ; Terminal mode (added by remote echo)
  319. TOGLF:    DB    YES        ; Yes=allow toggling of LF after CR
  320. TRNLOG:    DB    NO        ; Yes=allow transmission of logon
  321.                 ; Write logon sequence at location LOGON
  322. SAVCCP:    DB    YES        ; Yes=do not overwrite CCP
  323. LOCNXT:    DB    YES        ; Yes=local cmd if EXTCHR precedes
  324.                 ; No=not local cmd if EXTCHR precedes
  325. TOGLOC:    DB    YES        ; Yes=allow toggling of LOCNXTCHR
  326. LSTTST:    DB    YES        ; Yes=allow toggling of printer on/off
  327.                 ; In terminal mode. Set to no if using
  328.                 ; The printer port for the modem
  329. XOFTST:    DB    NO        ; Yes=allow testing of XOFF from remote
  330.                 ; While sending a file in terminal mode
  331. XONWT:    DB    NO        ; Yes=wait for XON after sending CR while
  332.                 ; Transmitting a file in terminal mode
  333. TOGXOF:    DB    YES        ; Yes=allow toggling of XOFF testing
  334. IGNCTL:    DB    NO        ; Yes=do not send control characters
  335.                 ; Above CTL-M to CRT in terminal mode
  336.                 ; No=send any incoming CTL-char to CRT
  337. EXTRA1:    DB    0        ; For future expansion
  338. EXTRA2:    DB    0        ; For future expansion
  339. ;
  340. ;  See MEX Newsletter #002, the low bit of location 0D06H, in MEX.COM,
  341. ;  must  be set in order to use this alternate "terminal command set".
  342. ;  Use DDT or some other program to set the bit if this alternate
  343. ;  terminal command set is desired.
  344. ;
  345. BRKCHR:    DB    '@'        ; @ = Send a 300 ms. break tone
  346. NOCONN:    DB    'N'        ; N = Disconnect from phone line
  347. LOGCHR:    DB    'L'        ; L = Send logon
  348. LSTCHR:    DB    'P'        ; P = Toggle printer
  349. SAVCHR:    DB    'S'        ; S = Open input text buffer
  350. TRNCHR:    DB    'T'        ; T = Transmit file to remote
  351. UNSVCH:    DB    'Q'        ; U = Close input text buffer
  352. EXTCHR:    DB    '^'        ; ^ = Send next character
  353. ;
  354.     DS    2        ; Not used
  355. ;
  356. ; Low-level modem I/O area.  Next 3 need to be ten bytes long!
  357. ;
  358. INC:    MVI    A,10H        ; Read modem control port
  359.     OUT    CTLPORT
  360.     IN    CTLPORT
  361.     DB    0,0,0        ; Spares of needed
  362.     RET
  363. ;
  364.     OUT    DATPORT        ; Output data to modem port
  365.     DB    0,0,0,0,0,0,0    ; Spares if needed
  366.     RET
  367. ;
  368.     IN    DATPORT        ; Input data from modem port
  369.     ANI    07FH        ; Mask location for parity test
  370. MASK    EQU    $-1
  371.     DB    0,0,0,0,0    ; Spares if needed
  372.     RET
  373. ;
  374. ; Bit-test routines.
  375. ;
  376. MASKR:    ANI    MDRCVB ! RET    ; Bit to test for receive ready
  377. TESTR:    CPI    MDRCVR ! RET    ; Value of receive bit when ready
  378. MASKS:    ANI    MDSNDB ! RET    ; Bit to test for send ready
  379. TESTS:    CPI    MDSNDR ! RET    ; Value of send bit when ready
  380. ;
  381.     DS    12
  382. ;
  383. LOGON:    DS    2        ; Needed for MDM compat, not ref'd by MEX
  384. DIALV:    JMP    DIAL
  385. DISCV:    JMP    DISCON
  386. GOODBV:    JMP    GOODBYE        ; Called before exit to CP/M
  387. INMODV:    JMP    NITMOD        ; Initialization. Called at cold-start
  388. NEWBDV:    JMP    PBAUD        ; Set baud rate
  389. NOPARV:    JMP    NOPAR        ; Set modem for no-parity
  390. PARITV:    JMP    PARITY        ; Set modem parity
  391. SETUPV:    JMP    SETCMD        ; SET cmd: jump to a RET if you don't write SET
  392. SPMENV:    DS    3        ; Not used with MEX
  393. VERSNV:    JMP    SYSVER        ; Overlay's voice in the sign-on message
  394. BREAKV:    JMP    SBREAK        ; Send a break
  395. ;
  396. ; MDM calls supported in MEX 1.0 but not recommended for use.
  397. ;
  398. ILPRTV:    DS    3        ; Replace with MEX function 9
  399. INBUFV:    DS    3        ; Replace with MEX function 10
  400. ILCMPV:    DS    3        ; Replace with table lookup funct. 247
  401. INMDMV:    DS    3        ; Replace with MEX function 255
  402. NXSCRV:    DS    3        ; Not supported by MEX (returns w/no action)
  403. TIMERV:    DS    3        ; Replace with MEX function 254
  404. ;
  405. ;  Next 2 must be 9 bytes long!
  406. ;
  407. CLREOS:    LXI    D,EOSMSG
  408.     MVI    C,PRINT
  409.     CALL    MEX
  410.     RET
  411. ;
  412. CLS:    LXI    D,CLSMSG
  413.     MVI    C,PRINT
  414.     CALL    MEX
  415.     RET
  416. ;
  417. ;==================================================================
  418. ;        End of fixed area
  419. ;==================================================================
  420. ;
  421. ; Print out the overlay version
  422. ;
  423. SYSVER:    CALL    MILP
  424.     ;
  425.      IF    NOT NOBLINK
  426.     DB    ESC,ENABL
  427.      ENDIF
  428.     ;
  429.     DB    CLCRT
  430.     DB    '___________________',CR,LF
  431.     DB    'MEX Modem Executive',CR,LF
  432.     DB    '    Version 1.14',CR,LF,LF
  433.     DB    '(c) 1984 Ronald G. Fowler',CR,LF,LF
  434.     ;
  435.     DB    'Configured for XEROX 820-II with',CR,LF
  436.     ;
  437.      IF    USR2400
  438.      DB    'U.S.Robotics Courier 2400'
  439.      ENDIF
  440.      IF    PM2400SA
  441.     DB    'Practical Peripherals PM2400SA'
  442.      ENDIF
  443.      IF    B1200
  444.     DB    'Hayes Compatiable 1200 baud'
  445.      ENDIF
  446.      IF    B300
  447.     DB    'Hayes Compatiable 300 baud'
  448.      ENDIF
  449.      IF    ANCHOR
  450.     DB    'Anchor Signalman Mark XII'
  451.      ENDIF
  452.          IF     VOLKS12
  453.         DB      'Anchor Volksmodem 12'              
  454.          ENDIF
  455.      IF    PRO1200
  456.     DB    'Prometheus 1200 ProModem'
  457.      ENDIF
  458.     ;
  459.     DB    ' modem',CR,LF
  460.     DB    'using MXO-XE'
  461.     DB    REV/10+'0'
  462.     DB    REV MOD    10+'0'
  463.     DB    ' overlay.',CR,LF,LF,LF,LF
  464.     ;
  465.      IF    NOT NOBLINK
  466.     DB    ESC,DENABL
  467.      ENDIF
  468.     ;
  469.     DB    0        ; Termination of signon message
  470.     RET
  471. ;
  472. ;
  473. ; Break, disconnect and goodbye routines
  474. ;
  475. SBREAK:    MVI    A,5
  476.     OUT    CTLPORT
  477.     LDA    REG5
  478.     ORI    00010000B    ; SEND A BREAK TONE
  479.     JMP    GOODBYE1
  480.      IF    NOT ANCHOR AND NOT VOLKS12
  481. DISCON:    MVI    A,5
  482.     OUT    CTLPORT        ; SEND TO THE STATUS PORT
  483.     LDA    REG5
  484.     ANI    01001000B    ; TURN OFF DTR
  485.      ENDIF
  486.      IF    ANCHOR OR VOLKS12
  487. DISCON:    MVI    B,20
  488.     MVI    C,TIMER        ; Wait 2 seconds
  489.     CALL    MEX
  490.     LXI    H,SMATN        ; Send '+++'
  491.     CALL    SMSEND
  492.     MVI    B,40        ; Wait 4 more seconds (Anchor is slow)
  493.     MVI    C,TIMER
  494.     CALL    MEX
  495.     LXI    H,SMDISC    ; Send 'ATH'
  496.     CALL    SMSEND
  497.     MVI    B,10            ; Wait 1 second
  498.     MVI    C,TIMER
  499.     CALL    MEX
  500.     RET
  501.      ENDIF
  502. ;
  503. GOODBYE1: OUT    CTLPORT
  504.     MVI    B,5        ; DELAY 500 mS. for slow modems
  505.     MVI    C,TIMER        ; Increase this value to drop
  506.     CALL    MEX        ; DTR longer
  507. GOODBYE:LDA    MSPEED        ; Get baud rate
  508.     STA    CSPEED        ; Save for return from cpm
  509.     MVI    A,5
  510.     OUT    CTLPORT
  511.     LDA    REG5        ; RESTORE TO NORMAL
  512.     OUT    CTLPORT
  513.     CALL    MILP
  514.      IF    NOBLINK
  515.     DB    BELL,0
  516.      ENDIF
  517.      IF    NOT NOBLINK
  518.     DB    ESC,DENABL,BELL,0
  519.      ENDIF
  520.     RET
  521. ;
  522. ; Initialize RS-232 port, default modes.
  523. ;
  524. NITMOD:    CALL    INC        ; SEE IF MODEM IS CONNECTED, I.E., RETURNING
  525.     ANI    08H        ; TO ACTIVE MODEM, WITH CARRIER FROM CP/M
  526.     JNZ    OLDMOD        ; Stay with old baud rate
  527.     CALL    NITSIO        ; INITIALIZE EXTERNAL RS-232 PORT
  528. ;
  529. NITMOD2:LDA    DFBAUD        ; SET DEFAULT BAUD RATE
  530.     OUT    BAUDRP        ; SEND TO BAUD GENERATOR
  531.     LDA    MONFLG        ; GET MONITOR DEFAULT
  532.     ORA    A
  533.     MVI    A,'0'        ; Turn speaker off
  534.     JZ    NITMOD4
  535.      IF    NOT USR2400 AND NOT ANCHOR AND NOT VOLKS12
  536.                                 ; Anchor and Volksmodem 12 modems 
  537.                                 ; do not have speakers
  538.     MVI    A,'1'        ; Turn speaker on
  539.      ENDIF
  540.      IF    USR2400
  541.     MVI    A,'3'
  542.      ENDIF
  543. NITMOD4:STA    SMINIT+3    ; PUT IT IN SMINIT STRING
  544.     LDA    ANSFLG        ; GET MODE DEFAULT
  545.     ORA    A
  546.     MVI    A,'0'        ; ORIGINATE
  547.     JZ    NITMOD5
  548.     MVI    A,'1'        ; ANSWER
  549. NITMOD5:STA    SMINIT+8    ; PUT IT IN SMINIT STRING
  550.     LXI    H,SMINIT
  551. SINIT:    CALL    SMSEND        ; SEND THE INIT STRING
  552. SMTLP1:    MVI    C,INMDM        ; WAIT FOR MODEM RESPONSE
  553.     CALL    MEX
  554.     JNC    SMTLP1        ; EAT EVERYTHING UNTIL SILENCE FOR
  555.     RET            ; 100 mS.
  556. ;
  557. OLDMOD:    LDA    CSPEED        ; Get old baud rate
  558.     STA    MSPEED        ; Use after return from cpm
  559.     RET
  560. ;
  561. ;    Initialize the Zilog SIO chip
  562. ;
  563. NITSIO:    MVI    A,00H        ; Select reg. 0
  564.     OUT    CTLPORT
  565.     LDA    REG0        ; Command byte
  566.     OUT    CTLPORT
  567.     MVI    A,04H        ; Select reg. 4
  568.     OUT    CTLPORT
  569.     LDA    REG4        ; Receive/transmit control byte
  570.     OUT    CTLPORT
  571.     MVI    A,03H        ; Select reg. 3
  572.     OUT    CTLPORT
  573.     LDA    REG3        ; Receiver logic byte
  574.     OUT    CTLPORT
  575.     MVI    A,05H        ; Select reg. 5
  576.     OUT    CTLPORT
  577.     LDA    REG5        ; Transmitter logic byte
  578.     OUT    CTLPORT
  579.     RET
  580. ;
  581. ; Set to mask parity from input
  582. ;
  583. NOPAR:    MVI    A,07FH
  584.     STA    MASK
  585.     RET
  586. ;
  587. ; Set to not mask parity from input
  588. ;
  589. PARITY:    MVI    A,0FFH
  590.     STA    MASK
  591.     RET
  592. ;
  593. ; Set command processor
  594. ;
  595. SETCMD:    MVI    C,SBLANK    ; ANY ARGUMENTS?
  596.     CALL    MEX
  597.     JC    SETSHO        ; IF NOT, DISPLAY DEFAULT(S)
  598.     LXI    D,ECMDTBL
  599. SETCMD1:MVI    C,LOOKUP
  600.     CALL    MEX        ; PARSE THE ARGUMENT
  601.     PUSH    H        ; SAVE ANY PARSED ARGUMENTS ON STACK
  602.     RNC            ; IF WE HAVE ONE, RETURN TO IT
  603.     POP    H        ; OOPS, INPUT NOT FOUND IN TABLE
  604. SETERR:    LXI    D,SETEMS
  605.     MVI    C,PRINT
  606.     CALL    MEX
  607.     RET
  608. SETEMS:    DB    CR,LF,BELL,'SET command error',CR,LF,'$'
  609. ;
  610. ; Argument table
  611. ;
  612. ECMDTBL:DB    '?'+80H        ; HELP
  613.     DW    SETHELP
  614.     DB    'ORI','G'+80H    ; ORIGINATE MODE
  615.     DW    ORIG
  616.     DB    'ANSWE','R'+80H    ; ANSWER MODE
  617.     DW    ANS
  618.     DB    'TON','E'+80H    ; TONE DIALING
  619.     DW    STTONE
  620.     DB    'PULS','E'+80H    ; PULSE DIALING
  621.     DW    STPULSE
  622.     DB    'BLOC','K'+80H    ; BLOCK CALL WAITING
  623.     DW    BLK
  624.     DB    'UNBLOC','K'+80H ; PERMIT CALL WAITING
  625.     DW    NOBLK
  626.     DB    'MONITO','R'+80H ; MONITOR ON
  627.     DW    MONIT
  628.     DB    'QUIE','T'+80H    ; MONITOR OFF
  629.     DW    QUIET
  630.     DB    'BAU','D'+80H    ; SET BAUD
  631.     DW    STBAUD
  632.     DB    'DELA','Y'+80H    ; SET DELAY
  633.     DW    DELAY
  634.     DB    'PARIT','Y'+80H    ; SET PARITY
  635.     DW    STPRTY
  636.     DB    'STOPBIT','S'+80H ; SET STOPBITS
  637.     DW    STSTOP
  638.     DB    'LENGT','H'+80H    ; SET LENGTH
  639.     DW    STBITS
  640.     DB    'PB','X'+80H    ; SET FOR PBX SYSTEM
  641.     DW    SETPBX
  642.     DB    'STANDAR','D'+80H ; SET STANDARD PHONE
  643.     DW    SETSTD
  644.     DB    0        ; TABLE TERMINATOR
  645. ;
  646. ;  "SET (no args): PRINT CURRENT STATISTICS
  647. ;
  648. SETSHO:    CALL    MILP
  649.     DB    CLCRT,LF,LF
  650.     DB    'Current SET values:',CR,LF,0
  651.     CALL    CRLF
  652.     CALL    MODEMSH        ; Type of modem, external
  653.     CALL    CRLF
  654.     CALL    MDSHOW        ; Mode, answer or originate
  655.     CALL    CRLF
  656.     CALL    PBXSHOW        ; Telephone system being used
  657.     CALL    CRLF
  658.     CALL    TPSHOW        ; Tone or pulse dialing
  659.     CALL    CRLF
  660.     CALL    BDSHOW        ; Baud rate in effect
  661.     CALL    CRLF
  662.     CALL    DLSHOW        ; Delay for answer after dial
  663.     CALL    CRLF
  664.     CALL    CRLF
  665.     CALL    SHPRTY        ; Parity being used
  666.     CALL    CRLF
  667.     CALL    SHSTOP        ; Show stop bit(s)
  668.     CALL    CRLF
  669.     CALL    SHBITS        ; Bits/charcter
  670.     CALL    CRLF
  671.     CALL    MONSHO        ; State of monitor speaker
  672.     CALL    CRLF
  673.     CALL    CRLF
  674.     RET
  675. ;
  676. ; "SET ?" processor
  677. ;
  678. SETHELP:CALL    MILP
  679.     DB    CLCRT
  680.     DB    LF,LF,'SET ORIG      - Originate Mode'
  681.     DB    CR,LF,'SET ANSWER    - Answer Mode'
  682.     DB    CR,LF,'              < pulse dial through PBX >'
  683.     DB    CR,LF,'SET PBX       - Use for PBX system'
  684.     DB    CR,LF,'SET STANDARD  - Use for standard phone system'
  685.     DB    CR,LF,'SET TONE      - Use Tone Dialing'
  686.     DB    CR,LF,'SET PULSE     - Use Pulse Dialing'
  687.     DB    CR,LF,'              < No call-waiting functions if PBX >'
  688.     DB    CR,LF,'SET BLOCK     - Block Call-waiting'
  689.     DB    CR,LF,'SET UNBLOCK   - Permit Call-waiting'
  690.     DB    CR,LF,'SET DELAY     - <N> seconds to wait for answer'
  691.     DB    CR,LF,'SET QUIET     - Disable Speaker'
  692.     DB    CR,LF,'SET MONITOR   - Enable Speaker'
  693.     DB    CR,LF,'SET PARITY    - OFF, EVEN or ODD'
  694.     DB    CR,LF,'SET STOPBITS  - 1, 1.5 or 2'
  695.     DB    CR,LF,'SET LENGTH    - 5, 6, 7 or 8'
  696.     DB    CR,LF,'SET BAUD      - 110, 300, 1200, 2400, '
  697.     DB    '4800, 9600, or 19200'
  698.     DB    CR,LF,CR,LF,0
  699.     RET
  700. ;
  701. ; "SET MODEM" processor
  702. ;
  703. EXTM    EQU    $
  704. MODEMSH:CALL    MILP
  705.     DB    'External Modem',0
  706.     RET
  707. ;
  708. ; "SET BAUD" processor
  709. ;
  710. STBAUD:    MVI    C,BDPARS    ; FUNCTION CODE: PARSE A BAUDRATE
  711.     CALL    MEX        ; LET MEX LOOK UP CODE
  712.     JC    SETERR        ; JUMP IF INVALID CODE
  713.     CALL    PBAUD        ; NO, TRY TO SET IT
  714.     JC    SETERR        ; IF NOT ONE OF OURS, BOMB OUT
  715. BDSHOW:    LDA    MSPEED        ; GET CURRENT BAUD RATE
  716.     MVI    C,PRBAUD    ; LET MEX PRINT IT
  717.     CALL    MEX
  718.     RET
  719. ;
  720. ; This routine sets baud rate passed as MSPEED code in A.
  721. ; Returns CY=1 if baud rate not supported.
  722. ;
  723. PBAUD:    PUSH    H        ; DON'T ALTER ANYBODY
  724.     PUSH    D
  725.     PUSH    B
  726.     MOV    E,A        ; MSPEED CODE TO DE
  727.     MVI    D,0
  728.     LXI    H,BAUDTB    ; OFFSET INTO TABLE
  729.     DAD    D
  730.     MOV    A,M        ; FETCH CODE
  731.     ORA    A        ; 0 MEANS UNSUPPORTED CODE
  732.     STC            ; PREP CARRY IN CASE UNSUPPORTED
  733.     JZ    PBEXIT        ; EXIT IF BAD
  734.     OUT    BAUDRP        ; NO, SET THE RATE
  735.     STA    DFBAUD        ; SAVE CURRENT RATE
  736.     MOV    A,E        ; GET MSPEED CODE BACK
  737.     STA    MSPEED        ; SET IT
  738.     ORA    A        ; RETURN NO ERRORS
  739. PBEXIT:    POP    B
  740.     POP    D
  741.     POP    H
  742.     RET
  743. ;
  744. ; Setting baud rates unsupported by your modem to 0 will prevent accidentally
  745. ; putting your modem into an error condition and possibly locking it up.
  746. BAUDTB:    DB    02H        ; 02H =   110 baud
  747.     DB    05H        ; 05H =   300 baud
  748.     DB    0        ; 450 (not supported in this overlay)
  749.     DB    0          ; 06H =   600 baud
  750.     DB    0        ; 710 (not supported in this overlay)
  751.     DB    07H        ; 07H =  1200 baud
  752.     DB    0AH        ; 0AH =  2400 baud
  753.     DB    0CH             ; 0CH =  4800 baud
  754.     DB    0EH          ; 0EH =  9600 baud
  755.     DB    0FH          ; 0FH = 19200 baud
  756. ;
  757. SET12:    PUSH    PSW        ; DON'T ALTER ANYBODY
  758.     PUSH    B
  759.     MVI    A,07H
  760.     OUT    BAUDRP
  761.     STA    DFBAUD        ; SAVE CURRENT RATE
  762.     MVI    A,05H        ; GET MSPEED CODE BACK
  763.     STA    MSPEED        ; SET IT
  764.     POP    B
  765.     POP    PSW
  766.     ORA    A        ; RETURN WITH NO ERROR
  767.     RET
  768. ;
  769. ; Set mode processor
  770. ;
  771. ORIG:    XRA    A
  772.     STA    ANSFLG        ; SET ORIG FLAG
  773.     LXI    H,SMO        ; SEND OUT ATS0=0
  774.     CALL    SINIT
  775.     JMP    MDSHOW
  776. ANS:    MVI    A,0FFH
  777.     STA    ANSFLG        ; SET ANS FLAG
  778.     LXI    H,SMA        ; SEND OUT ATS0=1
  779.     CALL    SINIT
  780. MDSHOW:    LDA    ANSFLG
  781.     ORA    A
  782.     JZ    MDORIG
  783. MDSHW1:    CALL    MILP
  784.     DB    'Answer mode',0
  785.     RET
  786. MDORIG:    CALL    MILP
  787.     DB    'Originate mode',0
  788.     RET
  789. SMO:    DB    'ATS0=0',CR,0
  790. SMA:    DB    'ATS0=1',CR,0
  791. ;
  792. ; Monitor control processor
  793. ;
  794. QUIET:    XRA    A
  795.     STA    MONFLG
  796.     LXI    H,SMQT
  797.     CALL    SINIT
  798.     JMP    MONSHO
  799. MONIT:    MVI    A,0FFH
  800.     STA    MONFLG
  801.     LXI    H,SMMON
  802.     CALL    SINIT
  803. MONSHO:    LDA    MONFLG
  804.     ORA    A
  805.     JZ    MONOFF
  806.     CALL    MILP
  807.     DB    'Monitor Speaker: On',0
  808.     RET
  809. MONOFF:    CALL    MILP
  810.     DB    'Monitor Speaker: Off',0
  811.     RET
  812. SMQT:    DB    'ATM0',CR,0
  813. SMMON:
  814.      IF    NOT USR2400
  815.     DB    'ATM1',CR,0
  816.      ENDIF
  817.      IF    USR2400
  818.     DB    'ATM3',CR,0
  819.      ENDIF
  820. ;
  821. ; Set dial processor
  822. ;
  823. STTONE:    MVI    B,'T'
  824.     JMP    SDIAL1
  825. STPULSE:MVI    B,'P'
  826. SDIAL1:    LDA    TPULSE
  827.     CMP    B
  828.     JZ    TPSHOW
  829.     MOV    A,B
  830.     STA    TPULSE
  831. TPSHOW:    LDA    TPULSE
  832.     CPI    'T'
  833.     JZ    TPTONE
  834.     CALL    MILP
  835.     DB    'Pulse Dialing',0
  836.     RET
  837. TPTONE:    CALL    MILP
  838.     DB    'Tone Dialing',0
  839.     RET
  840. ;
  841. ; Set Call-waiting processor
  842. ;
  843. BLK:    XRA    A        ; Clear accumulator
  844.     STA    BLKFLG        ; Store in flag area
  845.     JMP    BLKSHOW        ; Show mode of operation
  846. NOBLK:    MVI    A,0FFH        ; Allow call waiting
  847.     STA    BLKFLG        ; Store in flag area
  848. BLKSHOW:LDA    PBXFLG        ; Check for PBX system
  849.     ORA    A        ; Set flags
  850.     JNZ    PBXBLK        ; Can't use both PBX & BLOCK
  851.     LDA    BLKFLG        ; Get mode flag
  852.     CPI    0        ; Check for block of call waiting
  853.     JZ    BLKSYS        ; Yes, go tell
  854.     CALL    MILP
  855.     DB    'Call-waiting interrupt OK',0
  856.     RET
  857. BLKSYS:    CALL    MILP
  858.     DB    'Call-waiting BLOCKED',0
  859.     RET
  860. PBXBLK:    CALL    MILP
  861.     DB    'Call-waiting BLOCK not active with PBX',0
  862.     RET
  863. ;
  864. ; Set delay processor
  865. ;
  866. DELAY:    MVI    C,EVALA
  867.     CALL    MEX
  868.     MOV    A,H
  869.     ORA    A
  870.     JNZ    SETERR
  871.     MOV    A,L
  872.     STA    NDELAY
  873. DLSHOW:    CALL    MILP
  874.     DB    'Answer Delay is ',0
  875.     LDA    NDELAY
  876.     MOV    L,A
  877.     MVI    H,0
  878.     MVI    C,DECOUT
  879.     CALL    MEX
  880.     CALL    MILP
  881.     DB    ' seconds',0
  882.     RET
  883. ;
  884. ;    SET PARITY command: reset transmit/receive parity
  885. ;
  886. ;        Parity is controlled by bits 0 and 1 of
  887. ;        the byte sent to the SIO write-register
  888. ;        4 as follows:
  889. ;
  890. ;           Parity    Bit 1       Bit 0
  891. ;             Off      -         0
  892. ;             Odd      0         1
  893. ;             Even      1         1
  894. ;
  895. STPRTY:    MVI    C,SBLANK    ; Check for parity code
  896.     CALL    MEX        ;
  897.     JC    SETERR        ; If none, print error
  898.     LXI    D,PARTBL    ; Check for proper syntax
  899.     MVI    C,LOOKUP
  900.     CALL    MEX
  901.     PUSH    H        ; Match found, go do it!
  902.     RNC            ;
  903.     POP    H        ; No match: fix stack and
  904.     JMP    SETERR        ; Print error
  905. ;
  906. PROFF:    LDA    REG4        ; Get register 4 byte
  907.     ANI    0FEH        ; Reset bit 0
  908.     JMP    PARTB1        ;
  909. PREVEN:    LDA    REG4        ;
  910.     ORI    003H        ; Set bits 0 & 1
  911.     JMP    PARTB1        ;
  912. PRODD:    LDA    REG4        ;
  913.     ORI    001H        ; Set bit 0
  914.     ANI    0FDH        ; Reset bit 1
  915. PARTB1:    STA    REG4        ;
  916.     CALL    NITSIO        ; Re-initialize the USART
  917.     CALL    SHPRTY        ; Print the result
  918.     RET            ;
  919. SHPRTY:    CALL    MILP        ; Display parity
  920.     DB    'Parity:  ',TAB,' ',0
  921.     LDA    REG4        ;
  922.     ANI    001H        ; Test bit 0
  923.     CPI    0        ; If bit0=0 then parity off
  924.     JNZ    SHPRT1        ;
  925.     CALL    MILP        ;
  926.     DB    'Off',0        ;
  927.     RET
  928. SHPRT1:    LDA    REG4        ;
  929.     ANI    002H        ; Test bit 1
  930.     CPI    0        ; If bit1=0 then parity odd
  931.     JNZ    SHPRT2        ;
  932.     CALL    MILP        ;
  933.     DB    'Odd',0        ;
  934.     RET            ;
  935. SHPRT2:    CALL    MILP        ;
  936.     DB    'Even',0    ;
  937.     RET
  938. ;
  939. ;    SET PARITY command table
  940. ;
  941. PARTBL:    DB    'OF','F'+80H    ; set parity off
  942.         DW      PROFF
  943.         DB      'NON','E'+80H   ; set parity to none (off)
  944.         DW      PROFF
  945.     DB    'EVE','N'+80H    ; set parity even
  946.     DW    PREVEN
  947.     DB    'OD','D'+80H    ; set parity odd
  948.     DW    PRODD
  949.     DB    0        ; <<== end of parity table
  950. ;
  951. ;    SET STOPBITS command: reset number of stop bits
  952. ;
  953. ;        The number of stop bits is controlled by bits
  954. ;        2 and 3 of the byte sent to the SIO write-
  955. ;        register 4, as follows:
  956. ;
  957. ;            Stop bits       Bit 3    Bit 2
  958. ;            1         0          1
  959. ;               1.5         1          0
  960. ;            2         1          1
  961. ;
  962. ;
  963. STSTOP:    MVI    C,SBLANK    ; Check for stop bits
  964.     CALL    MEX        ;
  965.     JC    SETERR        ; If none, print error
  966.     LXI    D,STPTBL    ; Check for proper syntax
  967.     MVI    C,LOOKUP
  968.     CALL    MEX        ;
  969.     PUSH    H        ; Match found, go do it!
  970.     RNC            ;
  971.     POP    H        ; No match: fix stack and
  972.     JMP    SETERR        ; Print error
  973. ;
  974. STOP01:    LDA    REG4        ; Get register 4 byte
  975.     ANI    0F7H        ; Reset bit 3
  976.     ORI    004H        ; Set bit 2
  977.     JMP    STSTP1        ;
  978. STOP02:    LDA    REG4        ;
  979.     ORI    00CH        ; Set bits 2 and 3
  980.     JMP    STSTP1        ;
  981. STOP15:    LDA    REG4        ;
  982.     ORI    008H        ; Set bit 3
  983.     ANI    0F8H        ; Reset bit 2
  984. STSTP1:    STA    REG4        ;
  985.     CALL    NITSIO        ;
  986.     CALL    SHSTOP        ; Print the result
  987.     RET
  988. SHSTOP:    CALL    MILP        ; Display stop-bits
  989.     DB    'Stop bits:',TAB,' ',0
  990.     LDA    REG4        ;
  991.     ANI    004H        ; Test bit 2
  992.     CPI    0        ; If bit2=0 then 1.5
  993.     JNZ    SHSTP1        ;
  994.     CALL    MILP        ;
  995.     DB    '1.5',0        ;
  996.     RET
  997. SHSTP1:    LDA    REG4        ;
  998.     ANI    008H        ; Test bit 3
  999.     CPI    0        ; If bit3=0 then 1
  1000.     JNZ    SHSTP2        ;
  1001.     CALL    MILP        ;
  1002.     DB    '1',0        ;
  1003.     RET
  1004. SHSTP2:    CALL    MILP        ;
  1005.     DB    '2',0        ;
  1006.     RET
  1007. ;
  1008. ;    SET STOPBITS command table
  1009. ;
  1010. STPTBL:    DB    '1'+80H        ; "set stop 1"
  1011.     DW    STOP01
  1012.     DB    '2'+80H        ; "set stop 2"
  1013.     DW    STOP02
  1014.     DB    '1.','5'+80H    ; "set stop 1.5"
  1015.     DW    STOP15
  1016.     DB    0        ; <<== End of stop-bits table
  1017. ;
  1018. ;    SET LENGTH command: set bits per character
  1019. ;
  1020. ;        The number of bits per character is controlled for
  1021. ;        the receiver circuit by bits 6 and 7 of the byte
  1022. ;        sent to the SIO write-register 3 and for the trans-
  1023. ;        mitter circuit by bits 5 and 6 of the byte sent to
  1024. ;        the SIO write-register 5.  The assumption has been
  1025. ;        made here that both transmission and reception will
  1026. ;        be carried on at the same number of bits per charac-
  1027. ;        ter.  The bit configurations are shown for register
  1028. ;        3 only, but are the same for register 5:
  1029. ;
  1030. ;            BPC     Bit 7        Bit 6
  1031. ;             5          0          0
  1032. ;             6          1          0
  1033. ;             7          0          1
  1034. ;             8          1          1
  1035. ;
  1036. STBITS:    MVI    C,SBLANK    ; Check for bits/char parameter
  1037.     CALL    MEX        ;
  1038.     JC    SETERR        ; If none, print error
  1039.     LXI    D,BITTBL    ; Check for proper syntax
  1040.     MVI    C,LOOKUP
  1041.     CALL    MEX
  1042.     PUSH    H        ; Match found, go do it!
  1043.     RNC            ;
  1044.     POP    H        ; No match: fix stack and
  1045.     JMP    SETERR        ; Print error
  1046. ;
  1047. BIT5:    LDA    REG3        ;
  1048.     ANI    0BFH        ; Reset bit 6
  1049.     ANI    07FH        ; Reset bit 7
  1050.     STA    REG3        ;
  1051.     LDA    REG5        ;
  1052.     ANI    0DFH        ; Reset bit 5
  1053.     ANI    0BFH        ; Reset bit 6
  1054.     JMP    STBTS1        ;
  1055. BIT6:    LDA    REG3        ;
  1056.     ANI    0BFH        ; Reset bit 6
  1057.     ORI    080H        ; Set bit 7
  1058.     STA    REG3        ;
  1059.     LDA    REG5        ;
  1060.     ANI    0DFH        ; Reset bit 5
  1061.     ORI    040H        ; Set bit 6
  1062.     JMP    STBTS1        ;
  1063. BIT7:    LDA    REG3        ;
  1064.     ORI    040H        ; Set bit 6
  1065.     ANI    07FH        ; Reset bit 7
  1066.     STA    REG3        ;
  1067.     LDA    REG5        ;
  1068.     ORI    020H        ; Set bit 5
  1069.     ANI    0BFH        ; Reset bit 6
  1070.     JMP    STBTS1        ;
  1071. BIT8:    LDA    REG3        ;
  1072.     ORI    040H        ; Set bit 6
  1073.     ORI    080H        ; Set bit 7
  1074.     STA    REG3        ;
  1075.     LDA    REG5        ;
  1076.     ORI    020H        ; Set bit 5
  1077.     ORI    040H        ; Set bit 6
  1078. STBTS1:    STA    REG5        ;
  1079.     CALL    NITSIO        ;
  1080.     CALL    SHBITS        ; Print the result
  1081.     RET
  1082. SHBITS:    CALL    MILP        ; Display bits/char
  1083.     DB    'Bits/char:',TAB,' ',0
  1084.     LDA    REG5        ;
  1085.     ANI    040H        ; Test bit 6
  1086.     CPI    0        ; If bit6=0 then 6 bpc
  1087.     JNZ    SHBTS2        ;
  1088.     LDA    REG5        ;
  1089.     ANI    020H        ; Test bit 5
  1090.     CPI    0        ; If bit5=0 then 5 bpc
  1091.     JNZ    SHBTS1        ;
  1092.     CALL    MILP        ;
  1093.     DB    '5',0        ;
  1094.     RET            ;
  1095. ;
  1096. SHBTS1:    CALL    MILP        ;
  1097.     DB    '7',0        ;
  1098.     RET            ;
  1099. SHBTS2:    LDA    REG5        ;
  1100.     ANI    20H        ; Test bit 5
  1101.     CPI    0        ; If bit=5 then 6 bpc
  1102.     JNZ    SHBTS3        ;
  1103.     CALL    MILP        ;
  1104.     DB    '6',0        ;
  1105.     RET            ;
  1106. SHBTS3:    CALL    MILP        ;
  1107.     DB    '8',0        ;
  1108.     RET            ;
  1109. ;
  1110. ; Set lenght command table
  1111. ;
  1112. BITTBL:    DB    '5'+80H    ; "set bits 5"
  1113.     DW    BIT5
  1114.     DB    '6'+80H    ; "set bits 6"
  1115.     DW    BIT6
  1116.     DB    '7'+80H    ; "set bits 7"
  1117.     DW    BIT7
  1118.     DB    '8'+80H    ; "set bits 8"
  1119.     DW    BIT8
  1120.     DB    0        ; <<== end of bpc table
  1121. ;
  1122. ;     Set PBX command table
  1123. ;
  1124. SETSTD:    XRA    A        ; Clear accumulator
  1125.     STA    PBXFLG        ; Store in flag area
  1126.     JMP    PBXSHOW        ; Show system in use
  1127. SETPBX:    MVI    A,0FFH        ; PBX system value
  1128.     STA    PBXFLG        ; Store in flag area
  1129. PBXSHOW:LDA    PBXFLG        ; Get system flag
  1130.     CPI    0FFH        ; Check for PBX
  1131.     JZ    PBXSYS        ; Yes, go tell
  1132.     CALL    MILP        ;
  1133.     DB    'Standard phone system',CR,LF,0
  1134.     JMP    BLKSHOW        ; Show call-waitig status
  1135. PBXSYS:    CALL    MILP
  1136.     DB    'PBX phone system',0
  1137.     RET
  1138. ;
  1139. ;This is the DIAL routine called by MEX to dial a digit. The digit
  1140. ;to be dialed is passed in the A register. Note that two special
  1141. ;codes must be intercepted as non-digits: 254 (start dial sequence)
  1142. ;and 255 (end-dial sequence).  MEX will always call DIAL with 254
  1143. ;in the accumulator prior to dialing a number. MEX will also call
  1144. ;dial with 255 in A as an indication that dialing is completed. Thus,
  1145. ;the overlay may use these values to "block" the number, holding it
  1146. ;in a buffer until it is completely assembled (in fact, that's the
  1147. ;scheme employed here).
  1148. ;
  1149. ;After the 254-start-dial sequence, MEX will call the overlay with
  1150. ;digits, one-at-a-time.  MEX will make no assumtionns about the dig-
  1151. ;its, and will send each to the DIAL routine un-inspected (some modems,
  1152. ;like the Smartmodem, allow special non-numeric characters in the
  1153. ;phone number, and MEX may make no assumptions about these).
  1154. ;
  1155. ;After receiving the end-dial sequence (255) the overlay must take
  1156. ;whatever end-of-dial actions are necessary *including* waiting for
  1157. ;carrier at the distant end.  The overlay should monitor the keyboard
  1158. ;during this wait (using the MEX keystat service call), and return
  1159. ;an exit code to MEX in the A registerm as follows:
  1160. ;    0-Carrier detected, connection established
  1161. ;    1-Far end busy (only for modems that can detect this condition)
  1162. ;    2-No answer (or timed out waiting for modem response)
  1163. ;    3-Keyboard abort (^C only: all others should be ignored)
  1164. ;    4-Error reported by modem
  1165. ;    5-No ring reported by modem
  1166. ;    6-No dial tone reported by modem
  1167. ; (No other codes should be returned after an end-dial sequence)
  1168. ;
  1169. ;The overlay should not loop forever in the carrier-eait routine, but
  1170. ;instead use either the oberlay timer vector, of the INMDMV (timed 100
  1171. ;ms character wait) service call routine.
  1172. ;
  1173. ;The DIAL routine is free to use any of the registers, but must return
  1174. ;the above code after the end-dial sequence.
  1175. ;
  1176. ;Dialing routine
  1177. ;
  1178. ;
  1179. DIAL:    LHLD    DIALPT        ; Fetch pointer
  1180.     CPI    254        ; Start dial?
  1181.     JZ    STDIAL1        ; Jump if so
  1182.     CPI    255        ; End dial?
  1183.     JZ    ENDIAL1        ; Jump if so
  1184. ;
  1185. ; Not start or end sequence, must be a digit to be sent to the modem
  1186. ;
  1187.     MOV    M,A        ; Put character in buffer
  1188.     INX    H        ; Advance pointer
  1189.     SHLD    DIALPT        ; Stuff pointer
  1190.     RET
  1191. ;
  1192. ; Here on a start-dial sequence
  1193. ;
  1194. STDIAL1:LXI    H,DIALBF    ; Set up buffer pointer
  1195.     SHLD    DIALPT
  1196.     RET
  1197. ;
  1198. PBXRTN:    LDA    TPULSE        ; Get type dial
  1199.     STA    PBXDIAL+7    ; Put it into string
  1200.     LXI    H,PBXDIAL    ; Get PBX string
  1201.     CALL    SMSEND        ; Send the string
  1202.     LXI    H,DIALBF    ; Get address of dial buffer
  1203.     CALL    SMSEND        ; Send the number
  1204.     JMP    WAITSM        ; Wait for modem response
  1205. ;
  1206. BLKRTN:    LDA    TPULSE        ; Get type dial
  1207.     STA    BLKDIAL+3    ; Put it into string
  1208.     LXI    H,BLKDIAL    ; Get dial string
  1209.     CALL    SMSEND        ; Send it
  1210.     LXI    H,DIALBF    ; Get number to dial
  1211.     CALL    SMSEND        ; Dial the number
  1212.     JMP    WAITSM        ; Wait for midem response
  1213. ;
  1214. ; Here on end-dial sequence
  1215. ;
  1216. ENDIAL1:MVI    M,CR        ; Stuff end-of-line into buffer
  1217.     INX    H        ; Followed by terminator
  1218.     MVI    M,0        ;
  1219.     LDA    TPULSE        ; Set overlay's touch-tone flag
  1220.     STA    SMDIAL+3    ; Put into string
  1221.     LDA    PBXFLG        ; Get PBX flag
  1222.     CPI    0FFH        ; What system is it?
  1223.     JZ    PBXRTN        ; Jump if PBX
  1224.     LDA    BLKFLG        ; Get call waiting flag*
  1225.     CPI    0FFH        ; Block call waiting?
  1226.     JNZ    BLKRTN        ; Yes, then go block call waiting
  1227.     LXI    H,SMDIAL    ; Point to dialing string
  1228.     CALL    SMSEND        ; Send the string
  1229. WAITSM:    MVI    C,INMDM        ; Get function
  1230.     CALL    MEX        ; Catch any output from modem
  1231.     JNC    WAITSM        ; Loop unitl no more characters
  1232. ;
  1233. ; The following loop waits for a result from the modem
  1234. ;
  1235. RESULT:
  1236.      IF    PRO1200
  1237.     XRA    A        ; Clear accumulator
  1238.     STA    MDMRESP        ; Clear storage area
  1239.      ENDIF
  1240.     LDA    NDELAY        ; Set delay count
  1241.     MOV    C,A        ; Put delay count into C
  1242. SMWLP:    PUSH    B        ; Save B&C on stack
  1243.     MVI    B,1        ; Check for a char, up to 1 sec wait
  1244.     MVI    C,TMDINP    ; Timed input function
  1245.     CALL    MEX        ;
  1246.     POP    B        ; Restore B after return
  1247.     JNC    SMTEST        ; Jump if modem had a character
  1248.     PUSH    B        ; No character, test for ^C from console
  1249.     MVI    C,CHEKCC    ;
  1250.     CALL    MEX        ;
  1251.     POP    B        ;
  1252.     JNZ    SMNEXT        ; If not, jump
  1253.     CALL    SMDMOFF        ; Yes, shut down the modem
  1254.     MVI    A,3        ; Return abort code
  1255.     RET
  1256. SMNEXT:    DCR    C        ; No
  1257.     JNZ    SMWLP        ; Continue
  1258. ;
  1259. ; No modem response within the time specified is SET DELAY command
  1260. ;
  1261. SMTIMO:    CALL    SMDMOFF
  1262.     MVI    A,2        ; Return timeout code
  1263.     RET
  1264. ;
  1265. ; Modem gave us a result, check it!
  1266. ;
  1267.      IF    NOT PRO1200
  1268. SMTEST:    ANI    07FH        ; Ignore any parity
  1269.     CALL    SMANAL        ; Test the result
  1270.     JC    RESULT        ; Go try again if unknown response
  1271.     MOV    A,B        ; A=result, returns with result in B
  1272.     PUSH    PSW        ; Save it
  1273.      ENDIF
  1274.      IF    PRO1200
  1275. SMTEST:    ANI    0FH        ; Mask ASCII data
  1276.     STA    MDMRESP        ; Store character received
  1277.     MVI    B,0        ; Clear B for transfer
  1278. NEXTBIT:MVI    C,INMDM        ; Check for second ASCII character
  1279.     CALL    MEX
  1280.     CPI    CR        ; Was it a carrage return?
  1281.     JZ    DONE        ; Jump if it was the last
  1282.     ANI    0FH        ; Make it ASCII
  1283.     MOV    B,A        ; Save it in B
  1284.     LDA    MDMRESP        ; Get the previous character
  1285.     RAL            ; Make room for new LSB
  1286.     RAL
  1287.     RAL
  1288.     RAL
  1289.     ORA    B        ; Put into BCD form
  1290.     STA    MDMRESP        ; Store the two digit result
  1291.     JMP    NEXTBIT        ; Check for another character
  1292. DONE:    LDA    MDMRESP        ; Get the whole result
  1293.     CALL    SMANAL        ; Test the result
  1294.     JC    RESULT        ; If unknown, try again
  1295.     MOV    A,B        ; Put result code in A
  1296.     PUSH    PSW        ; Save the result
  1297.      ENDIF
  1298. ;
  1299. SMTLP:    MVI    C,INMDM        ; Eat any additional chars from modem
  1300.     CALL    MEX
  1301.     JNC    SMTLP        ; Until 100mS of quiet time
  1302.     POP    PSW        ; Return the code
  1303.     RET
  1304. ;
  1305. SMANAL:    MVI    B,0        ; Prep connect code
  1306.      IF    B300
  1307.     CPI    'C'        ; "connect"?
  1308.     RZ
  1309.      ENDIF
  1310.      IF    NOT B300 AND NOT PRO1200
  1311.     CPI    '1'        ; Numeric version of "connect"
  1312.     RZ
  1313.     CPI    '5'        ; Numeric version of "connect 1200"
  1314.     JZ    SET12        ; Insure that baud gets set to 1200
  1315.      ENDIF
  1316.      IF    PRO1200
  1317.     CPI    1        ; Numeric for "connect"
  1318.     RZ
  1319.     CPI    5        ; Numeric for "connect 1200"
  1320.     JZ    SET12
  1321.      ENDIF
  1322.     INR    B        ; Prep busy code B=1
  1323.      IF    PRO1200
  1324.     CPI    62H        ; Remote busy code
  1325.     JNZ    NOBZY        ; Jump arround if not busy
  1326.     MVI    A,CR        ; Get ready ot abort call
  1327.     MVI    C,SNDCHR    ; Send carrage return to modem
  1328.     CALL    MEX
  1329.     RET
  1330.      ENDIF
  1331.      IF    NOT PRO1200 AND    NOT B300
  1332.     CPI    'B'
  1333.     RZ
  1334.      ENDIF
  1335.      IF    USR2400    OR ANCHOR OR PM2400SA
  1336.     CPI    '7'
  1337.     RZ
  1338.      ENDIF
  1339.          IF     VOLKS12
  1340.         CPI     '3'
  1341.         RZ
  1342.          ENDIF
  1343. NOBZY:    INR    B        ; Prep no connect message B=2
  1344.     CPI    'N'        ; N=no connect
  1345.     RZ
  1346.      IF    NOT PRO1200 AND    NOT B300
  1347.     CPI    '3'        ; Numeric version of "no connect"
  1348.     RZ
  1349.      ENDIF
  1350.      IF    PRO1200
  1351.     CPI    3        ; Not ASCII
  1352.     RZ
  1353.      ENDIF
  1354.     MVI    B,4        ; Prep for modem error
  1355.     CPI    'E'        ; E=error
  1356.     RZ
  1357.      IF    NOT B300 AND NOT PRO1200
  1358.     CPI    '4'        ; Numeric version of error
  1359.      ENDIF
  1360.      IF    PRO1200
  1361.     CPI    4        ; Not ASCII
  1362.     RZ
  1363.     CPI    41H        ; Invalid command result code
  1364.     RZ
  1365.     CPI    45H        ; Buffer overflow
  1366.     RZ
  1367.     MVI    B,5        ; Prep no response (ring) to dial
  1368.     CPI    44H
  1369.     RZ
  1370.      ENDIF
  1371.      IF    USR2400    OR PRO1200 OR PM2400SA
  1372.     MVI    B,6
  1373.      ENDIF
  1374.      IF    USR2400 OR PM2400SA
  1375.     CPI    '6'        ; No dial tone detected
  1376.      ENDIF
  1377.      IF    PRO1200
  1378.     CPI    43H        ; No dial tone detected
  1379.      ENDIF
  1380.     RZ
  1381. ; Note: The Volksmodem12 has no response code for 'No dialtone detected'.
  1382. ;
  1383. ; Unknown response, return but first clear modem
  1384. ;
  1385. WTLF:    CPI    LF        ; Linefeed?
  1386.     STC            ; Set carry flag
  1387.     RZ            ; End if so
  1388.      IF    PRO1200
  1389.     CPI    CR
  1390.     STC
  1391.     RZ
  1392.      ENDIF
  1393.     MVI    C,INMDM        ; No, get next character
  1394.     CALL    MEX
  1395.     JNC    WTLF        ; Unless busy, then loop
  1396.     RET
  1397. ;
  1398. ; Utility sub-routines
  1399. ;
  1400. SMSEND:    MVI    C,SNDRDY    ; Wait for modem ready
  1401.     CALL    MEX
  1402.     JNZ    SMSEND
  1403.     MOV    A,M        ; Fetch next character
  1404.     INX    H
  1405.     ORA    A        ; End?
  1406.     RZ            ; Done of so
  1407.     MOV    B,A        ; No, position for sending
  1408.     MVI    C,SNDCHR    ; Nope, send the character
  1409.     CALL    MEX
  1410.     JMP    SMSEND
  1411. ;
  1412. SMDMOFF:MVI    B,DIALAB
  1413.     MVI    C,SNDCHR
  1414.     CALL    MEX
  1415.     MVI    B,10
  1416.     CALL    MTIME
  1417. ;
  1418.      IF    ANCHOR OR VOLKS12
  1419.     RET
  1420.      ENDIF
  1421. ;
  1422.      IF    NOT ANCHOR AND NOT VOLKS12
  1423.     JMP    DISCON        ; Make sure that it is off
  1424.      ENDIF
  1425. ;
  1426. MILP:    MVI    C,ILP
  1427.     JMP    MEX
  1428.     RET
  1429. ;
  1430. MTIME:    MVI    C,TIMER
  1431.     JMP    MEX
  1432.     RET
  1433. ;
  1434. COMMA:    CALL    MILP
  1435.     DB    ',',0
  1436.     RET
  1437. ;
  1438. CRLF:    CALL    MILP
  1439.     DB    CR,LF,0
  1440.     RET
  1441. ;
  1442. ;==============================================================
  1443. ; Data area
  1444. ;==============================================================
  1445. ;
  1446. ; Default UART parameters
  1447. ;
  1448. REG0:    DB    00011000B    ; Reset channel A
  1449. REG3:    DB    11000001B    ; Enable receive at 8 bits/char
  1450. REG4:    DB    01000100B    ; No parity, 1 stop bit, clock x16
  1451. REG5:    DB    11101010B    ; Enable transmit at 8 bits/char
  1452. ;
  1453. ; Miscellaneous Default Data
  1454. ;
  1455.      IF    NOT PRO1200 AND    NOT USR2400 AND NOT PM2400SA
  1456. PBXDIAL:DB    'ATDP9, T',0    ; String for PBX dial
  1457.      ENDIF
  1458.      IF    USR2400 OR PM2400SA
  1459. PBXDIAL:DB    'ATDP,9WT',0    ; String for PBX dial
  1460.      ENDIF
  1461.      IF    PRO1200
  1462. PBXDIAL:DB    'ATDP 9WT',0
  1463.      ENDIF
  1464. ;
  1465. BLKDIAL:DB    'ATV0 DT70',0    ; String to block call waaiting*
  1466. PBXFLG:    DB    00        ; FF=PBX, 00=standard phone
  1467. ;
  1468.      IF    NEW1200    OR PM2400SA
  1469. SMDIAL:    DB    'ATV0 L3 DT '    ; Please Read below:
  1470. ;
  1471. ;The Above DB Sets the NEW SMARTMODEM Defaults before dialing.
  1472. ;The above SMDIAL was used to support my newer Model SMARTMODEM,
  1473. ;and sets the following defaults before dialing.  The reason for this
  1474. ;was when I took down the BBS on my System it set the Modem to OFF-HOOK
  1475. ;and I have chosen to do an "ATZ" before trying to call another BBS with
  1476. ;my system.
  1477. ;
  1478. ;     V0 = NUMERIC RESULT CODES are displayed.
  1479. ;     L3 = Sets Monitor Speaker Volume to high volume.
  1480. ;
  1481. ;           - Carol L. Miller, Sr.
  1482. ;            - SYSOP
  1483. ;             - EDP Consultants    - PBBS
  1484. ;              - (405) 237-9890
  1485. ;
  1486.      ENDIF            ;
  1487. ;
  1488.          IF VOLKS12
  1489. SMDIAL: DB      'ATV0 DT'       ;
  1490.          ENDIF
  1491. ; The Volksmodem12 continually tries to return to verbose response codes.
  1492. ; The best way I've found to avoid this is to always specify numeric
  1493. ; responses each time you dial.
  1494. ;
  1495.      IF    NOT NEW1200 AND NOT PM2400SA AND NOT VOLKS12
  1496. SMDIAL:    DB    'ATDT '        ;
  1497.      ENDIF            ;
  1498. DIALBF:    DS    52        ; 2* 24 char max, + CR + NULL + SLOP
  1499. DIALPT:    DS    2        ; Dial position pointer
  1500. EOSMSG:    DB    17H,'$'        ; Clear to end of screen
  1501. CLSMSG:    DB    CLCRT,'$'    ; Clear whole screen
  1502. DIGIT:    DB    0        ; Save dialed digit
  1503. ;
  1504.      IF    B300
  1505. DFBAUD:    DB    05        ; 5=300, 6=600, 7=1200, 0AH=2400, 0EH=9600
  1506.      ENDIF
  1507.      IF    B1200 OR ANCHOR    OR PRO1200 OR VOLKS12
  1508. DFBAUD:    DB    07
  1509.      ENDIF
  1510.      IF    USR2400 OR PM2400SA
  1511. DFBAUD:    DB    0AH
  1512.      ENDIF
  1513.      IF    ANCHOR OR VOLKS12
  1514. MONFLG:    DB    00H        ; No monitor in ANCHOR or VOLKS12
  1515.      ENDIF
  1516.      IF     NOT ANCHOR AND NOT VOLKS12
  1517. MONFLG:    DB    0FFH        ; 0=monitor off, 0FFH=monitor on
  1518.      ENDIF
  1519.      IF     ANCHOR OR VOLKS12
  1520. SMATN:    DB    '+++',0        ; ANCHOR uses Smartmodem codes for disconnect
  1521. SMDISC:    DB    'ATH',CR,0
  1522.      ENDIF
  1523. ;
  1524. BLKFLG:    DB    0FFH        ; 0=block, FF=permit call waiting
  1525. ANSFLG:    DB    0        ; 0=originate, 0FFH=answer
  1526. NDELAY:    DB    25        ; Number of seconds for answer
  1527. MDMRESP:DB    0        ; Storage for modem response characters
  1528. ;
  1529.      IF    USR2400
  1530. SMINIT:    DB    'ATM3 S0=0 S7=60 S10=20 X4 V0',CR,0 ; Extended codes
  1531.      ENDIF
  1532.      IF    PM2400SA
  1533. SMINIT:    DB    'ATM3 S0=0 S7=60 L3 X4 V0 &D2',CR,0 ; Extended codes
  1534.      ENDIF
  1535.      IF    B1200 OR ANCHOR
  1536. SMINIT:    DB    'ATM1 S0=0 S7=60 X1 V0 Q0',CR,0    ; Some extended codes
  1537.      ENDIF
  1538.          IF     VOLKS12
  1539. SMINIT: DB      'ATS0=0 V0'     ;No extended codes
  1540.          ENDIF
  1541.      IF    PRO1200
  1542. SMINIT:    DB    'ATM1 S0=0 S7=60 S10=10 X1 V2 Q0 @TD',CR,0
  1543.      ENDIF
  1544.      IF    B300
  1545. SMINIT:    DB    'ATM1 S0=0 S7=60 S10=10 V1',CR,0 ; No extended commands
  1546.      ENDIF
  1547. ;
  1548.     END
  1549.