Primeros pasos para pogramar un emulador

Foro dedicado a la emulación de sistemas clásicos en el PC o en otros sistemas.
ZX-81
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 128
Registrado: 04 Ene 2013, 16:43
Sistema Favorito: Spectrum +2
primer_sistema: ZX81
consola_favorita: Nintendo DS/3DS
Primera consola: Sega Genesis/Megadrive
Ubicación: La orilla del mar Mediterráneo
Gracias dadas: 16 veces
Gracias recibidas: 27 veces
Contactar:

Re: Primeros pasos para pogramar un emulador

Mensajepor ZX-81 » 09 Sep 2021, 15:49

ZX81 escribió:
ZX-81 escribió:
ZX81 escribió:Hola,
Ahora estoy mirando como hacer el tema de los sonidos (BEEP) en el emulador, la verdad que no tengo ni idea como implemantarlos. :? Imagino que será ir guardando los todos OUTs en un array y cuando se cumplan los 69888 T-States enviarlos a alguna clase que gestione el tema de los sonidos. :? No sé si existe alguna clase de java estandard con la que se pueda hacer.
También me queda otra cosa pendiente, es el tema del BORDER, me explico, por ejemplo cuando hago un SAVE no se ven las típicas líneas que salen en la pantalla del Spectrum cuando está grabando, sólo se ven flases. Ni idea como solucionarlo. :(

Saludos.


Solo te digo que lo del BEEP es una de las cosas más xungas a las que me he enfrentado nunca, y cuando escribí JSpeccy llevaba más de 20 años viviendo de programar. Cada uno se imagina su manera de hacerlo, hay quien cuenta ciclos e intenta saber qué frecuencia debería generar para emularla. La mayor pega es que todo lo demás es emulado y puede pasar, pero el sonido es lo único que es tiempo real y como se te vacíe el buffer de sonido, para lo que Java tiene clases preparadas, enseguida empiezas a escuchar cosas que no deberían estar ahí.

Lo de los flashes del borde es porque estás debiendo actualizar la pantalla una vez por cuadro (error, por ejemplo, en el Arkanoid no verás la bola nunca) y durante la carga se cambia el color del borde múltiples veces. Ejecuta esto y mira qué pasa:

10 BORDER 2: BORDER 5: PAUSE 1: GOTO 10

Deberías ver como un tercio de la pantalla con borde rojo y luego azul, y si pulsas una tecla la frontera entre los colores cambia ligeramente. Si eso no lo emulas bien, no verás correctamente los juegos que hacen efectos con el borde, como Aquaplane o Beach Head II por poner dos ejemplos.

Y todavía te queda meterte con la memoria en contienda, el bus flotante,.... como escarpias se me ponen los pelos, oiga!. <XX


Cuando llegue a casa, probaré lo del borde que comentas. La memoria en contienda puede ser que sea cuando la ULA y el Z80 intentan acceder a la vez a la memoria??? bus flotante, esto qué es??? :jumper:

Saludos.


Sí, la memoria en contienda es cuando la ULA deja tiesecita de los pies a la CPU quitándole el reloj. Y el bus flotante los valores que lees de los puertos pares cuando la ULA va leyendo la pantalla, algunos juegos los necesitan, como Arkanoid, Sidewize, Cobra...
Todo espacio de dimensión finita distinta de cero con producto interno tiene una base ortonormal. Tiene sentido, cuando no piensas sobre ello.
Profesor de Matemáticas U.C. Berkeley

Empieza a jugar sin tener que compilar: JSpeccy
Emulador bare-metal para la Raspberry PI 2/3: ZXBaremulator

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 » 09 Sep 2021, 19:10

Yo siempre he creído que un bus flotante era esto:

Imagen
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 » 09 Sep 2021, 19:40

Bubu escribió:Yo siempre he creído que un bus flotante era esto:

https://bashny.net/uploads/images/00/00 ... 6d418b.jpg

Pues no se si sera eso o no porque no se ve la imagen... [-X pero espero que no sea una foto de un autobus que flota... :mrgreen:

Imagen

El BUS flotante lo usan algunos juegos para sincronizarse con el barrido vertical y poder evitar de esta forma el "tearing", aunque la mayoría lo hace con las interrupciones hay unos pocos que usan esta característica que por cierto no existe en el Inves+, ni en el +2A ni en el +3, por lo que esos juegos no funcionan en esas maquinas, por suerte los aficionados han creado versiones modificadas que si funcionan.

Puedes decir que tu emulador emula un Inves+ y así no tendrías que emular el BUS flotante... :roll:

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 » 09 Sep 2021, 21:04

Namek escribió:Pues no se si sera eso o no porque no se ve la imagen... [-X pero espero que no sea una foto de un autobus que flota... :mrgreen:


Pues sí, era una chorrada así lo que puse, pero qué raro que no veas tú el afoto, porque está cogida del intenné público sin login ni ná...
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

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 » 10 Sep 2021, 22:09

Jeje! Muy bueno lo del bus flotante. XD
10 REM ESTA LINEA NO HACE NADA

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 » 28 Nov 2021, 12:21

Hola,
Estoy intentando poner sonido al emulador, pero no me funciona bien, el sonido va como 8 veces más acelerado de lo normal, cuando la velocidad del emulador es más o menos normal. Por ejemplo, cuando cargo el Abu Simbel la melodía va súper rápido :shock: .
La frecuencia de muestreo que he puesto es de 48000Hz, y cada 20.8us envío una muestra a la tarjeta de sonido, que por 960(48Khz/50Hz) dan 20ms, un campo de TV.

Con el método setValor guardo el dato OUT que envía el Z80, para que mas tarde lo pueda guardar el método guardarMuestra cada 73 T-States, y el método play reproduce el sonido cada 69888 T-States.

Código: Seleccionar todo

    public void setValor(int dato) {
        valor = (dato == 1) ? (int) AMPLITUD_MAXIMA : 0;
    }

    public void guardaMuestra() {
        //Canal izquierdo
        muestras[posMuestra + 0] = (byte) (valor & 0xFF); // low byte
        muestras[posMuestra + 1] = (byte) ((valor >> 8) & 0xFF); // high byte
        //Canal derecho
        muestras[posMuestra + 2] = (byte) (valor & 0xFF);
        muestras[posMuestra + 3] = (byte) ((valor >> 8) & 0xFF);
        posMuestra += 4;
    }

    public void play() {
        // Reproduce el sonido
        int offset = 0;
        while (offset < posMuestra) {
            offset += line.write(muestras, offset, posMuestra - offset);
        }
        posMuestra = 0;
        Spectrum.reproduciendoSonido = false;
    }


¿Alguna idea de por qué puede pasar esto?

Gracias.
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 » 29 Nov 2021, 01:51

Si dices que va 8 veces mas rápido me suena a que estas montando cada cambio de estado del bit de sonido en un bit de un sample de 8 bits? Cada cambio de estado en el bit de audio del spectrum correspondería con un byte de un sample de 8 bits o 2 bytes de un sample de 16 bits. Parece una tontería, pero como dices que va 8 veces mas rápido es lo único que se me ocurre... :roll:

También tienes que tener en cuenta que cuando se cambia el estado del bit de sonido y lo registras para producir el sonido también tienes que registrar los momentos en que no se esta cambiando el bit de audio, osea debes registrar el estado actual del bit de audio en el tiempo aunque no se este cambiando en un momento dado.

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 Dic 2021, 10:42

Namek escribió:Si dices que va 8 veces mas rápido me suena a que estas montando cada cambio de estado del bit de sonido en un bit de un sample de 8 bits? Cada cambio de estado en el bit de audio del spectrum correspondería con un byte de un sample de 8 bits o 2 bytes de un sample de 16 bits. Parece una tontería, pero como dices que va 8 veces mas rápido es lo único que se me ocurre... :roll:

También tienes que tener en cuenta que cuando se cambia el estado del bit de sonido y lo registras para producir el sonido también tienes que registrar los momentos en que no se esta cambiando el bit de audio, osea debes registrar el estado actual del bit de audio en el tiempo aunque no se este cambiando en un momento dado.


Hola,
Sí cuando OUT hace un cambio de estado lo actualizo, y luego cuando toca se añade al array de muestras de sonido, poniendo el cero como valor mínimo de nivel de volumen y el uno como valor máximo. Luego lo reproduzco mediante el método play, pero va acelerado, y también con algo de ruido.

Con este video se verá más claro: :-({|=
https://youtu.be/GjBdzUE38h8

Saludos.
10 REM ESTA LINEA NO HACE NADA

Avatar de Usuario
Lenko
Atari 1040 STf
Atari 1040 STf
Mensajes: 797
Registrado: 29 Mar 2005, 11:39
Gracias dadas: 441 veces
Gracias recibidas: 92 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Lenko » 01 Dic 2021, 15:51

Tenía este hilo unas cuántas páginas atrás y estaba alucinando de qué hacía zx81 preguntando esas cosas, cuando sus emuladores van siempre al t-state :D

Ya veo que zx-81 no es zx81 :mrgreen:

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 Dic 2021, 21:56

ZX81 escribió:
Namek escribió:Si dices que va 8 veces mas rápido me suena a que estas montando cada cambio de estado del bit de sonido en un bit de un sample de 8 bits? Cada cambio de estado en el bit de audio del spectrum correspondería con un byte de un sample de 8 bits o 2 bytes de un sample de 16 bits. Parece una tontería, pero como dices que va 8 veces mas rápido es lo único que se me ocurre... :roll:

También tienes que tener en cuenta que cuando se cambia el estado del bit de sonido y lo registras para producir el sonido también tienes que registrar los momentos en que no se esta cambiando el bit de audio, osea debes registrar el estado actual del bit de audio en el tiempo aunque no se este cambiando en un momento dado.


Hola,
Sí cuando OUT hace un cambio de estado lo actualizo, y luego cuando toca se añade al array de muestras de sonido, poniendo el cero como valor mínimo de nivel de volumen y el uno como valor máximo. Luego lo reproduzco mediante el método play, pero va acelerado, y también con algo de ruido.

Con este video se verá más claro: :-({|=
https://youtu.be/GjBdzUE38h8

Saludos.

Pero sigues sin aclararme si añades la información de la forma de onda cuando no se esta haciendo un OUT, aunque no se haga un OUT, el estado a 1 o a 0 del bit de sonido debe registrarse en la forma de onda final, ya que el tiempo que pasa entre un OUT y el siguiente es también tiempo de onda que debe ser registrado.


Volver a “Emuladores”

¿Quién está conectado?

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