Volver


DmaLog en Español
Por Dark-N
http://darknromhacking.com

Basado en el Log que estaba en:
http://agtp.romhack.net/dmalog/ (abajo)

- última actualización: 31/05/2007 -

Resumen: Log de IRC donde se enseña como usar DMA en una rom de SNES.


Usaremos la rom Eien no Filerna (J).


(** = notas del traductor)

Odio escribir introducciones a estas cosas.

Básicamente este log te enseñará como usar assembler 65816 para saltarte un rutina de descompresión y usar tus propios datos predescomprimidos en vez de los datos originales comprimidos. Esto servirá si lo que quieres es traducir un juego con fuentes comprimidas y no deseas escribir un descompresor/recompresor (o no sabes como hacerlo).
Este documento no sirve mucho para grandes proyectos con numerosos bloques comprimidos que necesitan ser modificados y reinsertados (**como algunos RPGs). Usa este documento con discreción.

El Log usa el juego "Eien no Filerna" como prueba. Necesitarás el emulador ZSNES (preferentemente la versión de ZSNES DOS), ASM2Hex assembler de LordTech, SNES9X de LordTech (idealmente la versión 1.37), un editor de Tiles y un editor de texto. También es recomendado tener el programa Hex2SNES de J2E.

Los siguientes archivos son entregados con este log:

* SNES9X LordTech v1.37
* Hex2SNES (** También sirve Lunar Address 1.0.2)
* ASM2Hex
* filerna.zst
* enf-dma-esp.txt
* enf-dma-solucion.txt
* trace.log

**Programas que debes tener no mencionados aquí: Zsnes v1.337 de Windows, Zsnes 0.988c de DOS, Geiger's Snes9x 1.43 Debugger, SNES 9x 1.41 Trace, Tile Layer Pro 1.1.
**A medida que avanza la conversación, pongo separaciones para entender el proceso general dentro del Log.

Puedes obtener la última versión de ZSNES en http://www.zsnes.com. No me pidan a mi (**RadioSprite es el que enseña) o a satsu (**el que aprende en la conversación) por la ROM de "Eien no Filerna" (** la puedes encontrar en http://www.rom-world.com/ ), bajo ninguna circunstancia les pasaré una. Cuando este log se mueva finalmente a http://www.romhacking.org, si una persona sube este archivo a RHDO (**http://www.romhacking.org) por favor elimine esta frase y cambie todos los links a los archivos específicos en romhacking.org, excepto con ASM2Hex, ya que el zip puede o no estar fuera de fecha; y el código asm compila con esta versión (**de ASM2Hex), esta versión no es como otras versiones disponibles.


** A Quien va Dirigido este Documento

Este documento va dirigido a todos aquellos romhackers que se quedan pegados con alguna traducción de SNES justo en le momento en que no pueden cambiar las fuentes de un rom ya que no las encuentran de ninguna forma, es decir que han probado todos los formatos conocidos y en varios editores de tiles.


Técnicamente lo que haremos...

Esto no estaba en el LOG pero creo que es importante entender que haremos con la rom. En pantalla no se verá ningún cambio ya que modificaremos la rom internamente.
Este es el diagrama básico y mas abajo el que utiliza DMA, para el trato de alguna fuente u otro dato comprimido en la SNES:



Como se ve en los diagramas, lo que haremos básicamente será:

1. Crear nuestras propias tiles descomprimidas en algún lugar vacío de la ROM. Podemos cambiar las tiles por otro formato, o agregar tiles nuevas, cosa antes no podíamos por estar comprimidas ;)
2. Por lo anterior, tampoco usaremos el algoritmo que las procesa.
3. Crearemos una rutina en un espacio vacío de la ROM. Es una rutina que use registros DMA copiaremos nosotros mismos las tiles a RAM, sin usar el algoritmo original.

Como nos damos cuenta, de la RAM en adelante no nos preocupamos ya que la SNES las trabaja como antes.


Beneficios de USAR DMA

-Permite solucionar el clásico problema de que no se ven las fuentes en la rom en ningún modo ni con ningún editor de tiles.
-Las Tiles de las fuentes quedan descomprimidas en ROM por lo que es llegar y editarlas con el Tile Layer Pro por ejemplo.
-Permite agregar acentos u otros símbolos.


Preparando Ambiente

[02:40] <@RadioSprite> satsu
[02:40] <@RadioSprite> si te queda poder cerebral a esta hora de la noche
[02:40] <@RadioSprite> ¿quieres hacer lo de Filerna ahora?
[02:41] <satsu> Sí, seguro. Déjame hacer una rápida edición y tendrás mi tonta atención.
[02:41] <@RadioSprite> envíame también el juego.
[02:41] <@RadioSprite> estas autorizado (**Creo que lo dice por un tema de seguridad del IRC)
[02:41] <satsu> Esta bien.
[02:41] <@RadioSprite> Este tipo de modificación toma alrededor de 5 minutos, si sabes lo que estás haciendo.
[02:42] <satsu> ¡yay!
[02:42] <satsu> desafortunadamente, muy pocas veces puedo. :P
[02:42] <@RadioSprite> Te enseñaré unas pocas cosas
[02:43] <@RadioSprite> #1, Voy a enseñar como encontrar una rutina de compresión y como saltártela.
[02:43] <@RadioSprite> #2, Voy a enseñar como usar la capacidad de la SNES llamada "direct-memory access" (**DMA)
[02:43] <satsu> ya veo. o_o
[02:44] <@RadioSprite> necesitas saber unas pequeñas cosas
[02:44] <@RadioSprite> necesitas saber como cargar y guardar datos usando ASM
[02:44] <@RadioSprite> necesitarás el Hex2SNES de Lordtech.
[02:44] *** Disconnected
[02:47] *** Attempting to rejoin...
[02:47] *** Rejoined channel #romhacking

[02:48] <@RadioSprite> er
[02:48] <@RadioSprite> quise decir ASM2Hex
[02:48] <@RadioSprite> Hex2SNES de J2E (**un grupo de Traducción) es una utilidad de conversión de direcciones, también muy útil
[02:48] <@RadioSprite> También deberás logear esto, así puedo subirlo como artículo a RHDO
[02:48] <satsu> si, tengo la opción logging de IRC siempre encendido.
[02:49] <satsu> que bien que esta cosa no está en #romhack, o tendría más de 12mb en logs. :P
[02:49] <@RadioSprite> También necesitarás SNES9X tracelogger de LordTech.
[02:49] <@RadioSprite> estás otra vez autorizado.
[02:49] <@RadioSprite> Ensamblaré tus logs, por si acaso.
[02:49] <satsu> ok.
[02:50] <satsu> bien, tengo asm2hex y snes9x.
[02:50] <@RadioSprite> ¿Filerna es una HiRom o LoRom?
[02:50] <satsu> creo que es una Lorom.
[02:50] <@RadioSprite> Generalmente, HiROM y LoROM no te crean problemas, excepto cuando se calculan punteros
[02:50] * @RadioSprite maldice
[02:50] <@RadioSprite> Odio las LoROM.
[02:51] <@RadioSprite> Bien, comencemos.
[02:51] <@RadioSprite> Abre el Hex2SNES si lo tienes por ahí ya que te ayudará un montón para conversiones LoRom->Absolute.
[02:51] <satsu> entiendo.
[02:51] <@RadioSprite> Ok.
[02:51] <@RadioSprite> Ahora, a lo mejor sabes la diferencia entre entre HiROM y LoROM
[02:52] <@RadioSprite> pero para beneficio de quien leerá el Log, voy a explicarlos.
[02:52] <satsu> si, ¡sensei!
[02:52] <@RadioSprite> Actúa como si tu no supieras que son ^_^
[02:52] <satsu> apenas las conozco, así que esta bien. ^^;
[02:52] <@RadioSprite> Básicamente, los programas SNES se dividen en 2 "bancos" de datos. Databanks, si prefieres.
[02:53] <@RadioSprite> Cuando estás tratando con LoROMs, cada banco es de 32K de tamaño, o $8000
[02:53] <@RadioSprite>
Cuando estás tratando con HiROMs, cada banco es de 64K de tamaño, o $10000.
[02:54] <@RadioSprite> Cuando escribes código que mueve datos de aquí para allá, tu -no puedes- exceder esos límites.
[02:54] <@RadioSprite> Puedes armar cosas que lean de diferentes bancos de donde estás, pero no puedes tener una continua pieza de datos cruzando los límites del banco.
[02:54] <@RadioSprite> ¿Entendiste todo?
[02:54] <satsu> puedo guardarlo
[02:54] <@RadioSprite> Bien, ahora pasemos al Direccionamiento.
[02:55] <@RadioSprite> El "origen" de un programa SNES puede variar, pero pongamos el caso que llamamos $0 al primer byte en el archivo.
[02:55] <@RadioSprite> Cuando hacemos un direccionamiento a una HiROM, es en realidad a $C0:0000 o $C0/0000. (**Y no $00/0000)
[02:56] <satsu> ok. (a propósito, la rom que te envié no tiene header.)
[02:56] <@RadioSprite> Pienso que puede ser también $00/0000 pero en verdad, nunca antes he visto una HiROM mirrored (**reflejada).
[02:56] <@RadioSprite> satsu- muy bien, esta bien.
[02:56] <@RadioSprite> eso hace las cosas mucho menos dolorosas en el trasero.
[02:56] <satsu> ¡pregunta!
[02:56] <satsu> ¿Que significa mirrored?
[02:56] <@RadioSprite> Chicos, ¡siempre quiten los header de sus roms de SNES antes de jugar con ellos! (**con SNES9X Debugger abre la rom con header y el programa te preguntará si deseas sacárselo, ponle que si. Recuerda hacer antes un respaldo de la rom original. Ver imagen inferior)



