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
explorer
MSX Turbo R
MSX Turbo R
Mensajes: 400
Registrado: 11 May 2014, 17:10
Sistema Favorito: Atari ST
primer_sistema: Atari 800XL/600XL
consola_favorita: Atari 2600
Primera consola: Atari 2600
Ubicación: Valladolid, España
Gracias dadas: 2 veces
Gracias recibidas: 138 veces
Contactar:

Re: Primeros pasos para pogramar un emulador

Mensajepor explorer » 04 Sep 2018, 20:17

Algunos emuladores llevan la cuenta de los ciclos del reloj del sistema emulado, y así conseguir una emulación perfecta, a costa de un mayor consumo de la CPU principal.

Hay que contar los ciclos consumidos por cada instrucción, y saltar a las diversas interrupciones si se llega a los valores que espera cada circuito del hardware emulado.

Avatar de Usuario
PabloMarmol
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 171
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: 16 veces
Gracias recibidas: 18 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor PabloMarmol » 04 Sep 2018, 20:46

Bubu escribió:Bueno, entóns, ¿cada cuánto tiempo despierto a la ULA para que lea la VRAM?
Mientras esté recorriendo "la zona con pixels" creo recordar que lee una pareja de pixels+atributos cada 8 T-states, pero mejor confirmalo en la doc que te comentaba antes.

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 838
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 18 veces
Gracias recibidas: 63 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Namek » 04 Sep 2018, 21:46

Bubu escribió:Ahora no tengo tanto tiempo, y me voy a conformar con esto del Spectrum pero a nivel bastante básico, la verdad.

Para programar un emualdor de Spectrum basico te puedes olvidar de los timings por ahora y actualizar la pantalla 50 veces por segundo y lanzar las interrupciones al mismo tiempo de esa forma todos los juegos que utilicen interrupciones, que son la mayoria, te van a funcionar practicamente igual que en un Spectrum de verdad, los que no lo hagan seguramente te funcionaran mucho mas rapido, pero al menos te puedo asegurar que funcionara el 99% de los juegos, mi emulador lo hace asi y es bastante compatible, por supuesto los efectos de borde o multicolor no se veran correctamente, para eso hace falta una emulación casi perfecta.

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 886
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: 20 veces
Gracias recibidas: 60 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Bubu » 04 Sep 2018, 23:29

OK, Namek, así haré. Uséase, tú propones que el trigger se dispare 50 veces por segundo, para astualizar la pantalla leyendo lo que haya en la VRAM, y que lo que es la CPU vaya a toa hostia. Es buena idea... Deberían funcionar todos los juegos que sean "normales" y que no utilicen cosas raras como sincronizar los gráficos con las interrupciones, p.ej. Pa empezar la ROM debería funcionar sin poblemas...

Otra cosa, ¿cómo emulas el FLASH? ¿Parpadea cá segundo? ¿Se coñoce oficialmente el tiempo que está el FLASH "vibrando"?
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 886
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: 20 veces
Gracias recibidas: 60 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Bubu » 04 Sep 2018, 23:31

explorer escribió:Algunos emuladores llevan la cuenta de los ciclos del reloj del sistema emulado, y así conseguir una emulación perfecta, a costa de un mayor consumo de la CPU principal.

Hay que contar los ciclos consumidos por cada instrucción, y saltar a las diversas interrupciones si se llega a los valores que espera cada circuito del hardware emulado.


Así lo haré yo, de hecho así lo hacía con el emulador que hice en la GBA, pero claro, el ARM7DMI iba a una velocidad comparable al Z80, pero es que las CPU's de los ordeñadores van a varios GHz, y el Z80 va a 3,5MHz. ¿Cómo lo hago pa esperar el momento? ¿Con otro trigger que dispare la lestura de la memoria?
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

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

Re: Primeros pasos para pogramar un emulador

Mensajepor chernandezba » 05 Sep 2018, 00:04

Buenas

