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
Bubu
Amstrad PC 1640
Amstrad PC 1640
Mensajes: 525
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: 12 veces
Gracias recibidas: 15 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Bubu » 07 Sep 2018, 19:44

OK, ZX-81, para mí esa es desde luego la parte más fácil, pues es todo operaciones con bits, etc, y eso lo controlo bastante.

Por cierto, me imagino que como lenguaje de pogramación, el 100% me aconsejaréis VC++, ¿nor? ¿se puede encasquetar el VC++ al entonno "Visual Studio Code?
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

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

Re: Primeros pasos para pogramar un emulador

Mensajepor robcfg » 07 Sep 2018, 20:01

Claro que se puede: https://code.visualstudio.com/docs/languages/cpp

Hay mucha información en internet si tienes cualquier problema.

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

Re: Primeros pasos para pogramar un emulador

Mensajepor Bubu » 07 Sep 2018, 20:06

Aro, lo malo es dibujar la pantalla. Por lo que veo el VC++ en VS-Code sólo es pal código, no hay un entonno gráfico pa poner menús, botones, etc. Creo que la solución es con el VS-Community.
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
chernandezba
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 220
Registrado: 11 Mar 2015, 10:42
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: ZX81
consola_favorita: NeoGeo
Primera consola: Atari 2600
Gracias dadas: 10 veces
Gracias recibidas: 60 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor chernandezba » 07 Sep 2018, 21:01

Bubu escribió:
Por cierto, me imagino que como lenguaje de pogramación, el 100% me aconsejaréis VC++, ¿nor? ¿se puede encasquetar el VC++ al entonno "Visual Studio Code?


100%?? No, como recordarás yo dije C, puro y duro, nada de Visual ni de ++
El Visual Studio Core puedes usarlo como editor, también tienes Atom o CLion, cada cual con sus gustos
----

ZEsarUX
ZX Second-Emulator And Released for UniX
https://github.com/chernandezba/zesarux

Avatar de Usuario
chernandezba
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 220
Registrado: 11 Mar 2015, 10:42
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: ZX81
consola_favorita: NeoGeo
Primera consola: Atari 2600
Gracias dadas: 10 veces
Gracias recibidas: 60 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor chernandezba » 07 Sep 2018, 21:03

Bubu escribió:OK, ZX-81, para mí esa es desde luego la parte más fácil, pues es todo operaciones con bits, etc, y eso lo controlo bastante.



Si te refieres a emular el Z80, no basta con saber de bits. Como te dice @ZX-81, hay que hacerlo muy bien o habrán juegos que fallarán.
Sobretodo temas de opcodes no documentados, comportamientos no documentados o la memoria contenida... si no haces esto perfecto, aunque sepas de operaciones de bits, pues... ;)
----

ZEsarUX
ZX Second-Emulator And Released for UniX
https://github.com/chernandezba/zesarux

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

Re: Primeros pasos para pogramar un emulador

Mensajepor Namek » 08 Sep 2018, 12:22

Me he animado y voy a intentar hacer un emulador de Spectrum lo mas básico posible, estoy usando FreeBASIC y por ahora tengo la representacion de la pantalla sin efecto FLASH por ahora, a ver que os parece... :mrgreen:

Se podria simplificar este código? Ya que lo que me interesa es simplicidad, no rendimiento, mi idea es que pueda servir de base a los interesados.

Código: Seleccionar todo

DIM MEMORY(65536) AS BYTE
DIM key AS STRING
DIM AS INTEGER X,Y1,Y2,Y3,SCR,ATTR,INK,PAPER,COL,BORDER
DIM V AS BYTE

SCREEN 14,8

dim as integer mypal(0 to 255)
mypal(1)=&hB90000
mypal(2)=&h0000B9
mypal(3)=&hB900B9
mypal(4)=&h00B900
mypal(5)=&hB9B900
mypal(6)=&h00B9B9
mypal(7)=&hB9B9B9
mypal(9)=&hFF0000
mypal(10)=&h0000FF
mypal(11)=&hFF00FF
mypal(12)=&h00FF00
mypal(13)=&hFFFF00
mypal(14)=&h00FFFF
mypal(15)=&hFFFFFF
palette using mypal

open "screen.scr" for binary as #1

SCR=16384
do until(eof(1))
    get #1,,V
    MEMORY(SCR)=V
    SCR=SCR+1
loop
close #1

BORDER=0
ATTR=22528
SCR=16384

mypal(0)=mypal(BORDER)
palette using mypal

