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 / MXO-KPS4.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  31KB  |  1,200 lines

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