Página 4 de 5

Re: Ayuda con script de linux

Publicado: 05 Jul 2016, 09:12
por javu61
Realmente si debería dar igual, los discos del Commodore se conectan por un puerto serie por tanto al recibir el comando lo puedes procesar en cualquier sistema de archivos, sería mas sencillo usar FAT pues hay muchas utilidades que lo manejan, incluso hay un cable que conectas el C64 a un PC, y con un programa recibe los comandos y los va devolviendo desde el sistema de ficheros del Windows. En este caso por lo que he visto el autor ha decidido respetar el original, que quizá también sea mas sencillo de implementar a bajo nivel.

Re: Ayuda con script de linux

Publicado: 05 Jul 2016, 16:56
por Querubin
Desde luego poder trabajar en FAT evitaría muchos quebraderos de cabeza. Al fin y al cabo el interfaz hace de intercambio de datos.

Re: Ayuda con script de linux

Publicado: 06 Jul 2016, 08:28
por Querubin
He separado las roms en carpetas de menos de 256 archivos cada una y cuando trato de copiar una sola de estas carpetas me devuelve un error de comando desconocido que entra en bucle. Cuando entro en el directorio copiado con el frontend y hago un ls salen un montón de archivos,supongo que todos, pero entra en bucle también y no para. Ambas veces tengo que hacer CTRL+C.

Desde luego copiar copia y directorios. Y subdirectorios también. Así que no vas nada desencaminado.

EDITO: He ejecutado la orden de copiar la carpeta de roms con sus subcarpetas y voy a dejarlo unas horas. No vaya a ser que lo de comando desconocido sea la orden de busqueda de notificación de "archivo copiado correctamente" o algo así. Como no entiendo de código me lo invento jeje.

Re: Ayuda con script de linux

Publicado: 06 Jul 2016, 10:58
por overCLK
Hola.

Le he estado echando un vistazo a esto y poniendo algo de debug en la implementación del FS, y parece que la copia siempre se rompe en el mismo sitio, independientemente de lo grande que sea el disco duro (imagen en mi caso). Veo esto en unix.c:
block_t totalDiskSize = 100000; /* TODO: get this number from the
                                   actual hard drive */
Lo que limita el formateo a esa cantidad de bloques. Como cada bloque de este sistema de ficheros es de 512 bytes, eso supone unos 50MB si mis cuentas no están equivocadas. Por eso daba igual lo grande que fuera mi imagen, que siempre llegaba como mucho a tu directorio de ROMs: AS-AT

Lo ideal sería, como dice ahí, calcular el tamaño a partir del disco o la imagen. Luego por la tarde intento ver como se puede hacer de modo que funcione tanto en un dispositivo físico como en una imagen, supongo que con un fseek hasta el final o algo así.

De momento, si quieres puedes probar a cambiar ese totalDiskSize a un valor mayor y ver si así llega más adelante. Calcúlalo como tamaño del disco en bytes / 512, recompila (haz de nuevo make en el directorio unix) y prueba con el nuevo iecata (tienes que volver a formatear, que es lo que va a cambiar con el nuevo iecata).

He hecho una pequeña chapuza en el script para que te deje elegir el directorio de ROMs de cualquier sitio, de manera que si le pasas:

upload.sh /tmp/ROMS c64.img

meterá en el disco lo que hay a partir de /tmp/ROMS correctamente ajustando los paths (eliminando el /tmp/ROMS del directorio destino). No es muy elegante pero no se me ocurrió nada mejor. :)

Solo tienes que cambiar el comando find + awk que genera los comandos por esto:
find $INPUT_DIR -type f | \
    sed -e "s%$INPUT_DIR[\/]*%%g" -e '/^ *$/d' | \
    awk -F'/' -v inputDir="$INPUT_DIR" '{ 
    for (i=1; i<NF; i++) { 
        print "mkdir",$i 
        print "cd",$i 
    } 
    printf("import %s/%s %s\n",inputDir, $0,$NF)
    for (i=1; i<NF; i++) {
        print "cd .."
    }
}
END { print "q" } ' > $TMPFILE
Es decir, metemos un sed en medio que elimina la parte del INPUT_DIR (mas un / opcional al final) y también las líneas vacías que puedan quedar tras hacer esto. Por otro lado hay que pasar el INPUT_DIR al awk para que sepa recomponer el path origen del fichero.

Re: Ayuda con script de linux

Publicado: 06 Jul 2016, 13:44
por overCLK
Comentar que he hecho una función para obtener el tamaño de la imagen y con eso he conseguido grabar todo tu juego de ROMs en una imagen de 2Gb sin problemas aparentes.

Por la tarde lo amplío para que funcione también con discos físicos y te paso las modificaciones al unix.c

Re: Ayuda con script de linux

Publicado: 06 Jul 2016, 13:50
por Querubin
Ok, del mensaje anterior nada entonces. Menos mal.

