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
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 668
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: 14 veces
Gracias recibidas: 19 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Bubu » 19 Sep 2018, 20:04

Es complicado explicarme con palabras, necesito expresarlo esquemáticamente. A ver dónde me estoy evivocando:

Código: Seleccionar todo

- Z80 ejecuta cosas, hasta que T=69888
- Z80 se para
- ULA se activa
- ULA lee valor del puerto 254, y lo memoriza.
- pinta la primera línea de las 296 líneas totales de imagen. En este caso es sólo borde, con el color que se memorizó.
- pinta la segunda línea de las 296 líneas totales de imagen. En este caso es sólo borde, con el color que se memorizó.
- etc
- pinta la línea número 100 de las 296 líneas totales de imagen. En este caso es 48 píxeles de borde (con el color que se memorizó), 256 píxeles de imagen, y 48 píxeles de borde
- etc
- pinta la última línea de las 296 líneas totales de imagen. En este caso es sólo borde, con el color que se memorizó.
- ULA se para
- Z80 se activa.


¿Ves bien implementar esto así?
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
PabloMarmol
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 144
Registrado: 03 Sep 2012, 17:32
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
Primera consola: Nintendo NES/Clónica
Ubicación: León, España
Gracias dadas: 6 veces
Gracias recibidas: 6 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor PabloMarmol » 19 Sep 2018, 20:14

Bubu escribió:¿Ves bien implementar esto así?
Claro que lo veo bien. Impleméntalo como quieras. Pero por favor, cuando plantees una cuestión, distingue lo que es "como funciona la ula" y "como funciona mi emulador".

Cuando preguntas por la ula y el borde y el puerto 254, entiendo que te refieres a "el mundo real", y no a la adaptación recortada que estás haciendo en tu emulador.

Y si, en el caso de tu emulador, has decidido hacer pantallazos, pantallas creadas de una sola vez, y obviamente entonces el borde también será "un pantallazo", un borde creado de una sola vez.

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 668
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: 14 veces
Gracias recibidas: 19 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Bubu » 19 Sep 2018, 20:17

Es que lo que pregunto es cómo funciona el Spectrum realmente, y ya yo lo implementaré como pueda en el emulador. No me gusta pogramar las cosas mal de partida, sino que teniendo claro cómo es la realidad, ver qué debo sacrificar y qué no en el mundo emulado. Así que, ¿funciona el Spectrum así como puse en el esquema anterior? ¿Cómo es realmente?
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
PabloMarmol
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 144
Registrado: 03 Sep 2012, 17:32
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
Primera consola: Nintendo NES/Clónica
Ubicación: León, España
Gracias dadas: 6 veces
Gracias recibidas: 6 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor PabloMarmol » 19 Sep 2018, 20:29

Bubu escribió:¿funciona el Spectrum así como puse en el esquema anterior? ¿Cómo es realmente?
Obviamente no funciona así. Y si relees los mensajes anteriores, mios y de otros (como chernandezba) verás como es realmente. Se ha descrito varias veces ya. Y en la web que enlazaste por la mañana (la de Chris Smith) mas de lo mismo.

En el mensaje que te escribí hoy mismo:
> Que no hay pantallazos, que la imagen se "crea" de continuo, no de una vez. Y la ULA actualizará el color del borde cada vez que lo cambies con un out.

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 660
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 12 veces
Gracias recibidas: 33 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Namek » 19 Sep 2018, 23:33

Bubu escribió:Es complicado explicarme con palabras, necesito expresarlo esquemáticamente. A ver dónde me estoy evivocando:

Código: Seleccionar todo

- Z80 ejecuta cosas, hasta que T=69888
- Z80 se para
- ULA se activa
- ULA lee valor del puerto 254, y lo memoriza.
- pinta la primera línea de las 296 líneas totales de imagen. En este caso es sólo borde, con el color que se memorizó.
- pinta la segunda línea de las 296 líneas totales de imagen. En este caso es sólo borde, con el color que se memorizó.
- etc
- pinta la línea número 100 de las 296 líneas totales de imagen. En este caso es 48 píxeles de borde (con el color que se memorizó), 256 píxeles de imagen, y 48 píxeles de borde
- etc
- pinta la última línea de las 296 líneas totales de imagen. En este caso es sólo borde, con el color que se memorizó.
- ULA se para
- Z80 se activa.


¿Ves bien implementar esto así?

Mientras la ULA pinta la pantalla el Z80 no se para, sigue trabajando, de lo contrario no se podrian hacer los efectos multicolor. De hecho decir que la pantalla se actualiza cada 69888 ciclos es incorrecto, lo correcto es decir que cada 69888 ciclos comienza a actualizarse la pantalla, y esto se puede entender mejor si vemos como se calcula esto:

La imagen se actualiza 50 veces por segundo, las mismas 50 veces que saltan las interupciones, por tanto cada 69888 ciclos comienza a actualizarse la imagen y salta una interrupción, y por que cada 69888 ciclos?, pues por que 69888 x 50 = 3494400 que son el total de ciclos que procesa el Z80 por segundo que curiosamente coincide con los 3,5 Mhz que es la frecuencia a la que trabaja el Z80 del Spectrum, si ahora dividimos esos 69888 ciclos entre las 296 lineas que tiene la pantalla pues nos sale que el Z80 procesa 236 ciclos cada vez que se actualiza una linea de la pantalla, por lo cual si yo en mi programa cambio el color del borde cada 236 ciclos conseguire poner cada una de las 296 lineas del borde de un color distinto.

Sencillo verdad...? :mrgreen:

Por cierto, la ULA tampoco para nunca, en cuanto termina de dibujar la ultima linea comienza a dibujar la primera, aunque creo que hay una ligera espera que es lo que tarda el rayo catodico de la TV en saltar de la ultima a la primera linea.
Última edición por Namek el 21 Sep 2018, 09:15, editado 1 vez en total.

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 668
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: 14 veces
Gracias recibidas: 19 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Bubu » 20 Sep 2018, 10:11

Namek, muchas gracias, ahora sí lo veo claro y sencillo de implementar. Te huro por tó la cosas que creía haber leído en este hilo por varios compis que la ULA no empezaba a generar la imagen 1 vez cá 50 ms, y yo que sí, y los compis que no... De ahí que me he acabado liando. Pero yastá. Todo aclarado.

Voy a intentar entonces restablecer el esquema que puse antes de cuál es el comportamiento de un Spectrum real:

Código: Seleccionar todo

- Z80 ejecuta cosas, hasta que T=69888
- ULA "se activa" y bloquea el acceso del Z80 a la RAM baja.
- ULA va a pintar la primera línea de las 296 totales. Para ello, lee el valor actual del puerto 254 y sólo pinta borde.
- (Z80 sigue ejecutando sus cosas. Si intenta acceder a la RAM baja, el Z80 se bloquea)
- ULA va a pintar la segunda línea de las 296 totales. Para ello, lee el valor actual del puerto 254 y sólo pinta borde.
- (Z80 sigue ejecutando sus cosas. Si intenta acceder a la RAM baja, el Z80 se bloquea)
- etc
- ULA va a pintar la línea número 49 de las 296 totales. Para ello, lee el valor actual del puerto 254, pinta el borde izquierdo, y va leyendo los primeros 32 bytes de la VRAM y va pintando la primera línea del screen$, y finalmente pinta el borde derecho con el mismo color que el izquierdo.
- ULA va a pintar la línea número 50 de las 296 totales. Para ello, lee el valor actual del puerto 254, pinta el borde izquierdo, y va leyendo los correspondientes 32 bytes de la VRAM y va pintando la segunda línea del screen$, y finalmente pinta el borde derecho con el mismo color que el izquierdo.
- etc
- ULA va a pintar la última línea de las 296 totales. Para ello, lee el valor actual del puerto 254 y sólo pinta borde.
- ULA "se para" y desbloquea el acceso del Z80 a la RAM baja
- Z80 sigue ejecutando sus cosas


