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 / MXM-NE10.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  12KB  |  345 lines

  1.  TITLE    'MEX NEC N212BR-L1 MODEM OVERLAY V1.0'
  2. ;
  3. ; (DELETE ABOVE TITLE LINE IF ASSEMBLING WITH ASM)
  4. ;
  5. ; Original File: MXO-SM14.ASM
  6. ;
  7. ; Smartmodem overlay for MEX: revision 1.3
  8. ; Written 04/16/84 by Ronald G. Fowler (V1.0)
  9. ;
  10. ; 19/09/86: Altered for the NEC N212BR-L1 modem command set. This uses the
  11. ;        NEC modem DIAL MODE 'K' command for KEYBOARD DIAL, sending
  12. ;        two CRs with a two second wait between them to wake up the modem, 
  13. ;        another two second wait, the 'K', wait two more seconds, then 
  14. ;        the phone number.
  15. ;        Also removed the NUMRES equate and the associated code as it's
  16. ;        not used in this overlay.
  17. ;        The NEC modem returns a whole scentence from the dialing
  18. ;        sequence. For instance, if you tell it to dial: 1-234-567-8901
  19. ;        the NEC modem would return:
  20. ;
  21. ;        DIALING 1-234-567-8901.............(message)
  22. ;
  23. ;        Where the message could be *ON LINE*, BUSY, RINGING, or ABORTED.
  24. ;        So we have to search that string for valid characters. The on line
  25. ;        is easy; look for a '*'. Busy look for a 'U', so the 'B' of
  26. ;        'ABORTED' doesn't trigger it, 'R' for ringing, and 'O' for 
  27. ;        'ABORTED' so the 'A' in DIALING doesn't set that one off. We'll
  28. ;        never see the 'O' in the on line message as the '*' grabs it first.
  29. ;        This is kind of a kludge, but it works.
  30. ;        This overlay assumes you are dropping DTR to disconnect. See the
  31. ;        note at the DISC code if you plan to disconnect from here.
  32. ;        (David Chapman)
  33. ;
  34. ; 09/05/84: Added option to check DCD to determine if a connection has
  35. ;           been made. THIS IS MACHINE SPECIFIC. Also, Switch 6 on the
  36. ;           Smartmodem should be UP. (David Jewett)
  37. ;
  38. ; 07/16/84: Added equate NUMRES to enable/disable numeric result code 
  39. ;        interpretation.  Under TurboDos, the first digit of the 
  40. ;        phone number was being interpreted as a result code as it 
  41. ;        was echoed by the Anchor modem as it dialed.  Set NUMRES false
  42. ;        to disable numeric results. (Bob Puckett)
  43. ;
  44. ; 06/06/84: Fixed problem for Anchor users, where, when the modem returned
  45. ;        "DIAL TONE", the "N" in "TONE" was being regarded as a NO-CONNECT
  46. ;        code.  Now we flush the entire result line before reading another.
  47. ;        Also added code for numeric version of "CONNECT 1200".  --RGF
  48. ;
  49. ; Small bug repaired: (V1.1) 05/14/84 (Steve Grandi): Smartmodem was not being 
  50. ;    flushed after a dial string so that last digit of the phone number 
  51. ;    was being interpreted as a numeric result code causing the program, 
  52. ;    for certain numbers, to give up even as the modem merrily dialed away.
  53. ;
  54. ; This modules adapts MEX for the NEC N212BR-L1 modem. It is quite
  55. ; machine specific. I don't know of any other modem that uses
  56. ; this scheme. The main function of this module is to provide 
  57. ; dialing capability; the disconnect vector is ancillary.
  58. ; You may use this module as a model to develop dialing routines
  59. ; for non-standard modems (e.g., the Racal-Vadic).  The only
  60. ; pertinent entry point is the DIAL routine; you'll find entry
  61. ; specs for that below.
  62. ;
  63. ; The only conditional you might want to change in this
  64. ; module is the DISC equate below -- if left on, MEX will
  65. ; use the Smartmodem's disconnect code.  If you prefer to
  66. ; provide your own in your overlay's DISCV vector (e.g.,
  67. ; by dropping DTR), then set DISC to FALSE and re-assemble.
  68. ; (If you don't understand this, then play it safe, and
  69. ; leave the equate set as it is). (Set FALSE here - dlc)
  70. ;
  71. ; This overlay will work with any modem overlay that terminates
  72. ; prior to 0B00H
  73. ;
  74. FALSE    EQU    0
  75. TRUE    EQU    NOT FALSE
  76. ;
  77. ;
  78. DCD    EQU    FALSE        ; TRUE = CHECK DCD FOR CARRIER
  79.     IF    DCD        ; if using DCD, we must know the following:
  80. STPORT    EQU    0EDH        ; ... Status Port assignment to get DCD
  81. DCDBIT    EQU    0100$0000b    ; ... Bit HIGH to test for DCD
  82.     ENDIF    ; DCD
  83. ;
  84. DISC    EQU    FALSE        ;<<== CHANGE TO FALSE IF YOU DISC. WITH DTR
  85. ;
  86. ; SYSTEM CONSTANTS
  87. ;
  88. TPULSE    EQU    0105H        ;TONE/PULSE FLAG IN MODEM OVERLAY
  89. DIALV    EQU    0162H        ;LOCATION OF DIAL VECTOR IN OVERLAY
  90. DISCV    EQU    0165H        ;LOCATION OF DISCONNECT VECTOR IN OVERLAY
  91. DIALOC    EQU    0B00H        ;DIALING CODE GOES HERE
  92. MEX    EQU    0D00H        ;"CALL MEX"
  93. ;
  94. ; FOLLOWING ARE FUNCTION CODES FOR THE MEX SERVICE CALL PROCESSOR
  95. ;
  96. INMDM    EQU    255        ;RETURN CHAR FROM MDM IN A, CY=NO CHR IN 100MS
  97. TIMER    EQU    254
  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. ILP    EQU    240        ;INLINE PRINT
  105. ;
  106. CR    EQU    13
  107. LF    EQU    10
  108. ;
  109. ;
  110. ;
  111.     ORG    DIALV        ;OVERLAY THE DIALING VECTOR
  112.     JMP    DIAL
  113. ;    
  114.     IF    DISC        ;IF PROVIDING DISCONNECT CODE
  115.     ORG    DISCV        ;OVERLAY THE VECTOR
  116.     JMP    DISCON
  117.     ENDIF
  118. ;
  119. ; This is the DIAL routine called by MEX to dial a digit. The digit
  120. ; to be dialed is passed in the A register.  Note that two special
  121. ; codes must be intercepted as non-digits: 254 (start dial sequence)
  122. ; and 255 (end-dial sequence).  Mex will always call DIAL with 254
  123. ; in the accumulator prior to dialing a number.  Mex will also call
  124. ; dial with 255 in A as an indication that dialing is complete. Thus,
  125. ; the overlay may use these values to "block" the number, holding it
  126. ; in a buffer until it is completely assembled (in fact, that's the
  127. ; scheme employed here for the Smartmodem).
  128. ;
  129. ; After the 254-start-dial sequence, MEX will call the overlay with
  130. ; digits, one-at-a-time.  MEX will make no assumptions about the dig-
  131. ; its, and will send each to the DIAL routine un-inspected (some modems,
  132. ; like the Smartmodem, allow special non-numeric characters in the
  133. ; phone number, and MEX may make no assumptions about these).
  134. ;
  135. ; After receiving the end-dial sequence (255) the overlay must take
  136. ; whatever end-of-dial actions are necessary *including* waiting for
  137. ; carrier at the distant end.  The overlay should monitor the keyboard
  138. ; during this wait (using the MEX keystat service call), and return
  139. ; an exit code to MEX in the A register, as follows:
  140. ;
  141. ;    0 - Carrier detected, connection established
  142. ;    1 - Far end busy (only for modems that can detect this condition)
  143. ;    2 - No answer (or timed out waiting for modem response)
  144. ;    3 - Keyboard abort (^C only: all others should be ignored)
  145. ;    4 - Error reported by modem
  146. ;
  147. ; <No other codes should be returned after an end-dial sequence>
  148. ;
  149. ; The overlay should not loop forever in the carrier-wait routine, but
  150. ; instead use either the overlay timer vector, or the INMDMV (timed 100
  151. ; ms character wait) service call routine.
  152. ;
  153. ; The DIAL routine is free to use any of the registers, but must return
  154. ; the above code after an end-dial sequence
  155. ;
  156.     ORG    DIALOC
  157. ;
  158. DIAL:    LHLD    DIALPT        ;FETCH POINTER
  159.     CPI    254        ;START DIAL?
  160.     JZ    STDIAL        ;JUMP IF SO
  161.     CPI    255        ;END DIAL?
  162.     JZ    ENDIAL        ;JUMP IF SO
  163. ;
  164. ; Not start or end sequence, must be a digit to be sent to the modem
  165. ;
  166.     MOV    M,A        ;PUT CHAR IN BUFFER
  167.     INX    H        ;ADVANCE POINTER
  168.     SHLD    DIALPT        ;STUFF PNTR
  169.     RET            ;ALL DONE
  170. ;
  171. ; Here on a start-dial sequence
  172. ;
  173. STDIAL:    LXI    H,DIALBF    ;SET UP BUFFER POINTER
  174.     SHLD    DIALPT
  175.     RET
  176. ;
  177. ; Here on an end-dial sequence
  178. ;
  179. ENDIAL:    MVI    M,CR        ;STUFF END-OF-LINE INTO BUFFER
  180.     INX    H        ;FOLLOWED BY TERMINATOR
  181.     MVI    M,0
  182.     MVI    B,CR        ; Send a couple of CRs to put the
  183.     MVI    C,SNDCHR    ;   modem in the interactive mode.
  184.     CALL    MEX        ;   If it's already there thats ok too.
  185.     MVI    B,20        ; Two second wait
  186.     MVI    C,TIMER
  187.     CALL    MEX
  188.     MVI    B,CR        ; There goes the second one
  189.     MVI    C,SNDCHR
  190.     CALL    MEX
  191.     MVI    B,20        ; And another 2 seconds
  192.     MVI    C,TIMER
  193.     CALL    MEX
  194.     MVI    B,'K'        ; Keyboard dial in NEC modem
  195.     MVI    C,SNDCHR
  196.     CALL    MEX
  197.     MVI    B,20        ; Wait a couple of seconds
  198.     MVI    C,TIMER
  199.     CALL    MEX
  200.     LXI    H,DIALBF    ;POINT TO DIALING STRING
  201.     CALL    SMSEND        ;SEND IT
  202. WAITSM:    MVI    C,INMDM    
  203.     CALL    MEX        ;CATCH ANY OUTPUT FROM THE MODEM
  204.     JNC    WAITSM        ;LOOP UNTIL NO MORE CHARACTERS
  205. ;
  206. ; THE FOLLOWING LOOP WAITS FOR A RESULT FROM THE MODEM (UP TO
  207. ; 60 SECONDS: YOU MAY CHANGE THIS VALUE IN THE FOLLOWING LINE).
  208. ; NOTE THAT THE SMARTMODEM HAS AN INTERNAL 30 SECOND TIMEOUT WHILE
  209. ; FOR A CARRIER ON THE OTHER END.  YOU CAN CHANGE BY PLAYING WITH THE
  210. ; S7 VARIABLE (I.E. SEND THE SMARTMODEM "AT S7=20" TO LOWER THE 30 SECOND
  211. ; WAIT TO 20 SECONDS).
  212. ;
  213. RESULT:    MVI    C,60        ;<<== MAXIMUM TIME TO WAIT FOR RESULT
  214. SMWLP:    PUSH    B
  215.     MVI    B,1        ;CHECK FOR A CHAR, UP TO 1 SEC WAIT
  216.     MVI    C,TMDINP    ;DO TIMED INPUT
  217.     CALL    MEX
  218.     POP    B
  219.     CPI    '*'        ; parse the returned string for
  220.     JZ    SMTEST        ;  valid characters
  221.     CPI    'O'        ; if an abort
  222.     JZ    SMTEST
  223.     CPI    'U'        ; if it's busy
  224.     JZ    SMTEST
  225.     CPI    'R'        ; if it's ringing
  226.     CZ    RING
  227. ;
  228.     IF    DCD        ;if DCD is available, take a look at it
  229.     IN    STPORT        ;   get the status byte
  230.     ANI    DCDBIT        ;   and test the DCD flag
  231.     XRI    DCDBIT        ;   return with A=0 if found,
  232.     RZ            ;but otherwise ...
  233.     ENDIF    ;DCD
  234. ;
  235.     PUSH    B        ; TEST FOR CONTROL-C FROM CONSOLE
  236.     MVI    C,CHEKCC
  237.     CALL    MEX
  238.     POP    B
  239.     JNZ    SMNEXT        ;IF NOT, JUMP
  240.     MVI    B,' '        ;YES, SHUT DOWN THE MODEM
  241.     MVI    C,SNDCHR    ;  NEC uses a space to abort dialing
  242.     CALL    MEX
  243.     MVI    A,3        ;RETURN ABORT CODE
  244.     RET
  245. SMNEXT:    DCR    C        ;NO
  246.     JNZ    SMWLP        ;CONTINUE
  247. ;
  248. ; ONE MINUTE WITH NO MODEM RESPONSE (OR NO CONNECTION)
  249. ;
  250. SMTIMO:    MVI    A,2        ;RETURN TIMEOUT CODE
  251.     RET
  252. ;
  253. ; MODEM GAVE US A RESULT, CHECK IT
  254. ;
  255. SMTEST:    ANI    7FH        ;IGNORE ANY PARITY
  256.     CALL    SMANAL        ;TEST THE RESULT
  257.     MOV    A,B        ;A=RESULT (CY SIGNIFICANT HERE TOO)
  258.     PUSH    PSW        ;SAVE IT
  259. SMTLP:    MVI    C,INMDM        ;FLUSH ANY REMAINING COMMAND LINE
  260.     CALL    MEX
  261.     JC    SMCHEK        ;JUMP IF NO INPUT
  262.     CPI    LF        ;GOT SOME ... WAITING FOR EOL
  263.     JNZ    SMTLP        ;EAT ANY IN-BETWEEN
  264. SMCHEK:    POP    PSW        ;A HAS MEX RETURN-CODE, CY=1 IF UNKNOWN
  265.     JC    RESULT        ;IF RESULT UNKNOWN, IGNORE IT
  266.     RET
  267. ;
  268. SMANAL:    MVI    B,0        ;PREP CONNECT CODE
  269.     CPI    '*'        ;"CONNECT"? (NEC "*ON LINE*")
  270.     RZ
  271.  
  272.     INR    B        ;PREP BUSY CODE B=1
  273.     CPI    'U'
  274.     RZ
  275.  
  276.     INR    B        ;PREP NO CONNECT MSG B=2
  277.     CPI    'O'        ;N=NO CONNECT (NEC "AB'O'RT")
  278.     RZ
  279.  
  280.     MVI    B,4        ;PREP MODEM ERROR
  281.     CPI    'O'        ;E=ERROR (NEC "AB'O'RT")
  282.     RZ
  283.  
  284.     STC            ;UNKNOWN...
  285.     RET
  286. ;
  287. RING:    PUSH    B        ; is that the phone ?
  288.     MVI    C,ILP
  289.     CALL    MEX
  290.     DB    'Ringing... ',0
  291.     POP    B
  292.     RET            ; go back & find if successful
  293. ;
  294. ; FOLLOWING ROUTINE DISCONNECTS THE MODEM USING SMARTMODEM
  295. ; CODES. ALL REGISTERS ARE AVAILABLE FOR THIS FUNCTION.
  296. ; NOTHING RETURNED TO CALLER.
  297. ; This is not used in this implementation. However, if you do
  298. ; not use DTR to disconnect and you want to use this routine
  299. ; set the disconnect code in the NEC modem to this string (+++ath)
  300. ; or to whatever other string you desire. Be sure to change the
  301. ; string here to match the one you set in the modem.
  302. ;
  303.     IF    DISC
  304. ;
  305. DISCON:    MVI    B,20
  306.     MVI    C,TIMER        ;WAIT 2 SECONDS
  307.     CALL    MEX
  308.     LXI    H,SMATN        ;SEND '+++'
  309.     CALL    SMSEND
  310.     MVI    B,20        ;WAIT 2 MORE SECONDS
  311.     MVI    C,TIMER
  312.     CALL    MEX
  313.     LXI    H,SMDISC    ;SEND 'ATH'
  314.     CALL    SMSEND
  315.     MVI    B,1        ;WAIT 1 SECOND
  316.     MVI    C,TIMER
  317.     CALL    MEX
  318.     RET
  319. ;
  320. SMATN:    DB    '+++',0
  321. SMDISC:    DB    'ATH',CR,0
  322. ;
  323.     ENDIF
  324. ;
  325. ; SMARTMODEM UTILITY ROUTINE: SEND STRING TO MODEM
  326. ;
  327. SMSEND:    MVI    C,SNDRDY    ;WAIT FOR MODEM READY
  328.     CALL    MEX
  329.     JNZ    SMSEND
  330.     MOV    A,M        ;FETCH NEXT CHARACTER
  331.     INX    H
  332.     ORA    A        ;END?
  333.     RZ            ;DONE IF SO
  334.     MOV    B,A        ;NO, POSITION FOR SENDING
  335.     MVI    C,SNDCHR    ;NOPE, SEND THE CHARACTER
  336.     CALL    MEX
  337.     JMP    SMSEND
  338. ;
  339. ; DATA AREA
  340. ;
  341. DIALBF:    DS    52        ;2 * 24 CHAR MAX, + CR + NULL + SLOP
  342. DIALPT:    DS    2        ;DIAL POSITION POINTER
  343. ;
  344.     END
  345.