Me lo he bajado pero yo no puedo subir archivos. A ver si nos lee AntonioVillena y nos hace el favor. Y si no te pediré que me lo mandes.zx81 escribió: ↑23 Ene 2018, 12:53 Como sé que lo conoces, en el repo SVN del ZX-Uno tienes un directorio llamado software/tests donde, entre otros muchos programas tienes el floatspy.tap. Vale tanto para 48k como para 128k. El que no tienen en ese repo es el IR_Contention, te lo puedo enviar a ti o a quien corresponda para que lo añada al repo.
Aunque si es verdad que no lo tengo claro del todo, es un lio pero no todo es cosa míazx81 escribió: ↑23 Ene 2018, 12:53 A ver, porque creo que con los timings tienes un pequeño lío. La interrupción salta en el instante T-0, justo en el momento en que comienza un nuevo cuadro de imagen. En el instante T-14336 o T-14337, según sea early o late timing, se dibuja el primer byte de pantalla, que no es lo mismo. Creo que el Timex permite cambiar la interrupción, o la tiene, no sé bien, para que suceda justo cuando va a dibujar la pantalla, pero eso no es estándar Spectrum.
Lo que pasa es que la ULA funciona a su manera. Como te decía, la ULA lleva un par de contadores que funcionan como coordenadas X,Y de pantalla. El eje X va de 0 a 447 y el eje Y de 0 a 311. El origen de coordenadas no está al comienzo de un nuevo cuadro sino que está en el punto correspondiente al primer pixel visible. Me refiero al pixel 0,0 del bitmap de pantalla, al primer pixel de la dirección de pantalla 16384. Empieza a componer la imagen desde ahí, pinta 256 pixeles de la primera línea, luego el borde derecho, blanking horizontal, el borde izquierdo de la segunda línea, y ahí termina de contar y vuelve a 0. Repite 192 líneas, luego borde inferior, blanking vertical, borde superior del siguiente cuadro, y termina con el borde izquierdo de la primera línea. Es antiintuitivo pero funciona así por simplicidad desde el punto de vista electrónico. Por eso, para activar la interrupción en el comienzo del cuadro que sería cuando empieza el blanking vertical, hay que contar 192 líneas de bitmap, más 56 de borde inferior... 248 en vertical, y en horizontal 0 para early-timing o 2 para late-timing.
Vale, entonces lo hago bien en el ZX-Uno. Son 64 porque cuento ciclos de ULA que va el doble de rápido que la CPU. Pero la ULA del Humble está mal porque dura 32 ciclos de ULA, no de CPU.zx81 escribió: ↑23 Ene 2018, 12:53 La INT se mantiene activa 32 ciclos de reloj Z80 (36 ciclos en el 128/+2, pero no en los +2a/+3) porque, en el peor caso, la instrucción más costosa en tiempo del Z80 creo que eran 24 ciclos, no recuerdo exactamente ahora, y eso sin contención. Como la INT se samplea al final de la ejecución de cada instrucción, el peor caso es empezar la ejecución de esa instrucción en el último ciclo del cuadro anterior.
Como la INT, a diferencia de NMI, se atiende por nivel y no pr flanco, hay que tener cuidado para no activar las interrupciones antes de hora o te volvería a saltar.
Mi manía por el late-timing es porque en el foro del ZX-Uno, en el hilo de mi core, un usuario me hizo un TAP con una aplicación que pinta en el borde y está calibrada para late-timing. La probé en mis Spectrums reales y todos son late-timing. Bueno, realmente uno en frío es early-timing y cuando lleva un rato y se calienta la ULA empieza a funcionar como late-timing. Es curioso ver como cambia