FOR Y1=24 TO 215 STEP 64
    FOR Y2=0 TO 7
        FOR Y3=Y1+Y2 TO Y1+63 STEP 8
            FOR X=32 TO 287 STEP 8
                INK=MEMORY(ATTR) AND 7
                PAPER=(MEMORY(ATTR) AND 56)/8
                IF (MEMORY(ATTR) AND 64)=64 THEN
                    INK=INK+8
                    PAPER=PAPER+8
                END IF
                IF INK=0 THEN INK=8
                IF PAPER=0 THEN PAPER=8

                V=MEMORY(SCR)
                COL=PAPER
                IF V<0 THEN
                    COL=INK
                    V=V+128
                END IF
                PSET (X,Y3),COL
                COL=PAPER
                IF V>63 THEN
                    COL=INK
                    V=V-64
                END IF
                PSET (X+1,Y3),COL
                COL=PAPER
                IF V>31 THEN
                    COL=INK
                    V=V-32
                END IF
                PSET (X+2,Y3),COL
                COL=PAPER
                IF V>15 THEN
                    COL=INK
                    V=V-16
                END IF
                PSET (X+3,Y3),COL
                COL=PAPER
                IF V>7 THEN
                    COL=INK
                    V=V-8
                END IF
                PSET (X+4,Y3),COL
                COL=PAPER
                IF V>3 THEN
                    COL=INK
                    V=V-4
                END IF
                PSET (X+5,Y3),COL
                COL=PAPER
                IF V>1 THEN
                    COL=INK
                    V=V-2
                END IF
                PSET (X+6,Y3),COL
                COL=PAPER
                IF V=1 THEN COL=INK
                PSET (X+7,Y3),COL
                SCR=SCR+1
                ATTR=ATTR+1
            NEXT X
        NEXT Y3
        IF Y2<7 THEN ATTR=ATTR-256
    NEXT Y2
NEXT Y1

WHILE key=""
    key=INKEY
WEND

Urusergi
MSX Turbo R
MSX Turbo R
Mensajes: 363
Registrado: 21 Dic 2011, 10:11
Ubicación: Madrid
Gracias dadas: 171 veces
Gracias recibidas: 7 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor Urusergi » 08 Sep 2018, 18:39

Namek escribió:Me he animado y voy a intentar hacer un emulador de Spectrum lo mas básico posible, estoy usando FreeBASIC y por ahora tengo la representacion de la pantalla sin efecto FLASH por ahora, a ver que os parece... :mrgreen:

Lo he intentado pero solo me aparecen dos ventanas en negro #-o

EDIT: Ah! vale, es que hace falta un archivo .scr
Ahora si que funciona, estoy viendo la pantalla del Athena y es la reos$·% \:D/

Avatar de Usuario
dondiego
Atari 1040 STf
Atari 1040 STf
Mensajes: 793
Registrado: 30 May 2013, 22:05
Sistema Favorito: PC
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Sony PlayStation 2
Primera consola: Atari 2600
Ubicación: Granada
Gracias dadas: 9 veces
Gracias recibidas: 47 veces

Re: Primeros pasos para pogramar un emulador

Mensajepor dondiego » 09 Sep 2018, 00:51

Bubu escribió:Por lo que veo el VC++ en VS-Code sólo es pal código

Es que el VS Code no es un IDE es un editor. El IDE es el VS 2017.
Yo uso tanto VS (porque tengo que hacerlo) como Code::Blocks con MinGW y en linux (gcc).
El editor de VS no me convence mucho y el compilador de C no vale nada, reconocido por ellos mismos, no soporta ni C99. El de C++ tampoco es que sea muy bueno que digamos.

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

Re: Primeros pasos para pogramar un emulador

Mensajepor Bubu » 09 Sep 2018, 01:03

Namek, el poblema es que FreeBASIC no implementa disparadores (triggers), y sin ellos nu sé cómo vas a hacer que el Z80 ejecute cosas y la ULA muestre los pantallazos, ni sé cómo vas a controlar los timings.
Lo que sí veo que es un acierto es a la hora de pintar: simplemente haces PSET y ya tienes un puntito dibujado.

dondiego, yo estoy ahora instalando el VS Community, que sí integra IDE's, y además le instalas el VC++ y por lo visto va fino, fino. A ver si lo consigo y te cuenco. Si alguien tiene una opción mejón soy todo orejas.
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

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

Re: Primeros pasos para pogramar un emulador

Mensajepor Namek » 09 Sep 2018, 01:29

Bubu escribió:Namek, el poblema es que FreeBASIC no implementa disparadores (triggers), y sin ellos nu sé cómo vas a hacer que el Z80 ejecute cosas y la ULA muestre los pantallazos, ni sé cómo vas a controlar los timings.
Lo que sí veo que es un acierto es a la hora de pintar: simplemente haces PSET y ya tienes un puntito dibujado.

Pues simplemente voy a usar una variable para el PC (Program Counter) y empezando desde el valor 0 ire leyendo el byte al que apunte y segun que valor sea emulare la instruccion del Z80 correspondiente, y cada cierto numero de operaciones dibujare la pantalla y a ver que pasa... :mrgreen: Los timings los ignoraré miserablemente por ahora... :roll:


Volver a “Emuladores”

¿Quién está conectado?

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