Página 3 de 20

Re: Primeros pasos para pogramar un emulador

Publicado: 05 Sep 2018, 17:03
por chernandezba
Bubu escribió:
zup escribió:Buf... creo que tienes bastante liados los conceptos de cómo funciona el audio y el vídeo en un Spectrum...


Uy, qué va, me da a mí que lo tengo bastante claro :D No hago más que preguntar si la ULA se conecta a la RAM 50 veces por segundo o no, pero siempre me responden con que nu sé cómo funciona el Spectrum, jiji. Sólo necesito saber si esa es la velocidad, y si no, cuál es, de verdad...



No, es lo que te hemos contestado varios. Piensa en como se muestra la imagen en una TV y en el movimiento del electrón: empieza en la esquina superior izquierda, ahí tienes borde, una franja de unas cuantas lineas (48 si no recuerdo mal), de border superior. Luego tienes zonas de borde izquierdo y derecho, y contenido de memoria de pantalla, por lo que el electrón (la ULA) estará leyendo valores de border, de pixel y atributos. Y cuando acaba este border, el border inferior. En todo esto, hay zonas de retrazo horizontal y vertical donde no se está leyendo ni border ni pixel ni atributos, e incluso cuando está en la zona de pixel/atributos no lee siempre la memoria. Precisamente cuando se lee esa zona es cuando hay contienda de memoria
Esto es una descripción muy bruta de como funciona, pero para que te hagas una idea. Y el principio es el mismo que cualquier sistema retro (y muchos actuales) en que hay un electrón pululando por la TV
Por tanto, no, la "ULA NO se conecta a la RAM 50 veces por segundo"

Re: Primeros pasos para pogramar un emulador

Publicado: 05 Sep 2018, 17:45
por Namek
Que no hace falta comerse tanto el coco, que refresques la pantalla 50 veces por segundo y si lo haces 20 pues los movimientos no seran tan suaves, pero el juego de spectrum funcionará. Cuando tengas eso si quieres te metes con los timings y si no, pues no te metes. Ademas, en cuanto comiences a programar tu mismo te iras dando cuenta de como funciona el spectrum por dentro, que dicho sea de paso tampoco es tan complicado a no ser que busques compatibilidad 100%. :mrgreen:

Re: Primeros pasos para pogramar un emulador

Publicado: 05 Sep 2018, 17:49
por Bubu
Entóns, la ULA va generando la imagen a la misma velocidad que el elestrón del CRT, lógico y normal, por tanto, como la tele va a 50 Hz, uséase, 50 pantallas por segundo, la ULA genera 50 veces la pantalla por segundo. Como la pantalla está almacenada en la VRAM, la ULA no tiene más remedio que conestarse 50 veces por segundo a la VRAM para poder generar esa pantalla.

Ay... nu sé si es que estamos hablando de lo mismo pero con diferentes palabros, o hay algo que yo nu estoy entendiendo pa ná.

Re: Primeros pasos para pogramar un emulador

Publicado: 05 Sep 2018, 17:50
por Bubu
AjAJjAjaJA, Namek, sí, va a ser mejor eso. Estamos dándole tantas vueltas, es que no es eso de lo que quería yo hablar aquí, pero ya que me dicen que no es como yo pienso, pos estaba intentando ver en qué me estaba equivocando. Pero es mejón dejarlo, ya saldrá el asunto, jiji. Thanx!

Re: Primeros pasos para pogramar un emulador

Publicado: 05 Sep 2018, 19:07
por zup
No sé si lo tienes claro y no te entendemos nosotros, o si no lo tienes tan claro.

La clave es que el proceso de dibujado de la pantalla no es "instantáneo". Es un proceso que vuelve a empezar 50 veces por segundo, y que dura 20 ms. Durante esos 20 ms, la ULA va a irse reservando el derecho de acceso a una parte de la RAM cada cierto tiempo.



En este video (alrededor de los 2 o 3 minutos), muestran a cámara lenta como se dibuja la pantalla de una NES. Cada pixel que se dibuja es una lectura de memoria de video en ese mismo momento. En los únicos momentos en que NO se accede a la memoria de video es cuando el rayo de electrones retorna desde el borde derecho de la pantalla hacia el izquierdo para iniciar una nueva línea (retrazado horizontal), y cuando el rayo debe retornar de la parte inferior de la pantalla a la superior (retrazado vertical). Imagino que (en el caso del Spectrum) tampoco hay lectura de memoria cuando se dibuja el borde, pero eso que lo confirme alguien.

