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
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 838
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 18 veces
Gracias recibidas: 63 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Namek » 31 Ago 2021, 23:35

Lo que yo hago en mi emulador es preservar el CARRY, si el bit testado es 0 pongo los flags "Z", "H" y "V" a 1 y el resto a 0 y si el bit es 1 pongo "H" a 1 y el resto a 0, no se si paso el TEST, pero los juegos que he probado funcionan.

ZX81
MSX Turbo R
MSX Turbo R
Mensajes: 487
Registrado: 20 Abr 2005, 19:18
Gracias dadas: 3 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor ZX81 » 01 Sep 2021, 18:38

Namek escribió:Lo que yo hago en mi emulador es preservar el CARRY, si el bit testado es 0 pongo los flags "Z", "H" y "V" a 1 y el resto a 0 y si el bit es 1 pongo "H" a 1 y el resto a 0, no se si paso el TEST, pero los juegos que he probado funcionan.


Hola,
Gracias por contestar. Yo hago lo mismo que tú, pero no pasa el Test. Otro error raro que me da es ALO A,A que supuestamente es ADD A,A . :shock:

Métodos:

Código: Seleccionar todo

    // Suma a A el contenido del registro indicado
    public void addA(int registro) {
        int reg = 0;
        switch (registro) {
            case A:
                reg = leeA();
                break;
            case B:
                reg = leeB();
                break;
            case C:
                reg = leeC();
                break;
            case D:
                reg = leeD();
                break;
            case E:
                reg = leeE();
                break;
            case H:
                reg = leeH();
                break;
            case L:
                reg = leeL();
                break;
            case HL:
                reg = Memoria.romRam[hl];
                break;
        }
        sumaAFlags(reg, false);
    }


Código: Seleccionar todo

    // Realiza la suma con el registro A y modifica los flags
    public void sumaAFlags(int valor, boolean acarreo) {
        int regA = leeA();
        //Guarda el valor de los  registro A y el flag C
        int regTemp = regA;
        int flagCTemp = leeF() & FLAG_C;
        // suma el registro y modifica los flags
        regA = regA + valor;
        if (getFlagC() && acarreo) {
            regA++;// Suma Carry
        }
        if (regA > 255) {// Flag CARRY
            setCFlag();
        } else {
            ceroCFlag();
        }
        regA = regA & 0xFF;
        escribeA(regA);
        if (regA == 0) {// Flag CERO
            setZFlag();
        } else {
            ceroZFlag();
        }
        if (regA > 127) {// Flag SIGNO
            setSFlag();
        } else {
            ceroSFlag();
        }
        if (acarreo) {
            if ((((regTemp & 0xf) + (valor & 0xf)) + (flagCTemp) & FLAG_H) == FLAG_H) {//Flag H
                setHFlag();
            } else {
                ceroHFlag();
            }
        } else {
            if ((((regTemp & 0xf) + (valor & 0xf)) & FLAG_H) == FLAG_H) {//Flag H
                setHFlag();
            } else {
                ceroHFlag();
            }
        }
        if (acarreo) {
            if (((regTemp <= 127) && (valor <= 127) && (((regTemp + valor + (flagCTemp)) & 0xff) > 127)) || ((regTemp > 127) && (valor > 127) && (((regTemp + valor + (flagCTemp) & 0xff)) <= 127))) {// Flag P/V Paridad/Desbordamiento
                setPVFlag();
            } else {
                ceroPVFlag();
            }
        } else {
            if (((regTemp <= 127) && (valor <= 127) && (((regTemp + valor) & 0xff) > 127)) | ((regTemp > 127) && (valor > 127) && (((regTemp + valor) & 0xff) <= 127))) {// Flag P/V Paridad/Desbordamiento
                setPVFlag();
            } else {
                ceroPVFlag();
            }
        }
        flagsXY(regA);
        ceroNFlag();
    }


Ya sé que se puede optimizar bastante el código de la instrucción ADD A,n , pero de momento funciona bien con las sumas y los Flags marcan bien. En el test marca OK la instrucción ADD A,n , pero la de ALO A,A da fallo, así que no sé que puede ser.


alo a,a.PNG
alo a,a.PNG (8.88 KiB) Visto 4846 veces
10 REM ESTA LINEA NO HACE NADA

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 838
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 18 veces
Gracias recibidas: 63 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Namek » 01 Sep 2021, 19:30

No se cual es tu objetivo, pero hacer un emulador perfecto de Spectrum es mucho mas complicado que emular el Z80 a la perfección, aunque consigas una emulación de Z80 perfecta, luego tendrás que emular el resto del hardware del Spectrum también a la perfección, ya que de otra manera siempre habrá algún juego o demo o lo que sea que no funcionará correctamente, por esa razón nunca he pretendido hacer un emulador de Spectrum perfecto, ya que requiere mucho esfuerzo, me conformo con una compatibilidad cercana al 99% y por supuesto me olvido de emular los efectos de multicolor que necesitan controlar los tiempos a la perfección, mi idea siempre ha sido poder emular la mayoría de juegos famosos aunque no sea a la perfección, con que funcionen me vale aunque funcionen algo mas rápido o mas lento.

También me gustaría diseñar un clon "compatible" Spectrum con la misma filosofía, un Z80 con 48K de RAM y un circuito lo mas simple posible para presentar la señal vídeo del Spectrum sin tener en cuenta timings ni nada y ya está, por supuesto tampoco funcionarían los efectos multicolor, pero como de sencillo sería el circuito de ese "clon"? :-k Por suerte o por desgracia no tengo conocimientos de electrónica... :roll:

