'Biblioteca para uso de modem
'por Claudio Eduardo Storti Lago
DECLARE FUNCTION AutoAnswer (AutoAnswerString$)
DECLARE FUNCTION ModemInput$ (Coluna!, Linha!, MaxLenght!, Prompt$)
DECLARE FUNCTION ModemInkey$ ()
DECLARE SUB ClearLocalScreen ()
DECLARE SUB ClearRemoteScreen ()
DECLARE SUB CloseModem ()
DECLARE SUB GotoXYRemote (Coluna!, Linha!)
DECLARE SUB GotoXYLocal (Coluna!, Linha!)
DECLARE SUB LocalString (Text$)
DECLARE SUB InitModem (Port$, Baud$, Parity$, BE$, BS$)
DECLARE SUB LeModem ()
DECLARE SUB SendKey (Caracter$)
DECLARE SUB SendKeyAuto ()
DECLARE SUB EnviaString (Text$)
DECLARE SUB EnviaStringAuto (Text$)
DECLARE SUB Filter (Texto$)
'$INCLUDE: 'qb.bi'

				CONST False = 0
				CONST True = NOT False
				
				InitModem "2", "19200", "n", "8", "1"

				IF AutoAnswer("ATA") = True THEN
				ClearLocalScreen
				ClearRemoteScreen
				Nome$ = ModemInput$(10, 10, 10, "Qual o seu nome? ")
				END IF
			 
END

Desconecta:
				CloseModem
				TIMER OFF
				RETURN

FUNCTION AutoAnswer (AutoAnswerString$)
			 
				AutoAnswer = False

				DO
				a$ = ModemInkey$
				LocalString a$
				LastString$ = LastString$ + a$
				
				IF RIGHT$(LastString$, 4) = "RING" THEN
				TIMER ON
				ON TIMER(30) GOSUB Desconecta
				EnviaStringAuto AutoAnswerString$
				END IF

				IF RIGHT$(LastString$, 8) = "CONNECT " THEN
				DO
				a$ = ModemInkey$
				LocalString a$
				LastString$ = LastString$ + a$
				LOOP UNTIL RIGHT$(LastString$, 1) = CHR$(10)
				AutoAnswer = True
				TIMER OFF
				EXIT DO
				END IF

				LOOP


END FUNCTION

SUB ClearLocalScreen

				LocalString CHR$(27) + "[2J"

END SUB

SUB ClearRemoteScreen
			 
				PRINT #1, CHR$(27) + "[2J"

END SUB

SUB CloseModem
			 
				CLOSE #1

END SUB

SUB EnviaString (Text$)

				FOR i = 1 TO LEN(Text$)
				a$ = MID$(Text$, i, 1)
				PRINT #1, a$;
				NEXT i
			 
END SUB

SUB EnviaStringAuto (Text$)

				PRINT #1, Text$

END SUB

SUB Filter (Texto$)
			 
				DIM Entrada AS RegTypeX
				DIM Saida AS RegTypeX


				Entrada.ax = ASC(Texto$)
				CALL INTERRUPTX(&H29, Entrada, Saida)

END SUB

SUB GotoXYLocal (Coluna, Linha)
			 
				LocalString CHR$(27) + "[" + MID$(STR$(Linha), 2, LEN(STR$(Linha))) + ";" + MID$(STR$(Coluna), 2, LEN(STR$(Coluna))) + "H"

END SUB

SUB GotoXYRemote (Coluna, Linha)

				PRINT #1, CHR$(27) + "[" + MID$(STR$(Linha), 2, LEN(STR$(Linha))) + ";" + MID$(STR$(Coluna), 2, LEN(STR$(Coluna))) + "H"
			 
END SUB

SUB InitModem (Port$, Baud$, Parity$, BE$, BS$)

			OPEN "Com" + Port$ + ":" + Baud$ + "," + Parity$ + "," + BE$ + "," + BS$ FOR RANDOM AS #1

END SUB

SUB LeModem
			 
				IF NOT EOF(1) THEN a$ = INPUT$(1, #1): Filter a$

END SUB

SUB LocalString (Text$)

				Tamanho = LEN(Text$)
				FOR i = 1 TO Tamanho
				Caractere$ = MID$(Text$, i, i)
				Filter Caractere$
				NEXT i

END SUB

FUNCTION ModemInkey$
			 
				IF NOT EOF(1) THEN
				ModemInkey$ = INPUT$(1, #1)
				END IF

END FUNCTION

FUNCTION ModemInput$ (Coluna, Linha, MaxLenght, Prompt$)

				GotoXYLocal Coluna, Linha       'Posiciona e envia a string LOCAL
				LocalString Prompt$

				GotoXYRemote Coluna, Linha      'Posiciona e envia a string REMOTE
				EnviaString Prompt$
				'Pega a resposta do modem

				DO
			 
				Tecla$ = ModemInkey$
				IF Tecla$ = "" THEN Tecla$ = INKEY$
			 
				IF Tecla$ = CHR$(13) THEN EXIT DO
			 
				IF Tecla$ <> "" THEN
				IF NOT Tecla$ = CHR$(8) THEN
				Resposta$ = Resposta$ + Tecla$
				IF LEN(Resposta$) < MaxLenght + 1 THEN
				LocalString Tecla$
				EnviaString Tecla$
				END IF
				IF LEN(Resposta$) > MaxLenght THEN
				Resposta$ = MID$(Resposta$, 1, MaxLenght)
				LocalString CHR$(7)
				EnviaString CHR$(7)
				END IF
				ELSE
				IF LEN(Resposta$) = 0 THEN GOTO PulaConfere
				Resposta$ = MID$(Resposta$, 1, LEN(Resposta$) - 1)
				IF LEN(Resposta$) < MaxLenght + 1 THEN
				LocalString CHR$(8)
				EnviaString CHR$(8)
				END IF
				IF LEN(Resposta$) > MaxLenght THEN
				Resposta$ = MID$(Resposta$, 1, MaxLenght)
				LocalString CHR$(7)
				EnviaString CHR$(7)
				END IF
PulaConfere:
				END IF
				END IF
				LOOP

				ModemInput$ = Resposta$

END FUNCTION

SUB SendKey (Caracter$)
			 
				PRINT #1, Caracter$;

END SUB

SUB SendKeyAuto
			 
				Tecla$ = INKEY$
				PRINT #1, Tecla$;

END SUB

