Aprendiendo a programar un Emulador (DCPU-16)
Re: Aprendiendo a programar un Emulador (DCPU-16)
Lo del vídeo ya veo que lo entendiste, y es lo que has leído de esa web. Yo te lo dije de cabeza, por que no me acordaba, pero los tiros iban por el buen camino.
- Hark0
- Amiga 1200
- Mensajes: 1695
- Registrado: 11 Jul 2012, 23:44
- Sistema Favorito: Spectrum 16Kb/48Kb
- primer_sistema: Spectrum 16Kb/48Kb
- consola_favorita: (Otro)
- Primera consola: (Otro)
- Ubicación: Cornellà de Llobregat - Barcelona
- Contactar:
Re: Aprendiendo a programar un Emulador (DCPU-16)
jepalza escribió:Lo del vídeo ya veo que lo entendiste, y es lo que has leído de esa web. Yo te lo dije de cabeza, por que no me acordaba, pero los tiros iban por el buen camino.
Exacto!!!!
Estas son las características de vídeo de la máquina (http://0x10cwiki.com/wiki/DCPU-16):
Tile-based Video RAM of 32x12 tiles defined by 128 4x8 characters stored in RAM
A adaptar tocan!!!

http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.
- Hark0
- Amiga 1200
- Mensajes: 1695
- Registrado: 11 Jul 2012, 23:44
- Sistema Favorito: Spectrum 16Kb/48Kb
- primer_sistema: Spectrum 16Kb/48Kb
- consola_favorita: (Otro)
- Primera consola: (Otro)
- Ubicación: Cornellà de Llobregat - Barcelona
- Contactar:
Re: Aprendiendo a programar un Emulador (DCPU-16)
Buenas, tras unos días de trabajo + gripazo del 15, sigo con el asunto:
La pregunta: ¿Cómo testear correctamente las instrucciones?
Cuento con estos operandos:
0x00-0x07: register (A, B, C, X, Y, Z, I or J, in that order)
0x08-0x0f: [register]
0x10-0x17: [next word + register]
0x18: POP / [SP++]
0x19: PEEK / [SP]
0x1a: PUSH / [--SP]
0x1b: SP
0x1c: PC
0x1d: O
0x1e: [next word]
0x1f: next word (literal)
0x20-0x3f: literal value 0x00-0x1f (literal)
Y actualmente estoy testeando la instrucción:
JSR a - pushes the address of the next instruction to the stack, then sets PC to a
Para probarlo, se me ha ocurrido introducir en la RAM las diferentes variaciones para testear que TODO se calcula como corresponde.
He testeado con:
JSR A (y también con los registros B,C,X,Y,Z,I y J)
JSR [A] (y también con los registros B,C,X,Y,Z,I y J)
JSR [(PC+1)+A] (y también con los registros B,C,X,Y,Z,I y J)
etc etc etc
¿Existe alguna forma de comprobar QUE todo funciona correctamente o no me queda más remedio que hacer test de la instruccion con TODAS las posibilidades de registros, etc...?
Gracias anticipadas
La pregunta: ¿Cómo testear correctamente las instrucciones?
Cuento con estos operandos:
0x00-0x07: register (A, B, C, X, Y, Z, I or J, in that order)
0x08-0x0f: [register]
0x10-0x17: [next word + register]
0x18: POP / [SP++]
0x19: PEEK / [SP]
0x1a: PUSH / [--SP]
0x1b: SP
0x1c: PC
0x1d: O
0x1e: [next word]
0x1f: next word (literal)
0x20-0x3f: literal value 0x00-0x1f (literal)
Y actualmente estoy testeando la instrucción:
JSR a - pushes the address of the next instruction to the stack, then sets PC to a
Para probarlo, se me ha ocurrido introducir en la RAM las diferentes variaciones para testear que TODO se calcula como corresponde.
He testeado con:
JSR A (y también con los registros B,C,X,Y,Z,I y J)
JSR [A] (y también con los registros B,C,X,Y,Z,I y J)
JSR [(PC+1)+A] (y también con los registros B,C,X,Y,Z,I y J)
etc etc etc
¿Existe alguna forma de comprobar QUE todo funciona correctamente o no me queda más remedio que hacer test de la instruccion con TODAS las posibilidades de registros, etc...?

http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.
Re: Aprendiendo a programar un Emulador (DCPU-16)
Respuesta NPI
Emulador de CPU completo y "de verdad" solo he hecho uno, el del 6809. El que hice del CHIP8 era (es) tan simple, que con hacer el emulador, y meter una ROM de juego cualquiera (la mas simple del PONG por ejemplo) me sirvió para depurar y acertar de pleno al 100%
Pero en el mas complejo 6809, la cosa fué muuuuuuy difícil, algo de varios meses. Hice el emulador de CPU, y cuando mas o menos sabía que lo tenía al 90%, me puse seguido a hacer el emulador del THOMSON M05, de ese modo, haciendo dos emuladores a la vez, iba depurando ambos. A base de tesón y paciencia.
El problema era cuando algo no funcionaba en el emulador del Thomson, que no sabía distinguir si era por él mismo, o por el de CPU. Pero eso es lo divertido, el ir "moco a moco" buscando fallos.
En otro caso, me hice un emulador de Z80 en Basic, partiendo de uno que estaba en "C++", y aquí fué mucho mas fácil, por que por la red encontré un código compilado de ASM Z80 a Binario, que testeaba el 99% de las intrucciones del Z80 (se lo curró un tio para su emulador), y me serví de él para ir depurando el mio, y pude acabarlo en poco mas de un mes.
Así que, o buscas una ROM de un juego o aplicación que use esa CPU y la tratas de emular a la par que haces el emul de la CPU, o vas a "dedillo", como dices tú, una a una......

Emulador de CPU completo y "de verdad" solo he hecho uno, el del 6809. El que hice del CHIP8 era (es) tan simple, que con hacer el emulador, y meter una ROM de juego cualquiera (la mas simple del PONG por ejemplo) me sirvió para depurar y acertar de pleno al 100%
Pero en el mas complejo 6809, la cosa fué muuuuuuy difícil, algo de varios meses. Hice el emulador de CPU, y cuando mas o menos sabía que lo tenía al 90%, me puse seguido a hacer el emulador del THOMSON M05, de ese modo, haciendo dos emuladores a la vez, iba depurando ambos. A base de tesón y paciencia.

El problema era cuando algo no funcionaba en el emulador del Thomson, que no sabía distinguir si era por él mismo, o por el de CPU. Pero eso es lo divertido, el ir "moco a moco" buscando fallos.
En otro caso, me hice un emulador de Z80 en Basic, partiendo de uno que estaba en "C++", y aquí fué mucho mas fácil, por que por la red encontré un código compilado de ASM Z80 a Binario, que testeaba el 99% de las intrucciones del Z80 (se lo curró un tio para su emulador), y me serví de él para ir depurando el mio, y pude acabarlo en poco mas de un mes.
Así que, o buscas una ROM de un juego o aplicación que use esa CPU y la tratas de emular a la par que haces el emul de la CPU, o vas a "dedillo", como dices tú, una a una......
- Lenko
- Atari 1040 STf
- Mensajes: 832
- Registrado: 29 Mar 2005, 11:39
- Gracias dadas: 614 veces
- Gracias recibidas: 135 veces
Re: Aprendiendo a programar un Emulador (DCPU-16)
Hark0, al final ¿en qué estás programando el emulador?
-
- MSX Turbo R
- Mensajes: 303
- Registrado: 25 Oct 2004, 20:11
- Sistema Favorito: MSX
- primer_sistema: MSX
- Gracias recibidas: 12 veces
- Contactar:
Re: Aprendiendo a programar un Emulador (DCPU-16)
En su día me animé a programar un emulador y elegí, por su sencillez, la recreativa del SPACE INVADERS. Es muy sencilla: procesador i8080, que viene a ser un Z80 con menos instrucciones, 8 KB de ROM, RAM con espacio para varibles y VRAM, acceso a controles y sonido vía puertos (IN/OUT). Hice una primera versión en Turbo Pascal y después me animé a programarlo directamente en ensamblador, y el resultado fue un emulador completo en 1.976 bytes
Se llamaba SPIN, por SPace INvaders. De hecho, debería funcionar al 100% de velocidad en un 80286 y requiere VGA.
Después me animé a hacer un emulador de NES, pero mi implementación de la CPU, 6502, no era demasiado estable - nunca he programado este sistema - así que funcionaban muy pocas ROMs. Y esa es toda mi historia como desarrollador de emuladores... Bueno, en realidad no: antes había programado un emulador de la CPU y un debugger del NEC PDP-11, pero no cuenta como tal.
Mi recomendación para alguien que quiera empezar es que busque información, elija un sistema facilito y se ponga manos a la obra. Lo que hace falta es mucha paciencia, tiempo y dedicación, pero es perfectamente factible. Ahora que lo pienso, tengo algo por ahí empezado en HTML5 + JavaScript, que no es mala opción para emular sistemas sencillos...

Después me animé a hacer un emulador de NES, pero mi implementación de la CPU, 6502, no era demasiado estable - nunca he programado este sistema - así que funcionaban muy pocas ROMs. Y esa es toda mi historia como desarrollador de emuladores... Bueno, en realidad no: antes había programado un emulador de la CPU y un debugger del NEC PDP-11, pero no cuenta como tal.
Mi recomendación para alguien que quiera empezar es que busque información, elija un sistema facilito y se ponga manos a la obra. Lo que hace falta es mucha paciencia, tiempo y dedicación, pero es perfectamente factible. Ahora que lo pienso, tengo algo por ahí empezado en HTML5 + JavaScript, que no es mala opción para emular sistemas sencillos...
----------------------
RetroClasificados - compra, vende o cambia tu material retro totalmente gratis
RetroClasificados - compra, vende o cambia tu material retro totalmente gratis
- Hark0
- Amiga 1200
- Mensajes: 1695
- Registrado: 11 Jul 2012, 23:44
- Sistema Favorito: Spectrum 16Kb/48Kb
- primer_sistema: Spectrum 16Kb/48Kb
- consola_favorita: (Otro)
- Primera consola: (Otro)
- Ubicación: Cornellà de Llobregat - Barcelona
- Contactar:
Re: Aprendiendo a programar un Emulador (DCPU-16)
jepalza escribió:Respuesta NPI![]()
Emulador de CPU completo y "de verdad" solo he hecho uno, el del 6809. El que hice del CHIP8 era (es) tan simple, que con hacer el emulador, y meter una ROM de juego cualquiera (la mas simple del PONG por ejemplo) me sirvió para depurar y acertar de pleno al 100%
Pero en el mas complejo 6809, la cosa fué muuuuuuy difícil, algo de varios meses. Hice el emulador de CPU, y cuando mas o menos sabía que lo tenía al 90%, me puse seguido a hacer el emulador del THOMSON M05, de ese modo, haciendo dos emuladores a la vez, iba depurando ambos. A base de tesón y paciencia.![]()
El problema era cuando algo no funcionaba en el emulador del Thomson, que no sabía distinguir si era por él mismo, o por el de CPU. Pero eso es lo divertido, el ir "moco a moco" buscando fallos.
En otro caso, me hice un emulador de Z80 en Basic, partiendo de uno que estaba en "C++", y aquí fué mucho mas fácil, por que por la red encontré un código compilado de ASM Z80 a Binario, que testeaba el 99% de las intrucciones del Z80 (se lo curró un tio para su emulador), y me serví de él para ir depurando el mio, y pude acabarlo en poco mas de un mes.
Así que, o buscas una ROM de un juego o aplicación que use esa CPU y la tratas de emular a la par que haces el emul de la CPU, o vas a "dedillo", como dices tú, una a una......
Bien, lo que he hecho ha sido buscar un emulador "reconocido" (que se sabe que funciona OK) y estoy comparando mis valores con los que da el emulador... tengo también algunas "roms" para probar, pero como todavía no tengo todas las instrucciones implementas... pues eso...
Veo que me tocará ir probando poco a poco ;D
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.
- Hark0
- Amiga 1200
- Mensajes: 1695
- Registrado: 11 Jul 2012, 23:44
- Sistema Favorito: Spectrum 16Kb/48Kb
- primer_sistema: Spectrum 16Kb/48Kb
- consola_favorita: (Otro)
- Primera consola: (Otro)
- Ubicación: Cornellà de Llobregat - Barcelona
- Contactar:
Re: Aprendiendo a programar un Emulador (DCPU-16)
Lenko escribió:Hark0, al final ¿en qué estás programando el emulador?
GLBasic, es multiplataforma y nada caro... hay demo para el que lo quiera probar...
www.glbasic.com (espero este enlace no se considere spam)

http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.
- Hark0
- Amiga 1200
- Mensajes: 1695
- Registrado: 11 Jul 2012, 23:44
- Sistema Favorito: Spectrum 16Kb/48Kb
- primer_sistema: Spectrum 16Kb/48Kb
- consola_favorita: (Otro)
- Primera consola: (Otro)
- Ubicación: Cornellà de Llobregat - Barcelona
- Contactar:
Re: Aprendiendo a programar un Emulador (DCPU-16)
robsy escribió:En su día me animé a programar un emulador y elegí, por su sencillez, la recreativa del SPACE INVADERS. Es muy sencilla: procesador i8080, que viene a ser un Z80 con menos instrucciones, 8 KB de ROM, RAM con espacio para varibles y VRAM, acceso a controles y sonido vía puertos (IN/OUT). Hice una primera versión en Turbo Pascal y después me animé a programarlo directamente en ensamblador, y el resultado fue un emulador completo en 1.976 bytesSe llamaba SPIN, por SPace INvaders. De hecho, debería funcionar al 100% de velocidad en un 80286 y requiere VGA.
Después me animé a hacer un emulador de NES, pero mi implementación de la CPU, 6502, no era demasiado estable - nunca he programado este sistema - así que funcionaban muy pocas ROMs. Y esa es toda mi historia como desarrollador de emuladores... Bueno, en realidad no: antes había programado un emulador de la CPU y un debugger del NEC PDP-11, pero no cuenta como tal.
Mi recomendación para alguien que quiera empezar es que busque información, elija un sistema facilito y se ponga manos a la obra. Lo que hace falta es mucha paciencia, tiempo y dedicación, pero es perfectamente factible. Ahora que lo pienso, tengo algo por ahí empezado en HTML5 + JavaScript, que no es mala opción para emular sistemas sencillos...
Gracias por la info... y ami que me suena ese "SPIN"

Me he basado en las especificaciones de la DCPU-16 porque tiene MUY poco de todo (a saber 11 registros, 17 opcodes y poco más)... aparentemente "facil" de implementar...
Pero claro, al ser mi primer intento en estas lindes pueeeesss.... voy un poco perdido


http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.
- Hark0
- Amiga 1200
- Mensajes: 1695
- Registrado: 11 Jul 2012, 23:44
- Sistema Favorito: Spectrum 16Kb/48Kb
- primer_sistema: Spectrum 16Kb/48Kb
- consola_favorita: (Otro)
- Primera consola: (Otro)
- Ubicación: Cornellà de Llobregat - Barcelona
- Contactar:
Re: Aprendiendo a programar un Emulador (DCPU-16)
Bueno... sobre este asunto... de momento,
GAME OVER
Como explico en mi blog, me había marcado un límite de unos 15 días para afrontar este "proyecto"... desgraciadamente han pasado los días y no he podido terminar a tiempo el emulador, así que de momento abandono su desarrollo. (He de ponerme a terminar mi juego... que llevo no se ni cuanto ya escribiéndolo).
He encontrado algunos problemas en las especificaciones de la CPU que quería emular... para empezar hay 3 versiones diferentes de las especificaciones de las instrucciones, siendo incompatibles unas con otras, en lugar de ser suplementarias (o mejoradas de una versión a otra). El poco tiempo de que dispongo también ha sido otro agravante... tras una jornada de trabajo/família, ponerse cada noche un mínimo de 2 horas agota a cualquiera... qué os cuento...
De todas formas, me siento MUY satisfecho con los resultados obtenidos, ya que aún sin llegar a finalizar completamente el emulador, he entendido (creo) el funcionamiento BASICO de una CPU, los ciclos, las interrupciones,etc... muchas de las cosas que he programado han funcionado como se esperaba, y el control de flujo del mainloop así como la intepretación de Instrucciones y operandos ha sido también positivo en su funcionamiento.
No hace falta comentar que las aportaciones del personal del foro han sido inestimables, así que aprovecho una vez más para agradecer públicamente vuestra ayuda. Una vez más, GRACIAS!
Espero tener tiempo en un futuro para seguir desarrollando este tipo de programas, me ha apasionado el asunto...
Saludos!!!
PD: Si alguien está interesado en la publicación del código fuente que lo comente y lo subo aquí. (Recordar que está escrito con GLBasic).
GAME OVER
Como explico en mi blog, me había marcado un límite de unos 15 días para afrontar este "proyecto"... desgraciadamente han pasado los días y no he podido terminar a tiempo el emulador, así que de momento abandono su desarrollo. (He de ponerme a terminar mi juego... que llevo no se ni cuanto ya escribiéndolo).
He encontrado algunos problemas en las especificaciones de la CPU que quería emular... para empezar hay 3 versiones diferentes de las especificaciones de las instrucciones, siendo incompatibles unas con otras, en lugar de ser suplementarias (o mejoradas de una versión a otra). El poco tiempo de que dispongo también ha sido otro agravante... tras una jornada de trabajo/família, ponerse cada noche un mínimo de 2 horas agota a cualquiera... qué os cuento...
De todas formas, me siento MUY satisfecho con los resultados obtenidos, ya que aún sin llegar a finalizar completamente el emulador, he entendido (creo) el funcionamiento BASICO de una CPU, los ciclos, las interrupciones,etc... muchas de las cosas que he programado han funcionado como se esperaba, y el control de flujo del mainloop así como la intepretación de Instrucciones y operandos ha sido también positivo en su funcionamiento.
No hace falta comentar que las aportaciones del personal del foro han sido inestimables, así que aprovecho una vez más para agradecer públicamente vuestra ayuda. Una vez más, GRACIAS!
Espero tener tiempo en un futuro para seguir desarrollando este tipo de programas, me ha apasionado el asunto...
Saludos!!!

PD: Si alguien está interesado en la publicación del código fuente que lo comente y lo subo aquí. (Recordar que está escrito con GLBasic).
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados