Emulando 2 opcodes de Z80 de una sola vez.

Foro dedicado a la emulación de sistemas clásicos en el PC o en otros sistemas.
Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 762
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 19 veces
Gracias recibidas: 39 veces

Emulando 2 opcodes de Z80 de una sola vez.

Mensajepor Namek » 22 Nov 2018, 23:36

Muy buenas,

El señor Peter McGavin fue el primero que desarrolló un emulador de Spectrum para Amiga 500 en color. Para conseguir la máxima velocidad posible en el 68000 a 7Mhz del Amiga ideó un sistema que generaba una tabla de 128K en la que se almacenaba la dirección de desplazamiento del salto a la rutina de emulación de cada opcode almacenado en la memoria emulada del Spectrum, bastante ingenioso y rápido pero el 68000 no da para mucho. En la documentación de su emulador detallaba una alternativa a su sistema propuesta por otra persona que se utiliza en el mejor (y tal vez único?) emulador de Spectrum para Sinclair QL y en el de Atari ST, que consiste en usar el byte del opcode a emular como parte de la dirección de salto a la rutina emuladora utilizando la tecnica de código automodificable, por lo que escribe el señor McGavin en la documentación de su emulador, intentó implementar este sistema, pero las pruebas de rendimiento no le convencieron y la descartó, tambien explica otra idea que consiste en leer 2 opcodes a emular de una sola vez y en lugar de tener una rutina de emulación para cada opcode, se usaria una rutina para cada una de las posibles combinaciones de 2 opcodes simultaneos, esto sería una enorme ventaja en cuanto a velocidad de emulación, pero presenta un gran problema de cantidad de código a escribir y memoria necesaria.

Pensandolo un poco me doy cuenta que muchas de las combinaciones de opcodes que no interfieren uno con el otro solo necesitarían una rutina para las 2 posibles combinaciones de si uno va primero u otro despues, por ejemplo, la siguientes secuencias se suelen usar bastante y solo necesitarian una rutina para las 2 posibilidades de cada una:

LD H,D
LD L,E

Esta pareja de instrucciones y todas las variantes que no interfieren solo necesitarian una unica rutina tanto si va una instruccione primero u otra despues.

En cambio con las secuencias de INC o DEC de 8 bits no tendriamos esa suerte aunque nos ahorrariamos calcular los FLAGS de la primera instrucción, ejemplo:

INC A < solo incrementariamos A e ignorariamos los FLAGS
INC B < incrementariamos B y solo aqui calculariamos los FLAGS.

En este caso si necesitamos 2 rutinas distintas, 1 cuando se incrementa A primero y otra cuando es B.

Luego tendriamos los casos en los que el segundo opcode no es una instruccion, si no un dato, por ejemplo:

LD A,N apareceria 256 veces en la tabla de direcciones (1 por cada posible valor de N) apuntando a su rutina de emulacion unica.

Yo personalmente lo veo factible, la unica duda que me asalta es si cabría en los 512K de un Amiga 500...
Última edición por Namek el 28 Nov 2018, 13:21, editado 1 vez en total.

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 841
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: 17 veces
Gracias recibidas: 35 veces

Re: Emulando 2 opcodes de Z80 de una sola vez.

Mensajepor Bubu » 23 Nov 2018, 00:26

Yo no lo vería factible. Es brutal la cantidad de pares de instrucciones que hay. Tendríamos las 256 normales y las 256 de operaciones con bits (descartamos las ED, FD, etc). Así que tendríamos 512x512 pares de instrucciones = más de 250.000 pares. Suponte que, como mucho, te ahorras la mitad de ellas por ser como tú dices, operaciones "ortogonales". Nos quedan 125.000 pares de instrucciones. ¿Cuántos bytes necesitas pa emular cá par? Estamos hablando sin reciclar funciones, es decir, que el par LD A, B + LD C, D tiene una función que la emula, y LD A, B + LD D, C tiene otra función distinta que la emula, y no se recicla nada, ¿nor? Suponte pues que necesitas yo qué sé, ¿10? ¿20 bytes por cá par? Tendríamos: 125.000 pares x 10 bytes de emulación = 1250000 bytes, es decir, más de 1 MB.

