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:

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

Mensajepor Hark0 » 03 Oct 2012, 12:59

mentalthink escribió:Que interesante los emus que has puesto en Basic Jepalza... Intentaré hacer una conversión a GLbasic...

Por lo que veo Hark0 ya ha empezado a hacer un Emulador, no sé si basado en alguno de los de Basic de más arriba... pero por lo poco que he leído en general, y el código de Jepalza, no parece demasiado complejo de entender... Lo poco que he visto y me ha parecido realmente chulo, es el tema de las direcciones de memoria, con un Array, ni me imaginaba que se haría de esa forma...

Pues gracias a esté hilo me parece que van a salir algunas cosillas...

De nuevo gracias por estos hilos como ya se ha comentado, pero por uno más no "pasa ná" la mar de interesantes...

Saludos!!!


Ahi tienes mi listado GLB... sin problemas te paso el RAR con la typo etc... son 555 Kb... si quieres... mandame un PM

La idea es HACERLO LO MAS CLARO POSIBLE.... para complicar el código, siempre estamos a tiempo.

Esto, MAS el hilo Proyecto ZDP-80 - Nuestro microordenador desde cero [#01] (viewtopic.php?f=29&t=681)... debería servirnos para entender el funcionamiento/desarrollo de una CPU.

Dos dias que llevo flipando con los conocimientos del personal de este foro. BRAVO!!!!! =D>
Última edición por Hark0 el 03 Oct 2012, 13:59, editado 2 veces en total.
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.

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 » 03 Oct 2012, 13:08

jepalza escribió:¡Exactly!
Por ahí van los tiros.
Dos comentarios, por ahora: el contador de la IRQ, una vez agotado, deberías ponerlo a "100", no a "100+contador", por que puede ocurrir que nunca sea 100 exactos, sino 99, o 97, y aunque es una minucia como la copa de un pino, en una emulación real, pierdes unos ciclos muy valiosos, y haces un funcionamiento aleatorio, una veces salta en 100, otras en 97, etc. En la vida real, no se va a notar, pero sí en un equipo real.


Capicci!!! ;)

Y luego, te faltaría una pila de datos (según avances la emulación), para guardar allí las direcciones de saltos y demas, de modo que el PC no siempre sería "PC=PC+1", sino que dependería de si una rutina le obliga a saltar a la 100, y luego, al retornar, vuelve a ser 1 por ejemplo.


Ok! Poco a poco... :P

Y lo de la IRQ, el contador, que lo has pillado, debes mirar el hardware, como lo interpreta, si es por ciclos consumidos, o por instrucciones consumidas. Si es por intrucciones, lo tienes bien, si es por ciclos, debes mirar y meter en las variables de instrucciones, el apartado de ciclos a usar, y emplearlos para descontar al contador, en lugar de descontar nº de ins leídas.


Para el tema de las IRQ... declaro como he hecho un contador, que salta cada X y FUERZA ejecutar la IRQ.

pero ¿como sabemos que IRQ usar?

Si es "provocada" por el teclado, entiendo que fácilmente podemos añadir un Registro_tipo_IRQ y en el SELECT CASE de turno, ejecutamos la IRQ que corresponda.

Si es por software, también se debería poder "meter" en algún registro...

¿correcto?

Se me olvida: sigues con la idea, de que las IRQ deben ir nombradas, 0 para pantalla, 1 para teclado, pero no es así. Si lo quieres ver así, no pasa nada, funciona igualmente, pero debes entender que la IRQ es única. Simplemente, se ha generado, bien por agotamiento del tiempo establecido en la CPU, bien por que un dispositivo la ha llamado. Simplemente, se ha activado la IRQ, y nada mas. Una vez activada y en la rutina, tu no sabes si ha sido el teclado o la pantalla, solo sabes que has llegado por uno de los motivos citados antes. Lo que ocurre, es que en esta rutina, estudias cada caso. Por ejemplo, la pantalla es casi obligatorio refrescarla, asi que vas a ello sin preguntar, como mucho, miras que el refresco de la pantalla (el sincronismo vertical), este fuera del marco visible, para evitar parpadeos y evitar dibujar en medio del rayo (así es en el hardware real, en la emulación no pasa eso, pero es una emulación, osea, que debe ser fiel a la realidad). El teclado, idem, ya que estas en la rutina de la IRQ, lo miras por si hay tecla pulsada.


