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
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 520
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: 12 veces
Gracias recibidas: 15 veces

Primeros pasos para pogramar un emulador

Mensajepor Bubu » 04 Sep 2018, 16:53

¡Jarl, torpedos!

Resulta que me ha dado por pensar... ¿cómo se hacen los emuladores? Yo tengo cierta idea de cómo sería, y tengo la curiosidad de hacerlo y ver si al echarlo a andar, al menos el arranque sale la misma pantalla que la máquina emulada. Eso sería un puntazo.
Está claro que hay 3 cosas fundamentales:

(1) Conocer a la perfección la máquina emulada
(2) Elegir un lenguaje de pogramación adecuado
(3) Elegir librerías gráficas y de sonido adecuadas

En mi caso:

(1) voy a elegir el Zx Spectrum porque es la máquina que coñozco a la perfección.
(2) voy a elegir el VB porque es un lenguaje muy básico y que me permite tener resultados desde el primer minuto. Además, como no es para distribuir, sino que es para mi propio uso personal, pos eso.
(3) aquí ni idea.

Centrándonos pues en el caso del Zx Spectrum, sabemos que tiene una CPU Z80, una ROM de 16KB, una RAM de 16KB ó 48KB según el modelo. Tiene una ULA la cual cada 1/50 segundos bloquea a la CPU, se mete en la RAM (en los 16KB primeros) y vuelca su contenido a la pantalla, a parte de hacer más cosas como generar sonido, escuchar sonido, etc.

Quiero obtener resultados YA (jiji, qué poquita paciencia tengo), por lo que lo primero que voy a pogramar es la parte de la ULA. Al arrancar el emulador, la ULA debería leer la RAM, que tendrá valores aleatorios, y poner la pantalla llena de cuadraditos de colores aleatorios, y no hacer nada más.

Duditas: ¿cómo haríais vosotros el tema de la ULA? ¿Un disparador de tal manera que cada 1/50 segundos salte, lea la RAM, pinte la pantalla, y ponga el borde según el bus de datos?

Cuando haga la parte del Z80, ¿cómo sincronizo los timings de esta CPU con la CPU emuladora, que va a tropecientos gigahercios? ¿pongo una pausa infinita que sólo sea rota con otro disparador? Me refiero a cómo contar ciclos de reloj del Z80.


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

Avatar de Usuario
PabloMarmol
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 142
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 » 04 Sep 2018, 17:05

Uhmm, eso de que la ULA bloquea a la CPU cada 1/50s me hace sospechar que no coñoces a la perfección el spectrum ...
Mira la web de worldofspectrum (por decir un sitio), tiene una doc técnica bastante interesante para que te hagas una idea de como va el tema.
Y para la CPU mira el Undocumented z80 de Sean Young.

Aparte de echar un vistazo a otros emuladores, si te va lo de leer código de otros.

Avatar de Usuario
Namek
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 635
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 12 veces
Gracias recibidas: 27 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Namek » 04 Sep 2018, 17:16

Hola Bubu,

Ante todo decirte que no sabes en el berenjenal que te estas metiendo, después de esto si quieres resultados rápidos, no te compliques la vida, para una emulación funcional de un spectrum solo necesitas un buffer de 64K, copiar la ROM del spectrum en los primeros 16K, una rutina que genere la pantalla del spectrum desde la parte del buffer que correspondería con las direcciónes de pantalla del spectrum y que tendrías que procesar varias veces por segundo y el código necesario para simular el Z80 que básicamente iría leyendo la RAM desde la dirección 0 e interpretando cada valor con su instrucción Z80 correspondiente, por tanto necesitaras simular cada registro del Z80 y cada una de las instrucciones.

Si consigues eso, después te puedes poner con el teclado, el sonido, los timings, la carga de cintas, joysticks, etc... :mrgreen:

Yo empecé mi emulador de Spectrum en AMOS, luego lo pase a BLITZ BASIC y luego le fui metiendo ensamblador... :roll:

oscarbraindead
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 143
Registrado: 05 Oct 2012, 17:42
Sistema Favorito: Commodore Amiga
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo GameBoy
Primera consola: Atari 2600
Gracias dadas: 7 veces
Gracias recibidas: 1 vez

