Página 14 de 20

Re: Primeros pasos para pogramar un emulador

Publicado: 31 Ago 2021, 23:35
por Namek
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.

Re: Primeros pasos para pogramar un emulador

Publicado: 01 Sep 2021, 18:38
por ZX81
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 5025 veces

Re: Primeros pasos para pogramar un emulador

Publicado: 01 Sep 2021, 19:30
por Namek
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:

Re: Primeros pasos para pogramar un emulador

Publicado: 01 Sep 2021, 21:11
por ZX81
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:

Re: Primeros pasos para pogramar un emulador

Publicado: 01 Sep 2021, 22:19
por Namek
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.

Re: Primeros pasos para pogramar un emulador

Publicado: 01 Sep 2021, 22:29
por ZX81
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.

Re: Primeros pasos para pogramar un emulador

Publicado: 01 Sep 2021, 23:04
por Namek
Tienes un privado... :roll:

Re: Primeros pasos para pogramar un emulador

Publicado: 01 Sep 2021, 23:44
por ZX81
Namek escribió:Tienes un privado... :roll:

Visto!

Re: Primeros pasos para pogramar un emulador

Publicado: 02 Sep 2021, 20:27
por Bubu
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?

Re: Primeros pasos para pogramar un emulador

Publicado: 02 Sep 2021, 22:38
por Namek
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".