home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / mex / mxo-hu11.asm < prev    next >
Assembly Source File  |  1994-07-13  |  23KB  |  722 lines

  1. ; MXO-HU11.ASM --  U.S. Robotics S-100 overlay for MEX11.COM adapted for
  2. ; V.86/07/27       Heath/Zenith-100        
  3. ;
  4. ; This overlay follows MEX coventions and is all you need to get MEX running.
  5. ; Significant quantities of ideas and code for this program have been
  6. ; drawn from M7US-2.ASM, M712US.ASM and MXO-SM13.ASM and I am greatfully
  7. ; taking this opportunity to extend credit to the people involved in
  8. ; the development of these overlays.
  9. ;
  10. ; This version will assemble directly for a Z-100 using the S-100 bus 
  11. ; auto dial/auto answer modem by US Robotics.  The port switches on the
  12. ; modem board should be set to 20h 21h as follows:
  13. ;
  14. ;    DIP SWITCH SEGMENT(S6)        SLIDE SWITCH(J6)
  15. ;       4     3    2    1
  16. ;      OFF    OFF   ON  OFF              UP
  17. ;
  18. ; You will want to look this file over carefully. There are a number of
  19. ; options that you can use to configure the program to suit your taste.
  20. ; This file places particular emphasis on using the Heath/Zenith "100"
  21. ; equipment.  Much of the information contained here is not in the main
  22. ; file.
  23. ;
  24. ; This overlay is capable of setting the baud rate and sending breaks.
  25. ; Although disconnecting the modem is not supported by use of a function to
  26. ; lower DTR. However, the control-N and DSC commands still work, as they use
  27. ; "+++" which causes the U.S.R. S-100 modem to hang up. Some do-nothing time
  28. ; wasting statements have beeen added to the INITMODEM routine to slow the
  29. ; computer down for the modem. The regular U.S.R. S-100 modem initialization
  30. ; routine will not work reliably with computer clock speeds above 4 MHz.
  31. ;
  32. ; Baud rates supported are 150, 300, 600 and 1200. Note that 150 baud has 
  33. ; been included in place of 110 baud which is not supported by the U.S.R.
  34. ; S-100 modem. (The SET command when entered without argument will with
  35. ; 150 baud selected still indicate 110 baud unless MEX.COM is patched. For
  36. ; MEX114.COM this may be done by changing the contents of address 4FF8 from
  37. ; 31H to 35H.)
  38. ;
  39. ;    TO USE: First edit this file filling in answers for your own
  40. ;        equipment.  Then assemble with ASM.COM or equivalent
  41. ;        assembler.  Then use MLOAD.COM to overlay the the results
  42. ;        of this program to the original .COM file:
  43. ;
  44. ;        MLOAD MEX11.COM=MEXHU.COM,MXO-HU11
  45. ;        Refer to MEX10.INF, MEX10.DOC and updates for complete
  46. ;        instructions.
  47. ;
  48. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  49. ;
  50. ; 86/07/86 - Code added to GOODBYE to warn user if    - Bo Gedda
  51. ;         modem is still on line upon use of
  52. ;         BYE, CPM and SYSTEM commands.
  53. ;      
  54. ; 85/12/26 - Initialization changed to include reset of - Bo Gedda
  55. ;         modem (RESETST and minor code added).
  56. ;
  57. ; 85/08/03 - Dial routine changed to allow conditional    - Bo Gedda
  58. ;         assembly for Swedish pulse dialing which
  59. ;         is different for some crazy reason.
  60. ;         Set SWEPU true to allow this option, which
  61. ;         differs as follows:
  62. ;         
  63. ;        Number        International    Swedish  
  64. ;        of pulses       #           #
  65. ;        ---------------------------------------
  66. ;           1           1           0
  67. ;           2           2           1
  68. ;           3           3           2
  69. ;           4           4           3
  70. ;           5           5           4
  71. ;           6           6           5
  72. ;           7           7           6
  73. ;           8           8           7
  74. ;           9           9           8
  75. ;          10           0           9
  76. ;
  77. ; 84/11/22 - Call in INITMOD modified to follow MEX    - Bo Gedda
  78. ;         conventions. SMANAL modified to exclude
  79. ;         busy and include error code. SMDIAL
  80. ;         modified to add extra 2 second delay
  81. ;         before dialing.
  82. ;
  83. ; 84/09/09 - Initialization modified to allow other    - Bo Gedda
  84. ;         default baud rate then 300 baud
  85. ;
  86. ; 84/08/29 - First version of this file.        - Bo Gedda 
  87. ;
  88. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  89. ;
  90. ; Use the MEX "SET" command to change the baudrate when desired.  Default
  91. ; baud rate may be set to 150, 300, 600 or 1200 by modifying MSPEED below.
  92. ;
  93. ; MEX service processor stuff
  94. ;
  95. MEX    EQU    0D00H        ;address of the service processor
  96. INMDM    EQU    255        ;get char from port to A, CY=no more in 100 ms
  97. TIMER    EQU    254        ;delay 100ms * reg B
  98. TMDINP    EQU    253        ;B=# secs to wait for char, cy=no char
  99. CHEKCC    EQU    252        ;check for ^C from KBD, Z=present
  100. SNDRDY    EQU    251        ;test for modem-send ready
  101. RCVRDY    EQU    250        ;test for modem-receive ready
  102. SNDCHR    EQU    249        ;send a character to the modem (after sndrdy)
  103. RCVCHR    EQU    248        ;recv a char from modem (after rcvrdy)
  104. LOOKUP    EQU    247        ;table search: see CMDTBL comments for info
  105. PARSFN    EQU    246        ;parse filename from input stream
  106. BDPARS    EQU    245        ;parse baud-rate from input stream
  107. SBLANK    EQU    244        ;scan input stream to next non-blank
  108. EVALA    EQU    243        ;evaluate numeric from input stream
  109. LKAHED    EQU    242        ;get nxt char w/o removing from input
  110. GNC    EQU    241        ;get char from input, cy=1 if none
  111. ILP    EQU    240        ;inline print
  112. DECOUT    EQU    239        ;decimal output
  113. PRBAUD    EQU    238        ;print baud rate
  114. PRNTBL    EQU    237        ;get MEX format command table pointer
  115. PRID    EQU    236        ;print MEX ID string on console
  116.  
  117. PRINT    EQU    9        ;MEX/BDOS print-string function call
  118. ;
  119. BELL:        EQU    07H        ;bell
  120. CR:        EQU    0DH        ;carriage return
  121. ESC:        EQU    1BH        ;escape
  122. LF:        EQU    0AH        ;linefeed
  123. ;
  124. YES:        EQU    0FFH
  125. NO:        EQU    0
  126. FALSE        EQU    0    
  127. TRUE        EQU    NOT FALSE
  128. ;
  129. ; SYSTEM CONSTANTS
  130. ;
  131. TPULSE    EQU    0105H        ;TONE/PULSE FLAG IN MODEM OVERLAY
  132. DIALV    EQU    0162H        ;LOCATION OF DIAL VECTOR IN OVERLAY
  133. DISCV    EQU    0165H        ;LOCATION OF DISCONNECT VECTOR IN OVERLAY
  134. ;
  135.     ORG    DIALV        ;OVERLAY THE DIALING VECTOR
  136.     JMP    DIAL
  137. ;
  138.     ORG    DISCV        ;OVERLAY THE DISCONNECT VECTOR
  139.     JMP    DISCON
  140. ;
  141. ;
  142. ; Change the following information to match your equipment
  143. ;
  144. SWEPU        EQU    FALSE        ;SET TRUE IF SWEDISH TYPE PULSE
  145. ;                     DIALING IS REQUIRED THIS FORCES
  146. ;                     PULSE DIALLING
  147. PORT:        EQU    020H        ;SET TO MATCH MODEM SWITCHES
  148. MODCTL1:    EQU    PORT+1        ;MODEM CONTROL PORT
  149. MODDATP:    EQU    PORT        ;MODEM DATA IN PORT
  150. MODDATO:    EQU    PORT        ;MODEM DATA OUT PORT
  151. MODDCDB:    EQU    080H        ;CARRIER DETECT BIT
  152. MODDCDA:    EQU    080H        ;VALUE WHEN ACTIVE
  153. MODRCVB:    EQU    2        ;BIT TO TEST FOR RECEIVE
  154. MODRCVR:    EQU    2        ;VALUE WHEN READY
  155. MODSNDB:    EQU    1        ;BIT TO TEST FOR SEND
  156. MODSNDR:    EQU    1        ;VALUE WHEN READY
  157. ;
  158. FRMER        EQU    20H        ;FRAMING ERROR
  159. ORUNER        EQU    10H        ;OVERRUN ERROR
  160. PARER        EQU    08H        ;PARITY ERROR
  161. ;
  162.         ORG    100H
  163. ;
  164. ;
  165. ; Change the clock speed to suit your system
  166. ;
  167.         DS    3    ;(for  "JMP   START" instruction)
  168. ;
  169. PMMIMODEM:    DB    NO    ;yes=PMMI S-100 Modem            103H
  170. SMARTMODEM:    DB    YES    ;yes=HAYES Smartmodem, no=non-PMMI    104H
  171. TOUCHPULSE:    DB    'T'    ;T=touch, P=pulse (Smartmodem-only)    105H
  172. CLOCK:        DB    45    ;clock speed in MHz x10, 25.5 MHz max.    106H
  173.                 ;20=2 MHh, 37=3.68 MHz, 40=4 MHz, etc.
  174. MSPEED:     DB    1    ;0=150 1=300 2=450 3=600 4=710 5=1200    107H
  175.                 ;6=2400 7=4800 8=9600 9=19200 default
  176. BYTDLY:     DB    5    ;0=0 delay 1=10 ms  5=50 ms  9=90 ms    108H
  177.                 ;default time to send character in ter-
  178.                 ;minal mode file transfer for slow BBS.
  179. CRDLY:        DB    5    ;0=0 delay 1=100 ms  5=500 ms  9=900 ms 109H
  180.                 ;default time for extra wait after CRLF
  181.                 ;in terminal mode file transfer
  182. NOOFCOL:    DB    5    ;number of DIR columns shown        10AH
  183. SETUPTST:    DB    YES    ;yes=user-added Setup routine        10BH
  184. SCRNTEST:    DB    YES    ;Cursor control routine         10CH
  185. NORETRY     DB    NO    ;yes=DON'T ALLOW RETRY/QUIT OPTION      10DH
  186.                 ;no=ALLOW RETRY/QUIT AFTER 10 TIMEOUTS
  187. BAKUPBYTE:    DB    NO    ;yes=change any file same name to .BAK    10EH
  188. CRCDFLT:    DB    YES    ;yes=default to CRC checking        10FH
  189. TOGGLECRC:    DB    YES    ;yes=allow toggling of CRC to Checksum    110H
  190. CONVBKSP:    DB    NO    ;yes=convert backspace to rub        111H
  191. TOGGLEBK:    DB    YES    ;yes=allow toggling of bksp to rub    112H
  192. ADDLF:        DB    NO    ;no=no LF after CR to send file in    113H
  193.                 ;terminal mode (added by remote echo)
  194. TOGGLELF:    DB    YES    ;yes=allow toggling of LF after CR    114H
  195. TRANLOGON:    DB    NO    ;yes=allow transmission of logon    115H
  196.                 ;write logon sequence at location LOGON
  197. SAVCCP:     DB    YES    ;yes=do not overwrite CCP        116H
  198. LOCONEXTCHR:    DB    NO    ;yes=local command if EXTCHR precedes    117H
  199.                 ;no=external command if EXTCHR precedes
  200. TOGGLELOC:    DB    YES    ;yes=allow toggling of LOCONEXTCHR    118H
  201. LSTTST:     DB    YES    ;yes=printer available on printer port    119H
  202. XOFFTST:    DB    NO    ;yes=checks for XOFF from remote while    11AH
  203.                 ;sending a file in terminal mode
  204. XONWAIT:    DB    NO    ;yes=wait for XON after CR while    11BH
  205.                 ;sending a file in terminal mode
  206. TOGXOFF:    DB    YES    ;yes=allow toggling of XOFF checking    11CH
  207. IGNORCTL:    DB    YES    ;yes=CTL-chars above ^M not displayed    11DH
  208. EXTRA1:     DB    0    ;for future expansion            11EH
  209. EXTRA2:     DB    0    ;for future expansion            11FH
  210. BRKCHR:     DB    '@'-40H ;^@ = Send 300 ms. break tone        120H
  211. NOCONNCT:    DB    'N'-40H ;^N = Disconnect from the phone line    121H
  212. LOGCHR:     DB    'L'-40H ;^L = Send logon            122H
  213. LSTCHR:     DB    'P'-40H ;^P = Toggle printer            123H
  214. UNSAVE:     DB    'R'-40H ;^R = Close input text buffer        124H
  215. TRANCHR:    DB    'T'-40H ;^T = Transmit file to remote        125H
  216. SAVECHR:    DB    'Y'-40H ;^Y = Open input text buffer        126H
  217. EXTCHR:     DB    '^'-40H ;^^ = Send next character        127H
  218. ;
  219. ;
  220.         DS    2        ;                128H
  221. ;
  222. IN$MODCTL1:    IN    MODCTL1 ! RET    ;in modem control port        12AH
  223.         DS    7
  224. OUT$MODDATP:    OUT    MODDATP ! RET    ;out modem data port        134H
  225.         DS    7
  226. IN$MODDATP:    IN    MODDATP ! RET    ;in modem data port        13EH
  227.         DS    7
  228.  
  229. maskr:        ani    2
  230.         ret
  231. testr:        cpi    2
  232.         ret
  233. masks:        ani    1
  234.         ret
  235. tests:        cpi    1
  236.         ret
  237.         ds    12
  238.  
  239.         DS    2        ;                160H
  240.         DS    6        ;                162H
  241. JMP$GOODBYE:    JMP    GOODBYE     ;                168H
  242. JMP$INITMOD:    JMP    INITMOD     ;go to user written routine    16BH
  243. JMP$NEWBAUD:    JMP    NEWBAUD     ;change baudrate        16EH
  244.         RET  !    NOP  !    NOP    ;(by-passes PMMI routine)    171H
  245.         RET  !    NOP  !    NOP    ;(by-passes PMMI routine)    174H
  246. JMP$SETUPR:    JMP    SETUPR        ;                177H
  247.         DS    3        ;                17AH
  248. JMP$SYSVER:    JMP    SYSVER        ;                17DH
  249. JMP$BREAK:    JMP    SENDBRK     ;                180H
  250. ;
  251. ;
  252. ; Do not change the following six lines.
  253. ;
  254. JMP$ILPRT:    DS    3        ;                183H
  255. JMP$INBUF    DS    3        ;                186H
  256. JMP$INLNCOMP:    DS    3        ;                189H
  257. JMP$INMODEM    DS    3        ;                18CH
  258. JMP$NXTSCRN:    DS    3        ;                18FH
  259. JMP$TIMER    DS    3        ;                192H
  260. ;
  261. ;
  262. ;    routine to clear to end of screen.
  263. ;
  264. CLREOS:     LXI    D,EOSMSG
  265.         MVI    C,PRINT
  266.         CALL    MEX
  267.         RET            
  268. ;
  269. CLRSCRN:    LXI    D,CLSMSG
  270.         MVI    C,PRINT
  271.         CALL    MEX
  272.         RET            
  273. ;
  274. SYSVER:     MVI    C,ILP
  275.         call    mex
  276.         DB    'Version for Heath/ZDS 100 Series Computers'
  277.         DB    CR,LF
  278.         DB    '  with the U.S. Robotics S-100 modem.'
  279. IF SWEPU
  280.         DB    CR,LF
  281.         DB    'Swedish type pulse dialing.'
  282. ENDIF
  283.         DB    CR,LF,0
  284.  
  285.         RET
  286. ;     
  287. ;.....
  288. ;
  289. ;
  290. ; The following routine sends a break "character" to the remote
  291. ; computer for 300 ms.    The "MSPEED" value is needed to decide whether
  292. ; the modem is at 150, 300, 600, or 1200 baud.    The routine must know
  293. ; this because U.S.R. set up the RTS bit of the command resgister as a
  294. ; baud rate selection bit.  Note that the "MVI A, 01FH" does not change
  295. ; any flags.
  296. ;
  297. SENDBRK:    LDA    MSPEED        ; Get speed byte
  298.         CPI    1        ; Are we at 150 baud?
  299.         MVI    A, 01FH     ; Set up for 150/600 (no flag changes)
  300.         JZ    SBRK2        ; And if we are, go do that
  301.         LDA    MSPEED        ; Get speed byte
  302.         CPI    3        ; Are we at 600 baud?
  303.         MVI    A, 01FH     ; Set up for 150/600
  304.         JZ    SBRK2
  305.         MVI    A, 03FH     ; Otherwise, set up for 300/1200
  306. SBRK2:        OUT    MODCTL1     ; Send break
  307.         MVI    B, 3        ; 300 ms delay value
  308.         MVI    C,TIMER
  309.         CALL    MEX        ; Wait that long
  310.         JMP    INITMOD1    ; Restore USRT
  311. ;.....
  312. ;
  313. ;
  314. ; The U.S.R. S-100 does not have a "quick-disconnect" feature like
  315. ; the Hayes does (by lowering DTR).  Therefore, "GOODBYE" is not
  316. ; implemented except to check if modem is connected. Control-N still
  317. ; works to hang up (see note above in introduction)
  318. ;
  319. GOODBYE:    IN    MODCTL1     ;CHECK IF CARRIER
  320.         ANI    MODDCDB
  321.         RZ
  322.         MVI    B,10        ;WAIT 1 SECOND
  323.         MVI    C,TIMER
  324.         CALL    MEX
  325.         IN    MODCTL1     ;CHECK IF STILL CARRIER  
  326.         ANI    MODDCDB
  327.         RZ
  328.         CALL    DISCFAIL
  329.         RET
  330. ;.....
  331. ;
  332. ;
  333. ; You can use this area for any special initialization or setup you may
  334. ; wish to include.  Each must stop with a RET.    This initialization
  335. ; sets up 300 baud, 8 data bits, 1 stop bit, no parity.  Due to a
  336. ; quirk in the U.S.R. S-100 (it seems to have plenty of 'em), after
  337. ; you change baud rates, you should send an "AT" followed by a
  338. ; carriage return.  Therefore, this is done after every initialization
  339. ; when there is no carrier present.
  340. ;
  341. ;
  342. ; NOTE: The U.S.R. S-100 does not operate too well at clock speeds   
  343. ;    over 4 MHz.  As we are running at that speed or higher, the
  344. ;    lines with XCHG have been inserted.  These serve as time wasting
  345. ;    routines to let the U.S.R. S-100 catch up.  This is not a
  346. ;    problem when doing character I/O, as the program checks to see
  347. ;    if the modem is ready to accept a character.
  348. ;
  349. ;
  350. INITMOD:    LDA    MSPEED        ; Get the default baude rate
  351.         CPI    0        ; Is it 150 baud?
  352.         JZ    OK150        ; If so set up for 150 baud
  353.         CPI    1        ; Is it 300 baud?
  354.         JZ    OK300        ; If so set up for 300 baud
  355.         CPI    3        ; Is it 600 baud?
  356.         JZ    OK600
  357.         CPI    5        ; Is it 1200 baud?
  358.         JZ    OK1200
  359.         MVI    C,ILP
  360.         CALL    MEX        ; Tell user if not valid
  361.         DB    '++ Incorrect default baud rate ++',CR,LF,BELL,0
  362. INITMOD1:    XRA    A        ; Zero accumulator
  363.         OUT    MODCTL1     ; Clear 8251A
  364.         XCHG            ; For fast systems
  365.         XCHG            ; For fast systems
  366.         OUT    MODCTL1     ; Twice
  367.         XCHG            ; For fast systems
  368.         XCHG            ; For fast systems
  369.         OUT    MODCTL1     ; Three times, even
  370.         XCHG            ; For fast systems
  371.         XCHG            ; For fast systems
  372.         MVI    A, 040H     ; Reset UART command
  373.         OUT    MODCTL1
  374.         XCHG            ; For fast systems
  375.         XCHG            ; For fast systems
  376. MODEBT:     MVI    A, 04FH     ; 8 bits, 1 stop, no parity
  377.         OUT    MODCTL1
  378.         XCHG            ; For fast systems
  379.         XCHG            ; For fast systems
  380. CMDBT:        MVI    A, 037H     ; On hook, Tx/Rx enable, reset errs
  381.         OUT    MODCTL1
  382.         XCHG            ; For fast systems
  383.         XCHG            ; For fast systems
  384. BDCODE:     MVI    A, 1        ; 300 baud code
  385.         STA    MSPEED
  386.         IN    MODCTL1     ; Get the current status
  387.         ANI    MODDCDB     ; See if there is a carrier
  388.         RNZ            ; If so, don't do AT stuff
  389.         MVI    B, 1        ; 100 ms
  390.         MVI    C,TIMER
  391.         CALL    MEX        ; Wait that long 
  392.         LXI    H,RESETST    ; Point to resetstring
  393.         CALL    SMSEND        ; Reset modem
  394.         MVI    B, 5        ; 500 ms
  395.         MVI    C,TIMER
  396.         CALL    MEX        ; Wait that long
  397.         LXI    H,INITST    ; Point to initstring
  398.         CALL    SMSEND        ; Initialize command status
  399.         RET
  400. ;
  401. RESETST:DB    'ATZ',CR,0        ; Reset modem command status
  402. INITST: DB    'ATS0=0S7=45E1',CR,0    ; Don't answer, wait 45 s for carrier
  403. ;
  404. ; This routine is used to set up for a new baud rate
  405. ; which on the U.S.R. can be 150, 300, 600, or 1200.
  406. ; This modem does not have a provision for the MEX   
  407. ; 110 rate and the U.S.R. 150 baud possibility is
  408. ; therefore utilized. You should not exepect 150 baud
  409. ; to work unless modems at both ends are set up for
  410. ; this same baud rate.
  411. ;
  412. ;
  413. SETUPR:   MVI    C,SBLANK    ;Any arguments?
  414.       CALL    MEX
  415.       JC    TELL        ;If not, go display baud
  416.       LXI    D,CMDTBL
  417.       MVI    C,LOOKUP
  418.       CALL    MEX        ;Parse argument
  419.       PUSH    H        ;Save any parsed argument addrs on stack
  420.       RNC            ;If we have one, return to it
  421.       POP    H        ;Oops, input not found in table
  422.       MVI    C,ILP
  423.       CALL    MEX        ;Tell user input not valid
  424.       DB    CR,LF,'Only 150, 300, 600 or 1200 allowed by SET',CR,LF,0
  425.       RET
  426. ;
  427. CMDTBL:   DB    '15','0'+80H
  428.       DW    OK150
  429.       DB    '30','0'+80H
  430.       DW    OK300
  431.       DB    '60','0'+80H
  432.       DW    OK600
  433.       DB    '120','0'+80H
  434.       DW    OK1200
  435.       DB    0
  436. ;
  437. TELL:      MVI    C,ILP
  438.       CALL    MEX        ;Print current baud rate
  439.       DB    CR,LF,'Baud rate is now: ',0
  440.       LDA    MSPEED
  441.       MVI    C,PRBAUD
  442.       CALL    MEX
  443.       RET
  444. ;
  445. ;
  446. OK150:    MVI    A,0        ;MSPEED 150
  447.     LHLD    BD150        ;Get 150 baud values in (HL)
  448.     JMP    LOADBD        ;Go load them
  449. OK300:    MVI    A,1        ;MSPEED 300
  450.     LHLD    BD300        ;Get 300 baud values in (HL)
  451.     JMP    LOADBD        ;Go load them
  452. OK600:    MVI    A,3        ;MSPEED 600
  453.     LHLD    BD600        ;Get 600 baud values in (HL)
  454.     JMP    LOADBD        ;Go load them
  455. OK1200: MVI    A,5        ;MSPEED 1200
  456.     LHLD    BD1200        ;Get 1200 baud values in (HL)
  457.     JMP    LOADBD        ;Go load them
  458. ;
  459. LOADBD:     STA    BDCODE + 1    ; Change baud rate code value
  460.         MOV    A,L        ; Get mode byte value
  461.         STA    MODEBT + 1    ; Change mode byte
  462.         MOV    A,H        ; Get cmd byte
  463.         STA    CMDBT + 1    ; Change cmd byte
  464.         JMP    INITMOD1    ; (Re)initialize modem
  465. ;
  466. NEWBAUD:  CPI    0
  467.       JZ    OK150
  468.       CPI    1
  469.       JZ    OK300
  470.       CPI    3
  471.       JZ    OK600
  472.       CPI    5
  473.       JZ    OK1200
  474.       RET
  475. ;
  476. ; Baud Rate Table
  477. ;
  478. BD150    DW    274FH        ;150 baud
  479. BD300    DW    374FH        ;300 baud
  480. BD600    DW    274EH        ;600 baud
  481. BD1200    DW    374EH        ;1200 baud
  482. ;        __--
  483. ;         \  \___ Mode Byte to select baud rate (4E or 4F)
  484. ;          \_____ Command Byte to select speed (27 or 37)
  485. ;
  486. BAUDBUF:    DB    10, 0
  487.         DS    10
  488. ;
  489. ;
  490. ;
  491. ;
  492. EOSMSG:   DB    ESC,'J',0,0,0,'$'            
  493. CLSMSG:   DB    ESC,'E',0,0,0,'$'
  494. ;
  495. ;
  496. ;
  497. ;
  498. ; This is the DIAL routine called by MEX to dial a digit. The digit
  499. ; to be dialed is passed in the A register.  Note that two special
  500. ; codes must be intercepted as non-digits: 254 (start dial sequence)
  501. ; and 255 (end-dial sequence).    Mex will always call DIAL with 254
  502. ; in the accumulator prior to dialing a number.  Mex will also call
  503. ; dial with 255 in A as an indication that dialing is complete. Thus,
  504. ; the overlay may use these values to "block" the number, holding it
  505. ; in a buffer until it is completely assembled (in fact, that's the
  506. ; scheme employed here for the Smartmodem).
  507. ;
  508. ; After the 254-start-dial sequence, MEX will call the overlay with
  509. ; digits, one-at-a-time.  Except as noted below, MEX will make no
  510. ; assumptions about the digits, and will send each to the DIAL routine
  511. ; un-inspected (some modems, like the Smartmodem, allow special
  512. ; non-numeric characters in the  phone number, and MEX may make
  513. ; no assumptions about these).
  514. ;
  515. ; If SWEPU is set true MEX will modify numbers (0 to 9) to correct
  516. ; the number of pulses sent to the telephone switching equipment.
  517. ; Note that letters will not be modified and and should not be used
  518. ; with this special type of pulse dialing.
  519. ;
  520. ; After receiving the end-dial sequence (255) the overlay must take
  521. ; whatever end-of-dial actions are necessary *including* waiting for
  522. ; carrier at the distant end.  The overlay should monitor the keyboard
  523. ; during this wait (using the MEX keystat service call), and return
  524. ; an exit code to MEX in the A register, as follows:
  525. ;
  526. ;    0 - Carrier detected, connection established
  527. ;    1 - Far end busy (only for modems that can detect this condition)
  528. ;    2 - No answer (or timed out waiting for modem response)
  529. ;    3 - Keyboard abort (^C only: all others should be ignored)
  530. ;    4 - Error reported by modem
  531. ;    5 - No ring
  532. ;    6 - No dialtone
  533. ;
  534. ; <No other codes should be returned after an end-dial sequence>
  535. ;
  536. ; The overlay should not loop forever in the carrier-wait routine, but
  537. ; instead use either the overlay timer vector, or the INMDMV (timed 100
  538. ; ms character wait) service call routine.
  539. ;
  540. ; The DIAL routine is free to use any of the registers, but must return
  541. ; the above code after an end-dial sequence
  542. ;
  543. ;
  544. DIAL:    LHLD    DIALPT        ;FETCH POINTER
  545.     CPI    254        ;START DIAL?
  546.     JZ    STDIAL        ;JUMP IF SO
  547.     CPI    255        ;END DIAL?
  548.     JZ    ENDIAL        ;JUMP IF SO
  549. ;
  550. ; Not start or end sequence, must be a digit to be sent to the modem
  551. ;
  552. IF    SWEPU
  553.     CALL    CKDIG
  554. NOMOD:    MOV    M,A        ;PUT CHAR IN BUFFER
  555.     INX    H        ;ADVANCE POINTER
  556.     SHLD    DIALPT        ;STUFF PNTR
  557.     RET            ;ALL DONE
  558. CKDIG:    CPI    '9' + 1     ;0 TO 9 IS THE RANGE TO ADJUST
  559.     RNC            ;TOO LARGE
  560.     MOV    C,A        ;SAVE THE NUMBER
  561.     SUI    '0'               
  562.     MOV    A,C        ;RECOVER IT       
  563.     RC            ;TOO SMALL 
  564.     CPI    '9'        ;9 CORRESPONDS TO ZERO
  565.     JZ    ZERO
  566.     ADI    1        ;ADD ONE PULSE TO ALL FROM 0 TO 8
  567.     RET
  568. ZERO:    MVI    A,'0'
  569.     RET
  570. ENDIF
  571. ;
  572. IF NOT SWEPU
  573.     MOV    M,A        ;PUT CHAR IN BUFFER
  574.     INX    H        ;ADVANCE POINTER
  575.     SHLD    DIALPT        ;STUFF PNTR
  576.     RET            ;ALL DONE
  577. ENDIF
  578. ;
  579. ; Here on a start-dial sequence
  580. ;
  581. STDIAL: LXI    H,DIALBF    ;SET UP BUFFER POINTER
  582.     SHLD    DIALPT
  583. IF SWEPU
  584.     MVI    A,'P'        ;FORCE PULSE DIALING
  585.     STA    TPULSE
  586. ENDIF
  587.     RET
  588. ;
  589. ; Here on an end-dial sequence
  590. ;
  591. ENDIAL: MVI    M,CR        ;STUFF END-OF-LINE INTO BUFFER
  592.     INX    H        ;FOLLOWED BY TERMINATOR
  593.     MVI    M,0
  594.     LDA    TPULSE        ;GET OVERLAY'S TOUCH-TONE FLAG
  595.     STA    SMDIAL+3    ;PUT INTO STRING
  596.     LXI    H,SMDIAL    ;POINT TO DIALING STRING
  597.     CALL    SMSEND        ;SEND IT
  598. WAITSM: MVI    C,INMDM
  599.     CALL    MEX        ;CATCH ANY OUTPUT FROM THE MODEM
  600.     JNC    WAITSM        ;LOOP UNTIL NO MORE CHARACTERS
  601. ;
  602. ; THE FOLLOWING LOOP WAITS FOR A RESULT FROM THE MODEM (UP TO
  603. ; 75 SECONDS. YOU MAY CHANGE THIS VALUE IN THE FOLLOWING LINE).
  604. ; NOTE THAT THE SMARTMODEM HAS AN INTERNAL 30 SECOND TIMEOUT WHILE
  605. ; FOR A CARRIER ON THE OTHER END.  YOU CAN CHANGE BY PLAYING WITH THE
  606. ; S7 VARIABLE (I.E. SEND THE SMARTMODEM "AT S7=20" TO LOWER THE 30 SECOND
  607. ; WAIT TO 20 SECONDS).
  608. ;
  609. RESULT: MVI    C,75        ;<<== MAXIMUM TIME TO WAIT FOR RESULT
  610. SMWLP:    PUSH    B
  611.     MVI    B,1        ;CHECK FOR A CHAR, UP TO 1 SEC WAIT
  612.     MVI    C,TMDINP    ;DO TIMED INPUT
  613.     CALL    MEX
  614.     POP    B
  615.     JNC    SMTEST        ;JUMP IF MODEM HAD A CHAR
  616.     PUSH    B        ;NO, TEST FOR CONTROL-C FROM CONSOLE
  617.     MVI    C,CHEKCC
  618.     CALL    MEX
  619.     POP    B
  620.     JNZ    SMNEXT        ;IF NOT, JUMP
  621.     MVI    B,CR        ;YES, SHUT DOWN THE MODEM
  622.     MVI    C,SNDCHR
  623.     CALL    MEX
  624.     MVI    A,3        ;RETURN ABORT CODE
  625.     RET
  626. SMNEXT: DCR    C        ;NO
  627.     JNZ    SMWLP        ;CONTINUE
  628. ;
  629. ; 75 SECONDS WITH NO MODEM RESPONSE (OR NO CONNECTION)
  630. ;
  631. SMTIMO: MVI    A,2        ;RETURN TIMEOUT CODE
  632.     RET
  633. ;
  634. ; MODEM GAVE US A RESULT, CHECK IT
  635. ;
  636. SMTEST: ANI    7FH        ;IGNORE ANY PARITY
  637.     CALL    SMANAL        ;TEST THE RESULT
  638.     MOV    A,B        ;A=RESULT (CY SIGNIFICANT HERE TOO)
  639.     PUSH    PSW        ;SAVE IT
  640. SMTLP:    MVI    C,INMDM     ;FLUSH ANY REMAINING COMMAND LINE
  641.     CALL    MEX
  642.     JC    SMCHEK        ;JUMP IF NO INPUT
  643.     CPI    LF        ;GOT SOME ... WAITING FOR EOL
  644.     JNZ    SMTLP        ;EAT ANY IN-BETWEEN
  645. SMCHEK: POP    PSW        ;A HAS MEX RETURN-CODE, CY=1 IF UNKNOWN
  646.     JC    RESULT        ;IF RESULT UNKNOWN, IGNORE IT
  647.     RET
  648. ;
  649. SMANAL: MVI    B,0        ;PREP CONNECT CODE
  650.     CPI    'C'        ;"CONNECT"?
  651.     RZ
  652.  
  653.     MVI    B,2        ;PREP NO CONNECT MSG B=2
  654.     CPI    'N'        ;N=NO CONNECT
  655.     RZ
  656.  
  657.     MVI    B,4        ;PREP ERROR MSG B=4
  658.     CPI    'E'        ;E=ERROR
  659.     RZ
  660.  
  661.     STC            ;UNKNOWN...
  662.     RET
  663. ;
  664. ; FOLLOWING ROUTINE DISCONNECTS THE MODEM USING SMARTMODEM
  665. ; CODES. ALL REGISTERS ARE AVAILABLE FOR THIS FUNCTION.
  666. ; RESULT IS RETURNED TO USER.  
  667. ;
  668. ;
  669. DISCON: MVI    B,10
  670.     MVI    C,TIMER     ;WAIT 1 SECONDS
  671.     CALL    MEX
  672.     LXI    H,SMATN     ;SEND '+++'
  673.     CALL    SMSEND
  674.     MVI    B,30        ;WAIT 3 MORE SECONDS
  675.     MVI    C,TIMER
  676.     CALL    MEX
  677.     IN    MODCTL1     ;CHECK IF CARRIER
  678.     ANI    MODDCDB
  679.     JZ    DISCOK
  680.     MVI    B,30        ;WAIT ANOTHER 3 SECONDS
  681.     MVI    C,TIMER
  682.     CALL    MEX
  683.     IN    MODCTL1     ;CHECK IF STILL CARRIER  
  684.     ANI    MODDCDB
  685.     JNZ    DISCFAIL    ;IF STILL CARRIER TELL USER
  686. DISCOK: MVI    C,ILP
  687.     CALL    MEX
  688.     DB    CR,LF,'++DISCONNECTED++',CR,LF,0
  689.     RET
  690. DISCFAIL:
  691.     MVI    C,ILP
  692.     CALL    MEX
  693.     DB    CR,LF,'+++ WARNING !!!   NOT DISCONNECTED +++',CR,LF,0
  694.     RET
  695.  
  696. ;
  697. SMATN:    DB    '+++',0
  698. ;
  699. ; SMARTMODEM UTILITY ROUTINE: SEND STRING TO MODEM
  700. ;
  701. SMSEND: MVI    C,SNDRDY    ;WAIT FOR MODEM READY
  702.     CALL    MEX
  703.     JNZ    SMSEND
  704.     MOV    A,M        ;FETCH NEXT CHARACTER
  705.     INX    H
  706.     ORA    A        ;END?
  707.     RZ            ;DONE IF SO
  708.     MOV    B,A        ;NO, POSITION FOR SENDING
  709.     MVI    C,SNDCHR    ;NOPE, SEND THE CHARACTER
  710.     CALL    MEX
  711.     JMP    SMSEND
  712. ;
  713. ; DATA AREA
  714. ;
  715. SMDIAL: DB    'ATDT, '
  716. DIALBF: DS    52        ;2* 24 CHAR MAX, + CR + NULL + SLOP
  717. DIALPT: DS    2        ;DIAL POSITION POINTER
  718. ;
  719.     END
  720.