¡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!
Primeros pasos para pogramar un emulador
- PabloMarmol
- 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: 18 veces
- Gracias recibidas: 18 veces
Re: Primeros pasos para pogramar un emulador
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.
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.
- Namek
- Atari 1040 STf
- Mensajes: 840
- Registrado: 11 Jul 2011, 13:13
- Gracias dadas: 18 veces
- Gracias recibidas: 63 veces
Re: Primeros pasos para pogramar un emulador
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...
Yo empecé mi emulador de Spectrum en AMOS, luego lo pase a BLITZ BASIC y luego le fui metiendo ensamblador...
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...

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

-
- Amstrad PCW 8256
- Mensajes: 150
- 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: 8 veces
- Gracias recibidas: 2 veces
Re: Primeros pasos para pogramar un emulador
Namek escribió:Hola Bubu,
Yo empecé mi emulador de Spectrum en AMOS, luego lo pase a BLITZ BASIC y luego le fui metiendo ensamblador...
Á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!
- Namek
- Atari 1040 STf
- Mensajes: 840
- Registrado: 11 Jul 2011, 13:13
- Gracias dadas: 18 veces
- Gracias recibidas: 63 veces
Re: Primeros pasos para pogramar un emulador
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...
Á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...

- Bubu
- Atari 1040 STf
- Mensajes: 895
- 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: 21 veces
- Gracias recibidas: 67 veces
Re: Primeros pasos para pogramar un emulador
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!!
- PabloMarmol
- 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: 18 veces
- Gracias recibidas: 18 veces
Re: Primeros pasos para pogramar un emulador
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.
- Bubu
- Atari 1040 STf
- Mensajes: 895
- 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: 21 veces
- Gracias recibidas: 67 veces
Re: Primeros pasos para pogramar un emulador
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!!
- PabloMarmol
- 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: 18 veces
- Gracias recibidas: 18 veces
Re: Primeros pasos para pogramar un emulador
Si, en 20ms vuelves al mismo punto del borde.Bubu escribió:Pero ¿las teles no iban a 50Hz de refresco? Entóns, al borde se llega 1 vez cada 20ms, ¿nor?
- Bubu
- Atari 1040 STf
- Mensajes: 895
- 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: 21 veces
- Gracias recibidas: 67 veces
Re: Primeros pasos para pogramar un emulador
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!!
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 6 invitados