{"id":1597,"date":"2013-11-18T11:33:14","date_gmt":"2013-11-18T10:33:14","guid":{"rendered":"http:\/\/www.retrobits.es\/?p=1597"},"modified":"2013-11-18T11:33:14","modified_gmt":"2013-11-18T10:33:14","slug":"codigo-fuente-en-algunas-roms-de-zelda-links-awakening-dx","status":"publish","type":"post","link":"https:\/\/retrobits.es\/?p=1597","title":{"rendered":"C\u00f3digo fuente en algunas roms de \u00abZelda: Link\u00b4s awakening DX\u00bb"},"content":{"rendered":"<p><a href=\"https:\/\/www.retrobits.es\/wp-content\/uploads\/2022\/10\/uploads_2013_11_awakening.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"size-medium wp-image-1602 aligncenter\" alt=\"awakening\" src=\"https:\/\/www.retrobits.es\/wp-content\/uploads\/2022\/10\/uploads_2013_11_awakening-300x240.jpg\" width=\"300\" height=\"240\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Todos nosotros conocemos la saga de Zelda que Nintendo sac\u00f3 para GameBoy. El primer cap\u00edtulo fue una revoluci\u00f3n, tanto en gr\u00e1ficos como en sonido, historia, complejidad, tiempo de juego\u2026 Con una rom de 512 kB hab\u00edan conseguido un juego que perdurar\u00eda en las memorias de todos sus jugadores. Si record\u00e1is, se sac\u00f3 una version del \u201cZelda: Link\u00b4s awakenning\u201d para gameboy color, que inclu\u00eda mejoras gr\u00e1ficas y una nueva mazmorra, pero se les escap\u00f3 un peque\u00f1o detalle: El c\u00f3digo fuente.<\/p>\n<p style=\"text-align: justify;\">Como se puede leer en el blog\u00a0<a href=\"https:\/\/web.archive.org\/web\/20080708042548\/http:\/\/www.pagetable.com\/?p=28\">pagetable<\/a>, hay zonas de la rom en las que aparecen trozos de c\u00f3digo fuente, tanto en \u201cC\u201d como en ensamblador, e incluso una lista de los ficheros que compondr\u00edan el proyecto. Por lo visto, se debi\u00f3 a un fallo a la hora de crear la rom. El juego final, pesar\u00eda algo m\u00e1s de 1 Mb, pero para crear la ROM ser\u00eda necesario un chip de 2Mb. \u00bfC\u00f3mo se solucionar\u00eda el problema? Simplemente llenando el espacio sobrante con basura. Posiblemente usaran la funci\u00f3n malloc() para reservar la memoria, y en los sistemas operativos de la \u00e9poca (posiblemente usaran MSDos, el juego era de 1998, y windows 98 segu\u00eda corriendo sobre MSDOS), esta funci\u00f3n no era muy segura. Aunque actualmente al llamar a esa funci\u00f3n nos devuelve un bloque de memoria en blanco (bueno, eso depende del compilador y del sistema operativo), en aquella \u00e9poca se pod\u00eda acceder a datos \u201csucios\u201d en memoria que pertenec\u00edan a ejecuciones anteriores de otras aplicaciones.<\/p>\n<p style=\"text-align: justify;\">Como resultado, en la rom \u201cLegend of Zelda, Link\u2019s awakenning DX\u201d se pueden encontrar grandes trozos de c\u00f3digo fuente del editor de Borland Turbo C y de trazas del editor \u201cQBasic\u201d de MSDos. No se sabe que IDE usaron, aunque es bastante probable que en alg\u00fan momento usaran el \u201cTurbo C\u201d, dado que se encontr\u00f3 estre trozo completo de c\u00f3digo fuente:<\/p>\n<pre>#include\n#include\n   int main(void) {\n   FILE *fp,*f1;\n   int a=0xcd;\n   int b=0xc6;\n   int c=0\u00d729;\n   int ch;\n   unsigned long i=0;\n   if((fp=fopen(\u201dzeldag.gb\u201d,\u201drb\u201d))==NULL) {\n      printf(\u201dcan\u2019t open the file\u201d); return 0; \n   }\n   if((f1=fopen(\u201dttmp.asm\u201d,\u201dwt\u201d))==NULL) {\n      printf(\u201dcan\u2019t new file ttmp.asm\u201d); return 0; \n   }\n   while((ch=fgetc(fp))!=EOF) {\n     if(a==ch) {\n        i++;\n        ch=fgetc(fp);\n        if(b==ch) {\n           i++;\n           ch=fgetc(fp);\n           if(c==ch)\n              fprintf(f1,\u201d%lXH, \u201d , i);\n        }\n    }\n    i++;\n  }\n  fclose(fp);\n  fclose(f1);<\/pre>\n<p style=\"text-align: justify;\">Este trozo de c\u00f3digo intentar\u00eda escribir la instruci\u00f3n \u201cCALL 0\u00d729C6\u2033 en la rom, aunque no est\u00e1 muy claro para qu\u00e9 se har\u00eda as\u00ed. Tambi\u00e9n apareci\u00f3 una lista con los nombres de ficheros del proyecto, que estar\u00eda en el directorio D:\\GAMEBOY (qu\u00e9 originales) :<br \/>\nBANK37.ASM, CLEARKU.ASM, DAMA1.ASM, DAMA2.ASM, END.CPP, ENDEND.ASM, ENDEND.LST, ENDEND1.ASM, FEND1.ASM, FEND2.ASM, FEND3.ASM, FIND.ASM, FIND.CPP, IFCHAENL.ASM, INTWCHA.ASM,TEST.ASM,TTMP.ASM,TTMP.TXT,ZIPUTP.CPP<\/p>\n<p>Y algunos ficheros extra que aparecen nombrados en la rom:<\/p>\n<p>ADDPLAG.ASM, ADDPLAGF.ASM, CH64TBL.ASM, FEND.ASM, G.ASM, H.ASM, INSERTKU.ASM, INTWIN.ASM, KKKKKK.ASM, L.ASM, NOPLAY1.ASM, TAB.ASM, Y.ASM, ZXHPDM.ASM<\/p>\n<p>Y por fin, c\u00f3digo fuente en ensamblador del propio juego (no hay mucho, pero algo hay):<\/p>\n<pre>JoyPort_1:\n                 AND $02 ;LEFT\n                 JR  NZ, JoyPort_2\n                 CALL LEFTScroll\n                 RET\nJoyPort_2:\n                 AND $04 ;UP\n                 JR  NZ, JoyPort_3\n                 CALL UPScroll\n                 RET\nJoyPort_3:\n                 AND $08 ;DOWN\n                 JR  NZ, JoyPort_4\n                 CALL DOWNScroll<\/pre>\n<p>Tambi\u00e9n se encontr\u00f3 trozos de ensamblador ofuscado, lo que dar\u00eda a entender que no usaron el c\u00f3digo fuente original para hacer el remake, sino que lo desensamblaron desde la rom original, y se dedicaron a modificarla.<\/p>\n<p>Fuentes:\u00a0<a href=\"https:\/\/web.archive.org\/web\/20080708042548\/http:\/\/www.pagetable.com\/?p=28\">Pagetable<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Todos nosotros conocemos la saga de Zelda que Nintendo sac\u00f3 para GameBoy. El primer cap\u00edtulo fue una revoluci\u00f3n, tanto en gr\u00e1ficos como en sonido, historia, complejidad, tiempo de juego\u2026 Con una rom de 512 kB hab\u00edan conseguido un juego que perdurar\u00eda en las memorias de todos sus jugadores. Si record\u00e1is, se sac\u00f3 una version del [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":1602,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[6],"tags":[193,326,393,491,526],"_links":{"self":[{"href":"https:\/\/retrobits.es\/index.php?rest_route=\/wp\/v2\/posts\/1597"}],"collection":[{"href":"https:\/\/retrobits.es\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/retrobits.es\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/retrobits.es\/index.php?rest_route=\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/retrobits.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1597"}],"version-history":[{"count":0,"href":"https:\/\/retrobits.es\/index.php?rest_route=\/wp\/v2\/posts\/1597\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/retrobits.es\/index.php?rest_route=\/"}],"wp:attachment":[{"href":"https:\/\/retrobits.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1597"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/retrobits.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1597"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/retrobits.es\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1597"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}