Aja... Entonces... en el main loop, al decrementar el contador de IRQ... habra IRQ's que saltaran cada X ciclos, y otros cada X otros ciclos... ¿si?

El caso de una IRQ activada externamente, como puede ser un teclado, es diferente, y en ese caso, no te queda mas remedio que meterte con la multitarea, o sea, con una rutina aparte que se llama continuamente al márgen de como vaya la CPU y dónde se encuentre. Si una vez en la multitarea del teclado, se pulsa una tecla, entonces se genera una IRQ (NMI) y la CPU, al seguir su curso, ve que alguien ha puesto la NMI a "1", y para lo que esté haciendo, pone la IRQ igualmente a "1" y salta a la rutina. Como ya tienes NMI y IRQ a "1" ambos, sabes que alguien externo, en este caso el teclado, ha pedido saltar ahí.
Pero este caso es mas raro que se emplee en micros viejos, por que detienes a la CPU en un punto que no se esperaba, y se pueden producir parpadeos de la pantalla, por poner un ejem,plo.


Ok, cuando "salta" la IRQ, "trapeamos" quien la envia, si teclado, video, cinta, lo que sea...


Creo que si me aclaras esto, ya puedo avanzas BASTANTE más... y currarme la implementacion de mas instrucciones...

Gracias como siempre por anticipado.
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 » 03 Oct 2012, 13:31

Las IRQ depende del hard. Por ejemplo, en el Thomson Mo5, el teclado no lleva interrupción alguna. Simplemente, se lee cuando se entra en IRQ. Al entrar en IRQ por que la CPU lo pide (siguiendo su ciclo normal de contadores), se mira si se ha pulsado una tecla y se actualiza la pantalla. Si se ha pulsado una tecla, se guarda su estado (la tecla pulsada) para cuando el programa contenido en la EPROM, pida una tecla, que ya la tenga en espera en el buffer (en la zona de RAM que esté reservada a buffer).
Pero en el caso del Thomson, hay una tecla, que es la tecla STOP que SI va a una IRQ real, física, a la NMI del 6809. Al pulsar esa tecla, la CPU la atiende de la misma, para lo cual tuve que meter una rutina que continuamente testea si se ha pulsado esa tecla.

Si se ha pulsado, activo IRQ y queda la NMI tambien activa, y eso, es indicativo de IRQ alta prioridad.

Pero eso es en el caso del Thomson Mo5, en tu ordenador no tiene por qué ser así.

Puede simplemente, que el teclado se lea cada "x" ciclos de CPU, o en cada retrazo vertical de la pantalla, o cad "x" instrucciones, etc.
Así que, debes mirar el hard, para actuar en consecuencia.
Lo mas habitual, es que se mire teclado y se actualice pantalla "todo-en-uno", o sea, al entrar en la rutina de IRQ en su ciclo natural.

Vamos, que no tienes que hacer nada, de nada. Tu sigues descontando ciclos, al llegar a "0" entras en IRQ, y según estas dentro, lees el teclado, actualizas la pantalla, o lo que sea. El teclado, lo almacenas (para lo que necesitarás otra matriz).
Cuando la CPU siga su curso normal, al volver de IRQ, y llegue a la zona que pide teclas, ya las tienes en la matriz.
Eso es otra emulación aparte. En esa emulación, le entregas a la CPU la tecla, la borras del buffer, y corres las demas, como si fuera una pila FIFO.

Así que no te comas la cabeza pensando que si la IRQ la ha generado el teclado o la pantalla, que no es así.
Eso es solo en hardware muy específicos. Lo normal, es leer y actualizar nada mas entrar en IRQ, sin mas.

repito: DEBES MIRAR EL HARD real, antes de hacer el emul. Necesitas conocer si el teclado va por IRQ o no, si la pantalla se refresca al entrar en IRQ o antes o despues, etc. y eso se hace estudiando los esquemas.

Para emular una CPU no te hace falta el Hard, pero para emular el teclado, la pantalla, o el ordenador en general SI te hace falta.

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 » 03 Oct 2012, 13:54

