Registrarse

FR | [En proceso] [ASM] Show OAM

Estado
Cerrado para nuevas respuestas.

Invert

why so serious?


Show Oam


Explicación

Esta rutina muestra sprites de 64x64 en su tamaño total y con el atributo de que puedes mostrar más de una a la vez además de manipular las coordenadas de la imagen.

¿Recibe Parámetros?: Sí.
  • var 8001: ID de la imagen
  • var 8002: Coordenada x
  • var 8003: Coordenada Y

¿Devuelve Parámetros?: No.

Instalación

Instalar el siguiente codigo:

Show Oam
Código:
.thumb
.global mugs
.thumb_func 

PUSH    {R4-R6,LR}
ldr r0, =0x020370ba @var 8001
ldrb r0,[r0]
mov r2,#0x10
mul r2,r0
ldr r1, =0x8800000 @table
add r6,r1,r2
mov r0, r6
ldr r3, =0x80086DD @gpu_tile_obj_alloc_tag_and_upload
bl bx_r3
add r6,#8
mov r0, r6
ldr r3, =0x8008929 @gpu_pal_obj_alloc_tag_and_apply
bl bx_r3
ldr r5, Data @Template
@X POS
ldr r1, =0x20370BC @var 8002
ldrh r1, [r1]
lsl    r1, r1, #0x10
mov r2, #0x00
lsl r2, r2, #0x0e
add r1, r1, r2
asr r1, r1, #0x10
@Y POS
ldr r7, =0x20370BE @var 8003
ldrh r2, [r7, #0x0]
lsl r2, r2, #0x10
mov r3, #0x00
lsl r3, r3, #0x0e
add r2,r2,r3
asr r2, r2, #0x10
mov r3, #0x0
mov r0, r5
@right
ldr r4, =0x8006F8D
bl bx_r4
POP     {r4-r6,PC}
.ltorg
 
bx_r3:
bx r3
 
bx_r4:
bx r4

.align 2
Data: .word BUFFErDATA + 0x08FB0300
BUFFErDATA:
.hword 0x1b58
.hword 0x1b58
.word 0x08453184
.word ANIMATION + 0x08FB0300
.word 0x0
.word 0x08231CFC
.word 0x0810BB89
.byte 0xFF

.align 2
ANIMATION: .word OAMANIM + 0x08FB0300
OAMANIM:
.hword 0x0
.hword 0xf
.hword 0xFFFE
.hword 0x0
Nota:
Cambiar los siguientes paramentros:
Table: 0x8800000 @Es el offset de tu tabla.
Rutina: 0x08FB0300 @Es el offset de la rutina.

Ejemplo de la tabla
Código:
Este es la entrada de una imagen en la tabla.
78 97 0C 09 00 08 58 1B DC FF 00 09 58 1B 00 00

[LIST]
[*]78 97 0C 09: Es el offset de la imagen.
[*]00 08: Es el tamaño de la imagen.
[*]58 1B: Tag de la imagen.
[*]DC FF 00 09: Es el offset de la paleta.
[*]58 1B: Tag de la paleta.
[*]00 00: Relleno.
[/LIST]
Instruciones de uso

EJEMPLO DE USO
Código:
#dynamic 0x800000
//---------------
#org @inicio
setvar 0x8001 0x0 @Imagen #1
setvar 0x8002 0x0 @Coordenada X
setvar 0x8002 0x0 @Coordenada Y
callasm 0x900000 @Aqui va el offset de la rutina llamada "Show Oam"
end
Nota:
Se puede mostrar varias imágenes con esa rutina sin necesidad de escribir el slot de la paleta, yo intenté con 3 y funcionó sin ningún problema.

Nota 2:
La rutina está en proceso porque aún debo hacer un método para desaparecer las imágenes una por una, haber que aparezcan los que saben sobre OAM y hagan su magia porque no tengo idea de como hacerlo xD.

PD: Gracias a Kaiser por explicarme la estructura de la tabla :p:D.



 

Samu

Miembro insignia
Miembro insignia
Para borrar instancias de la OAM el juego tiene una rutina que puedes denominar "deleteOAM" o como te de la gana, esta rutina está en "08007281"(FR) y "080080E9"(EM). Para que la rutina borre la instancia OAM que deseas has de "pasarle" la dirección del bufferOAM de la WRAM de dicha instancia en el registro r0.
El bufferOAM en la WRAM se encuentra en "0202063C"(FR) y "02020630"(EM), el buffer de cada una de las instancias ocupa 0x44 bytes.

PD: Si intentases borrar los datos de la OAM "a lo bestia", sobrescribiendo los datos de esa región, sería como tocarse las pelotas a dos manos. El buffer reescribiría la OAM en el siguiente ciclo de DMA. No se si me he explicado del todo bien pero vaya, aquí lo dejo que tengo que comer.
 

Gold

Porrero a tiempo parcial
Miembro insignia
Se ve muy bien la rutina, pero me pregunto si estos OAM son afectados por la rutina de D&N, porque las otras si son afectadas y no se ven bien en exteriores.

Gran trabajo!
 

Samu

Miembro insignia
Miembro insignia
Re: Respuesta: FR | [En proceso] [ASM] Show OAM

~Ruki!;403704 dijo:
Se ve muy bien la rutina, pero me pregunto si estos OAM son afectados por la rutina de D&N, porque las otras si son afectadas y no se ven bien en exteriores.

Gran trabajo!
Sí, las paletas de los gráficos que cargues como instancias de la OAM con esta rutina se van a ver afectados por el DNS (siempre que se apliquen los filtros de iluminación). Esto se debe a que los gráficos de la OAM utilizan las paletas "foreground" o paletas "OW/overworlds" (las que se encuentran a la derecha en la vista de paletas del VBA).
Para evitarlo puedes hacer dos cosas, una más sencilla (pero algo más chapuza) y otra más compleja (pero más completa):
  • Forma sencilla:
Cuando vayas a insertar el DNS, en las paletas que sepas que se van a cargar o vas a cargar las paletas de los gráficos de los sprites de la OAM quitas la palomita (esto marca que los filtros de iluminación no se aplicarán sobre estas paletas).
En la imagen puedes ver como he quitado las paletas 14 y 15.



  • Forma compleja:
Se trata de hacer una rutina o una modificación en la rutina del DNS que se encargue de evitar la modificación de una de las paletas cuando se este aplicando la rutina de mostrar imagenes de este post. (Sinceramente no se si merece la pena).


De cualquier manera yo no le veo demasiado problema, a mi me gusta que todos los gráficos se vean afectados por la iluminación, es lo suyo ¿No?.
 

Gold

Porrero a tiempo parcial
Miembro insignia
Respuesta: Re: Respuesta: FR | [En proceso] [ASM] Show OAM

Sí, las paletas de los gráficos que cargues como instancias de la OAM con esta rutina se van a ver afectados por el DNS (siempre que se apliquen los filtros de iluminación). Esto se debe a que los gráficos de la OAM utilizan las paletas "foreground" o paletas "OW/overworlds" (las que se encuentran a la derecha en la vista de paletas del VBA).
Para evitarlo puedes hacer dos cosas, una más sencilla (pero algo más chapuza) y otra más compleja (pero más completa):
  • Forma sencilla:
Cuando vayas a insertar el DNS, en las paletas que sepas que se van a cargar o vas a cargar las paletas de los gráficos de los sprites de la OAM quitas la palomita (esto marca que los filtros de iluminación no se aplicarán sobre estas paletas).
En la imagen puedes ver como he quitado las paletas 14 y 15.



  • Forma compleja:
Se trata de hacer una rutina o una modificación en la rutina del DNS que se encargue de evitar la modificación de una de las paletas cuando se este aplicando la rutina de mostrar imagenes de este post. (Sinceramente no se si merece la pena).


De cualquier manera yo no le veo demasiado problema, a mi me gusta que todos los gráficos se vean afectados por la iluminación, es lo suyo ¿No?.
Con la rutina de paletas dinamicas veo no muy viable este metodo, pues los slots con esa rutina son asignados automaticamente y nunca caen en el mismo slot.
 

Samu

Miembro insignia
Miembro insignia
Re: Respuesta: Re: Respuesta: FR | [En proceso] [ASM] Show OAM

~Ruki!;403751 dijo:
Con la rutina de paletas dinamicas veo no muy viable este metodo, pues los slots con esa rutina son asignados automaticamente y nunca caen en el mismo slot.
Siempre se me olvida que en Fred usáis el puto sistema de paletas dinámicas para las paletas de los OW. Desconozco como funciona exactamente esa rutina, pero vaya, el problema no tiene una solución sencilla. Para plantear cualquier tipo de solución hay que saber como funciona la rutina de paletas dinámicas y saber como funciona la rutina del DNS.
De lo segundo todo lo que quieras, pero de la primera yo no tengo ni puta idea, así que me temo mucho que no puedo solucionar ese problema.

En líneas generales lo que tendrías que hacer es una modificación de la rutina DNS que evite la aplicación del filtro de iluminación en ciertas paletas. Esto se hace teniendo en cuenta el slot de paleta que ha usado la rutina de paletas dinámicas para la instancia del OAM (por esto es necesario saber como funciona exactamente, en algún lugar de la RAM tiene que escribir que slot usa).
 

CompuMax

Discord: CompuMax#0425
Miembro insignia
Respuesta: Re: FR | [En proceso] [ASM] Show OAM

Para borrar instancias de la OAM el juego tiene una rutina que puedes denominar "deleteOAM" o como te de la gana, esta rutina está en "08007281"(FR) y "080080E9"(EM). Para que la rutina borre la instancia OAM que deseas has de "pasarle" la dirección del bufferOAM de la WRAM de dicha instancia en el registro r0.
El bufferOAM en la WRAM se encuentra en "0202063C"(FR) y "02020630"(EM), el buffer de cada una de las instancias ocupa 0x44 bytes.

PD: Si intentases borrar los datos de la OAM "a lo bestia", sobrescribiendo los datos de esa región, sería como tocarse las pelotas a dos manos. El buffer reescribiría la OAM en el siguiente ciclo de DMA. No se si me he explicado del todo bien pero vaya, aquí lo dejo que tengo que comer.
Primero que nada excelente aporte. Ya me iba a poner a crear una y me encuentro con esto :D

Lo que has dicho suena interesante. Tendrás alguna rutina para compartir? ¿:. Me vendría como anillo al dedo! Así no vacío la OAM por SWI :p
 

jiangzhengwenjz

Usuario mítico
Re: Respuesta: Re: FR | [En proceso] [ASM] Show OAM

Primero que nada excelente aporte. Ya me iba a poner a crear una y me encuentro con esto :D

Lo que has dicho suena interesante. Tendrás alguna rutina para compartir? ¿:. Me vendría como anillo al dedo! Así no vacío la OAM por SWI :p
Handling data directly from memory, is always not recommended. (The game always use DMA transfer, buffer, etc. lol) Basically, what we need to do is just to find built-in functions to accomplish our goal. You can find some really useful OAM functions in my github repositories.
 
Estado
Cerrado para nuevas respuestas.
Arriba