Ethernet y ZX BASIC

Noticias relacionadas con el mundo del Spectrum en general y este foro en particular. Presentación de nuevos usuarios.

Moderador: Sir Cilve Sinclair

Ethernet y ZX BASIC

Notapor winston el Vie Jul 10, 2009 2:15 pm

La más reciente cosa que estoy haciendo para el Spectranet es un modulo para que un programador de BASIC pueda enviar cosas a través del internet... La noche pasada, escribí este programa en ZX BASIC para probarlo...¡y sí funciona!

Código: Seleccionar todo
 10 %connect #4,"example.com",2000
 20 PRINT #4;"Hola example.com"
 30 GO TO 20


Por supuesto, el nuevo commando "%connect" crea un socket de TCP que conecta el 'stream' #4 de BASIC a TCP puerto 2000 en el servidor "example.com". Los streams del ZX BASIC envian datos uno byte a la vez - si los datos se enviaran a través la red en esta manera, sería muy ineficiente. Por eso, los datos se están puesto en un buffer en la memoria del Spectranet. Cuando el buffer está lleno, o cuando se envia un cáracter 0x0D, se vacia y los datos están enviado por la red. Cada buffer tiene 256 bytes, y es posible tener hasta 4 sockets abiertos al mismo tiempo.

Todavía necesito hacer mucho más - ahora mismo ZX BASIC no puede leer desde un socket (el código para leer es lo que quiero hacer el fin de la semana que viene).

Algún dia, es probable que haya un cliente de Twitter escrito en ZX BASIC :-)
Tarjeta ethernet para el Spectrum - http://spectrum.alioth.net/doc

Debemos practicar un quirkafleeg
Avatar de Usuario
winston
Sabreman
 
Mensajes: 469
Registrado: Mar Ago 19, 2008 4:17 pm
Ubicación: Isla de Man

Re: Ethernet y ZX BASIC

Notapor na_th_an el Vie Jul 10, 2009 2:33 pm

¡Muy interesante!

¿Y para recibir? ¿Serviría un INPUT #4?

Juju - es que así se podrían hacer cosas maravillosas :P
Avatar de Usuario
na_th_an
Nonamed
 
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Ethernet y ZX BASIC

Notapor mcleod_ideafix el Vie Jul 10, 2009 3:23 pm

Wow! Esto sí que es un adelanto en el Spectranet :) ¿Cómo resolverás el tema de recepción? ya que los sockets por naturaleza son asíncronos, y puede estar recibiendo datos cuando aún no has emitido una orden INPUT en el Spectrum que quiera leer esos datos...

De momento, aquí tienes un mini cliente para enviarme correo electrónico :D
Código: Seleccionar todo
10 CLS: PRINT "Mail client for sending messages to miguel.angel@zxprojects.com": PRINT
12 INPUT "From (yourname@youraddress): ";f$
15 PRINT "From: ";f$
17 GOSUB 1000: IF pos=0 THEN PRINT "Bad address!": BEEP .5,0: GOTO 10: REM check if there's a @ in the string.
20 INPUT "Subject: ";s$
30 PRINT "Subject: ";s$
40 INPUT "Message: ";m$
50 PRINT "Message: ";m$
60 INPUT "OK to proceed? (y/n): ";r$
70 IF r$<>"y" THEN GO TO 10
75 PRINT
80 %CONNECT #4,"smtp.secureserver.net",25: REM this host is obtained doing: host -t MX zxprojects.com from a Linux box.
90 INPUT #4;r$: PRINT r$: IF r$(1 TO 3)<>"220" THEN GO TO 500
100 PRINT #4;"HELO "+f$(pos+1 TO)+CHR$ 13+CHR$ 10;: REM HELO commands needs domain appended.
110 INPUT #4;r$: PRINT r$: IF r$(1 TO 3)<>"250" THEN GO TO 500
120 PRINT #4;"MAIL FROM: "+f$+CHR$ 13+CHR$ 10;
130 INPUT #4;r$: PRINT r$: IF r$(1 TO 3)<>"250" THEN GO TO 500
140 PRINT #4;"RCPT TO: miguel.angel@zxprojects.com"+CHR$ 13+CHR$ 10;
150 INPUT #4;r$: PRINT r$: IF r$(1 TO 3)<>"250" THEN GO TO 500
160 PRINT #4;"DATA"+CHR$ 13+CHR$ 10;
170 INPUT #4;r$: PRINT r$: IF r$(1 TO 3)<>"354" THEN GO TO 500
180 PRINT #4;" Subject: "+s$+CHR$ 13+CHR$ 10;
190 PRINT #4; m$;
200 PRINT #4;CHR$ 13+CHR$ 10+"."+CHR$ 13+CHR$ 10;: REM Marker for 'end of message'
210 INPUT #4;r$: PRINT r$: IF r$(1 TO 3)<>"250" THEN GO TO 500
220 PRINT #4;"QUIT"+CHR$ 13+CHR$ 10;
230 INPUT #4;r$: PRINT r$
500 CLOSE #4
510 STOP
1000 LET pos=0: FOR n=1 TO LEN f$: IF f$(n)="@" THEN LET pos=n: RETURN
1010 NEXT n: RETURN


