<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>ZonaDeVicio - Tu comunidad de videojuegos online - Blogs - pSMS WIP por Puck2099</title>
		<link>https://www.gp32spain.com/foros/blog.php?2841-pSMS-WIP</link>
		<description>Tu comunidad de videojuegos en Internet.</description>
		<language>es</language>
		<lastBuildDate>Tue, 07 Apr 2026 15:27:23 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>60</ttl>
		<image>
			<url>https://www.gp32spain.com/foros/images/misc/rss.jpg</url>
			<title>ZonaDeVicio - Tu comunidad de videojuegos online - Blogs - pSMS WIP por Puck2099</title>
			<link>https://www.gp32spain.com/foros/blog.php?2841-pSMS-WIP</link>
		</image>
		<item>
			<title>Acabo la carrera y sigo con mi proyecto de emulador</title>
			<link>https://www.gp32spain.com/foros/entry.php?1825-Acabo-la-carrera-y-sigo-con-mi-proyecto-de-emulador</link>
			<pubDate>Tue, 24 Jun 2008 12:31:57 GMT</pubDate>
			<description>Pues sí, hoy he ido a ver mi última nota y, a falta de entregar una práctica que tengo medio hecha en Septiembre, ya solo me queda el proyecto (o TFC) para que me den el título de ingeniero :angel1: 
 
Bueno, dicho lo cual, el motivo de este hilo era comentar a los que siguieron...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Pues sí, hoy he ido a ver mi última nota y, a falta de entregar una práctica que tengo medio hecha en Septiembre, ya solo me queda el proyecto (o TFC) para que me den el título de ingeniero :angel1:<br />
<br />
Bueno, dicho lo cual, el motivo de este hilo era comentar a los que siguieron mis entradas en el blog sobre el emulador de Master System que voy a presentar como TFC (al final le he cambiado el nombre a gSMS) que a partir del 1 de Julio (que me voy al pueblo) me pondré a saco con él y espero mantener un ritmo de actualizaciones casi diarias (lo tuve que dejar &quot;aparcado&quot; por la sobrecarga de prácticas y exámenes).<br />
<br />
Por otro lado, he decidido &quot;migrar&quot; el blog a Blogger, pues así tengo algo más de control sobre el mismo y, sobre todo, le resultará más cómodo a varios amigos u otra gente interesada que no puede verlo correctamente aquí sin estar registrada (no se muestran imágenes por ejemplo).<br />
<br />
La nueva dirección es: <a href="http://gsmswip.blogspot.com/" target="_blank">gSMS WIP</a> y si alguien se quiere apuntar directamente a los feeds: <a href="http://gsmswip.blogspot.com/atom.xml" target="_blank">atom</a>.<br />
<br />
Saludos :brindis:</blockquote>

]]></content:encoded>
			<dc:creator>Puck2099</dc:creator>
			<guid isPermaLink="true">https://www.gp32spain.com/foros/entry.php?1825-Acabo-la-carrera-y-sigo-con-mi-proyecto-de-emulador</guid>
		</item>
		<item>
			<title>El pseudo anteproyecto</title>
			<link>https://www.gp32spain.com/foros/entry.php?1380-El-pseudo-anteproyecto</link>
			<pubDate>Wed, 05 Mar 2008 20:54:19 GMT</pubDate>
			<description>Ya sé que hasta no tener aprobado todo lo obligatorio y troncal (me faltan dos asignaturas de segundo) no se puede presentar el anteproyecto, pero mi tutor me pidió un texto explicando qué era exactamente lo que quería hacer para situarse en contexto, así que esto es lo que le...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Ya sé que hasta no tener aprobado todo lo obligatorio y troncal (me faltan dos asignaturas de segundo) no se puede presentar el anteproyecto, pero mi tutor me pidió un texto explicando qué era exactamente lo que quería hacer para situarse en contexto, así que esto es lo que le llevaré mañana.<br />
