{"id":61,"date":"2008-11-30T05:17:57","date_gmt":"2008-11-30T03:17:57","guid":{"rendered":"http:\/\/blog.rastersoft.com\/index.php\/2008\/11\/30\/libre\/"},"modified":"2015-08-15T18:01:40","modified_gmt":"2015-08-15T18:01:40","slug":"libre","status":"publish","type":"post","link":"https:\/\/blog.rastersoft.com\/?p=61","title":{"rendered":"!Libre!"},"content":{"rendered":"<p>Despu\u00e9s de cinco a\u00f1os de vida, <a href=\"http:\/\/www.rastersoft.com\/programas\/fbzxesp.html\" target=\"_blank\">FBZX<\/a> por fin es totalmente libre. Efectivamente, cuando escrib\u00ed mi emulador de Spectrum, hab\u00eda intentado sin \u00e9xito escribir tambi\u00e9n el emulador de Z80. Por desgracia la tarea era muy pesada (sobre todo por repetitiva y propensa a errores), as\u00ed que al final decid\u00ed usar uno hecho por un programador llamado Marat Fayzullin.<\/p>\n<p>Por desgracia hab\u00eda un serio inconveniente: las condiciones de uso de este c\u00f3digo eran incompatibles con la GPL (y mucho). Esta situaci\u00f3n nunca me agrad\u00f3 demasiado, pero dado que escribir desde cero y depurar un emulador de un procesador era una tarea demasiado \u00e1rdua, al igual que intentar adaptar el c\u00f3digo de FBZX a otro emulador de Z80 diferente, lo fu\u00ed dejando de lado durante a\u00f1os.<\/p>\n<p>As\u00ed estuvo la cosa hasta que hace un mes, m\u00e1s o menos, recib\u00ed un mensaje de un empaquetador de ArchLinux que se encontr\u00f3 con el problema: en efecto, no pod\u00eda seguir manteniendo el emulador en el repositorio por culpa de la incompatibilidad de licencias.<\/p>\n<p>Ante \u00e9sto decid\u00ed que ya era hora de tomar cartas en el asunto, as\u00ed que me puse a escribir un emulador desde cero. Sin embargo, ten\u00eda claro que no pod\u00eda limitarme a teclear largas listas de sentencias CASE XX:, sino que ten\u00eda que emplear una aproximaci\u00f3n m\u00e1s inteligente si quer\u00eda hacerlo en un tiempo razonable y con unas m\u00ednimas garant\u00edas de \u00e9xito. As\u00ed, se me ocurri\u00f3 que pod\u00eda partir de una lista de opcodes de Z80, la cual podr\u00eda parsearse con un peque\u00f1o programa que generar\u00eda por m\u00ed el c\u00f3digo en C. En efecto, partiendo de una lista como:<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">LD A,B\r\nLD A,C\r\nLD A,(HL)\r\nCP (HL)<\/pre>\n<\/div>\n<p>es posible separar el comando (LD, CP&#8230;) de los par\u00e1metros (A, B, C, (HL)), y generar autom\u00e1ticamente c\u00f3digo que realice las operaciones. De esta forma s\u00f3lo tuve que escribir una vez el c\u00f3digo que implementase la lectura y escritura de cada uno de los 51 posibles par\u00e1metros, la comprobaci\u00f3n de las 8 posibles condiciones, y el funcionamiento de cada uno de los 81 comandos diferentes, y dejar que el parser se encargase de generar los 1792 opcodes posibles que puede ejecutar el Z80. Adem\u00e1s, una ventaja extra es que cualquier error que cometiese ser\u00eda m\u00e1s f\u00e1cil de corregir, porque s\u00f3lo tendr\u00eda que hacerlo en el parser, y autom\u00e1ticamente se arreglar\u00edan todas las instrucciones afectadas.<\/p>\n<p>El resultado es que he necesitado tan s\u00f3lo unas cuarenta horas netas, repartidas en tres semanas, para escribir desde cero un emulador de Z80 plenamente funcional, y que, adem\u00e1s, emula el juego completo de instrucciones del Z80, tanto las oficiales como las no oficiales. Y gracias a \u00e9l, FBZX ya es completamente libre.<\/p>\n<p>Dado que la idea del parser puede ser \u00fatil para hacer otros emuladores diferentes, he tenido especial cuidado en escribirlo de manera que se pueda cambiar f\u00e1cilmente la lista de comandos, par\u00e1metros, etc, y as\u00ed poder adaptarlo a otros procesadores como el 6502, el 6800, ARM&#8230;<\/p>\n<p><strong>Otros cambios<\/strong><\/p>\n<p>Aprovechando la nueva versi\u00f3n, tambi\u00e9n a\u00f1ad\u00ed soporte para sonido mediante los controladores ALSA, y la emulaci\u00f3n del Spectrum 128K espa\u00f1ol (el original de Investr\u00f3nica y Sinclair Research). Adem\u00e1s, tambi\u00e9n almacena el nivel de volumen que se est\u00e1 usando, de manera que no haya que ajustarlo cada vez que se ejecute el programa de nuevo. Por \u00faltimo, he cambiado la licencia a la GPLv3.<\/p>\n<p><strong>SuperShow<\/strong><\/p>\n<p>Tambi\u00e9n aprovech\u00e9 para sacar una peque\u00f1a revisi\u00f3n de SuperShow. El \u00fanico cambio que hice fue traducir las variables de la plantilla que se usa para generar los scripts de Flash, de manera que si alguien que no hable castellano quiere mejorarla, lo tendr\u00e1 m\u00e1s f\u00e1cil.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Despu\u00e9s de cinco a\u00f1os de vida, FBZX por fin es totalmente libre. Efectivamente, cuando escrib\u00ed mi emulador de Spectrum, hab\u00eda intentado sin \u00e9xito escribir tambi\u00e9n el emulador de Z80. Por desgracia la tarea era muy pesada (sobre todo por repetitiva y propensa a errores), as\u00ed que al final decid\u00ed usar uno hecho por un programador &hellip; <a href=\"https:\/\/blog.rastersoft.com\/?p=61\" class=\"more-link\">Seguir leyendo <span class=\"screen-reader-text\">!Libre!<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,5],"tags":[],"class_list":["post-61","post","type-post","status-publish","format-standard","hentry","category-nueva-version","category-programacion"],"_links":{"self":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/61","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=61"}],"version-history":[{"count":1,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/61\/revisions"}],"predecessor-version":[{"id":1901,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/61\/revisions\/1901"}],"wp:attachment":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=61"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=61"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=61"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}