jepalza escribió:Las IRQ depende del hard. Por ejemplo, en el Thomson Mo5, el teclado no lleva interrupción alguna. Simplemente, se lee cuando se entra en IRQ. Al entrar en IRQ por que la CPU lo pide (siguiendo su ciclo normal de contadores), se mira si se ha pulsado una tecla y se actualiza la pantalla. Si se ha pulsado una tecla, se guarda su estado (la tecla pulsada) para cuando el programa contenido en la EPROM, pida una tecla, que ya la tenga en espera en el buffer (en la zona de RAM que esté reservada a buffer).
Pero en el caso del Thomson, hay una tecla, que es la tecla STOP que SI va a una IRQ real, física, a la NMI del 6809. Al pulsar esa tecla, la CPU la atiende de la misma, para lo cual tuve que meter una rutina que continuamente testea si se ha pulsado esa tecla.

Si se ha pulsado, activo IRQ y queda la NMI tambien activa, y eso, es indicativo de IRQ alta prioridad.

Pero eso es en el caso del Thomson Mo5, en tu ordenador no tiene por qué ser así.

Puede simplemente, que el teclado se lea cada "x" ciclos de CPU, o en cada retrazo vertical de la pantalla, o cad "x" instrucciones, etc.
Así que, debes mirar el hard, para actuar en consecuencia.
Lo mas habitual, es que se mire teclado y se actualice pantalla "todo-en-uno", o sea, al entrar en la rutina de IRQ en su ciclo natural.

Vamos, que no tienes que hacer nada, de nada. Tu sigues descontando ciclos, al llegar a "0" entras en IRQ, y según estas dentro, lees el teclado, actualizas la pantalla, o lo que sea. El teclado, lo almacenas (para lo que necesitarás otra matriz).
Cuando la CPU siga su curso normal, al volver de IRQ, y llegue a la zona que pide teclas, ya las tienes en la matriz.
Eso es otra emulación aparte. En esa emulación, le entregas a la CPU la tecla, la borras del buffer, y corres las demas, como si fuera una pila FIFO.


En tu caso del Thomson, entiendo que STOP que SI va a una IRQ real, física, a la NMI del 6809, es el equivalente al boton RESET del ZX+

En el caso de la DCPU-16, según lo que leí, almacena hasta los 12 caracteres ultimos entrados por teclado en la direccion 9000h. Así que como te comenté en otro post del hilo, entiendo que el IRQ de teclado atrapa los caracteres y los mete en un matriz que tendre que crear para el buffer de teclado...

Así que no te comas la cabeza pensando que si la IRQ la ha generado el teclado o la pantalla, que no es así.
Eso es solo en hardware muy específicos. Lo normal, es leer y actualizar nada mas entrar en IRQ, sin mas.

repito: DEBES MIRAR EL HARD real, antes de hacer el emul. Necesitas conocer si el teclado va por IRQ o no, si la pantalla se refresca al entrar en IRQ o antes o despues, etc. y eso se hace estudiando los esquemas.

Para emular una CPU no te hace falta el Hard, pero para emular el teclado, la pantalla, o el ordenador en general SI te hace falta.


Si si, entiendo... segun las especificaciones de hard de la DCPU-16, (el proposito del estudio de COMO emular la CPU), dice que el teclado "lanza" una IRQ cuando detecta 1 pulsacion... (seria NO enmascarable, tal como comentaste). Incluye tambien el Parametro de registros A/B/C y corresponde a:

Si A=0 borra el buffer de teclado
Si A=1 almacena en registro C el valor de la tecla pulsada ó 0 si el buffer está vacío.
Si A=2 almacena 1 en registro C si el registro B contiene la MISMA tecla que se ha pulsado ó 0 sino se ha pulsado la tecla especificada en registro B.
Si A=3 Entonces compruebo si B<>0 habilita la interrupcion para el teclado. Si B=0 desactiva interrupcion del teclado.

Por lo que entiendo que en la rutina de control de IRQ para teclado debo actuar en consecuencia de los registros A, B y C. (Ver documentación: http://0x10cwiki.com/wiki/Generic_keyboard)

Oki?

;)

Una vez más gracias por tu paciencia, debes estar ya odiandome por lo pesado que soy :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 » 03 Oct 2012, 16:05

Sí, sí, y sí, pero no a lo del reset del Spectrum. El reset del Spectrum, es físico, real, resetea el Z80 a través de su pin. El thomson, lo que hace es una especie de "break" de lo que estés haciendo, por ejemplo, salir de un juego, parar una carga, interrumpir la entrada de una línea, etc. Se parece a un reset, pero no borra la RAM, sigue ahí.

Pero sí, vas bien en las "entendeduras".
Si el chisme que emulas lleva IRQ para el teclado, pues deberás leer el teclado casi, casi en cada INS que leas. O cada "x" para que no se haga muy lento. (en un PC de hoy día lo dudo, pero bueno). Cada vez que lees una INS, antes de ejecutarla, o despues de ella, lees el teclado: si se pulsa una tecla, generas la IRQ, saltas a la rutina y almacenas la tecla pulsada, y sigues con el programa (retorno de IRQ). Pero lógicamente, solo si se pulsa una tecla creas la IRQ. Entonces, sí necesitas identificar que ha sido el teclado el causante de la IRQ.

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 » 03 Oct 2012, 16:42

Bien!!!!

Ahora me toca añadir más registros, más instrucciones y sincronizar todo... casi nada... :P

Iré posteando aqui el SRC... ;)


Luego, como ya he comentado, me gustaría documentarlo todo en un bonito PDF (para eso uno se gana el pan diseñando cositas en papel) y publicarlo para que los interesados en cuestión tengan la base, etc etc etc...

A trabajar!!!

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

Avatar de Usuario
zitror
Amiga 2500
Amiga 2500
Mensajes: 5349
Registrado: 02 Jul 2006, 00:16
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
Ubicación: El interior de un Z80
Gracias dadas: 248 veces
Gracias recibidas: 103 veces
Contactar:

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

Mensajepor zitror » 03 Oct 2012, 17:20

Me entero de poco pero es entusiasmante leeros :D
(C) 1.982 Sinclair Research Ltd

La buhardilla de Zitror

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 » 04 Oct 2012, 00:06

Imagen

Poco a poco... he aprovechado y adaptado lo que hice por mi cuenta en verano...

Sigoooo! ;)
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.

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 » 04 Oct 2012, 10:15

Bueno, como se puede ver en la captura, ya tengo montado una CPU en su estado más básico.

El mainloop funciona correctamente, aunque para DEBUGGEAR bien controlo el bucle con una pausa en espera de tecla... así voy viendo COMO está leyendo la RAM y si los registros y tal se actualizan como corresponden...

He implementado los registros, y tengo también una rutina que muestra el estado de RAM y VIDEO-RAM.

He introducido también en la RAM el código de un "Hello World", para ir comprobando que interpreto bien las instrucciones (esto ya lo tengo)... y hacer los cálculos/operaciones/lo que sea de dichas instrucciones (en lo que estoy).

---------------------------------------------------------
Para el tema de sincronizar el vídeo me quiero basar en la info que se muestra aqui: http://www.sromero.org/wiki/spectrum/ar ... /htprogemu (Es más/menos lo que comentaba @jepalza en un post) ;)

Pego el texto que me interesa del link aqui:
Con el fin de emular estas tareas deberás ejecutarlas tras el número apropiado de ciclos de CPU. Por ejemplo, si la CPU se supone que corre a 2.5Mhz y el display usa una frecuencia de refresco de 50Hz (estándar para el vídeo PAL), entonces la interrupción VBlank ocurrirá cada:

2500000/50 = 50000 ciclos de CPU

Si asumimos que la pantalla entera (incluyendo VBlank) es de 256 scanlines de alto y 212 de ellas son mostradas en el display (las otras 44 caen en el VBlank), entonces obtenemos que nuestra emulación debe refrescar un scanline cada:

50000/256 ~= 195 ciclos de CPU

Tras eso, debemos generar una interrupción VBlank y no hacer nada hasta que se haya acabado con el VBlank, es decir, durante:

(256-212)*50000/256 = 44*50000/256 ~= 8594 ciclos de CPU

Calcula cuidadosamente el número de ciclos de reloj necesarios para cada tarea, y entonces utiliza el divisor común mayor para InterruptPeriod, ajustando todas las otras tareas a él (no tienen porqué ejecutarse en cada expiración del contador Counter).

Las especificaciones de DCPU-16 difieren de las que se muestran en este ejemplo, así me tocará adaptarlas. ;)

-------------------------------
OPS! Acabo de descubrir un pedazo de bug.... estoy cruzando el byte alto / byte bajo cuando leyo una posicion de RAM. Vaya cag*da!!! :P :oops:
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.

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 » 04 Oct 2012, 14:04

Reparado el fallo de bytes en la interpretación de la Instrucción.

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


Volver a “Programación”

¿Quién está conectado?

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