En mis tiempos emulé la placa JAMMA del Frogger en la GBA. Es verdad que la CPU de la GBA va al doble que la de la Amiga, pero ni así se movía. Se me ocurrió entóns crear un "compilador". Desde Window$ le metías la rom del Frogger a mi compilador, y te escupía el juego pero con las instrucciones de la GBA. Esa rom se la metías a la GBA, e iba perfesta. ¿Por qué no hacer esto con el Spectrum? ¿Por qué naide ha creado un disquete con instrucciones máquina nativas del Amiga, pero que "emulan" el Spectrum?
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 762
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 19 veces
Gracias recibidas: 39 veces

Re: Emulando 2 opcodes de Z80 de una sola vez.

Mensajepor Namek » 23 Nov 2018, 00:44

Bubu escribió:Yo no lo vería factible. Es brutal la cantidad de pares de instrucciones que hay. Tendríamos las 256 normales y las 256 de operaciones con bits (descartamos las ED, FD, etc). Así que tendríamos 512x512 pares de instrucciones = más de 250.000 pares. Suponte que, como mucho, te ahorras la mitad de ellas por ser como tú dices, operaciones "ortogonales". Nos quedan 125.000 pares de instrucciones. ¿Cuántos bytes necesitas pa emular cá par? Estamos hablando sin reciclar funciones, es decir, que el par LD A, B + LD C, D tiene una función que la emula, y LD A, B + LD D, C tiene otra función distinta que la emula, y no se recicla nada, ¿nor? Suponte pues que necesitas yo qué sé, ¿10? ¿20 bytes por cá par? Tendríamos: 125.000 pares x 10 bytes de emulación = 1250000 bytes, es decir, más de 1 MB.

En mis tiempos emulé la placa JAMMA del Frogger en la GBA. Es verdad que la CPU de la GBA va al doble que la de la Amiga, pero ni así se movía. Se me ocurrió entóns crear un "compilador". Desde Window$ le metías la rom del Frogger a mi compilador, y te escupía el juego pero con las instrucciones de la GBA. Esa rom se la metías a la GBA, e iba perfesta. ¿Por qué no hacer esto con el Spectrum? ¿Por qué naide ha creado un disquete con instrucciones máquina nativas del Amiga, pero que "emulan" el Spectrum?
Realmente solo serian 256 x 256 = 65536 combinaciones, ya que cuando la instrucción usa mas de 1 byte, en ese caso solo se emula 1 instrucción, pasaría lo mismo con las instrucciones con prefijo, en ese acso tambien se emula solo una instrucción, pero el hecho de no tener que decodificar el prefijo tambien es una mejora en velocidad.

La precompilación sería otra posibilidad, para código pensado para correr en ROM no hay problema ya que no se puede usar código automodificable, pero en Spectrum creo que se usa bastante.

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 841
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: 17 veces
Gracias recibidas: 35 veces

Re: Emulando 2 opcodes de Z80 de una sola vez.

Mensajepor Bubu » 23 Nov 2018, 00:51

Sí, claro, esto sería para emular pogramas no automodificables, yo creo que en muy poco porcentaje se automodifican, pero bueno, esto lo creo yo, puedo estar evivocado, jiji. ¿Tú crees que juegos como p.ej. el Manic Miner usan automodificación? Yo quiero pensar que no..
Y estás planteándote sólo emular el Z80, pero, ¿y la ULA? ¿Sabes el tiempo que se llevaría pa emular la ULA? Imagínate que quiero emular en Amiga esto:

Código: Seleccionar todo

LD HL, 16384
LD (HL), 255


Buffffff.... Como instrucciones está muy bien, tú te reservas tu RAM en el Amiga, y ahí metes un 255. Pero, ¿cómo pasas eso a pantalla? Eso es un marrón muy gordo. Es muchísimo más complejo emular la ULA que el Z80.
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 841
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: 17 veces
Gracias recibidas: 35 veces

