[UPDATED] Retro Virtual Machine v1.0.1 disponible!!!

Emuladores y aplicaciones que ayudarán a la perpetuación del Spectrum y su software en el futuro

Moderador: Sir Cilve Sinclair

Avatar de Usuario
jcgamestoy
rst 0
Mensajes: 38
Registrado: Mié Abr 29, 2015 8:38 am
Contactar:

Re: Retro Virtual Machine v1.0.0 disponible!!!

Mensaje por jcgamestoy » Mié Sep 02, 2015 1:09 pm

Es bastante complejo de explicar pero lo voy a intentar lo mejor que pueda.

mi codigo para la lectura del byte de los pixeles y el byte de los atributos es:

Código: Seleccionar todo

    if(d==pxSCREEN && !(speccy->t & 0x3))
    {
      $if machineIs('48k') then
        int y=speccy->line-64;
      $elseif machineIs('128k','+2A','+3') then
        int y=speccy->line-63;
      $end

      int x=speccy->t>>2;
     
      uint p=tLine[y]+x;
      uint b=0x1800+((y>>3)<<5)+x;
      
      $if machineIs('snow') then
      if(speccy->cpu->flags & 0x2)
      {
        $if machineIs('48k') then
        if((speccy->T<=2 && speccy->T) && (speccy->cpu->r.i>=0x40 && speccy->cpu->r.i<0x80)) //Snow effect
        $elseif machineIs('128k') then
        if((speccy->T==3 || !speccy->T) && ((speccy->cpu->r.i>=0x40 && speccy->cpu->r.i<0x80) || (speccy->cpu->r.i>=0xc0 && (speccy->memory7f&0x1)))) //Snow effect
        $end
        {
          p=(p & 0xff80) | (speccy->cpu->r.r & 0x7f);
          b=(b & 0xff80) | (speccy->cpu->r.r & 0x7f);
        }
      }
      $end
      
      $if machineIs('48k') then
        speccy->pixel=speccy->cpu->mem[1][p];
        speccy->attr=speccy->cpu->mem[1][b];
      $elseif machineIs('128k','+2A','+3') then
        uint8 *spt=(speccy->memory7f & 0x8)?speccy->ram[7]:speccy->ram[5];

        speccy->pixel=spt[p];
        speccy->attr=spt[b];
      $end
    }
  }
Básicamente hacemos una lectura si estamos dibujando la pantalla principal (no el borde) d=pxSCREEN

y es el primero de cada cuatro estados !speccy->t&0x3

En las variables p y b se almacena la dirección en el banco de memoria que hay que leer para esa posición y en b la dirección del atributo.

Y aquí la enjundia.

speccy->cpu->flags & 0x2 chequea que estamos en el estado M1 (cogiendo el opcode de la instrucción)

Y sigo para el 48k aunque en el código de arriba puedes ver también como lo hago para el 128k

Si el estado T del z80 es entre 0 y 1 y el registro I esta entre 0x40 y 0x7f SNOW EFFECT.

entonces a las dos direcciones anteriores les borro los 7 bits de abajo y les pongo los que en ese momento tenga el registro R.

Los valores de T cambian en el 128k porque este empieza a leer la memoria 2 o 3 (no lo recuerdo bien tendría que comprobarlo) T estados antes de que comience la linea.

A continuación sigue el código normal de la ULA se cargan los "latch" con los datos de memoria y se muestran 2 pixeles por pantalla cada T.

Cuando empece RVM comencé implementando el Spectrum porque a priori era la máquina más sencilla, cuando llegue a este punto ya había sufrido que de sencilla nada.

Me he explicado fatal pero espero que te sirva.

zx81
Freddy Hardest
Mensajes: 619
Registrado: Vie Dic 28, 2007 2:14 pm
Ubicación: Valencia
Contactar:

Re: Retro Virtual Machine v1.0.0 disponible!!!

Mensaje por zx81 » Mié Sep 02, 2015 1:12 pm

Hola JC,

Enhorabuena por tu emulador porque se ve fantástico. No tengo un Apple así que no puedo probarlo (lástima), pero lo que se ve en los videos es para quitarse el sombrero.

