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-SC10.AQM / MXO-SCAT.ASM
Assembly Source File  |  2000-06-30  |  10KB  |  278 lines

  1. ;
  2. ; (DELETE ABOVE TITLE LINE IF ASSEMBLING WITH ASM)
  3. ;
  4. ; SmartCat overlay for MEX: revision 1.0
  5. ; Written 05/15/84 by Curt Arnold
  6. ; Borrows heavily from 
  7. ; Smartmodem overlay for MEX: revision 1.0
  8. ; Written 04/16/84 by Ronald G. Fowler
  9. ;
  10. ; Last revision: 05/15/84 (CWA)
  11. ;
  12. ; This modules adapts MEX for the Novation SmartCat.
  13. ; The main function of this module is to provide dialing capability;
  14. ; the disconnect vector and break vector are ancillary.
  15. ; You may use this module as a model to develop dialing routines
  16. ; for non-standard modems (e.g., the Racal-Vadic).  The only
  17. ; pertinent entry point is the DIAL routine; you'll find entry
  18. ; specs for that below.
  19. ;
  20. ; There are two equates that you might want to change in this
  21. ; module.  One is the DISC equate below -- if left on, MEX will
  22. ; use the SmartCat's disconnect code.  If you prefer to
  23. ; provide your own in your overlay's DISCV vector (e.g.,
  24. ; by dropping DTR), then set DISC to FALSE and re-assemble.
  25. ; (If you don't understand this, then play it safe, and
  26. ; leave the equate set as it is).  The other is the BREAK equate
  27. ; -- if left on, MEX will use the SmartCat break code.
  28.  
  29. ;
  30. ; This overlay will work with any modem overlay that terminates
  31. ; prior to 0B00H
  32. ;
  33. FALSE   EQU     0
  34. TRUE    EQU     NOT FALSE
  35. CMDCHR  EQU     '%'             ;DEFAULT SMARTCAT COMMAND CHARACTER
  36. ;
  37. ;
  38. DISC    EQU     TRUE            ;<<== CHANGE TO FALSE IF YOU DISC. WITH DTR
  39. BREAK   EQU     TRUE            ;<<== CHANGE TO FALSE IF YOU BREAK WITH DTR
  40. ;
  41. ; SYSTEM CONSTANTS
  42. ;
  43. TPULSE  EQU     0105H           ;TONE/PULSE FLAG IN MODEM OVERLAY
  44. DIALV   EQU     0162H           ;LOCATION OF DIAL VECTOR IN OVERLAY
  45. DISCV   EQU     0165H           ;LOCATION OF DISCONNECT VECTOR IN OVERLAY
  46. BREAKV  EQU     0180H           ;LOCATION OF BREAK VECTOR IN OVERLAY
  47. DIALOC  EQU     0B00H           ;DIALING CODE GOES HERE
  48. MEX     EQU     0D00H           ;"CALL MEX"
  49. ;
  50. ; FOLLOWING ARE FUNCTION CODES FOR THE MEX SERVICE CALL PROCESSOR
  51. ;
  52. INMDM   EQU     255             ;RETURN CHAR FROM MDM IN A, CY=NO CHR IN 100MS
  53. TIMER   EQU     254
  54. TMDINP  EQU     253             ;B=# SECS TO WAIT FOR CHAR, CY=NO CHAR
  55. CHEKCC  EQU     252             ;CHECK FOR ^C FROM KBD, Z=PRESENT
  56. SNDRDY  EQU     251             ;TEST FOR MODEM-SEND READY
  57. RCVRDY  EQU     250             ;TEST FOR MODEM-RECEIVE READY
  58. SNDCHR  EQU     249             ;SEND A CHARACTER TO THE MODEM (AFTER SNDRDY)
  59. RCVCHR  EQU     248             ;RECV A CHAR FROM MODEM (AFTER RCVRDY)
  60. ;
  61. CR      EQU     13
  62. LF      EQU     10
  63. ;
  64. ;
  65. ;
  66.         ORG     DIALV           ;OVERLAY THE DIALING VECTOR
  67.         JMP     DIAL
  68. ;       
  69.         IF      DISC            ;IF PROVIDING DISCONNECT CODE
  70.         ORG     DISCV           ;OVERLAY THE VECTOR
  71.         JMP     DISCON
  72.         ENDIF
  73. ;
  74.         IF      BREAK           ;IF PROVIDING BREAK CODE
  75.         ORG     BREAKV
  76.         JMP     SENDBK
  77.         ENDIF
  78.  
  79. ;
  80. ; This is the DIAL routine called by MEX to dial a digit. The digit
  81. ; to be dialed is passed in the A register.  Note that two special
  82. ; codes must be intercepted as non-digits: 254 (start dial sequence)
  83. ; and 255 (end-dial sequence).  Mex will always call DIAL with 254
  84. ; in the accumulator prior to dialing a number.  Mex will also call
  85. ; dial with 255 in A as an indication that dialing is complete. Thus,
  86. ; the overlay may use these values to "block" the number, holding it
  87. ; in a buffer until it is completely assembled (in fact, that's the
  88. ; scheme employed here for the SmartCat).
  89. ;
  90. ; After the 254-start-dial sequence, MEX will call the overlay with
  91. ; digits, one-at-a-time.  MEX will make no assumptions about the dig-
  92. ; its, and will send each to the DIAL routine un-inspected (some modems,
  93. ; like the SmartCat, allow special non-numeric characters in the
  94. ; phone number, and MEX may make no assumptions about these).
  95. ;
  96. ; After receiving the end-dial sequence (255) the overlay must take
  97. ; whatever end-of-dial actions are necessary *including* waiting for
  98. ; carrier at the distant end.  The overlay should monitor the keyboard
  99. ; during this wait (using the MEX keystat service call), and return
  100. ; an exit code to MEX in the A register, as follows:
  101. ;
  102. ;       0 - Carrier detected, connection established
  103. ;       1 - Far end busy (only for modems that can detect this condition)
  104. ;       2 - No answer (or timed out waiting for modem response)
  105. ;       3 - Keyboard abort (^C only: all others should be ignored)
  106. ;       4 - Error reported by modem
  107. ;
  108. ; <No other codes should be returned after an end-dial sequence>
  109. ;
  110. ; The overlay should not loop forever in the carrier-wait routine, but
  111. ; instead use either the overlay timer vector, or the INMDMV (timed 100
  112. ; ms character wait) service call routine.
  113. ;
  114. ; The DIAL routine is free to use any of the registers, but must return
  115. ; the above code after an end-dial sequence
  116. ;
  117.         ORG     DIALOC
  118. ;
  119. DIAL:   LHLD    DIALPT          ;FETCH POINTER
  120.         CPI     254             ;START DIAL?
  121.         JZ      STDIAL          ;JUMP IF SO
  122.         CPI     255             ;END DIAL?
  123.         JZ      ENDIAL          ;JUMP IF SO
  124. ;
  125. ; Not start or end sequence, must be a digit to be sent to the modem
  126. ;
  127.         MOV     M,A             ;PUT CHAR IN BUFFER
  128.         INX     H               ;ADVANCE POINTER
  129.         SHLD    DIALPT          ;STUFF PNTR
  130.         RET                     ;ALL DONE
  131. ;
  132. ; Here on a start-dial sequence
  133. ;
  134. STDIAL: LXI     H,DIALBF        ;SET UP BUFFER POINTER
  135.         SHLD    DIALPT
  136.         RET
  137. ;
  138. ; Here on an end-dial sequence
  139. ;
  140. ENDIAL: MVI     M,CR            ;STUFF END-OF-LINE INTO BUFFER
  141.         INX     H               ;FOLLOWED BY TERMINATOR
  142.         MVI     M,0
  143.         LDA     TPULSE          ;GET OVERLAY'S TOUCH-TONE FLAG
  144.         CPI     'T'
  145.         MVI     A,' '
  146.         JZ      DOTONE
  147.         MVI     A,'I'           ;LOAD A WITH CHAR TO SET PULSE
  148. DOTONE  STA     SCDIAL+3        ;PUT INTO STRING
  149.         LXI     H,SCDIAL        ;POINT TO DIALING STRING
  150.         CALL    SCSEND          ;SEND IT
  151. ;
  152. ; THE FOLLOWING LOOP WAITS FOR A RESULT FROM THE MODEM (UP TO
  153. ; 60 SECONDS: YOU MAY CHANGE THIS VALUE IN THE FOLLOWING LINE)
  154. ;
  155. RESULT: MVI     C,60            ;<<== MAXIMUM TIME TO WAIT FOR RESULT
  156. SCWLP:  PUSH    B
  157.         MVI     B,1             ;CHECK FOR A CHAR, UP TO 1 SEC WAIT
  158.         MVI     C,TMDINP        ;DO TIMED INPUT
  159.         CALL    MEX
  160.         JC      NOCHAR          ;SKIP AROUND IF NO CHAR.
  161.         ANI     7FH             ;STRIP HIGH BIT
  162.         CALL    SCTEST          ;CHECK CHAR
  163.         MOV     A,B             ;MOVE RETURN CODE TO A
  164.         JC      NOCHAR          ;NO CODE YET
  165.         PUSH    PSW             ;PUSH OUR GOOD RESULT
  166. DRAIN:  MVI     C,INMDM         ;DRAIN ANY OTHER CHARACTERS 
  167.         CALL    MEX
  168.         JNC     DRAIN
  169.         POP     PSW     
  170.         POP     B
  171.         RET                     ;RETURN TO MEX
  172. NOCHAR: MVI     C,CHEKCC        ;CHECK FOR CTRL-C
  173.         CALL    MEX
  174.         POP     B
  175.         JNZ     SCNEXT          ;IF NOT, JUMP
  176.         MVI     B,18H
  177.         MVI     C,SNDCHR
  178.         CALL    MEX             ;SEND CTRL-X
  179.         MVI     A,3             ;RETURN ABORT CODE
  180.         RET
  181. SCNEXT: DCR     C               ;NO
  182.         JNZ     SCWLP           ;CONTINUE
  183. ;
  184. ; ONE MINUTE WITH NO MODEM RESPONSE (OR NO CONNECTION)
  185. ;
  186. SCTIMO: MVI     A,2             ;RETURN TIMEOUT CODE
  187.         RET
  188. ;
  189. ; MODEM GAVE US A RESULT, CHECK IT
  190. ;
  191. SCTEST: PUSH    PSW             ;PUSH CURRENT CHAR
  192.         LDA     LCHAR
  193.         CPI     CMDCHR
  194.         JZ      SCANAL
  195.         POP     PSW
  196.         STA     LCHAR
  197.         STC                     ;SET CARRY FLAG
  198.         RET
  199. SCANAL: POP     PSW
  200.         STA     LCHAR
  201.         MVI     B,0             ;PREP CONNECT CODE
  202.         CPI     'C'             ;"CONNECT"?
  203.         RZ
  204.         CPI     '4'             ;NUMERIC VERSION OF "CONNECT"
  205.         RZ
  206.         INR     B               ;PREP BUSY CODE B=1
  207.         CPI     'B'
  208.         RZ
  209.         CPI     '0'             ;NUMERIC VERSION OF "BUSY"
  210.         RZ
  211.         INR     B               ;PREP NO CONNECT MSG B=2
  212.         CPI     'N'             ;N=NO ANS OR NO DIAL
  213.         RZ
  214.         CPI     '2'             ;NUMERIC VERSION OF "NO ANS"
  215.         RZ
  216.         CPI     '3'             ;NUMERIC VERSION OF "NO DIAL"
  217.         RZ
  218.         MVI     B,4             ;PREP MODEM ERROR
  219.         CPI     'A'             ;A = ABORT
  220.         RZ
  221. ;
  222. ; UNKNOWN RESPONSE, RETURN CARRY TO CALLER.
  223. ;
  224.         STC
  225.         RET
  226. LCHAR   DB      0H      ;LAST CHAR PROCESSED
  227. ;
  228. ; FOLLOWING ROUTINE DISCONNECTS THE MODEM USING SMARTCat
  229. ; CODES. ALL REGISTERS ARE AVAILABLE FOR THIS FUNCTION.
  230. ; NOTHING RETURNED TO CALLER.
  231. ;
  232.         IF      DISC
  233. ;
  234. DISCON: LXI     H,SCDISC        ;SEND '%H'
  235.         CALL    SCSEND
  236.         RET
  237. ;
  238. SCDISC: DB      CMDCHR,'H',CR,0
  239. ;
  240.         ENDIF
  241.         IF      BREAK
  242. ;
  243. SENDBK  LXI     H,SCBRK         ;SEND '%B'
  244.         CALL    SCSEND
  245.         RET
  246. ;
  247. SCBRK:  DB      CMDCHR,'B 2',CR,0
  248. ;
  249.         ENDIF
  250. ;
  251. ; SMARTCat UTILITY ROUTINE: SEND STRING TO MODEM
  252. ;
  253. SCSEND: MVI     C,SNDRDY        ;WAIT FOR MODEM READY
  254.         CALL    MEX
  255.         ORA     A
  256.         JZ      SCSEND
  257.         MOV     A,M             ;FETCH NEXT CHARACTER
  258.         INX     H
  259.         ORA     A               ;END?
  260.         RZ                      ;DONE IF SO
  261.         PUSH    H
  262.         MOV     B,A             ;NO, POSITION FOR SENDING
  263.         MVI     C,SNDCHR        ;NOPE, SEND THE CHARACTER
  264.         CALL    MEX
  265.         MVI     C,INMDM         ;CLEAR ANY STUFF FROM MODEM
  266.         CALL    MEX
  267.         POP     H
  268.         JMP     SCSEND
  269. ;
  270. ; DATA AREA
  271. ;
  272. SCDIAL: DB      CMDCHR,'D  '
  273. DIALBF: DS      52              ;2* 24 CHAR MAX, + CR + NULL + SLOP
  274. DIALPT: DS      2               ;DIAL POSITION POINTER
  275. ;
  276.         END
  277.  
  278.