Uséase, que la memoria baja sólo está accesible al Z80 durante el pequeño espacio de tiempo que la ULA está esperando a que la tele empiece a dibujar de nuevo la primera línea de todas.

Espero que esta vez sí que sí :D
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 660
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 12 veces
Gracias recibidas: 33 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Namek » 20 Sep 2018, 12:19

Bubu escribió:Uséase, que la memoria baja sólo está accesible al Z80 durante el pequeño espacio de tiempo que la ULA está esperando a que la tele empiece a dibujar de nuevo la primera línea de todas.

Espero que esta vez sí que sí :D
Pos tampoco, la ULA solo bloquea el acceso al Z80 si los dos intentan leer o escribir (escribir solo en caso del Z80) en la RAM baja a la vez, por tanto si mi programa intenta leer o escribir a la RAM baja justo cuando la ULA esta leyendo, en ese momento el Z80 quedara a la espera de que la ULA termine de leer el dato, justo despues mientras la ULA representa esa información en pantalla el Z80 lee o escribe su dato, y vuelta a empezar, por eso el acceso a RAM baja es mas lento, porque la ULA y el Z80 comparten el tiempo de acceso por turnos.

Avatar de Usuario
chernandezba
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 221
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: 60 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor chernandezba » 20 Sep 2018, 22:58

PabloMarmol escribió:
Bubu escribió:¿funciona el Spectrum así como puse en el esquema anterior? ¿Cómo es realmente?
Obviamente no funciona así. Y si relees los mensajes anteriores, mios y de otros (como chernandezba) verás como es realmente. Se ha descrito varias veces ya.

Efectivamente, varios te lo hemos explicado de varias maneras, deberías releer los mensajes. Y ver ese vídeo en cámara lenta del electrón moviéndose por pantalla...
----

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

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 668
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: 14 veces
Gracias recibidas: 19 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Bubu » 20 Sep 2018, 23:04

Perdón a todos. Sí he releído en su momento los mensajes, pero es que me daba la sensación de leer a veces cosas contradistorias, debe ser que me faltan horas de sueño... De todas formas ya por fin lo tengo claro. Y ya a los que habéis hecho emuladores, una última pregunta:

teniendo en cuén que en un Spectrum la ULA y el Z80 trabajan simultáneamente, ¿cómo lo hacéis en vuestros emuladores? ¿atendéis una instrucción del Z80 y acto seguido a la ULA haciendo que dibuje un píxel, y después otra vez el Z80, etc, o con algún temporizador, o cómorrrrr?
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 660
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 12 veces
Gracias recibidas: 33 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Namek » 21 Sep 2018, 00:55

Bubu escribió:teniendo en cuén que en un Spectrum la ULA y el Z80 trabajan simultáneamente, ¿cómo lo hacéis en vuestros emuladores? ¿atendéis una instrucción del Z80 y acto seguido a la ULA haciendo que dibuje un píxel, y después otra vez el Z80, etc, o con algún temporizador, o cómorrrrr?
Pues eso depende de la precisión que le quieras dar a tu emulador, si quieres hacerlo perfecto y que todos los efectos multicolor se vean correctamente tendrás que realizar el proceso en paralelo junto al Z80 pintando justo en el ciclo exacto cada 8 píxels, que creo que es lo mínimo que actualiza la ULA de una sola vez.

Yo por mi parte paso de comerme el coco y vuelco la pantalla de golpe ignorando completamente los ciclos, si quiero ver efectos multicolor uso alguno de los emuladores que ya están hechos... :mrgreen:


Volver a “Emuladores”

¿Quién está conectado?

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