Durante un tiempo tuve una emulación del efecto snow en JSpeccy pero la acabé quitando porque no me parecía realista y no acaba de quedar claro qué es exactamente lo que se pone en el bus en el momento de la contienda. Hay tantas cosas desconocidas que a veces sorprende. Llevo mucho tiempo dándole vueltas (especulación mental pura y dura que no llega a ningún lugar) a qué narices hace el Z80 en determinadas instrucciones, bien para alargar el M1 hasta 5 ciclos, bien cuando pone en el bus una dirección que no corresponde por lógica, como pasa con DJNZ por ejemplo.

El 48k no se resetea por el efecto snow. El +2 se supone que sí, pero yo he hecho pruebas con mi +2 y el Robocop 3 y no he logrado que se resetee. Además, no todos los +2 son exactamente iguales, y creo que fue VELESOFT el que documentó que hay al menos un chip que cambia entre versiones y en la más moderna evita que una lectura del puerto 0x7FFD provoque una escritura indebida en él. Puestos a trastear con los efectos de la ULA, quizá el más raro de emular sea el que permite ejecutar la demo "brightminer" de Wooster, y que se basa en que los píxeles a 1 son ligeramente más grandes que los píxeles a cero. Es bastante curioso y, salvo para un par de ejemplos, bastante inútil. Pero oye... :D

No recomendaría a nadie que se metiera con la emulación de los Microdrives. Es un faenón y luego no lo usa nadie. Me curré hasta un formato nuevo de cinta, porque con el formato MDR solo puedes hacer una emulación bastante chapucera del asunto. Cierto es que la necesidad iba más por el lado de poder ejecutar el CP/M 2.2 de Jiri Lamac usando los Microdrives, cosa que hace muy bien. Pero en la práctica, tampoco usa nadie la emulación LEC.

Algún día me meteré con la emulación del FDC, al que le tengo ganas porque en su día trastee infinito con mi +3 en esa dirección, pero lo voy dejando, lo voy dejando porque sé que es otro faenón de narices. Sobre todo si te empeñas en emular de forma fina el FDC y que funcionen todas las imágenes con protección.

Por cierto, yo tampoco acierto a encontrar una licencia para mi emulador. Lo único que quiero es que no se pueda vender, ni el emulador, ni los derivados, si es que llegaran a existir. Pero resulta que las licencias "libres" no son tan "libres" como para prohibir la venta, no vaya a ser que se confundan con licencias comunistas. Muy americanos ellos...

En fin, enhorabuena por tu trabajo. Si un día vienes a Valencia, avisa y nos conocemos.. :D
Debido al fallo de un mecanismo, el lanzagranadas M203 se te podía disparar cuando menos lo esperaras, lo que te habría hecho bastante impopular entre lo que quedara de tu unidad.
Revista del ejército EE.UU. PS, agosto 1993.

Emulador JSpeccy
ZXBaremulator

Avatar de Usuario
jcgamestoy
rst 0
Mensajes: 38
Registrado: Mié Abr 29, 2015 8:38 am
Contactar:

Re: Retro Virtual Machine v1.0.0 disponible!!!

Mensaje por jcgamestoy » Mié Sep 02, 2015 2:22 pm

zx81 escribió:Hola JC,

Enhorabuena por tu emulador porque se ve fantástico. No tengo un Apple así que no puedo probarlo (lástima), pero lo que se ve en los videos es para quitarse el sombrero
Gracias!!! tu emulador en javascript es impresionante.

De hecho alguna vez le había echado un ojo a tu código en GitHub para ver como hacías según que cosas.

Yo acabe implementando el "snow" y dejandolo activado en las máquinas afectadas aunque no sea 100% correcto porque me parecía interesante que la gente que esta haciendo juegos nuevos al probarlos en RVM viera el "snow" molestando si jugaban con el registro I.

De hecho cuando sacaron Ninjajar y lo probe en mi emulador me di cuenta que la primera version mostraba "snow" en las tostadoras y en los +2.

En cuanto a lo de los cuelgues lo aprendi entonces hablando con los mojontwins y descubri lo que bien dices del +2. Intente emular el cuelgue pero al final pase y preferí que se viera el snow para saber que algo raro se esta haciendo con el registro I.