[02:56] <ipkiss>
heh
[02:56] <@RadioSprite> Básicamente...
[02:56] <@RadioSprite> esto es -mas o menos- difícil de explicar
[02:57] <@RadioSprite> Cuando tu has reflejado direcciones, esto significa la misma cosa
[02:57] <@RadioSprite> Déjame usar una LoRom como ejemplo, porque sé como funciona el reflejado de ellas.
[02:57] <@RadioSprite> Cuando tratas con una LoRom, el origen es $00/8000
[02:58] <@RadioSprite> o $80/8000, cualquiera de estas dos.
[02:58] <@RadioSprite> Así que básicamente, los Bancos $00 y $80 de la LoRom están "reflejados"
[02:59] <@RadioSprite> Cuando accedes a datos tanto en $80/8000 o en $00/8000, siempre se obtiene lo misma cosa.
[02:59] <satsu> hum, ya veo.
[02:59] <@RadioSprite> También nota que cuando estás tratando con LoROM, las direcciones de cada banco individual comienzan en $8000 (**Ver Mapa de Memoria de mi Guía ASM #1).
[03:00] <@RadioSprite> Si intentes acceder a datos dentro del rango de direcciones $0000-$7FFF, estás saliendo de la memoria (** recuerda que la LoRom parte de $8000)
[03:00] <@RadioSprite> No querrás hacerlo a menos que tengas que hacerlo :)
[03:00] <@RadioSprite> a menos que -realmente- sepas lo que estas haciendo.
[03:00] <satsu> lo que no es, así que dejémoslo como está. :)
[03:00] * @RadioSprite asiente con la cabeza
[03:01] <@RadioSprite> Deja la ROM de Filerna en el disco, comenzaremos con las rutinas y lo demás.


Tiles a Editar

[03:01] <@RadioSprite> Necesitarás el ZSNES para esto.
[03:01] <satsu> ok.
[03:01] * satsu toma apuntes
[03:02] <@RadioSprite> lo cual me recuerda que también aprenderás como la memoria de la SNES setea un ZSNES savestate.
[03:02] <@RadioSprite> Teóricamente también se puede hacer también con un SNES9X savestate, pero el formato es un poco confuso, y está comprimido más encima
[03:02] <@RadioSprite> El formato de un ZSNES es constante
[03:03] <@RadioSprite> Por consiguiente es mas fácil trabajar con el ^_^
[03:03] * satsu asiente con la cabeza
[03:04] <satsu> probablemente notarás que Filerna no funciona con los últimos Zsnes.
[03:04] <satsu> ZSNES 1.337 funciona bien sin embargo. (** para sacar salvadas ZST puedes usar el Zsnesv1.337 de Windows)
[03:05] <@RadioSprite> ¿Que tal la versión .988c? :p
[03:05] <@RadioSprite> Yo uso ZSNES DOS para la mayoría de mis depuraciones, cargan más rápido
[03:05] <satsu> Yo no sé.
[03:06] <satsu> mi Zsnes DOS carga REALMENTE lento en mi computador por alguna razón.
[03:06] <@RadioSprite> muy bien, ahora la pieza que quieres es la fuente de las batalla, ¿correcto?


** Las Tiles a modificar serán las del cuadro azul, y no las superiores.
Imagen obtenida con Geiger's Snes9x Debugger, aunque igual se puede con el Zsnesv1.337 de Windows.

[03:06] <@RadioSprite> ¿La que es de 8x8? (**se refiere al tamaño en pixels de las tiles del cuadro azul)
[03:06] <satsu> si.
[03:06] <satsu> 2bpp, 8x8 (** bpp = bit per pixels, el modo 2bpp permite 4 colores máximos por tile).
[03:06] <@RadioSprite> Usa el que quieras, no debería haber mucha diferencia. (**se refiere a algún ZSNES)
[03:06] <@RadioSprite> mientras puedas obtener un ZSNES savestate.
[03:06] <satsu> ok.


Encontrando las Tiles en la VRAM

[03:08] <@RadioSprite> Ok bien, esto va a ser un poco difícil.
[03:08] * Looking up Naoya user info...
[03:08] <@RadioSprite> En mi primer intento, en el savestate apareció la fuente en $2CC13. (** se refiere al ZST que lo abrió en el TLP)


** Usa el Zsnes 1.337 Win y Salva justo aquí con F2, pero si quieres, usa la salvada que yo obtuve "Eien no Filena (J)_orig.zs1".
Las tiles que ves en la imagen ya están en VRAM, la idea es que luego puedas "capturarlas" antes, cuando pasan por la RAM.


** Si abres este archivo .zs1 en el TLP, en modo Game Boy, se verá distinto, pero le das a GoTo: $02CC13 y se ajustará como se ve en la imagen.

