Aprendiendo a programar un Emulador (DCPU-16)

Foro dedicado a la programación en todo tipo de sistemas clásicos.
Avatar de Usuario
Hark0
Amiga 1200
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:

Aprendiendo a programar un Emulador (DCPU-16)

Mensajepor Hark0 » 02 Oct 2012, 08:13

Buenas!

Visto el interés creciente (por lo que veo y por lo menos por mi parte) en el foro sobre COMO se programa un emulador de ordenador/consola/cosa con botones, abro este hilo apelando a aquellos que sabeis programar este tipo de aplicaciones a ver si me/nos echais una mano al resto de los mortales... ;)

Voy al tajo!

Como sabreis (o no), el señor Notch, sí el famoso del Minecraft, se ha embarcado en un nuevo proyecto desde hace relativamente poco... en su nuevo proyecto, ha incluído un ordenador de diseño propio, con el que se supone vamos a poder programar los eventos del juego, etc...

El ordenador que se ha inventado es, a mi entender, bastante parecido con las máquinas "viejunas" que amamos por aqui, con unas características bastante limitadas, pero no por ello menos intersantes...

La "cosa" en cuestión, se llama DCPU-16, y se puede acceder en este enlace a toda la información relativa a sus especificaciones, etc...

http://0x10cwiki.com/wiki/DCPU-16

Este verano me estuve paseando por el sitio en cuestión, e "intentando" programar un emulador de DCPU... Hice algunos avances tales como implementar la RAM, un sistema de video algo tosco, y alguna cosita más... pero me pierdo un poco en la parte de interpretar los opcodes, el "lio" del indian sign, etc...

Para los gurús de codear emuladores: ¿Os parece bien que entre todos comentemos COMO programar un emulador de esta maquina virtual, examianando la CPU, cómo se define todo, el porqué de usar X opcodes, etc...

Creo que al ser una máquina "aparentemente" sencilla puede ser relativamente "fácil" programarlo... personalmente, he descargado las fuentes en C, javascript y he estado mirando todas las "tripas" de varios emuladores de DCPU, y creo entender COMO se implementa todo... pero tengo una batería de preguntas que nose a quién dirigir... cosas como... ¿como se comunica la CPU con la parte Video? o ¿en que sitio del main loop capturo el teclado? etc etc etc...

Echadle por favor un ojo al enlace del wiki que he posteado y me decís... OJO, no desestimar el "aparentemente" poco potencial de este ordenador... basta con pasarse en el wiki por la sección "games for DCPU-16" para comprobar el interés que ha suscitado el "invento" de Nocth...


¿ Qué opináis?



PD (Perdón por el ladrillo).
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.

jepalza

Re: Aprendiendo a programar un Emulador (DCPU-16)

Mensajepor jepalza » 02 Oct 2012, 08:57

Hark0 escribió: pero tengo una batería de preguntas que nose a quién dirigir... cosas como... ¿como se comunica la CPU con la parte Video? o ¿en que sitio del main loop capturo el teclado?


No hay secreto alguno: IRQ. TODAS las CPU del mundo llevan una u otra forma de IRQ, que permite a la CPU interrumpir su proceso en un punto, y dar paso al código que se está ejecutando. La IRQ puedes saltar tras un tiempo predefinido (milisegundos generalmente), o fijo, o por una acción HARD (por ejemplo, al pulsar una tecla, se activa una IRQ que detiene la CPU).

Una vez la CPU ejecuta una IRQ, pasa el "testigo" de la ejecución a otro elementos, bien sea un trozo de programa, bien sea un hardware aparte o un chip gráfico/sonoro/entradas-salidas (teclado/cinta), etc.

Por lo que tú no debes inventar nada. Al hacer el emulador de la CPU, una de las instrucciones, la que sea, hace la función de IRQ (soft o hard, enmascarable o no), y en la rutina que la emula, contemplas el código que hace que se detenga la CPU y salta a otra rutina. Una vez en esa rutina, estudias qué debe hacer la IRQ, si saltar al vídeo, al sonido, al teclado, cinta, etc. A dónde debe saltar, lo determina la CPU, y es parte del hard a emular. Unas CPU indican en un byte aparte, la llamada a realizar, otras lo hacen con la propia instrucción IRQ (unas son de una cosa, otras de otra).