Para probarlo con la versión tal y como la tienes ahora, sin entrada de datos, sustituye las líneas con INPUT #4 por PAUSE 25 (y nada más). Esto simplemente asume que el servidor siempre va a dar la respuesta correcta. No es lo adecuado, pero en muchos casos sirve :D

Me he dado cuenta de otra cosa: en la implementación actual, envías los datos cuando se recibe un caracter 0xD. Si esto va a trabajar con protocolos ya existentes, ten en cuenta que muchos de ellos (por ejemplo, éste del correo electrónico) usa la secuencia 0xD 0xA para terminar las líneas (CR+LF). De hecho, para evitar que se envíe el 0xD extra en cada PRINT #4, he tenido que terminar cada sentencia en ;

En este sentido, creo que sería conveniente una sentencia para forzar un vaciado del buffer de emisión. Algo así cómo:
Código: Seleccionar todo
%flush #4

Que debería enviarse después de cada PRINT y antes del INPUT, para asegurarse de que el mensaje completo ha sido enviado al servidor antes de esperar a recibir la respuesta.

Otra opción podría ser cambiar el carácter de fin de mensaje, por ejemplo, a CHR$ 0. Ese carácter sólo actuaría a modo de marca de fin de mensaje, y no se transmitiría, aunque esto rompe un poco la semántica del ZX BASIC, donde todo lo que se envía por los canales termina por CHR$ 13.

Con la versión de Spectranet que tengo, ¿se puede usar para hacer este tipo de pruebas? Obviamente, reflasheando la ROM, claro, pero pregunto si es necesario cambiar algo en la programación de la CPLD.

¡¡Enhorabuena por esta noticia!!
Web: ZX Projects | Twitter: @zxprojects
Avatar de Usuario
mcleod_ideafix
Johnny Jones
 
Mensajes: 3984
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera

Re: Ethernet y ZX BASIC

Notapor winston el Vie Jul 10, 2009 4:23 pm

Estoy pensando en añadir unos comandos así -

%lineterm - para cambiar cómo las lineas se termina.

Y por supuesto, el orden %flush. (Este debería ser facíl implementar) También el buffer se vaciará automaticamente cada vez INPUT# se está ejecutado (para permitir cosas tales como "INPUT #4; "foo bar baz: "; A$"). Creo que puedo usar INKEY$# en vez de "%poll" o algo así.

No he cambiado el CPLD hace varios meses (por lo menos, no hay cambios que afecta este modulo, he cambiado los circuitos del reloj pero este no afecta software). Necesito publicar un ROM nuevo.

En el tema de recepción - la libreria de sockets ya dirige los buffers de hardware - por eso, no es algo que el modulo de streams tiene que hacer - la libreria funciona como la de BSD.
Sería posible añadir algo en ROM para llenar el buffer del W5100 uno byte a la vez, pero quiero usar la libreria estándar - si necesitase cambiar el hardware algún día, sólo tendría que modificar la librería - y los modulos seguirían funcionando sin cambios. (Ya hay un nuevo chip de Wiznet, se llama W5300, que tiene más funciones pero no es compatible con software para el W5100)
Tarjeta ethernet para el Spectrum - http://spectrum.alioth.net/doc

Debemos practicar un quirkafleeg
Avatar de Usuario
winston
Sabreman
 
Mensajes: 469
Registrado: Mar Ago 19, 2008 4:17 pm
Ubicación: Isla de Man

Re: Ethernet y ZX BASIC

Notapor winston el Sab Jul 11, 2009 8:41 pm

Más en el tema de la recepción de datos...