[03:08] <@RadioSprite> Ahora es tiempo para una lección de savestate.
[03:09] <satsu> ¡con un engrish agregado! :D (** http://es.wikipedia.org/wiki/Engrish )
[03:09] <@RadioSprite> ¡Y no cualquier engrish!
[03:09] <@RadioSprite> ¡Ese MACROSS engrish!
[03:09] <@RadioSprite> De todos modos, sigamos.
[03:09] <@RadioSprite> Los primeros $C12 bytes de una salvada de ZSNES es información para el ZSNES en si. Un header, si prefieres.
[03:09] <@RadioSprite> Comenzando en $C13 es el primer banco de la RAM, $7E. (**$00:0C13 es RAM 7E)
[03:10] <@RadioSprite> Comenzando en $10C13 es el -segundo- banco de RAM, $7F. (**$01:0C13 es RAM 7F)
[03:10] <@RadioSprite> Los Bancos $7E y $7F son iguales sin importar en que modo de direccionamiento estás.
[03:11] <@RadioSprite> Excepto quizás para los modos de direccionamientos enredados que usan las ROMs mayores a 32mbit/4mbyte, pero no nos desviemos.
[03:11] * satsu asiente con la cabeza
[03:11] <@RadioSprite> Comenzando en $20C13 es la VRAM.
[03:11] <@RadioSprite> La VRAM es algo maldita.
[03:11] <@RadioSprite> Bueno, no realmente.
[03:12] <@RadioSprite> Pero generalmente hablando (y me puedo estar comiendo mis propias palabras luego) tu puedes -solamente- escribir en VRAM durante la etapa de NMI, el cual dura cerca de 8000 ciclos de CPU. (** NMI, Interrupcion no enmascarable, -o no desabilitable-, que sucede cuando se ha acabado de dibujar una pantalla entera en la TV y se esta haciendo el blanking en pantalla)
[03:12] <@RadioSprite> hacer este duro proceso, como la descompresión de una fuente, generalmente es algo en el que no quieres tener un tiempo límite (** se refiere a que es lento pasar de ROM a VRAM de una vez descomprimiendo la data en el momento)
[03:12] <@RadioSprite> Así que normalmente esta data comprimida es dumpeada (**copiada) al algún lugar de la RAM y luego es transferida a VRAM.
[03:13] <@RadioSprite> Debes intentar sacar un savestate con la fuente comprimida en RAM y no en VRAM.
[03:13] <@RadioSprite> Es muy probable que sea un código de inicialización de una batalla el cual hace esto (durante la pantalla negra después que dice FILERNA 6 escrito en kanji)
[03:14] <@RadioSprite> y antes de que la batalla comience
[03:14] <satsu> ok.


Encontrando las Tiles en la RAM, método con ZSNES

[03:14] <@RadioSprite> así que intenta sacar varios savestates y hazlo rápido durante ese tiempo, y si puedes obtener la fuente en la RAM, genial
[03:14] <@RadioSprite> si no puedes, yo lo intentaré también y si la obtengo antes que ti, te la enviaré
[03:14] <satsu> ¡de acuerdo!
[03:14] <@RadioSprite> wow, recién obtuve una BSOD (**Blue Screen of Death: pantalla azul de error, clásica en sistemas operativos Windows 9X) y se recuperó o_O
[03:15] <satsu> @_@
[03:15] <satsu> ¿quieres reiniciar el sistema?
[03:15] <@RadioSprite> no
[03:15] <@RadioSprite> Estaré bien
[03:16] <satsu> ok.
[03:19] <@RadioSprite> (Esta es generalmente la parte difícil, por si no lo has adivinado ^^)
[03:19] <satsu> ¡hurra!
[03:21] <@RadioSprite> demonios, lo olvidé
[03:21] <@RadioSprite> aquí es donde la tecla retardadora del Zsnes se vuelve útil (**Tecla Slow-down del ZSNES -> se configura en Misc-> Game Keys, se usa para que el juego corra lento y así puedas obtener una salvada cuando no tienes mucho tiempo)

 

 

 

 

 

 

 

 


** Asigna una tecla cualquiera al modo Slown Down, esto hará que el juego ande lento cuando la presiones,
ayudando a sacar salvadas en pequeños instantes del juego.

[03:21] <satsu>
si, esto igual se me había olvidado. :P
[03:22] <satsu> ¿tecla retardadora? o_O
[03:22] <@RadioSprite> Excepto que mi versión no tiene una ^^; (** Se refiere supongo a su versión de ZSNES)
[03:22] <satsu> demonios, nunca supe eso.
[03:22] * satsu asigna la tecla retardadora.
[03:25] <@RadioSprite> HMMM
[03:25] <@RadioSprite> ahah
[03:25] <@RadioSprite> Creo que debo tener algo.
[03:25] <satsu> !!
[03:26] <@RadioSprite> no, no importa
[03:26] <satsu> -_-
[03:26] <@RadioSprite> confía en mi, es mejor :p
[03:28] <@RadioSprite> estamos casi.
[03:30] <satsu> tengo un savestate con ALGO de la fuente en RAM...
[03:31] <@RadioSprite> eso esta bien, mientras que esta sea -la primera parte- de la fuente, y no la última parte.
[03:31] <@RadioSprite> ya que necesitamos saber donde comienza y no donde termina.
[03:31] <satsu> oh.
[03:32] <satsu> es mas difícil que los anillos de Saturno se intercambien. @_@
[03:32] <@RadioSprite> hahah :)
[03:33] <satsu> diablos, obtuve la parte final de la fuente de nuevo. >_<;
[03:35] <@RadioSprite> muy bien, obtuve algo con la rutina entera.
[03:35] <@RadioSprite> un segundo, déjame comprimirlo
[03:35] <satsu> ah, me perdí. :(
[03:36] <@RadioSprite> para ser honesto, terminé usando el Depurador de Zsnes de DOS (** Zsnes 0.988c versión DOS) para avanzar 1000 instrucciones a la vez hasta que veía cuando comenzaba a aparecer :p
[03:36] <@RadioSprite> (eso es zsnes -d nombre_rom para ti y para los adictos a al DOS ^^)
[03:37] <satsu> tramposo :P

** Ve a Inicio->Ejecutar->cmd (en Win98 es command en WindowsXP puede ser cmd o command), entrarás a la Consola de Comandos, deja una carpeta en el disco con el Zsnes 0.988c de DOS, y la rom sin header, luego escribe:
>zsnes -d romfilerna.smc y aparecerá lo como esto:



** Presiona una tecla y se verá lo de abajo.

** Presiona F1 para que se vea el juego.
** Justo desde aquí presiona F1 para volver a la pantalla anterior y poner un Breakpoint con la tecla B y F1 para jugar de nuevo. Con la tecla Enter vas instrucción a instrucción.

** Yo no pude hacerlo de esta forma, lo hice con el Snes9x Debugger (ver más abajo). En el paquete original viene un filerna.zst, esa es la salvada esta con las fuentes en RAM del ZST que consiguió RadioSprite.
 
[03:39] * @RadioSprite va a obtener un sprite mientras espera que satsu acepte el archivo
[03:40] <@RadioSprite> buen ritmo ^_^
[03:40] <@RadioSprite> bien, entonces
[03:40] <@RadioSprite> como tu podrás ver, la fuente está ubicada en $11D13 en el savestate (**$01:1D13 en el ZST está en el banco 7F de la RAM)
[03:41] <@RadioSprite> PREGUNTA SORPRESA: ¿Cual es la dirección completa de aquella fuente en la RAM?
[03:41] <satsu> agh$Q%%!
[03:42] * @RadioSprite taptaptap
[03:42] <satsu> espera un segundo, estoy intentado saber como funciona esto. x_x
[03:42] <@RadioSprite> ok
[03:42] <@RadioSprite> debería ser muy simple, pero supongo que he estado haciendo esto bastante tiempo...
[03:42] <satsu> se que comienza en 7F al menos. :P
[03:42] <@RadioSprite> es mejor que no hagas trampas :p
[03:42] <satsu> aun no. :P
[03:42] <@RadioSprite> si, eso está bien
[03:43] <satsu> ¿es 7F:9D13?
[03:43] <@RadioSprite> No.
[03:43] <satsu> ¡oh no!.
[03:43] <@RadioSprite> No estas cerca x_x
[03:43] <@RadioSprite> tienes la idea, pero estas cerca
[03:43] <@RadioSprite> recuerda el header que hay dentro de los savestates.
[03:44] <satsu> oh si. :P
[03:44] <@RadioSprite> er, el repugnante header, mejor dicho.
[03:44] <satsu> Entonces no es 7F:9101, ¿verdad? :P
[03:44] <@RadioSprite> estas muy cerca
[03:44] <@RadioSprite> es $7F:0100
[03:44] <@RadioSprite> er
[03:44] <@RadioSprite> mejor dicho
[03:45] <@RadioSprite> $7F:1100

**No te calientes mucho la cabeza y usa el Lunar Address, ver imagen inferior. Coloca la dirección $11D13 que es la del ZST y queremos obtener la Dirección RAM SNES.


[03:45] <@RadioSprite> Ahora, antes dije eso de las LoRoms y $8000, pero eso solo se aplica a la data de la ROM, y no a la RAM
[03:45] <satsu> oh, ok.
[03:45] <@RadioSprite> pero deberías ser capaz de obtener al menos $7F:X100 ^^;
[03:46] <satsu> si, creo que te dije un pocas veces antes que las matemáticas no son mi fuerte. ^^;;;;;
[03:46] <satsu> o el tipeo, como parece. :P
[03:46] * @RadioSprite se encoge de hombro
[03:46] <@RadioSprite> bien, así que ahora sabes que la fuente empieza en RAM, en $7F:1100


**Encontrando las Tiles en la RAM, método con Geiger's Snes9X Debugger (recomendado)

Lo primero es obtener la dirección VRAM que entiende la SNES (SNES VRAM) para esto usamos el Lunnar Addres y ponemos el $02CC13 obtenido antes.


** Nos arroja una dirección SNES VRAM $00:6000. Ahora abrimos la Rom con el Snes9X Debugger y si la Rom aun tiene el header, al abrirla dirá que es necesario quitarle header, ponle que si. Luego se cargará esta pantalla:


** Dale a RUN para empezar el juego, y llega a la parte donde se ve la pantalla negra con ve esos kanjis y el número 6, justo cuando se vaya despareciendo esta frase, has clic en la ventana de Debug y allí selecciona la casilla DMA y dale a RUN y debes fijarte en el log/historial inferior lo que mostrará la Dirección RAM (Ver imagen a). Cuando ya esté le diálogo en pantalla, con la batalla a punto de empezar (Ver imagen b) haz clic en el Log/historial para pausar el debug:

**Imagen a: Con el Debug pausado, buscamos en el Log/Historial algún "6000" y nos encontramos con la dirección RAM: $7F:1100.


** Imagen b: Aquí detén la depuración, haciendo clic fuera de la ventana del juego, con los 5 segundos pasados capturamos la dirección RAm que buscábamos.


Buscando algún Espacio Vacío para poner Rutina DMA más adelante

[03:46] <@RadioSprite> también vas a necesitar un espacio vacío en la ROM para esto, tu sabes
[03:46] <@RadioSprite> un segundo
[03:47] <@RadioSprite> de hecho
[03:47] <@RadioSprite> si decimos que la fuente no comprimida es de 8x8, ha de funcionar igual
[03:47] <satsu> si alguna fuente que no este comprimida es de 4bpp, ¿hay alguna diferencia?
[03:48] <@RadioSprite> ergh, si.
[03:48] <@RadioSprite> mucho en ese caso.
[03:48] <satsu> hay lo que parece ser un espacio libre comenzando en 106500... (** $10:6500 Ver imagen inferior)



[03:49] <satsu> suficiente para a fuente, creo
[03:49] <@RadioSprite> Solo voy a decir que hay un trozo de espacio decente en $FE300. (** $0F:E300 Ver imagen inferior)



[03:49] <satsu> ese también sirve.
[03:49] <@RadioSprite> pero usaremos tu espacio ya que tu te fijaste en ese espacio y este es tu juego y tu tema. (** es curioso que dice que usará el espacio de satsu ya que se usará $1F:E300)
[03:49] <@RadioSprite> recuerda considerar lo que es necesario para la fuente, también lo necesitaremos para el nuevo código.
[03:50] <satsu> hm, déjame ver que tan largo es. (** Tiene que haber suficiente para la rutina DMA)
[03:50] * @RadioSprite se encoge se hombros
[03:50] <@RadioSprite> es cosa tuya ^_^
[03:50] <@RadioSprite> no importa ya que no va a hacer mucho código.
[03:50] <satsu> en cualquier caso, pareciera que el espacio tuyo es mas grande que el mío.


Encontrando la Rutina de Descompresión

[03:52] <@RadioSprite> bien satsu
[03:52] <@RadioSprite> hora de sacar el Snes9x (** Se refiere a un SNES antiguo, de preferencia usa el Snes9X 1.41 trace. Con la tecla / del teclado numérico empiezas la traza y con esa misma tecla la detienes, luego en la carpeta del juego habrá un "Filerna.log" que contendrá toda la Traza "resumida" de esos 4 segundos. Es "resumida" ya que con el SNES Debugger puedes hacer una traza completa de las instrucciones del CPU pero en esos 4 segundos se generan como 15 archivos de 5MB cada uno!)

**Estos son los instantes donde sucede la descompresión de Tiles, por lo que aquí debes hacer la traza, recomiendo usar el
Snes9X 1.41 trace. Finalmente generará un archivo .log de 800 KB aprox.

[03:52] <@RadioSprite> la tecla BLOQ NUM (NUM LOCK) activa el Tracing
[03:53] <@RadioSprite> juega hasta el punto donde se muestra el texto FILERNA 6(kanji)
[03:53] <@RadioSprite> justo antes de la primera batalla
[03:53] <@RadioSprite> cuando el texto se este desapareciendo, pulsa la tecla NUM LOCK
[03:53] <satsu> ok.
[03:53] <@RadioSprite> una vez que la batalla aparece, pulsa NUM LOCK de nuevo para terminar el Trace (** conocido igualmente como Traza)
[03:53] <@RadioSprite> de esta forma, capturamos la rutina de descompresión cuando suceda.
[03:53] <satsu> por cierto, para facilitar la escritura, ese kanji se lee como 'sai'. :P
[03:53] <@RadioSprite> muy bien.
[03:53] <satsu> ok, comenzaré ahora.
[03:54] <@RadioSprite> Hazme saber cuando tengas la traza.
[03:57] <satsu> ¡ups!, 800kb de traza
[03:57] <satsu> ¿supongo que partí muy pronto? :P
[03:57] * @RadioSprite se encoge de hombros
[03:57] <@RadioSprite> quizás si, quizás no
[03:57] <satsu> ok. ¿vamos con ese trace entonces?
[03:58] <@RadioSprite> está bien.
[03:58] <@RadioSprite> Solo necesito jugar con esto un poco
[03:58] <@RadioSprite> veré si puedo encontrar la rutina
[03:59] <@RadioSprite> puede que haya comenzado demasiado antes, hmm
[03:59] <satsu> veré si puedo comenzar mas cercano a la batalla.
[04:00] <@RadioSprite> yo igual.
[04:00] <satsu> excelente, solo obtuve como 600kb esta vez. :P
[04:02] <@RadioSprite> heh :p
[04:02] <satsu> ok, creo que es lo mejor que voy a conseguir.
[04:02] * @RadioSprite cabecea
[04:02] <@RadioSprite> este no es exactamente el mejor juego para enseñarte esto
[04:03] <@RadioSprite> hace cosas muy extrañas
[04:03] <@RadioSprite> pero no obstante, haré el intento
[04:03] <satsu> heh, no creo que alguna vez haya trabajado con algún juego que sea normal. :P
[04:04] <@RadioSprite> hah.
[04:04] <@RadioSprite> Muy bien, de todas formas encontré la rutina.
[04:05] <@RadioSprite> A menudo, cuando ya sabes que la fuente es dumpeada en $7F:1100, puedes sencillamente buscas por algo que siga a $7F:11 en el trace
[04:05] <@RadioSprite> pero eso por lo visto no funciona aquí (** a mi si me funcionó, aunque no es la rutina que buscamos, ver el Log de la carpeta recursos)
[04:05] <@RadioSprite> así que busqué por 1100 y intenté buscar el lugar donde el juego esta cargando $7F y lo colocaba en un sitio similar
[04:06] <@RadioSprite> algo como, si guardo en 1100 el $00A0, va a guardar el $7F en $00A2
[04:06] <@RadioSprite> (por ejemplo.)
[04:06] <@RadioSprite> Entonces busco en la subrutina algún salto (típicamente JSL o JSR)
[04:07] <@RadioSprite> Encontré una, abrí la ROM, y sobrescribí cada byte (** de JSL/JSR) con $EA, el cual cuando es traducido dentro de 65816 es una instrucción "NOP" o "No Operation" (** usar un editor Hex)
[04:07] <@RadioSprite> usando esa información, ve que puedes encontrar.
[04:07] <satsu> hm, ok...
[04:07] <@RadioSprite> ponemos NOPs a la rutina entonces la testeamos y "Sistemáticamente la hacemos caer."
[04:08] <@RadioSprite> Si le pones esos breaks y algo que debería pasar no sucede (como que una ventana no aparezca, por ejemplo) entonces sabes que le diste al clavo.
[04:08] <satsu> ok.
[04:14] <@RadioSprite> sigamos
[04:15] <@RadioSprite> satsu- ¿donde estaba la rutina que le pusiste los breaks?
[04:15] <satsu> ¿para el fondo? (** El fondo del diálogo o el fondo de la ventana azul inferior?
[04:15] <@RadioSprite> Te puedo decir si te estas cerca.
[04:15] <@RadioSprite> si.
[04:15] <satsu> espera un segundo.
[04:15] <@RadioSprite> naturalmente.
[04:16] <satsu> está en 13651F.
[04:16] <@RadioSprite> Creo que te pasaste, pero yo podría estar equivocado.
[04:16] <satsu> espera, ¿en cual notación debe estar? X_X
[04:16] <@RadioSprite> hmm, un segundo.
[04:17] <@RadioSprite> 0-0
[04:17] <@RadioSprite> yo la convierto de atrás para adelante
[04:17] <@RadioSprite> esa es $26/E51F LoROM, ¿cierto?
[04:17] <satsu> bien, en el trace es $26/E51F
[04:17] <satsu> si.


** Como dice RadioSprite, buscamos por LDA/X/Y #1100 y por un LDA/X/Y #$7F y nos encontramos con esta rutina. Donde está en verde es la dirección donde Satsu cree que hay que colocar los NOPs.

[04:17] <@RadioSprite> si, observa ya que te pasaste
[04:18] <@RadioSprite> pero tienes la idea, así
[04:18] <@RadioSprite> que puede que te hayas perdido
[04:18] <@RadioSprite> ya que el JSL que necesitas hacerle break está en $02/895F en el trace.


** Si seguimos buscando solo por si acaso, por la traza alguna LDA/X/Y #$1100 junto con un LDA/X/Y #7F y nos encontramos otra vez con la dirección 26:E61F, que debería ser la rutina que descomprime las fuentes.


Colocando NOP al Salto que lleva a la Rutina

**$02/895F es la dirección a la cual se le hace el NOP. Así que abre la rom con un editor Hex y busca los bytes: A000F3221FE626 (en verde en la imagen superior)
que son los que corresponden a LDY #$F300 y JSL $26E61F. Recuerda ver documento "A 65816 Primer" para saber los opcodes de JSL y otros.



**Una vez encontrado, cambia los bytes que corresponden al salto JSL por EAs:



**Graba y ve el juego en algún emulador (Snes9X o SNES), se verá esto:


**Estamos ok, no se cargaron las tiles inferiores por los EA (NOP) colocados.

[04:18] <@RadioSprite> Afortunadamente para ti, esto lo hace la DMA para que todo lo de VRAM se haga después de ese JSL, así que podemos hacer lo que diablos queramos con el.
[04:18] <satsu> ¡Woohoo!


Copiando Mis Propias Tiles a la Rom

[04:19] <@RadioSprite> Ahora, si no tienes una fuente de 2bpp Pre-preparada para meterla dentro de la ROM (** realizar una copia de Tiles)
[04:19] <@RadioSprite> vas a tener que sacarla de la RAM
[04:19] <@RadioSprite> (o de VRAM, si es mas fácil)
[04:19] <satsu> ok, espera un segundo.
[04:19] * satsu
abre tlp (**Tile Layer Pro)
[04:19] <@RadioSprite> usa lo que normalmente usas para copiar fuentes, tlp, hex workshop, lo que sea
[04:21] <@RadioSprite> Cópialas dentro de la ROM en $FF000


** Aquí es donde insertaremos nuestras fuentes usando Tile Layer Pro. Para esto abre el archivo "Eien no Filena (J)_orig.zs1" y la rom "Filena.smc". Deja ambas en formato GameBoy. En el ZST ve con CONTROL + G (Goto) a la dirección $2CC13 y con la Rom ve a $FF000. Ahora desde el ZST copiamos todas las tiles desde $2CC13 a $2DC13 a la Rom.
Una manera fácil es seleccionando las tiles y con CONTROL+C copiamos y luego cambiamos a la ROM y presionas CONTROL+V para pegarlas allí.



Las tiles copiadas caben justo en ese espacio que se ve en rojo. No se den sobreescribir aquellas tiles que no sean negras o vacías. Salvamos la rom y listo.

[04:21] <satsu>
ok.
[04:21] <@RadioSprite> y ya que estas usando el TLP, -asegúrate- de que esté en el mismo formato que el savestate
[04:22] <satsu> demonios, desearía librarme de esos molestos toolbars del Tile Layer Pro ¬¬
[04:23] <@RadioSprite> Si, en verdad.
[04:26] <satsu> ok, ya están copiadas en la rom ¿y luego?


Ver donde colocar la Rutina DMA

[04:27] <@RadioSprite> Muy bien, déjame comentar esta rutina para ti. Desde aquí es básicamente llenar los espacios en blanco. (** @RadioSprite está haciendo un archivo de texto, enf-dma.txt, con una rutina dentro)
[04:27] <@RadioSprite> no obstante, vas a tener que darme unos pocos minutos, no tengo memorizado todos los registros DMA y tengo que hojear mis documentos
[04:27] <satsu> ok. mientras tanto, me voy a reconectar ya que el tiempo sobre esta sesión, esta yendo lento. (** se refiere al IRC)
[04:28] <satsu> en otras palabras, voy a llenar los metros (** ¿va al baño?). :P
[04:28] <@RadioSprite> hahah, muy bien.
[04:28] *** Desconectado
[04:31] *** Intentando reconectar...
[04:31] *** Reconectado al canal #romhACKing
[04:31] <@RadioSprite> ooh, estas de suerte
[04:31] <@RadioSprite> M activa el Acumulador (** Registro Flag P)
[04:32] <satsu> recuérdame que significa eso. ^^;
[04:32] <@RadioSprite> mejor dicho, M setea el estado del registro
[04:32] <@RadioSprite> lo que significa que el acumulador siempre va a leer un solo byte y no 2 como cuando lee en modo de 16-bit (2-byte). (** si M=1 => Acumulador A en modo de 8 bits, M=0 => A en modo de 16 bits)
[04:32] <@RadioSprite> En tu trace si miras donde dice "P:" podrás ver lo que esta haciendo el registro de estado
[04:33] <@RadioSprite> si la letra está en mayúscula, entonces ese registro está activado
[04:33] <satsu> ok.


**En la imagen se ve el registro de estado P, donde se ve M está en mayúscula, lo que indica que está activada.
M es el flag del acumulador y X el flag de los registros índices X e Y.

[04:33] <@RadioSprite> Si no está activada, tienes que hacer SEP #$20 para activarla (** SEP #$20 deja M en 1 y REP #$20 deja M=0)
[04:34] <@RadioSprite> entonces si deseas asegurarte hace un REP #$20 para limpiar el registro cuando hagas algo así no interfiere con las operaciones normales
[04:34] <@RadioSprite> (siempre tienes que poner las cosas de vuelta de como las encuentras, como dicen los viejos refranes de las mamás)
[04:34] <satsu> ok. :P
[04:42] <@RadioSprite> Casi lo tengo hecho.
[04:43] <satsu> ok.
[04:47] <@RadioSprite> ¿Se puede puede afirmar que sabes como cargar y guardar constantes en 65816?
[04:48] <satsu> en verdad no. vamos rápidamente con ello.
[04:48] <@RadioSprite> bien, entonces
[04:48] <@RadioSprite> dado que el bit M bit es activado en el registro de estado (** registro P), vamos a trabajar con un acumulador de 8-bit
[04:48] <@RadioSprite> (el cual, es en verdad bueno para nuestros propósitos.)
[04:48] <@RadioSprite> LDA carga el acumulador con un valor
[04:49] <@RadioSprite> Dado que el acumulador es cargado tan pronto como nuestra rutina se resuelve (ve el Trace, baja al RTL y después del banco $26 pasa a ser de nuevo $02s)



[04:50] <@RadioSprite>
no necesitamos preservar el valor en el acumulador. ¡Hurra por nosotros!
[04:50] <satsu> ¡si! somos geniales.
[04:50] <@RadioSprite> Ahora, si quieres cargar el acumulador con un valor guardado en ROM...(** Un valor no constante)
[04:50] <@RadioSprite> dado que trabajamos con una LoROM, puedes hacer LDA $8000
[04:50] <@RadioSprite> que carga en A lo que esté en $(DB)/8000
[04:51] <@RadioSprite> donde (DB) es el contenido del Registro Databank, el DBR
[04:51] <@RadioSprite> o DB: en nuestros traces (** En el Log se ve DB:02)
[04:51] <satsu> ok...
[04:51] <@RadioSprite> una forma fácil de cambiar que cargue A con una constante, agregarlo al Stack y luego sacar el DBR afuera del Stack
[04:51] <@RadioSprite> si queremos cargar el acumulador con una constante, decimos LDA #$80
[04:52] <@RadioSprite> que copia el valor #$80 dentro del acumulador
[04:52] <@RadioSprite> el signo # significa una constante
[04:52] <@RadioSprite> (también nota que podemos hacer LDA #$808000 para cargar directamente desde la rom sin considerar lo que esté en DBR, debí haberlo mencionado antes.)
[04:52] <@RadioSprite> er
[04:52] <@RadioSprite> quise decir LDA $808000. (** LDA #$808000 no se puede hacer, ya que estarías metiendo en A 32 bits, y solo soporta como máximo 16 bits)
[04:52] <satsu> ok.
[04:53] <@RadioSprite> Pero dado que solo cargaremos lo que haya en $808000, si lo que hay en $808000 es una constante (Read Only Memory, recuerda) sería algo sin sentido. (** muy importante ya que ya cuando se hace por ejemplo LDA $0A, si adentro hay una constante 1, es mejor hacer directamente LDA #$01. LDA $XXXXXX se usa para almacenar valores variables)
[04:53] <@RadioSprite> No quiero entrar en cargas indexadas o indirectas, eso sería tema de otra clase.
[04:53] <satsu> así que por lo visto, ¿buscaremos donde dice "saca esto de la RAM", y cambiarlo por "saca esto de la ROM"?
[04:53] <@RadioSprite> ...mas o menos, pero no exactamente.
[04:54] <@RadioSprite> Vamos a sobreescribir la rutina que saca desde la rom y hace todo una "cosa" binaria y lo copia a RAM con nuestra propia rutina que solo saca datos de ROM y los copia a RAM sin la "cosa" binaria.
[04:55] <satsu> ah, entiendo.
[04:55] <@RadioSprite> tienes que entender la idea
[04:55] <satsu> eso fue de hecho lo que pensaba, antes de que me dijeras acerca de cargar directamente de la rom. ^^
[04:55] <@RadioSprite> pero en vez de sacarla de la ram, vamos a sacarla de la rom y ponerla en la ram.
[04:55] <@RadioSprite> Bien, podríamos cargar directamente desde rom, pero eso es lento y tedioso
[04:56] <@RadioSprite> ¡así que usaremos las capacidad de transferencia de alta velocidad de la SNES!
[04:56] <satsu> ¡y nadie quiere cosas tediosas!
[04:56] <satsu> ok.
[04:56] <@RadioSprite> Escribimos unos pocos bytes en registros especiales y con eso hacemos todo mas rápido que si lo hiciéramos con una rutina diferente.
[04:56] <@RadioSprite> Por ahora, todo lo que necesitamos saber es que JSL <dirección $24 bit> saltará a una nueva subrutina de 24 bit que especificaremos (** saltará a nuestra propia rutina)
[04:57] <@RadioSprite> RTL nos retornará de la subrutina
[04:57] <satsu> ok.
[04:57] <@RadioSprite> ese LDA #$80 cargará la constante #$80 dentro del acumulador
[04:57] <@RadioSprite> y el STA $dirección copia el contenido del acumulador dentro de la dirección que especificamos.
[04:57] <@RadioSprite> En este caso, las direcciones que especificamos son registros especiales que controlan transferencia DMA de alta velocidad de la SNES.
[04:58] <satsu> (fanfarrea)
[04:58] <@RadioSprite> nota que asm2hex es un programa en DOS, estamos bajo la restricción 8.3 (** "cada nombre de archivo debe tener un máximo de ocho caracteres de nombre propiamente dicho más un máximo de tres caracteres de extensión, separada del nombre por un punto")
[04:58] <@RadioSprite> al cual casi siempre me apego por si acaso
[04:59] <satsu> ok.
[04:59] <@RadioSprite> En el archivo de texto he explicado como el DMA funciona, con mi rutina de ejemplo
[04:59] <@RadioSprite> así que todo lo que necesitas es llenar los espacios en blanco de "asm enf-dma.txt" y debería andar.
[04:59] <satsu> ¡vale!
[05:00] <@RadioSprite> Hazme saber si tienes problemas, llenaré los blanco por mi cuenta.
 


Rutina DMA enf-dma.txt

**
La Rutina propuesta y que debes completar los espacios en blanco, se puede ver aquí.

[05:00] <satsu> muy bien.
[05:03] <@RadioSprite> Bingo, conseguí que funcionara ^_^
[05:04] <satsu> tardaré unos pocos minutos, voy a tratar de entenderlo. Creo que lo estoy pillando. ^^
[05:05] <@RadioSprite> ¡seguro!
[05:05] <satsu> ¿son los últimos 3 espacios #$00, #$F0 y #$9F?
[05:07] <@RadioSprite> ESTAS CERCA.
[05:07] <@RadioSprite> Pero no mucho.
[05:07] <@RadioSprite> Filerna es un LoROM $00, y no LoROM $80.
[05:07] <satsu> ah, ya veo.
[05:07] <@RadioSprite> (Puedes confirmarlo mirando los tracelogs, si todos los bancos fueran de $80 hacia arriba, estarías en lo correcto.) (** En el LOG se ve que los banco son 00/, 02/.., es decir, una LoRom $00)
[05:08] <@RadioSprite> Y pareces que olvidaste lo del largo en los espacios en blanco :)
[05:08] <satsu> oh si.
[05:08] <satsu> no me di cuenta de los scrollbar, oops.
[05:09] <satsu> diablos, escribí abajo el número de bytes cuando copiaba y pegaba del savestate. :P
[05:10] <satsu> ¿quieres el SPC de Filerna mientras esperas? :P (** SPC: dumpeo del chip SPC700 que se encarga de la música de la SNES)
[05:10] <@RadioSprite> heh ^_^
[05:11] <satsu> ok. ¿el largo de lo bancos son #$30 y #$0F?
[05:11] <@RadioSprite> er, no :p
[05:11] <@RadioSprite> ni cerca ^^;
[05:12] <satsu> hm.
[05:12] * satsu relee el comentario
[05:13] <satsu> hm, estoy algo perdido
[05:13] <@RadioSprite> bien entonces
[05:13] <@RadioSprite> ¿qué tan grande es el trozo de datos?
[05:14] <@RadioSprite> estas transfiriendo la fuente completa, verdad
[05:14] <@RadioSprite> ¿comienza en $FF000, y termina donde? (** Recuerda que satsu copio allí sus fuentes, al igual que nosotros)
[05:14] <satsu> si.
[05:14] <satsu> $FFFD0 (** FFFD0 - FF000 = $FD0 bytes)
[05:14] <@RadioSprite> no muy cerca
[05:14] <@RadioSprite> debiste olvidar accidentalmente algunas tiles
[05:15] <@RadioSprite> salva en la batalla, y saca toda la fuente de la VRAM
[05:15] <satsu> ok, espera.
[05:17] <satsu> gracias a dios que en diálogo de la batalla no usan fuentes separadas. ¬¬
[05:17] <@RadioSprite> hahah, si, eso requeriría algo de magia para corregirlo
[05:18] <satsu> si. aunque no tengo la sombra en la batalla. :(  (** al parecer sastu copió las tiles sin la sombra)
[05:18] <@RadioSprite> No creo que sea algo que pueda enseñarte en una simple sesión de tutorial, esta ya ha durado 2 horas
[05:18] <satsu> si, en verdad. :P
[05:18] <@RadioSprite> ...yo le agrego la sombra por ti
[05:18] <@RadioSprite> pero no creo que quiera intentarlo
[05:18] <satsu> ah, no te preocupes por esto.
[05:19] <satsu> hm, parece que tengo la fuente completa. x_x
[05:19] <@RadioSprite> es extraño
[05:20] <@RadioSprite> ¿donde está, hmm?
[05:20] <satsu> ¿Donde termina?
[05:20] <@RadioSprite> los últimos tiles deberían ser los bordes de pantalla
[05:20] <@RadioSprite> el último debería estar en blanco (** fíjate que el último tile que copiamos está vacío)
[05:20] <satsu> si, solo agregué 2 tiles blancas solo para asegurarme.
[05:20] <@RadioSprite> ¿Asegurarte de qué? o_O
[05:21] <@RadioSprite> ¿de lo que está mostrando?
[05:21] <satsu> no lo se, quizás se usen en algún lugar. :P
[05:21] <@RadioSprite> ¿entonces estás aun intentando hacer un break para asegurarte que funcione?
[05:21] <@RadioSprite> si es eso lo que estas haciendo, está bien
[05:21] <@RadioSprite> pero pongámonos en el caso de que se transfieren todo el bloque de $1000 de datos
[05:22] <satsu> #$00 y #$10, bien
[05:22] <@RadioSprite> porque probablemente necesitarás poner esos tiles de vuelta, y te preguntarás porque no se están mostrando:p
[05:22] <@RadioSprite> si.
[05:23] <satsu> hm, espera un segundo.
[05:26] <satsu> todavía tengo que llenar mi primer set de blancos. Vamos a escribir la misma dirección en la RAM como estaba en el juego, ¿verdad? (** 0F:F000)
[05:28] <@RadioSprite> Correcto.
[05:28] <@RadioSprite> O, si prefieres, puedes escribir en otro lado y ver que vomita el juego.
[05:28] <satsu> quizás para otra ocasión.
[05:29] <satsu> ¿es 7F:1121, verdad?
[05:29] <satsu> espera, creo que me perdí de nuevo. :P
[05:29] <@RadioSprite> si :p
[05:30] <@RadioSprite> excepto que quieras hacer que el juego vomite ^_
[05:30] <@RadioSprite> ^
[05:30] * @RadioSprite murmulla algo como "editando esto luego"
[05:30] * satsu escribe futuros mensajes en código borroso pata futuras personas
[05:31] <satsu> ok. así que, en el savestate, la fuente empieza en 011D33. Así que resto C12 desde el inicio, ¿si?
[05:32] <@RadioSprite> resta $C13.
[05:32] <satsu> ah, ok.
[05:32] <@RadioSprite> y este no comienza en verdad en 011D33
[05:32] <@RadioSprite> comienza en 011D13, pero allí solo hay 2 tiles en blanco
[05:32] <satsu> !!
[05:33] <satsu> ok, después de hacer esto, necesito corregir mi ROM. :P
[05:33] <@RadioSprite> generalmente hablando, la mayoría de los juegos escriben direcciones con al menos 2 ceros al final :p
[05:33] <@RadioSprite> heheh ^^;
[05:33] <satsu> ok, de cualquier forma, después de restar lo del header tengo 011120. (** 011D33 - C13) Así que solo tengo que convertir eso dentro de dirección RAM, ¿verdad?
[05:35] <@RadioSprite> Otra vez estas trabajando con la vieja dirección :p
[05:35] <satsu> oh si.
[05:35] <@RadioSprite> Necesitas estar trabajando con 011D13, recuerda
[05:35] <satsu> ok, entonces luego de hacerlo obtuve 011100.
[05:36] <satsu> la cual es 7f:1100, ¿cierto?
[05:36] <@RadioSprite> bien
[05:36] <@RadioSprite> bien, pero mejor re-lees los comentarios antes de meter 7f1100 dentro de los registros  (** se refiere a los comentarios del txt)
[05:36] <satsu> si, lo tengo
[05:36] <satsu> así ¿lo que va dentro de los espacios es 00, 11 y 01?
[05:37] <@RadioSprite> ¡si!
[05:37] <satsu> ¡yay!
[05:37] * satsu se ríe burlonamente
[05:38] <satsu> mientras ordeno esta fuente, ¿debo enviarte lo que tengo?
[05:38] <satsu> mas fácil que leer los blancos y copiar trozos de códigos a la vez.
[05:38] <@RadioSprite> ¿funciona?
[05:38] <@RadioSprite> nah
[05:38] <satsu> no lo he intentado aun, porque tengo que corregir la fuente.
[05:38] <satsu> ok.
[05:38] <@RadioSprite> sabrás si está mala
[05:38] <satsu> heh. :P
[05:42] <satsu> ok. espero que funcione. :P
[05:43] <satsu> ¿la sintaxis para ASM.exe es ASM enf-dma.txt filerna.smc?
[05:43] * @RadioSprite cruza los dedos
[05:43] <@RadioSprite> no
[05:44] <@RadioSprite> ya que ya hay una linea con %filename en el enf-dma.txt
[05:44] <@RadioSprite> puedes omitir el filerna.smc
[05:44] <satsu> ok.
[05:44] <satsu> hm, me dice que tengo un error de sintaxis. :P
[05:45] <satsu> "enf-dma.txt: 3: syntax error at or before '#'.
[05:45] <satsu> #ROMTYPE LOROM
[05:45] <satsu> demonios, lo recuerdo de LaL. :P (** LaL ?)


**Usa la versión ASM2Hex que está en la carpeta recursos y no tendrás problemas.
Usalo en DOS así: >asm enf-dma-esp.txt

[05:46] <@RadioSprite>
si, parece que tienes una versión antigua del asm2hex
[05:46] <@RadioSprite> y desafortunadamente, lordtech no le puso versión
[05:46] <satsu> lo saqué de romhacking.com...
[05:46] <satsu> digo .org
[05:46] <@RadioSprite> déjame enviarte la versión que yo tengo, lo pondré en el paquete con el log
[05:46] <satsu> ok.
[05:46] <satsu> ehh, está aclarando afuera, creo que voy a dormir mucho hoy.
[05:47] <@RadioSprite> vas a tener que hacer dccallow (**un comando de IRC)
[05:47] <satsu> $^%%$"&^%£"^dccallow
[05:47] <@RadioSprite> si ¬¬
[05:47] <satsu> %$&^^%£%"$^agregado
[05:48] <satsu> ¡ok! ¡vamos a probar!
[05:49] <@RadioSprite> ¡muy bien!
[05:49] <satsu> ¡por poco!
[05:49] <satsu> parece ser que se perdieron algunos bordes de la ventana, y la marca -.
[05:49] <@RadioSprite> ¿la marca -?
[05:49] <satsu> para los katakana.
[05:50] <satsu> hm, la marca de " igual.
[05:50] <@RadioSprite> hmm.
[05:50] <satsu> y hiragana @_@
[05:50] <@RadioSprite> ¿estas seguro que pusiste el largo correcto?
[05:51] <satsu> deja chequearlo.
[05:52] <satsu> hm. tengo 0A00 como largo, el cual estoy seguro que esta malo.
[05:52] <satsu> probablemente un error temprano de cálculo.
[05:53] <@RadioSprite> heh, definitivamente es eso.
[05:53] <satsu> ¿era 1000?
[05:55] <@RadioSprite> sip
[05:55] <satsu> hm. tengo 00 y 10 en los espacios en blanco, pero lo sigue mostrando mal.
[05:55] <satsu> quizás tenga mala la dirección de lectura inicial, pero obtengo bien el katakana de "filerna".
[05:56] <@RadioSprite> ¿que tienes en los campos donde va la dirección de inicio?
[05:56] <satsu> 00. F0 y 1F.
[05:57] <@RadioSprite> eso debería estar bien.
[05:57] <satsu> hmm.
[05:58] <@RadioSprite> Así que tienes $00, $11, $01
[05:58] <@RadioSprite> $00, $F0, $1F
[05:58] <satsu> si.
[05:58] <@RadioSprite> $00, $10
[05:58] <satsu> sip.
[05:58] <satsu> de nuevo creo que se me fue algo de la fuente.
[05:58] <@RadioSprite> ¿y copiaste los $1000 completos en $FF0000? (** se equivocó ya que es $FF000)
[05:59] <satsu> si, esta todo allí.
[06:00] <satsu> ¿comienza con 2 tiles blancas, verdad?
[06:00] <@RadioSprite> Envíame una imagen de tu ventana del TLP.
[06:00] <@RadioSprite> en $FF000
[06:03] <@RadioSprite> si, olvidaste copiar algo de la fuente de nuevo :p
[06:03] <satsu> oh. ¿donde me equivoqué?
[06:03] <@RadioSprite> en la parte inferior pero (partiendo con la parte baja de la ventana de dialogo) debería ser 2 tiles más a la derecha
[06:04] <@RadioSprite> quise decir la pequeña parte de abajo
[06:04] <@RadioSprite> el cual probablemente notarás si miras de nuevo la fuente en VRAM
[06:04] <@RadioSprite> $2CC13
[06:05] <satsu> ok, gracias
[06:07] <@RadioSprite> ah, pero
[06:07] <@RadioSprite> ¿Me imagino que tienes tu fuente en vram?
[06:07] <@RadioSprite> así que si quieres usa un viejo savestate o una rom no hackeada para sacar la fuente
[06:07] <satsu> si, eso es lo que voy a hacer...
[06:08] <@RadioSprite> ok, solo chequea ^_^
[06:08] <@RadioSprite> veremos todas las alternativas
[06:08] <satsu> ah, veo mi ?? (** slaik ?).
[06:09] <@RadioSprite> Eso es bueno, sin embargo, aprendes más con los errores.
[06:09] <@RadioSprite> No me refiero a que nunca se aprende si no tienes errores, así que probablemente no es verdad
[06:10] <satsu> si. y espero que quien quiera que lea esto, está aprendiendo de muchos de mis errores.
[06:10] <@RadioSprite> pero tu puedes aprender de los errores, y espero que no cometas el mismo error otra vez
[06:10] <@RadioSprite> o si no, tendrás que reconocer tu error mejor.
[06:10] *** Hakai-zo (ZenMaster@h0005022d946a.ne.client2.attbi.com) has joined #romhacking
[06:10] *** ChanServ sets mode: +o Hakai-zo
[06:10] <@Hakai-zo> Zen!
[06:10] *** Hakai-zo (ZenMaster@h0005022d946a.ne.client2.attbi.com) has left #romhacking
[06:11] <satsu> heh.
[06:12] <satsu> ¡victoria!
[06:12] <@RadioSprite> ¡Genial!

**La Rutina resuelta se puede ver aquí.


**Si lo hiciste bien, el diálogo y el cuadro azul inferior se deberían ver igual que antes. Ahora puedes probar a cambiar la fuente, algo que no podías antes por estar comprimida :)

**Ahora con DMA podemos cambiar las fuentes, agregar acentos u otros símbolos especiales.

[06:12] <@RadioSprite> Ahora, algo sabes de como hacer una transferencia DMA
[06:12] <@RadioSprite> puedes irte a dormir contento ¿o no?
[06:13] <satsu>
bien, no realmente.
[06:13] <@RadioSprite> Ok, quizás no, but it sure didn't hurt. (**?)
[06:13] <satsu> creo que antes de ir a dormir editaré la fuente para que coincida con los cambios que hice a la fuente de 4bpp.
[06:13] * @RadioSprite cabecea
[06:13] <satsu> ¡de todas formas!
[06:13] <satsu> muchas gracias por la lección. La aprecio mucho.
[06:13] <@RadioSprite> y eso es todo.
[06:13] <@RadioSprite> Espero haber sido un buen profesor.
[06:13] <@RadioSprite> Es la primera vez que intento hacer algo como esto.
[06:14] <satsu> @_@
[06:14] <satsu> creo hiciste un buen trabajo.
[06:14] <@RadioSprite> Idealmente, esta lectura particular debería ser parte de un curso, y no tendría que haber tratado el tema de modos de direccionamiento y como cargar y almacenar y notaciones y lo demás
[06:14] <@RadioSprite> ni como encontrar un rutina
[06:15] <satsu> bien, de todas formas eso estuvo bien ya que no sabía ninguno de esos tema.
[06:15] <@RadioSprite> pero en general, estoy contento como salió esto.
[06:15] <satsu> demonios, recién recuerdo que edité los nombres de monstruos. Quizás dormiré antes de trabajar algo mas en el juego.
[06:15] <satsu> Además, ni siquiera puedo teclear bien ya.
[06:15] <@RadioSprite> Hah, ok :)
[06:16] <@RadioSprite> De todas formas me alegra poder ayudar.
[06:16] <satsu> si, siendo posible leer los nombres y demás en la pelea es probablemente la parte más importante de este parche ^^;
[06:16] <@RadioSprite> Bien, estas haciendo el siguiente dialogo, ¿cierto?
[06:17] <satsu> si, si consigo un traductor.
[06:17] <@RadioSprite> Deberías solo copiar lo trozos de datos dentro de MO's board (*un foro* ?)
[06:17] <@RadioSprite> y/o submit a whirlpool ad (**?)
[06:17] <satsu> bien, he ingresado un ad... (**ad??)
[06:17] <@RadioSprite> hrm, oh si
[06:17] <@RadioSprite> eso esta bien
[06:18] <@RadioSprite> estabas en el primer ad o luego de mi Heian Fuuunden ad. (** ?)
[06:18] <satsu> ph33r.
[06:18] <satsu> hm. ¿estaba en lennus 2 o algo parecido que tenia todos los datos de monstruos entre los nombres de monstruos?
[06:18] <satsu> de hecho, ¿fue uno de los romasagas?
[06:19] <@RadioSprite> Bien, seguro fue Blue Sphere :p
[06:19] <satsu> heh. Creo que filerna hace eso igual. :P
[06:19] <satsu> noté muchas más de esas mierdas que las normales entre los nombres. :P
[06:19] <@RadioSprite> bien, de hecho, tiene sentido
[06:19] <@RadioSprite> carga todo de una pasada
[06:19] <satsu> si, es verdad. Aunque me pregunto por qué es tan poco común :P
[06:20] <@RadioSprite> en vez de sacar piezas de 15 diferentes lugares de la rom
[06:20] <@RadioSprite> dicho sea de paso, Neil_ está feliz de tener un nuevo artículo.
[06:20] <satsu> si, me lo imagino.
[06:21] <satsu> te enviaré otro SPC de filerna y luego ire a la cama.
[06:21] <@RadioSprite> ok
[06:21] <@RadioSprite> Creo que voy a la cama igual
[06:21] <@RadioSprite> esto fue agotador :p
[06:21] <satsu> de paso, ¿allá no es medianoche?
[06:21] <@RadioSprite> pero luego, quizás debería trabajar en RS2 (** Romancing Saga 2) y terminar de corregir los últimos bits de la rutina del intro
[06:21] * @RadioSprite hora am Tuesday, August 6, 2002 1:29:28 AM
[06:21] <satsu> La hora local actual en Gran Bretaña es 6:21:55 AM
[06:21] <satsu> ¡te sorprendí!
[06:22] <@RadioSprite> La última semana me fui a la cama a las 7 AM :p
[06:22] <satsu> ayer me fui a la cama a las 7am. :P
[06:22] <@RadioSprite> heheh
[06:22] <@RadioSprite> de cualquier forma, ajusta el log para que se vea como html, y envíamelo o algo
[06:22] <@RadioSprite> mañana, no ahora
[06:23] <satsu> ok. ¿Hay algo que pueda hacer mientras ??? (** something i can run it through to make it html kosher?)
[06:23] * satsu flojea
[06:23] <@RadioSprite> No tengo idea, nunca he posteado un log IRC log en algún lugar.
[06:23] <@RadioSprite> pero los <RadioSprite>s y <satsu>s no se verán apropiadamente.
[06:23] <satsu> si, estarán todos coloreados. :P
[06:24] <@RadioSprite> hehe
[06:24] <satsu> en mi configuración de mi Mirc, los nick se ven de color naranjo brillante. :P
[06:24] <@RadioSprite> bien, no se ven coloreados, o algo así
[06:25] <satsu> yay, encontré algo.
[06:25] <satsu> muy bien, en cualquier caso, ahora me voy a la cama.
[06:25] <satsu> dice buenas noches satsu.
[06:25] <@RadioSprite> ok, nos vemos.
[06:25] <satsu> y gracias de nuevo.
[06:25] *** Disconnected
Session Close: Tue Aug 06 06:25:50 2002


Volver
blog comments powered by Disqus
2003 - 2018    La Web de Dark-N