Re: Primeros pasos para pogramar un emulador

Mensajepor oscarbraindead » 04 Sep 2018, 18:18

Namek escribió:Hola Bubu,
Yo empecé mi emulador de Spectrum en AMOS, luego lo pase a BLITZ BASIC y luego le fui metiendo ensamblador... :roll:


Ánimo con ello, Bubu!
@Namek, ¿se puede probar el emu de spectrum en Amiga? ¿hay algún adf por ahí? ¿funciona en un A500?
Saludos!

Avatar de Usuario
Namek
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 635
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 12 veces
Gracias recibidas: 27 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Namek » 04 Sep 2018, 18:42

oscarbraindead escribió:
Namek escribió:Hola Bubu,
Yo empecé mi emulador de Spectrum en AMOS, luego lo pase a BLITZ BASIC y luego le fui metiendo ensamblador... :roll:


Ánimo con ello, Bubu!
@Namek, ¿se puede probar el emu de spectrum en Amiga? ¿hay algún adf por ahí? ¿funciona en un A500?
Saludos!

Pues en su momento lo subí a aminet aqui tienes el enlace:

http://aminet.net/package/misc/emu/Spectrum128

Tambien esta en www.worldofspectrum.org pero es la versión 0.2

Si que funciona en un A500 pero tendras que armarte de paciencia... :mrgreen:

Avatar de Usuario
Bubu
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 520
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: 12 veces
Gracias recibidas: 15 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Bubu » 04 Sep 2018, 18:59

PabloMarmol escribió:Uhmm, eso de que la ULA bloquea a la CPU cada 1/50s me hace sospechar que no coñoces a la perfección el spectrum ...


Bueno, ¿no comparten el bus de direcciones de la RAM baja tanto la CPU como la ULA? Esto hace que cuando le toca a la ULA leer los datos, la CPU no puede leerlos. Que yo sepa, vaya. ¿Cómo es entóns? Leer tutoriales y otros emuladores no puedo, me faltan horas... Demasiado que voy a intentar pogramar algo :(



Namek, tú lo que dices es que empiece por algo tal que así:

Código: Seleccionar todo

sp = 0
do
   procesa_cpu(sp)
loop


¿nor?



Cuando era joven pogramé un emulador de arcades para la GBA, que tenía un ARM7TDMI, me encantó esa CPU. En concreto emulé el Z80 de algunas placas JAMMA, como la del Frogger. Ni que decir tiene que la primera vez que vi en la GBA cómo se iniciaba el Frogger, y salían algunas cosas, aunque garabatos, pero siguiendo un patrón... eso no me s'olvidará jamás.

Ahora no tengo tanto tiempo, y me voy a conformar con esto del Spectrum pero a nivel bastante básico, la verdad.
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
PabloMarmol
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 142
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 » 04 Sep 2018, 19:19

Bubu escribió:Bueno, ¿no comparten el bus de direcciones de la RAM baja tanto la CPU como la ULA? Esto hace que cuando le toca a la ULA leer los datos, la CPU no puede leerlos.


Si, pero no solo 1 vez cada 20 ms.
Está accediendo a la memoria de pantalla "siempre que no se esté mostrando el borde o haya retrazado", que es muucho tiempo.

Avatar de Usuario
Bubu
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 520
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: 12 veces
Gracias recibidas: 15 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Bubu » 04 Sep 2018, 19:27

Pero ¿las teles no iban a 50Hz de refresco? Entóns, al borde se llega 1 vez cada 20ms, ¿nor?
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
PabloMarmol
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 142
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 » 04 Sep 2018, 20:05

Bubu escribió:Pero ¿las teles no iban a 50Hz de refresco? Entóns, al borde se llega 1 vez cada 20ms, ¿nor?
Si, en 20ms vuelves al mismo punto del borde.

Avatar de Usuario
Bubu
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 520
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: 12 veces
Gracias recibidas: 15 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Bubu » 04 Sep 2018, 20:10

Bueno, entóns, ¿cada cuánto tiempo despierto a la ULA para que lea la VRAM?
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!


Volver a “Emuladores”

¿Quién está conectado?

Usuarios navegando por este Foro: zup y 3 invitados