Encantado de hablar contigo, y un placer compartir conocimientos también.

De Alicante a Valencia nos pilla cerquita hablamos.

Avatar de Usuario
chernandezba
Sabreman
Mensajes: 408
Registrado: Mié Oct 17, 2007 5:26 pm

Re: Retro Virtual Machine v1.0.0 disponible!!!

Mensaje por chernandezba » Mié Sep 02, 2015 2:24 pm

Uff pedazo de trabajo que te has currado con el snow effect...

He intentado corregir el mio pero no funciona, he conseguido que esa demo haga algo parecido a un scroll por columnas, al menos hace algo mejor que antes, pero para nada perfecto.

Creo que tal y como está mi emulador es imposible reproducir el efecto correctamente, dado que yo leo la memoria de scanlines cuando ya se han generado (pero los atributos sí que los voy generando en el mismo core de la cpu). Y para reproducir con exactitud el snow effect requiere leer cada pixel a medida que se ejecuta la cpu... Cosa bastante complicada y que utilizaria demasiada cpu fisica.

Gracias igualmente por pasarme tu trozo de código y la explicación.

Saludos
César
----

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

zx81
Freddy Hardest
Mensajes: 619
Registrado: Vie Dic 28, 2007 2:14 pm
Ubicación: Valencia
Contactar:

Re: Retro Virtual Machine v1.0.0 disponible!!!

Mensaje por zx81 » Mié Sep 02, 2015 2:30 pm

jcgamestoy escribió:
zx81 escribió:Hola JC,

Enhorabuena por tu emulador porque se ve fantástico. No tengo un Apple así que no puedo probarlo (lástima), pero lo que se ve en los videos es para quitarse el sombrero
Gracias!!! tu emulador en javascript es impresionante.

De hecho alguna vez le había echado un ojo a tu código en GitHub para ver como hacías según que cosas.
A ver si vas a confundir mi emulador, escrito en Java, con el de Antonio Villena, que sí está escrito en JS. :D

Por cierto, por pura curiosidad, ¿qué lenguaje has usado tú?. Porque en los ejemplos que has puesto no identifico qué lenguaje es.
Debido al fallo de un mecanismo, el lanzagranadas M203 se te podía disparar cuando menos lo esperaras, lo que te habría hecho bastante impopular entre lo que quedara de tu unidad.
Revista del ejército EE.UU. PS, agosto 1993.

Emulador JSpeccy
ZXBaremulator

Avatar de Usuario
jcgamestoy
rst 0
Mensajes: 38
Registrado: Mié Abr 29, 2015 8:38 am
Contactar:

Re: Retro Virtual Machine v1.0.0 disponible!!!

Mensaje por jcgamestoy » Mié Sep 02, 2015 2:32 pm

Si mucho trabajo de CPU pero lo logre optimizar utilizando un montón de tablas pre-calculadas.

Pero si es muy difícil conseguir si la emulación del Z80 no lee y escribe en el ciclo exacto, y la ULA lo mismo.

Un saludo.

Avatar de Usuario
jcgamestoy
rst 0
Mensajes: 38
Registrado: Mié Abr 29, 2015 8:38 am
Contactar:

Re: Retro Virtual Machine v1.0.0 disponible!!!

Mensaje por jcgamestoy » Mié Sep 02, 2015 2:45 pm

zx81 escribió:
jcgamestoy escribió:
zx81 escribió:Hola JC,

Enhorabuena por tu emulador porque se ve fantástico. No tengo un Apple así que no puedo probarlo (lástima), pero lo que se ve en los videos es para quitarse el sombrero
Gracias!!! tu emulador en javascript es impresionante.

De hecho alguna vez le había echado un ojo a tu código en GitHub para ver como hacías según que cosas.
A ver si vas a confundir mi emulador, escrito en Java, con el de Antonio Villena, que sí está escrito en JS. :D

Por cierto, por pura curiosidad, ¿qué lenguaje has usado tú?. Porque en los ejemplos que has puesto no identifico qué lenguaje es.
A vale jajaja me he equivocado tienes razón. Yo me referia a JSSpeccy.

No me extraña que no lo identifiques es otro de "mis inventos" en verdad es código en LUA pero bueno más tecnicamente es un pseudo-lenguaje a lo php de mi invención que genera archivos en C.

De esta forma para la emulación tengo un solo archivo que voy toqueteando luego lanzo el script y me genera un .c para cada máquina (48k, 128k, etc...) con sus funciones para emular un ciclo o un frame completo.

De esta forma si cambio algo que es comun para todas las máquinas (o para un conjunto de ellas) solo lo tengo que cambiar en un sitio y asi me ahorro un montón de trabajo.

Ademas al tener cada máquina su propia implementación puedo eliminar todos los chequeos en tiempo de ejecuccion y asi consigo que las maquinas en el modo Warp funcionen a entre 1000fps y 2000fps según el ordenador donde se ejecute :lol:

Para poder leerlo fijaros en las lineas que comienzan por un $ esas se ejecutan en el script. Las que no salen directas al archivo .c en cuestion asi un trozito como:

Código: Seleccionar todo

$if machineIs('48k') then
    int y=speccy->line-64;
$elseif machineIs('128k','+2A','+3') then
    int y=speccy->line-63;
$end

int x=speccy->t>>2;
mete la linea int y=speccy->line-64; en spectrum48k.c y la linea int y=speccy->line-63; en spectrum128k.c,spectrumPlus2a.c y spectrumPlus3.c mientras que la linea int x=speccy->t>>2; iria a todos los archivos a la vez. :wink:

Un saludo.

hikoki
Freddy Hardest
Mensajes: 657
Registrado: Sab Nov 23, 2013 8:27 am

Re: Retro Virtual Machine v1.0.0 disponible!!!

Mensaje por hikoki » Mié Sep 02, 2015 4:11 pm

Qué chulada de videos, solo falta un modo cinexin con punteros laser para manejarlo a lo Freddy Krueger.
Una gozada leer toda la jerga de fluzo aunque no se entienda ni papa jaja

zx81
Freddy Hardest
Mensajes: 619
Registrado: Vie Dic 28, 2007 2:14 pm
Ubicación: Valencia
Contactar:

Re: Retro Virtual Machine v1.0.0 disponible!!!

Mensaje por zx81 » Mié Sep 02, 2015 7:08 pm

jcgamestoy escribió:
No me extraña que no lo identifiques es otro de "mis inventos" en verdad es código en LUA pero bueno más tecnicamente es un pseudo-lenguaje a lo php de mi invención que genera archivos en C.

De esta forma para la emulación tengo un solo archivo que voy toqueteando luego lanzo el script y me genera un .c para cada máquina (48k, 128k, etc...) con sus funciones para emular un ciclo o un frame completo.

De esta forma si cambio algo que es comun para todas las máquinas (o para un conjunto de ellas) solo lo tengo que cambiar en un sitio y asi me ahorro un montón de trabajo.

Ademas al tener cada máquina su propia implementación puedo eliminar todos los chequeos en tiempo de ejecuccion y asi consigo que las maquinas en el modo Warp funcionen a entre 1000fps y 2000fps según el ordenador donde se ejecute :lol:

Para poder leerlo fijaros en las lineas que comienzan por un $ esas se ejecutan en el script. Las que no salen directas al archivo .c en cuestion asi un trozito como:

Código: Seleccionar todo

$if machineIs('48k') then
    int y=speccy->line-64;
$elseif machineIs('128k','+2A','+3') then
    int y=speccy->line-63;
$end

int x=speccy->t>>2;
mete la linea int y=speccy->line-64; en spectrum48k.c y la linea int y=speccy->line-63; en spectrum128k.c,spectrumPlus2a.c y spectrumPlus3.c mientras que la linea int x=speccy->t>>2; iria a todos los archivos a la vez. :wink:

Un saludo.
Curioso invento. Aunque si al final el código es C y en modo "velocidad absurda" (Warp le llamas tú) llegas a algo entre 1000% y 2000% no me parece excesivo. Claro que hay que ver cuantos efectos gráficos tienes activados con esa velocidad.

Otra curiosidad (vas a tener que publicar los fuentes para que dejemos de acribillarte a preguntas). ¿Qué método has escogido para emular a la Z80?. ¿switch enorme o decodificación de instrucciones?. Ando dándole vueltas a cómo emular la CPU reduciendo al máximo el código necesario. Y apenas conozco un par de cores Z80 que emulen decodificando...
Debido al fallo de un mecanismo, el lanzagranadas M203 se te podía disparar cuando menos lo esperaras, lo que te habría hecho bastante impopular entre lo que quedara de tu unidad.
Revista del ejército EE.UU. PS, agosto 1993.

Emulador JSpeccy
ZXBaremulator

Avatar de Usuario
jcgamestoy
rst 0
Mensajes: 38
Registrado: Mié Abr 29, 2015 8:38 am
Contactar:

Re: Retro Virtual Machine v1.0.0 disponible!!!

Mensaje por jcgamestoy » Jue Sep 03, 2015 1:24 am

zx81 escribió:Curioso invento. Aunque si al final el código es C y en modo "velocidad absurda" (Warp le llamas tú) llegas a algo entre 1000% y 2000% no me parece excesivo. Claro que hay que ver cuantos efectos gráficos tienes activados con esa velocidad.
No es entre 1000% y 2000% son entre 1000 y 2000 FPS dividiendo por 50 nos sale entre un 2000% y un 4000%. De todas formas ahora que te voy a hablar de la emulación de z80 veras que es una velocidad correcta para todo lo que hace.
zx81 escribió:Otra curiosidad (vas a tener que publicar los fuentes para que dejemos de acribillarte a preguntas). ¿Qué método has escogido para emular a la Z80?. ¿switch enorme o decodificación de instrucciones?. Ando dándole vueltas a cómo emular la CPU reduciendo al máximo el código necesario. Y apenas conozco un par de cores Z80 que emulen decodificando...
Me encantan las preguntas así que no os cortéis. Bueno me preguntas por la descodificación pues ni una cosa ni la otra.

RVM utiliza varias tablas (según los prefijos del z80) y para cada entrada en la tabla hay un puntero a funcion para la instrucción.

Si esa instrucción se puede resolver directamente se hace (ver mas arriba por ejemplo sfc).

Sino se añade en esta función una lista de micro operaciones que hacer mas adelante.

De esta forma consigo fácilmente escribir justo en el ciclo T preciso que necesite.

Para no malgastar tiempo cada una de estas funciones devuelve los T que tarda en ejecutarse y luego en el bucle principal se vuelve a llamar al z80 cuando pasas esos ciclos.

Pero mejor con un ejemplo directo del código.

Código: Seleccionar todo

void z80ldr_c_n(z80 *z)
{
  z->uops=z80ldr_c_n_uops;
  z->r.q=0;
  z->T=4;
}

static inst z80ldr_c_n_uops[]={z80Con1_pc_2,z80ReadInc_pc_c_1,NULL};
Esta seria la función y las micro instrucciones (mas funciones) para ld c,nn

En la primera parte cargamos las futuras operaciones y esperamos 4-t (básicamente el ciclo M1)
En una segunda parte (z80con1_pc_2) se hace contienda con el valor de pc y dura 2 ciclos + la contienda
Por ultimo (z80ReadInc_pc_c_1) se lee el pc se incrementa y se guarda en c un ciclo.

Esos nombrajos de función y escribir todas esas funciones a mano es una tortura, pero no soy tan masoca todo esto lo genera un script escrito en LUA que genera las funciones generales (como la de la contienda para cualquier registro o la de leer incrementar etc) automáticamente.

Ejemplo:

Esta función en LUA genera TODAS las instrucciones del tipo ld r,nn

Código: Seleccionar todo

local function loadrn(s,o)
  lines[#lines+1]=util.format([[
void ldr_%sn(z80* z)
{
  %s 
  z->r.q=0;
  z->T=4; 
}
]],s,readI('pc',s,0,3,true))

  if h.eqAny(s,'ixl','ixh') then
    ddInst[o]=util.format('ldr_%sn',s)
  elseif  h.eqAny(s,'iyl','iyh') then
    fdInst[o]=util.format('ldr_%sn',s)
  else
    inst[o]=util.format('ldr_%sn',s)
  end
end 
Bueno también genera ld ixl,nn etc (las indocumentadas).

