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

  1. ;    TITLE    'MEX CTS COMPANION MODEM OVERLAY V1.4'
  2. ;
  3. ; (DELETE ABOVE TITLE LINE IF ASSEMBLING WITH ASM)
  4. ;
  5. ; CTS Companion modem 212AH overlay for MEX: revision 1.4
  6. ;
  7. ; Misc. little fixes 14feb85 to 18feb85 not distributed until final date (v1.4)
  8. ; Modified delay to make DSC & abort work consistently 10feb85 I S Wolfe (v1.3)
  9. ; Modified for auto baud rate change on CTS-212AH 10feb85 by I S Wolfe (v1.2)
  10. ;  a bug in the TYPE routine was fixed & some other problems solved.
  11. ; Originally written 07/24/84 by Ronald G. Fowler (V1.0)
  12. ;
  13. ; ATTENTION:  READ THIS PARAGRAPH BEFORE USING:
  14. ; This module adapts MEX for the CTS 212AH modem, but the MEX standard of
  15. ; keeping modem & computer overlays independent prevents complete adaptation.
  16. ; The module primarily provides dialing capability with automatic
  17. ; resetting of the modem with ^T so that baud rate changes can be initiated
  18. ; with ^Q^M before the dialing sequence.  NOTE THAT THE USER MUST RESET THE
  19. ; MODEM MANUALLY AFTER A COMPLETED CONVERSATION BY TYPING ^T WHILE STILL IN
  20. ; TERMINAL MODE.  Resets should occur automatically after a Busy, No answer,
  21. ; No tone, or Abort response from the modem.  Letters from the modem are
  22. ; displayed so the user can track a call's progress: D for dialing, R for ring,
  23. ; B for busy, etc.                               -- I S Wolfe 10feb85
  24. ;
  25. ;THIS DISCUSSION IS BY RON FOWLER.  I S Wolfe believes it is reasonable but
  26. ;only conjectural, and that until you experience trouble, don't worry:
  27. ; You may want to disable the ^T disconnect character  by issuing
  28. ; the "@@" command in terminal mode (although this will defeat the
  29. ; DISC option below, and require disconnect support be handled through
  30. ; DTR control in your hardware overlay).  This will sometimes be
  31. ; desirable to avoid disconnect problems when transmitting files
  32. ; in protocol mode over packet-switched networks (eg, Arpa and Compu-
  33. ; serve), where a block ending in control T could cause a disconnect
  34. ; if it takes more than one second for the ACK or NAK sequence to
  35. ; return from the remote end.  This will not usually be necessary
  36. ; for RCPM work, since character turnaround is normally much less
  37. ; than one second.
  38. ;
  39. ; The only conditional you might want to change in this
  40. ; module is the DISC equate below -- if left on, MEX will
  41. ; use the Companion's disconnect code.  If you prefer to
  42. ; provide your own in your overlay's DISCV vector (e.g.,
  43. ; by dropping DTR), then set DISC to FALSE and re-assemble.
  44. ; (If you don't understand this, then play it safe, and
  45. ; leave the equate set as it is).
  46. ;
  47. ; This overlay will work with any modem overlay that terminates
  48. ; prior to 0B00H
  49. ;
  50. FALSE    EQU    0
  51. TRUE    EQU    NOT FALSE
  52. ;
  53. NUMRES    EQU    FALSE        ; TRUE = INTERPRET NUMERIC RESULT CODES
  54.                 ; FALSE = IGNORE NUMERIC RESULT CODES
  55. ;
  56. DISC    EQU    TRUE        ;<<== CHANGE TO FALSE IF YOU DISC. WITH DTR
  57. ;
  58. ; SYSTEM CONSTANTS
  59. ;
  60. TPULSE    EQU    0105H        ;TONE/PULSE FLAG IN MODEM OVERLAY
  61. DIALV    EQU    0162H        ;LOCATION OF DIAL VECTOR IN OVERLAY
  62. DISCV    EQU    0165H        ;LOCATION OF DISCONNECT VECTOR IN OVERLAY
  63. DIALOC    EQU    0B00H        ;DIALING CODE GOES HERE
  64. MEX    EQU    0D00H        ;"CALL MEX"
  65. BDOS    EQU    0005H        ;for call bdos in TYPE -- in case it becomes necessary
  66. ;
  67. ; FOLLOWING ARE FUNCTION CODES FOR THE MEX SERVICE CALL PROCESSOR
  68. ;
  69. INMDM    EQU    255        ;RETURN CHAR FROM MDM IN A, CY=NO CHR IN 100MS
  70. TIMER    EQU    254
  71. TMDINP    EQU    253        ;B=# SECS TO WAIT FOR CHAR, CY=NO CHAR
  72. CHEKCC    EQU    252        ;CHECK FOR ^C FROM KBD, Z=PRESENT
  73. SNDRDY    EQU    251        ;TEST FOR MODEM-SEND READY
  74. RCVRDY    EQU    250        ;TEST FOR MODEM-RECEIVE READY
  75. SNDCHR    EQU    249        ;SEND A CHARACTER TO THE MODEM (AFTER SNDRDY)
  76. RCVCHR    EQU    248        ;RECV A CHAR FROM MODEM (AFTER RCVRDY)
  77. ;
  78. CR    EQU    13
  79. LF    EQU    10
  80. CTRLT    EQU    20    ;added by isw
  81. CTRLQ    EQU    17    ;added by isw
  82. CONOUT    EQU    2    ;added by isw
  83. ;
  84.     ORG    DIALV        ;OVERLAY THE DIALING VECTOR
  85.     JMP    DIAL
  86. ;
  87.     IF    DISC        ;IF PROVIDING DISCONNECT CODE here (we do)
  88.     ORG    DISCV        ;OVERLAY THE VECTOR
  89.     JMP    DISCON
  90.     ENDIF
  91. ;
  92. ; This is the DIAL routine called by MEX to dial a digit.  The digit
  93. ; to be dialed is passed in the A register.  Note that two special
  94. ; codes must be intercepted as non-digits: 254 (start dial sequence)
  95. ; and 255 (end-dial sequence).  MEX will always call DIAL with 254
  96. ; in the accumulator prior to dialing a number.  MEX will also call
  97. ; dial with 255 in A as an indication that dialing is complete.  Thus,
  98. ; the overlay may use these values to "block" the number, holding it
  99. ; in a buffer until it is completely assembled (in fact, that's the
  100. ; scheme Ron Fowler employed here for the CTS modem).
  101. ;
  102. ; After the 254-start-dial sequence, MEX will call the overlay with
  103. ; digits, one-at-a-time.  MEX will make no assumptions about the digits,
  104. ; and will send each to the DIAL routine un-inspected (some modems,
  105. ; like the CTS modem, allow special non-numeric characters in the
  106. ; phone number, and MEX may make no assumptions about these).
  107. ;
  108. ; After receiving the end-dial sequence (255) the overlay must take
  109. ; whatever end-of-dial actions are necessary *including* waiting for
  110. ; carrier at the distant end.  The overlay should monitor the keyboard
  111. ; during this wait (using the MEX keystat service call), and return
  112. ; an exit code to MEX in the A register, as follows:
  113. ;
  114. ;    0 - Carrier detected, connection established
  115. ;    1 - Far end busy (only for modems that can detect this condition)
  116. ;    2 - No answer (or timed out waiting for modem response)
  117. ;    3 - Keyboard abort (^C only: all others should be ignored)
  118. ;    4 - Error reported by modem
  119. ;
  120. ; <No other codes should be returned after an end-dial sequence>
  121. ;
  122. ; The overlay should not loop forever in the carrier-wait routine, but
  123. ; instead use either the overlay timer vector, or the INMDMV (timed 100
  124. ; ms character wait) service call routine.
  125. ;
  126. ; The DIAL routine is free to use any of the registers, but must return
  127. ; the above code after an end-dial sequence
  128. ;
  129.     ORG    DIALOC
  130. ;
  131. DIAL:
  132. ;
  133.     LHLD    DIALPT        ;FETCH POINTER
  134.     CPI    254        ;START DIAL?
  135.     JZ    STDIAL        ;JUMP IF SO
  136.     CPI    255        ;END DIAL?
  137.     JZ    ENDIAL        ;JUMP IF SO
  138. ;
  139. ; Not start or end sequence, must be a digit to be sent to the modem
  140. ;
  141.     MOV    M,A        ;PUT CHAR IN BUFFER
  142.     INX    H        ;ADVANCE POINTER
  143.     SHLD    DIALPT        ;STUFF PNTR
  144.     RET            ;DONE with this "digit"
  145. ;
  146. ; Here on a start-dial sequence
  147. ;
  148. STDIAL:
  149. ;
  150.     LXI    H,CTSPED    ;SEND ^Q^M     ;inserted here by isw to set modem speed
  151.     CALL    CTSEND                 ;after modem was reset entirely by extra ^t.
  152. ;
  153.     LXI    H,DIALBF    ;SET UP BUFFER POINTER
  154.     SHLD    DIALPT
  155.     RET
  156. ;
  157. ; Here on an end-dial sequence
  158. ;
  159. ENDIAL:
  160. ;
  161.     MVI    M,CR        ;STUFF END-OF-LINE INTO BUFFER
  162.     INX    H        ;FOLLOWED BY null TERMINATOR
  163.     MVI    M,0
  164.     LDA    TPULSE        ;GET OVERLAY'S TOUCH-TONE FLAG
  165.     STA    CTDIAL        ;put it into the dialing command
  166. ;
  167. ENDL0:    ;added by isw to pick up & discard "modem ready" from the ^q^m
  168. ;
  169.     MVI    C,INMDM        ;CLEAR ANY WAITING MODEM CHARACTERS
  170.     CALL    MEX
  171.     JNC    ENDL0        ;LOOP UNTIL NO MORE
  172. ;
  173.     LXI    H,CTDIAL    ;POINT TO DIALING STRING
  174.     CALL    CTSEND        ;SEND IT
  175. ;
  176. WAITSM:
  177. ;
  178.     MVI    C,INMDM
  179.     CALL    MEX        ;CATCH ANY OUTPUT FROM THE MODEM
  180.     JNC    WAITSM        ;LOOP UNTIL NO MORE CHARACTERS
  181. ;
  182. ; THE FOLLOWING LOOP WAITS FOR A RESULT FROM THE MODEM (UP TO
  183. ; 60 SECONDS: YOU MAY CHANGE THIS VALUE IN THE FOLLOWING LINE).
  184. ;
  185. RESULT:
  186. ;
  187.     MVI    C,60        ;<<== MAXIMUM TIME TO WAIT FOR RESULT
  188. ;
  189. SMWLP:
  190. ;
  191.     MVI    B,1        ;CHECK FOR A CHAR, UP TO 1 SEC WAIT
  192.     MVI    C,TMDINP    ;DO TIMED INPUT
  193.     CALL    MEX
  194.     JNC    SMTEST        ;JUMP IF MODEM HAD A CHAR
  195.     MVI    C,CHEKCC
  196.     CALL    MEX
  197.     JNZ    SMNEXT        ;IF NOT, JUMP
  198.     CALL    DISCON    ;added by isw to replace 3 deleted lines that didn't do enough
  199.     MVI    A,3        ;RETURN ABORT CODE
  200.     RET
  201. ;
  202. SMNEXT:
  203. ;
  204.     DCR    C        ;NO so reduce the 60 second count
  205.     JNZ    SMWLP        ;CONTINUE
  206. ;
  207. ; ONE MINUTE WITH NO MODEM RESPONSE (OR NO CONNECTION)
  208. ;
  209. SMTIMO:
  210. ;
  211.     CALL    DISCON    ;added by isw
  212.     MVI    A,2        ;RETURN TIMEOUT CODE
  213.     RET
  214. ;
  215. ; MODEM GAVE US A RESULT, CHECK IT
  216. ;
  217. SMTEST:
  218. ;
  219.     ANI    7FH        ;IGNORE ANY PARITY
  220.     CALL    SMANAL        ;TEST THE RESULT
  221.     MOV    A,B        ;A=RESULT (CY SIGNIFICANT HERE TOO)
  222.     PUSH    PSW        ;SAVE IT
  223. ;
  224. SMTLP:
  225. ;
  226.     MVI    C,INMDM        ;FLUSH ANY REMAINING COMMAND LINE
  227.     CALL    MEX
  228.     JC    SMCHEK        ;JUMP IF NO INPUT
  229.     CPI    LF        ;GOT SOME ... WAITING FOR EOL
  230.     JNZ    SMTLP        ;EAT ANY IN-BETWEEN
  231. ;
  232. SMCHEK:
  233. ;
  234.     MVI    A,' '        ;isw lets display a space for formatting purposes
  235.     CALL    TYPE    ;isw
  236.     POP    PSW        ;A HAS MEX RETURN-CODE, CY=1 IF UNKNOWN
  237.     JC    SMC1    ;isw go process unknown response
  238.     ORA    A    ;isw check for 0
  239.     RZ        ;isw return now if on line
  240.     PUSH    PSW    ;isw save return code
  241.     CALL    DISCON    ;isw reset modem since not on line
  242.     POP    PSW    ;isw get back return code
  243.     RET            ;was VALID RETURN CODE, so EXIT
  244. ;
  245. SMC1:    ;note: isw removed Ron's code, left extra jump in for possible later use
  246. ;
  247.     JMP    RESULT        ;AND CONTINUE, ignoring the Dialing or Ring or any unknown code
  248. ;
  249. ; ANALYZE CODE, RETURN CY=1 IF UNKNOWN CODE.  VALID
  250. ; EXIT CODES COME BACK IN B, CHAR IN A IS PRESERVED
  251. ;
  252. SMANAL:
  253. ;
  254.     CPI    ' '    ;is it okay to display? added by isw to see what's going on
  255.     CNC    TYPE    ;call type if char from modem is greater than space
  256.     MVI    B,0        ;PREP CONNECT CODE
  257.     CPI    'O'        ;"ON LINE"?
  258.     RZ
  259.     INR    B        ;PREP BUSY CODE B=1
  260.     CPI    'B'        ;B=BUSY
  261.     RZ
  262.     INR    B        ;PREP NO CONNECT MSG B=2
  263.     CPI    'N'        ;N=NO PHONE # OR NO ANSWER OR NO DIALTONE
  264.     RZ
  265.     CPI    'M'        ;M=MODEM READY which will occur after DEAD LINE gives a D
  266.     RZ
  267.     STC            ;set carry means it is an UNKNOWN code
  268.     RET
  269. ;
  270. ; FOLLOWING ROUTINE DISCONNECTS (& resets) THE MODEM USING THE CTS
  271. ; DISCONNECT CODE. ALL REGISTERS ARE AVAILABLE FOR THIS FUNCTION.
  272. ; NOTHING RETURNED TO CALLER.
  273. ;
  274.     IF    DISC
  275. ;
  276. DISCON:
  277. ;
  278. ;the ^t only works, it appears (v1.4) if there are no characters flowing after
  279. ;it in EITHER direction, so I'm cutting the time to 9 tenths & waiting for a
  280. ;pause in incoming chars (adding 1 tenth +) before sending each of 3 ^t's
  281. ;
  282.     LXI    H,CTDISC    ;SEND ^T
  283.     CALL    CTSEND
  284. ;
  285. DCN0:
  286. ;
  287.     MVI    C,INMDM        ;CLEAR ANY WAITING MODEM CHARACTERS
  288.     CALL    MEX
  289.     JNC    DCN0        ;LOOP UNTIL NO MORE
  290.     MVI    B,9        ;WAIT .9 SECOND more for 1 second total
  291.     MVI    C,TIMER
  292.     CALL    MEX
  293.     LXI    H,CTDISC    ;SEND ^T
  294.     CALL    CTSEND
  295. ;
  296. DCN3:
  297. ;
  298.     MVI    C,INMDM        ;wait until incoming char's are cleared & no more coming
  299.     CALL    MEX
  300.     JNC    DCN3        ;LOOP UNTIL NO MORE
  301.     MVI    B,9        ;WAIT 1 SECOND total including inmdm loop
  302.     MVI    C,TIMER
  303.     CALL    MEX        ;to reset modem entirely awaiting ^q^m
  304. ;    LXI    H,CTDISC    ;SEND ^T        this third one commented out to see if okay
  305. ;    CALL    CTSEND
  306. ;
  307. ;DCN2:
  308. ;
  309. ;    MVI    C,INMDM        ;wait until incoming char's are cleared & no more coming
  310. ;    CALL    MEX
  311. ;    JNC    DCN2        ;LOOP UNTIL NO MORE
  312. ;    MVI    B,9        ;WAIT 1 SECOND total
  313. ;    MVI    C,TIMER
  314. ;    CALL    MEX        ;to reset modem entirely awaiting ^q^m
  315. ;
  316. DCN1:
  317. ;        ;added to pick up & discard "disconnect"
  318.     MVI    C,INMDM        ;CLEAR ANY WAITING MODEM CHARACTERS
  319.     CALL    MEX
  320.     JNC    DCN1        ;LOOP UNTIL NO MORE
  321.     RET
  322. ;
  323.     ENDIF
  324. ;
  325. ; SEND STRING TO MODEM
  326. ;
  327. CTSEND:
  328. ;
  329.     MVI    C,SNDRDY    ;WAIT FOR MODEM READY
  330.     CALL    MEX
  331.     JNZ    CTSEND
  332.     MOV    A,M        ;FETCH NEXT CHARACTER
  333.     INX    H        ;step the pointer
  334.     ORA    A        ;END? (signified by null)
  335.     RZ            ;DONE IF SO
  336.     MOV    B,A        ;NO, POSITION FOR SENDING
  337.     MVI    C,SNDCHR    ;SEND THE CHARACTER
  338.     CALL    MEX
  339.     JMP    CTSEND
  340. ;
  341. ; TYPE CHARACTER IN  A  ON the SCREEN
  342. ;
  343. TYPE:
  344. ;
  345.     PUSH    H        ;SAVE THE REGISTERS
  346.     PUSH    D
  347.     PUSH    B
  348.     PUSH    PSW
  349.     MOV    E,A        ;ALIGN
  350.     MVI    C,CONOUT        ;FUNCTION CODE
  351.     CALL    MEX    ;call bdos via mex
  352.     POP    PSW        ;CLEAN UP AND EXIT
  353.     POP    B
  354.     POP    D
  355.     POP    H
  356.     RET
  357. ;
  358. ; DATA AREA
  359. ;
  360. CTDISC:    DB    CTRLT,0    ;added by isw
  361. CTSPED:    DB    CTRLQ,CR,0    ;added by isw
  362. CTDIAL:    DB    'T'
  363. DIALBF:    DS    52        ;2* 24 CHAR MAX, + CR + NULL + SLOP
  364. DIALPT:    DS    2        ;DIAL POSITION POINTER
  365. ;
  366.     END
  367.