Una posible fuente de confusión es que en el mismo momento en que se inicia la generación de pantalla, el Spectrum también genera una interrupción. Esta es una interrupción normalita y la CPU la puede ignorar; lo que no puede ignorar (y es transparente para la CPU, en el sentido de que no se entera cuando sucede) es ese arbitraje que hace la ULA sobre la memoria.

Para terminar de liarlo un poco, resulta que la ULA solo congela la CPU cuando está haciendo cosas entre las direcciones 16384 y 32768... si nuestro código corre en la dirección 40000 no hay que tener en cuenta estas reglas de arbitraje.

¿Qué pasa si pasamos de todo esto y lo único que hacemos es leer la pantalla cada vez que se genera la interrupción de retrazado vertical?

Pues, de menos a más grave:
- No podemos hacer efectos de borde. Esos efectos dependen de que la ULA se entere del cambio de color de borde en su momento (y no cada 20 ms).
- No podemos hacer efectos multicolor. Estos efectos dependen de que cambiemos el color entre que la ULA lee una línea y la siguiente.
- En algunos juegos se produce un parpadeo insoportable.

Y, claro está, si no has tenido en cuenta eso resulta que tu Spectrum emulado no tiene los timings correctos (no hay contención) lo que puede producir otra batería de efectos no deseados.

Re: Primeros pasos para pogramar un emulador

Publicado: 06 Sep 2018, 10:11
por chernandezba
zup escribió:Imagino que (en el caso del Spectrum) tampoco hay lectura de memoria cuando se dibuja el borde, pero eso que lo confirme alguien.



Te lo confirmo ;) De ahí se deriva que no hay contienda de memoria cuando se dibuja el border ni cuando se está haciendo retrace horizontal o vertical

Re: Primeros pasos para pogramar un emulador

Publicado: 06 Sep 2018, 15:25
por Bubu
Cuando se dibuja el border lo que la ULA necesita es el bus de datos, entiendo yo, que se hace con OUT (0xFE), N
donde 0xFE puede ser cualquier número que acabe con BIT(0)=0, y N es el dato

Re: Primeros pasos para pogramar un emulador

Publicado: 07 Sep 2018, 12:12
por chernandezba
Bubu escribió:Cuando se dibuja el border lo que la ULA necesita es el bus de datos, entiendo yo, que se hace con OUT (0xFE), N
donde 0xFE puede ser cualquier número que acabe con BIT(0)=0, y N es el dato


El puerto, si, es correcto, cualquier puerto par.
Lo del bus de datos, creo que estrictamente hablando no se obtiene el color del borde del "bus de datos", hasta lo que yo se del Z80, en el bus de datos va a parar cualquier dato a escribir o leer, por lo que si fuera lo que tu dices, cualquier escritura de memoria alteraria el color del border, cosa que no es así.

Por tanto, el color sale del último valor enviado a dicho puerto, no del bus de datos como tal...

Re: Primeros pasos para pogramar un emulador

Publicado: 07 Sep 2018, 12:58
por Bubu
Evidentemente los buses se ponen con impedancia alta o baja para ser usados exclusivamente por algún componente.

Re: Primeros pasos para pogramar un emulador

Publicado: 07 Sep 2018, 17:48
por ZX-81
Llego a este hilo un poco tarde, he estado toda la semana fuera y me ha sido imposible atender a los foros. Pero yo empezaría por la emulación del Z80. Tiene muchísimo trabajo si quieres hacerlo bien. Y debes hacerlo bien porque si no, cuando un programa te falle, no sabrás si lo hace por el core Z80 o por alguna otra cosa. O vas eliminando incertidumbre de cada parte o te vuelves loco.

Y para emular bien el Spectrum tienes que hacerlo como te dicen, no vale con pintar la pantalla al final de cada cuadro. Uno de los juegos que se vuelven imposibles de jugar es el Arkanoid, por ejemplo. Pero con esa emulación calculo que funcionarán el 80% de los programas, todo hay que decirlo. El 20% restante... échate a temblar, sobre todo con el último 5%.