El parametro 's' es el registro y 'o' el opcode

luego si la llamo así:

Código: Seleccionar todo

r8={[0]='b','c','d','e','h','l',[7]='a'}

for i,s in pairs(r8) do
  loadrn(s,i*8+6)
end
me genera de un plumazo ld a,n; ld b,n; ld c,n etc etc para los 8 registros.

Así que resumiendo que me voy por las ramas

La implementación del Z80 es un archivo en LUA de 2800 y pico lineas que al ejecutarse genera un .c de 21000 y pico!!!

En este archivo es donde esta la tabla de decodificación aquí un cachico con las 16 primeras instrucciones.

Código: Seleccionar todo

nInst[0x00]=nop;
  nInst[0x01]=ld16r_bc;
  nInst[0x02]=z80stoi_bc_a;
  nInst[0x03]=inc16_bc;
  nInst[0x04]=inc8_b;
  nInst[0x05]=dec8_b;
  nInst[0x06]=z80ldr_b_n;
  nInst[0x07]=rlca;
  nInst[0x08]=exafaf;
  nInst[0x09]=add16_hl_bc;
  nInst[0x0a]=z80ldri_a_bc;
  nInst[0x0b]=dec16_bc;
  nInst[0x0c]=inc8_c;
  nInst[0x0d]=dec8_c;
  nInst[0x0e]=z80ldr_c_n;
  nInst[0x0f]=rrca;
Así que luego cuando ejecutamos la instrucción si me llega el opcode 0x0d lo busco en el array (tiempo lineal prácticamente inmediato y salto a dicha función)

Espero que hallais entendido algo porque me explico fatal pero la idea general consiste en programar solo una vez la instrucciones que son todas iguales (con lo que reducimos los riegos de meter la pata) y la segunda es hacer funcioncitas en c lo mas cortas posibles para que el emulador corra todo lo que pueda (aun a costa de gastar un poco mas de memoria pero que son unos cientos de kb o unas pocas mb en un ordenador de hoy en día).

Mi primera implementación del Z80 era directa y mucho más rápida pero obviamente totalmente imprecisa.

Un saludo!

zx81
Freddy Hardest
Mensajes: 619
Registrado: Vie Dic 28, 2007 2:14 pm
Ubicación: Valencia
Contactar:

Re: Retro Virtual Machine v1.0.0 disponible!!!

Mensaje por zx81 » Jue Sep 03, 2015 11:36 am

jcgamestoy escribió:
Me encantan las preguntas así que no os cortéis. Bueno me preguntas por la descodificación pues ni una cosa ni la otra.

RVM utiliza varias tablas (según los prefijos del z80) y para cada entrada en la tabla hay un puntero a funcion para la instrucción.

Si esa instrucción se puede resolver directamente se hace (ver mas arriba por ejemplo sfc).

Sino se añade en esta función una lista de micro operaciones que hacer mas adelante.

De esta forma consigo fácilmente escribir justo en el ciclo T preciso que necesite.

Para no malgastar tiempo cada una de estas funciones devuelve los T que tarda en ejecutarse y luego en el bucle principal se vuelve a llamar al z80 cuando pasas esos ciclos.
Lo entiendo, aunque me da la sensación de que has hecho a mano lo que hace de por sí un switch. En C, un switch se convierte en una tabla de saltos si los case son consecutivos (de 0x00 a 0xFF en este caso) o en una búsqueda binaria si no lo son. O al menos eso es lo que yo he podido comprobar que genera el gcc.

Yo no hago emulación a nivel de T-estado porque realmente creo que no es necesario llegar a ese nivel. Lo más delicado es la pantalla y eso pinta 8 pixeles en 4 T-estados. Una vez que ha leído el byte de pantalla y el de atributos los otros 4 T-estados ya no van a cambiar nada. De hecho, se ejecutan bien demos como Overscan y Shock Megademo. Aunque a nivel de tiempos, la más puñetera de todas es la Paralaktica y en tu emulador se ve de cine. Si no ando muy desencaminado, la Paralaktica se ve bien a partir de que tengas una precisión aproximada de 4 T-estados.