ZX81
MSX Turbo R
MSX Turbo R
Mensajes: 487
Registrado: 20 Abr 2005, 19:18
Gracias dadas: 3 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor ZX81 » 01 Sep 2021, 21:11

Namek escribió:No se cual es tu objetivo, pero hacer un emulador perfecto de Spectrum es mucho mas complicado que emular el Z80 a la perfección, aunque consigas una emulación de Z80 perfecta, luego tendrás que emular el resto del hardware del Spectrum también a la perfección, ya que de otra manera siempre habrá algún juego o demo o lo que sea que no funcionará correctamente, por esa razón nunca he pretendido hacer un emulador de Spectrum perfecto, ya que requiere mucho esfuerzo, me conformo con una compatibilidad cercana al 99% y por supuesto me olvido de emular los efectos de multicolor que necesitan controlar los tiempos a la perfección, mi idea siempre ha sido poder emular la mayoría de juegos famosos aunque no sea a la perfección, con que funcionen me vale aunque funcionen algo mas rápido o mas lento.


Intento hacer un emulador muy básico, lo que pasa es que estoy buscando fallos en la emulación del z80 mediante este test, ya que tengo algunos fallos y pienso que son de la emulación de las instrucciones del Z80. Por ejemplo cuando intento cargar un juego, sólo me cargan los juegos en Basic, los que llevan CODE no me cargan, ni el registro IX, ni el registro DE de la rutina LOAD cogen los valores correctos. Otro error que pasa es cuando utilizas algún comando en BASIC con algún numero (por ejemplo pones PRINT 6) y pulsas luego ENTER, se corrompen los 6 primeros bits de la ROM.

También me gustaría diseñar un clon "compatible" Spectrum con la misma filosofía, un Z80 con 48K de RAM y un circuito lo mas simple posible para presentar la señal vídeo del Spectrum sin tener en cuenta timings ni nada y ya está, por supuesto tampoco funcionarían los efectos multicolor, pero como de sencillo sería el circuito de ese "clon"? :-k Por suerte o por desgracia no tengo conocimientos de electrónica... :roll:


Uffff eso si que lo veo difícil de hacer.. :jumper:
10 REM ESTA LINEA NO HACE NADA

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 838
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 18 veces
Gracias recibidas: 63 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Namek » 01 Sep 2021, 22:19

Esos errores suelen ser mas tontos de lo que crees, a mi me ha pasado que en instrucciones que tenían que afectar a un registro, por error estaban afectando a otro, o que en operaciones de bits estaba afectando a otro bit, esos han sido mis errores de emulación mas habituales.

Si quieres te puedo pasar mi proyecto JAVA que emula BASIC perfectamente, o al menos eso creo yo, incluso me funcionan algunos juegos como EXPLODING FIST o HIGHWAY ENCOUNTER.

ZX81
MSX Turbo R
MSX Turbo R
Mensajes: 487
Registrado: 20 Abr 2005, 19:18
Gracias dadas: 3 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor ZX81 » 01 Sep 2021, 22:29

Hola,
Pues si me lo pasas te lo agradecería. Seguramente me ayudaría a comprender lo que pasa en mi emulador y encontrar los fallos que tengo. :D

Saludos.
10 REM ESTA LINEA NO HACE NADA

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 838
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 18 veces
Gracias recibidas: 63 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Namek » 01 Sep 2021, 23:04

Tienes un privado... :roll:

ZX81
MSX Turbo R
MSX Turbo R
Mensajes: 487
Registrado: 20 Abr 2005, 19:18
Gracias dadas: 3 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor ZX81 » 01 Sep 2021, 23:44

Namek escribió:Tienes un privado... :roll:

Visto!
10 REM ESTA LINEA NO HACE NADA

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 886
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: 20 veces
Gracias recibidas: 60 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Bubu » 02 Sep 2021, 20:27

ZX81, yo cuando hice mi emulador no usé java, pero la operación para hacer el AND de 8 bits creo recordar que no era tan simple como el "&" que tú esas en java, como en esta instrucción:

Código: Seleccionar todo

int flagCTemp = leeF() & FLAG_C;


¿Seguro que así de simple es un AND de 8 bits en java?

Por otra parte, ¿te funciona ADD A, B y no te funciona ADD A, A?
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 838
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 18 veces
Gracias recibidas: 63 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Namek » 02 Sep 2021, 22:38

Bubu escribió:ZX81, yo cuando hice mi emulador no usé java, pero la operación para hacer el AND de 8 bits creo recordar que no era tan simple como el "&" que tú esas en java, como en esta instrucción:

Código: Seleccionar todo

int flagCTemp = leeF() & FLAG_C;


¿Seguro que así de simple es un AND de 8 bits en java?

Por otra parte, ¿te funciona ADD A, B y no te funciona ADD A, A?

No es un AND de 8 bits, es un AND en general, puedes usar el tamaño de palabra que quieras.

Y lo del ADD A,A será porque en el Z80 real tendrá algún tipo de efecto secundario no documentado que busca el TEST, pero como lo emula igual que el resto de ADDs pues lo da como fallo, por eso te decía lo de la dificultad de hacer una emulación "perfecta".


Volver a “Emuladores”

¿Quién está conectado?

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