Página 1 de 1

Nuevo emulador de Spectrum y tutoriales - YASS

Publicado: Mié Sep 12, 2012 6:14 pm
por FMarcos
Saludos a todos - soy nuevo por aquí y aprovecho para presentarme.

Me llamo Fernando, y soy programador desde los años 80. Aunque mi trabajo habitual nada tiene que ver con éste mundo, siempre tengo inquietudes por aprender más cosas, y este verano lo he dedicado a aprender cómo era el Sinclair ZX Spectrum "por dentro". Yo era (ejem) "del otro bando" (aunque no me guste nada como suena la frase), de los Commodore 64, VIC 20 y Amiga y fui redactor de las revistas Commodore World y Amiga World de la época.

La verdad es que me ha encantado este tiempo de aprendizaje y me he permitido desarrollar un emulador más o menos completo de un Sinclair ZX Spectrum (YASS - "Yet Another Spectrum Simulator"), con la diferencia de que he publicado el proceso completo paso a paso en mi blog (http://efepuntomarcos.wordpress.com/2012/08/27/hazte-un-spectrum-1-parte/), empezando estríctamente desde cero, y considero que quizá os interese como material adicional para esta fantástica web. La verdad es que os he encontrado un poco tarde, porque todo el material que he ido obteniendo ha salido de WorldOfSpectrum. Pero más vale tarde que nunca.

El "tutorial" consiste en 8 capítulos y comienza desde el diseño básico de la emulación de buses y cpu, la implementación de instrucciones, montar la primera máquina básica para probar el procesador y echarla a andar... para terminar describiendo el funcionamiento del chip ULA, del audio, etc, todo ello acompañado con el código fuente correspondiente, paso a paso. En las entradas encontraréis enlaces tanto al emulador ya compilado como al código fuente completo.

Webmaster (Sir Clive) me ha propuesto hospedar tanto el tutorial como el emulador en esta web y si asi lo consideráis oportuno estaré encantado de "traerme" todo el contenido. Y, por supuesto, quedo a vuestra absoluta disposición para todo lo que me queráis comentar del proyecto - yo soy "el nuevo", tanto en éste foro como en el mundo del Spectrum.

Saludos y gracias a todos!

Re: Nuevo emulador de Spectrum y tutoriales - YASS

Publicado: Mié Sep 12, 2012 7:58 pm
por jzx
Pues bienvenido. Ya iré leyendo lo del emulador, a ver si me entero de algo (es que de C++ sé poco más que que existe). Pero parece interesante (he leido ya un poco,)

Re: Nuevo emulador de Spectrum y tutoriales - YASS

Publicado: Mié Sep 12, 2012 9:07 pm
por FMarcos
jzx escribió:Pues bienvenido. Ya iré leyendo lo del emulador, a ver si me entero de algo (es que de C++ sé poco más que que existe). Pero parece interesante (he leido ya un poco,)


Muchísimas gracias! Y espero que le saques provecho - simplemente que me digas que lo encuentras medianamente interesante, para mi ya es todo un logro!!

Re: Nuevo emulador de Spectrum y tutoriales - YASS

Publicado: Mié Sep 12, 2012 9:26 pm
por radastan
Aquí otro interesado, me viene de perlas para ampliar mi herramienta de desarrollo.

Re: Nuevo emulador de Spectrum y tutoriales - YASS

Publicado: Mié Sep 12, 2012 9:37 pm
por climacus
Muchas gracias. Como sea la mitad de interesante de lo que me imagino, memeotoo

Re: Nuevo emulador de Spectrum y tutoriales - YASS

Publicado: Mié Sep 12, 2012 10:17 pm
por antoniovillena
Bienvenido y enhorabuena por el emulador. Tiene muy buena pinta, me ha encantado el borde de la TV con esquinas redondeadas, le da mucho realismo. ¿Le has pasado algunos de estos test?

http://wizard.ae.krakow.pl/~jb/qaop/tests.html

Me lo he intentado instalar pero me dice que me falta la v4.0.30319 del .NET Framework, así que lo probaré en otro ordenador que tiene Windows 8 (o me bajo las librerías).

Re: Nuevo emulador de Spectrum y tutoriales - YASS

Publicado: Mié Sep 12, 2012 10:51 pm
por FMarcos
Gracias a todos... a ver, que me he amontonao...

radastan escribió:Aquí otro interesado, me viene de perlas para ampliar mi herramienta de desarrollo.



Pues a tu disposición para lo que necesites!

climacus escribió:Muchas gracias. Como sea la mitad de interesante de lo que me imagino, memeotoo



Gracias a tí!!

antoniovillena escribió:Bienvenido y enhorabuena por el emulador. Tiene muy buena pinta, me ha encantado el borde de la TV con esquinas redondeadas, le da mucho realismo. ¿Le has pasado algunos de estos test?

http://wizard.ae.krakow.pl/~jb/qaop/tests.html

Me lo he intentado instalar pero me dice que me falta la v4.0.30319 del .NET Framework, así que lo probaré en otro ordenador que tiene Windows 8 (o me bajo las librerías).


Gracias por lo de la pantalla - fué una "inspiración" de ultimísima hora para aprovechar la aceleración gráfica de WPF para hacer el efecto "grátis" (la CPU del PC ni se entera...).

De esos tests que me sugieres, casi te aseguro de antemano que no va a pasar ni uno. La emulación (por el momento) no tiene en cuenta la contención de los 16KB de RAM que gestiona la ULA. Y si lo que me parece ver es lecturas "al aire cuando la ULA está refrescando la pantalla", tampoco (quizá no es eso).

Date cuenta que hace un mes (casi justo), no tenía ni idea de cómo funcionaba un Spectrum por dentro, pero me apetecía muchísimo aprendérmelo y de ahí salió el emulador. Muchísimas cosas se han quedado en el tintero (los flags "no documentados" X e Y, la contención de RAM, simular la lectura del bus "al aire" mientras la ULA refresca la pantalla)... Si me metía con eso, no me daba tiempo a acabarlo en las vacaciones. Pero sí, tengo ese "gusanillo" de que "faltan cosas". Lo que me gustaría es poder implementarlo y que quedase "fácil de explicar" o "de entender".

Para que te hagas a la idea, el audio no me salía (tironeaba), iba a darme por vencido y (atención) no implementarlo - me estaba quedando sin tiempo! Se me encendió la bombilla un día y lo terminé en tres horas...

Y finalmente y para no hacerme más pesao ya, si tienes XP p'arriba y usas .NET 3.5, monta sin escalas .NET 4.0 ("Client Profile" sobra). Hace lo mismo que pueda hacer 3.5, solo que bastante más deprisa y usando menos memoria... La idea de hacerlo con .NET "por arriba" era porque hay un concepto muy de moda ultimamente, que "todo hay que hacerlo en C#". Y hay cosas que no. Para el tema de la presentación visual (por ejemplo), .NET es simplemente perfecto. Para el emulador, donde esté el código nativo, que se quite lo demás. Y quería (tambien!) aprovechar el tutorial para mostrar cómo unir C++ y c# en el mismo proyecto. Un usuario avanzado puede empezar con el fuente C++. Un usuario menos experto puede tomar "Spectrum.dll" y plantarla dentro de su programa C# o VB y a correr!!

Re: Nuevo emulador de Spectrum y tutoriales - YASS

Publicado: Mié Sep 12, 2012 11:13 pm
por antoniovillena
Tienes razón, al emular la contención el código se hace más difícil de leer. Puedes dejarlo así, sino dejaría de ser un emulador didáctico. La CPU sí que las puedes emular mejor sin perder legibilidad. El Z80 es muy puñetero y hay muchas instrucciones que es difícil emularlas bien: DAA, INIR, OUTIR, flags 5 y 3, incluso hay un registro (MEMPTR) oculto que es costoso de emular en tiempo de procesador. De momento puedes pasarle el Z80Tests

http://homepage.ntlworld.com/mark.woodmass/z80tests.tap

Si tienes alguna duda sobre cómo emular alguna instrucción puedo echarte una mano. Yo lo hice con mi emulador y gané compatibilidad (muchos juegos que antes fallaban empezaron a funcionar):

http://jbacteria.retrolandia.net/48?z80tests.tap

Re: Nuevo emulador de Spectrum y tutoriales - YASS

Publicado: Jue Sep 13, 2012 8:38 am
por FMarcos
antoniovillena escribió:...El Z80 es muy puñetero y hay muchas instrucciones que es difícil emularlas bien: DAA, INIR, OUTIR, flags 5 y 3, incluso hay un registro (MEMPTR) oculto que es costoso de emular en tiempo de procesador. De momento puedes pasarle el Z80Tests...


Mil gracias Antonio!! Si, ya he visto las "gracietas" que tiene el Z80 (y eso que ya has visto hasta qué nivel he "bajado", que todavía me queda un mundo). Has dado exáctamente en el clavo: quería hacer un emulador, pero tenía que ser "didáctico" (como bien dices), asi que no podía meterme con ciertas interioridades. Y luego estaba el tema de que era un proyecto para vacaciones, así que tampoco andaba sobrado de tiempo... Y muchas más gracias por los tests que me pasas: será lo primero que pruebe en casa en cuanto llegue!!

Pregunta abierta: si tuviéseis que elegir entre emular la contención de cpu por la ULA o los flags X/Y (3/5) de la cpu... por dónde empezarías?

Re: Nuevo emulador de Spectrum y tutoriales - YASS

Publicado: Jue Sep 13, 2012 11:36 am
por antoniovillena
FMarcos escribió:
Mil gracias Antonio!! Si, ya he visto las "gracietas" que tiene el Z80 (y eso que ya has visto hasta qué nivel he "bajado", que todavía me queda un mundo). Has dado exáctamente en el clavo: quería hacer un emulador, pero tenía que ser "didáctico" (como bien dices), asi que no podía meterme con ciertas interioridades. Y luego estaba el tema de que era un proyecto para vacaciones, así que tampoco andaba sobrado de tiempo... Y muchas más gracias por los tests que me pasas: será lo primero que pruebe en casa en cuanto llegue!!

Pregunta abierta: si tuviéseis que elegir entre emular la contención de cpu por la ULA o los flags X/Y (3/5) de la cpu... por dónde empezarías?


Sin duda los flags 3/5. Son fáciles de emular, tienen el mismo tratamiento que el bit 7 (bit de signo) y algunos juegos no funcionan bien si no está emulado. El típico ejemplo es el rinoceronte de Sabre Wulf que anda para atrás.

La contención es un tema más complicado; tendrías que probar varias opciones de implementación y elegir la más didáctica.

Re: Nuevo emulador de Spectrum y tutoriales - YASS

Publicado: Jue Sep 13, 2012 1:39 pm
por zx81
Enhorabuena por el emulador, no había visto este hilo aún y por eso te había felicitado en los comentarios del blog.

Por lo que leo en el hilo, tendrás que decidir si es más importante un emulador "didáctico" o uno "preciso", porque sospecho que lograr ambas cosas es tremendamente complicado. No basta simplemente con emular las cosas, hay que emularlas en el orden correcto y en el momento preciso.

Decirte que si lo que te apetecía era currarte un core Z80 en C++, perfecto. Pero se puede hacer uno en C# y de hecho ya hay al menos un emulador escrito en ese lenguaje (Zero creo recordar que se llama). Ten en cuenta que la velocidad no es un problema porque cualquier ordenador moderno es millones de veces más potente que un Spectrum. Mi emulador está escrito en Java al 100% y en ordenadores modestos aún es capaz de ejecutar los programas 4 o 5 veces más rápido que el original. Estando escrito en C++, podrías emular sin problemas los bits 3 y 5 y hasta el MEMPTR, que tampoco cuesta tanto. Emular la contención de la ULA es un poco más complicado y, además, afecta al core Z80. Y para algunos juegos, ni con eso basta. Prueba con el Arkanoid, una vez que hayas implementado la contención y el bus flotante (antes de eso ni funciona), y entenderás a qué me refiero. :)

Ten cuidado con estos juguetes, que uno empieza y no se sabe donde parar.... ;)

