Proyecto tontuno... conversor de snapshots a transfer

Emuladores y aplicaciones que ayudarán a la perpetuación del Spectrum y su software en el futuro

Moderador: Sir Cilve Sinclair

zup
Freddy Hardest
Mensajes: 666
Registrado: Vie Ago 15, 2008 2:43 pm

Proyecto tontuno... conversor de snapshots a transfer

Mensaje por zup » Sab Mar 24, 2018 11:02 am

No recuerdo si he hablado antes de esto... para volver a coger soltura con C, he decidido hacer un programita que puede traer recuerdos a los veteranos. Es un proyecto muy corto que será a largo plazo, ya que se está viendo constantemente interrumpido por el trabajo, la familia y mi vagancia.

Presentamos... el conversor de snapshot a transfer.

OBJETIVO: Crear un programa que lea un fichero snapshot en el PC y genere un fichero de cinta que contenga ese juego pero usando un cargador de un transfer.

EJEMPLO: Por ejemplo, convertir un fichero SNA en un TAP usando el cargador del transtape (BASIC, CODE 16384,75, bloque sin cabecera de 49052 bytes y la corrupción típica que sale en pantalla). En principio, mi primera versión hará exactamente eso.

CARACTERÍSTICAS:
- Se contempla el soporte de ficheros SNA, SP (Pedro Gimeno) y Z80.
- Se contempla el soporte de diferentes transfers (Transtape, Phoenix, Dynamid 3, Máquina alucinante, Pokeador automático, HILOW).
- Se contempla soportar las "optimizaciones" (bajo ciertas condiciones, Phoenix acortaba los juegos para que tardaran menos en cargar).
- Se contempla extender el soporte de algunos transfers (p.ej.: cargar juegos de 128k al estilo Transtape).
- Se contempla hacer que los juegos carguen completamente desde BASIC. En principio esto solo estaría soportado en snapshots de 48k que se cargaran en máquinas de 128k (la idea es poder copiar todos los bloques a discos del +3 y que carguen sin problemas).
- De momento, no se contempla soportar las cargas turbo de algunos transfers (Phoenix).

En principio, mi primer experimento será hacer el conversor de SNA a Transtape... con tiempo añadiré el resto de cosas. Probablemente una de las siguientes cosas que haga será meter el soporte de Phoenix o extender el de Transtape.

Ya sé que hay conversores de snapshot a tap, pero quería rendir homenaje a esas cintas de juegos copiados que tenían rayas delatoras...

De momento, el programa sna2transtape (convierte de sna a cintas estilo transtape) puede ser descargado desde mi blog.
Última edición por zup el Sab Jun 27, 2020 7:57 pm, editado 2 veces en total.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start...

zup
Freddy Hardest
Mensajes: 666
Registrado: Vie Ago 15, 2008 2:43 pm

Re: Proyecto tontuno... conversor de snapshots a transfer

Mensaje por zup » Lun Mar 26, 2018 3:24 pm

Primera cutreversión de pruebas...

¿Qué hace? No mucho. Es un programa de línea de comandos que abre el fichero que se le indica y lo intenta convertir a un tap calcado a los que saca el transtape.

Errores/Features conocidos:
- No valida que el fichero original sea un SNA de 48k correcto (49179 bytes).
- Genera un fichero con nombre TRANSTAPE.TAP. Ni deja elegir el nombre de fichero, ni comprueba que no exista ya.
- Los juegos convertidos salen con el nombre 1942.
- No controla casi ningún error que se pueda encontrar.

Por lo menos sirve para validar el concepto. Ahora toca pulirlo (control de errores, gestionar los argumentos de la línea de comandos, y esas cosas) y luego lo convertiré en algo más universal.
Última edición por zup el Lun Abr 23, 2018 7:25 pm, editado 3 veces en total.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start...

hikoki
Freddy Hardest
Mensajes: 657
Registrado: Sab Nov 23, 2013 8:27 am

