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

  1.     TITLE    'MEX CERMETEK INFO-MATE OVERLAY V1.1'
  2. ;
  3. ; (DELETE ABOVE TITLE LINE IF ASSEMBLING WITH ASM)
  4. ;
  5. ; Cermetek Info-Mate 212A/199SA overlay for MEX: version 1.1
  6. ;
  7. ; Derived from MXO-SM11.AQM by Ronald Mozer (V1.0)
  8. ; Original written by Ronald G. Fowler (V1.0)
  9. ;
  10. ; Fixed bug where 'B's in the dial string were being interpreted
  11. ;   as a busy signal. Added messages for status not covered by MEX
  12. ;   and conditional assembly for model differences.
  13. ;   02/14/85 Rory Kestner (V1.1)
  14. ;
  15. ;
  16. ; This modules adapts MEX for the Cermetek Info-Mate 212A/199SA modem.
  17. ; The main function of this module is to provide dialing capability;
  18. ; the disconnect vector is ancillary.  You must supply the disconnect
  19. ; routine which drops the DTR line in the standard mdm7 overlay as
  20. ; the info-mate has no other way of hanging up after the 'U 1' code.
  21. ;
  22. ; Use the MXO-SM?? or MXO-PM?? as a model to develop dialing routines
  23. ; for non-standard modems (e.g., the Racal-Vadic) as they will be better
  24. ; supported.
  25. ;
  26. ; This overlay will work with any modem overlay that terminates
  27. ; prior to 0B00H
  28. ;
  29. ; MODEL NUMBER
  30. ;
  31. IM212A    EQU    NO        ;YES FOR 212A, NO FOR 199SA
  32. ;
  33. NO    EQU    0
  34. YES    EQU    NOT NO
  35. ;
  36. ; SYSTEM CONSTANTS
  37. ;
  38. DIALV    EQU    0162H        ;LOCATION OF DIAL VECTOR IN OVERLAY
  39. GOODBY    EQU    0168H        ;LOCATION OF GOODBYE VECTOR IN OVERLAY
  40. DIALOC    EQU    0B00H        ;DIALING CODE GOES HERE
  41. MEX    EQU    0D00H        ;"CALL MEX"
  42. ;
  43. ; FOLLOWING ARE FUNCTION CODES FOR THE MEX SERVICE CALL PROCESSOR
  44. ;
  45. INMDM    EQU    255        ;RETURN CHAR FROM MDM IN A, CY=NO CHR IN 100MS
  46. TIMER    EQU    254
  47. TMDINP    EQU    253        ;B=# SECS TO WAIT FOR CHAR, CY=NO CHAR
  48. CHEKCC    EQU    252        ;CHECK FOR ^C FROM KBD, Z=PRESENT
  49. SNDRDY    EQU    251        ;TEST FOR MODEM-SEND READY
  50. RCVRDY    EQU    250        ;TEST FOR MODEM-RECEIVE READY
  51. SNDCHR    EQU    249        ;SEND A CHARACTER TO THE MODEM (AFTER SNDRDY)
  52. RCVCHR    EQU    248        ;RECV A CHAR FROM MODEM (AFTER RCVRDY)
  53. ILP    EQU    240        ;INLINE PRINT
  54. ;
  55. CR    EQU    13
  56. LF    EQU    10
  57. ;
  58. ;
  59.     ORG    DIALV        ;OVERLAY THE DIALING VECTOR
  60.     JMP    DIAL
  61. ;
  62. ; This is the DIAL routine called by MEX to dial a digit. The digit
  63. ; to be dialed is passed in the A register.  Note that two special
  64. ; codes must be intercepted as non-digits: 254 (start dial sequence)
  65. ; and 255 (end-dial sequence).  Mex will always call DIAL with 254
  66. ; in the accumulator prior to dialing a number.  Mex will also call
  67. ; dial with 255 in A as an indication that dialing is complete. Thus,
  68. ; the overlay may use these values to "block" the number, holding it
  69. ; in a buffer until it is completely assembled (in fact, that's the
  70. ; scheme employed here for the Info-Mate).
  71. ;
  72. ; After the 254-start-dial sequence, MEX will call the overlay with
  73. ; digits, one-at-a-time.  MEX will make no assumptions about the dig-
  74. ; its, and will send each to the DIAL routine un-inspected (some modems,
  75. ; like the Smartmodem, allow special non-numeric characters in the
  76. ; phone number, and MEX may make no assumptions about these).
  77. ;
  78. ; After receiving the end-dial sequence (255) the overlay must take
  79. ; whatever end-of-dial actions are necessary *including* waiting for
  80. ; carrier at the distant end.  The overlay should monitor the keyboard
  81. ; during this wait (using the MEX keystat service call), and return
  82. ; an exit code to MEX in the A register, as follows:
  83. ;
  84. ;    0 - Carrier detected, connection established
  85. ;    1 - Far end busy (only for modems that can detect this condition)
  86. ;    2 - No answer (or timed out waiting for modem response)
  87. ;    3 - Keyboard abort (^C only: all others should be ignored)
  88. ;    4 - Error reported by modem
  89. ;
  90. ; <No other codes should be returned after an end-dial sequence>
  91. ;
  92. ; The overlay should not loop forever in the carrier-wait routine, but
  93. ; instead use either the overlay timer vector, or the INMDMV (timed 100
  94. ; ms character wait) service call routine.
  95. ;
  96. ; The DIAL routine is free to use any of the registers, but must return
  97. ; the above code after an end-dial sequence
  98. ;
  99.     ORG    DIALOC
  100. ;
  101. DIAL:    LHLD    DIALPT        ;FETCH POINTER
  102.     CPI    254        ;START DIAL?
  103.     JZ    STDIAL        ;JUMP IF SO
  104.     CPI    255        ;END DIAL?
  105.     JZ    ENDIAL        ;JUMP IF SO
  106. ;
  107. ; Not start or end sequence, must be a digit to be sent to the modem
  108. ;
  109.     MOV    M,A        ;PUT CHAR IN BUFFER
  110.     INX    H        ;ADVANCE POINTER
  111.     SHLD    DIALPT        ;STUFF PNTR
  112.     RET            ;ALL DONE
  113. ;
  114. ; Here on a start-dial sequence
  115. ;
  116. STDIAL:    CALL    GOODBY
  117.     LXI    H,DIALBF    ;SET UP BUFFER POINTER
  118.     SHLD    DIALPT
  119.     XRA    A        ;RESET THE CARRIAGE RETURN FLAG
  120.     STA    CRFLAG
  121.     RET
  122. ;
  123. ; Here on an end-dial sequence
  124. ;
  125. ENDIAL:    MVI    M,27H        ;CLOSE INFO-MATE QUOTES
  126.     INX    H
  127.     MVI    M,CR        ;STUFF END-OF-LINE INTO BUFFER
  128.     INX    H        ;FOLLOWED BY TERMINATOR
  129.     MVI    M,0
  130.     LXI    H,IMDIAL    ;POINT TO DIALING STRING
  131.     CALL    IMSEND        ;SEND IT
  132. ;
  133. ; THE FOLLOWING LOOP WAITS FOR A RESULT FROM THE MODEM (UP TO
  134. ; 60 SECONDS: YOU MAY CHANGE THIS VALUE IN THE FOLLOWING LINE).
  135. ; NOTE THAT THE SMARTMODEM HAS AN INTERNAL 30 SECOND TIMEOUT WHILE
  136. ; FOR A CARRIER ON THE OTHER END.  YOU CAN CHANGE BY PLAYING WITH THE
  137. ; S7 VARIABLE (I.E. SEND THE SMARTMODEM "AT S7=20" TO LOWER THE 30 SECOND
  138. ; WAIT TO 20 SECONDS).
  139. ;
  140. RESULT:    MVI    C,30        ;<<== MAXIMUM TIME TO WAIT FOR RESULT
  141. SMWLP:    PUSH    B
  142.     MVI    B,1        ;CHECK FOR A CHAR, UP TO 1 SEC WAIT
  143.     MVI    C,TMDINP    ;DO TIMED INPUT
  144.     CALL    MEX
  145.     POP    B
  146.     JNC    IMTEST        ;JUMP IF MODEM HAD A CHAR
  147.     PUSH    B        ;NO, TEST FOR CONTROL-C FROM CONSOLE
  148.     MVI    C,CHEKCC
  149.     CALL    MEX
  150.     POP    B
  151.     JNZ    IMNEXT        ;IF NOT, JUMP
  152.     CALL    GOODBY        ;YES, SHUT DOWN THE MODEM
  153.     MVI    A,3        ;RETURN ABORT CODE
  154.     RET
  155. IMNEXT:    DCR    C        ;NO
  156.     JNZ    SMWLP        ;CONTINUE
  157. ;
  158. ; ONE MINUTE WITH NO MODEM RESPONSE (OR NO CONNECTION)
  159. ;
  160. SMTIMO:    MVI    A,2        ;RETURN TIMEOUT CODE
  161.     RET
  162. ;
  163. ; MODEM GAVE US A RESULT, CHECK IT
  164. ;
  165. IMTEST:    ANI    7FH        ;IGNORE ANY PARITY
  166.     CALL    IMANAL        ;TEST THE RESULT
  167.     JC    RESULT        ;GO TRY AGAIN IF UNKNOWN RESPONSE
  168.     MOV    A,B        ;A=RESULT 
  169.     PUSH    PSW        ;SAVE IT
  170. IMTLP:    MVI    C,INMDM        ;EAT ANY ADDITIONAL CHARS FROM SMARTMODEM
  171.     CALL    MEX
  172.     JNC    IMTLP        ;UNTIL 100MS OF QUIET TIME
  173.     POP    PSW        ;RETURN THE CODE
  174.     ORA    A        ;CONNECT????
  175.     RZ
  176.     PUSH    PSW
  177.     CALL    GOODBY        ;HANGUP THE PHONE IF NOT GOOD CONNECT...
  178.     POP    PSW        ;SAVE RESULT CODE...
  179.     RET
  180. ;
  181. ; WE MUST IGNORE THE FIRST STATUS MESSAGE SENT BY THE MODEM, SO SKIP ALL
  182. ; CHARACTERS RECIEVED UNTIL WE SEE THE CARRAIGE RETURN THAT TERMINATES IT
  183. ;
  184. IMANAL:    MOV    B,A        ;STORE THE CHARACTER
  185.     CPI    CR        ;TEST FOR CR
  186.     JNZ    IMCONT
  187.     MVI    A,1        ;SET CARRAIGE RETURN FLAG
  188.     STA    CRFLAG
  189. IMCONT:    LDA    CRFLAG        ;CHECK THE FLAG. IF NOT SET YET,
  190.     ORA    A        ; TREAT ONLY CALL PROGRESS TONES
  191.     MOV    A,B        ;RESTORE CHARACTER
  192.     JZ    IMARET
  193. ;
  194.     MVI    B,0        ;PREP CONNECT CODE
  195.     CPI    'A'        ;"CONNECT"?
  196.     RZ
  197.     INR    B        ;PREP BUSY CODE B=1
  198. ;
  199.     IF IM212A
  200.     CPI    'B'        ;BUSY NOT SUPPORTED BY 199SA
  201.     RZ
  202.     ENDIF
  203. ;
  204.     INR    B        ;PREP NO CONNECT MSG B=2
  205.     CPI    'N'        ;N=NO CONNECT
  206.     RZ
  207.     MVI    B,4        ;PREP MODEM ERROR
  208.     CPI    '?'        ;E=ERROR
  209.     RZ
  210. ;
  211. ; THE FOLLOWING ARE CODES THAT THE INFO-MATE CAN DETECT BUT MEX DOES
  212. ; NOT SUPPORT AN APPROPIATE RESULT CODE... ALL OF THE FOLLOWING INDICATE
  213. ; AN ABORT SITUATION - SO - I AM USING THE CONTROL C ABORT RESULT CODE
  214. ; AFTER SENDING A MESSAGE TO THE CONSOLE.
  215. ;
  216.     CPI    'W'        ;WRONG SPEED.
  217.     JZ    WRSP
  218.     CPI    'X'        ;NO DIAL TONE DETECTED..
  219.     JZ    NODT
  220. ;
  221. ; THE FOLLOWING ARE CALL PROGRESS STATUS MESSAGES THAT CAN BE IMBEDDED
  222. ; IN THE NUMBER STRING ECHOED BACK BY THE MODEM. SINCE MEX DOES NOT SUPPORT
  223. ; THEM, WE WILL SEND A MESSAGE TO THE CONSOLE AND RETURN AS AN UNKNOWN
  224. ; RESPONSE. NOTE THAT THE 199SA DOES NOT SUPPORT THESE.
  225. ;
  226. IMARET:    IF IM212A
  227.     CPI    'R'        ;RING-BACK TONE DETECTED
  228.     JZ    RING
  229.     CPI    'V'        ;HUMAN VOICE DETECTED..
  230.     JZ    VOICE
  231.     ENDIF
  232. ;
  233. ; UNKNOWN RESPONSE, RETURN CARRY TO CALLER.
  234. ;
  235.     STC
  236.     RET
  237. ;
  238. ; INFO-MATE UTILITY ROUTINE: SEND STRING TO MODEM
  239. ;
  240. IMSEND:    MVI    C,SNDRDY    ;WAIT FOR MODEM READY
  241.     CALL    MEX
  242.     JNZ    IMSEND
  243.     MOV    A,M        ;FETCH NEXT CHARACTER
  244.     INX    H
  245.     ORA    A        ;END?
  246.     RZ            ;DONE IF SO
  247.     MOV    B,A        ;NO, POSITION FOR SENDING
  248.     MVI    C,SNDCHR    ;NOPE, SEND THE CHARACTER
  249.     CALL    MEX
  250.     JMP    IMSEND
  251. ;
  252. ; MESSAGE ROUTINES FOR STATUS' THAT ARE'NT HANDLED BY MEX
  253. ;
  254. WRSP:    CALL    ILPRT
  255.     DB    '<W>',0        ;WRONG SPEED
  256.     MVI    B,3        ;ABORT CODE
  257.     RET
  258. ;
  259. NODT:    CALL    ILPRT
  260.     DB    '<X>',0        ;NO DIAL TONE
  261.     MVI    B,3        ;ABORT CODE
  262.     RET
  263. ;
  264.     IF IM212A
  265. ;
  266. RING:    CALL    ILPRT
  267.     DB    '<R>',0
  268.     STC
  269.     RET
  270. ;
  271. VOICE:    CALL    ILPRT
  272.     DB    '<V>',0
  273.     STC
  274.     RET
  275. ;
  276.     ENDIF
  277. ;
  278. ; PRINT IN-LINE MESSAGE
  279. ;
  280. ILPRT:    MVI    C,ILP
  281.     JMP    MEX
  282. ;
  283. ; DATA AREA
  284. ;
  285. IMDIAL:    DB    'N'-40H,'U 1,'    ;SET MODEM TO QUIET
  286.     DB    'D ',27H,'T'    ; AND DIAL # (DEFAULT TOUCH TONE)
  287. ;
  288.     IF NOT IM212A
  289.     DB    'B'        ;199SA REQUIRES A 'B'
  290.     ENDIF
  291. ;
  292. DIALBF:    DS    52        ;2* 24 CHAR MAX, + CR + NULL + SLOP
  293. DIALPT:    DS    2        ;DIAL POSITION POINTER
  294. CRFLAG:    DB    0        ;CARRIAGE RETURN FLAG
  295. ;
  296.     END
  297.