'===========================================================================
' Subject: DIAL-UP CHAT (ANSWER)              Date: 04-22-97 (21:08)       
'  Author: Mike G. Stewart                    Code: QB, QBasic, PDS        
'  Origin: mikegs@juno.com                  Packet: MODEM.ABC
'===========================================================================
'answer.bas: Dial-Up Chat Server
'Program written by Mike Stewart
'(C) 1997 M Stewart
'Public Domain
'I changed the program CONNECT.BAS a lot to make this program.
'This program can be changed a lot.
'Use it to start your own network.
'Just include my name in the program that you write, in the credits or something.
'Have Fun! :-)

DECLARE SUB answer ()
DECLARE SUB Keyscan ()
DECLARE SUB delay (td!)
COMMON SHARED ModemIn$

ON ERROR GOTO Handler
ON COM(2) GOSUB GetBuf
COM(2) ON

PRINT "Press Any Key to Answer Phone."
SLEEP

answer

DO
 CALL Keyscan      ' You're online now. Stay in this loop forever.
LOOP

Handler:
RESUME NEXT

GetBuf:
InStr$ = INPUT$(LOC(1), #1)

   DO
      BackSpace = INSTR(InStr$, CHR$(8))
      IF BackSpace THEN
         MID$(InStr$, BackSpace) = CHR$(29)
      END IF
   LOOP WHILE BackSpace

   DO
      LineFeed = INSTR(InStr$, CHR$(10))
      IF LineFeed THEN
         InStr$ = LEFT$(InStr$, LineFeed - 1) + MID$(InStr$, LineFeed + 1)
      END IF
   LOOP WHILE LineFeed

   ModemIn$ = RIGHT$(ModemIn$ + InStr$, 10240)
   PRINT (InStr$);
RETURN

SUB answer

OPEN "COM2:9600,N,8,1" FOR RANDOM AS #1

CLS
LOCATE 25, 40: PRINT "ALT-X to exit.."
LOCATE 1, 1, 1
  PRINT #1, "ATZ"
  CALL delay(1.25)
  PRINT #1, "ATS7=45 S0=0 V1 M0"     ' modem initialization string
  CALL delay(1.25)

DO
  CALL delay(1)
  PRINT "Answering..."
  PRINT #1, "ata" + CHR$(13)

 TimeDelay! = TIMER + 40

   DO UNTIL TIMER > TimeDelay!
       CALL Keyscan
       test = INSTR(RIGHT$(ModemIn$, 20), "CONNECT")
        IF test THEN result = -1: EXIT DO
       test = INSTR(RIGHT$(ModemIn$, 5), "BUSY")
        IF test THEN result = 0: EXIT DO
       test = INSTR(RIGHT$(ModemIn$, 12), "NO DIALTONE")
        IF test THEN result = 0: CALL delay(2): EXIT DO
       test = INSTR(RIGHT$(ModemIn$, 11), "NO CARRIER")
        IF test THEN result = 0: CALL delay(2): EXIT DO

   LOOP

LOOP UNTIL result

FOR t = 1 TO 5            ' It connected! ring the alarm!
  SOUND 750, 2
  SOUND 550, 2
  SOUND 650, 2
  IF INKEY$ <> "" THEN EXIT FOR
NEXT

END SUB

SUB delay (td!)
  TimeDelay! = (TIMER + td!) MOD 86400
  WHILE TimeDelay! > TIMER: WEND
END SUB

SUB Keyscan
a$ = INKEY$
    IF a$ = CHR$(0) + CHR$(45) THEN CLOSE : END
    PRINT #1, a$;
END SUB
