martes, 18 de junio de 2019

Primeros pasos con la M4 para un Amstrad CPC en red.

Este será el primer artículo que presento del mundo retro. Por supuesto lo hago desde el punto de vista de un novato completo y que además de experimentando he conseguido configurar todo con la inestimable ayuda de la gente de la scene de Amstrad que por cierto, está que arde, lo cual es una maravilla :-D.
Espero que esto valga de pequeña ayuda para aquellos que os iniciais como yo en el mundo del nuevo hardware existente para estos equipos.
En concreto voy a explicar lo que hice para disponer de red WiFi y otras ventajas mediante la tarjeta M4 para un Amstrad CPC6128.
Lo primero: si queréis ver un video de cómo es esta tarjeta y como montarla, tenéis un resumen muy bueno en este video.
Por mi parte me voy a parar en elementos un poco más técnicos y en ocasiones básicos para poder tener en funcionamiento este cacharrito.



A diferencia del que veis en el video, como veis en la imagen la tarjeta de que dispongo es de conector edge, y la primera duda que aparece es ¿Cuál es el derecho y cuál el revés? Bien, en la siguiente foto se ve como tiene que quedar conectado a nuestro Amstrad.




Lo que sobresale a la izquierda es la antena WiFi, y a la derecha se ve la tarjeta microSD. Cuando os llegue la M4 metedle una tarjeta cualquiera compatible, no es necesario agregarle nada pues la propia M4 creará el directorio y archivos necesarios para su funcionamiento. Eso sí, debe estar formateada en FAT32 (no probé con otros, formatos pero entiendo que no funcionará). Ah, y podéis estar tranquilos con la información que tengáis en dicha tarjeta pues no borra nada. Así si queréis tener unas ROMs pregrabadas pues sin problema.

Una vez conectada al Amstrad y con la microSD insertada encendemos el ordenador y la M4 volcará los archivos que comentaba antes a la M4. Mientras hace esta tarea además del led azul de encendido se encenderá también uno naranja. Al acabar se resetea y debe salir la versión de M4 que tenemos en la cabecera de arranque tras el BASIC 1.1. En mi caso sale

M4 Board V2.0.5B12



Si no fuera así (la cabecera es la de siempre), pulsa el botón de reseteo de la M4. Si no se te enciende el naranja es que no está accediendo bien a la microSD, probablemente esté mal insertada. Ajústala y mete otro reset.
Ahora disponéis ya de un "disco duro" para vuestro Amstrad que es la microSD. Si ejecutáis el comando

CAT

podréis ver como mínimo el directorio m4 donde la tarjeta ha metido ciertos archivos necesarios para el funcionamiento.
Disponéis ahora de ciertos comandos reservados hasta ahora al CP/M o sistemas operativos más actuales que permiten gestionar archivos y directorios (carpetas). Por ejemplo, si deseo crear un directorio denominado JUEGOS:

|mkdir,"JUEGOS"

para cambiar a dicho directorio:

|cd,"JUEGOS"

Las comillas finales como suele ser habitual son optativas.
Suponiendo que tenéis un archivo DSK que sea imagen de un disco, la M4 lo trata como un directorio más. Es decir, si tenéis por ejemplo dentro del directorio JUEGOS el archivo 1942.DSK podéis acceder a su contenido nuevamente con |cd,". Es decir:

|cd,"1942.DSK"



Si ejecutáis CAT veréis los archivos y podréis ejecutarlos con RUN como siempre.

Una cosa interesante es que aunque hagas un reset del Amstrad (CONTROL+MAYS+ESC) la M4 queda en el último directorio en el que estuviste.

Centrándonos en el tema de la red. Existe un comando para poder configurar la tarjeta de red de la M4 y conectarlo a la wifi que deseemos.
Antes de nada necesitamos conocer ciertos datos:
El nombre de la red a la que queremos conectarnos (conocido como SSID). Este es importante que sea exacto, incluido mayúsculas y minúsculas, ya que si no no se conectará. Y por supuesto la contraseña.  También las direcciones IP de los servidores de nombres (DNS, que traducen direcciones Web a IPs). Si no dispones de ninguno o no conoces puedes usar los de Google: 8.8.8.8 y 8.8.4.4
Con esto podemos ejecutar el comando de configuración de red con acceso automático (el conocido DHCP), que sería el siguiente:

|netset, "name=CPC6128, ssid=NombreDeRed, pw=LaPassword, dhcp=1, dns1=8.8.8.8, dns2=8.8.4.4"

Con el comando
|netstat
os informará del estado de la red. Si no hay red el mensaje será algo así como:
Unknown status 255



Si os sale esto puede ser por varios motivos: haber metido algún dato mal, que el dhcp (asignación automática de IP) no vaya,... Lo importante es que ha creado un archivo de configuración denominado config.txt dentro de la carpeta M4. Si cargais este archivo en un editor de texto de vuestro PC o Mac veréis algo así:

ssid= NombreDeRed
pw= LaPassword
name=CPC6128
dhcp=1
ip=0.0.0.0
nm=0.0.0.0
gw=0.0.0.0
dns1=8.8.8.8
dns2=8.8.4.4
tz=2


ntp=ntp.inet.tele.dk

La mejor solución es pasar del DHCP y meter IP fija. ¿Qué hace falta saber? Lo siguiente:
- Por un lado una IP libre dentro de tu red. Esa la pondrás en el campo ip.
- La máscara de subred. Sí, normalemente es 255.255.255.0 salvo en redes muy grandes. Esta la meterás en el campo nm (network mask).
- La IP del router. Normalmente en la mayoría de las casas es 192.168.0.1 o 192.168.1.1. Esto en el campo gw (Gateway).

Como curiosidad, ntp permite indicar un "servidor de tiempo" (Network Time Protocol), es decir, una dirección en internet de un servidor que da la hora de forma precisa. Mediante el campo tz se indica la zona horaria (Time Zone) en la que nos encontramos: la +2 es la de Europa Occidental salvo Portugal, UK y Canarias. Más información aquí.

El archivo puede quedar algo así:

ssid= NombreDeRed
pw= LaPassword
name=CPC6128
dhcp=0
ip=192.168.1.128 
nm=255.255.255.0 
gw=192.168.1.1
dns1=8.8.8.8
dns2=8.8.4.4
tz=2


ntp=ntp.inet.tele.dk

¡No olvides poner el campo dhcp a 0! Graba el archivo y vuelve a meter la SD en la M4. Ahora el comando |netstat te debería decir algo más bonito si has escrito todo correctamente. Algo así:



Esto significa que ya podemos descargar archivos de la red. Por supuesto hay que saber la dirección de donde quieres descargar el archivo. Por ejemplo puedes probar el ejemplo que viene en las instrucciones de la M4:

 |httpget,"spinpoint.org/battro.dsk"

Esto descarga el archivo battro.dsk en el directorio actual en el que estemos. Ojo, con este último detalle porque si anteriormente hemos ido al "interior" de un dsk con |CD no va a dar un error de "Not supported" debido a que no puede descargarlo ahí, lógicamente.
Puedes salir del DSK haciendo

|cd,".."

Como volver al directorio por encima en un Linux o Windows. Análogamente para volver al directorio raíz:

|cd,"/"

Otra utilidad muy interesante es el uso del servidor Web de la M4. Me explico: la tarjeta M4 dispone de un programita siempre en ejecución que permite desde cualquier navegador de un ordenador que esté en la misma red (o incluso en otra si se dispone del router debidamente configurado) conectarse a él.
¿Y que permite esto? Pues que desde un ordenador remoto con un navegador como Firefox, Safari o Vivaldi se puedan manejar ciertos elementos de la M4 y por tanto del propio ordenador. Entre ellos volcar archivos del ordenador remoto al Amstrad, ejecutar programas, pausar la ejecución de un programa, poder seleccionar una ROM para el arranque, y otras utilidades. En este artículo veremos alguna sencilla.
Si se dispone de la red configurada tal y como se comentó antes, puedes abrir un navegador en cualquier PC o móvil cercano y en la barra de la URL mete:

http://ip_de_la_m4

Por ejemplo según la configuración anterior:

http://192.168.1.128

En el caso de tener un ordenador con Windows, la M4 también permite usar el protocolo NETBIOS y por tanto usar el nombre (name) que se haya puesto en el archivo config.txt. Por ejemplo:

http://CPC6128

Esto último en principio no es directamente posible desde Linux o macOS, pero cambiado el archivo /etc/hosts y añadiendo línea para dirigir la dirección a la IP del servidor Web del Amstrad (Agradecimientos a Isaac Palacios por esta última aportación en comentarios):

192.168.1.128 CPC6128

Esto habría que realizarlo en cada ordenador desde el que se quiera acceder (o podría montarse un servidor DNS en casa pero eso sería fuente ya para otro artículo ;-))
Ah, recuerda poner tu IP del Amstrad si no es la misma que uso yo.