Avatar de Usuario
Hark0
Amiga 1200
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)

Mensajepor Hark0 » 02 Oct 2012, 09:08

jepalza escribió:
Hark0 escribió: pero tengo una batería de preguntas que nose a quién dirigir... cosas como... ¿como se comunica la CPU con la parte Video? o ¿en que sitio del main loop capturo el teclado?


No hay secreto alguno: IRQ. TODAS las CPU del mundo llevan una u otra forma de IRQ, que permite a la CPU interrumpir su proceso en un punto, y dar paso al código que se está ejecutando. La IRQ puedes saltar tras un tiempo predefinido (milisegundos generalmente), o fijo, o por una acción HARD (por ejemplo, al pulsar una tecla, se activa una IRQ que detiene la CPU).

Una vez la CPU ejecuta una IRQ, pasa el "testigo" de la ejecución a otro elementos, bien sea un trozo de programa, bien sea un hardware aparte o un chip gráfico/sonoro/entradas-salidas (teclado/cinta), etc.

Por lo que tú no debes inventar nada. Al hacer el emulador de la CPU, una de las instrucciones, la que sea, hace la función de IRQ (soft o hard, enmascarable o no), y en la rutina que la emula, contemplas el código que hace que se detenga la CPU y salta a otra rutina. Una vez en esa rutina, estudias qué debe hacer la IRQ, si saltar al vídeo, al sonido, al teclado, cinta, etc. A dónde debe saltar, lo determina la CPU, y es parte del hard a emular. Unas CPU indican en un byte aparte, la llamada a realizar, otras lo hacen con la propia instrucción IRQ (unas son de una cosa, otras de otra).



Gracias por responder tan rápido... y por la info claro... ;)

Pero propondría ir construyendo paso a paso el emulador, y en pseudocódigo, así todos lo entenderíamos y podríamos escribirlo en el lenguaje que mejor dominemos cada uno...

Podríamos empezar por COMO se declara todo (hard, variables minimas, timer, etc)... luego el mainloop... interpretar los opcodes... cuando ejecutarlos... posteriormente lo que comentas de interrupciones, etc etc etc


¿estoy pidiendo mucho? ¿me mandareis a freir espárragos? :P
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.

jepalza

Re: Aprendiendo a programar un Emulador (DCPU-16)

Mensajepor jepalza » 02 Oct 2012, 09:49

Pides mucho. si se tiene YA la emulación de la CPU y Hard (por ejemplo, imagina un Spectrum, del que YA tenemos Z80 emulada, ULA emulada, y pantalla mas que resabida) hacer el emulador es una semana, solo es juntar todo y hacer llamadas.
Pero en este caso, según entiendo, no tenemos NADA, y eso implica hacer varios emuladores: el que emula el teclado, el del vídeo, el sonido y lo peor, la CPU.

Solo la CPU nos podemos tirar un par de meses, y si encima, lo hacen varios, acabariamos como el rosario de la Aurora.
Yo, para hacer el emulador del 6809, partiendo de cero (no había NADA escrito sobre él en Basic), me tiré unos dos meses yo solito, escribiendo código y depurando.
Luego, hice emuladores para las entradas/salidas (PIA) y vídeo, y estuve otro mes de código. Con esos emuladores en la mano, emular el Thomson Mo5 fué cosa de coser y cantar, y en una semana estaba andando.

Por eso, emular la CPU entre varios, va a ser un cristo de organización. Desconozco esa CPU, pero imagina que lleva 300 instrucciones. Son 300 rutinas a escribir, algunas serían repetitivas, cambiando cuatro datos (por ejemplo ROL y ROR son idénticas, pero una suma y otra resta). Hace falta tiempo. Yo creo que todos trabajamos, y restarle al poco tiempo libre de la vida cotidiana unas horas diarias, en mi caso, es un dolor.

De todos modos, hablo por hablar, solo te digo, que un emulador lleva meses, no es cosa de una semana, y como desconzco el hard, hablo a ciegas. Lo puedo mirar con mas detenimiento esta tarde, en casa, que en el curro no me puedo concentrar.

