home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / mex / mxh-vg4.asm < prev    next >
Assembly Source File  |  1994-07-13  |  34KB  |  1,309 lines

  1. ;     Title  'MEX Overlay for the Vector 4 Computer Version 1.0'
  2. ;            - Dick LeBleu
  3. ;               - Winnipeg, Canada
  4. ;            - 5 Oct 1986
  5. ; Misc equates
  6. ;
  7. REV    EQU    10        ;OVERLAY REVISION LEVEL
  8. ;
  9. NO    EQU    0
  10. YES    EQU    0FFH
  11. ;
  12. TPA    EQU    100H
  13. ;
  14. CR    EQU    13
  15. LF    EQU    10
  16. TAB    EQU    9
  17. ;
  18. ANCHOR    EQU    NO        ;YES, ONLY if using Anchor Modem
  19. ANDAB    EQU    65        ;Anchor dial abort character ('A')
  20. ;
  21. ;
  22. ;  
  23. ;  MEX Overlay for Vector 4 Computers with external modems.
  24. ;  A full-featured SET command processor
  25. ;  is implemented to select between modems as well as set
  26. ;  specific characteristics of each one.  The following table
  27. ;  outlines the SET command options:
  28. ;
  29. ;    SET Command                 
  30. ;
  31. ;    PORT <C | P>                  
  32. ;    DELAY <n> (seconds)             
  33. ;    BAUD <rate>                 
  34. ;    ORIG (originate mode)             
  35. ;    ANSWER    (mode)                 
  36. ;    TONE (dialing)                 
  37. ;    PULSE (dialing)                 
  38. ;    MONITOR (speaker on)             
  39. ;    QUIET (speaker off)             
  40. ;    PARITY (Odd, Even, None)         
  41. ;    STOPBITS (1, 1.5, 2)             
  42. ;    LENGTH (5, 6, 7, or 8)           
  43. ;    MANUALO (turn off carrier tone   
  44. ;        for Originate mode)
  45. ;    MANUALA (turn on carrier tone    
  46. ;        for Answer mode)     
  47. ;
  48. ;............
  49. ;
  50. ;
  51. ;  This overlay includes the smartmodem dialing routine from
  52. ;  MXO-SM13.ASM by Ron Fowler which has been slightly modified
  53. ;  to allow programmable delay for answer.  (Note that this is
  54. ;  different from the "ATS7=nn".).
  55. ;
  56. ;  This overlay is intended to be fully compatible with the
  57. ;  MEX structure and should be readily upward compatible with
  58. ;  the predicted MEX 2.0.
  59. ;
  60. ;  Calling conventions for the various overlay entry points
  61. ;  are detailed more fully in the PMMI overlay (MXO-PMxx.ASM,
  62. ;  where xx=revision number).
  63. ;
  64. ;  History:
  65. ;
  66. ; 08/08/86  1.0  Modified for Vector 4 by Dick Le Bleu. 8251 instead of sio
  67. ;    
  68. ; 30/12/85  1.0  Modified for Ibex by Dick Le Bleu.  Added set port
  69. ;                command for switching between port A(Blue) and
  70. ;         B(Black).
  71. ;    
  72. ;  9/19/84  4.1     Fixed DISCON1 routine for non-Anchors, was leaving
  73. ;         DTR and RTS off, now lowers them for one sec and
  74. ;         raises it.. Also added code to dial routine to allow
  75. ;         any character (other than ^C) typed during a dial
  76. ;         command to abort THAT dial attempt, but will
  77. ;         proceed with repetition or next command. ^C will
  78. ;         abort call in progress and any other CALL cmds
  79. ;         lined up. (This is for "dumb" Smartmodems that
  80. ;         don't detect busy, if you hear busy, just hit
  81. ;         the space bar and it will give it up and try the
  82. ;         next one or try calling again.) -- Kim Levitt
  83. ;
  84. ;  9/9/84   4.0  Upgraded internal modem support to include
  85. ;         SET PARITY, STOPBITS, and LENGTH.  
  86. ;          Corrected error when setting STOPBITS to 1.5, which
  87. ;         was resetting parity off at the same time.  With the
  88. ;         the improvements to the internal modem support, all
  89. ;         features of SUPRTERM are now supported by this overlay.
  90. ;          Enhanced SET MANUAL processing for internal modem
  91. ;         to support manual Originate or Answer carrier tones.
  92. ;         Version level changed to eliminate confusion between
  93. ;         2.X and 3.X overlays currently in circulation.
  94. ;         Updated comments and documentation in all sections.
  95. ;                                           Terry Carroll
  96. ;
  97. ;  8/26/84  2.8  Added equate to support Anchor Signalman Mark XII modem.
  98. ;         This overlay now supports DSC, dial abort (^C),
  99. ;         and accurate SET DELAY processing for Anchor modems.
  100. ;         Also incorporated the PARITY, STOPBITS and LENGTH
  101. ;         commands from the Norm Saunders overlay (MXO-KP3X) in
  102. ;         an attempt to unify the MEX overlay identity crisis.
  103. ;
  104. ;  8/03/84  2.7     Added call to DISCON: (disconnect routine) in the
  105. ;         Smartmodem dialing routine at SMDMOFF:.  It appeared that
  106. ;         when either the delay timer timed out or a CTRL -C
  107. ;         abort coincided with a connect, the modem did 
  108. ;          connect, even though the overlay responded with
  109. ;         NO ANSWER. Added these calls to make sure there
  110. ;         is no unannounced connect.    John C. Smith
  111. ;
  112. ;  6/10/84  2.6  Undid revision 2.5.  MEX is intended NOT to disconnect
  113. ;         from the phone line on re-entering CPM; DCD detection
  114. ;         supports this function as well as preventing the
  115. ;         modem initialization string from being sent to the
  116. ;         remote computer.  For Smartmodem, set switch 6 up;
  117. ;         for other modems, enable DCD detection.  Also,
  118. ;         the internal modem initialization had been commented 
  119. ;         out without documentation.  This defeats one-half
  120. ;         of the value of this overlay.  Restored this
  121. ;         initialization.
  122. ;
  123. ;  6/03/84  2.5  Commented out three lines    Dennis Quinn
  124. ;         at NITMOD2 which prevented    Royal Oak, MI
  125. ;         "off the shelf" Smartmodem
  126. ;         from being initialized.  Reason for this is that
  127. ;         the Smartmodem asserts DCD even when no carrier
  128. ;         is being detected unless the case is opened and
  129. ;         an option switch is set.  Side effect of commenting
  130. ;         out these lines is re-entering MEX will transmit
  131. ;         the initialization sequence to the remote if you
  132. ;         are on-line.  If you set the appropriate option
  133. ;         switch (I can't remember which switch it is and
  134. ;         my Smartmodem book is at the office), uncomment
  135. ;         the code and all will be well.
  136. ;
  137. ;  6/02/84  2.4  Code was turning off RTS       Dennis Quinn
  138. ;         after disconnect sequence.     Royal Oak, MI
  139. ;         This was causing problems
  140. ;         with certain modems which are more intelligent than
  141. ;         the Smartmodem and require RTS before they will
  142. ;         assert CTS.  Enabled 110 baud operation for those
  143. ;         who are masochists.
  144. ;
  145. ;
  146. ;  5/29/84  2.2  Corrected SET ? to display    Steve Sanders
  147. ;         proper SET ORIG command instead
  148. ;         of SET ORIGINATE
  149. ;
  150. ;  5/18/84  1.0  Original version        John Smith - Manlius, NY
  151. ;
  152. ;  Credits:
  153. ;
  154. ;  M7KP-1 overlay structure by Irv Hoff
  155. ;  Smartmodem dialing routine by Ron Fowler
  156. ;
  157. ;  Bug Reports:
  158. ;
  159. ;  Would appreciate a note of any problems be left on the
  160. ;  Computers Etc. RBBS at 315-446-7793.
  161. ;
  162. ;
  163. ;------------------------------------------------------------
  164. ;
  165. ; Vector 4 default port definitions
  166. ;
  167. DCD    EQU    YES        ;if supported by port
  168. CMBAUD     EQU    11h        ; modem baud rate port
  169. PTBAUD    EQU    12h        ; printer baud rate port
  170. COMCTL    EQU    05h        ; modem status port
  171. COMDAT    EQU    04h        ; modem data port
  172. PRTCTL    EQU    07H        ; printer status port
  173. PRTDAT    EQU    06h        ; printer data port
  174. ;
  175. ; Vector 4 bit definitions
  176. ;
  177. MDRCVB    EQU    02H        ;modem receive bit (DAV)
  178. MDRCVR    EQU    02H        ;modem receive ready
  179. MDSNDB    EQU    01H        ;modem send bit
  180. MDSNDR    EQU    01H        ;modem send ready bit
  181. MDSDCD    EQU    80H        ;modem DCD ready bit
  182. ;
  183. ; MEX Service Processor
  184. ;
  185. MEX    EQU    0D00H        ;address of the service processor
  186. INMDM    EQU    255        ;get char from port to A, CY=no more in 100 ms
  187. TIMER    EQU    254        ;delay 100ms * reg B
  188. TMDINP    EQU    253        ;B=# secs to wait for char, cy=no char
  189. CHEKCC    EQU    252        ;check for ^C from KBD, Z=present
  190. SNDRDY    EQU    251        ;test for modem-send ready
  191. RCVRDY    EQU    250        ;test for modem-receive ready
  192. SNDCHR    EQU    249        ;send a character to the modem (after sndrdy)
  193. RCVCHR    EQU    248        ;recv a char from modem (after rcvrdy)
  194. LOOKUP    EQU    247        ;table search: see CMDTBL comments for info
  195. PARSFN    EQU    246        ;parse filename from input stream
  196. BDPARS    EQU    245        ;parse baud-rate from input stream
  197. SBLANK    EQU    244        ;scan input stream to next non-blank
  198. EVALA    EQU    243        ;evaluate numeric from input stream
  199. LKAHED    EQU    242        ;get nxt char w/o removing from input
  200. GNC    EQU    241        ;get char from input, cy=1 if none
  201. ILP    EQU    240        ;inline print
  202. DECOUT    EQU    239        ;decimal output
  203. PRBAUD    EQU    238        ;print baud rate
  204. ;
  205. CONOUT    EQU    2        ;simulated BDOS function 2: console char out
  206. PRINT    EQU    9        ;simulated BDOS function 9: print string
  207. INBUF    EQU    10        ;input buffer, same structure as BDOS 10
  208. ;
  209. DCONIO    EQU    6        ;BDOS Direct Console I/O function #
  210. DCONIN    EQU    0FFH        ;BDOS DCONIO flag for input
  211. BDOS    EQU    5        ;address of BDOS function caller
  212. ;
  213. ;
  214. ;    MACLIB    Z80
  215. ;
  216.     ORG    TPA        ;we begin
  217. ;
  218.     DB    0C3H        ;JMP instruction - requd for MEX+
  219.     DS    2        ;MEX has a JMP START here
  220. ;
  221.     DS    2        ;not used by MEX
  222. TPULSE:    DB    'T'        ;T=touch, P=pulse (Used by this overlay)
  223. CLOCK:    DB    50        ;clock speed x .1, up to 25.5 mhz.
  224. MSPEED:    DB    5        ;sets display time for sending a file
  225.                 ;0=110    1=300  2=450  3=600  4=710
  226.                 ;5=1200 6=2400 7=4800 8=9600 9=19200
  227. BYTDLY:    DB    5        ;default time to send character in
  228.                 ;terminal mode file transfer (0-9)
  229.                 ;0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms
  230. CRDLY:    DB    5        ;end-of-line delay after CRLF in terminal
  231.                 ;mode file transfer for slow BBS systems
  232.                 ;0=0 delay, 1=100 ms, 5=500 ms, 9=900 ms
  233. COLUMS:    DB    5        ;number of directory columns
  234. SETFL:    DB    YES        ;yes=user-defined SET command
  235. SCRTST:    DB    YES        ;yes=if home cursor and clear screen
  236.                 ;routine at CLRSCRN
  237.     DB    0        ;was once ACKNAK, now spare
  238. BAKFLG:    DB    YES        ;yes=make .BAK file
  239. CRCDFL:    DB    YES        ;yes=default to CRC checking
  240.                 ;no=default to Checksum checking
  241. TOGCRC:    DB    YES        ;yes=allow toggling of Checksum to CRC
  242. CVTBS:    DB    NO        ;yes=convert backspace to rub
  243. TOGLBK:    DB    YES        ;yes=allow toggling of bksp to rub
  244. ADDLF:    DB    NO        ;no=no LF after CR to send file in
  245.                 ;terminal mode (added by remote echo)
  246. TOGLF:    DB    YES        ;yes=allow toggling of LF after CR
  247. TRNLOG:    DB    NO        ;yes=allow transmission of logon
  248.                 ;write logon sequence at location LOGON
  249. SAVCCP:    DB    YES        ;yes=do not overwrite CCP
  250. LOCNXT:    DB    NO        ;yes=local cmd if EXTCHR precedes
  251.                 ;no=not local cmd if EXTCHR precedes
  252. TOGLOC:    DB    YES        ;yes=allow toggling of LOCNXTCHR
  253. LSTTST:    DB    YES        ;yes=allow toggling of printer on/off
  254.                 ;in terminal mode. Set to no if using
  255.                 ;the printer port for the modem
  256. XOFTST:    DB    NO        ;yes=allow testing of XOFF from remote
  257.                 ;while sending a file in terminal mode
  258. XONWT:    DB    NO        ;yes=wait for XON after sending CR while
  259.                 ;transmitting a file in terminal mode    
  260. TOGXOF:    DB    YES        ;yes=allow toggling of XOFF testing
  261. IGNCTL:    DB    NO         ;yes=do not send control characters
  262.                 ;above CTL-M to CRT in terminal mode
  263.                 ;no=send any incoming CTL-char to CRT
  264. EXTRA1:    DB    0        ;for future expansion
  265. EXTRA2:    DB    0        ;for future expansion
  266. BRKCHR:    DB    '@'-40H        ;^B = Send a 300 ms. break tone
  267. NOCONN:    DB    'N'-40H        ;^N = Disconnect from phone line
  268. LOGCHR:    DB    'L'-40H        ;^L = Send logon
  269. LSTCHR:    DB    'P'-40H        ;^P = Toggle printer
  270. UNSVCH:    DB    'R'-40H        ;^R = Close input text buffer
  271. TRNCHR:    DB    'T'-40H        ;^T = Transmit file to remote
  272. SAVCHR:    DB    'Y'-40H        ;^Y = Open input text buffer
  273. EXTCHR:    DB    '^'-40H        ;^^ = Send next character
  274. ;
  275.     DS    2        ;not used
  276. ;
  277. ; Low-level modem I/O routines.
  278. ;
  279. INCTL1:    JMP    INCTL        ;in modem control port
  280.     DB    0,0,0,0,0,0,0    ;spares if needed for non-PMMI
  281. ;
  282. OTDATA:    JMP    OUTDAT        ;out modem data port
  283.     DB    0,0,0,0,0,0,0    ;spares if needed for non=PMMI
  284. ;
  285. INDATA: JMP    INDAT        ;in modem data port
  286.     DB    0,0,0,0,0,0,0    ;spares if needed for non-PMMI
  287. ;
  288. ; Bit-test routines. 
  289. ;
  290. MASKR:    ANI MDRCVB ! RET    ;bit to test for receive ready
  291. TESTR:    CPI MDRCVR ! RET    ;value of receive bit when ready
  292. MASKS:    ANI MDSNDB ! RET    ;bit to test for send ready
  293. TESTS:    CPI MDSNDR ! RET    ;value of send bit when ready
  294. ;
  295.     DS    3
  296. DCDV:    JMP    CHKDCD
  297. RNGV:    JMP    CHKRNG
  298.     DS    3
  299. ;
  300. LOGON:    DS    2        ;needed for MDM compat, not ref'd by MEX
  301. DIALV:    JMP    DIAL
  302. DISCV:    JMP    DISCON
  303. GOODBV:    JMP    GOODBYE        ;called before exit to CP/M
  304. INMODV:    JMP    NITMOD        ;initialization. Called at cold-start
  305. NEWBDV:    JMP    PBAUD        ;set baud rate
  306. NOPARV:    RET!NOP!NOP        ;set modem for no-parity
  307. PARITV:    RET!NOP!NOP        ;set modem parity
  308. SETUPV:    JMP    SETCMD        ;SET cmd: jump to a RET if you don't write SET
  309. SPMENV:    RET!NOP!NOP        ;not used with MEX
  310. VERSNV:    JMP    SYSVER        ;Overlay's voice in the sign-on message
  311. BREAKV:    JMP    SBREAK        ;send a break
  312. ;
  313. ; MDM calls supported in MEX 1.0 but not recommended for use.
  314. ;
  315. ILPRTV:    DS    3        ;replace with MEX function 9
  316. INBUFV:    DS    3        ;replace with MEX function 10
  317. ILCMPV:    DS    3        ;replace with table lookup funct. 247
  318. INMDMV:    DS    3        ;replace with MEX function 255
  319. NXSCRV:    DS    3        ;not supported by MEX (returns w/no action)
  320. TIMERV:    DS    3        ;replace with MEX function 254
  321. ;
  322. CLREOS:    LXI    D,EOSMSG
  323.     MVI    C,PRINT
  324.     CALL    MEX
  325.     RET
  326. ;
  327. CLS:    LXI    D,CLSMSG
  328.     MVI    C,PRINT
  329.     CALL    MEX
  330.     RET
  331. ;------------------------------------------------------------
  332. ;
  333. ; end of fixed area
  334. ;
  335. ;------------------------------------------------------------
  336. ;
  337.     ORG    0200H
  338. ;
  339. ;  read data reg
  340. ;
  341. INDAT:    IN    COMDAT
  342.     RET
  343. ;
  344. ;  write data reg
  345. ;
  346. OUTDAT:    OUT    COMDAT
  347.     RET
  348. ;
  349. ;  read control reg
  350. ;
  351. INCTL:    IN    COMCTL
  352.     RET
  353. ;
  354. ;  write control reg
  355. ;
  356. OUTCTL:  OUT   COMCTL
  357.       RET
  358. ;
  359. ;  write baud rate counter
  360. ;
  361. OUTBD:    OUT    CMBAUD
  362.     RET
  363. ;
  364. ; MEX+ enhancements - Check for DCD A=0FFh if present, else 0
  365. ;
  366. CHKDCD:    PUSH    H
  367.     PUSH    D
  368.     PUSH    B
  369.     CALL    INCTL
  370.     ANI    MDSDCD
  371.     JZ    DCDRET
  372.     MVI    A,0FFH
  373. DCDRET:    POP    B
  374.     POP    D
  375.     POP    H
  376.     RET
  377. ;
  378. ; MEX+ enhancements - CHeck for Ring detect - (not used)
  379. ;
  380. CHKRNG:
  381.     XRA    A        ;a=0
  382.     RET
  383. ; Print out the overlay version
  384. ;
  385. SYSVER:      CALL    MILP
  386.       DB    CR,LF
  387.       DB    'Vector 4 Overlay - Version '
  388.       DB    REV/10+'0'
  389.       DB    '.'
  390.       DB    REV MOD 10+'0'
  391. ;
  392.     IF ANCHOR
  393.           DB    'A'        ;APPEND 'A' SUFFIX TO IDENTIFY OVERLAY
  394.                 ;VERSION AS CONFIGURED FOR ANCHOR MODEM
  395.     ENDIF
  396. ;
  397.       DB    CR,LF
  398.       DB    0
  399.       RET
  400. ;
  401. ; Break, disconnect and goodbye routines
  402. ;
  403. SBREAK:   LDA    CMD
  404.       PUSH    PSW
  405.       ORI    008H        ;SET BREAK
  406.       CALL    OUTCTL
  407.       MVI    B,3        ;DELAY 300 MS.
  408.       CALL    MTIME
  409.       POP    PSW
  410.       CALL    OUTCTL
  411.       RET
  412. ;
  413. ; Disconnect Routine
  414. ;
  415. DISCON: 
  416.   
  417.     IF ANCHOR
  418.                 ;Anchor does not respond to DTR
  419.                 ;so the only way to disconnect is through
  420.                 ;standard Smartmodem disconnect commands
  421.           MVI    B,20    
  422.       MVI    C,TIMER        ;wait 2 seconds
  423.       CALL    MEX
  424.       LXI    H,SMATN        ;send '+++'
  425.       CALL    SMSEND
  426.       MVI    B,40            ;wait 4 more seconds (Anchor is slow)
  427.       MVI    C,TIMER
  428.       CALL    MEX
  429.       LXI    H,SMDISC    ;send 'ATH'
  430.       CALL    SMSEND
  431.       MVI    B,10        ;wait 1 second
  432.       MVI    C,TIMER
  433.       CALL    MEX
  434.       RET
  435.     ENDIF
  436. ;
  437.     IF NOT ANCHOR
  438.           LDA    CMD
  439.       PUSH    PSW
  440.       ANI    0DDH
  441.       CALL    OUTCTL        ;SEND TO THE STATUS PORT
  442.       MVI    B,10        ;WAIT ONE SECOND
  443.       MVI    C,TIMER
  444.       CALL    MEX
  445.       POP    PSW
  446.       CALL    OUTCTL
  447.       RET
  448.     ENDIF
  449. ;
  450. ; GOODBYE routines are called by MEX prior to exit to CP/M
  451. ;
  452. GOODBYE:  MVI    B,3        ;DELAY 300 MS.
  453.       CALL  MTIME
  454.       RET
  455. ;
  456. ; Initialize RS-232 port and default modes.
  457. ;
  458. NITMOD:   CALL    CHKDCD        ;SEE IF MODEM IS CONNECTED, I.E., RETURNING
  459.       CPI   0           ;TO ACTIVE MODEM FROM CPM
  460.       RNZ            ;SKIP IF CONNECTED
  461. ;
  462. ;         Initialize Internal RS-232 and PIO port
  463. ;
  464. NITMOD2:  CALL  NITSIO
  465.       LDA    MONFLG        ;GET MONITOR DEFAULT
  466.       ORA    A
  467.       MVI    A,'0'        ;SPEAKER OFF
  468.       JZ    NITMOD4
  469.       MVI    A,'1'        ;SPEAKER ON
  470. NITMOD4:  STA    SMINIT+3    ;PUT IT IN SMINIT STRING
  471.       LDA    ANSFLG        ;GET MODE DEFAULT
  472.       ORA    A
  473.       MVI    A,'0'        ;ORIGINATE
  474.       JZ    NITMOD5
  475.       MVI    A,'1'        ;ANSWER
  476. NITMOD5:  STA    SMINIT+8    ;PUT IT IN SMINIT STRING
  477.       LXI    H,SMINIT
  478. SINIT:      CALL    SMSEND        ;SEND THE INIT STRING
  479. SMTLP1:      MVI    C,INMDM        ;WAIT FOR MODEM RESPONSE
  480.       CALL    MEX
  481.       JNC    SMTLP1        ;EAT EVERYTHING UNTIL SILENCE FOR
  482.       RET            ; 100 MSEC
  483. ;
  484. ;    Initialize the 8251 chip 
  485. ;
  486. NITSIO:    LXI    H,INITSQ    ;POINT TO SEQUENCE
  487.     MVI    B,INITSE    ;NUMBER OF BYTES IN SEQUENCE
  488. INIT1:    MOV    A,M        ;GET A BYTE
  489.     CALL    OUTCTL        ;SEND CHAR TO STATUS PORT
  490.     XTHL            ;DELAY IN CASE OF 6 MHZ.
  491.     XTHL
  492.     INX    H        ;POINT TO NEXT
  493.     DCR    B
  494.     JNZ    INIT1        ;SEND ENTIRE SEQUENCE
  495. INIT2:
  496.     MVI    C,0FFH        ;<C> = 0FFH IF INTERRUPTS ENABLED
  497.     LXI    H,0        ;PUSH KNOWN VALUE ONTO STACK
  498.     PUSH    H
  499.     POP    H
  500. ;    LDAI            ;CHECK Z-80 INTERRUPT STATUS
  501.     DB    0EDH,057H
  502.     JP    INIT3        ;JUMP IF INTERRUPTS ARE ENABLED
  503.     DCX    SP        ;NOW VERIFY THAT INTERRUPTS ARE
  504.     DCX    SP        ;REALLY DISABLED BY CHECKING
  505.     POP    H        ;KNOWN VALUE ON STACK TO SEE
  506.     MOV    A,H        ;IF INTERRUPT SERVICE ROUTINE
  507.     ORA    A        ;WAS CALLED.
  508.     JNZ    INIT3        ;JUMP IF INTERRUPTS ARE REALLY ENABLED
  509.     MVI    C,0        ;<C> = 000H IF INTERRUPTS ARE DISABLED
  510. INIT3:    DI            ;PROTECT BAUDRATE SET SEQUENCE
  511.     LXI    H,BAUDRATE    ;SET SELECTED BAUDRATE
  512.     MOV    A,M
  513.     CALL    OUTBD
  514.     INX    H
  515.     MOV    A,M
  516.     CALL    OUTBD
  517.     MOV    A,C        ;CHECK INTERRUPT STATUS
  518.     ORA    A
  519.     JZ    INITEXIT    ;LEAVE INTERRUPTS DISABLED
  520.     EI            ;ELSE RE-ENABLE INTERRUPTS
  521.  
  522. INITEXIT:
  523.     RET
  524. *
  525. INITSQ: DB    000H,000H,000H
  526. RESET:    DB    040H        ;SET FOR CONTROL SEQUENCE
  527. CNTL:    DB    04EH        ;DEFAULT CNTL 1 STP, NO PAR, 8 BIT, 16X
  528. CMD:    DB    027H        ;RTS, RCV EN, TX EN, DTR
  529. *
  530. INITSE    EQU    $-INITSQ
  531. *
  532. ;
  533. ; Set command processor
  534. ;
  535. SETCMD:      MVI    C,SBLANK    ;ANY ARGUMENTS?
  536.       CALL  MEX
  537.       JC    SETSHO        ;IF NOT, DISPLAY DEFAULT(S)
  538.       LXI    D,CMDTBL
  539.           MVI    C,LOOKUP
  540.       CALL  MEX        ;PARSE THE ARGUMENT
  541.       PUSH    H        ;SAVE ANY PARSED ARGUMENTS ON STACK
  542.       RNC            ;IF WE HAVE ONE, RETURN TO IT
  543.       POP    H        ;OOPS, INPUT NOT FOUND IN TABLE
  544. SETERR:      LXI    D,SETEMS
  545.       MVI    C,PRINT
  546.       CALL    MEX
  547.       CALL  CRLF
  548.       RET
  549. SETEMS:      DB    CR,LF,'SET command error',CR,LF,'$'
  550. ;
  551. SETBAD:      LXI    D,SETBMS
  552.       MVI    C,PRINT
  553.       CALL    MEX
  554.       RET
  555. SETBMS:      DB    CR,LF,'SET command not valid for modem',CR,LF,'$'
  556. ;
  557. ; Argument table
  558. ;
  559. CMDTBL:   DB    '?'+80H            ; HELP
  560.       DW    SETHELP
  561.       DB    'ORI','G'+80H        ; ORIGINATE MODE
  562.       DW    ORIG
  563.       DB    'POR','T'+80H        ; ORIGINATE MODE
  564.       DW    STPORT
  565.       DB    'ANSWE','R'+80H        ; ANSWER MODE
  566.       DW    ANS
  567.       DB    'TON','E'+80H        ; TONE DIALING
  568.       DW    STTONE
  569.       DB    'PULS','E'+80H        ; PULSE DIALING
  570.       DW    STPULSE
  571.       DB    'MONITO','R'+80H    ; MONITOR ON
  572.       DW    MONIT
  573.       DB    'QUIE','T'+80H        ; MONITOR OFF
  574.       DW    QUIET
  575.       DB    'BAU','D'+80H        ; SET BAUD
  576.       DW    STBAUD
  577.       DB    'DELA','Y'+80H        ; SET DELAY
  578.       DW    DELAY
  579.       DB    'PARIT','Y'+80H        ; SET PARITY
  580.       DW    STPRTY
  581.       DB    'STOPBIT','S'+80H    ; SET STOPBITS
  582.       DW    STSTOP
  583.       DB    'LENGT','H'+80H        ; SET LENGTH
  584.       DW    STBITS
  585.       DB    'MANUAL','O'+80H    ; SET MANUAL ORIGINATE
  586.       DW    MANUALO
  587.       DB    'MANUAL','A'+80H    ; SET MANUAL ANSWER
  588.       DW    MANUALA
  589.       DB    0            ;TABLE TERMINATOR
  590. ;
  591. ;
  592. ;  "SET (no args): PRINT CURRENT STATISTICS
  593. ;
  594. SETSHO:      CALL  MILP
  595.       DB    CR,LF
  596.       DB    'SET values:',CR,LF,0
  597.           CALL    CRLF
  598.       CALL    MDSHOW
  599.       CALL    CRLF
  600.       CALL    TPSHOW
  601.       CALL    CRLF
  602.       CALL    PTSHOW
  603.       CALL    CRLF
  604.       CALL    BDSHOW
  605.       CALL  CRLF
  606.       CALL    DLSHOW
  607.       CALL    CRLF
  608.       CALL    MONSHO
  609.       CALL    CRLF
  610.       CALL    CRLF
  611.       CALL  SHPRTY
  612.       CALL    CRLF
  613.       CALL    SHSTOP
  614.       CALL    CRLF
  615.       CALL  SHBITS
  616.       CALL    CRLF
  617.       CALL  CRLF
  618.       RET
  619. ;
  620. ; "SET ?" processor
  621. ;
  622. SETHELP:  CALL    MILP
  623.       DB    CR,LF,'SET PORT      - C or P'
  624.       DB    CR,LF,'SET ORIG'
  625.       DB    CR,LF,'SET ANSWER'
  626.       DB    CR,LF,'SET TONE'
  627.       DB    CR,LF,'SET PULSE'
  628.       DB    CR,LF,'SET DELAY     - <N> seconds'
  629.       DB    CR,LF,'SET PARITY    - OFF, EVEN or ODD'
  630.       DB    CR,LF,'SET STOPBITS  - 1, 1.5 or 2'
  631.       DB    CR,LF,'SET LENGTH    - 5, 6, 7 or 8'
  632.       DB    CR,LF,'SET QUIET     - Speaker OFF'
  633.       DB    CR,LF,'SET MONITOR   - Speaker ON'
  634.       DB    CR,LF,'SET BAUD      - 110, 300, 600, 1200'
  635.       DB    CR,LF,'                2400, 4800, 9600'
  636.       DB    CR,LF,'SET MANUALO   - Manual Originate mode'
  637.       DB    CR,LF,'SET MANUALA   - Manual Answer mode'
  638.       DB    CR,LF,CR,LF,0
  639.       RET
  640. ;
  641. ; "SET BAUD" processor
  642. ;
  643. STBAUD:      MVI    C,BDPARS    ;FUNCTION CODE: PARSE A BAUDRATE
  644.       CALL    MEX        ;LET MEX LOOK UP CODE
  645.       JC    SETERR        ;JUMP IF INVALID CODE
  646.       CALL    PBAUD        ;NO, TRY TO SET IT
  647.       JC    SETERR        ;IF NOT ONE OF OURS, BOMB OUT
  648. BDSHOW:      LDA    MSPEED        ;GET CURRENT BAUD RATE
  649.       MVI    C,PRBAUD    ;LET MEX PRINT IT
  650.       CALL    MEX
  651.       RET 
  652. ;
  653. ; This routine sets baud rate passed as MSPEED code in A.
  654. ; Returns CY=1 if baud rate not supported.
  655. ;
  656. PBAUD:      PUSH    H        ;DON'T ALTER ANYBODY
  657.       PUSH    D
  658.       PUSH     B
  659.       PUSH    A        ;SAVE MSPEED
  660.       ADD    A        ;DOUBLE INDEX INTO BAUD RATE TBL
  661.       MOV    E,A        ;MSPEED CODE TO DE
  662.       MVI    D,0
  663.       LXI    H,BAUDTB    ;OFFSET INTO TABLE
  664.       DAD    D
  665.       MOV    A,M        ;FETCH CODE
  666.       ORA    A        ;0 MEANS UNSUPPORTED CODE
  667.       STC            ;PREP CARRY IN CASE UNSUPPORTED
  668.       JZ    PBEXIT        ;EXIT IF BAD
  669.       STA    BAUDRATE    ;SAVE IN BAUDRATE LO
  670.       INX    H
  671.       MOV    A,M        ;NOW UPPER BYTE
  672.       STA    BAUDRATE+1
  673.       CALL    INIT2
  674.       POP    A        ;GET MSPEED CODE BACK
  675.       STA    MSPEED        ;SET IT
  676.       ORA    A        ;RETURN NO ERRORS
  677. PBEXIT:      POP    B
  678.       POP    D
  679.       POP    H
  680.       RET
  681. ;
  682. * DELAY CONSTANTS FOR BAUD RATE GENERATION
  683. *
  684. BAUDTB:      DW    0470H        ;110
  685.       DW    001A1H        ;300
  686.       DW    0        ;450 (not supported)
  687.       DW    00D0H        ;600
  688.       DW    0        ;710 (not supported)
  689.       DW    0068H        ;1200
  690.       DW    0034H        ;2400
  691.       DW    001AH        ;4800
  692.       DW    000DH        ;9600
  693.       DW    0        ;19200(not supported) 
  694.  
  695. BAUDRATE:
  696.     DW    0068H    ;DEFAULT
  697. ;
  698. ; SET MODE PROCESSOR ---- SET MODEM SELECTION TO INTERNAL OR EXTERNAL
  699. ;
  700. ORIG:      XRA    A
  701.       STA    ANSFLG        ;SET ORIG FLAG
  702.       LXI    H,SMO        ;SEND OUT ATS0=0
  703.       CALL    SINIT
  704.       JMP    MDSHOW
  705. ;
  706. SMO:      DB    'ATS0=0',CR,0
  707. SMA:      DB    'ATS0=1',CR,0
  708. ;
  709. ANS:      MVI    A,0FFH
  710.       STA    ANSFLG        ;SET ANS FLAG
  711.       LXI    H,SMA        ;SEND OUT ATS0=1
  712.       CALL    SINIT
  713.       CALL    MDSHOW
  714.       RET
  715. ;
  716. MDSHOW:      LDA    ANSFLG
  717.       ORA    A
  718.       JZ    MDORIG        
  719.       CALL    MILP
  720.       DB    'Auto-answer mode',0
  721.       RET
  722. MDORIG:      CALL    MILP
  723.       DB    'Originate mode: auto-answer disabled',0
  724.       RET
  725. ;
  726. ; Port control processor
  727. ;    
  728. STPORT:      MVI    C,SBLANK    ;check for stop bits
  729.       CALL    MEX        ;
  730.       JC    SETERR        ;if none, print error
  731.       LXI    D,PRTTBL    ;check for proper syntax
  732.       MVI   C,LOOKUP
  733.       CALL    MEX        ;
  734.       PUSH    H        ;match found, go do it!
  735.       RNC            ;
  736.       POP    H        ;no match: fix stack and
  737.       JMP    SETERR        ;  print error
  738. ;
  739. PRTC:    MVI    A,COMDAT
  740.     STA    INDAT+1
  741.     STA    OUTDAT+1
  742.     MVI    A,COMCTL
  743.     STA    INCTL+1
  744.     STA    OUTCTL+1
  745.     MVI    A,CMBAUD
  746.     STA    OUTBD+1
  747.     XRA    A
  748.     STA    PTFLG
  749.     CALL    PTSHOW
  750.     JMP    NITSIO
  751. ;
  752. PRTP:    MVI    A,PRTDAT
  753.     STA    INDAT+1
  754.     STA    OUTDAT+1
  755.     MVI    A,PRTCTL
  756.     STA    INCTL+1
  757.     STA    OUTCTL+1
  758.     MVI    A,PTBAUD
  759.     STA    OUTBD+1
  760.     MVI    A,0FFH
  761.     STA    PTFLG
  762.     CALL    PTSHOW
  763.     JMP    NITSIO
  764. ;
  765. PTSHOW:      LDA    PTFLG
  766.       ORA    A
  767.       JZ    PTSHOW1    
  768.       CALL    MILP
  769.       DB    'Printer port selected',0
  770.       RET
  771. PTSHOW1:  CALL    MILP
  772.       DB    'Communications port selected',0
  773.       RET
  774. PTFLG:      DB    0
  775. ;
  776. ;    SET PORT command table
  777. ;
  778. PRTTBL:      DB    'C'+80H        ;"set stop 1"
  779.       DW    PRTC
  780.       DB    'P'+80H        ;"set stop 2"
  781.       DW    PRTP
  782.       DB    0        ;<<== End of stop-bits table
  783.  
  784. ;
  785. ; Monitor control processor
  786. ;
  787. QUIET:      XRA    A
  788.       STA    MONFLG
  789.       LXI    H,SMQT
  790.       CALL    SINIT
  791.       JMP    MONSHO
  792. MONIT:      MVI    A,0FFH
  793.       STA    MONFLG
  794.       LXI    H,SMMON
  795.       CALL    SINIT
  796. MONSHO:      LDA    MONFLG
  797.       ORA    A
  798.       JZ    MONOFF
  799.       CALL    MILP
  800.       DB    'Speaker On',0
  801.       RET
  802. MONOFF:      CALL    MILP
  803.       DB    'Speaker Off',0
  804.       RET
  805. SMQT:      DB    'ATM0',CR,0
  806. SMMON:      DB    'ATM1',CR,0
  807. ;
  808. ; Set dial processor
  809. ;
  810. STTONE:      MVI    B,'T'
  811.       JMP    SDIAL1
  812. STPULSE:  MVI    B,'P'
  813. SDIAL1:   LDA    TPULSE
  814.       CPI    B
  815.       JZ    TPSHOW
  816.       MOV    A,B
  817.       STA    TPULSE
  818.       CPI    'P'
  819.       MVI    A,01010000B    ;PULSE DIAL
  820.       JZ    SDIAL2
  821.       MVI    A,01000000B    ;TONE DIAL
  822. SDIAL2:   STA    DIALWD
  823. TPSHOW:      LDA    DIALWD
  824.       ANI    00010000B
  825.       JZ    TPTONE
  826.       CALL    MILP
  827.       DB    'Pulse Dial',0
  828.       RET
  829. TPTONE:      CALL    MILP
  830.       DB    'Tone Dial',0      
  831.       RET
  832. ;
  833. ; Set manual processor
  834. ;
  835. MANUALO:  MVI    A,00H
  836.       STA   ANSFLG
  837.       LXI    H,SMMANO
  838.             CALL    SMSEND
  839.       JMP    OFF
  840. MANUALA:  MVI    A,0FFH
  841.       STA   ANSFLG
  842.       LXI    H,SMMANA
  843.             CALL    SMSEND
  844. OFF:      MVI    B,10        ;WAIT 1 SEC
  845.       CALL    MTIME
  846.       RET
  847. ;
  848. ; Set delay processor
  849. ;
  850. DELAY:      MVI    C,EVALA
  851.       CALL    MEX
  852.       MOV    A,H
  853.       ORA    A
  854.       JNZ    SETERR
  855.       MOV    A,L
  856.       STA    NDELAY
  857. DLSHOW:      CALL    MILP
  858.       DB    'Answer Delay is ',0
  859.       LDA    NDELAY
  860.       MOV    L,A
  861.       MVI    H,0
  862.       MVI    C,DECOUT
  863.       CALL    MEX
  864.       CALL    MILP
  865.       DB    ' seconds',0
  866.       RET
  867. ;
  868. ;    SET PARITY command: reset transmit/receive parity
  869. ;
  870. ;        Parity is controlled by bits 4 and 5 of
  871. ;        the byte sent to the 8251 CNTL register
  872. ;        as follows:
  873. ;
  874. ;           Parity    Bit 5       Bit 4
  875. ;                 Off          -          0
  876. ;              Odd      0         1
  877. ;             Even      1         1
  878. ;
  879. STPRTY:      MVI    C,SBLANK    ;check for parity code
  880.       CALL    MEX        ;
  881.       JC    SETERR        ;if none, print error
  882.       LXI    D,PARTBL    ;check for proper syntax
  883.       MVI    C,LOOKUP
  884.       CALL    MEX
  885.       PUSH    H        ;match found, go do it!
  886.       RNC            ;
  887.       POP    H        ;no match: fix stack and
  888.       JMP    SETERR        ;  print error
  889. ;
  890. PROFF:      LDA    CNTL        ;get register 4 byte
  891.       ANI    0CFH        ;reset bit 4,5
  892.       JMP    PARTB1        ;
  893. PREVEN:      LDA    CNTL        ;
  894.       ORI    030H        ;set bits 4 & 5
  895.       JMP    PARTB1        ;
  896. PRODD:      LDA    CNTL        ;
  897.       ORI    010H        ;set bit 4
  898.       ANI    0DFH        ;reset bit 5
  899. PARTB1:      STA    CNTL        ;
  900.       CALL    NITSIO        ;re-initialize the USART
  901.       CALL    SHPRTY        ;print the result
  902.       RET             ;
  903. SHPRTY:      CALL    MILP        ;display parity
  904.       DB    'Parity:  ',TAB,' ',0
  905.       LDA    CNTL        ;
  906.       ANI    010H        ;test bit 4
  907.       CPI    0        ;if bit4=0 then parity off
  908.       JNZ    SHPRT1        ;
  909.       CALL    MILP        ;
  910.       DB    'Off',0        ;
  911.       RET
  912. SHPRT1:      LDA    CNTL        ;
  913.       ANI    020H        ;test bit 5
  914.       CPI    0        ;if bit5=0 then parity odd
  915.       JNZ    SHPRT2        ;
  916.       CALL    MILP        ;
  917.       DB    'Odd',0        ;
  918.       RET            ;
  919. SHPRT2:      CALL    MILP        ;
  920.       DB    'Even',0    ;
  921.       RET
  922. ;
  923. ;    SET PARITY command table
  924. ;
  925. PARTBL:      DB    'OF','F'+80H    ;"set parity off"
  926.       DW    PROFF
  927.       DB    'EVE','N'+80H    ;"set parity even"
  928.       DW    PREVEN
  929.       DB    'OD','D'+80H    ;"set parity odd"
  930.       DW    PRODD
  931.       DB    0        ;<<== end of parity table
  932. ;
  933. ;    SET STOPBITS command: reset number of stop bits
  934. ;
  935. ;        The number of stop bits is controlled by bits
  936. ;        6 and 7 of the byte sent to the 8251 CONTROL
  937. ;        register, as follows:
  938. ;
  939. ;            Stop bits       Bit 7    Bit 6
  940. ;            1         0            1
  941. ;               1.5         1          0
  942. ;            2         1          1
  943. ;
  944. ;
  945. STSTOP:      MVI    C,SBLANK    ;check for stop bits
  946.       CALL    MEX        ;
  947.       JC    SETERR        ;if none, print error
  948.       LXI    D,STPTBL    ;check for proper syntax
  949.       MVI   C,LOOKUP
  950.       CALL    MEX        ;
  951.       PUSH    H        ;match found, go do it!
  952.       RNC            ;
  953.       POP    H        ;no match: fix stack and
  954.       JMP    SETERR        ;  print error
  955. ;
  956. STOP01:      LDA    CNTL        ;get CNTL byte
  957.       ANI    07FH        ;reset bit 7
  958.       ORI    040H        ;set bit 6
  959.       JMP    STSTP1        ;
  960. STOP02:      LDA    CNTL        ;
  961.       ORI    0C0H        ;set bits 6 and 7
  962.       JMP    STSTP1        ;
  963. STOP15:      LDA    CNTL        ;
  964.       ORI    080H        ;set bit 7
  965.       ANI    0BFH        ;reset bit 6
  966. STSTP1:      STA    CNTL        ;
  967.       CALL    NITSIO        ;
  968.       CALL    SHSTOP        ;print the result
  969.       RET
  970. SHSTOP:      CALL    MILP        ;display stop-bits
  971.       DB    'Stop bits:',TAB,' ',0
  972.       LDA    CNTL        ;
  973.       ANI    040H        ;test bit 6
  974.       CPI    0        ;if bit6=0 then 1.5
  975.       JNZ    SHSTP1        ;
  976.       CALL    MILP        ;
  977.       DB    '1.5',0        ;
  978.       RET
  979. SHSTP1:      LDA    CNTL        ;
  980.       ANI    080H        ;test bit 7
  981.       CPI    0        ;if bit7=0 then 1
  982.       JNZ    SHSTP2        ;
  983.       CALL    MILP        ;
  984.       DB    '1',0        ;
  985.       RET
  986. SHSTP2:      CALL    MILP        ;
  987.       DB    '2',0        ;
  988.       RET
  989. ;
  990. ;    SET STOPBITS command table
  991. ;
  992. STPTBL:      DB    '1'+80H        ;"set stop 1"
  993.       DW    STOP01
  994.       DB    '2'+80H        ;"set stop 2"
  995.       DW    STOP02
  996.       DB    '1.','5'+80H    ;"set stop 1.5"
  997.       DW    STOP15
  998.       DB    0        ;<<== End of stop-bits table
  999. ;
  1000. ;    SET LENGTH command: set bits per character
  1001. ;
  1002. ;        The number of bits per character is controlled 
  1003. ;        by bits 2 and 3 of the control byte
  1004. ;
  1005. ;            BPC        Bit 3        Bit 2
  1006. ;             5          0          0
  1007. ;             6          0             1
  1008. ;             7          1          0
  1009. ;             8          1          1
  1010. ;
  1011. STBITS:      MVI    C,SBLANK    ;check for bits/char
  1012.       CALL    MEX        ;
  1013.       JC    SETERR        ;if none, print error
  1014.       LXI    D,BITTBL    ;check for proper syntax
  1015.       MVI    C,LOOKUP
  1016.       CALL    MEX
  1017.       PUSH    H        ;match found, go do it!
  1018.       RNC            ;
  1019.       POP    H        ;no match: fix stack and
  1020.       JMP    SETERR        ;  print error
  1021. ;
  1022. BIT5:      LDA    CNTL        ;
  1023.       ANI    0F3H        ;reset bit 2,3
  1024.       JMP    STBTS1        ;
  1025. BIT6:      LDA    CNTL        ;
  1026.       ANI    0F7H        ;reset bit 3
  1027.       ORI    004H        ;set bit 2
  1028.       JMP    STBTS1        ;
  1029. BIT7:      LDA    CNTL        ;
  1030.       ORI    008H        ;set bit 3
  1031.       ANI    0FBH        ;reset bit 2
  1032.       JMP    STBTS1        ;
  1033. BIT8:      LDA    CNTL        ;
  1034.       ORI    00CH        ;set bit 2,3
  1035. STBTS1:      STA    CNTL        ;
  1036.       CALL    NITSIO        ;
  1037.       CALL    SHBITS        ;print the result
  1038.       RET
  1039. SHBITS:      CALL    MILP        ;display bits/char
  1040.       DB    'Bits/char:',TAB,' ',0
  1041.       LDA    CNTL        ;
  1042.       ANI    008H        ;test bit 3
  1043.       CPI    0        ;if bit3=0 then 6 or 5 bpc
  1044.       JNZ    SHBTS2        ;
  1045.       LDA    CNTL        ;
  1046.       ANI    004H        ;test bit 2
  1047.       CPI    0        ;if bit2=0 then 5 bpc
  1048.       JNZ    SHBTS1        ;
  1049.       CALL    MILP        ;
  1050.       DB    '5',0        ;
  1051.       RET            ;
  1052. SHBTS1:      CALL    MILP        ;
  1053.       DB    '6',0        ;
  1054.       RET            ;
  1055. SHBTS2:      LDA    CNTL        ;
  1056.       ANI    004H        ;test bit 2
  1057.       CPI    0        ;if bit2=0 then 7 bpc
  1058.       JNZ    SHBTS3        ;
  1059.       CALL    MILP        ;
  1060.       DB    '7',0        ;
  1061.       RET            ;
  1062. SHBTS3:      CALL    MILP        ;
  1063.       DB    '8',0        ;
  1064.       RET
  1065. ;
  1066. ;    SET LENGTH command table
  1067. ;
  1068. BITTBL:      DB    '5'+80H        ;"set bits 5"
  1069.       DW    BIT5
  1070.       DB    '6'+80H        ;"set bits 6"
  1071.       DW    BIT6
  1072.       DB    '7'+80H        ;"set bits 7"
  1073.       DW    BIT7
  1074.       DB    '8'+80H        ;"set bits 8"
  1075.       DW    BIT8
  1076.       DB    0        ;<<== end of bpc table
  1077. ;
  1078. ;
  1079. ; Dialing routine
  1080. ; Smartmodem dialing routine from Ron Fowler's MXO-SM13.ASM
  1081. ;
  1082. DIAL:      LHLD    DIALPT        ;FETCH POINTER
  1083.       CPI    254        ;START DIAL?
  1084.       JZ    STDIAL1        ;JUMP IF SO
  1085.       CPI    255        ;END DIAL?
  1086.       JZ    ENDIAL1        ;JUMP IF SO
  1087. ;
  1088. ; Not start or end sequence, must be a digit to be sent to the modem
  1089. ;
  1090.       MOV    M,A        ;PUT CHAR IN BUFFER
  1091.       INX    H        ;ADVANCE POINTER
  1092.       SHLD    DIALPT        ;STUFF PNTR
  1093.       RET            ;ALL DONE
  1094. ;
  1095. ; Here on a start-dial sequence
  1096. ;
  1097. STDIAL1:  LXI    H,DIALBF    ;SET UP BUFFER POINTER
  1098.       SHLD    DIALPT
  1099.       RET
  1100. ;
  1101. ; Here on an end-dial sequence
  1102. ;
  1103. ENDIAL1:  MVI    M,CR        ;STUFF END-OF-LINE INTO BUFFER
  1104.       INX    H        ;FOLLOWED BY TERMINATOR
  1105.       MVI    M,0
  1106.       LDA    TPULSE        ;GET OVERLAY'S TOUCH-TONE FLAG
  1107.       STA    SMDIAL+3    ;PUT INTO STRING
  1108.       LXI    H,SMDIAL    ;POINT TO DIALING STRING
  1109.       CALL    SMSEND        ;SEND IT
  1110. WAITSM:      MVI    C,INMDM
  1111.       CALL    MEX        ;CATCH ANY OUTPUT FROM THE MODEM
  1112.       JNC    WAITSM        ;LOOP UNTIL NO MORE CHARACTERS
  1113. ;
  1114. ; THE FOLLOWING LOOP WAITS FOR A RESULT FROM THE MODEM.
  1115. ;
  1116. RESULT:      LDA    NDELAY        ;GET DELAY COUNT
  1117.       MOV    C,A
  1118. SMWLP:      PUSH    B
  1119.       MVI    B,1        ;CHECK FOR A CHAR, UP TO 1 SEC WAIT
  1120.       MVI    C,TMDINP    ;DO TIMED INPUT
  1121.       CALL    MEX
  1122.       POP    B
  1123.       JNC    SMTEST        ;JUMP IF MODEM HAD A CHAR
  1124. ;
  1125.     IF    DCD        ;if DCD is available, take a look at it
  1126.     CALL    CHKDCD        ;   get the status byte
  1127.     INR    A        ;   and test the DCD flag
  1128.     RZ             ;   return with A=0 if found,
  1129.                   ;but otherwise ...
  1130.     ENDIF    ;DCD
  1131. ;
  1132. CKKCC:      PUSH    B        ;NO, TEST FOR CONTROL-C FROM CONSOLE
  1133.       MVI    C,DCONIO    ;USE DIRECT CONSOLE I/O
  1134.       MVI    E,DCONIN    ;ASK FOR INPUT
  1135.       CALL    BDOS        ;FROM BDOS
  1136.       POP    B
  1137.       CPI    'C'-40H        ;^C
  1138.       JNZ    SMNEXT        ;IF NOT, JUMP
  1139.       CALL    SMDMOFF        ;YES, SHUT DOWN THE MODEM
  1140.       MVI    A,3        ;RETURN ABORT CODE
  1141.       RET
  1142. SMNEXT:      CPI    0        ;ANY OTHER KEY?
  1143.       JNZ    SMTIMO        ;YES, TREAT LIKE NO ANSWER
  1144.       DCR    C        ;NO
  1145.       JNZ    SMWLP        ;CONTINUE
  1146. ;
  1147. ; NO MODEM RESPONSE WITHIN THE TIME SPECIFIED IN SET DELAY COMMAND
  1148. ;
  1149. SMTIMO:      CALL    SMDMOFF
  1150.       MVI    A,2        ;RETURN TIMEOUT CODE
  1151.       RET
  1152. ;
  1153. ; MODEM GAVE US A RESULT, CHECK IT
  1154. ;
  1155. SMTEST:      ANI    7FH        ;IGNORE ANY PARITY
  1156.       CALL    SMANAL        ;TEST THE RESULT
  1157.       JC    RESULT        ;GO TRY AGAIN IF UNKNOWN RESPONSE
  1158.       MOV    A,B        ;A=RESULT 
  1159.       PUSH    PSW        ;SAVE IT
  1160. SMTLP:      MVI    C,INMDM        ;EAT ANY ADDITIONAL CHARS FROM SMARTMODEM
  1161.       CALL    MEX
  1162.       JNC    SMTLP        ;UNTIL 100MS OF QUIET TIME
  1163.       POP    PSW        ;RETURN THE CODE
  1164.       RET
  1165. ;
  1166. ; Analyze character returned from External Modem
  1167. ;
  1168. SMANAL:
  1169.  
  1170.     IF ANCHOR
  1171.                 ;Anchor echoes the digits as they are
  1172.                 ;being dialed.  The returned digits are
  1173.                 ;interpreted as call return codes, shutting
  1174.                 ;down the modem prematurely
  1175.                 ;
  1176.              MVI    B,0        ;PREP CONNECT CODE
  1177.       CPI    'C'        ;"CONNECT"?
  1178.       RZ
  1179.       INR    B        ;PREP BUSY CODE B=1
  1180.       CPI    'B'
  1181.       RZ
  1182.       INR    B        ;PREP NO CONNECT MSG B=2
  1183.       CPI    'N'        ;N=NO CONNECT
  1184.       RZ
  1185.       MVI    B,4        ;PREP MODEM ERROR
  1186.       CPI    'E'        ;E=ERROR
  1187.       RZ
  1188.     ENDIF
  1189. ;
  1190.     IF NOT ANCHOR
  1191.              MVI    B,0        ;PREP CONNECT CODE
  1192.       CPI    'C'        ;"CONNECT"?
  1193.       RZ
  1194.       CPI    '1'        ;NUMERIC VERSION OF "CONNECT"
  1195.       RZ
  1196.       CPI    '5'        ;NUMERIC VERSION OF "CONNECT 1200"
  1197.       RZ
  1198.       INR    B        ;PREP BUSY CODE B=1
  1199.       CPI    'B'
  1200.       RZ
  1201.       INR    B        ;PREP NO CONNECT MSG B=2
  1202.       CPI    'N'        ;N=NO CONNECT
  1203.       RZ
  1204.       CPI    '3'        ;NUMERIC VERSION OF "NO CONNECT"
  1205.       RZ
  1206.       MVI    B,4        ;PREP MODEM ERROR
  1207.       CPI    'E'        ;E=ERROR
  1208.       RZ
  1209.       CPI    '4'        ;NUMERIC VERSION OF "ERROR"
  1210.       RZ
  1211.     ENDIF
  1212. ;
  1213. ; UNKNOWN RESPONSE, RETURN CARRY TO CALLER. BUT FIRST,
  1214. ; FLUSH THE UNKNOWN RESPONSE LINE FROM THE MODEM.
  1215. ;
  1216. WTLF:      CPI    LF        ;LINEFEED?
  1217.       STC
  1218.       RZ            ;END IF SO
  1219.       MVI    C,INMDM        ;NO. GET NEXT CHAR
  1220.       CALL    MEX
  1221.       JNC    WTLF        ;UNLESS BUSY, LOOP
  1222.       RET
  1223. ;
  1224. ; Send string to the External Modem
  1225. ;
  1226. SMSEND:      MVI    C,SNDRDY    ;WAIT FOR MODEM READY
  1227.       CALL    MEX
  1228.       JNZ    SMSEND
  1229.       MOV    A,M        ;FETCH NEXT CHARACTER
  1230.       INX    H
  1231.       ORA    A        ;END?
  1232.       RZ            ;DONE IF SO
  1233.       MOV    B,A        ;NO, POSITION FOR SENDING
  1234.       MVI    C,SNDCHR    ;NOPE, SEND THE CHARACTER
  1235.       CALL    MEX
  1236.       JMP    SMSEND
  1237. ;
  1238. ; Shut down (disconnect) External Modem
  1239. ;
  1240. SMDMOFF:
  1241. ;
  1242.     IF ANCHOR
  1243.       MVI    B,ANDAB
  1244.     ENDIF
  1245. ;
  1246.     IF NOT ANCHOR
  1247.       MVI    B,CR
  1248.     ENDIF
  1249. ;
  1250.       MVI    C,SNDCHR
  1251.       CALL    MEX
  1252. ;
  1253.     IF ANCHOR
  1254.       MVI    B,20        ;TWO SECOND WAIT FOR ANCHOR
  1255.       CALL    MTIME
  1256.       RET
  1257.     ENDIF
  1258. ;
  1259.     IF NOT ANCHOR
  1260.       MVI    B,10        ;ONE SECOND WAIT FOR HAYES, ETC
  1261.       CALL    MTIME
  1262.       JMP    DISCON        ;MAKE SURE IT IS OFF
  1263.     ENDIF
  1264. ;
  1265. ; General utility routines
  1266. ;
  1267. MILP:      MVI    C,ILP        ;IN-LINE PRINT
  1268.       JMP    MEX
  1269.       RET
  1270. ;
  1271. MTIME:      MVI    C,TIMER        ;MEX TIMER
  1272.       JMP    MEX
  1273.       RET
  1274. ;
  1275. CRLF:      CALL    MILP        ;PRINT CARRIAGE RETURN, LINE FEED
  1276.       DB    CR,LF,0
  1277.       RET
  1278. ;
  1279. ;==========================================================================
  1280. ;                            Data Area
  1281. ;==========================================================================
  1282. ;
  1283. ; Default UART parameters (Initalized for External RS-232)
  1284. ;
  1285. ; Miscellaneous Default Data
  1286. ;
  1287. SMDIAL:      DB    'ATDP '        ;Smartmodem dial prefix
  1288. DIALBF:      DS    52        ;2* 24 CHAR MAX, + CR + NULL + SLOP
  1289. DIALPT:      DS    2        ;DIAL POSITION POINTER
  1290. DIALWD:      DB    01000000B    ;PULSE/TONE DIAL WORD
  1291. DIGIT      DB    0        ;SAVE DIALED DIGIT
  1292. MSPDSV:      DB    0        ;SAVE MODEM MSPEED
  1293. MONFLG:      DB    0FFH        ;0: MONITOR OFF - 0FFH: MONITOR ON
  1294. ANSFLG:      DB    0        ;0: ORIGINATE   - 0FFH: ANS
  1295. NDELAY:      DB    30        ;NO. SECONDS FOR ANSWER
  1296. ;
  1297. SMATN:    DB    '+++',0        ;Smartmodem online 'attention'
  1298. SMDISC:      DB    'ATH',CR,0    ;Smartmodem disconnect (used by Anchor)
  1299. SMINIT:   DB    'ATM1 S0=0 S7=60 X1',CR,0    ;MODEM INIT STRING
  1300. SMMANO:      DB    'ATC0',CR,0
  1301. SMMANA:      DB    'ATC1',CR,0
  1302. ;
  1303. EOSMSG:      DB    010H,'$'    ;CLEAR TO END-OF-SCREEN
  1304. CLSMSG:      DB    04H,'$'        ;CLEAR WHOLE SCREEN
  1305.       END
  1306. SMMANA:      DB    'ATC1',CR,0
  1307. ;
  1308. EOSMSG:      DB    010H,'$'    ;CLEAR TO END-OF-SCREEN
  1309. C