<br />
Os lo pongo por aquí para ver si antes de dos horas que lo imprima veis que me falta algo o algún cambio que creáis necesario.<br />
<br />
El profesor da asignaturas de compiladores, intérpretes, máquinas virtuales, etc., así que supongo que entenderá los términos de los que hablo (aunque algunos los he puesto más en lenguaje de su campo).<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_quote">
		<div class="quote_container">
			<div class="bbcode_quote_container"></div>
			
				Este proyecto consiste en la realización de un emulador de la videoconsola SEGA Master System programado en el lenguaje C++ utilizando una metodología orientada a objetos.<br />
<br />
Si bien la versión que se presentará funcionará bajo el sistema operativo GNU/Linux y arquitectura x86, la realización de este emulador se hará con el propósito de ser fácilmente portable a otros sistemas operativos y/o arquitecturas.<br />
<br />
Un emulador consiste en la implementación mediante software de una máquina completa, creando una máquina virtual que reproduce de la manera más fiel posible el comportamiento de cada uno de los componentes de la máquina física real.<br />
<br />
En el caso particular de este proyecto, la máquina a emular es la videoconsola Master System de la compañía japonesa SEGA. El emulador a construir deberá reproducir el comportamiento de cada uno de los componentes de dicha videoconsola (microprocesador Zilog Z80, controlador gráfico, controlador de sonido, etc.) con el objetivo de ser capaz de ejecutar correctamente los programas (juegos) que originalmente se escribieron para la misma.<br />
<br />
Estos programas, originalmente almacenados en una memoria ROM situada en el interior de los cartuchos en los que se distribuían, serán interpretados por el componente correspondiente al procesador Z80 (están escritos en su lenguaje máquina) el cual interactuará con el resto de componentes que forman el emulador para obtener unos resultados idénticos a los de la máquina real.<br />
<br />
Así mismo, se incorporarán en la medida de lo posible otras características adicionales no presentes en la máquina original pero que pudieran mejorar la experiencia como filtros gráficos, reescalados de imagen, etc.<br />
<br />
El emulador contará además con una interfaz gráfica de usuario, de modo que sea posible su configuración, carga de programas y ejecución de forma sencilla usando solamente el ratón.<br />
<br />
Por otro lado, para depuración de los módulos incluidos se crearán las herramientas que se estimen necesarias (interfaz interactivo para el Z80, desensamblador, etc.) que también serán incluidas junto con el resto de documentación.
			
		</div>
	</div>
</div>Please, opinad :brindis:</blockquote>

]]></content:encoded>
			<dc:creator>Puck2099</dc:creator>
			<guid isPermaLink="true">https://www.gp32spain.com/foros/entry.php?1380-El-pseudo-anteproyecto</guid>
		</item>
		<item>
			<title>Arquitectura del Z80 (Parte II)</title>
			<link>https://www.gp32spain.com/foros/entry.php?1363-Arquitectura-del-Z80-(Parte-II)</link>
			<pubDate>Tue, 04 Mar 2008 20:17:29 GMT</pubDate>
			<description>Con las clases no me queda mucho tiempo libre, pero aun así he conseguido avanzar un poco más en la comprensión del Z80, hoy voy a comentar las *interrupciones*. 
 
