Página 2 de 20

Re: Primeros pasos para pogramar un emulador

Publicado: 04 Sep 2018, 20:17
por explorer
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.

Re: Primeros pasos para pogramar un emulador

Publicado: 04 Sep 2018, 20:46
por PabloMarmol
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.

Re: Primeros pasos para pogramar un emulador

Publicado: 04 Sep 2018, 21:46
por Namek
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.

Re: Primeros pasos para pogramar un emulador

Publicado: 04 Sep 2018, 23:29
por Bubu
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"?

Re: Primeros pasos para pogramar un emulador

Publicado: 04 Sep 2018, 23:31
por Bubu
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?

Re: Primeros pasos para pogramar un emulador

Publicado: 05 Sep 2018, 00:04
por chernandezba
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

Re: Primeros pasos para pogramar un emulador

Publicado: 05 Sep 2018, 00:28
por Bubu
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!!

Re: Primeros pasos para pogramar un emulador

Publicado: 05 Sep 2018, 07:46
por zup
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.

Re: Primeros pasos para pogramar un emulador

Publicado: 05 Sep 2018, 10:57
por chernandezba
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

Re: Primeros pasos para pogramar un emulador

Publicado: 05 Sep 2018, 16:47
por Bubu
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