Add packed_sprite_oam macro and dumping script, dump duskull spritesheet oam entries

This commit is contained in:
Marcus Huderle 2025-07-14 09:17:17 -05:00
parent 4c8d5a9871
commit 9b8360eaf4
6 changed files with 152 additions and 23 deletions

View File

@ -1,2 +1,3 @@
.include "asm/macros/function.inc"
.include "asm/macros/label.inc"
.include "asm/macros/sprite_oam.inc"

View File

@ -0,0 +1,4 @@
.macro packed_sprite_oam x, y, affineMode, objMode, mosaic, bpp, shape, matrixNum, hFlip, vFlip, size, tileNum, priority, paletteNum
.4byte ( ((\y) & 0xFF) | (((\affineMode) & 0x3) << 8) | (((\objMode) & 0x3) << 10) | (((\mosaic) & 0x1) << 12) | (((\bpp) & 0x1) << 13) | (((\shape) & 0x3) << 14) | (((\x) & 0x1FF) << 16) | (((\matrixNum) & 0x7) << 25) | (((\hFlip) & 0x1) << 28) | (((\vFlip) & 0x1) << 29) | (((\size) & 0x3) << 30) )
.2byte ( ((\tileNum) & 0x3FF) | (((\priority) & 0x3) << 10) | (((\paletteNum) & 0xF) << 12) )
.endm

View File

