Identificar cargas sin cabecera

Todo sobre la creación, diseño y programación de nuevo software para
nuestro Spectrum

Moderador: Sir Cilve Sinclair

Responder
Gandulf
Nonamed
Mensajes: 1067
Registrado: Lun May 07, 2007 10:06 pm

Identificar cargas sin cabecera

Mensaje por Gandulf » Lun Oct 29, 2007 11:00 am

Viendo que hay gente por aquí que controla más que yo de lo que son las rutinas de carga y la carga en general del spectrum, a ver si me inspirais o dais ideas para mejorar esto:

En viaje al centro, hay un menú "lanzador" donde se redefinen las teclas, seleccionas el tipo de control, etc, y la fase que quieres cargar (4 o 5), como en el original vamos. Una vez le das a empezar, carga un bloque sin cabecera del tamaño que haga falta.

El problema es que como hasta ahora sólo está terminada la 4 no tengo que identificarla, cargo el bloque sin cabecera y listo. Pero cuando tenga la 5 lista, tengo que poder diferenciar las fases 4 y 5. No me apetece meter cabeceras, que forma que la idea que tengo en mente es poner dos bloques sin cabecera que contenga un byte con el número de fase justo antes.

Se me había ocurrido usar el "crc" (entre comillas) de las grabaciones, el parámetro que pasas antes de grabar un bloque a la rom, pero no he visto forma de alterarlo o generarlo desde las utilidades que tengo (van con el valor de A por defecto).

¿Se os ocurre alguna idea mejor (seguro que sí) para diferenciar los bloques sin tener que hacer esto o meter cabeceras?
Un saludo,

Gandulf

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Mensaje por na_th_an » Lun Oct 29, 2007 11:03 am

La forma "bestia" que yo usaría es hacerme una "cabecera custom" que en realidad fuera un bloque sin cabecera que contuviese datos identificativos del archivo que sigue. Se puede trampear, pero serviría para que pusiera "cargando fase 4" o "fase 5", o dar un mensaje de error si se intenta cargar la fase incorrecta.

Gandulf
Nonamed
Mensajes: 1067
Registrado: Lun May 07, 2007 10:06 pm

Mensaje por Gandulf » Lun Oct 29, 2007 11:13 am

@Na_th_an

que tengo en mente es poner dos bloques sin cabecera que contenga un byte con el número de fase justo antes

La forma "bestia" que yo usaría es hacerme una "cabecera custom" que en realidad fuera un bloque sin cabecera

Ya, como os decía esa era la idea que tenía en mente (veo que hemos pensado lo mismo) pero quería saber si podría haber otra forma, me vale con que si el bloque no es el correcto dé un error de carga y espere el siguiente (nada más intentar cargarlo, sin tener que esperar al final a que de el error :lol: )
Un saludo,

Gandulf

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Mensaje por na_th_an » Lun Oct 29, 2007 11:19 am

Si vas a usar tu propia rutina de carga, prepárala para que lea unos cuantos bytes al principio y los compare con algo para saber si es 4 o 5, y luego que siga cargando normalmente.

O sea, una rutina de carga que dado el bloque entrante trate los primeros bytes de una forma (para identificar). Si coinciden, el resto de los bytes se carga normalmente y si no, pues se aborta la carga con un mensaje o sigue esperando al siguiente bloque sin hacer nada.

Avatar de Usuario
miguel
Manic Miner
Mensajes: 293
Registrado: Mar Abr 17, 2007 12:27 am
Ubicación: Parla - Madrid
Contactar:

Mensaje por miguel » Lun Oct 29, 2007 11:29 am

Pues yo simplemente cambiaría el flag "A" para ello. Si estás usando la rutina de carga de la ROM, es lo más sencillo del mundo, simplemente le asignas a "A" el valor que quieras, tanto al salvar el bloque como al cargarlo.

Con esto si el flag no coincide con el indicado la rutina de LOAD simplemente no carga el bloque.

Un cargador tipo para esto sería:

Código: Seleccionar todo

scf
ld a, 5 (por ejemplo puedes poner el número de fase, lo normal en la rutina es 0 para cabeceras y 255 para bloques de datos)
ld ix, comienzo
ld de, longitud
call 1366


Para salvar este mismo bloque podrías usar algo como:

Código: Seleccionar todo

ld a, 5 (por ejemplo puedes poner el número de fase)
ld ix, comienzo
ld de, longitud
call 1218


Espero que te sirva.
Mi colección retro.
10 PRINT "TODOS SOMOS SROMERO, MENOS UNO QUE SE CREE QUE SÍ"
20 GO TO 10

Gandulf
Nonamed
Mensajes: 1067
Registrado: Lun May 07, 2007 10:06 pm

Mensaje por Gandulf » Lun Oct 29, 2007 11:34 am

@MIGUEL

Eso es a lo que me refería con CRC, al parámetro de flag A. El tema es que con las utilidades que tengo (ZXBlockEditor, etc) no soy capaz de cambiar este flag a un TAP previamente grabadop con el flag por defecto que me genera el ensamblador.

Esa fue la primera idea que tuve, pero como no vi opción de cambiar ese flag, desistí. Por eso os preguntaba. ¿Alguna idea de cómo modificarlo?? Bueno, la verdad es que podría hacer un programilla que cargara el bloque con el flag por defecto y luego lo grabara con el flag que quisiera yo, pero a lo mejor hay utilidades de PC que lo permitan hacer.
Un saludo,

Gandulf

Avatar de Usuario
miguel
Manic Miner
Mensajes: 293
Registrado: Mar Abr 17, 2007 12:27 am
Ubicación: Parla - Madrid
Contactar:

Mensaje por miguel » Lun Oct 29, 2007 11:45 am

Gandulf escribió:@MIGUEL

Eso es a lo que me refería con CRC, al parámetro de flag A. El tema es que con las utilidades que tengo (ZXBlockEditor, etc) no soy capaz de cambiar este flag a un TAP previamente grabadop con el flag por defecto que me genera el ensamblador.

Esa fue la primera idea que tuve, pero como no vi opción de cambiar ese flag, desistí. Por eso os preguntaba. ¿Alguna idea de cómo modificarlo?? Bueno, la verdad es que podría hacer un programilla que cargara el bloque con el flag por defecto y luego lo grabara con el flag que quisiera yo, pero a lo mejor hay utilidades de PC que lo permitan hacer.


Creo que no entiendo muy bien lo que quieres decir, pero el CRC y el FLAG son dos cosas diferentes. Si no recuerdo mal como funcionaba la rutina de carga el FLAG va al principio y funciona como te he dicho, y el CRC es el byte del final, que sirve para comprobar si la carga ha sido correcta.

El FLAG creo que se puede cambiar con una utilidad como TAPER, pero no estoy muy seguro y no lo tengo aquí a mano para probarlo.
Mi colección retro.
10 PRINT "TODOS SOMOS SROMERO, MENOS UNO QUE SE CREE QUE SÍ"
20 GO TO 10

Gandulf
Nonamed
Mensajes: 1067
Registrado: Lun May 07, 2007 10:06 pm

Mensaje por Gandulf » Lun Oct 29, 2007 12:00 pm

Me refería al flag A por eso dije entre comillas y valor A por defecto, no me salía el nombre correcto :) . He probado con Tapper también pero no he visto la opción (tampoco conozco mucho el programa). Espero que haya una utilidad de PC que me solucione la papeleta (sino a lo mejor me la hago yo) porque si tengo que hacerlo desde el emulador de spectrum cada vez que ensamblo será un auténtico coñazo :?

Muchas gracias a todos por la información, si finalmente me tengo que hacer la utilidad en PC la colgaré por aquí por si a alguien más le hace falta.

EDITADO: El "Tapir" deja modificar los valores del raw de cinta, incluyendo checksum y flag A.

EDITADO II: Al grabarlo lo deja inservible. Al final lo he solucionado con un editor hexadecimal de ficheros, con la documentación del formato TAP. Listo, ya no me hacen falta cabeceras :)
Un saludo,

Gandulf

Gandulf
Nonamed
Mensajes: 1067
Registrado: Lun May 07, 2007 10:06 pm

Mensaje por Gandulf » Lun Oct 29, 2007 4:09 pm

He probado en la beta real y funciona perfecto. Es una pena que las utilidades como ZXBlockEditor (todas las ZX Tools son super útiles y estan supercurradas, sobre todo el ZXPaintbrush y el ZXBlockEditor) te oculten los bytes de Flag y Checksum al editar un bloque. Está bien que lo haga por defecto como seguridad, pero debería dar opción a mostarlos. Por ejemplo el Tapir lo hace así, pero tras cambiarlo, le di al "save" y corrompió el TAP dejándolo inservible :?

Nada, el imprescindible editor hexadecimal de toda la vida y listo.
Un saludo,

Gandulf

Responder

¿Quién está conectado?

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