Una cosa que tengo casi hecha y cuya idea te lanzo es que he extraído el core Z80 de mi emulador y lo quiero publicar como un repo independiente en github, para que si alguien lo necesita, lo pueda utilizar. Un core Z80 del que me han gustado algunas cosas es un proyecto que hay en sourceforge llamado "zilogz80". Implementado en C++, decodifica las instrucciones e intenta emular con bastante precisión lo que hace la CPU. Lamentablemente, la emulación no parece mala pero no respeta los tiempos ni por saber morir y, tal y como han hecho algunas cosas, es terriblemente lenta. Pero la idea general me gusta... :)
Debido al fallo de un mecanismo, el lanzagranadas M203 se te podía disparar cuando menos lo esperaras, lo que te habría hecho bastante impopular entre lo que quedara de tu unidad.
Revista del ejército EE.UU. PS, agosto 1993.

Emulador JSpeccy
ZXBaremulator

Avatar de Usuario
chernandezba
Sabreman
Mensajes: 408
Registrado: Mié Oct 17, 2007 5:26 pm

Re: [UPDATED] Retro Virtual Machine v1.0.1 disponible!!!

Mensaje por chernandezba » Jue Sep 03, 2015 7:58 pm

Hola

Si, bravo por la emulación de la cpu pues he probado yo también la paralaktica y se ve perfecta, no había visto ningún emulador que la mostrase bien aún. Sobretodo cuando aparece la imagen del hada... esa rutina es muy puñetera. Lo gracioso es que el hada se muestra mediante gigascreen, conmutando dos pantallas, en mi emulador por ejemplo en la demo no se ve bien, pero si se cargan las dos imágenes mediante una rutina que hace el efecto gigascreen, se ve perfecto. A saber la de virguerías que han hecho con la cpu en esa demo....

Saludos
César
----

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

Avatar de Usuario
jcgamestoy
rst 0
Mensajes: 38
Registrado: Mié Abr 29, 2015 8:38 am
Contactar:

Re: [UPDATED] Retro Virtual Machine v1.0.1 disponible!!!

Mensaje por jcgamestoy » Jue Sep 03, 2015 8:01 pm

Sigo con el tema que he tenido que arreglar un fallo de ultima hora, actualizar please.
zx81 escribió:Lo entiendo, aunque me da la sensación de que has hecho a mano lo que hace de por sí un switch. En C, un switch se convierte en una tabla de saltos si los case son consecutivos (de 0x00 a 0xFF en este caso) o en una búsqueda binaria si no lo son. O al menos eso es lo que yo he podido comprobar que genera el gcc.
Si eso lo se pero yo lo hago así digamos (a mano) porque lo que hago cuando me viene un 0xDD o 0xFD es cambiar de tabla de descodificación. Al generar con un script me es mas fácil hacer la tabla que el switch.
zx81 escribió:Yo no hago emulación a nivel de T-estado porque realmente creo que no es necesario llegar a ese nivel. Lo más delicado es la pantalla y eso pinta 8 pixeles en 4 T-estados. Una vez que ha leído el byte de pantalla y el de atributos los otros 4 T-estados ya no van a cambiar nada. De hecho, se ejecutan bien demos como Overscan y Shock Megademo. Aunque a nivel de tiempos, la más puñetera de todas es la Paralaktica y en tu emulador se ve de cine. Si no ando muy desencaminado, la Paralaktica se ve bien a partir de que tengas una precisión aproximada de 4 T-estados.
Cierto para la pantalla, no tan cierto para la entrada salida sobre todo en los 128k, que puedes cambiar el banco o a la pantalla de la RAM 7 en cualquier momento (creo).

Ademas si en un futuro me quiero liar con los clones rusos creo recordar que Pentagon (o era Scorpion) actualizan el borde cada 1-T.

Lo que si que tiene que tener una precision al ciclo sobre todo en los 48k es la contienda.

En cuanto a paralaktica (Que pason de Demo) en mi emulador tiene truco. Fíjate en como cambia si la ves con uno de los preajustes de video que empiezan por LCD a como se ve con uno que empiece por CRT.

Lo que hago es para simular el entrelazado es mezclar un frame con el justamente anterior.