Una interrupción es una señal por la cual se interrumpe momentáneamente el secuenciamiento del programa, se trata...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Con las clases no me queda mucho tiempo libre, pero aun así he conseguido avanzar un poco más en la comprensión del Z80, hoy voy a comentar las <b>interrupciones</b>.<br />
<br />
Una interrupción es una señal por la cual se interrumpe momentáneamente el secuenciamiento del programa, se trata dicha interrupción mediante una rutina y después se vuelve al punto donde se interrumpió.<br />
<br />
Como ya comenté previamente, en el Z80 tenemos 2 biestables (dispositivos que almacenan un bit) llamados IFF1 y IFF2. El primero se usa para indicar si las interrupciones enmascarables (las que pueden ignorarse) están <b>habilitadas (IFF1=1)</b> o <b>inhibidas (IFF1=0)</b> y el segundo nos servirá como respaldo del primero (ya veremos luego como).<br />
<br />
Hay dos tipos de interrupciones: <b>enmascarables (INT)</b> y <b>no enmascarables (NMI)</b>. La diferencia entre ambas es que las primeras pueden ignorarse si así se configura el computador y las segundas hay que tratarlas obligatoriamente.<br />
<br />
Para habilitar las INT se usa la instrucción <b>EI</b> que pone a 1 los biestables IFF1 y IFF2, mientras que para inhibirlas usaremos la instrucción <b>DI</b> que los pone a 0.<br />
<b><br />
Interrupción no enmascarable</b><br />
Cuando se produce una NMI el procesador sigue los siguientes pasos:<br />
<ol class="decimal"><li style="">Salvaguarda el contador de programa (PC) en la pila.</li><li style="">Guarda el valor de IFF1 en IFF2 y pone IFF1=0 (inhibe INT).</li><li style="">Pone PC=0x0066 (Salta a la dirección 0x0066).</li></ol><br />
Una vez realizado este proceso, en la dirección 0x0066 estará la rutina correspondiente a su tratamiento. Cabe fijarse que no se puede interrumpir a una NMI con una INT porque pone IFF1 a 0.<br />
<br />
Finalmente, cuando acabe la rutina de tratamiento de interrupción se ejecutará la instrucción RETN que copia IFF2 en IFF1 (restaura el valor guardado) y restaura el PC desde la pila para continuar la ejecución donde se quedó.<br />
<b><br />
Interrupción enmascarable</b><br />
Hay tres modos diferentes en que puede estar el procesador para atender a las INT, estos modos llamados 0, 1 y 2 se establecen con las instrucciones IM0, IM1 y IM2.<br />
<b><br />
Modo 0</b><br />
Es similar al modo del 8080 de Intel, el dispositivo que genera la INT pondrá un código de operación de una instrucción en el bus de datos (normalmente una llamada a subrutina) y a partir de ahí seguirá la ejecución.<br />
<b><br />
Modo 1</b><br />
Es análogo al tratamiento de las NMI, solo que ahora se salta a la dirección 0x0038 y es enmascarable.<br />
<br />
<b>Modo 2</b><br />
En este modo se usan interrupciones vectorizadas.<br />
<br />
El dispositivo pone en el bus de datos un byte. Este byte se tratará como la parte baja de una dirección (recordemos de 16 bits) y el valor del registro I como la parte alta de dicha dirección. Finalmente, se pondrá a 0 el bit menos significativo para que sean direcciones pares.<br />
<br />
En esta dirección se encontrará la dirección de la rutina de tratamiento de interrupción adecuada a la que se saltará (previa salvaguarda del PC en la pila).<br />
<br />
<b>Consideraciones</b><br />
Eso sería básicamente todo el tema de las interrupciones, cabe destacar que las interrupciones no enmascarables pueden ser anidadas (una interrupción interrumpe a otra), pero no pueden saltar si se está tratando otra no enmascarable.<br />
<br />
Finalmente, he buscado en varios libros y no he encontrado ninguna referencia a que se haga un guardado automático del registro de flags (F) en la pila a semejanza de como ocurre con el PC, así que supongo que será cuestión del programador el contemplar su salvaguarda.<br />
<br />
Hasta aquí por hoy :brindis:</blockquote>

]]></content:encoded>
			<dc:creator>Puck2099</dc:creator>
			<guid isPermaLink="true">https://www.gp32spain.com/foros/entry.php?1363-Arquitectura-del-Z80-(Parte-II)</guid>
		</item>
		<item>
			<title>Arquitectura del Z80 (Parte I)</title>
			<link>https://www.gp32spain.com/foros/entry.php?1346-Arquitectura-del-Z80-(Parte-I)</link>
			<pubDate>Sun, 02 Mar 2008 20:27:24 GMT</pubDate>
			<description><![CDATA[Vamos a hablar un poco del "cerebro" de la Master System: el Z80. Si bien algunos términos quizá sean algo técnicos o sea de muy bajo nivel, he procurado dar algunas explicaciones que para quien controla del tema serán superfluas, pero pretenden ayudar un poco a quien todo esto...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Vamos a hablar un poco del &quot;cerebro&quot; de la Master System: el Z80. Si bien algunos términos quizá sean algo técnicos o sea de muy bajo nivel, he procurado dar algunas explicaciones que para quien controla del tema serán superfluas, pero pretenden ayudar un poco a quien todo esto le suene a chino pero tenga interés en aprender. Si algo no queda claro, please, avisadme en los comentarios para intentar explicarlo :brindis:<br />
<br />
El <b>Zilog Z80</b> es un micro catalogado a veces como de 8 bits (todavía no entiendo en base a qué se hace ese tipo de catalogaciones, pero bueno), poseyendo un bus de <b>direcciones de 16 bits</b> y un <b>bus de datos de 8 bits</b>.<br />
<br />
Veamos un esquema explicativo:<br />
<div style="text-align: center;"><br />
<img src="https://www.gp32spain.com/foros/cache.php?img=http%3A%2F%2Fwww.z80.info%2Fgfx%2Ffig214.gif" border="0" alt="" /></div><br />
Como podemos ver, contamos con los siguientes registros accesibles:<br />
<ul><li style=""><b>B, C, D, E, H, L y B', C', D', H', L'.</b> Estos registros son de 8 bits, pero pueden agruparse por pares en registros de 16 bits de la forma BC, DE, HL y B'C', D'E', H'L'. Tienen la particularidad de que solo son accesibles a la vez 6 de ellos, pues están divididos en 2 bancos intercambiables por medio de unas instrucciones.</li><li style=""><b>A, F y A', F'.</b> Como en el caso anterior se trata de registros de 8 bits de los que solo dos son accesibles al mismo tiempo por estar divididos en bancos. El registro A es el acumulador que, como podemos ver en el gráfico, siempre será unos de los operandos de la ALU (Unidad Aritmético Lógica). Por su parte, en el registro F se encuentran los flags de la máquina que guardan su estado.</li><li style=""><b>PC</b>. Contador de programa, apunta a la dirección de la siguiente instrucción a ejecutar, por lo tanto tiene que ser de 16 bits.</li><li style=""><b>SP.</b> Puntero de pila, apunta a la primera dirección libre de la pila de ejecución, por tanto es necesario que también sea de 16 bits.</li><li style=""><b>IX e IY.</b> Estos dos registros de 16 bits se usan como dirección base para instrucciones que hacen uso de vectores. Como podemos ver, existe una mini ALU que solo sirve para sumarle un dato de 8 bits a estos registros y volcar el resultado al bus de direcciones.</li><li style=""><b>I.</b> Este registro de 8 bits se usa para el tratamiento de interrupciones.</li><li style=""><b>R.</b> Este registro de 8 bits se usa como salida para refrescar memorias externas.</li></ul><br />
<br />
A su vez el <b>registro F</b> se divide en:<br />
<ul><li style=""><b>Bit 7: Flag S.</b> Es el flag que indica el <b>signo</b>, es decir, una copia del bit más significativo de la última operación de la ALU.</li><li style=""><b>Bit 6: Flag Z.</b> Este flag indica si el resultado de la última operación es <b>cero</b>.</li><li style=""><b>Bit 5: Flag 5.</b> Este bit en algunos documentos dicen que tiene un valor aleatorio, pero en otros he leído que guarda una <b>copia del bit 5</b> del resultado de la última operación.</li><li style=""><b>Bit 4: Flag H.</b> Guarda el <b>acarreo del bit 3 al 4</b> de la operación (supongo que será útil para operaciones en BCD).</li><li style=""><b>Bit 3: Flag 3.</b> Este bit en algunos documentos dicen que tiene un valor aleatorio, pero en otros he leído que guarda una <b>copia del bit 3</b> del resultado de la última operación.</li><li style=""><b>Bit 2: Flag P/V.</b> Dependiendo de la operación, en este bit se muestra si el resultado tiene <b>paridad</b> par (existe un número par de 1s en el registro) o bien hubo <b>desbordamiento</b>.</li><li style=""><b>Bit 1: Flag N.</b> Se activará si la última operación fue una <b>resta</b>.</li><li style=""><b>Bit 0: Flag C.</b> Es el bit de <b>acarreo</b>, se activará si el resultado de la operación no entra en el registro.</li></ul><br />
<br />
Por otro lado, hay otros registros temporales como W y Z que se utilizan para operaciones internas a las instrucciones y, de momento, no he visto que me vayan a ser de utilidad (programaré el resultado final sin hacer uso de ellos a menos que sea necesario).<br />
<br />
Una vez visto esto, cabría plantearse cómo implementarlo dentro del emulador.<br />
<br />
Mi idea es agruparlo todo, junto a otra información de estado (como los biestables IFF1 y IFF2 que controlan las interrupciones) que vaya viendo más adelante, dentro de una misma estructura de datos. Con esta agrupación sería muy sencillo cargar o salvar el estado interno, útil para transmitir esa información a otra aplicación (como la GUI de la que hablé en la entrada anterior) o bien para los famosos <i>savestates</i> de las partidas.<br />
<br />
La siguiente pregunta que me hice fue: ¿qué sería más conveniente para almacenar los registros de 8 bits que pueden agruparse en pares? ¿un tipo de 8 o 16 bits?<br />
<br />
La respuesta es sencilla: ambos. En C existe un tipo de estructuras llamadas <i>union</i> en las que puedes declarar varios tipos que comparten la memoria de dicha estructura, es decir, en una estructura <i>union</i> de 16 bits se podría acceder a los 16 bits de golpe (por ejemplo si fuera el par DE) o bien a los 8 bits superiores (D) o los 8 bits inferiores (E).<br />
<br />
Creo que esto es suficiente por hoy, mañana, si tengo tiempo, más.</blockquote>

]]></content:encoded>
			<dc:creator>Puck2099</dc:creator>
			<guid isPermaLink="true">https://www.gp32spain.com/foros/entry.php?1346-Arquitectura-del-Z80-(Parte-I)</guid>
		</item>
		<item>
			<title>Buscando una biblioteca gráfica</title>
			<link>https://www.gp32spain.com/foros/entry.php?1341-Buscando-una-biblioteca-gráfica</link>
			<pubDate>Sat, 01 Mar 2008 23:19:45 GMT</pubDate>
			<description>Si por algo destacan los (pocos) emuladores que hay de Master System para GNU/Linux es por su falta de interfaz gráfica (tan solo conozco con ella el Mekanix, port de Meka para Linux que me funciona fatal y nunca he conseguido que reproduzca sonido), así que ese es uno de los...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Si por algo destacan los (pocos) emuladores que hay de Master System para GNU/Linux es por su falta de interfaz gráfica (tan solo conozco con ella el Mekanix, port de Meka para Linux que me funciona fatal y nunca he conseguido que reproduzca sonido), así que ese es uno de los aspectos en los que quiero incidir.<br />
