Ayuda con script de linux

Aquí solo proyectos que incluyan el código fuente

Moderador: Fundadores

Reglas del Foro
Si no se incluyen los fuentes, se debe usar el foro de proyectos de software generales
Avatar de Usuario
javu61 !Sinclair QL
Fundador
Fundador
Mensajes: 2175
Registrado: 30 Mar 2013, 11:58
Ubicación: Valencia
Been thanked: 76 times
Contactar:

Re: Ayuda con script de linux

Mensaje 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.
Larga vida y prosperidad \\//_
Avatar de Usuario
Querubin
Demonio tercer orden
Demonio tercer orden
Mensajes: 635
Registrado: 15 Ene 2016, 00:01
Ubicación: Totana

Re: Ayuda con script de linux

Mensaje 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.
poco a poco
Avatar de Usuario
Querubin
Demonio tercer orden
Demonio tercer orden
Mensajes: 635
Registrado: 15 Ene 2016, 00:01
Ubicación: Totana

Re: Ayuda con script de linux

Mensaje 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.
poco a poco
Avatar de Usuario
overCLK !CPC 4
Demonio segundo orden
Demonio segundo orden
Mensajes: 1709
Registrado: 14 Ago 2015, 09:28
Ubicación: Vedra
Has thanked: 3 times
Been thanked: 4 times

Re: Ayuda con script de linux

Mensaje 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.
Imagen
Avatar de Usuario
overCLK !CPC 4
Demonio segundo orden
Demonio segundo orden
Mensajes: 1709
Registrado: 14 Ago 2015, 09:28
Ubicación: Vedra
Has thanked: 3 times
Been thanked: 4 times

Re: Ayuda con script de linux

Mensaje 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
Imagen
Avatar de Usuario
Querubin
Demonio tercer orden
Demonio tercer orden
Mensajes: 635
Registrado: 15 Ene 2016, 00:01
Ubicación: Totana

Re: Ayuda con script de linux

Mensaje 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?
poco a poco
Avatar de Usuario
overCLK !CPC 4
Demonio segundo orden
Demonio segundo orden
Mensajes: 1709
Registrado: 14 Ago 2015, 09:28
Ubicación: Vedra
Has thanked: 3 times
Been thanked: 4 times

Re: Ayuda con script de linux

Mensaje 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.
Imagen
Avatar de Usuario
overCLK !CPC 4
Demonio segundo orden
Demonio segundo orden
Mensajes: 1709
Registrado: 14 Ago 2015, 09:28
Ubicación: Vedra
Has thanked: 3 times
Been thanked: 4 times

Re: Ayuda con script de linux

Mensaje 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
No tiene los permisos requeridos para ver los archivos adjuntos a este mensaje.
Imagen
Avatar de Usuario
Querubin
Demonio tercer orden
Demonio tercer orden
Mensajes: 635
Registrado: 15 Ene 2016, 00:01
Ubicación: Totana

Re: Ayuda con script de linux

Mensaje 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.
poco a poco
Avatar de Usuario
overCLK !CPC 4
Demonio segundo orden
Demonio segundo orden
Mensajes: 1709
Registrado: 14 Ago 2015, 09:28
Ubicación: Vedra
Has thanked: 3 times
Been thanked: 4 times

Re: Ayuda con script de linux

Mensaje 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.
Imagen
Responder

Volver a “Proyectos de software abiertos”