Combinando ficheros TOSEC

Foro dedicado a la emulación de sistemas clásicos en el PC o en otros sistemas.
Avatar de Usuario
zup
Amiga 2500
Amiga 2500
Mensajes: 2816
Registrado: 04 Sep 2009, 20:07
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo DS/3DS
Primera consola: Nintendo GameBoy
Ubicación: Navarra
Gracias dadas: 51 veces
Gracias recibidas: 226 veces
Contactar:

Combinando ficheros TOSEC

Mensajepor zup » 20 May 2020, 12:37

Estos días de parón he estado organizando un poco las ROMs que tenía descargadas. Cuando vas encontrando viejos ficheros con nombres crípticos, las herramientas tipo Romcenter y Clrmamepro son una gran ayuda, pero hay que conseguir ficheros .dat para que cumplan su función.

Hay páginas como el DAT-o-MATIC que generan sus .dat según nuestras preferencias, pero los que se llevan la palma son los de TOSEC. TOSEC apunta a tener una base de datos exhaustiva de todo lo que se ha dumpeado, de una manera bastante organizada, y provee ficheros .dat de casi todos los sistemas imaginables.

¿El problema? Que son demasiado organizados. Para cada sistema proveen ficheros .dat separados por tipo de programa (juegos, sistema, aplicaciones, revistas) y tipo de fichero (p.ej.: sna, z80, tap). Así que para el ZX Spectrum tienes 162 ficheros diferentes y (salvo que haya herramientas de renombrado por línea de comandos) usar estos ficheros con romcenter o clrmamepro es un peñazo.

Así que aquí ofrezco mi solución... un script en linux que coge todos los ficheros .dat de un directorio y los une en un solo fichero. De esta manera, solo cargamos un fichero en nuestro gestor de ROMs y podemos renombrar cualquiera.

Código: Seleccionar todo

#!/bin/bash

cabecera=$(mktemp)
cuerpo=$(mktemp)
cola=$(mktemp)
destino=megadat.dat.tmp

for fichero in *.dat
do
  echo Procesando $fichero ...
  primera_linea=$(grep -n "<game" "$fichero" | head -n1 | cut -d: -f1)
  lineas_cabecera=$((primera_linea-1))
  linea_final=$(grep -n "</dataf" "$fichero" | head -n1 | cut -d: -f1)
  ultima_linea=$((linea_final-1))

  head -n$ultima_linea "$fichero" | tail -n +$primera_linea >> $cuerpo
done

head -n$lineas_cabecera "$fichero" >> $cabecera
tail -n +$linea_final "$fichero" >> $cola

cat $cabecera > $destino
cat $cuerpo >> $destino
cat $cola >> $destino

rm $cabecera
rm $cuerpo
rm $cola

echo Fichero creado como $destino
echo No olvides editar la cabecera.


Es un script bastante tonto... no comprueba que el formato del .dat sea correcto, y busca ficheros .dat a piñon fijo. El fichero creado se llama megadat.dat.tmp, ya que es buena idea editar la cabecera para que nuestro gestor de ROMs muestre datos correctos antes de usarlo. Por otra parte, si lo usas con sistemas con muuuucho software editado genera unos ficheros enormes (p.ej.: 150 megas en el caso del C64).

Es un script pensado solo para una función, pero seguro que alguien tiene el mismo problema o puede modificarlo para otras cosas.

NOTA 1: ¿Alguien se acuerda de las herramientas Goodxxx? En su día fueron bastante útiles, y estaría bien tener una utilidad de ese palo para renombrar por línea de comandos... pero si mal no recuerdo, tiraban de su propia base de datos y ya están bastante actualizadas.

NOTA 2: Hablando de .dat y hashes y esas cosas... no termino de estar convencido del planteamiento que sigue MAME con sus hashes (en el caso del software). En la mayoría de sistemas con disco, se tiran al formato IPF... pero no sé de dónde sacan sus originales (sus hashes no parecen coincidir con ningún volcado de los que están disponibles desde hace años) ni qué criterio siguen para determinar si un disco está sin alterar (¿después de 30 años?). En otros casos, su base de datos es prácticamente inexistente... el resultado es que el usuario medio no tiene manera de casar su software bajado con MAME.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start.
Además vendo cosas!

Avatar de Usuario
zup
Amiga 2500
Amiga 2500
Mensajes: 2816
Registrado: 04 Sep 2009, 20:07
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo DS/3DS
Primera consola: Nintendo GameBoy
Ubicación: Navarra
Gracias dadas: 51 veces
Gracias recibidas: 226 veces
Contactar:

Re: Combinando ficheros TOSEC

Mensajepor zup » 21 May 2020, 10:37

Versión mejorada (espero) del script anterior...

Código: Seleccionar todo

#!/bin/bash

cuerpo=$(mktemp)
i=1
while [ $i -le $# ]
do
  fichero=${!i}
  if [ -f "$fichero" ]
  then
    lineas_cabecera=$(grep -n "</head" "$fichero" | head -n1 | cut -d: -f1)
    primera_linea=$((lineas_cabecera+1))
    linea_final=$(grep -n "</dataf" "$fichero" | head -n1 | cut -d: -f1)
    ultima_linea=$((linea_final-1))
    head -n$ultima_linea "$fichero" | tail -n +$primera_linea >> $cuerpo
    fichero_valido="$fichero"
  fi
  let i++
done

if [ -f "$fichero_valido" ]
then
  head -n$lineas_cabecera "$fichero_valido"
  cat $cuerpo
  tail -n +$linea_final "$fichero_valido"
fi

rm $cuerpo


Los cambios:
- El script ya no busca todos los ficheros .dat, sino que hay que decirle qué ficheros queremos agrupar.
- El script ya no crea un fichero de salida, sino que saca el nuevo dat por la salida estándar.
- El script necesita bash para ejecutarse. O se lanza con bash, o se le pone el atributo de ejecutable y se lanza normalmente.
- Por tanto, el uso sería unir_dat.sh <ficheros> (p.ej.: bash ./unir_dat.sh *Books* > nuevo_dat.temp).

A tener en cuenta:
- Salvo ver si existen, no se valida de ninguna manera los ficheros de entrada. Por lo tanto, este script hará cosas raras si se le mete un fichero que no es un dat.
- Se admiten comodines, pero no se recorren subdirectorios.
- La cabecera que sale corresponde al último fichero válido que se procesó. Como indiqué en el post anterior, es perfectamente válida pero sería recomendable editarla para no confundirnos.

Nota: lo único que es propio de bash es la línea 19 (let i++). Supongo que podría buscar una instrucción equivalente para incrementar el bucle y que sea 100% compatible con sh.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start.
Además vendo cosas!


Volver a “Emuladores”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado