Página 10 de 20

Re: Primeros pasos para pogramar un emulador

Publicado: 21 Sep 2018, 17:48
por PabloMarmol
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.

Re: Primeros pasos para pogramar un emulador

Publicado: 28 Sep 2018, 17:20
por Bubu
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?

Re: Primeros pasos para pogramar un emulador

Publicado: 28 Sep 2018, 22:07
por Namek
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:

Re: Primeros pasos para pogramar un emulador

Publicado: 29 Sep 2018, 01:07
por Bubu
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.

Re: Primeros pasos para pogramar un emulador

Publicado: 29 Sep 2018, 03:08
por Namek
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:

Re: Primeros pasos para pogramar un emulador

Publicado: 29 Sep 2018, 08:44
por robcfg
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.

Re: Primeros pasos para pogramar un emulador

Publicado: 29 Sep 2018, 15:45
por PabloMarmol
Otra opción es mirar la doc oficial de zilog, donde pone que la resta y la comparación son unsigned.

Re: Primeros pasos para pogramar un emulador

Publicado: 29 Sep 2018, 19:54
por Bubu
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?

Re: Primeros pasos para pogramar un emulador

Publicado: 29 Sep 2018, 20:04
por Namek
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.

Re: Primeros pasos para pogramar un emulador

Publicado: 02 Oct 2018, 20:35
por Namek
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:\