No todos los emuladores se tardan meses. El emulador de CHIP8 que hice en Basic, solo tardé una semana, por que no lleva hard, y las instrucciones, solo eran 20 o 30.

Avatar de Usuario
Hark0
Amiga 1200
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)

Mensajepor Hark0 » 02 Oct 2012, 10:00

jepalza escribió:Pides mucho. si se tiene YA la emulación de la CPU y Hard (por ejemplo, imagina un Spectrum, del que YA tenemos Z80 emulada, ULA emulada, y pantalla mas que resabida) hacer el emulador es una semana, solo es juntar todo y hacer llamadas.
Pero en este caso, según entiendo, no tenemos NADA, y eso implica hacer varios emuladores: el que emula el teclado, el del vídeo, el sonido y lo peor, la CPU.

Solo la CPU nos podemos tirar un par de meses, y si encima, lo hacen varios, acabariamos como el rosario de la Aurora.
Yo, para hacer el emulador del 6809, partiendo de cero (no había NADA escrito sobre él en Basic), me tiré unos dos meses yo solito, escribiendo código y depurando.
Luego, hice emuladores para las entradas/salidas (PIA) y vídeo, y estuve otro mes de código. Con esos emuladores en la mano, emular el Thomson Mo5 fué cosa de coser y cantar, y en una semana estaba andando.

Por eso, emular la CPU entre varios, va a ser un cristo de organización. Desconozco esa CPU, pero imagina que lleva 300 instrucciones. Son 300 rutinas a escribir, algunas serían repetitivas, cambiando cuatro datos (por ejemplo ROL y ROR son idénticas, pero una suma y otra resta). Hace falta tiempo. Yo creo que todos trabajamos, y restarle al poco tiempo libre de la vida cotidiana unas horas diarias, en mi caso, es un dolor.

De todos modos, hablo por hablar, solo te digo, que un emulador lleva meses, no es cosa de una semana, y como desconzco el hard, hablo a ciegas. Lo puedo mirar con mas detenimiento esta tarde, en casa, que en el curro no me puedo concentrar.

No todos los emuladores se tardan meses. El emulador de CHIP8 que hice en Basic, solo tardé una semana, por que no lleva hard, y las instrucciones, solo eran 20 o 30.



Te entiendo perfectamente... aunque no imposible... ;) por eso proponía el hardware DCPU-16... porque la CPU tiene "sólo" 36 instrucciones... (http://0x10cwiki.com/wiki/Instruction_set)

Me gustaría empezar siguiendo la guía How To Write a Computer Emulator (Marat Fayzullin) - http://fms.komkon.org/EMUL8/HOWTO.html

para "montar" la máquina DCPU-16... insisto en esta máquina porque no tiene "el cacao" de un Z80...

Además me gustaría escribirlo en Basic, pero de lo más "sencillo"/aclaratorio/no enrevesado/sin usar funciones específicas que sea posible... ya sabes, sin utilizar "trucos".


Entonces.... ¿quizás sería mejor que pregunte cuando me "atranque" en algún paso?
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.

jepalza

Re: Aprendiendo a programar un Emulador (DCPU-16)

Mensajepor jepalza » 02 Oct 2012, 11:12

Hark0 escribió:Entonces.... ¿quizás sería mejor que pregunte cuando me "atranque" en algún paso?


"cuasi" mejor que sí. ya te he dicho, que desconocía la CPU y su nº de ins, pero si solo son 36, se hace en una semana, y no hace falta que se meta una docena de personas en ello. En un caso así, mejor hacerlo uno mismo y su mecanismo.

Avatar de Usuario
Hark0
Amiga 1200
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)

Mensajepor Hark0 » 02 Oct 2012, 11:31

Muchas gracias por los consejos... empezaré poquito a poco... y si tropiezo con algo o necesito consejo gurú, lo posteo aqui...

:D
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 8 veces

Re: Aprendiendo a programar un Emulador (DCPU-16)

Mensajepor antoniovillena » 02 Oct 2012, 11:50

