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
PabloMarmol
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 141
Registrado: 03 Sep 2012, 17:32
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
Primera consola: Nintendo NES/Clónica
Ubicación: León, España
Gracias dadas: 6 veces
Gracias recibidas: 4 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor PabloMarmol » 21 Sep 2018, 17:48

Namek escribió:La imagen se actualiza 50 veces por segundo, las mismas 50 veces que saltan las interupciones, por tanto cada 69888 ciclos comienza a actualizarse la imagen y salta una interrupción, y por que cada 69888 ciclos?, pues por que 69888 x 50 = 3494400 que son el total de ciclos que procesa el Z80 por segundo que curiosamente coincide con los 3,5 Mhz que es la frecuencia a la que trabaja el Z80 del Spectrum,
Has hecho mal el cálculo.
La frecuencia es 3 500 000, no 3 494 400.
Divide los 3 500 000 ciclos entre los 69888 que tarda en completar una pantalla y te saldrán los 50,08 Hz que usa el spectrum.

Avatar de Usuario
Bubu
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 517
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: 11 veces
Gracias recibidas: 15 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Bubu » 28 Sep 2018, 17:20

Hoygan, tengo una duda que es muy básica, pero nu sé por qué no lo veo claro... Resulta que estoy emulando la instrucción CP + JR C. Y mi duda es si la comparación es con signo o sin signo. En concreto, lo siguiente:

A= 32 (es positivo)
CP 128 (el 128 es más grande que 32, pero al tener el bit 7=1, sería negativo, y por tanto es menor que 32)
¿Saltaría JR C or not?
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
Namek
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 633
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 12 veces
Gracias recibidas: 27 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Namek » 28 Sep 2018, 22:07

Bubu escribió:Hoygan, tengo una duda que es muy básica, pero nu sé por qué no lo veo claro... Resulta que estoy emulando la instrucción CP + JR C. Y mi duda es si la comparación es con signo o sin signo. En concreto, lo siguiente:

A= 32 (es positivo)
CP 128 (el 128 es más grande que 32, pero al tener el bit 7=1, sería negativo, y por tanto es menor que 32)
¿Saltaría JR C or not?

Esto es mas simple de entender si ves el opcode CP como lo que realmente es, una resta, por tanto CP 128 es como restarle 128 a A pero sin modificar A, entonces si el resultado es 0 ponemos Z=1 y C=0 , si es menor ponemos Z=0 y C=1 y si es mayor Z=0 y C=0. :mrgreen:

Avatar de Usuario
Bubu
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 517
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: 11 veces
Gracias recibidas: 15 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Bubu » 29 Sep 2018, 01:07

Sí, si tengo claro que CP es un SUB en "sólo lestura", pero lo que no entiendo es si las operaciones arisméticas se tratan como bytes signed o unsigned. Si los números son:

A = 00111111
B = 10101010

entóns A>B en el mundo signed, pero A<B en el mundo unsigned. ¿Cómo funciona el Z80? Yo creo que funciona en modo unsigned pero pido confirmación al respesto :D
Por eso pregunto si CP B me da en este ejemplo carry o no.
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
Namek
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 633
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 12 veces
Gracias recibidas: 27 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Namek » 29 Sep 2018, 03:08

En el ejemplo que has puesto daria C=1 porque 32-128=-96 o lo que es lo mismo 160 sin signo, para el Z80 los valores son siempre sin signo, es por eso que tenemos el flag S para conocer el signo del resultado. En otras palabras, si en lugar de un CP 128 fuera un SUB 128, A acabaria con el valor 160, yo en mi programa Z80 tendria que comprobar el flag S para saber si ese resultado es positivo o negativo, :roll:

Avatar de Usuario
robcfg
Amiga 1200
Amiga 1200
Mensajes: 1931
Registrado: 07 May 2009, 15:34
Sistema Favorito: Amstrad CPC
primer_sistema: Atari 800XL/600XL
Ubicación: Estocolmo
Gracias dadas: 294 veces
Gracias recibidas: 88 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor robcfg » 29 Sep 2018, 08:44

También podrías hacer un programa que te probara todos las combinaciones de valores en una máquina real y los contrastara con los que calculas.

Avatar de Usuario
PabloMarmol
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 141
Registrado: 03 Sep 2012, 17:32
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
Primera consola: Nintendo NES/Clónica
Ubicación: León, España
Gracias dadas: 6 veces
Gracias recibidas: 4 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor PabloMarmol » 29 Sep 2018, 15:45

Otra opción es mirar la doc oficial de zilog, donde pone que la resta y la comparación son unsigned.

Avatar de Usuario
Bubu
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 517
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: 11 veces
Gracias recibidas: 15 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Bubu » 29 Sep 2018, 19:54

OK, muchas gracias, PabloMarmol. Puedo mirar intenné y documentación oficial, lo que pasa es que me gustan los foros, y me gusta preguntar y responder en ellos, para que tengan vida, y además por si otros compis tienen las mismas dudas, se encuentren el tema ya escrito en el foro ;)

Bueno, sus cuento cómo voy: yo tengo hechos 3 ó 4 juegos pogramados en ensamblador, y éstos funcionan en mi emulador. Bueno, funcionan sin sonido y sin lestura del teclado, porque eso aún no lo he implementado en la ULA.
Pero la ROM del Spectrum nu sé qué pasa que no va del todo... Se pone la pantalla en negro, salen las rayitas en rojo, se pone ahora todo blanco, y justo cuando va a salir el mensaje (c) 1982 Sinclair Research Ltd se desborda la ROM y empieza a ejecutar las posiciones finales de la ROM donde está el juego de carasteres, e incluso la RAM.
En fin, aquí lo único que me queda es armarme de patientia y debugar al máximo el emulaor a ver qué fallo está teniendo.

Tengo ahora dudas con el tema del sonido: si la ULA recibe un 1 por el puerto de sonido, eso es que la onda está p'arriba, y un 0 es que está p'abajo. ¿A qué frecuencia "escupe" la ULA esta onda hacia el beeper? ¿los que habéis hecho emulaores, cómor gestionáis el sonido? ¿con alguna librería específica para ello?
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
Namek
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 633
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 12 veces
Gracias recibidas: 27 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Namek » 29 Sep 2018, 20:04

Bubu escribió:Tengo ahora dudas con el tema del sonido: si la ULA recibe un 1 por el puerto de sonido, eso es que la onda está p'arriba, y un 0 es que está p'abajo. ¿A qué frecuencia "escupe" la ULA esta onda hacia el beeper? ¿los que habéis hecho emulaores, cómor gestionáis el sonido? ¿con alguna librería específica para ello?
La frecuencia es la misma que la velocidad a la que tu programa en Z80 cambie ese 1 por un 0 o ese 0 por un 1.

Avatar de Usuario
Namek
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 633
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 12 veces
Gracias recibidas: 27 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Namek » 02 Oct 2018, 20:35

Solo por comparar he adaptado el codigo de pintar la pantalla de mi emulador de Spectrum en FreeBASIC a Visual Basic 6 y la verdad es que el rendimiento es realmente deprimente, sabia que VB6 era malo, jope pero no tanto, es que ni compilado corre eso. Supongo que lo ideal seria generar la imagen en un PictureBox y luego actualizarlo en la ventana, pero ni idea de como se hace eso, pongo el código por si alguien es capaz de hacer que corra mas... :roll:

Código: Seleccionar todo

Private Sub Form_Load()
    Me.Width = PixelsToTwips(320)
    Me.Height = PixelsToTwips(240)
    Scale (0, PixelsToTwips(215))-(PixelsToTwips(314), 0)
End Sub

Private Sub Form_Paint()
    Dim fileNum As Integer
    Dim bytes() As Byte

    Dim color As Long
    Dim pal(8) As Long
    pal(0) = vbBlack
    pal(1) = vbBlue
    pal(2) = vbRed
    pal(3) = vbMagenta
    pal(4) = vbGreen
    pal(5) = vbCyan
    pal(6) = vbYellow
    pal(7) = vbWhite

    fileNum = FreeFile
    Open "C:\screen.scr" For Binary As fileNum
    ReDim bytes(LOF(fileNum) - 1)
    Get fileNum, , bytes
    Close fileNum
    Dim x As Integer
    Dim y As Integer
    Line (0, 0)-(PixelsToTwips(319), PixelsToTwips(239)), vbBlack, BF
    scr = 0
    attr = 6144
    r = 0
    q = 0
    ti = PixelsToTwips(1)
    For y = 191 + 12 To 12 Step -1
        For x = 0 + 28 To 255 + 28 Step 8
            ink = pal(bytes(attr) And 7)
            paper = pal((bytes(attr) And 56) / 8)
            tx = x * ti
            ty = y * ti
            v = bytes(scr)
           
            If (v And 128) = 128 Then color = ink Else color = paper
            PSet (tx, ty), color
            tx = tx + ti
            If (v And 64) = 64 Then color = ink Else color = paper
            PSet (tx, ty), color
            tx = tx + ti
            If (v And 32) = 32 Then color = ink Else color = paper
            PSet (tx, ty), color
            tx = tx + ti
            If (v And 16) = 16 Then color = ink Else color = paper
            PSet (tx, ty), color
            tx = tx + ti
            If (v And 8) = 8 Then color = ink Else color = paper
            PSet (tx, ty), color
            tx = tx + ti
            If (v And 4) = 4 Then color = ink Else color = paper
            PSet (tx, ty), color
            tx = tx + ti
            If (v And 2) = 2 Then color = ink Else color = paper
            PSet (tx, ty), color
            tx = tx + ti
            If (v And 1) = 1 Then color = ink Else color = paper
            PSet (tx, ty), color
            scr = scr + 1
            attr = attr + 1
        Next x
        attr = attr - 32
        scr = scr + 224
        r = r + 1
        If r = 8 Then
            attr = attr + 32
            r = 0
            scr = scr - 2016
            q = q + 1
            If q = 8 Then q = 0: scr = scr + 1792
        End If
    Next y
End Sub

Private Function PixelsToTwips(pixels As Integer)
    PixelsToTwips = pixels * Screen.TwipsPerPixelX
End Function
Teneis que poner un "SCREEN.SCR" en C:\


Volver a “Emuladores”

¿Quién está conectado?

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