En cualquier caso mediante la IP siempre funciona.
Cuando está hecha la conexión sale una imagen como la siguiente:


En la parte superior hay 4 pestañas. No voy a explicar al menos en este artículo todas (más que nada porque aún no sé usarlas -_-' ). Pulsa la cuarta, Settings, y ahí se puede ver precisamente la configuración que establecimos previamente en el archivo config.txt. Bien, pues esta pestaña es una forma simple de cambiar cualquiera de estos parámetros.



Pulsa ahora en la pestaña Files. Desde aquí se puede acceder al sistema de archivos de la microSD de M4, es decir, a sus carpetas y archivos.
En la parte inferior nos permite crear nuevas carpetas en la caja de texto "Make Dir". Un poco más abajo se puede navegar por las distintas carpetas. Entiende que los cambios de carpeta que hagas aquí, realmente se están haciendo en el Amstrad, es decir, si pulsas en la carpeta [JUEGOS] es como si en el Amstrad hubieras tecleado el comando:

|cd,"JUEGOS"



Pero cuidado, los cambio no afectan al Amstrad, es decir, cambiar desde la Web no te cambia en el CPC.
Si te fijas las carpetas aparecen entre corchetes [ ] y los archivos no. Esto es interesante porque lo DSK también aparecen entre corchetes ya que como comentamos antes para la M4 los dsk son como directorios.
Desde aquí también se permite borrar un archivo (pulsando el botón Delete) o carpeta y también ejecutarlo (solo los archivoss, claro, pulsando el botón Run). Ojo, hay algunos programas que no pueden ser ejecutados desde aquí, pero son los que menos.

Un par de carpetas interesantes son [BACK] que permite volver al directorio por encima del actual (equivalente al |cd,".."). Y [REFRESH] la cual refresca la página Web por si se han hecho cambios desde el propio Amstrad o desde otra Web distinta de la actual.
No, aún no sé para que sirve [CD ON CPC] pero todo se andará :-)

Para acabar en la parte de arriba de esta pestaña Files se encuentra la zona de volcado. Se puede hace mediante "Seleccionar Archivo" y luego "Upload" o más fácil, arrastras desde el sistema de ventanas un archivo a la zona Upload (drag and drop) y los sueltas. Este archivo será copiado al directorio seleccionado en este momento (se ve en la parte inferior en Current Directory).

Y hasta aquí este artículo de iniciación a la M4. En realidad es una ampliación de unos apuntes que me fui haciendo a medida que iba realizando pruebas en esta estupenda tarjeta. Y espero que os sea útil a aquellos que os cojáis una tarjetita de estas.





sábado, 16 de febrero de 2019

Problema con nextInt() y las Excepciones.

Cuando hacemos una lectura de un número entero con el método nextInt() de un objeto Scanner, puede saltar la excepción InputMismatchException que si no la gestionamos bien en un bucle puede resultar en bucle infinito. Un ejemplo:

        boolean comprueba;
        Scanner sc = new Scanner(System.in);
        int numero;
        do{
            try{
                comprueba = false;
                System.out.println("Introduce un número entero");
                
                numero=sc.nextInt();
              
                 
            }catch(java.util.InputMismatchException e){
             
                System.out.println("Error, inténtalo de nuevo.");
                comprueba=true;
                 
            }
        }while(comprueba); 

Si ejecutas este código y metes una letra en lugar de un número verás dicho bucle infinito. Esto sucede porque el nextInt trata de leer algo que no puede y lanza la excepción, ¡¡Pero no llega a leer el dato y por tanto dicho dato inválido queda en el buffer de teclado!! Esto conlleva que a la siguiente vuelta del bucle vuelva a leer el dato incorrecto pues sigue a la espera de ser leído. Solución: muy simple, meter un nextLine pero en el  catch de forma que se recoja ese dato inválido.
Algo así:

        boolean comprueba;
        Scanner sc = new Scanner(System.in);
        int numero;
        do{
            try{
                comprueba = false;
                System.out.println("Introduce un número entero");
                
                numero=sc.nextInt();
              
                 
            }catch(java.util.InputMismatchException e){
             
                System.out.println("Error, inténtalo de nuevo.");
                comprueba=true;
                sc.nextLine(); //La solución es esta.
                 
            }
        }while(comprueba); 

Lo que se comenta anteriormente es válido también para nextDouble y otros métodos next.