Re: Nuevo emulador de Spectrum y tutoriales - YASS

Publicado: Jue Sep 13, 2012 5:11 pm
por FMarcos
antoniovillena escribió:Sin duda los flags 3/5. Son fáciles de emular, tienen el mismo tratamiento que el bit 7 (bit de signo) y algunos juegos no funcionan bien si no está emulado. El típico ejemplo es el rinoceronte de Sabre Wulf que anda para atrás.
La contención es un tema más complicado; tendrías que probar varias opciones de implementación y elegir la más didáctica.


Pues me acabas de dar una respuesta perfecta. Si, había leído lo de esa característica tan simpática de Sabre Wulf - impresionante, oye. De hecho, voy a ver si arranca el juego en mi emulador "pelao"... a ver cuantas cosas fallan!!

zx81 escribió:Por lo que leo en el hilo, tendrás que decidir si es más importante un emulador "didáctico" o uno "preciso", porque sospecho que lograr ambas cosas es tremendamente complicado.


Exácto! Y como bien decís, emular la contención no es simplemente "añadir ciclos al contador y ya está", que sería facilito y didáctico... Pero tocaría desmontar cada instrucción e ir insertando los retardos en cada fase, lo cual haría un código francamente difícil de leer - y de mantener.

Desde el principio quise hacer un "tutorial", ser didáctico y, sobre todo, que el código final fuese muy modular y fácil de seguir. Y ya puestos, un tutorial que pudiese correr bastantes juegos (bueno, realmente me importaba sólo uno: JetPac! y corre, corre!).

zx81 escribió:Decirte que si lo que te apetecía era currarte un core Z80 en C++, perfecto. Pero se puede hacer uno en C# y de hecho ya hay al menos un emulador escrito en ese lenguaje (Zero creo recordar que se llama).


Por supuesto!! De hecho, hay implementaciones completas escritas en JavaScript - y que van de la leche por cierto, y son incluso mucho más precisas que mi implementación. Tambien elegí C++ por la portabilidad a casi cualquier cosa (y si os fijáis en el código fuente del "nucleo duro", procuré escribirlo lo más "ANSI" posible).

Que conste que me encanta C# (la sintáxis es preciosa a mi modo de ver), pero mi trabajo cotidiano consiste en programar sistemas embebidos, donde cuenta cada byte de memoria y cada ciclo de procesador, así que en C/C++ me siento extremadamente cómodo (a ratos, incluso más que con C#).

zx81 escribió:Ten en cuenta que la velocidad no es un problema porque cualquier ordenador moderno es millones de veces más potente que un Spectrum. Mi emulador está escrito en Java al 100% y en ordenadores modestos aún es capaz de ejecutar los programas 4 o 5 veces más rápido que el original.


Totalmente de acuerdo, pero hay otro factor: sabes programar. Corrijo: en este foro SE SABE PROGRAMAR. Con mayúsculas. C++, Java, JavaScript... Podría contarte casos de verdadero terror que veo todos los días.

zx81 escribió:Ten cuidado con estos juguetes, que uno empieza y no se sabe donde parar.... ;)


Me estoy dando cuenta, me estoy dando cuenta... Pero es que es la leche de divertido y la compañía MEJOR!!!