50000 '=====================================
50100 ' Rotinas para acesso a placa de rede
50200 ' Por Julio C. da F. Lemos
50300 ' 30 de maio de 2013
50400 ' Versao 1.0
50500 '=====================================
50600 '
50700 ' Handlers para facilitar a chamada
50800 'das rotinas caso haja a necessidade
50900 'de renumerar as linhas do BASIC
51000 ' Entrada: RT$ - Nome da rotina
51100 ' Saida  : Depende da rotina chamada
51200 '
51300 IF RT$ = "ETH_INIT"         THEN GOSUB 52100 : RETURN
51400 IF RT$ = "ETH_CLEAR_BUFFER" THEN GOSUB 53300 : RETURN
51500 IF RT$ = "ETH_SET_IP"       THEN GOSUB 55200 : RETURN
51600 IF RT$ = "ETH_SEND_DATA"    THEN GOSUB 57400 : RETURN
51700 IF RT$ = "ETH_RECEIVE_DATA" THEN GOSUB 58300 : RETURN
51800 IF RT$ = "ETH_SIZE_BUFFER"  THEN GOSUB 61300 : RETURN
51900 PRINT "ROTINA NAO DEFINIDA."
52000 RETURN 'ROTINA NAO DEFINIDA
52100 '
52200 ' Inicializa a placa de rede e zera o
52300 'buffer.
52400 '
52500 'Porta de Dados
52600 '
52700 PD = &H91
52800 '
52900 'Porta de Configuracao
53000 '
53100 PC = &H90
53200 MS$ = "INICIALIZAR ETH - VARIAVEIS" : GOSUB 59200
53300 '
53400 'Zera o buffer da placa de rede.
53500 '
53600 OUT PD, 20
53700 MS$ = "LIMPAR BUFFER" : GOSUB 59200
53800 RETURN
53900 '
54000 ' IP Servidor
54100 '
54200 'IS$ = ""
54300 'INPUT "Entre com o IP do servidor";IS$
54400 '
54500 ' IP Cliente
54600 '
54700 'IC$ = ""
54800 'INPUT "Entre com o IP do cliente";IC$
54900 '
55000 ' Tenta a conexao com o servidor
55100 '
55200 '
55300 ' Configura endereco IP.
55400 ' Entrada: EN$
55500 ' Saida  : Nenhuma
55600 '
55700 ET$ = EN$
55800 FOR I = 0 TO 2
55900 PO = INSTR(ET$, ".")
56000 OC$ = MID$(ET$, 1, PO - 1)
56100 PRINT OC$; " ";
56200 OUT PD, VAL(OC$)
56300 ET$ = MID$(ET$, PO + 1)
56400 NEXT I
56500 OC$ = ET$
56600 PRINT OC$ : FOR I = 0 TO 1024 : NEXT I
56700 OUT PD, VAL(OC$)
56800 '
56900 ' Configura novo endereco IP
57000 '
57100 OUT PC, 45
57200 MS$ = "CONFIGURAR IP = " +  EN$ : GOSUB 59200
57300 RETURN
57400 '
57500 ' Enviar dados
57600 ' Entrada: DT$  (Data Send) - Dado a ser enviado.
57700 ' Saida  : Nenhuma
57800 '
57810 FOR I = 1 TO LEN(DT$):DT = ASC(MID$(DT$,I,1))
57900 OUT PD, DT: NEXT I
58000 OUT PC, 50
58100 MS$ = "ENVIAR DADOS = " + DT$ : GOSUB 59200
58200 RETURN
58300 '
58400 ' Receber dados
58500 ' Entrada: Nenhuma
58600 ' Saida  : DR (Data Receive) - Dado recebido.
58700 '          BF (Buffer)       - Tamanho do buffer.
58800 DR$ = ""
58900 FOR I = 1 TO BF : DR$ = DR$ + CHR$(INP(PD)) : NEXT
59000 MS$ = "RECEBER DADOS = " + DR$ : GOSUB 59200
59100 RETURN
59200 '
59300 ' Mensagem de status, apenas para debug.
59400 ' Entrada: MS (Message) - Mensagem a ser exibida
59500 ' Saida  : Nenhuma
59600 '
59700 LOCATE 0, 18 : PRINT SPACE$(40)
59800 LOCATE 0, 19 : PRINT SPACE$(40)
59900 LOCATE 0, 18 : PRINT "STATUS ETH : " + MS$
60000 FOR I = 0 TO 10 '8192
60100 NEXT I
60200 MS$ = ""
60300 RETURN
60400 '
60500 ' Teste das rotinas definidas.
60600 '
60700 RT$ = "ETH_INIT"                               : GOSUB 50000
60800 RT$ = "ETH_SET_IP"       : EN$ = "192.168.1.5" : GOSUB 50000
60900 RT$ = "ETH_SEND_DATA"    : DT = 78             : GOSUB 50000
61000 RT$ = "ETH_RECEIVE_DATA"                       : GOSUB 50000
61100 RT$ = "ETH_CLEAR_BUFFER" : GOSUB 50000
61200 RETURN
61300 '
61400 ' Tamanho do buffer preenchido.
61500 ' Entrada: Nenhuma
61600 ' Saida  : BF (Buffer)       - Tamanho do buffer.
61700 '
61800 OUT PC, 0: BF = INP(PD)
61900 MS$ = "TAMANHO DO BUFFER = " + STR$(BF) : GOSUB 59200
62000 RETURN