Te digo como lo hago yo en ZEsarUX, que es más o menos como lo hacen todos los emuladores.
Yo tengo un temporizador a 50 hz que me sirve de disparador de muchos eventos
Por una parte, la velocidad de la cpu. Tu sabes que un Z80 del spectrum 48k ejecuta 69888 ciclos cada 1/50 segundos? Pues lo que tienes que ir haciendo es contar ciclos de cada instrucción, por ejemplo, la lectura de un opcode son 4 ciclos, una lectura de memoria son 3 ciclos, etc. Vas ejecutando instrucciones y sumando ciclos y cuando llegues a esos 69888 ciclos, te metes en una pausa hasta que se dispare la interrupción de 1/50, así de simple
En cuanto a dibujar la pantalla, si lo haces de golpe, 50 veces por Segundo, solo leyendo la memoria en ese momento, se verán bien el 90% de los juegos pero no tendrás efectos de color en alta resolución, ni franjas en el border, y además muchos juegos tendrán parpadeos (esto es como lo hago yo en ZEsarUX con el setting real video a off)
Para hacerlo bien, a medida que ejecutes instrucciones, debes de ir guardándote en algún buffer cada scanline como está en ese momento. Piensa que en un spectrum real, hay una tv con una posición de electrón que barre la pantalla de manera horizontal y vertical. Si te guardas cada scanline a medida que se van ejecutando instrucciones, luego al final de cada interrupción, puedes volcar todo ese buffer en pantalla y entonces si, se verá exactamente igual que un Spectrum

En cuanto al sonido, puedes hacer de manera parecida a la pantalla. Te vas guardando en un buffer los valores de speaker y chip ay en cada momento, y al final de tu frame de pantalla, lanzas ese buffer de audio a la tarjeta de sonido

En fin, es fácil y complejo a la vez. Recuerda que la memoria contenida te agrega ciclos extra, esto si no lo haces, habrán muchos juegos que funcionaran acelerados (como un Inves, que no tiene memoria contenida)

Yo con ZEsarUX empecé casi como tú: tenía una rutina que me mostraba el contenido de la pantalla de vídeo... aunque como en ese momento no sabía como hacer una ventana gráfica, solo tenía una ventana de texto.., por lo que hacia una especie de OCR para buscar caracteres en la memoria del Spectrum y los mostraba en pantalla de texto (una terminal Linux de texto pura)
Desde ahí empecé a emular cada instrucción del Z80, una a una.... Y el resto es historia ;)

En cuanto al lenguaje yo soy partidario de C, creo que pocos lenguajes te darán más rendimiento que este, exceptuando el assembler. Mi primer emulador (ZXSpectr) estaba en assembler para x86 y el rendimiento era brutal, eso si, era mucho más simple que ZEsarUX

Ánimo!
Saludos
César
----

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

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 886
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: 20 veces
Gracias recibidas: 60 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Bubu » 05 Sep 2018, 00:28

Me parece perfesto, chernandezba, esa info es la que necesitaba. En mi caso, como me voy a centrar sólo en el modelo 16/48 KB, no uso chip AY, sino el beeper, pos buscaré alguna función en el lenguaje de pogramación que elija pa ver si es fácil mandar bits 1 y 0 a la tarjeta de sonido y ya.

Lo primero que voy a meterle mano es a crear un set de instrucciones básicos, y a ir mostrando el valor de los registros pa ver que va funcionando los algorismos Z80.

¡¡Muchas gracias!!
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
zup
Amiga 2500
Amiga 2500
Mensajes: 2970
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: 68 veces
Gracias recibidas: 326 veces
Contactar:

Re: Primeros pasos para pogramar un emulador

Mensajepor zup » 05 Sep 2018, 07:46

Buf... creo que tienes bastante liados los conceptos de cómo funciona el audio y el vídeo en un Spectrum...

Como idea alternativa, yo empezaría con algo más sencillo, quizás una Game and Watch o algo así (el vídeo es "instantáneo" y el sonido puedes resolverlo a base de samples).