<br />
El primer componente del emulador que quisiera programar es el núcleo del Z80, pero en lugar de programarlo del tirón me gustaría ir implementándolo poco a poco a medida que lo voy testeando. Podría ir depurándolo con gdb u otro depurador similar y ver cómo cambia el estado interno, pero he pensando en hacer una interfaz que haga uso de él y donde pueda ver el estado de cada registro, memoria, etc.<br />
<br />
Mi primera aproximación era hacerlo en modo texto para ejecutarse via terminal, pero, pensándolo mejor, ya que implementaré una interfaz gráfica para el emulador, ¿por qué no ir cogiendo experiencia haciendo otra para depurar el Z80?<br />
<br />
Como ya dije anteriormente, mi idea es hacer un emulador para GNU/Linux, pero con la idea de ser relativamente portable a otras plataformas, así que inicié una búsqueda de bibliotecas gráficas con estas características.<br />
<br />
Después de unas horas mi cerco se redujo a tres candidatas: Qt4, GTK+ y wxWidgets.<br />
<br />
Las tres parecían bastante apropiadas, pero tras consultar opiniones se me ocurrió probar Qt4 y quedé prendando (espero que no me lea efegea :angel1:).<br />
<br />
El hecho de estar pensada para usarse con C++ era un punto a favor, pues ya comenté que voy a hacer este emulador con orientación a objetos (quizá no sea lo más óptimo, pero no hay modo mejor de coger práctica con dicha metodología que aplicándola a algo que te gusta), por otro lado es portable, tiene una documentación bastante buena, se obtienen resultados con relativo poco código y trae unas herramientas fabulosas para crear interfaces en un entorno gráfico y el soporte multilenguaje es sencillísimo.<br />
<br />
Por otro lado, en mis primeras búsquedas estuve mirando cómo combinar estas bibliotecas junto con SDL para el tema gráfico, pero encontré algunos problemillas de incompatibilidades, así que se me ocurrió otra idea: ¿por qué no usar OpenGL? También es multiplataforma, rápido y seguro que para cosas 2D no será demasiado complicado de usar.<br />
<br />
Echando un vistazo a los propios ejemplos de Qt4 he visto que se integra fantásticamente con OpenGL, así que en principio ya tengo seleccionado todo lo necesario para el apartado gráfico.<br />
<br />
Bueno, lo siguiente será definir la estructura de datos para representar el estado interno del Z80 y construir el interfaz de depuración que haga uso del mismo, pero antes tengo que buscar mi última versión del GP Lady Killer para mandársela a cierta compañía extranjera...<br />
<br />
Mañana, con suerte, más :brindis:</blockquote>

]]></content:encoded>
			<dc:creator>Puck2099</dc:creator>
			<guid isPermaLink="true">https://www.gp32spain.com/foros/entry.php?1341-Buscando-una-biblioteca-gráfica</guid>
		</item>
		<item>
			<title>Inicio mi TFC</title>
			<link>https://www.gp32spain.com/foros/entry.php?1336-Inicio-mi-TFC</link>
			<pubDate>Fri, 29 Feb 2008 19:52:56 GMT</pubDate>
			<description>Pues sí, finalmente me he decidido a publicar mi blog con un objetivo claro: mostrar los avances de mi trabajo final de carrera. 
 
Ayer jueves fui a hablar con el que sería mi tutor y le propuse hacer un proyecto propio: un *emulador de SEGA Master System*; afortunadamente,...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Pues sí, finalmente me he decidido a publicar mi blog con un objetivo claro: mostrar los avances de mi trabajo final de carrera.<br />
<br />
Ayer jueves fui a hablar con el que sería mi tutor y le propuse hacer un proyecto propio: un <b>emulador de SEGA Master System</b>; afortunadamente, aunque algo reacio por no entender muy bien de qué se trataba, aceptó llevármelo :brindis:<br />
<br />
¿Por qué de Master System? Bien, por dos motivos: uno sentimental, pues fue la primera consola que me regalaron (la Videopac ya estaba en casa desde que tengo uso de razón) y el segundo para empezar con un emulador no demasiado complicado para no tener que emplear dos años en su realización.<br />
<br />
Alguno podrá decir que ya tengo mi AlexKidd2X, pero si bien he metido mucho código en él, la mayor parte del código de los chips que integra está hecho por otras personas y mi deseo es hacer uno desde cero (<i>from scratch</i> que dirían los guiris) para aprender todo lo posible.<br />
<br />
Así mismo, mi idea es hacerlo para <b>PC</b> y SO <b>GNU/Linux</b> (aunque con la idea de que sea portable) y usarlo por otro modo para aprender y afianzar mis conocimientos en otros aspectos como C++, interfaces gráficas, etc. que me puedan ser útiles para un futuro porque, ¿qué mejor manera de aprender nuevas técnicas que hacerlo aplicándolas a algo que te gusta?<br />
<br />
No creo que publique mucho código hasta su finalización (si las cosas no se tuercen estará licenciado con una <b>GPL</b>), pero creo que mis experiencias pueden ser de ayuda para la gente que quiera iniciarse en este mundillo o, simplemente, gente con curiosidad por estos temas.<br />
<br />
Finalmente, el nombre código provisional de este emulador es <b>pSMS</b> (de picoSMS o puckSMS, depende de como se mire :angel1:). Acabo de hacer una búsqueda en Google y resulta que hay un emulador de PS2 con ese nombre, así que ya lo cambiaré cuando encuentre uno mejor :p</blockquote>

]]></content:encoded>
			<dc:creator>Puck2099</dc:creator>
			<guid isPermaLink="true">https://www.gp32spain.com/foros/entry.php?1336-Inicio-mi-TFC</guid>
		</item>
	</channel>
</rss>