Re: Proyecto tontuno... conversor de snapshots a transfer

Mensaje por hikoki » Mar Mar 27, 2018 3:11 am

No es esto lo que necesitaba el autor de Dark Hospital?
Una aplicacion con la que es facil crear cintas a partir de snapshots, puedes elegir cargadores turbo, efectos de carga vistosos,etc. Tambien arreglar cintas para gente que no sepa sobre bloques para que la carga no sea problematica con algunos emuladores..por ejemplo los juegos rusos de la zxdev17

zup
Freddy Hardest
Mensajes: 666
Registrado: Vie Ago 15, 2008 2:43 pm

Re: Proyecto tontuno... conversor de snapshots a transfer

Mensaje por zup » Mar Mar 27, 2018 7:12 pm

El objetivo de esta aplicación (al margen de que yo reaprenda C) es hacer un homenaje a las copias piratas que circulaban por ahí hechas con transfers. Creo que hay otras utilidades que hacen el mismo trabajo, pero a su bola.

En el caso de los transfers que he mirado, estoy seguro de que el Phoenix y La Máquina Alucinante pueden hacer copias turbo (4 velocidades) ya que puede usar sus propias rutinas de carga/grabación. No recuerdo si algún "primo" del Phoenix puede hacer también copias turbo. En cuanto a efectos multicolor y esas cosas, no sé si alguno lo hace... casi seguro que alguno tiene rayas pero en colores diferentes a los normales.

Ten en cuenta que, al ser homenaje a los transfers, va a haber corrupción de pantalla sí o sí. Eso desluce un poco la presentación de algunos juegos, pero es lo que pasaba con las cintas piratas.

P.D.: En principio solo voy a soportar ficheros .tap. Estos ficheros no almacenan la información de los timings de los bloques turbo, por lo que no voy a soportar cargas turbo. De cualquier manera, tampoco tengo muestras de juegos grabados así para extraer los datos.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start...

zup
Freddy Hardest
Mensajes: 666
Registrado: Vie Ago 15, 2008 2:43 pm

Re: Proyecto tontuno... conversor de snapshots a transfer

Mensaje por zup » Vie Mar 30, 2018 4:17 pm

Segunda versión de pruebas...

¿Qué hace ahora? Es un programa de línea de comandos que abre los ficheros que se le indican y los convierte a un tap con carga estilo al transtape.

Mejoras a la versión anterior:
- Valida el tamaño y (hasta cierto punto) el contenido de los ficheros antes de intentar convertirlos.
- El nombre del fichero tap es el mismo que el del fichero original (pero con la nueva extensión).
- Se incluye una pequeña ayuda (aparece si usamos -h o si ejecutamos sin parámetros).
- Se añade el switch -f que fuerza el modo 48k. Esto permite que ciertos juegos (p.ej.: Jet Pac) funcionen en máquinas de 128k.
- Se añade el switch -v que muestra todo lo que va haciendo el programa.
- Los juegos convertidos ahora salen con el nombre "Loader" o "Loader48" (para los que usan modo 48k).
- Mejor control de errores.

Errores/Features conocidos:
- Faltan por implementar los switches -b y -n.
Última edición por zup el Lun Abr 23, 2018 7:25 pm, editado 1 vez en total.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start...

zx81
Freddy Hardest
Mensajes: 619
Registrado: Vie Dic 28, 2007 2:14 pm
Ubicación: Valencia
Contactar:

Re: Proyecto tontuno... conversor de snapshots a transfer

Mensaje por zx81 » Vie Mar 30, 2018 5:42 pm

Una sugerencia: siendo como es una utilidad de línea de comandos, si pones los fuentes en github o similar, podemos echarte una mano y, de paso, hacer que se pueda utilizar también desde Linux, por ejemplo.

My 5 cents...
Debido al fallo de un mecanismo, el lanzagranadas M203 se te podía disparar cuando menos lo esperaras, lo que te habría hecho bastante impopular entre lo que quedara de tu unidad.
Revista del ejército EE.UU. PS, agosto 1993.

Emulador JSpeccy
ZXBaremulator

zup
Freddy Hardest
Mensajes: 666
Registrado: Vie Ago 15, 2008 2:43 pm

Re: Proyecto tontuno... conversor de snapshots a transfer

Mensaje por zup » Sab Mar 31, 2018 9:04 am

zx81 escribió:Una sugerencia: siendo como es una utilidad de línea de comandos, si pones los fuentes en github o similar, podemos echarte una mano y, de paso, hacer que se pueda utilizar también desde Linux, por ejemplo.
Es un proyecto que estoy haciendo para reaprender C, de momento lo de Github está totalmente descartado por varias razones (tener que aprender cómo funciona github, ocuparme de que lo que hago en mi equipo y lo de github esté sincronizado, no es un proyecto que necesite colaboraciones).

Sin embargo, sí que crearé una página web con mis proyectos en C y sí que dejaré los fuentes disponibles para descargar. Si alguien quiere hacer un fork y subirlo a github no tengo ningún problema.

En cuanto al código fuente, pues es bastante chapucero. He intentado separar rutinas y datos a lo largo de varios ficheros para hacerlo algo más claro y extensible, pero poco más.

El proyecto lo estoy haciendo con Code::blocks y el compilador MinGW que incluye, y utiliza librerías C estándar. En teoría (no lo he comprobado) debería compilar y funcionar sin problemas en Linux, pero con dos inconvenientes:
- No se controla el endian en la mayoría de los sitios. El Z80 y mi AMD son big endian, por lo que no hay problemas. Además, las funciones que uso para POKEar y PEEKear sí que tienen en cuenta eso, por lo que creo (insisto: creo) que en arquitecturas little endian solo habría bugs cosméticos (p.ej.: los registros que se muestran usando la opción -v).
- La cabecera de los ficheros SNA tiene un número de bytes impar (y empieza con el registro I, que es de 8 bits) por lo que he tenido que usar una directiva del compilador para que esta estructura esté empaquetada (si no, el compilador define ese byte como dos bytes y la lía). Esta directiva varía de compilador a compilador y de sistema a sistema.

Afortunadamente, como ya me olía algún problema, en las definiciones de datos del Spectrum no uso nunca char ni integer, sino los tipos uint8t y uint16t que garantizan la longitud exacta de 8 y 16 bits. Eso debería facilitar las cosas para portarlo entre sistemas.
Última edición por zup el Lun Abr 23, 2018 7:25 pm, editado 1 vez en total.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start...

zup
Freddy Hardest
Mensajes: 666
Registrado: Vie Ago 15, 2008 2:43 pm

Re: Proyecto tontuno... conversor de snapshots a transfer

Mensaje por zup » Lun Abr 02, 2018 9:51 am

Pequeña actualización:
- Había metido la zarpa a base de bien con las interrupciones (siempre se quedaba en IM1, deshabilitadas). Ya está corregido.
- Tengo mis dudas acerca de si el valor de R es correcto en todos los casos (creo que puede estar movido 2 arriba o abajo), aunque creo que es correcto.
- Ya está casi listo para que implemente el switch -b. Ya tengo escritas las partes del Z80 y solo hace falta integrarlas con el resto.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start...

zx81
Freddy Hardest
Mensajes: 619
Registrado: Vie Dic 28, 2007 2:14 pm
Ubicación: Valencia
Contactar:

Re: Proyecto tontuno... conversor de snapshots a transfer

Mensaje por zx81 » Lun Abr 02, 2018 2:24 pm

He bajado los fuentes y los he compilado en Linux, tanto en 32 como en 64 bits. Después he convertido un SNA y funciona correctamente.

Al compilar solo me han salido estos warnings:
main.c: En la función ‘leer_cabecera’:
main.c:118:24: aviso: formato ‘%i’ espera un argumento de tipo ‘int’, pero el argumento 2 es de tipo ‘long unsigned int’ [-Wformat=]
printf ("* %5i bytes\n",sizeof(cabecera));
~~^
%5li
main.c: En la función ‘procesar_ficheros’:
main.c:328:42: aviso: se pasa el argumento 2 de ‘fgetpos’ desde un tipo de puntero incompatible [-Wincompatible-pointer-types]
fgetpos(fichero_snapshot,&filesize);
^
In file included from main.c:1:0:
/usr/include/stdio.h:731:12: nota: se esperaba ‘fpos_t * restrict {también conocido como struct <anónimo> * restrict}’ pero el argumento es de tipo ‘long long int *’
extern int fgetpos (FILE *__restrict __stream, fpos_t *__restrict __pos);
Problemillas menores pero si quieres corregirlos, ahí los tienes. ;)
Debido al fallo de un mecanismo, el lanzagranadas M203 se te podía disparar cuando menos lo esperaras, lo que te habría hecho bastante impopular entre lo que quedara de tu unidad.
Revista del ejército EE.UU. PS, agosto 1993.

Emulador JSpeccy
ZXBaremulator

zup
Freddy Hardest
Mensajes: 666
Registrado: Vie Ago 15, 2008 2:43 pm

Re: Proyecto tontuno... conversor de snapshots a transfer

Mensaje por zup » Lun Abr 02, 2018 5:09 pm

He estado examinando un poco si el registro R funcionaba bien, y he cazado un par de bugs (me olvidé de que la CPU no toca el bit 7 de R). También he arreglado un asuntillo relacionado con el borde. Todavía no he subido los ficheros.

En cuanto a los warnings que me comentabas...
- Los dos relacionados con fgetpos son debidos a que el tipo del valor retornado por fgetpos (segundo parámetro) es diferente según el compilador utilizado. Para no liarla, los compiladores definen un tipo llamado fpos_t; cambiando el tipo de la variable filesize a fpos_t deberían desaparecer los warnings.
- El de la línea 118 es un poco más puñetero. Al parecer, el tamaño (tipo) del valor de retorno de sizeof también cambia de compilador a compilador, y no parece estar definido en ninguna macro por ahí. Para liarla un poquito más, en Windows también depende de si usas msvcrt o no (y al parecer mi MinGW linka a msvcrt). El formato correcto (y portable) debería ser %zu, que solo funciona si el compilador trabaja como C99. Lo he cambiado y a mi me compila, pero no sé si tendrá impacto en otras cosas.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start...

zx81
Freddy Hardest
Mensajes: 619
Registrado: Vie Dic 28, 2007 2:14 pm
Ubicación: Valencia
Contactar:

Re: Proyecto tontuno... conversor de snapshots a transfer

Mensaje por zx81 » Mar Abr 03, 2018 9:03 pm

zup escribió: - El de la línea 118 es un poco más puñetero. Al parecer, el tamaño (tipo) del valor de retorno de sizeof también cambia de compilador a compilador, y no parece estar definido en ninguna macro por ahí. Para liarla un poquito más, en Windows también depende de si usas msvcrt o no (y al parecer mi MinGW linka a msvcrt). El formato correcto (y portable) debería ser %zu, que solo funciona si el compilador trabaja como C99. Lo he cambiado y a mi me compila, pero no sé si tendrá impacto en otras cosas.
sizeof debería devolver un entero de tipo size_t. Si MinGW es cumple con el estándar o no, ya no lo sé.
Debido al fallo de un mecanismo, el lanzagranadas M203 se te podía disparar cuando menos lo esperaras, lo que te habría hecho bastante impopular entre lo que quedara de tu unidad.
Revista del ejército EE.UU. PS, agosto 1993.

Emulador JSpeccy
ZXBaremulator

zup
Freddy Hardest
Mensajes: 666
Registrado: Vie Ago 15, 2008 2:43 pm

Re: Proyecto tontuno... conversor de snapshots a transfer

Mensaje por zup » Mié Abr 04, 2018 7:25 am

zx81 escribió:sizeof debería devolver un entero de tipo size_t. Si MinGW es cumple con el estándar o no, ya no lo sé.
El problema no es size_t, sino el denominador de formato que se emplea en printf. El warning es porque al usar %5i, printf espera un parámetro de tipo integer y size_t es... pues lo que haya definido en el lenguaje (que para empezar es un unsigned). Por lo que he leído por ahí, el denominador portable sería %5zu (siempre que el compilador sea C99). Esa línea queda así:

Código: Seleccionar todo

printf ("*   %5zu bytes\n",sizeof(cabecera));
Otra opción (también portable) hubiera sido envolver todo en un typecast, con lo que la línea hubiera quedado:

Código: Seleccionar todo

printf ("*   %5i bytes\n",(int) sizeof(cabecera));
Es un apaño algo más chapucero, pero que también funciona. De hecho, en compiladores que no son C99 (ahora mismo estoy pensando en Turbo C++ para DOS) sería la forma correcta para que funcione.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start...

zup
Freddy Hardest
Mensajes: 666
Registrado: Vie Ago 15, 2008 2:43 pm

Re: Proyecto tontuno... conversor de snapshots a transfer

Mensaje por zup » Sab Abr 07, 2018 11:55 am

Versión 0.40 subida. Aparte de que se ha corregido algún error más y pequeños cambios cosméticos, la gran novedad es que ya funciona el switch -b.

Al usar -b, el programa genera una cinta que no se parece en nada a las habituales del Transtape. Esta cinta solo es compatible con los Spectrum de 128k, y contiene tres bloques que se todos cargan desde BASIC. La idea es facilitar el paso de estos juegos a disco (solo hay que cambiar los LOAD del cargador BASIC y listo). Se usa la página 3 porque la página 1 suele usarse como caché en los +2A y +3 (corrompiendo lo que hay almacenado ahí).

Como bonus, este formato permite poner POKEs comodamente: solo hay que poner los POKEs antes del RANDOMIZE USR 24565. Se puede poner cualquier POKE mayor de 24576.

Los switches -b y -f se pueden usar simultáneamente. En este caso, primero se cargará el juego usando la memoria extra y se bloqueará la paginación justo antes de lanzarlo.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start...

kounch
rst 0
Mensajes: 24
Registrado: Mar Dic 05, 2017 8:02 am

Re: Proyecto tontuno... conversor de snapshots a transfer

Mensaje por kounch » Dom Abr 08, 2018 1:11 pm

Compilada la última versión en un Mac. Sólo se ha quejado de la codificación de texto de "main.c" al ser Windows. En cuanto lo he guardado como UTF-8, ningún problema.

He probado con varios de los sna de pruebas, y parece que funciona bien. :)

Avatar de Usuario
chernandezba
Sabreman
Mensajes: 408
Registrado: Mié Oct 17, 2007 5:26 pm

Re: Proyecto tontuno... conversor de snapshots a transfer

Mensaje por chernandezba » Mié Abr 11, 2018 3:29 pm

Ya de paso... para cuando soporte para ManTransfer?
Es un software que hice allá por el 1993, que grababa el contenido de la memoria a cinta... y sólo es por software, no usa hardware. Para activarlo se realiza con una combinación de teclas concreta, y logicamente, necesita que el juego en cuestión tenga las interrupciones "normales" de la rom habilitadas.
Este tipo de volcado se puede hacer también desde ZEsarUX, menú Debug->run mantransfer. Sólo para máquinas 48kb. En este caso, se puede lanzar para cualquier programa de 48k, estén o no las interrupciones habilitadas. El cargador como tal "sabe" en que modo estaban las interrupciones y las restaura adecuadamente

https://github.com/chernandezba/zesarux ... um/vintage

;)

Ah y si, también corrompe la pantalla con el contenido de los registros y la rutina de carga
----

ZEsarUX
ZX Second-Emulator And Released for UniX
https://github.com/chernandezba/zesarux

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados