Karoshi MSX Community
05 de Julio de 2021, 08:25:36 pm *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias:
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: 1 2 [3] 4
  Imprimir  
Autor Tema: Conversión  (Leído 21300 veces)
0 Usuarios y 1 Visitante están viendo este tema.
SapphiRe
Visitante
« Respuesta #30 : 06 de Noviembre de 2006, 07:58:04 pm »

Vale, me cosco del problema. Sin embargo como tengas un número excesivo de unos o ceros seguidos, el factor de compresión va a verse afectado. Vamos a ver si podemos dar con una solución interesante y rápida...

Si ves un cero te vas a una parte especial de tu programa que lee el siguiente byte y realiza tantos bucles de 256 vueltas como indique el byte. Después lee el siguiente y hace un bucle con ese valor de vueltas. Por último vuelve a la parte normal del programa. Para hacerlo de esta forma la palabra debería estar en big endian en lugar de low endian... Si el registro e lo tienes libre podías guardar ahí el contador del bucle externo que realiza bucles de 256 vueltas.

¿Se me entiende? Huh Huh
En línea
Dioniso
Visitante
« Respuesta #31 : 06 de Noviembre de 2006, 08:03:29 pm »

El valor de compresión de ve algo afectado, pero prácticamente nada ... sólo con algún silencio. Es raro ver más de 255 unos seguidos.

Tomo nota de lo que dices. Lo de utilizar "e" para el número de loops.
En línea
SapphiRe
Visitante
« Respuesta #32 : 06 de Noviembre de 2006, 08:15:16 pm »

El valor de compresión de ve algo afectado, pero prácticamente nada ... sólo con algún silencio. Es raro ver más de 255 unos seguidos.

Tomo nota de lo que dices. Lo de utilizar "e" para el número de loops.

Incluso se puede mejorar. Supongamos que tienes una rutina llamada LOOP que hace un bucle de b vueltas y otra llamada CAMBIA que cambia el valor de uno a cero o viceversa. Lo que te propongo es crear una nueva rutina llamada BIGLOOP que hace b bucles de 256 vueltas y que se podría integrar como sigue:

PLAYER:
leo siguiente valor en b
si no es cero jp LOOP
BIGLOOP:
hago b bucles de 256 vueltas apoyándome en e
leo siguiente valor en b
si es cero jp CAMBIA
LOOP:
hago un bucle de b vueltas
CAMBIA:
cambio valor 1 <-> 0
jp PLAYER

  Como ves en ningún momento estás trabajando con valores de 16 bits... No se si será lo suficientemente rápido para tus propósitos, pero no parece demasiado lento.
En línea
Dioniso
Visitante
« Respuesta #33 : 06 de Noviembre de 2006, 08:24:29 pm »

Comprendido. Gracias.

Ya tengo uno basado en mi idea inicial pero esta otra forma que tú propones para los valores mayores de 255 se podría integrar en un replayer general. Todo esto después de la MSXDev06.  Wink
En línea
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #34 : 07 de Noviembre de 2006, 11:03:30 am »

Volviendo a la idea de usar 0s para indicar cambio de UNOs a CEROs, creo que sería lo más sencillo (aunque no lo óptimo, como ha demostrado Sapphire).

Dices que utilizas el 0 para indicar el fin de la secuencia. Podrías sustituir el fin de secuencia por un doble cero, con lo cual tendrías un formato consistente y sin problemas (db 0,0).

Recapitulando:

db 0,n ; indica cambio de 0 a 1 (o de 1 a 0, imagino que te da lo mismo) y N bits repetidos
db 0,0 ; indica fin-de-secuencia

No hay colisión en este caso, aunque es verdad que el byte extra de cambio de bit haría que aumentase bastante el tamaño de la tabla resultante. La otra opción es usar sencillamente words en el recuento. Con 16 bits de rango seguro que no te quedas corto.

En línea
Dioniso
Visitante
« Respuesta #35 : 07 de Noviembre de 2006, 01:48:29 pm »

Claro, todo está muy bien pero ya he trabajado una rutina que me deja la canción de la intro de unas 4,5k en 1,7k, con reproductor incluido. No quiero tirar lo que ya he hecho, no tengo demasiado tiempo ahora y el fin se acerca.

El problema (ya estoy empezando a tirarme de los pelos) es que no suena igual  Sad

He contado y recontado los t-states, he probado a cambiarlos y lo único en lo que debería afectar sería en la velocidad de reproducción ... pero suena diferente, bastante peor  Embarrassed

Si no consigo arreglarlo tendré que utilizar los samples completos, de nuevo  Undecided
En línea
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


WWW Email
« Respuesta #36 : 07 de Noviembre de 2006, 02:17:07 pm »

