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
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
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:
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!!