Me había olvidado que es posible (hmm, creo que sería mejor decir - "es más probable" :-) ) que el otro ordenador pueda enviar datos mucho más rápidamente que un programa de BASIC pueda leerlos. Por eso tuve que añadir otro buffer para recibir datos para INPUT #.

Para INKEY$#, los caracteres son recibidos uno a la vez, una cosa que es muy fácil hacer. Por otra parte, INPUT # necesita un verdadero montón de código para funcionar bien... Si se diera los datos uno byte a la vez a la rutina de INPUT, haría un "clic" para cada byte que recibiría. Y ademas sería un poco lento (la IF1 también le da datos a la rutina de INPUT # en una manera similar. Tuve que usar "The Complete Shadow ROM Disassembly" para entender lo que tenía que hacer, también Garry Lancaster me ayudó). Por eso la rutina necesita almacenar los datos en un nuevo buffer, usando el syscall RECV. Pero los datos deben ser pasado a la ZX ROM cada vez se alcanza el carácter 0x0D, y es posible que sigan más datos. Eso significa que cada vez INPUT# se corre, hay que probar si hay más datos que no ya ha pasado a INPUT #...

En cualquier caso, esta tarde he enviado un correo electrónico desde un programa que escribí en BASIC :-)
Tarjeta ethernet para el Spectrum - http://spectrum.alioth.net/doc

Debemos practicar un quirkafleeg
Avatar de Usuario
winston
Sabreman
 
Mensajes: 469
Registrado: Mar Ago 19, 2008 4:17 pm
Ubicación: Isla de Man

Re: Ethernet y ZX BASIC

Notapor mcleod_ideafix el Sab Jul 11, 2009 8:51 pm

winston escribió:Me había olvidado que es posible (hmm, creo que sería mejor decir - "es más probable" :-) ) que el otro ordenador pueda enviar datos mucho más rápidamente que un programa de BASIC pueda leerlos. Por eso tuve que añadir otro buffer para recibir datos para INPUT #.

¿Y retrasar el ACK de los paquetes recibidos hasta que no se procesen los que ya lo están? O quizás configurar la ventana deslizante de TCP para que sea menor... TCP permite control de flujo, así que tiene que haber algún parámetro (toca repasar el TCP illustrated) que permita "frenar" a un emior rápido.

winston escribió:En cualquier caso, esta tarde he enviado un correo electrónico desde un programa que escribí en BASIC :-)

Mola! No sé a quien, pero si fue a mi, no lo he recibido... :)
Web: ZX Projects | Twitter: @zxprojects
Avatar de Usuario
mcleod_ideafix
Johnny Jones
 
Mensajes: 3984
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera

Re: Ethernet y ZX BASIC

Notapor winston el Dom Jul 12, 2009 11:05 am

El W5100 tiene un pequeño motor de TCP que permite el Spectrum hacer otras cosas mientras los datos están en tránsito :-) Este chip fue hecho específicamente para sistemas de 8 bits (el día de hoy esto significa sistemas "embedded", pero funciona bien con cualquier sistema de 8 bits). Por eso, sólo tuve que escribir un librería de BSD sockets que dirige este motor de TCP, no tuve que escribir la implementación de TCP. (También es posible escribir un motor de TCP que no usa lo del W5100 - se puede escribir código que funciona al nivel de MAC con este chip).

Aunque el modulo puede tocar los buffers de ethernet directamente, no quiero hacer cosas así - quiero que el software pueda ser usado con cualquier chip, y por eso se usa el librería de sockets. Al fin y al cabo es posible que el W5100 no sea disponible en dos años y no quiero tener que escribir todos los modulos de nuevo.
Tarjeta ethernet para el Spectrum - http://spectrum.alioth.net/doc

Debemos practicar un quirkafleeg
Avatar de Usuario
winston
Sabreman
 
Mensajes: 469
Registrado: Mar Ago 19, 2008 4:17 pm
Ubicación: Isla de Man

Re: Ethernet y ZX BASIC

Notapor mcleod_ideafix el Dom Jul 12, 2009 2:22 pm

winston escribió:En cualquier caso, esta tarde he enviado un correo electrónico desde un programa que escribí en BASIC :-)

Doy fe de que el envío de correo funciona :D
Web: ZX Projects | Twitter: @zxprojects
Avatar de Usuario
mcleod_ideafix
Johnny Jones
 
Mensajes: 3984
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera


Volver a Noticias, eventos y presentaciones

¿Quién está conectado?

Usuarios navegando este Foro: No hay usuarios registrados visitando el Foro y 4 invitados