j4mk3
|
|
« : 07 de Mayo de 2009, 10:44:25 am » |
|
Buenas, Aqui el preguntón de turno...esta vez va de ciclos. Decir primero que he mirado por los foros, cone l buscador y tal y no he encontrado esta infomación, pero que si está encantado de leerla eh ? Bueno, lo que queria saber. Resulta que tengo hecho un player para el PSG que se lanza desde interrupcion, osea en cada VSYNC y tengo pensado hacerle una serie de modificacions bastante fuertes. Fuertes en el sentido de que lo dotará de mucha más versatilidad y fuerte porque creo que son muchos calculos y muchos CICLOS de reloj. Entonces antes de ponerme a ello, a picar codigo (la teoria ya es´ta en mi libretica) pregunto: - ¿Cuantos ciclos tengo para no saltarme ningun frame dentro de una rutina de interrupcion? Ya se que es diferente a 60 y a 50 Hz. ¿Teneis este dato? - ¿Como tengo que contar esos ciclos de mi rutina de interrupcion? ¿He de contar el camino más largo através de los CP? ¿Cuenta tambien el JP que hay en la mem $38? - ¿Hay alguna utilidad o "algo" que me pueda ayudar a contar los ciclos que uso? ¿O directamente pillo el manual del Z80 y a contar instruccion por instruccion? - Los calculos de tempo del player los estoy haciendo a 50Hz ¿voy a saco y cambio el Registro para que todo el programa vaya a 50Hz independientemente de que sea el MSX q sea? ¿Lo fuerzo o eso es "incompatible" con el standard? El Nemesis no controla y a 60Hz va too follao :p Bueno pues a ver si con estos numeros y tal os puedo mostrar el susodicho player en la RU. ありがとお Arigatoo じゃね! Ja ne !
|
|
|
En línea
|
--- G Fan --- Galious & Gradius & G Boys --- --- Play HANS' ADVENTURE, STAN, THE DREAMER & BITLOGIC ---
|
|
|
Dioniso
Visitante
|
|
« Respuesta #1 : 07 de Mayo de 2009, 01:49:03 pm » |
|
Si yo fuera tú... no sabría la respuesta claro. Bueno, era sólo una forma de hablar. Empezamos de nuevo: si yo fuera tú tendría en cuenta ciertos problemas a la hora de hacer un replayer en IM1, que parece ser tu caso. 1.- Yes, tienes que tener en cuenta que no tendrás control total sobre la cantidad final de ciclos a gastar si no habilitas el modo IM2. 2.- Cuidadín, porque según qué información esté trabajando el replayer, en unos rasters consumirá unos ciclos y en otros consumirá más. A no ser que te hagas uno que siempre consuma la misma cantidad de ciclos en cada raster, como Joyrex hizo ne su día. 3.- La putadilla de los 50 o 60 hercios... Si no estás seguro, haz las pruebas siempre a 60; así te aseguras que luego corra a 50 también. Sobre lo de la documentación de los ciclos (o T-states), yo miraría la parte de RESOURCES de MAP. En concreto el primer documento en la parte del Z80, llamado "Z80 instruction set overview".
|
|
|
En línea
|
|
|
|
e_sedes
|
|
« Respuesta #2 : 07 de Mayo de 2009, 05:23:16 pm » |
|
Jannone tiene en su página un ensamblador on-line con una herramienta muy cuca que te cuenta ella sola los t-states y los bytes del trozo de código que quieras.
|
|
« Última modificación: 07 de Mayo de 2009, 05:27:44 pm por e_sedes »
|
En línea
|
sempre fun un valente corredor
|
|
|
j4mk3
|
|
« Respuesta #3 : 09 de Mayo de 2009, 03:01:53 pm » |
|
Dionisio me has dejado frio ! No por la respuesta en si, sino que me estas haciendo replantearme todo desde el princio...ai q lloro ! - Si me estas diciendo que el player no debe ir a rutina de interrupcion, entonces no se como controlar los tempos, el cada cundo se dispara una nota. Ilustrame un poquico si puedes. - En raster hago el volcado a VRAM, la captura de teclado y el player (tal como tenia pensado)...mmm me da q no da tiempo a q todo vaya a 25 frames - No entiendo las diferencias en forzar al Z80 que cambie el tipo de interrupcion de IM1 a IM2, ¿ En que se diferencia ? Gracias a los dos por la documentacion referenciada, me será muy util.
|
|
|
En línea
|
--- G Fan --- Galious & Gradius & G Boys --- --- Play HANS' ADVENTURE, STAN, THE DREAMER & BITLOGIC ---
|
|
|
Dioniso
Visitante
|
|
« Respuesta #4 : 09 de Mayo de 2009, 04:32:33 pm » |
|
Claro que debe ir a rutina de interrupción. Lo único que te digo es que tengas en cuenta que tu replayer necesitará una serie de ciclos si toca sólo frecuencias pero que probablemente, si utiliza frecuencias más envolventes más ruido más lo que estés haciendo en pantalla (volcado de gráficos, etc...) te puede consumir mucho. Sólo digo que un replayer no consumirá casi nunca el mismo número de ciclos (a no ser que se te curres un replayer como el que te comenté).
Debes intentar que todo se ejecute en casa interrupción. Por eso te dije lo de hacerlo a 60 hercios, que es más rápido que a 50. Así estarás seguro de que todo funcionará a 50 también... No sé si me explico.
En el modo IM2 tú controlas las interrupciones, por lo que tendrás más ciclos para ti. En el modo "normal" (IM1) hay ganchos ajenos a tu programa) que te quitan ciclos.
|
|
|
En línea
|
|
|
|
pitpan
|
|
« Respuesta #5 : 09 de Mayo de 2009, 08:37:38 pm » |
|
Mmmm. Creo que aquí igual no estamos hablando todos de lo mismo. j4mk3 habla de cuántos ciclos tiene disponibles entre v-blanks consecutivos para que no le pete el replayer. Lo que plantea Dioniso es la forma óptima para hacer un replayer sincronizado a nivel de ciclos, que me parece algo mucho más potente y ambicioso. Lo suyo, con un replayer cualquiera (como por ejemplo el pobre Karoshi Caruso) es, al principio de cada interrupción, volcar los registros del PSG de RAM a los puertos correspondientes. En esto se tarda siempre lo mismo - es muy rápido - y así no se distorsiona el sonido. A continuación, todas las rutinas de gráficos - ya que fuera del v-blank, se pierde mucha velocidad de acceso y aparecen problemas - y por último, el replayer en sí que procesa los datos y genera los registros del PSG en RAM que serán copiados en la siguiente interrupción. De esta forma, salvo que tengas demasiada carga, podrás solucionarlo todo en cada v-blank sin problemas. Igual os estoy liando todavía más
|
|
|
En línea
|
|
|
|
j4mk3
|
|
« Respuesta #6 : 10 de Mayo de 2009, 12:37:03 pm » |
|
Mmm menos mal que me dices eso dionisio. Y pitpan eso es ! de Registros RAM al PSG en cada vsync. Si os cuento...aix...tengo toda la rutina del player en la Vsync, pero a saco claro...no se que a framerate iba pero debe ser demasiado lento. En la ultima revision-cambio que le estoy haciendo al player (que no entiendo pq le deciis a esto Replayer ) ya he perfilado lo de tener una copia en RAM de los registros y volcarlos. Auqnue antes de leeros, tenia previstos hacerlo todo en la interrupcion...y claro...uso ciclos a cascoporro. mmm bien bien...con vuestra ayuda ya tengo bastante claro como hacerlo mejor y q el framerate no sufra. Respecto a la rutina de interrupcion. Actualmente trabajo en DOS, no hago Roms. Investigue en su momento como se hacia y lo unico que hago es cambiar la direccion de salto de la posición 38h de memoria a mi interrupcion. Dentro de esta hago PUSH de todos los registros, pongo los calls del update de VRAM, mirar teclado y volcar al PSG, y salgo con POP de todos los registros. Como lo hago en DOS, antes de cambiar la posicion 38h guardo los valores que ya hay y los restauro al salir del .COM Ahora que pienso...Al hacer un .ROM, tendré BIOS en la 38h, no ? Que más tengo tener en cuenta cuando haga .ROM ? algún enlace o pagina donde mirar este detalle ? Y a los nuevos interrogantes, hay dos de mis preguntas que estan sin respuesta del primer post, os agradeceria que alguien pudiera contestarlas: - ¿Cuantos ciclos tengo para no saltarme ningun frame dentro de una rutina de interrupcion? Ya se que es diferente a 60 y a 50 Hz. ¿Teneis este dato? - ¿Puedo ir a saco y cambiar el Registro para que todo el programa vaya a 50Hz independientemente de que sea el MSX q sea? ¿Lo fuerzo o eso es "incompatible" con el standard?
|
|
|
En línea
|
--- G Fan --- Galious & Gradius & G Boys --- --- Play HANS' ADVENTURE, STAN, THE DREAMER & BITLOGIC ---
|
|
|
Dioniso
Visitante
|
|
« Respuesta #7 : 10 de Mayo de 2009, 09:05:01 pm » |
|
Yo suelo hacer una cosa para ver si me paso o no de ciclos... Muevo un sprite por la pantalla a píxel por interrupción. Si el sprite se ralentiza (si el movimiento no es suave) pues... demasiado lento.
Puedes forzar todos los modelos de MSX2 o superiores a 50, claro, como hace el Manbow 2 (mínimo MSX2). El problema es que si tu juego es de MSX1... pues que no podrás modificar un MSX1 que vaya a 60, como los japonenses, for eksámpol.
|
|
|
En línea
|
|
|
|
pitpan
|
|
« Respuesta #8 : 11 de Mayo de 2009, 12:06:13 pm » |
|
Para ver de una forma muy gráfica lo que tarda una rutina en relación con la interrupción, lo que suelo hacer - Sap también es muy fan de esta técnica - es cambiar el color del borde al inicio de la V-Blank (reescribir el valor del registro 7 de la VDP) y hacer otra vez lo mismo al final de la rutina en cuestión. Así puedes ver de forma gráfica lo que tarda. Cuanto más ancha sea la franja de color, más lenta es la rutina, y te permite verlo en relación a la frecuencia que empleas, entendiendo que la pantalla en vertical entera supone aproximadamente un 100%. Es una aproximación, porque evidentemente se consume tiempo en la vuelta de los cañones a la posición inicial (benditos CRTs), pero sirve, es muy intuitivo hacerlo así y muy fácil de implementar.
|
|
|
En línea
|
|
|
|
SapphiRe_MSX
Visitante
|
|
« Respuesta #9 : 11 de Mayo de 2009, 12:21:25 pm » |
|
Sap también es muy fan de esta técnica ¡Por supuesto! Es fundamental cambiar el color del borde al inicio de la V-Blank (reescribir el valor del registro 7 de la VDP) y hacer otra vez lo mismo al final de la rutina en cuestión. Así puedes ver de forma gráfica lo que tarda. De hecho, en las primeras versiones del bucle de juego siempre cambio el color para cada acción a realizar, lo que me da una idea de si es posible, o no, hacer las cosas de una forma o de otra. La ventaja que tiene esta técnica es que la puedes meter directamente en los MSX y así mides en la máquina real la carga de la CPU. El objetivo siempre es que la franja que representa el volcado a VRAM esté dentro del VBLANK (es decir, que no llegue al borde superior de la pantalla visible). En el QBIQS lo que hago es: 1) Trato la interrupción (que hace lo mínimo, mínimo). 2) Vuelco todo a VRAM (y a 60hz cabe todo dentro del VBLANK, con lo que va más deprisa). 3) Vuelco los registros de sonido al PSG. Realmente no es necesario hacerlo justo al terminar la interrupción, ya que por unas milésimas de segundo no se nota nada. 4) Realizo el cálculo del siguiente frame visual, incluyendo todo lo necesario (lectura de joysticks, scroll, parallax, movimiento de sprites, naves, choques, borrado...) 5) Llamo al PT3 para que calcule los registros del PSG para el siguiente frame. 6) Llamo al ayFX para que sobreescriba dichos registros con los efectos de sonido. Básicamente eso funcionaría para casi el 95% de los juegos.
|
|
|
En línea
|
|
|
|
Metalbrain
Karoshi Fan
Mensajes: 92
Z80jutsushi
|
|
« Respuesta #10 : 11 de Mayo de 2009, 01:24:18 pm » |
|
- ¿Cuantos ciclos tengo para no saltarme ningun frame dentro de una rutina de interrupcion? Ya se que es diferente a 60 y a 50 Hz. ¿Teneis este dato? Lo único que he encontrado es una línea en el changelog del NO$MSX: z80/vdp: changed cycles per 50Hz from 71592 to 71328 - closer to realityAsí que al menos a 50Hz el valor es 71328, y si multiplicamos por 5/6, el valor para 60Hz sale cosa así de 59440. No se hasta que punto estos valores serán exactos, ni si se mantienen para todos los modelos.
|
|
|
En línea
|
|
|
|
j4mk3
|
|
« Respuesta #11 : 13 de Mayo de 2009, 06:44:02 pm » |
|
Muchas pero que muchas gracias por las respuestas Me ha ayudado mucho a recolocar parte del codigo y hacerlo mucho más optimo para que funcione bien en el VSYNC. Espero poder enseñaros parte del trabajo (o completo) para la RU. Gracias una vez más. Arigatoo.
|
|
|
En línea
|
--- G Fan --- Galious & Gradius & G Boys --- --- Play HANS' ADVENTURE, STAN, THE DREAMER & BITLOGIC ---
|
|
|
doble07
Karoshi Newbie
Mensajes: 19
|
|
« Respuesta #12 : 15 de Mayo de 2009, 11:30:23 pm » |
|
Hola j4mk3,
En el emulador AmiMSX que programe para Commodore-Amiga usaba 202 T-States de CPU por cada scan-horizontal de video, esto da un total de:
PAL (50Hz) 313 scan-lines * 202 T-States = 63226 T-States de CPU. NTSC (60Hz) 262 scan-lines * 202 T-States = 52924 T-States de CPU.
Sin embargo olvidate de ir contando los T-States... Lo mejor es que uses lo que te comenta pitpan de cambiar el color del borde, es lo mas practico. Yo siempre lo he echo asi y me ha ido muy bien.
Saludos
Juan
|
|
« Última modificación: 15 de Mayo de 2009, 11:32:23 pm por doble07 »
|
En línea
|
|
|
|
Dioniso
Visitante
|
|
« Respuesta #13 : 16 de Mayo de 2009, 01:39:22 pm » |
|
Sin embargo olvidate de ir contando los T-States... Bueno, Juan, depende de lo que quieras hacer. Para código síncrono, obviamente, tienes que contar de forma exacta los t-states: Seleniak, demos de Dvik & Joyrex, replayers de 1-bit, repayer de samples, Sp8 Invaders, ...
|
|
|
En línea
|
|
|
|
j4mk3
|
|
« Respuesta #14 : 18 de Mayo de 2009, 12:05:41 pm » |
|
Buenas de nuevo,
Ya he estado haciendo pruebas varias con mi player PSG en la interrupcion y he aplicado lo del cambio de color del borde para ver los tiempos. Parece que voy bien ya que creo q me sobran muchos ciclos, pero no estoy seguro si lo q veo me dice eso, a ver si me lo podeis asegurar.
Pongo de color verde el borde al principio de la rutina q salta al ahcer el VSYNC y lo vuelvo negro de nuevo al salir. Se me empieza a pintar de Verde justo cuando termina la parte inferior de la pantalla, es decir, me hace todo el margen inferior de la pantalla de verde. De vez en cuando se pinta un trozo de la parte superior, solo 3-4 lineas creo. El resto del borde es negro.
Esto significa q estoy consumiendo muy poco del VSYNC, no ? Es normal q se empieze a pintar ahí justo al terminar , osea en la Y=192 ?
En otra prueba, lo he aplicado a una pequeña intro con graficos, animacion y musica, de vez en cuando no se pinta ningun trozo verde. Se queda en negro. Veo como la franja verde inferior parpadea. Lo he puesto en el BLUEMSX frenandolo mucho y efectivamente, hay veces q no se pinta nada verde. Eso significa que me estoy saltando Frames verdad ? que estoy dentro de la rutina de VSYNC más de la cuenta ? o es que me quedo fuera demasiado rato con un trozo de codigo en DI muy largo ?
|
|
|
En línea
|
--- G Fan --- Galious & Gradius & G Boys --- --- Play HANS' ADVENTURE, STAN, THE DREAMER & BITLOGIC ---
|
|
|
|