El vídeo del Spectrum y, en general, de todos los ordenadores: nunca es instantáneo ni es una vez cada 20 ms. En los viejos CRT, hay un rayo de electrones que va barriendo en líneas de izquierda a derecha y de arriba a abajo la pantalla. Al acabar, usa el tiempo de x líneas (no recuerdo cuántas) para volver arriba (a esto se le llama retrazado vertical). Todo ese ciclo dura esos 20ms que dices.

En el caso del Spectrum la cosa es más sangrante ya que, al no disponer de memoria de doble puerto, cada vez que la ULA necesita leer algo de la memoria de pantalla puede "congelar" a la CPU (nota que uso la palabra "congelar"). A esto se le llama contención de memoria y es un efecto clave para conseguir la velocidad exacta. Las interrupciones se generan (si mal no recuerdo) al principio de cada frame.

En el caso de que decidas hacerlo una vez por frame... bueno, eso lo hacían los emuladores más primitivos. ¿Funciona? Sí, pero no del todo bien. En algunos juegos (p.ej.: Mad Mix Game) se producen parpadeos verdaderamente molestos. Y olvídate de efectos multicolor y de borde que solo se producen cuando modificas la memoria de pantalla mientras se está produciendo la lectura.

El sonido también se las trae aunque es aparentemente simple. Tú envías un cero o un uno a la ULA, y la ULA lo manda al altavoz. Todo muy simple... hasta que descubres que la tarjeta de sonido de tu PC espera algo más elaborado que un cero o un uno. En la forma más simple, deberías hacer lo mismo pero resulta que la tarjeta de sonido va a necesitar que le mandes unos y ceros todos seguidos (mientras que en el Spectrum mandas un cero, en la tarjeta de sonido deberías mandar un montón de ceros seguidos hasta que cambie el estado) y con una frecuencia determinada.

En otros equipos (PC, por ejemplo) algunos juegos tienen en cuenta el tiempo que tarda el speaker de pasar de totalmente contraído a totalmente expandido... y hacen virguerías con eso. Prueba a jugar al Pinball Fantasies usando el PC Speaker y verás. Eso requiere un tratamiento muy cuidadoso del sonido... pero afortunadamente parece que solo pasa en PCs.
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: 253
Registrado: 11 Mar 2015, 10:42
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: ZX81
consola_favorita: NeoGeo
Primera consola: Atari 2600
Gracias dadas: 12 veces
Gracias recibidas: 132 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor chernandezba » 05 Sep 2018, 10:57

Bubu escribió:Me parece perfesto, chernandezba, esa info es la que necesitaba. En mi caso, como me voy a centrar sólo en el modelo 16/48 KB, no uso chip AY, sino el beeper, pos buscaré alguna función en el lenguaje de pogramación que elija pa ver si es fácil mandar bits 1 y 0 a la tarjeta de sonido y ya.


¡¡Muchas gracias!!


Lo mas fácil para empezar, es que envíes sólo dos valores distintos a la tarjeta de sonido, según si el speaker del spectrum está activo o no.
Si consideras un caso muy simple de sampleado a 8 bits signed, puedes considerar enviar un valor +127 cuando el speaker está activo, y un -128 cuando el speaker está inactivo. Esto genera una onda cuadrada completamente, al máximo de volúmen; aunque habrán muchos juegos que se escuchen bien, no lo harán muchos otros, por lo que lo mejor es enviar valores del sample según el tiempo que haya permanecido el speaker activo o inactivo. Estos dos modos de funcionar también los tengo en ZEsarUX, es la diferencia entre "real beeper" activado o no, y lógicamente, el método mas complejo, te consume mas cpu.
Pero bueno, como digo para empezar, piensa sólo en dos posibles valores y el resultado será muy bueno

Saludos
----

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

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 886
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: 20 veces
Gracias recibidas: 60 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Bubu » 05 Sep 2018, 16:47

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

Imagen
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!


Volver a “Emuladores”

¿Quién está conectado?

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