No es una tecnica muy ortodoxa pero da el pego. Puedes jugar con ella si pones la opción "Custom" y mueves el slider que se llama "interlaced blending".

Mescaline es otra demo buena para probar esto. Shock es el banco de pruebas perfecto para probar que los tiempos los haces medianamente bien y Overscan... No la conozco ahora la busco y la veo.
zx81 escribió:Una cosa que tengo casi hecha y cuya idea te lanzo es que he extraído el core Z80 de mi emulador y lo quiero publicar como un repo independiente en github, para que si alguien lo necesita, lo pueda utilizar. Un core Z80 del que me han gustado algunas cosas es un proyecto que hay en sourceforge llamado "zilogz80". Implementado en C++, decodifica las instrucciones e intenta emular con bastante precisión lo que hace la CPU. Lamentablemente, la emulación no parece mala pero no respeta los tiempos ni por saber morir y, tal y como han hecho algunas cosas, es terriblemente lenta. Pero la idea general me gusta...
Justamente me estaba pensando muy seriamente hacer esto, de hecho tengo el motor de z80 en un repo distinto al resto de la emulación. Así que un día que pueda a lo mejor lo limpio un poquito le quito un par de dependencias absurdas y lo subo a GitHub.

Un saludo.

Avatar de Usuario
jcgamestoy
rst 0
Mensajes: 38
Registrado: Mié Abr 29, 2015 8:38 am
Contactar:

Re: [UPDATED] Retro Virtual Machine v1.0.1 disponible!!!

Mensaje por jcgamestoy » Jue Sep 03, 2015 8:02 pm

chernandezba escribió:Hola

Si, bravo por la emulación de la cpu pues he probado yo también la paralaktica y se ve perfecta, no había visto ningún emulador que la mostrase bien aún. Sobretodo cuando aparece la imagen del hada... esa rutina es muy puñetera. Lo gracioso es que el hada se muestra mediante gigascreen, conmutando dos pantallas, en mi emulador por ejemplo en la demo no se ve bien, pero si se cargan las dos imágenes mediante una rutina que hace el efecto gigascreen, se ve perfecto. A saber la de virguerías que han hecho con la cpu en esa demo....

Saludos
César
Que es eso del gigascreen :?: :?: :?:

Avatar de Usuario
jcgamestoy
rst 0
Mensajes: 38
Registrado: Mié Abr 29, 2015 8:38 am
Contactar:

Re: [UPDATED] Retro Virtual Machine v1.0.1 disponible!!!

Mensaje por jcgamestoy » Jue Sep 03, 2015 8:20 pm

jcgamestoy escribió:
chernandezba escribió:Hola

Si, bravo por la emulación de la cpu pues he probado yo también la paralaktica y se ve perfecta, no había visto ningún emulador que la mostrase bien aún. Sobretodo cuando aparece la imagen del hada... esa rutina es muy puñetera. Lo gracioso es que el hada se muestra mediante gigascreen, conmutando dos pantallas, en mi emulador por ejemplo en la demo no se ve bien, pero si se cargan las dos imágenes mediante una rutina que hace el efecto gigascreen, se ve perfecto. A saber la de virguerías que han hecho con la cpu en esa demo....

Saludos
César
Que es eso del gigascreen :?: :?: :?:
Jajajajajajaj acabo de darme cuenta que una vez más con lo de Gigascreen (Que yo llamaba interlaced blending) he vuelto a inventar la rueda.

Esta tecnica se usa mucho en Commodore 64 (y en Amstrad CPC en la demo Batman).

Yo lo hago todo en la GPU así que gasta 0 ciclos :lol: :lol: :lol: basicamente es un alpha-blending entre los dos frames la formula es: actual*(1-ib)+anterior*ib donde ib es el valor del "interlaced blending este" (En una próxima version pondre gigascreen).

En el emulador dejo variar este valor entre 0 y 0.5 en los preajustes del crt lo pongo mas o menos a 0.4 para que se vea un pelin de parpadeo.

Si quereis verlo de cine cine sin un solo parpadeo poner el slider a la izquierda y sobre todo verlo en un monitor a traves de HDMI y configurando OS X a 50hz :wink:

Responder

¿Quién está conectado?

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