Primeros pasos para pogramar un emulador

Foro dedicado a la emulación de sistemas clásicos en el PC o en otros sistemas.
Avatar de Usuario
chernandezba
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 231
Registrado: 11 Mar 2015, 10:42
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: ZX81
consola_favorita: NeoGeo
Primera consola: Atari 2600
Gracias dadas: 10 veces
Gracias recibidas: 82 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor chernandezba » 05 Sep 2018, 17:03

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"
----

ZEsarUX
ZX Second-Emulator And Released for UniX
https://github.com/chernandezba/zesarux

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 730
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 15 veces
Gracias recibidas: 37 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Namek » 05 Sep 2018, 17:45

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:

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 803
Registrado: 04 Abr 2018, 23:10
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Atari 2600
Primera consola: Nintendo GameBoy
Gracias dadas: 15 veces
Gracias recibidas: 32 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Bubu » 05 Sep 2018, 17:49

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á.
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 803
Registrado: 04 Abr 2018, 23:10
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Atari 2600
Primera consola: Nintendo GameBoy
Gracias dadas: 15 veces
Gracias recibidas: 32 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Bubu » 05 Sep 2018, 17:50

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!
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
zup
Amiga 2500
Amiga 2500
Mensajes: 2725
Registrado: 04 Sep 2009, 20:07
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo DS/3DS
Primera consola: Nintendo GameBoy
Ubicación: Navarra
Gracias dadas: 49 veces
Gracias recibidas: 210 veces
Contactar:

Re: Primeros pasos para pogramar un emulador

Mensajepor zup » 05 Sep 2018, 19:07

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.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start.
Además vendo cosas!

Avatar de Usuario
chernandezba
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 231
Registrado: 11 Mar 2015, 10:42
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: ZX81
consola_favorita: NeoGeo
Primera consola: Atari 2600
Gracias dadas: 10 veces
Gracias recibidas: 82 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor chernandezba » 06 Sep 2018, 10:11

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
----

ZEsarUX
ZX Second-Emulator And Released for UniX
https://github.com/chernandezba/zesarux

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 803
Registrado: 04 Abr 2018, 23:10
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Atari 2600
Primera consola: Nintendo GameBoy
Gracias dadas: 15 veces
Gracias recibidas: 32 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Bubu » 06 Sep 2018, 15:25

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
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
chernandezba
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 231
Registrado: 11 Mar 2015, 10:42
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: ZX81
consola_favorita: NeoGeo
Primera consola: Atari 2600
Gracias dadas: 10 veces
Gracias recibidas: 82 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor chernandezba » 07 Sep 2018, 12:12

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...
----

ZEsarUX
ZX Second-Emulator And Released for UniX
https://github.com/chernandezba/zesarux

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 803
Registrado: 04 Abr 2018, 23:10
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Atari 2600
Primera consola: Nintendo GameBoy
Gracias dadas: 15 veces
Gracias recibidas: 32 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Bubu » 07 Sep 2018, 12:58

Evidentemente los buses se ponen con impedancia alta o baja para ser usados exclusivamente por algún componente.
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

ZX-81
Commodore 128
Commodore 128
Mensajes: 117
Registrado: 04 Ene 2013, 16:43
Sistema Favorito: Spectrum +2
primer_sistema: ZX81
consola_favorita: Nintendo DS/3DS
Primera consola: Sega Genesis/Megadrive
Ubicación: La orilla del mar Mediterráneo
Gracias dadas: 15 veces
Gracias recibidas: 23 veces
Contactar:

Re: Primeros pasos para pogramar un emulador

Mensajepor ZX-81 » 07 Sep 2018, 17:48

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%.
Todo espacio de dimensión finita distinta de cero con producto interno tiene una base ortonormal. Tiene sentido, cuando no piensas sobre ello.
Profesor de Matemáticas U.C. Berkeley

Empieza a jugar sin tener que compilar: JSpeccy
Emulador bare-metal para la Raspberry PI 2/3: ZXBaremulator


Volver a “Emuladores”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados