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

  1.     TITLE    'MEX SMARTMODEM OVERLAY V1.5'
  2. ;
  3. ; (DELETE ABOVE TITLE LINE IF ASSEMBLING WITH ASM)
  4. ;
  5. ; Smartmodem overlay for MEX: revision 1.5
  6. ; Written 04/16/84 by Ronald G. Fowler (V1.0)
  7. ;
  8. ; 02/20/85: Converted for MEX 1.2 - Al Jewer
  9. ;        Also added 'space bar return busy' function.
  10. ;
  11. ; 07/16/84: Added equate NUMRES to enable/disable numeric result code 
  12. ;        interpretation.  Under TurboDos, the first digit of the 
  13. ;        phone number was being interpreted as a result code as it 
  14. ;        was echoed by the Anchor modem as it dialed.  Set NUMRES false
  15. ;        to disable numeric results. (Bob Puckett)
  16. ;
  17. ; 06/06/84: Fixed problem for Anchor users, where, when the modem returned
  18. ;        "DIAL TONE", the "N" in "TONE" was being regarded as a NO-CONNECT
  19. ;        code.  Now we flush the entire result line before reading another.
  20. ;        Also added code for numeric version of "CONNECT 1200".  --RGF
  21. ;
  22. ; Small bug repaired: (V1.1) 05/14/84 (Steve Grandi): Smartmodem was not being 
  23. ;    flushed after a dial string so that last digit of the phone number 
  24. ;    was being interpreted as a numeric result code causing the program, 
  25. ;    for certain numbers, to give up even as the modem merrily dialed away.
  26. ;
  27. ; This modules adapts MEX for the DC Hayes Smartmodem (as well
  28. ; as many others -- including US Robotics -- that use a similar
  29. ; command language). The main function of this module is to pro-
  30. ; vide dialing capability; the disconnect vector is ancillary.
  31. ; You may use this module as a model to develop dialing routines
  32. ; for non-standard modems (e.g., the Racal-Vadic).  The only
  33. ; pertinent entry point is the DIAL routine; you'll find entry
  34. ; specs for that below.
  35. ;
  36. ; The only conditional you might want to change in this
  37. ; module is the DISC equate below -- if left on, MEX will
  38. ; use the Smartmodem's disconnect code.  If you prefer to
  39. ; provide your own in your overlay's DISCV vector (e.g.,
  40. ; by dropping DTR), then set DISC to FALSE and re-assemble.
  41. ; (If you don't understand this, then play it safe, and
  42. ; leave the equate set as it is).
  43. ; NOTE: Leave DISC set TRUE for MEX 1.2x
  44. ;
  45. ; This overlay will work with any modem overlay that terminates
  46. ; prior to 0B00H
  47. ;
  48. FALSE    EQU    0
  49. TRUE    EQU    NOT FALSE
  50. ;
  51. ;
  52. NUMRES    EQU    FALSE        ; TRUE = INTERPRET NUMERIC RESULT CODES
  53.                 ; FALSE = IGNORE NUMERIC RESULT CODES
  54. ;
  55. DISC    EQU    TRUE        ;<<== CHANGE TO FALSE IF YOU DISC. WITH DTR
  56.                 ;    leave set TRUE for MEX 1.2
  57. ;
  58. ;
  59. ;
  60. ; NOTE: This overlay converted for MEX 1.2 compatiblility 
  61. ;     and 8086 translation 2/20/85 by Al Jewer. 
  62. ;
  63. YES    EQU    0FFH        ;THIS IS FOR 8086 TRANSLATOR - DO NOT CHANGE
  64. NO    EQU    0
  65. I8080    EQU    YES        ;DEFINE PROCESSOR TYPE
  66. I8086    EQU    NO
  67. MEX2    EQU    NO        ;SET TRUE IF MEX 2.X, FALSE IF MEX 1.X
  68. TPULSV    EQU    0105H        ;TONE/PULSE FLAG IN MODEM OVERLAY
  69. NDISCV    EQU    015FH        ;NEW SMART MODEM DISCONNECT HERE
  70. DIALV    EQU    0162H        ;LOCATION OF DIAL VECTOR IN OVERLAY
  71. DISCV    EQU    0165H        ;LOCATION OF HARDWARE DISCONNECT VECTOR 
  72. DIALOC    EQU    0B00H        ;DIALING CODE GOES HERE
  73. MEXLOC    EQU    0D00H        ;"CALL MEX" HERE
  74. SMTABL    EQU    0D55H        ;SMARTMODEM INIT, DE-INIT AND SSET VECTORS
  75. ;
  76. ;
  77. ; FOLLOWING ARE FUNCTION CODES FOR THE MEX SERVICE CALL PROCESSOR
  78. ;
  79. INMDM    EQU    255        ;RETURN CHAR FROM MDM IN A, CY=NO CHR IN 100MS
  80. TIMER    EQU    254
  81. TMDINP    EQU    253        ;B=# SECS TO WAIT FOR CHAR, CY=NO CHAR
  82. CHEKCC    EQU    252        ;CHECK FOR ^C FROM KBD, Z=PRESENT
  83. SNDRDY    EQU    251        ;TEST FOR MODEM-SEND READY
  84. RCVRDY    EQU    250        ;TEST FOR MODEM-RECEIVE READY
  85. SNDCHR    EQU    249        ;SEND A CHARACTER TO THE MODEM (AFTER SNDRDY)
  86. RCVCHR    EQU    248        ;RECV A CHAR FROM MODEM (AFTER RCVRDY)
  87. ILP    EQU    240        ;INLINE PRINT
  88. KSTAT    EQU    11        ;KEYBOARD STATUS
  89. KBDIN    EQU    01        ;KEYBOARD INPUT
  90. ;
  91. CR    EQU    13
  92. LF    EQU    10
  93. ;
  94. ; ***** CODE STARTS HERE *****
  95. ;
  96. ;
  97. IF (NOT MEX2)
  98. ;
  99. ; NOTE:
  100. ;        This file contains control characters used by our
  101. ; 8080-8086 translator, XLAT. These are in the form of "\" characters
  102. ; inserted as the first character of the comment field. Please do
  103. ; not change or delete these, so that future versions of this overlay
  104. ; will directly convert to 8086 operation. Thanks,    - al
  105. ;
  106. ; For MEX 1.2, the first byte of the overlay MUST contain a "jump" opcode.
  107. ; The is a 0C3H for 8080 and an 0E9H for 8086. MEX 1.2 checks this byte
  108. ; before it loads the overlay, to make sure you don't load the wrong 
  109. ; type of overlay. This byte will not affect pre- 1.2 versions.
  110. ;
  111. ; Also, MEX 1.2 contains a new vector at 15FH which is the smart-modem
  112. ; disconnect vector (now separate from the hardware vector at 165H).
  113. ; The hardware vector typically toggles the DTR line to cause a hangup, 
  114. ; while the smart-modem vector sends the hangup string to the modem.
  115. ; Mex 1.2 will ignore the vector at 165H in this overlay.
  116. ;
  117.     ORG    100H        ;BASE OF TPA
  118. IF I8080
  119.     DB    0C3H        ;DEFINE 8080 OVERLAY
  120. ENDIF    ;I8080
  121. IF I8086
  122.     DB    0E9H        ;8086 FLAG
  123. ENDIF    ;I8086
  124. ;
  125.     ORG    TPULSV
  126. TPULSE:    DB    'T'        ;TOUCHTONE FLAG
  127. ;
  128.     IF    DISC        ;IF PROVIDING DISCONNECT CODE
  129.     ORG    NDISCV        ;SMART MODEM DISCONNECT VECTOR (MEX 1.20)
  130.     JMP    DISCON
  131.     ELSE
  132.     RET            ;FOR MEX 1.2, IN CASE SOMEBODY SCREWS UP....
  133.     ENDIF
  134. ;
  135.     ORG    DIALV        ;OVERLAY THE DIALING VECTOR
  136.     JMP    DIAL
  137. ;
  138.     IF    DISC        ;IF PROVIDING DISCONNECT CODE
  139.     ORG    DISCV        ;OVERLAY THE VECTOR (MEX 1.1X)
  140.     JMP    DISCON
  141.     ENDIF
  142. ;
  143. ;    
  144. ENDIF    ;NOT MEX2
  145. ;
  146. IF MEX2
  147. ;
  148. ; (note: re-enable ASEG & CSEG if MEX2)
  149. ;
  150. ;    ASEG            ;JUMP TABLE IS ABSOLUTE
  151. ;
  152.     ORG    10FH        ;MEX2 JUMPS START HERE
  153.     JMP    DIAL        ;FIRST IS DIAL VECTOR
  154.     DS    3        ;THEN HARDWARE DISCONNECT VECTOR
  155.     JMP    DISCON        ;THEN SOFTWARE DISCONNECT VECTOR
  156.     JMP    JUSTRT        ;SMART MODEM INIT
  157.     JMP    JUSTRT        ;SMART MODEM DEINIT
  158.     JMP    NOTIMP        ;SSET COMMAND
  159. ;
  160. ;    CSEG            ;REST IS CODE SEGMENT
  161. ;
  162. ENDIF    ;MEX2
  163. ;
  164. ;
  165. ; This is the DIAL routine called by MEX to dial a digit. The digit
  166. ; to be dialed is passed in the A register.  Note that two special
  167. ; codes must be intercepted as non-digits: 254 (start dial sequence)
  168. ; and 255 (end-dial sequence).  Mex will always call DIAL with 254
  169. ; in the accumulator prior to dialing a number.  Mex will also call
  170. ; dial with 255 in A as an indication that dialing is complete. Thus,
  171. ; the overlay may use these values to "block" the number, holding it
  172. ; in a buffer until it is completely assembled (in fact, that's the
  173. ; scheme employed here for the Smartmodem).
  174. ;
  175. ; After the 254-start-dial sequence, MEX will call the overlay with
  176. ; digits, one-at-a-time.  MEX will make no assumptions about the dig-
  177. ; its, and will send each to the DIAL routine un-inspected (some modems,
  178. ; like the Smartmodem, allow special non-numeric characters in the
  179. ; phone number, and MEX may make no assumptions about these).
  180. ;
  181. ; After receiving the end-dial sequence (255) the overlay must take
  182. ; whatever end-of-dial actions are necessary *including* waiting for
  183. ; carrier at the distant end.  The overlay should monitor the keyboard
  184. ; during this wait (using the MEX keystat service call), and return
  185. ; an exit code to MEX in the A register, as follows:
  186. ;
  187. ;    0 - Carrier detected, connection established
  188. ;    1 - Far end busy (only for modems that can detect this condition)
  189. ;    2 - No answer (or timed out waiting for modem response)
  190. ;    3 - Keyboard abort (^C only: all others should be ignored)
  191. ;    4 - Error reported by modem
  192. ;
  193. ; <No other codes should be returned after an end-dial sequence>
  194. ;
  195. ; The overlay should not loop forever in the carrier-wait routine, but
  196. ; instead use either the overlay timer vector, or the INMDMV (timed 100
  197. ; ms character wait) service call routine.
  198. ;
  199. ; The DIAL routine is free to use any of the registers, but must return
  200. ; the above code after an end-dial sequence
  201. ;
  202. IF (NOT MEX2)
  203.     ORG    DIALOC
  204. ENDIF    ;NOT MEX2
  205. ;
  206. DIAL:    LHLD    DIALPT        ;FETCH POINTER
  207.     CPI    254        ;START DIAL?
  208.     JZ    STDIAL        ;\JUMP IF SO
  209.     CPI    255        ;END DIAL?
  210.     JZ    ENDIAL        ;\JUMP IF SO
  211. ;
  212. ; Not start or end sequence, must be a digit to be sent to the modem
  213. ;
  214.     MOV    M,A        ;PUT CHAR IN BUFFER
  215.     INX    H        ;\ADVANCE POINTER
  216.     SHLD    DIALPT        ;STUFF PNTR
  217.     RET            ;ALL DONE
  218. ;
  219. ; Here on a start-dial sequence
  220. ;
  221. STDIAL:    LXI    H,DIALBF    ;SET UP BUFFER POINTER
  222.     SHLD    DIALPT
  223.     RET
  224. ;
  225. ; Here on an end-dial sequence
  226. ;
  227. ENDIAL:    MVI    M,CR        ;STUFF END-OF-LINE INTO BUFFER
  228.     INX    H        ;\FOLLOWED BY TERMINATOR
  229.     MVI    M,0
  230.     LDA    TPULSE        ;GET OVERLAY'S TOUCH-TONE FLAG
  231.     STA    SMDIAL+3    ;PUT INTO STRING
  232.     LXI    H,SMDIAL    ;POINT TO DIALING STRING
  233.     CALL    SMSEND        ;SEND IT
  234. WAITSM:    MVI    C,INMDM
  235.     CALL    MEX        ;CATCH ANY OUTPUT FROM THE MODEM
  236.     JNC    WAITSM        ;\LOOP UNTIL NO MORE CHARACTERS
  237. ;
  238. ; THE FOLLOWING LOOP WAITS FOR A RESULT FROM THE MODEM (UP TO
  239. ; 60 SECONDS: YOU MAY CHANGE THIS VALUE IN THE FOLLOWING LINE).
  240. ; NOTE THAT THE SMARTMODEM HAS AN INTERNAL 30 SECOND TIMEOUT WHILE
  241. ; FOR A CARRIER ON THE OTHER END.  YOU CAN CHANGE BY PLAYING WITH THE
  242. ; S7 VARIABLE (I.E. SEND THE SMARTMODEM "AT S7=20" TO LOWER THE 30 SECOND
  243. ; WAIT TO 20 SECONDS).
  244. ;
  245. RESULT:    MVI    C,60        ;<<== MAXIMUM TIME TO WAIT FOR RESULT
  246. SMWLP:    PUSH    B
  247.     MVI    B,1        ;CHECK FOR A CHAR, UP TO 1 SEC WAIT
  248.     MVI    C,TMDINP    ;DO TIMED INPUT
  249.     CALL    MEX
  250.     POP    B
  251.     JNC    SMTEST        ;\JUMP IF MODEM HAD A CHAR
  252.     PUSH    B        ;NO, TEST FOR CONTROL-C FROM CONSOLE
  253.     MVI    C,KSTAT        ;CHECK FOR KEYPRESS
  254.     CALL    MEX
  255.     ORA    A
  256.     POP    B
  257.     JZ    SMNEXT        ;\JUMP IF NO KEYPRESS
  258.     PUSH    B        ;GET KEYPRESS
  259.     MVI    C,KBDIN
  260.     CALL    MEX
  261.     POP    B
  262.     CPI    'C'-40H        ;IS ^C?
  263.     JNZ    NOCC        ;\JUMP IF NOT
  264.     MVI    A,3        ;PREP RETURN CODE
  265.     PUSH    PSW        ;\SAVE IT
  266. ABCOM:    MVI    B,CR        ;YES, SHUT DOWN THE MODEM
  267.     MVI    C,SNDCHR
  268.     CALL    MEX
  269.     POP    PSW        ;\RETURN ABORT CODE
  270.     RET
  271. NOCC:    CPI    ' '        ;SPACE BAR?
  272.     JNZ    SMNEXT        ;\IGNORE ALL OTHERS
  273.     MVI    A,1        ;PREP RETURN CODE
  274.     PUSH    PSW        ;\
  275.     JMP    ABCOM        ;\FINISH IN COMMON CODE
  276. SMNEXT:    DCR    C        ;NO
  277.     JNZ    SMWLP        ;\CONTINUE
  278. ;
  279. ; ONE MINUTE WITH NO MODEM RESPONSE (OR NO CONNECTION)
  280. ;
  281. SMTIMO:    MVI    A,2        ;RETURN TIMEOUT CODE
  282.     RET
  283. ;
  284. ; MODEM GAVE US A RESULT, CHECK IT
  285. ;
  286. SMTEST:    ANI    7FH        ;IGNORE ANY PARITY
  287.     CALL    SMANAL        ;TEST THE RESULT
  288.     MOV    A,B        ;A=RESULT (CY SIGNIFICANT HERE TOO)
  289.     PUSH    PSW        ;SAVE IT
  290. SMTLP:    MVI    C,INMDM        ;FLUSH ANY REMAINING COMMAND LINE
  291.     CALL    MEX
  292.     JC    SMCHEK        ;\JUMP IF NO INPUT
  293.     CPI    LF        ;GOT SOME ... WAITING FOR EOL
  294.     JNZ    SMTLP        ;\EAT ANY IN-BETWEEN
  295. SMCHEK:    POP    PSW        ;A HAS MEX RETURN-CODE, CY=1 IF UNKNOWN
  296.     JC    RESULT        ;\IF RESULT UNKNOWN, IGNORE IT
  297.     RET
  298. ;
  299. SMANAL:    MVI    B,0        ;PREP CONNECT CODE
  300.     CPI    'C'        ;"CONNECT"?
  301.     RZ            ;\R1\
  302.  
  303.     IF     NUMRES
  304.     CPI    '1'        ;NUMERIC VERSION OF "CONNECT"
  305.     RZ            ;\R1\
  306.     CPI    '5'        ;NUMERIC VERSION OF "CONNECT 1200"
  307.     RZ            ;\R1\
  308.     ENDIF
  309.  
  310.     INR    B        ;PREP BUSY CODE B=1
  311.     CPI    'B'
  312.     RZ            ;\R1\
  313.     INR    B        ;PREP NO CONNECT MSG B=2
  314.     CPI    'N'        ;N=NO CONNECT
  315.     RZ            ;\R1\
  316.  
  317.     IF     NUMRES
  318.     CPI    '3'        ;NUMERIC VERSION OF "NO CONNECT"
  319.     RZ            ;\R1\
  320.     ENDIF
  321.  
  322.     MVI    B,4        ;PREP MODEM ERROR
  323.     CPI    'E'        ;E=ERROR
  324.     RZ            ;\R1\
  325.  
  326.     IF    NUMRES
  327.     CPI    '4'        ;NUMERIC VERSION OF "ERROR"
  328.     RZ            ;\R1\
  329.     ENDIF
  330.  
  331.     STC            ;UNKNOWN...
  332. R1:    RET
  333. ;
  334. ; FOLLOWING ROUTINE DISCONNECTS THE MODEM USING SMARTMODEM
  335. ; CODES. ALL REGISTERS ARE AVAILABLE FOR THIS FUNCTION.
  336. ; NOTHING RETURNED TO CALLER.
  337. ;
  338.     IF    DISC
  339. ;
  340. DISCON:    MVI    B,20
  341.     MVI    C,TIMER        ;WAIT 2 SECONDS
  342.     CALL    MEX
  343.     LXI    H,SMATN        ;SEND '+++'
  344.     CALL    SMSEND
  345.     MVI    B,20        ;WAIT 2 MORE SECONDS
  346.     MVI    C,TIMER
  347.     CALL    MEX
  348.     LXI    H,SMDISC    ;SEND 'ATH'
  349.     CALL    SMSEND
  350.     MVI    B,1        ;WAIT 1 SECOND
  351.     MVI    C,TIMER
  352.     CALL    MEX
  353.     RET
  354. ;
  355. SMATN:    DB    '+++',0
  356. SMDISC:    DB    'ATH',CR,0
  357. ;
  358.     ENDIF
  359. ;
  360. ; SMARTMODEM UTILITY ROUTINE: SEND STRING TO MODEM
  361. ;
  362. SMSEND:    MVI    C,SNDRDY    ;WAIT FOR MODEM READY
  363.     CALL    MEX
  364.     JNZ    SMSEND        ;\
  365.     MOV    A,M        ;FETCH NEXT CHARACTER
  366.     INX    H        ;\
  367.     ORA    A        ;END?
  368.     RZ            ;\R1\DONE IF SO
  369.     MOV    B,A        ;NO, POSITION FOR SENDING
  370.     MVI    C,SNDCHR    ;NOPE, SEND THE CHARACTER
  371.     CALL    MEX
  372.     JMP    SMSEND        ;\
  373. ;
  374. ; DATA AREA
  375. ;
  376. SMDIAL:    DB    'ATDT '
  377. DIALBF:    DS    52        ;2* 24 CHAR MAX, + CR + NULL + SLOP
  378. DIALPT:    DS    2        ;DIAL POSITION POINTER
  379. ;
  380. ;
  381. NOTIMP:    MVI    C,ILP
  382.     CALL    MEX
  383.     DB    CR,LF,'Not Implemented',CR,LF,0
  384. JUSTRT:    RET
  385. ;
  386. ;
  387.     ORG    MEXLOC        ;"CALL MEX"
  388. MEX:
  389. ;
  390. ;
  391. IF (NOT MEX2)
  392.     ORG    SMTABL        ;TABLE OF SMART MODEM VECTORS HERE
  393. ;
  394.     DW    JUSTRT        ;SMART MODEM INIT
  395.     DW    NOTIMP        ;SSET COMMAND (NOT IMPLEMENTED)
  396.     DW    JUSTRT        ;SMART MODEM EXIT 
  397. ENDIF    ;NOT MEX2
  398. ;
  399.     END
  400.