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-XE2U.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  41KB  |  1,187 lines

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