Pues yo te recomiendo que empieces por un ZX Spectrum 48K, sin sonido ni memoria contenida, es de lo más sencillo que hay y te dará más satisfacción implementar una máquina real que una ficticia. El Z80 no es tan difícil de emular y para que funcione la ROM y el Basic no es necesario emular todas las instrucciones del Z80, ni flags indocumentados ni cosas raras.

Más vale emular máquina compleja conocida, que simple por conocer.

Avatar de Usuario
Hark0
Amiga 1200
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)

Mensajepor Hark0 » 02 Oct 2012, 11:59

antoniovillena escribió:Pues yo te recomiendo que empieces por un ZX Spectrum 48K, sin sonido ni memoria contenida, es de lo más sencillo que hay y te dará más satisfacción implementar una máquina real que una ficticia. El Z80 no es tan difícil de emular y para que funcione la ROM y el Basic no es necesario emular todas las instrucciones del Z80, ni flags indocumentados ni cosas raras.

Más vale emular máquina compleja conocida, que simple por conocer.


Tienes razón, pero...

El tema está en ENTENDER el COMO y PORQUE... de CADA PASO a la hora de programar/implementar X hardware... luego viene la parte del procesador... tengo no pocos libros con la documentación del ZX (descargué en su momento TODOS los libros de WOS, ya sabes, las rutinas rom, el desensamble de la misma etc y tengo alguno físico comprado en los 80's)

He pensado que debido a la "sencillez" del DCPU-16, pues era ideal para "iniciarse"... por supuesto que me encantaría parirme un ZX, faltaría más... es la máquina de mis inicios ;)

Necesito ANTES entender COMO funciona todo.... :D
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.

jepalza

Re: Aprendiendo a programar un Emulador (DCPU-16)

Mensajepor jepalza » 02 Oct 2012, 12:01

Mira, me aburria delente del PC en el curro, y me te he hecho este pequeño tuto muy general:

Suponte una CPu con solo tres instrucciones, una de ellas IRQ, y solo dos registros de direccion y dos de datos.
La cosa sería algo así:

-definir variables
PC contador de direcciones
HL registro de direccion
BC registro de direccion
AF registro de estados
A registro de datos
B registro de datos
IRQ estado de interrupciones


-tratameinto general (lectura de datos desde ROM)
inicio
leer en A el dato (byte) de direccion actual PC A=(PC)
incrementar PC (uno o dos bytes, segun INS leida) PC=PC+1
si A=1 saltar INS1
si A=2 saltar INS2
si A=3 saltar INS3
(rutina que estudia si se genera una IRQ)
aqui tenemos varias opciones, segun como se maneje la IRQ
- si se ejecuta cada "x" ins seria --> "si numeroins>100 saltar a irq" sino numeroins+=1
- si se ejecuta por yiempo fijo o programable --> "si tiempoirq>100 saltar a irq"
(aqui, tiempoirq seria un reloj real, el del PC por ejemplo)
- si la ejecuta una accion externa, por ejemplo, al pulsar una tecla --> "si tecla=1 saltar a irq"
etc. hay muchas variantes
(fin de rutina de estudio de IRQ)
bucle con inicio

-rutina INS1
leemos el dato siguiente (o los datos, segun INS) al de la INS que nos a traido
como el PC ya esta incrementado de antes, solo lo leemos sin mas --> A=(PC)
realizamos la accion correspondiente
por ejemplo, sumar al A el contenido del B y devolverlo en A
A=A+B
retorno a inicio

-rutina INS2
idem a INS1
pero imaginemos que es para guardar el registro A en la direccion "x"
leemos los dos bytes que forman la direccion "x"
HL=(PC)+256*(PC+1)
dejamos PC en su sitio --> PC=PC+1
ya que solo viene sumado en +1 de arriba.
ahora --> (HL)=A
retorno a inicio

-rutina INS3
etc, etc
retorno a inicio


-rutina de tratamiento de IRQ
ponemos a cero los contadores de IRQ o la desactivamos para que no vuelva a saltar mientras estamos dentro
AF=0
IRQ=0
numeroins=0
... etc
ahora, tratamientos hard o soft
leer teclado
actualizar pantalla
etc.
fin?....


Volver a “Programación”

¿Quién está conectado?

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