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?
|
|
|
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.
|
|
|
En línea
|
|
|
|
pitpan
|
|
« 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 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 Si no consigo arreglarlo tendré que utilizar los samples completos, de nuevo
|
|
|
En línea
|
|
|
|
jltursan
|
|
« 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?
|
|
|
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
|
|
« 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
|
|
« Respuesta #41 : 07 de Noviembre de 2006, 05:33:17 pm » |
|
DIOX MIO, PERO QUÉ BORRICO SOY! 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! 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. Robsy -> <- 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 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 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
|
|
|
|
|