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

  1.         TITLE   'MEXPLUS overlay for SwitchCom Canadiana 212A modem V 1.3'
  2.  
  3. ; (DELETE ABOVE TITLE LINE IF ASSEMBLING WITH ASM)
  4.  
  5. ; SwitchCom Canadiana 212A overlay for MEXPLUS: revision 1.3 86/12/01
  6.  
  7. ; This module adapts MEX or MEXPLUS for the SwitchCom Canadiana 212A
  8. ; modem.  Made by:  SwitchCom Manufacturing Inc
  9. ;                   100-10 Amber St., Markham, Ontario, Canada
  10. ;                   L3R 3A2                     Tel:  416-475-0296
  11.  
  12. ; This overlay will work with any port overlay that terminates
  13. ; prior to 0B00H and will work with either MEX or MEXPLUS.
  14.  
  15. ; 86/12/26  V1.3 - moved modem initialization code to front of
  16. ;                  dial code and added flag to make sure that
  17. ;                  modem is only initialized once
  18. ;                                                      - Ian Cottrell
  19.  
  20. ; 86/06/01  V1.2 - added 'space bar return busy' code (thanks
  21. ;                  to Al Jewer).  This code allows the user to
  22. ;                  push the space bar if he knows that the
  23. ;                  called number is busy.  If he is dialing
  24. ;                  a series of numbers, MEX will advance to the
  25. ;                  next one.
  26. ;                                                       - Ian Cottrell
  27.  
  28. ; 86/01/18  V1.1 - filter all but numerals from dial routine,
  29. ;                  tightened code, made compatible with MEXPLUS
  30. ;                                                       - Ian Cottrell
  31.  
  32. ; 85/03/06  V1.0 - Written - based on MXO-SM11.ASM
  33. ;                                                       - Ian Cottrell
  34. ;                                                         Sysop
  35. ;                                                         Info Centre BBS
  36. ;                                                         Ottawa, Ont
  37. ;                                                         Canada
  38. ;                                                         613-952-2289
  39.  
  40. FALSE   EQU     0
  41. TRUE    EQU     NOT FALSE
  42.  
  43.  
  44. DISC    EQU     TRUE            ; <<== change to FALSE if you disc. with DTR
  45.                                 ;      always true for MEX 1.2 or greater
  46.  
  47. ; System constants
  48.  
  49. NDISCV  EQU     015FH           ; New smart modem disconnect here
  50. DIALV   EQU     0162H           ; Location of dial vector in port overlay
  51. DISCV   EQU     0165H           ; Location of disconnect vector in port overlay
  52. DIALOC  EQU     0B00H           ; Dialing code goes here
  53. MEX     EQU     0D00H           ; "CALL MEX"
  54. SMTABL: EQU     0D55H           ; Smart modem init, SSET, de-init
  55.  
  56. ; The following are function codes for the MEX Service Processor
  57.  
  58. INMDM   EQU     255             ; Return char from mdm in A, CY=no char in 100ms
  59. TIMER   EQU     254             ; Delay 100ms * reg B
  60. TMDINP  EQU     253             ; B=# secs to wait for char, CY=no char
  61. CHEKCC  EQU     252             ; Check for ^C from kbd, Z=present
  62. SNDRDY  EQU     251             ; Test for modem send ready
  63. RCVRDY  EQU     250             ; Test for modem receive ready
  64. SNDCHR  EQU     249             ; Send a character to the modem (after SNDRDY)
  65. RCVCHR  EQU     248             ; Recv a character from the modem (after RCVRDY)
  66. ILP     EQU     240             ; Inline print
  67. KSTAT   EQU     11              ; Keyboard status
  68. KBDIN   EQU     01              ; Keyboard input
  69.  
  70.  
  71. CR      EQU     13
  72. LF      EQU     10
  73. CTRLQ   EQU     'Q'-40H
  74.  
  75.  
  76.         ORG     100H
  77.  
  78.         DB      0C3H            ; We're an 8080/Z-80 overlay
  79.  
  80.         ORG     DIALV           ; Overlay the dialing vector
  81.  
  82.         JMP     DIAL
  83.  
  84.          IF     DISC            ; If providing disconnect code,
  85.         ORG     NDISCV          ;   overlay the vector
  86.  
  87.         JMP     DISCON
  88.          ENDIF                  ; DISC
  89.  
  90. ; This is the DIAL routine called by MEX to dial a digit. The digit
  91. ; to be dialed is passed in the A register.  Note that two special
  92. ; codes must be intercepted as non-digits: 254 (start dial sequence)
  93. ; and 255 (end-dial sequence).  Mex will always call DIAL with 254
  94. ; in the accumulator prior to dialing a number.  Mex will also call
  95. ; dial with 255 in A as an indication that dialing is complete. Thus,
  96. ; the overlay may use these values to "block" the number, holding it
  97. ; in a buffer until it is completely assembled (that's the scheme
  98. ; employed here ).
  99.  
  100. ; After the 254-start-dial sequence, MEX will call the overlay with
  101. ; digits, one-at-a-time.  MEX will make no assumptions about the digits,
  102. ; and will send each to the DIAL routine un-inspected (some modems,
  103. ; like the Smartmodem, allow special non-numeric characters in the
  104. ; phone number, and MEX may make no assumptions about these.
  105. ; The Canadiana does not allow non-numberic characters, so they are
  106. ; filtered out by the overlay).
  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. ; First, check to see if modem has been initialized.  If not,
  132. ; initialize Canadiana by setting for numeric responses and
  133. ; turning off the echo.
  134.  
  135. DIAL:   PUSH    PSW             ; Save number
  136.         LDA     INITFL          ; Get initialization flag
  137.         ORA     A               ; Test
  138.         JNZ     DIAL1           ; If done, skip init code
  139.         LXI     H,ECHO          ; Else,point to message to set echo
  140.         CALL    SCSEND          ; Send it to modem
  141. ELOOP:  MVI     C,INMDM         ; Wait for response from modem
  142.         CALL    MEX
  143.         JNC     ELOOP           ; Get it all
  144.         LXI     H,VERBOSE       ; Point to message to set verbose
  145.         CALL    SCSEND          ; Send it to modem
  146. VLOOP:  MVI     C,INMDM         ; Wait for response
  147.         CALL    MEX
  148.         JNC     VLOOP
  149.         MVI     A,0FFH          ; Set initialization flag
  150.         STA     INITFL
  151.  
  152. DIAL1:  POP     PSW             ; Restore number
  153.         LHLD    DIALPT          ; Fetch pointer
  154.         CPI     254             ; Start dial?
  155.         JZ      STDIAL          ; Jump if so
  156.         CPI     255             ; End dial?
  157.         JZ      ENDIAL          ; Jump if so
  158.  
  159. ; Not start or end sequence, must be a digit to be sent to the modem
  160.  
  161.         CPI     '0'             ; Only allow numbers
  162.         RC                      ; If not a number, just ignore it
  163.         CPI     '9'+1
  164.         RNC
  165.         MOV     M,A             ; Must be a number, so put it in buffer
  166.         INX     H               ; Advance pointer
  167.         SHLD    DIALPT          ; Stuff pointer
  168.         RET                     ; All done
  169.  
  170. ; Here on a start-dial sequence
  171.  
  172. STDIAL: LXI     H,DIALBF        ; Set up buffer pointer
  173.         SHLD    DIALPT
  174.         RET
  175.  
  176. ; Here on an end-dial sequence
  177.  
  178. ENDIAL: MVI     M,CR            ; Stuff end-of-line into buffer
  179.         INX     H               ;   followed by terminator
  180.         MVI     M,0
  181.         LXI     H,SCDIAL        ; Point to dialing string
  182.         CALL    SCSEND          ; Send it
  183. WAITSC: MVI     C,INMDM
  184.         CALL    MEX             ; Catch any output from the modem
  185.         JNC     WAITSC          ; Loop until no more characters
  186.  
  187. ; The following loop waits for a result from the modem (up to
  188. ; 60 seconds; you may change this value in the following line).
  189. ; Note that the Canadiana has an internal 30 second timeout while
  190. ; waiting for a carrier on the other end.
  191.  
  192. RESULT: MVI     C,60            ; <<== Maximum time to wait for result (in secs)
  193. SCWLP:  PUSH    B
  194.         MVI     B,1             ; Check for a char, up to 1 sec wait
  195.         MVI     C,TMDINP        ; Do timed input
  196.         CALL    MEX
  197.         POP     B
  198.         JNC     SCTEST          ; If modem had a character, jump
  199.         PUSH    B               ; Else, test for character from console
  200.         MVI     C,KSTAT         ; Check for keypress
  201.         CALL    MEX
  202.         ORA     A
  203.         POP     B
  204.         JZ      SCNEXT          ; Jump if no keypress
  205.         PUSH    B               ; Else, get character from keyboard
  206.         MVI     C,KBDIN
  207.         CALL    MEX
  208.         POP     B
  209.         CPI     'C'-40H         ; CTL-C?
  210.         JNZ     SPTST           ; If not, go test for space
  211.         MVI     A,3             ; Else, get abort code
  212. SCOFF:  PUSH    PSW             ; Save it
  213.         MVI     B,CR            ; Shut down the modem
  214.         MVI     C,SNDCHR
  215.         CALL    MEX
  216.         POP     PSW             ; Restore return code
  217.         RET
  218.  
  219. SPTST:  CPI     ' '             ; Space?
  220.         JNZ     SCNEXT          ; If not, round the loop again
  221.         MVI     A,1             ; Else, get busy code
  222.         JP      SCOFF           ; Now go shut down modem
  223.  
  224. SCNEXT: DCR     C               ; Decrement counter
  225.         JNZ     SCWLP           ; Continue if not done
  226.  
  227. ; One minute with no modem response (or no connection)
  228.  
  229. SCTIMO: MVI     A,2             ; Timed out, so return timeout code
  230.         RET
  231.  
  232. ; Modem gave us a result, check it
  233.  
  234. SCTEST: ANI     7FH             ; Ignore any parity
  235.         CALL    SCANAL          ; Test the result
  236.         JC      RESULT          ; Go try again if unknown response
  237.         MOV     A,B             ; A=result
  238.         PUSH    PSW             ; Save it
  239. SCTLP:  MVI     C,INMDM         ; Eat any additional chars from Candaiana
  240.         CALL    MEX
  241.         JNC     SCTLP           ; Until 100ms of quiet time
  242.         POP     PSW             ; Return the code
  243.         RET
  244.  
  245. SCANAL: MVI     B,0             ; Prep connect code
  246.         CPI     '2'             ; 2=connect
  247.         RZ
  248.         INR     B               ; Prep busy cond; B=1
  249.         INR     B               ; Prep no connect msg; B=2
  250.         CPI     '3'             ; 3=no connect (from Canadiana)
  251.         RZ
  252.  
  253. ; Unknown response, return carry to caller.  But first,
  254. ; flush the unknown response line from the modem.
  255.  
  256. WTLF:   CPI     1               ; 'Dialing'?
  257.         STC
  258.         RZ                      ; End if so
  259.         MVI     C,INMDM         ; No - get next char
  260.         CALL    MEX
  261.         JNC     WTLF            ; Unless busy, loop
  262.         RET
  263.  
  264. ; Following routine disconnects the modem using Canadiana
  265. ; codes.  All registers are available for this function.
  266. ; Nothing is returned to caller.
  267.  
  268.         IF      DISC
  269.  
  270. DISCON: MVI     B,20
  271.         MVI     C,TIMER         ; Wait 2 seconds
  272.         CALL    MEX
  273.         LXI     H,SCATN         ; Send 3 Ctrl-Q's
  274.         CALL    SCSEND
  275.         PUSH    B
  276.         MVI     B,5
  277. DISCLP: MVI     C,TMDINP        ; Wait for response from modem
  278.         CALL    MEX
  279.         JNC     DISCLP          ; Wait til all done
  280.         POP     B
  281.         LXI     H,ECHRES        ; Reset echo
  282.         CALL    SCSEND
  283. ECHLP:  MVI     C,INMDM         ; Wait for next response
  284.         CALL    MEX
  285.         JNC     ECHLP
  286.         LXI     H,VERRES        ; Reset verbose
  287.         CALL    SCSEND
  288.         XRA     A        ; Clear the init flag in case
  289.     STA    INITFL          ;  we want to dial again
  290.         RET
  291.  
  292. SCATN:  DB      CTRLQ,CTRLQ,CTRLQ,CR,LF,0       ; Disconnect
  293. ECHRES: DB      'E=1',CR,LF,0                   ; Turn echo back on
  294. VERRES: DB      'V=2',CR,LF,0                   ; Turn verbose back on
  295.         ENDIF
  296.  
  297. ;Canadiana Utility routing:  send string to modem
  298.  
  299. SCSEND: MVI     C,SNDRDY        ; Wait for modem ready
  300.         CALL    MEX
  301.         JNZ     SCSEND
  302.         MOV     A,M             ; Fetch next character
  303.         INX     H
  304.         ORA     A               ; End?
  305.         RZ                      ; Done if so
  306.         MOV     B,A             ; No, position for sending
  307.         MVI     C,SNDCHR        ; Send the character
  308.         CALL    MEX
  309.         JMP     SCSEND
  310.  
  311. ; Data area
  312.  
  313. SCDIAL: DB      'D'
  314. DIALBF: DS      52              ; 2 * 24 char max, + CR + NULL + slop
  315. DIALPT: DS      2               ; Dial position pointer
  316. VERBOSE:DB      'V=1',CR,LF,0   ; Set for numeric responses from modem
  317. ECHO:   DB      'E=0',CR,LF,0   ; Turn echo off
  318. INITFL: DB      0               ; Storage for init flag
  319.                                 ; must be 0 to start
  320.  
  321. NOTIMP: MVI     C,ILP
  322.         CALL    MEX
  323.         DB      CR,LF,'Not Implemented',CR,LF,0
  324. JUSTRT: RET
  325.  
  326.  
  327.  
  328.         ORG     SMTABL          ; Table of smart modem vectors here
  329.  
  330.         DS      2
  331.         DW      NOTIMP          ; SSET command (not implemented)
  332.         DW      JUSTRT          ; Smart modem exit (do nothing)
  333.  
  334.         END
  335.