Re: Emulando 2 opcodes de Z80 de una sola vez.

Mensajepor Bubu » 23 Nov 2018, 01:02

Y por supuesto que con la compilación tendrías el BASIC del Spectrum al 100% en el Amiga, ya que el BASIC no es automodificable. Esto sería una auténtica frikada, jiji.

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

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 762
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 19 veces
Gracias recibidas: 39 veces

Re: Emulando 2 opcodes de Z80 de una sola vez.

Mensajepor Namek » 23 Nov 2018, 01:08

Bubu escribió:Sí, claro, esto sería para emular pogramas no automodificables, yo creo que en muy poco porcentaje se automodifican, pero bueno, esto lo creo yo, puedo estar evivocado, jiji. ¿Tú crees que juegos como p.ej. el Manic Miner usan automodificación? Yo quiero pensar que no..
Y estás planteándote sólo emular el Z80, pero, ¿y la ULA? ¿Sabes el tiempo que se llevaría pa emular la ULA? Imagínate que quiero emular en Amiga esto:

Código: Seleccionar todo

LD HL, 16384
LD (HL), 255


Buffffff.... Como instrucciones está muy bien, tú te reservas tu RAM en el Amiga, y ahí metes un 255. Pero, ¿cómo pasas eso a pantalla? Eso es un marrón muy gordo. Es muchísimo más complejo emular la ULA que el Z80.
En el Amiga el señor McGavin utilizaba el blitter en paralelo con el 68000 para actualizar la pantalla, su emulador era multiproceso... :mrgreen:

Si se hace en plan básico sin efectos multicolor y sin preocuparte de timings la pantalla es casi lo de menos. No creerás que voy a actualizar la pantalla cada vez que se cambia un byte en la RAM de vídeo no?

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 841
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: 17 veces
Gracias recibidas: 35 veces

Re: Emulando 2 opcodes de Z80 de una sola vez.

Mensajepor Bubu » 23 Nov 2018, 01:22

Pero ¿te vas a poner con ello? Mucho ánimo, jijiji, aunque yo optaría por la opción de la compilación previa.
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 762
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 19 veces
Gracias recibidas: 39 veces

Re: Emulando 2 opcodes de Z80 de una sola vez.

Mensajepor Namek » 23 Nov 2018, 12:03

Bubu escribió:Pero ¿te vas a poner con ello? Mucho ánimo, jijiji, aunque yo optaría por la opción de la compilación previa.
Lo voy a intentar, empezare con las primeras instrucciones del reset del Spectrum a ver si se nota mucho la diferencia en velocidad y si me gustan los resultados tirare "palante" ... 8-)

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 841
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: 17 veces
Gracias recibidas: 35 veces

Re: Emulando 2 opcodes de Z80 de una sola vez.

Mensajepor Bubu » 23 Nov 2018, 12:08

No creo que se note nada en la emulación pura y dura de instrucciones. Donde se notará es en la pantalla, que yo apuesto a que irá más o menos a 1FPS :gamers:
A darle caña, a ver si consigues que se ponga la pantalla negra con las rayitas verticales rojas
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 762
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 19 veces
Gracias recibidas: 39 veces

Re: Emulando 2 opcodes de Z80 de una sola vez.

Mensajepor Namek » 23 Nov 2018, 13:56

Bubu escribió:No creo que se note nada en la emulación pura y dura de instrucciones. Donde se notará es en la pantalla, que yo apuesto a que irá más o menos a 1FPS :gamers:
A darle caña, a ver si consigues que se ponga la pantalla negra con las rayitas verticales rojas
Eso ya lo tengo, hace muuuuuchos años que programé mi emulador de Spectrum para Amiga, curiosamente el mio fue el primer emulador de Spectrum para Amiga que emulaba 128K, ahora es solo cuestión de modificar lo que tengo hecho para emular dos instrucciones de golpe y ver cuanto mas rápido va... :roll:


Volver a “Emuladores”

¿Quién está conectado?

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