Pero no te da error y puedes listar el directorio sin problema en el front end?

Re: Ayuda con script de linux

Publicado: 06 Jul 2016, 14:24
por overCLK
querubin escribió:Ok, del mensaje anterior nada entonces. Menos mal.

Pero no te da error y puedes listar el directorio sin problema en el front end?
No, no da error. El problema es que ese frontend solo formatea unos 50Mb, cuando has llenado esa cantidad, ya no mete más.

Necesitas un parche para el unix.c que espero pasarte por la tarde.

Re: Ayuda con script de linux

Publicado: 06 Jul 2016, 18:07
por overCLK
Hola de nuevo. Aquí te dejo un zip con dos cosas:

- Un script upload.sh que elimina la necesidad de tener las ROM en el mismo directorio, ya que evita la creación del path completo en destino.
- Un unix.c modificado para que calcule el tamaño del disco o de la imagen para formatear correctamente todo el espacio.

Tienes que sustituir el unix.c que tienes en la carpeta software/linux y volver a generar el iecata ejecutando 'make'.
Luego tienes que volver a formatear el disco o imagen destino, porque el problema estaba en el formateo que siempre era de tamaño fijo (unos 48Mb)

Con esto yo he sido capaz de grabar en una imagen todas tus ROMs creo que correctamente. Ya me contarás.
upload.zip

Re: Ayuda con script de linux

Publicado: 06 Jul 2016, 20:12
por Querubin
Buenas,

a ver por donde empiezo...

TE ADORO :))

Paso a paso:
abro el frontend y lo primero device xxxxxxxx(sectores correctos detectados).
formateo y se pega su tiempo razonable para un formateo(cosa que antes hacía rapidísimo) y empieza un error en bucle "No puedo encontrar el bloque" así que corto.

No me deja ejecutar el upload.sh hasta que en propiedades le marco a la opción de que pueda ser ejecutado como un programa.
Ejecuto con los paths correspondientes. Se pega un rato y aparece el promp otra vez sin errores ni ningún otro mensaje.

Abro frontend y se ha copiado el contenido de la carpeta ROMS(no la carpeta roms, perfecto). Es decir, se ha copiado aparentemente todo.

Lo he probado enseguida en el C64 y funciona lo que he probado. El estado de las roms es otro tema. Pero funciona, entro en directorios y subdirectorios sin problema. Ejecuto y funciona. Por cierto, no se salir de un directorio en el C64.
No se si se habrá formateado el disco por completo por el error pero me ha dejado hacerlo todo.

Así que ya lo tienes, ahora solo es pulir.
-En esta ocasión el error de "No puedo encontrar el bloque".
-Por otro lado, una cosa que quería comentarte. Por lo visto el unix.c que usas es el anterior por lo que, cuando escribes "s" en el frontend no reconoce la orden. En arananet tienes la nueva versión ya corregida. Es un detalle pero ahora toca eso ¿No?.
-Y bueno, si se puede hacer que upload.sh venga ya como ejecutable mejor.

He detectado alguna otra mejora pero tu marcas el ritmo y los límites. Desde luego, estoy contentísimo porque el objetivo principal está conseguido. No se podía, pero si se ha podido.

Re: Ayuda con script de linux

Publicado: 06 Jul 2016, 21:09
por overCLK
Me alegro de que te haya funcionado. :)

La verdad es que no sé que es eso de la opción 's' del frontend. Supongo que el ejecutable iecata es a lo que llamas frontend, ¿no?
En realidad los cambios al unix.c son una tontería, sólo es calcular el tamaño del disco o del fichero para usarlo a la hora de formatear. Si quieres te puedo pasar los cambios para que los apliques sobre la versión que quieras, si no son muy diferentes supongo que aplicarán limpiamente.

Tendría que hacerme con uno de estos cacharros para animarme a mejorar esto de verdad. :)

Quizá a estas alturas lo más práctico sería escribir otro programa similar al iecata, pero con más opciones y mejoras, se me ocurren así a bote pronto:
- Creación de directorios de forma recursiva. Es decir, que si le digo mkdir bar/foo/c64 me cree toda la estructura (al estilo del mkdir -p de unix)
- Copia recursiva (como el cp -r de unix).
- Modo no interactivo para utilizar desde scripts de manera que podamos indicar opciones en la línea de comandos y que devuelva unos códigos significativos de qué ha pasado.

Sobre el error de "No puedo encontrar el bloque", a mi no me ha pasado, pero es que yo no estoy usando el programa para escribir en discos duros sino en imágenes de fichero. Viendo los fuentes, significa que intenta leer un bloque del disco o del fichero y no le devuelve el número de bytes esperado, probablemente porque se ha pasado del final del fichero o del disco por alguna razón. Habría que añadir algo de depuración ahí y ver exactamente qué pasa.