@ -4,6 +4,7 @@
#include "constants/species.h"
#include "constants/bg_music.h"
#include "gba/io_reg.h"
.include "asm/macros.inc"
gUnknown_08055A68:: @ 0x08055A68
.2byte AREA_FOREST_RUBY
@ -3439,8 +3440,44 @@ gUnknown_086B9AB8:: @ 0x086B9AB8
gUnknown_086B9DAC:: @ 0x086B9DAC
.incbin "baserom.gba", 0x6B9DAC, 0x2F4
gUnknown_086BA0A0:: @ 0x086BA0A0
.incbin "baserom.gba", 0x6BA0A0, 0x1380
gDuskullSpritesheetOam:: @ 0x086BA0A0
packed_sprite_oam x=0x0, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x0, matrixNum=0x0, hFlip=0x0, vFlip=0x0, size=0x2, tileNum=0x49, priority=0x1, paletteNum=0x2
packed_sprite_oam x=0x20, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x2, matrixNum=0x0, hFlip=0x0, vFlip=0x0, size=0x1, tileNum=0x59, priority=0x1, paletteNum=0x2
packed_sprite_oam x=0x0, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x0, matrixNum=0x0, hFlip=0x0, vFlip=0x0, size=0x2, tileNum=0x49, priority=0x1, paletteNum=0x2
packed_sprite_oam x=0x20, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x2, matrixNum=0x0, hFlip=0x0, vFlip=0x0, size=0x1, tileNum=0x59, priority=0x1, paletteNum=0x2
packed_sprite_oam x=0x0, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x0, matrixNum=0x0, hFlip=0x0, vFlip=0x0, size=0x2, tileNum=0x49, priority=0x1, paletteNum=0x2
packed_sprite_oam x=0x20, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x2, matrixNum=0x0, hFlip=0x0, vFlip=0x0, size=0x1, tileNum=0x59, priority=0x1, paletteNum=0x2
packed_sprite_oam x=0x0, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x0, matrixNum=0x0, hFlip=0x0, vFlip=0x0, size=0x2, tileNum=0x49, priority=0x1, paletteNum=0x2
packed_sprite_oam x=0x20, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x2, matrixNum=0x0, hFlip=0x0, vFlip=0x0, size=0x1, tileNum=0x59, priority=0x1, paletteNum=0x2
packed_sprite_oam x=0x0, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x0, matrixNum=0x0, hFlip=0x0, vFlip=0x0, size=0x2, tileNum=0x49, priority=0x1, paletteNum=0x2
packed_sprite_oam x=0x20, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x2, matrixNum=0x0, hFlip=0x0, vFlip=0x0, size=0x1, tileNum=0x59, priority=0x1, paletteNum=0x2
packed_sprite_oam x=-0x2, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x0, matrixNum=0x0, hFlip=0x0, vFlip=0x0, size=0x2, tileNum=0x49, priority=0x1, paletteNum=0x2
packed_sprite_oam x=0x1E, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x2, matrixNum=0x0, hFlip=0x0, vFlip=0x0, size=0x1, tileNum=0x59, priority=0x1, paletteNum=0x2
packed_sprite_oam x=-0x8, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x0, matrixNum=0x0, hFlip=0x1, vFlip=0x0, size=0x2, tileNum=0x49, priority=0x1, paletteNum=0x2
packed_sprite_oam x=-0x10, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x2, matrixNum=0x0, hFlip=0x1, vFlip=0x0, size=0x1, tileNum=0x59, priority=0x1, paletteNum=0x2
packed_sprite_oam x=-0x8, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x0, matrixNum=0x0, hFlip=0x1, vFlip=0x0, size=0x2, tileNum=0x49, priority=0x1, paletteNum=0x2
packed_sprite_oam x=-0x10, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x2, matrixNum=0x0, hFlip=0x1, vFlip=0x0, size=0x1, tileNum=0x59, priority=0x1, paletteNum=0x2
packed_sprite_oam x=-0x8, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x0, matrixNum=0x0, hFlip=0x1, vFlip=0x0, size=0x2, tileNum=0x49, priority=0x1, paletteNum=0x2
packed_sprite_oam x=-0x10, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x2, matrixNum=0x0, hFlip=0x1, vFlip=0x0, size=0x1, tileNum=0x59, priority=0x1, paletteNum=0x2
packed_sprite_oam x=-0x8, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x0, matrixNum=0x0, hFlip=0x1, vFlip=0x0, size=0x2, tileNum=0x49, priority=0x1, paletteNum=0x2
packed_sprite_oam x=-0x10, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x2, matrixNum=0x0, hFlip=0x1, vFlip=0x0, size=0x1, tileNum=0x59, priority=0x1, paletteNum=0x2
packed_sprite_oam x=-0x8, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x0, matrixNum=0x0, hFlip=0x1, vFlip=0x0, size=0x2, tileNum=0x49, priority=0x1, paletteNum=0x2
packed_sprite_oam x=-0x10, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x2, matrixNum=0x0, hFlip=0x1, vFlip=0x0, size=0x1, tileNum=0x59, priority=0x1, paletteNum=0x2
packed_sprite_oam x=-0x6, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x0, matrixNum=0x0, hFlip=0x1, vFlip=0x0, size=0x2, tileNum=0x49, priority=0x1, paletteNum=0x2
packed_sprite_oam x=-0xE, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x2, matrixNum=0x0, hFlip=0x1, vFlip=0x0, size=0x1, tileNum=0x59, priority=0x1, paletteNum=0x2
packed_sprite_oam x=-0x3, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x0, matrixNum=0x0, hFlip=0x0, vFlip=0x0, size=0x2, tileNum=0x49, priority=0x1, paletteNum=0x2
packed_sprite_oam x=0x1D, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x2, matrixNum=0x0, hFlip=0x0, vFlip=0x0, size=0x1, tileNum=0x59, priority=0x1, paletteNum=0x2
packed_sprite_oam x=0x0, y=-0x2, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x0, matrixNum=0x0, hFlip=0x0, vFlip=0x0, size=0x2, tileNum=0x49, priority=0x1, paletteNum=0x2
packed_sprite_oam x=0x20, y=-0x2, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x2, matrixNum=0x0, hFlip=0x0, vFlip=0x0, size=0x1, tileNum=0x59, priority=0x1, paletteNum=0x2
packed_sprite_oam x=-0x7, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x0, matrixNum=0x0, hFlip=0x0, vFlip=0x0, size=0x2, tileNum=0x49, priority=0x1, paletteNum=0x2
packed_sprite_oam x=0x19, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x2, matrixNum=0x0, hFlip=0x0, vFlip=0x0, size=0x1, tileNum=0x59, priority=0x1, paletteNum=0x2
packed_sprite_oam x=-0x8, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x0, matrixNum=0x0, hFlip=0x0, vFlip=0x0, size=0x2, tileNum=0x49, priority=0x1, paletteNum=0x2
packed_sprite_oam x=0x18, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x2, matrixNum=0x0, hFlip=0x0, vFlip=0x0, size=0x1, tileNum=0x59, priority=0x1, paletteNum=0x2
packed_sprite_oam x=-0x8, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x0, matrixNum=0x0, hFlip=0x0, vFlip=0x0, size=0x2, tileNum=0x49, priority=0x1, paletteNum=0x2
packed_sprite_oam x=0x18, y=0x0, affineMode=0x0, objMode=0x1, mosaic=0x0, bpp=0x0, shape=0x2, matrixNum=0x0, hFlip=0x0, vFlip=0x0, size=0x1, tileNum=0x59, priority=0x1, paletteNum=0x2
gUnknown_086BA16C:: @ 0x086BA16C
.incbin "baserom.gba", 0x6BA16C, 0x12B4
gUnknown_086BB420:: @ 0x086BB420
.incbin "baserom.gba", 0x6BB420, 0x284

View File