EL caso es que esto me suena familiar, ya le pasó a Robsy algo parecido. ¿Has tenido en cuenta los tiempos reales de ejecución de las instrucciones del Z80 en el MSX? Huh
En línea

Doom dee doom dee doom
Dioniso
Visitante
« Respuesta #37 : 07 de Noviembre de 2006, 02:29:21 pm »

Pues en ello estoy. Utilizo el documento "Z80 instruction set overview" de las resources de la "MSX Assembly Page". Seguiré verificando el tema. Si este fin de semana no arreglo el problema usaré otra rutina con menor compresión pero efectiva. Si tuviera más tiempo ... (cágonla!)

La próxima semana ya diré aquí lo que sea. Por ahora sólo necesito tiempo. Llevo varias cosas para adelante, no sólo con el tema MSX.
En línea
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #38 : 07 de Noviembre de 2006, 03:44:07 pm »

Dioniso:

Asegúrate de tener en cuenta lo que te comenta JL respecto al ciclo de espera adicional para todas las instrucciones del Z80 puesto en el MSX. Hay 4 ciclos de reloj extra que se van a refresco de memoria por byte del opcode, sin incluir parámetros. Es decir, NOP, que debería tardar 4 t-states, en realidad tarda 4+4. De todos modos, imagino que sí lo habrás tenido en cuenta.

Si quieres que le eche un vistazo al replayer, pásame código por privado y le dedico unos minutillos.
En línea
SapphiRe
Visitante
« Respuesta #39 : 07 de Noviembre de 2006, 04:21:28 pm »

Asegúrate de tener en cuenta lo que te comenta JL respecto al ciclo de espera adicional para todas las instrucciones del Z80 puesto en el MSX. Hay 4 ciclos de reloj extra que se van a refresco de memoria por byte del opcode, sin incluir parámetros. Es decir, NOP, que debería tardar 4 t-states, en realidad tarda 4+4. De todos modos, imagino que sí lo habrás tenido en cuenta.

¿No era solo uno?
En línea
Dioniso
Visitante
« Respuesta #40 : 07 de Noviembre de 2006, 05:05:24 pm »

Eso diría yo. Yo tomo NOP como 5 t-states. Supongo que habrá sido el campotraviesa.

Gracias Edu por el ofrecimiento. Lo tendré en cuenta.
En línea
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #41 : 07 de Noviembre de 2006, 05:33:17 pm »

DIOX MIO, PERO QUÉ BORRICO SOY!  Shocked

Por supuesto, tenéis razón: por cada ciclo de instrucción, el MSX añade un ciclo de reloj. Por lo tanto, NOP se convierte en 4+1 T-states. Dadme con el palo con clavos por descerebrado.
En línea
Dioniso
Visitante
« Respuesta #42 : 07 de Noviembre de 2006, 05:37:30 pm »

Incluso un OUT (C),D tiene dos más, es decir, no tiene 12 sino 14.
En línea
SapphiRe
Visitante
« Respuesta #43 : 07 de Noviembre de 2006, 05:49:42 pm »

DIOX MIO, PERO QUÉ BORRICO SOY!  Shocked

Por supuesto, tenéis razón: por cada ciclo de instrucción, el MSX añade un ciclo de reloj. Por lo tanto, NOP se convierte en 4+1 T-states. Dadme con el palo con clavos por descerebrado.
Grin Grin Grin

Robsy ->  Spank <- SapphiRe

¡¡A ver cuando nos vemos!!
En línea
Dioniso
Visitante
« Respuesta #44 : 09 de Noviembre de 2006, 11:10:18 am »

Bueno, parece que me acerco bastante. He compactado aún más el replayer  Grin De todas formas no suena todo lo fino que debería ... Edu, creo que te voy a enviar dos replayers; uno sin samples/notas compactadas (es practicamente tu replayer pero modificando sólo el 7° bit del puerto $AA) y otro muy compacto para utilizar con los programas que tú y jltursan me hicisteis. Así verás las diferencias. Supongo que esto te caerá el próximo lunes.

Los t-states están medidísimos. Hay 3 loops con una duración de 162, 163 y 164 t-states respectivamente ... la diferencia no puede ser tan grande, no me lo explico. Quizá haya un problema con la conversión de samples  Huh Si quito un bit a cada sample suena mejor, creo. Bueno, a ver si le echas un ojo. Te lo comento para que me digas si podrás o no, y lo hago aquí por si alguien piensa en otra solución para al problema. Por que si hago el juego con el primer replayer me voy a tener que llevar un "Griel's Quest for the Sangraal Extended Edition" ...
En línea
Páginas: 1 2 [3] 4
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2013, Simple Machines XHTML 1.0 válido! CSS válido!