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-VTL1.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  9KB  |  280 lines

  1. ;             ====== MEX OVERLAY FOR VENTEL-MDM212 PLUS MODEM =====
  2. ;          ==========   with OTRONA ATTACHE COMPUTER   =========
  3. ;              [ MXO-VTL1.ASM    Version 1.0    ..by PHIL OYER ]
  4. ;
  5. ;  This overlay is hardware-specific for Z80SIO and OTRONA ATTACHE computer.
  6. ;
  7. ;  ****  Adapted from Smartmodem overlay for MEX: revision 1.2 which was ****
  8. ;         *****  written 04/16/84 by Ronald G. Fowler (V1.0) *****
  9. ;
  10. ; 08/23/84: Revised ENDIAL:  SMANAL: and DISCON: routines to autodial the 
  11. ;        Ventel MDM212 Plus intelligent modem. Also changed the DB's for
  12. ;        SMATN:  SMDISC: and SMDIAL: to correspond to the Ventel modem
  13. ;        instruction codes. The DISC equate was left TRUE and the Ventel
  14. ;        disconnect routine was simply inserted as a new DISCON: routine 
  15. ;         even though the routine as written disconnects by dropping DTR 
  16. ;        momentarily. The code sent by DISCON to the SIO to cause DTR drop 
  17. ;        (7AH out port 0F1h) and DTR restore (0EAh out port 0F1H) are 
  18. ;        specific for the Z80SIO and the OTRONA ATTACHE. Change to other
  19. ;        systems should be simple...just insert your own status port into
  20. ;        MODCTL1: equate in this overlay. If you have a Z80SIO, that 
  21. ;        should be all...otherwise you'll have to tell your own SIO device
  22. ;        how to drop DTR and restore it in the DISCON: routine....[PEO]
  23. ;
  24. ; Small bug repaired: (V1.1) 05/14/84 (Steve Grandi): Smartmodem was not being 
  25. ;    flushed after a dial string so that last digit of the phone number 
  26. ;    was being interpreted as a numeric result code causing the program, 
  27. ;    for certain numbers, to give up even as the modem merrily dialed away.
  28. ;
  29. ; This module adapts MEX for the DC Hayes Smartmodem (as well
  30. ; as many others -- including US Robotics -- that use a similar
  31. ; command language). The main function of this module is to pro-
  32. ; vide dialing capability; the disconnect vector is ancillary.
  33. ; You may use this module as a model to develop dialing routines
  34. ; for non-standard modems (e.g., the Racal-Vadic).  The only
  35. ; pertinent entry point is the DIAL routine; you'll find entry
  36. ; specs for that below.
  37. ;
  38. ; The only conditional you might want to change in this
  39. ; module is the DISC equate below -- if left on, MEX will
  40. ; use the Smartmodem's disconnect code.  If you prefer to
  41. ; provide your own in your overlay's DISCV vector (e.g.,
  42. ; by dropping DTR), then set DISC to FALSE and re-assemble.
  43. ; (If you don't understand this, then play it safe, and
  44. ; leave the equate set as it is).
  45. ;
  46. ; This overlay will work with any modem overlay that terminates
  47. ; prior to 0B00H
  48. ;
  49. FALSE    EQU    0
  50. TRUE    EQU    NOT FALSE
  51. ;
  52. ;
  53. DISC    EQU    TRUE        ;<<== CHANGE TO FALSE IF YOU DISC. WITH DTR
  54. ;
  55. ; SYSTEM CONSTANTS
  56. ;
  57. TPULSE    EQU    0105H        ;TONE/PULSE FLAG IN MODEM OVERLAY
  58. DIALV    EQU    0162H        ;LOCATION OF DIAL VECTOR IN OVERLAY
  59. DISCV    EQU    0165H        ;LOCATION OF DISCONNECT VECTOR IN OVERLAY
  60. DIALOC    EQU    0B00H        ;DIALING CODE GOES HERE
  61. MEX    EQU    0D00H        ;"CALL MEX"
  62. ;
  63. ; FOLLOWING ARE FUNCTION CODES FOR THE MEX SERVICE CALL PROCESSOR
  64. ;
  65. INMDM    EQU    255        ;RETURN CHAR FROM MDM IN A, CY=NO CHR IN 100MS
  66. TIMER    EQU    254
  67. TMDINP    EQU    253        ;B=# SECS TO WAIT FOR CHAR, CY=NO CHAR
  68. CHEKCC    EQU    252        ;CHECK FOR ^C FROM KBD, Z=PRESENT
  69. SNDRDY    EQU    251        ;TEST FOR MODEM-SEND READY
  70. RCVRDY    EQU    250        ;TEST FOR MODEM-RECEIVE READY
  71. SNDCHR    EQU    249        ;SEND A CHARACTER TO THE MODEM (AFTER SNDRDY)
  72. RCVCHR    EQU    248        ;RECV A CHAR FROM MODEM (AFTER RCVRDY)
  73. ;
  74. CR    EQU    13
  75. LF    EQU    10
  76. ;
  77. MODCTL1:EQU    0F1H        ;INSERT YOUR MODEM STATUS PORT HERE
  78. ;
  79.     ORG    DIALV        ;OVERLAY THE DIALING VECTOR
  80.     JMP    DIAL
  81. ;    
  82.     IF    DISC        ;IF PROVIDING DISCONNECT CODE
  83.     ORG    DISCV        ;OVERLAY THE VECTOR
  84.     JMP    DISCON
  85.     ENDIF
  86. ;
  87. ; This is the DIAL routine called by MEX to dial a digit. The digit
  88. ; to be dialed is passed in the A register.  Note that two special
  89. ; codes must be intercepted as non-digits: 254 (start dial sequence)
  90. ; and 255 (end-dial sequence).  Mex will always call DIAL with 254
  91. ; in the accumulator prior to dialing a number.  Mex will also call
  92. ; dial with 255 in A as an indication that dialing is complete. Thus,
  93. ; the overlay may use these values to "block" the number, holding it
  94. ; in a buffer until it is completely assembled (in fact, that's the
  95. ; scheme employed here for the Smartmodem).
  96. ;
  97. ; After the 254-start-dial sequence, MEX will call the overlay with
  98. ; digits, one-at-a-time.  MEX will make no assumptions about the dig-
  99. ; its, and will send each to the DIAL routine un-inspected (some modems,
  100. ; like the Smartmodem, allow special non-numeric characters in the
  101. ; phone number, and MEX may make no assumptions about these).
  102. ;
  103. ; After receiving the end-dial sequence (255) the overlay must take
  104. ; whatever end-of-dial actions are necessary *including* waiting for
  105. ; carrier at the distant end.  The overlay should monitor the keyboard
  106. ; during this wait (using the MEX keystat service call), and return
  107. ; an exit code to MEX in the A register, as follows:
  108. ;
  109. ;    0 - Carrier detected, connection established
  110. ;    1 - Far end busy (only for modems that can detect this condition)
  111. ;    2 - No answer (or timed out waiting for modem response)
  112. ;    3 - Keyboard abort (^C only: all others should be ignored)
  113. ;    4 - Error reported by modem
  114. ;
  115. ; <No other codes should be returned after an end-dial sequence>
  116. ;
  117. ; The overlay should not loop forever in the carrier-wait routine, but
  118. ; instead use either the overlay timer vector, or the INMDMV (timed 100
  119. ; ms character wait) service call routine.
  120. ;
  121. ; The DIAL routine is free to use any of the registers, but must return
  122. ; the above code after an end-dial sequence
  123. ;
  124.     ORG    DIALOC
  125. ;
  126. DIAL:    LHLD    DIALPT        ;FETCH POINTER
  127.     CPI    254        ;START DIAL?
  128.     JZ    STDIAL        ;JUMP IF SO
  129.     CPI    255        ;END DIAL?
  130.     JZ    ENDIAL        ;JUMP IF SO
  131. ;
  132. ; Not start or end sequence, must be a digit to be sent to the modem
  133. ;
  134.     MOV    M,A        ;PUT CHAR IN BUFFER
  135.     INX    H        ;ADVANCE POINTER
  136.     SHLD    DIALPT        ;STUFF PNTR
  137.     RET            ;ALL DONE
  138. ;
  139. ; Here on a start-dial sequence
  140. ;
  141. STDIAL:    LXI    H,DIALBF    ;SET UP BUFFER POINTER
  142.     SHLD    DIALPT
  143.     RET
  144. ;
  145. ; Here on an end-dial sequence
  146. ;
  147. ENDIAL: MVI    M,CR        ;PUT <CR> INTO DIAL BUFFER
  148.     INX      H        
  149.     MVI    M,'>'        ;PUT '>' (VENTEL BATCH DELIM) INTO DIAL BUFFER
  150.     INX    H
  151.     MVI     M,0        ;TERMINATE DIAL BUFFER
  152.     LXI    H,SMDIAL    ;POINT TO DIALING STRING
  153.     CALL    SMSEND
  154. WAITSM:    MVI    C,INMDM
  155.     CALL    MEX        ;CATCH ANY OUTPUT FROM THE MODEM
  156.     JNC    WAITSM        ;LOOP UNTIL NO MORE CHARACTERS
  157. ;
  158. ; THE FOLLOWING LOOP WAITS FOR A RESULT FROM THE MODEM (UP TO
  159. ; 60 SECONDS: YOU MAY CHANGE THIS VALUE IN THE FOLLOWING LINE).
  160. ; NOTE THAT THE SMARTMODEM HAS AN INTERNAL 30 SECOND TIMEOUT WHILE
  161. ; FOR A CARRIER ON THE OTHER END.  YOU CAN CHANGE BY PLAYING WITH THE
  162. ; S7 VARIABLE (I.E. SEND THE SMARTMODEM "AT S7=20" TO LOWER THE 30 SECOND
  163. ; WAIT TO 20 SECONDS).
  164. ;
  165. RESULT:    MVI    C,60        ;<<== MAXIMUM TIME TO WAIT FOR RESULT
  166. SMWLP:    PUSH    B
  167.     MVI    B,1        ;CHECK FOR A CHAR, UP TO 1 SEC WAIT
  168.     MVI    C,TMDINP    ;DO TIMED INPUT
  169.     CALL    MEX
  170.     POP    B
  171.     JNC    SMTEST        ;JUMP IF MODEM HAD A CHAR
  172.     PUSH    B        ;NO, TEST FOR CONTROL-C FROM CONSOLE
  173.     MVI    C,CHEKCC
  174.     CALL    MEX
  175.     POP    B
  176.     JNZ    SMNEXT        ;IF NOT, JUMP
  177.     MVI    B,CR        ;YES, SHUT DOWN THE MODEM
  178.     MVI    C,SNDCHR
  179.     CALL    MEX
  180.     MVI    A,3        ;RETURN ABORT CODE
  181.     RET
  182. SMNEXT:    DCR    C        ;NO
  183.     JNZ    SMWLP        ;CONTINUE
  184. ;
  185. ; ONE MINUTE WITH NO MODEM RESPONSE (OR NO CONNECTION)
  186. ;
  187. SMTIMO:    MVI    A,2        ;RETURN TIMEOUT CODE
  188.     RET
  189. ;
  190. ; MODEM GAVE US A RESULT, CHECK IT
  191. ;
  192. SMTEST:    ANI    7FH        ;IGNORE ANY PARITY
  193.     CALL    SMANAL        ;TEST THE RESULT
  194.     MOV    A,B        ;A=RESULT (CY SIGNIFICANT HERE TOO)
  195.     PUSH    PSW        ;SAVE IT
  196. SMTLP:    MVI    C,INMDM        ;FLUSH ANY REMAINING COMMAND LINE
  197.     CALL    MEX
  198.     JC    SMCHEK        ;JUMP IF NO INPUT
  199.     CPI    LF        ;GOT SOME ... WAITING FOR EOL
  200.     JNZ    SMTLP        ;EAT ANY IN-BETWEEN
  201. SMCHEK:    POP    PSW        ;A HAS MEX RETURN-CODE, CY=1 IF UNKNOWN
  202.     JC    RESULT        ;IF RESULT UNKNOWN, IGNORE IT
  203.     RET
  204. ;
  205. SMANAL:    MVI    B,0        ;PREP CONNECT CODE
  206.     CPI    'O'        ;O="ONLINE "
  207.     RZ
  208.     INR    B        ;PREP BUSY CODE B=1
  209.     CPI    'B'        ;B="BUSY"
  210.     RZ
  211.     INR    B        ;PREP NO CONNECT MSG B=2
  212.     MVI    B,4        ;PREP MODEM ERROR
  213.     CPI    'N'        ;N="NO ANSWER"
  214.     RZ
  215.     STC            ;UNKNOWN...
  216.     RET
  217. ;
  218. ; FOLLOWING ROUTINE DISCONNECTS THE MODEM USING SMARTMODEM
  219. ; CODES. ALL REGISTERS ARE AVAILABLE FOR THIS FUNCTION.
  220. ; NOTHING RETURNED TO CALLER.
  221. ;
  222.     IF    DISC
  223. ;
  224. DISCON:    MVI    A,5        ;SIO WRITE REG 5 SELECT
  225.     OUT    MODCTL1
  226.     MVI    A,7AH        ;TURN OFF DTR (7AH)
  227.     OUT    MODCTL1
  228.     CALL    DLY        ;SHORT DELAY
  229.     MVI    A,5        ;SIO WRITE REGISTER 5 SELECT
  230.     OUT    MODCTL1
  231.     MVI    A,0EAH        ;TURN DTR BACK ON (0EAH)
  232.     OUT    MODCTL1
  233.     CALL    DLY        ;SHORT DELAY
  234.     LXI    H,SMATN        ;FIRST <CR> TO REINIT VENTEL
  235.     CALL    SMSEND
  236.     CALL     DLY        ;SHORT DELAY BETWEEN <CR>'S
  237.     LXI    H,SMATN        ;SECOND <CR> TO REINIT VENTEL
  238.     CALL     SMSEND
  239.     CALL    DLY
  240.     LXI    H,SMDISC    ;POINT TO QUIT COMMAND
  241.     CALL    SMSEND
  242.     CALL    DLY        ;SHORT DELAY
  243.     LXI    H,SMATN        ;SEND ANOTHER <CR>
  244.     CALL    SMSEND
  245.     CALL     DLY
  246.     LXI    H,SMATN        ;AND AGAIN
  247.     CALL    SMSEND
  248.     RET
  249. DLY:    MVI    B,4    
  250.     MVI    C,TIMER
  251.     CALL     MEX
  252.     RET
  253. ;
  254. SMATN:    DB    CR,0          ;VENTEL CODE
  255. SMDISC:    DB    'Q',0          ;VENTEL QUIT COMMAND
  256. ;
  257.     ENDIF
  258. ;
  259. ; SMARTMODEM UTILITY ROUTINE: SEND STRING TO MODEM
  260. ;
  261. SMSEND:    MVI    C,SNDRDY    ;WAIT FOR MODEM READY
  262.     CALL    MEX
  263.     JNZ    SMSEND
  264.     MOV    A,M        ;FETCH NEXT CHARACTER
  265.     INX    H
  266.     ORA    A        ;END?
  267.     RZ            ;DONE IF SO
  268.     MOV    B,A        ;NO, POSITION FOR SENDING
  269.     MVI    C,SNDCHR    ;NOPE, SEND THE CHARACTER
  270.     CALL    MEX
  271.     JMP    SMSEND
  272. ;
  273. ; DATA AREA
  274. ;
  275. SMDIAL:    DB    '<','K'        ;START VENTEL DIAL COMMAND (BATCH SEND)
  276. DIALBF:    DS    52        ;2* 24 CHAR MAX, + CR + NULL + SLOP
  277. DIALPT:    DS    2        ;DIAL POSITION POINTER
  278. ;
  279.     END
  280.