@ -0,0 +1,87 @@
import sys
import struct
def signed(val, bits):
sign_bit = 1 << (bits - 1)
mask = (1 << bits) - 1
val = val & mask
return val - (1 << bits) if (val & sign_bit) else val
def parse_oam_entry(data):
word, half = struct.unpack('<IH', data)
y = (word >> 0) & 0xFF
affineMode = (word >> 8) & 0x3
objMode = (word >> 10) & 0x3
mosaic = (word >> 12) & 0x1
bpp = (word >> 13) & 0x1
shape = (word >> 14) & 0x3
x = (word >> 16) & 0x1FF
matrixNum = (word >> 25) & 0x7
hFlip = (word >> 28) & 0x1
vFlip = (word >> 29) & 0x1
size = (word >> 30) & 0x3
tileNum = (half >> 0) & 0x3FF
priority = (half >> 10) & 0x3
paletteNum = (half >> 12) & 0xF
return {
'y': signed(y, 8),
'affineMode': affineMode,
'objMode': objMode,
'mosaic': mosaic,
'bpp': bpp,
'shape': shape,
'x': signed(x, 9),
'matrixNum': matrixNum,
'hFlip': hFlip,
'vFlip': vFlip,
'size': size,
'tileNum': tileNum,
'priority': priority,
'paletteNum': paletteNum,
}
def hex_or_signed(val):
if isinstance(val, int) and val < 0:
return f"-0x{-val:X}"
else:
return f"0x{val:X}"
def main():
if len(sys.argv) != 4:
print(f"Usage: {sys.argv[0]} <file> <offset> <length>")
sys.exit(1)
filename = sys.argv[1]
offset = int(sys.argv[2], 0)
length = int(sys.argv[3], 0)
with open(filename, 'rb') as f:
f.seek(offset)
data = f.read(length)
if len(data) % 6 != 0:
print("Error: length must be a multiple of 6")
sys.exit(1)
for i in range(0, len(data), 6):
e = parse_oam_entry(data[i:i+6])
print(
" packed_sprite_oam x={x}, y={y}, affineMode={affineMode}, objMode={objMode}, mosaic={mosaic}, "
"bpp={bpp}, shape={shape}, matrixNum={matrixNum}, hFlip={hFlip}, vFlip={vFlip}, size={size}, "
"tileNum={tileNum}, priority={priority}, paletteNum={paletteNum}"
.format(
x=hex_or_signed(e['x']),
y=hex_or_signed(e['y']),
affineMode=hex(e['affineMode']),
objMode=hex(e['objMode']),
mosaic=hex(e['mosaic']),
bpp=hex(e['bpp']),
shape=hex(e['shape']),
matrixNum=hex(e['matrixNum']),
hFlip=hex(e['hFlip']),
vFlip=hex(e['vFlip']),
size=hex(e['size']),
tileNum=hex(e['tileNum']),
priority=hex(e['priority']),
paletteNum=hex(e['paletteNum']),
)
)
if __name__ == "__main__":
main()

View File

@ -1,18 +1,18 @@
import sys
def extract_bytes(input_file, output_file, start, length):
with open(input_file, 'rb') as f:
f.seek(start)
data = f.read(length)
with open(output_file, 'wb') as f:
f.write(data)
if __name__ == "__main__":
if len(sys.argv) != 5:
print(f"Usage: {sys.argv[0]} <input_file> <output_file> <start> <length>")
sys.exit(1)
input_file = sys.argv[1]
output_file = sys.argv[2]
start = int(sys.argv[3], 0)
length = int(sys.argv[4], 0)
extract_bytes(input_file, output_file, start, length)
import sys
def extract_bytes(input_file, output_file, start, length):
with open(input_file, 'rb') as f:
f.seek(start)
data = f.read(length)
with open(output_file, 'wb') as f:
f.write(data)
if __name__ == "__main__":
if len(sys.argv) != 5:
print(f"Usage: {sys.argv[0]} <input_file> <output_file> <start> <length>")
sys.exit(1)
input_file = sys.argv[1]
output_file = sys.argv[2]
start = int(sys.argv[3], 0)
length = int(sys.argv[4], 0)
extract_bytes(input_file, output_file, start, length)

View File

@ -1254,7 +1254,7 @@ void sub_336E0(void) {
}
extern const u8 gUnknown_08510E4C[];
extern const u16 gUnknown_086BA0A0[][2][3];
extern const u16 gDuskullSpritesheetOam[][2][3];
void sub_340EC() {
s16 i, j;
s16 sb;
@ -1297,7 +1297,7 @@ void sub_340EC() {
oamData = &spriteGroup->oam[j];
dst = (u16*)&gOamBuffer[oamData->oamId];
src = gUnknown_086BA0A0[sb][j];
src = gDuskullSpritesheetOam[sb][j];
*dst++ = *src++;
*dst++ = *src++;
*dst++ = *src++;
@ -1316,7 +1316,7 @@ void sub_340EC() {
oamData = &spriteGroup->oam[j];
dst = (u16*)&gOamBuffer[oamData->oamId];
src = gUnknown_086BA0A0[sb][j];
src = gDuskullSpritesheetOam[sb][j];
*dst++ = *src++;
*dst++ = *src++;
*dst++ = *src++;