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 / ZSYS / SIMTEL20 / ZCPR3 / T3T-24-1.Z80 < prev    next >
Text File  |  2000-06-30  |  11KB  |  508 lines

  1. ;
  2. ; MODULE: T3T-24-1 (Telephone Interface) for Hayes-compatible 2400bps modems
  3. ; Author: David McCord/Richard Conn
  4. ; Version: 1.0
  5. ; Date: 23 May 86
  6. ; Previous Versions: Richard Conn wrote T3TI-SM v1.2, which this is based on.
  7. ; Comments: This TI supports 300/1200/2400bps Hayes-compatible modems.  A key
  8. ;           compatibility point is that the modem return the terse result code
  9. ;           "10" on CONNECT 2400.  Modems that should work with this TI include
  10. ;           the Hayes 2400, USR Courier 2400, and Racal-Vadic 2400V.  Developed
  11. ;           and tested on a Courier 2400.  Baud rate is automatically set upon
  12. ;           connection in answer or originate modes.  The answer routines have
  13. ;           been rewritten from the original to NOT use modem auto-answer
  14. ;           functions, as this can lead to the modem answering the phone when
  15. ;           it shouldn't.
  16. ;
  17.     ORG    700H        ; BASE ADDRESS (700H - 9FFH)
  18. ;
  19. ;  ACCESS TO FILER$SERVER WITHIN T3ANSWER, T3DIAL, T3HANGUP, T3INIT
  20. ;
  21. FILER$SERVER    EQU    11AH    ; ADDRESS OF ADDRESS
  22. FS$GETSPEED    EQU    0    ; GET PROCESSOR SPEED
  23. FS$WAIT1S    EQU    1    ; WAIT 1 SEC
  24. FS$WAITP1S    EQU    2    ; WAIT 0.1 SEC
  25. FS$WAIT1MS    EQU    3    ; WAIT 0.001 SEC
  26. FS$CST        EQU    4    ; CONSOLE STATUS (Z=RDA)
  27. FS$CIN        EQU    5    ; CONSOLE INPUT
  28. FS$COUT        EQU    6    ; CONSOLE OUTPUT (CHAR IN C)
  29. ;
  30. ;  ACCESS TO MODEM OVERLAY ROUTINES
  31. ;
  32. M1$INIT        EQU    600H        ; INITIALIZE MODEM
  33. M1$ISTAT    EQU    M1$INIT+3    ; INPUT STATUS
  34. M1$OSTAT    EQU    M1$ISTAT+3    ; OUTPUT STATUS
  35. M1$IN        EQU    M1$OSTAT+3    ; INPUT BYTE
  36. M1$OUT        EQU    M1$IN+3        ; OUTPUT BYTE
  37. M1$BREAK    EQU    M1$OUT+3    ; SEND BREAK
  38. M1$CST        EQU    M1$BREAK+3    ; CARRIER STATUS DETECT
  39. M1$SPTAB    EQU    M1$CST+3    ; SPEED BYTE
  40. ;
  41. ;  ASCII CONSTANTS
  42. ;
  43. CR    EQU    0DH
  44. CTRLC    EQU    'C'-'@'
  45. ;
  46. ;  Telephone System Interface Routines
  47. ;
  48. TI$INIT:
  49.     JP    STI$INIT    ; INITIALIZATION
  50. TI$ANS:
  51.     JP    STI$ANS        ; SET ANSWER MODE
  52. TI$HANG:
  53.     JP    STI$HANG    ; HANG UP PHONE
  54. TI$RST:
  55.     JP    STI$RST        ; RING STATUS DETECT
  56. TI$DSTRT:
  57.     JP    STI$DSTRT    ; START DIALING
  58. TI$DSTOP:
  59.     JP    STI$DSTOP    ; STOP DIALING
  60. TI$DIGIT:
  61.     JP    STI$DIGIT    ; DIAL DIGIT
  62. TI$PREPANS:
  63.     JP    STI$PREPANS    ; PREPARE FOR ANSWERING PHONE
  64. TI$GETBAUD:
  65.     JP    STI$GETBAUD    ; RETURN CURRENT BAUD RATE VALUE
  66. ;
  67. ;  FILER$SERVER INTERFACE FOR TELEPHONE INTERFACE OVERLAY
  68. ;  FILER$SERVER CODE IS IN A
  69. ;
  70. TI$FS:
  71.     PUSH    HL        ; SAVE HL
  72.     LD    HL,TI$FSRET    ; SET RETURN ADDRESS
  73.     PUSH    HL        ; ... ON STACK
  74.     LD    HL,(FILER$SERVER)    ; GET ADDRESS OF FILER$SERVER
  75.     JP    (HL)        ; "CALL" ROUTINE
  76. TI$FSRET:
  77.     POP    HL        ; RESTORE HL
  78.     RET
  79. ;
  80. ;  SEND 'ATx' COMMAND TO SMARTMODEM
  81. ;
  82. CMD$SEND:
  83.     PUSH    AF        ; SAVE CMD
  84.     LD    A,FS$WAIT1S    ; CODE TO WAIT 1 SECOND
  85.     CALL    TI$FS        ; FILER$SERVER
  86.     LD    A,'A'        ; SEND 'AT'
  87.     CALL    CMD$SEND1
  88.     LD    A,'T'
  89.     CALL    CMD$SEND1
  90.     POP    AF        ; GET CMD
  91. ;
  92. ;  SEND FURTHER COMMAND CHARS TO SMARTMODEM
  93. ;
  94. CMD$SEND1:
  95.     PUSH    AF        ; SAVE CHAR
  96.     CALL    M1$OUT        ; SEND CHAR IN A
  97.     push    bc
  98.     ld    b,10        ; do this 10 times...
  99. cmd$send2:
  100.     ld    a,fs$wait1ms
  101.     call    ti$fs        ; wait a millisecond
  102.     djnz    cmd$send2
  103.     pop    bc        ; when we get here, we waited 10ms for echo
  104.     CALL    FLUSH        ; flush the echo
  105.     POP    AF
  106.     RET
  107. ;
  108. ;  END SMARTMODEM COMMAND SEQUENCE
  109. ;
  110. CMD$END:
  111.     PUSH    AF        ; SAVE A
  112.     LD    A,0DH        ; SEND <CR> AND WAIT FOR <CR>
  113.     CALL    CMD$SEND1    ; SEND CHAR WITH ECHO
  114.     POP    AF        ; RESTORE A
  115.     RET
  116. ;
  117. ;  WAIT FOR RESPONSE FROM SMARTMODEM COMMAND
  118. ;    RETURN DIGIT UNLESS ERROR:
  119. ;    A=0FFH if TIMEOUT
  120. ;    A=0FEH if USER ABORT
  121. ;
  122. ssresponse:
  123.     push    hl
  124.     ld    hl,500        ; super short delay for response (.5 sec)
  125.     jr    respe
  126. SRESPONSE:
  127.     PUSH    HL
  128.     LD    HL,2000        ; SHORT DELAY FOR RESPONSE (2 secs)
  129.     JR    RESPE
  130. RESPONSE:
  131.     PUSH    HL        ; SAVE HL
  132.     LD    HL,30000    ; LARGE DELAY FOR RESPONSE (30 secs)
  133. RESPE:
  134.     LD    (RESP$DELAY),HL
  135. RESP1:
  136.     LD    HL,(RESP$DELAY)    ; DELAY FOR RESPONSE
  137. RESP2:
  138.     CALL    M1$ISTAT    ; INPUT CHAR FROM MODEM?
  139.     JR    NZ,RESPM
  140.     LD    A,FS$CST    ; CONSOLE STATUS
  141.     CALL    TI$FS        ; USER ABORT?
  142.     JR    Z,RESP3
  143.     ld    a,fs$wait1ms
  144.     call    ti$fs        ; wait 0.001 sec
  145.     DEC    HL        ; COUNT DOWN
  146.     LD    A,H        ; DONE?
  147.     OR    L
  148.     JR    NZ,RESP2
  149.     POP    HL
  150.     OR    0FFH        ; TIMEOUT CODE
  151.     RET
  152. RESP$DELAY:
  153.     DS    2        ; RESPONSE DELAY
  154. ;
  155. ; PROCESS USER CHAR
  156. ;
  157. RESP3:
  158.     LD    A,FS$CIN    ; GET USER INPUT
  159.     CALL    TI$FS        ; USE FILER$SERVER
  160.     AND    7FH        ; MASK
  161.     CP    CTRLC        ; ABORT?
  162.     JR    NZ,RESP2
  163.     POP    HL        ; RESTORE HL
  164.     LD    A,0FEH        ; USER ABORT
  165.     OR    A
  166.     RET
  167. ;
  168. ; PROCESS MODEM CHAR
  169. ;
  170. RESPM:
  171.     CALL    M1$IN        ; GET CHAR
  172.     AND    7FH        ; MASK
  173.     JR    Z,RESP1        ; FLUSH NULL
  174.     POP    HL        ; RESTORE HL
  175.     RET
  176. ;
  177. ;  ATTRACT ATTENTION OF SMARTMODEM
  178. ;
  179. ATTENTION:
  180.     CALL    M1$CST        ; DO NOTHING IF NO CARRIER
  181.     RET    Z
  182.     CALL    FLUSH        ; FLUSH ANY CHAR
  183.     LD    A,0        ; SEND AT LEAST ONE CHAR FIRST
  184.     CALL    M1$OUT
  185.     LD    A,FS$WAIT1S    ; WAIT 1 SEC
  186.     CALL    TI$FS        ; USE FILER$SERVER
  187.     LD    A,'+'        ; ATTRACT MODEM'S ATTENTION
  188.     CALL    M1$OUT
  189.     CALL    M1$OUT
  190.     CALL    M1$OUT
  191.     CALL    sresponse    ; WAIT FOR RESPONSE OR TIMEOUT
  192.     RET
  193. ;
  194. ;  FLUSH ANY GARBAGE CHARS FROM COMMAND LINE
  195. ;
  196. FLUSH:
  197.     CALL    M1$ISTAT    ; ANY CHARS?
  198.     RET    Z        ; RETURN IF NONE
  199.     CALL    M1$IN        ; GET CHAR
  200.     RET
  201. ;
  202. ;  Telephone Interface Initialization
  203. ;    Function:  Initialize the Modem/UART Interface
  204. ;    Input Parameters:  None
  205. ;    Output Parameters:  None
  206. ;
  207. STI$INIT:
  208.     PUSH    AF        ; SAVE A
  209.     CALL    ATTENTION    ; GET MODEM'S ATTENTION
  210.     LD    A,'Z'        ; RESET MODEM
  211.     CALL    CMD$SEND    ; SEND COMMAND
  212.     CALL    CMD$END        ; SEND <CR>
  213.     CALL    OK        ; GET OK/USER ABORT
  214.     CP    0FEH        ; USER ABORT?
  215.     JR    Z,STI$INI1
  216.     LD    A,'V'        ; SET NON-VERBOSE MODE
  217.     CALL    CMD$SEND    ; SEND COMMAND
  218.     LD    A,'0'        ; V0 COMMAND
  219.     CALL    CMD$SEND1
  220.     LD    A,'X'        ; SET EXTENDED COMMAND SET
  221.     CALL    CMD$SEND1    ; SEND COMMAND
  222.     LD    A,'4'        ; Enable result codes 0 thru 10
  223.     CALL    CMD$SEND1
  224.     ld    a,'S'        ; disable auto-answer if turned on somehow
  225.     call    cmd$send1
  226.     ld    a,'0'
  227.     call    cmd$send1
  228.     ld    a,'='
  229.     call    cmd$send1
  230.     ld    a,'0'
  231.     call    cmd$send1
  232.     CALL    CMD$END        ; SEND <CR>
  233.     CALL    OK1        ; GET OK/USER ABORT
  234. STI$INI1:
  235.     CALL    FLUSH        ; FLUSH RESPONSES
  236.     POP    AF        ; RESTORE A
  237.     RET
  238. ;
  239. ; GET RESPONSE CODE OF 'OK' OR '0'
  240. ;
  241. OK:
  242.     CALL    sresponse    ; GET FIRST CHAR
  243.     CP    0FEH        ; USER ABORT?
  244.     RET    Z
  245.     CP    '0'        ; DIGIT '0'?
  246.     JR    Z,OK1A
  247.     CP    'O'        ; LETTER 'O'?
  248.     JR    NZ,OK
  249.     CALL    sresponse    ; GET 'K'
  250.     CP    0FEH        ; USER ABORT?
  251.     RET    Z
  252.     CALL    sresponse    ; GET <CR>
  253.     CP    0FEH        ; USER ABORT?
  254.     RET    Z
  255.     CALL    sresponse    ; GET <LF>
  256.     RET
  257. ;
  258. ; GET RESPONSE CODE OF '0'
  259. ;
  260. OK1:
  261.     CALL    sresponse    ; GET FIRST CHAR
  262.     CP    0FEH        ; USER ABORT?
  263.     RET    Z
  264.     CP    '0'        ; OK?
  265.     JR    NZ,OK1
  266. OK1A:
  267.     CALL    sresponse    ; GET <CR>
  268.     RET
  269. ;
  270. ;  Prepare Modem to Answer Phone
  271. ;    Function:  To condition modem for answering phone
  272. ;    Input Parameters:  None
  273. ;    Output Parameters:  None
  274. ;
  275. STI$PREPANS:
  276.     PUSH    AF
  277.     LD    A,3        ; SELECT 2400 BAUD
  278.     LD    (STI$BRATE),A    ; SET FLAG
  279.     CALL    M1$INIT
  280.     POP    AF
  281.     RET
  282. ;
  283. ;  Set Modem to Answer
  284. ;    Function:  Set Modem to Answer Mode
  285. ;    Input Parameters:  None
  286. ;    Output Parameters:  A=0 IF NOT SUCCESSFUL, A=0FFH IF SUCCESSFUL
  287. ;
  288. STI$ANS:
  289.     XOR    A        ; SET NO BAUD RATE
  290.     LD    (STI$BRATE),A
  291.     ld    a,'A'        ; prepare to send ATA command
  292.     call    cmd$send    ; send it
  293.     call    cmd$end
  294. STI$ANS1:
  295.     call    response
  296.     CP    CR        ; <CR>?
  297.     JR    Z,STI$ANS1
  298.     cp    '1'        ; is it "1" or "10" (300 or 2400)?
  299.     jr    z,sti$ans324    ; If Z, process further
  300.     CP    '5'        ; CONNECT 1200?
  301.     JR    Z,STI$ans12
  302.     xor    a        ; make A 0 (we didn't get a connect)
  303.     ret
  304. sti$ans324:
  305.     call    ssresponse    ; we should have at least a CR or a 0 pending
  306.     cp    cr        ; is it CR?
  307.     jr    z,sti$ans3    ; must be 300 if Z
  308. sti$ans24:
  309.     ld    a,3        ; select 2400 bps
  310.     jr    sti$ansset
  311. STI$ans3:
  312.     LD    A,1        ; SELECT 300 BAUD
  313.     JR    STI$ansSET
  314. STI$ans12:
  315.     LD    A,2        ; SELECT 1200 BAUD
  316. STI$ansSET:
  317.     LD    (STI$BRATE),A    ; SET BAUD RATE
  318.     CALL    M1$INIT        ; INIT USART BAUD RATE
  319.     OR    A,0ffh        ; RETURN CONNECT CODE
  320.     RET
  321. ;
  322. ;  Hang up telephone
  323. ;    Function:  Place the telephone on hook
  324. ;    Input Parameters:  None
  325. ;    Output Parameters:  None
  326. ;
  327. STI$HANG:
  328.     PUSH    AF
  329.     CALL    M1$CST        ; DO NOT HANG UP IF NO CARRIER
  330.     JR    Z,STI$HANG1
  331.     CALL    STI$HANG3    ; HANG UP PHONE
  332.     CP    0FEH        ; USER ABORT?
  333.     JR    Z,STI$HANG1
  334.     CALL    M1$CST        ; STILL CARRIER?
  335.     JR    Z,STI$HANG1
  336.     CALL    STI$HANG3    ; TRY A SECOND TIME TO HANG UP
  337. STI$HANG1:
  338.     POP    AF        ; DO NOTHING SINCE WE ARE ALREADY OFFLINE
  339.     RET
  340. STI$HANG3:
  341.     CALL    ATTENTION    ; GET SMARTMODEM'S ATTENTION
  342.     LD    A,'H'        ; HANG UP PHONE
  343.     CALL    CMD$SEND
  344.     CALL    CMD$END        ; END OF COMMAND
  345.     CALL    sresponse    ; FLUSH RESPONSE DIGIT
  346.     CP    0FEH        ; USER ABORT
  347.     RET    Z
  348.     CALL    sresponse    ; FLUSH RESPONSE <CR>
  349.     RET
  350. ;
  351. ;  YES and NO Return Codes
  352. ;
  353. STI$YES:
  354.     OR    0FFH        ; SET FLAGS
  355.     RET
  356. STI$NO:
  357.     XOR    A        ; NO ANSWER
  358.     RET
  359. ;
  360. ;  Ring Status Detect
  361. ;    Function:  Determines if phone is ringing or not.
  362. ;    Input Parameters:  None
  363. ;    Output Parameters:  A=0FFH no ring, A=0 ring, A=0FEH user abort
  364. ;
  365. STI$RST:
  366.     CALL    ssresponse    ; GET RETURN CODE
  367.     cp    0dh        ; cr?
  368.     jr    z,sti$rst
  369.     CP    '2'        ; RING?
  370.     JR    Z,STI$RST3
  371.     CP    0FEH        ; USER ABORT?
  372.     JR    Z,STI$RST2
  373. STI$RST1:
  374.     LD    A,0FFH        ; RETURN NO RING
  375. STI$RST2:
  376.     OR    A        ; SET FLAGS
  377.     RET
  378. sti$rst3:
  379.     call    ssresponse    ; get trailing CR
  380.     cp    0feh        ; user abort?
  381.     jr    z,sti$rst2
  382.     xor    a
  383.     ret
  384. ;
  385. ;  Start Dialing
  386. ;    Function:  Initiate the dialing process
  387. ;    Input Parameters:  None
  388. ;    Output Parameters:  A=0 if no dial tone, A=0FFH if dial tone
  389. ;
  390. STI$DSTRT:
  391.     CALL    FLUSH        ; FLUSH CHAR IF PRESENT
  392.     LD    A,3        ; SELECT 2400 BAUD
  393.     LD    (STI$BRATE),A    ; SET BAUD RATE
  394.     CALL    M1$INIT
  395.     LD    A,'D'        ; START DIALING
  396.     CALL    CMD$SEND    ; SEND COMMAND
  397.     LD    A,'T'        ; TOUCH TONE DIALING
  398.     CALL    CMD$SEND1
  399.     JP    STI$YES        ; fake dial tone OK, even though we aren't
  400.                 ; off-hook yet
  401. ;
  402. ;  Stop Dialing
  403. ;    Function:  Terminate the dialing process with answer or user abort,
  404. ;                  and set baud rate based on result code if answer.
  405. ;    Input Parameters:  None
  406. ;    Output Parameters:  A=0 and Z if answer, NZ and error code if no ans
  407. ;                Error Code: 0FFH=Timeout, 0FEH=User Abort
  408. ;                    Other=TI Return Code
  409. ;
  410. STI$DSTOP:
  411.     ld    a,cr        ; end dial string
  412.     call    cmd$send1
  413. STI$DS1:
  414.     LD    A,FS$CST    ; CHECK CONSOLE STATUS
  415.     CALL    TI$FS        ; USE FILER$SERVER
  416.     JR    Z,STI$DS2    ; NO CONNECTION IF USER ABORT
  417. STI$DSLOOP:
  418.     CALL    RESPONSE    ; ANSWER?
  419.     CP    0FFH        ; TIMEOUT?
  420.     JR    Z,STI$DS1
  421.     CP    0FEH        ; USER ABORT
  422.     JR    Z,STI$DS2E
  423.     CP    '2'        ; RING?
  424.     JR    Z,STI$DSLOOP
  425.     CP    CR        ; <CR>
  426.     JR    Z,STI$DSLOOP
  427.     CP    '9'+1        ; CHECK RANGE
  428.     JR    NC,STI$DS1
  429.     CP    '0'        ; CHECK RANGE
  430.     JR    C,STI$DS1
  431.     CP    '1'        ; is it a "1" or "10"?
  432.     JR    Z,STI$DS324    ; process more if so
  433.     CP    '5'        ; CONNECTED AT 1200 BAUD?
  434.     ret    nz
  435.     LD    A,2        ; SELECT 1200 BAUD
  436. STI$DSB:
  437.     LD    (STI$BRATE),A    ; SET BAUD RATE FLAG
  438.     CALL    M1$INIT        ; SET BAUD RATE
  439.     XOR    A        ; RETURN CONNECT CODE
  440.     RET
  441. STI$DS2:
  442.     LD    A,FS$CIN    ; GET CHAR
  443.     CALL    TI$FS        ; USE FILER$SERVER
  444.     AND    7FH
  445.     CP    CTRLC        ; ABORT?
  446.     JR    NZ,STI$DS1
  447. STI$DS2E:
  448.     LD    A,0FEH        ; SET USER ABORT
  449.     OR    A
  450.     RET
  451. sti$ds324:
  452.     call    ssresponse    ; there is at least a CR or 0 pending
  453.     cp    cr        ; was it cr, not 0?
  454.     jr    z,sti$ds3    ; if yes, go set 300 baud
  455. sti$ds24:
  456.     ld    a,3        ; select 2400 bps
  457.     jr    sti$dsb
  458. STI$DS3:
  459.     LD    A,1        ; SELECT 300 BAUD
  460.     JR    STI$DSB
  461. ;
  462. ;  Dial Digit
  463. ;    Function:  Dial an individual digit
  464. ;    Input Parameters:  A=ASCII for digit to dial
  465. ;    Output Parameters:  None
  466. ;
  467. STI$DIGIT:
  468.     PUSH    AF
  469.     CP    ' '        ; DON'T SEND SPACES
  470.     jr    z,sti$digit1
  471.     cp    '-'        ; don't send dashes
  472.     jr    z,sti$digit1
  473.     cp    '('        ; don't send parenthesis
  474.     jr    z,sti$digit1
  475.     cp    ')'        ; other kind
  476.     jr    z,sti$digit1
  477.     CALL    CMD$SEND1    ; SEND DIGIT WITH ECHO
  478. sti$digit1:
  479.     POP    AF
  480.     RET
  481. ;
  482. ;  Get Baud
  483. ;    Function:  Return current baud rate value (from answer or dial)
  484. ;    Input Parameters: None
  485. ;    Output Parameters: A = Baud Rate and Z flag set
  486. ;        A = 0 means undefined
  487. ;        A = 1 means  300 baud
  488. ;        A = 2 means 1200 baud
  489. ;
  490. STI$GETBAUD:
  491.     LD    A,(STI$BRATE)    ; GET VALUE
  492.     OR    A        ; SET FLAGS
  493.     RET
  494. ;
  495. ;  BAUD RATE FLAG
  496. ;    A = 0 IF NONE
  497. ;    A = 1 IF  300 BAUD
  498. ;    A = 2 IF 1200 BAUD
  499. ;
  500. STI$BRATE:
  501.     DB    0        ; FLAG BUFFER
  502. ;
  503. ;        END of Telephone Interface Routines
  504. ;
  505.     DB    'End of TI-2400'
  506.  
  507.     END
  508.