From 9b8360eaf4e28948e534e34e3dcdc79869d66840 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Mon, 14 Jul 2025 09:17:17 -0500 Subject: [PATCH] Add packed_sprite_oam macro and dumping script, dump duskull spritesheet oam entries --- asm/macros.inc | 1 + asm/macros/sprite_oam.inc | 4 ++ data/rom.s | 41 ++++++++++- data_dump_tools/dump_packed_sprite_oam.py | 87 +++++++++++++++++++++++ extract.py => data_dump_tools/extract.py | 36 +++++----- src/rom_31F6C.c | 6 +- 6 files changed, 152 insertions(+), 23 deletions(-) create mode 100644 asm/macros/sprite_oam.inc create mode 100644 data_dump_tools/dump_packed_sprite_oam.py rename extract.py => data_dump_tools/extract.py (96%) diff --git a/asm/macros.inc b/asm/macros.inc index 17e3405..55c6416 100644 --- a/asm/macros.inc +++ b/asm/macros.inc @@ -1,2 +1,3 @@ .include "asm/macros/function.inc" .include "asm/macros/label.inc" + .include "asm/macros/sprite_oam.inc" diff --git a/asm/macros/sprite_oam.inc b/asm/macros/sprite_oam.inc new file mode 100644 index 0000000..c215435 --- /dev/null +++ b/asm/macros/sprite_oam.inc @@ -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 diff --git a/data/rom.s b/data/rom.s index a876897..2112627 100644 --- a/data/rom.s +++ b/data/rom.s @@ -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 diff --git a/data_dump_tools/dump_packed_sprite_oam.py b/data_dump_tools/dump_packed_sprite_oam.py new file mode 100644 index 0000000..ec24448 --- /dev/null +++ b/data_dump_tools/dump_packed_sprite_oam.py @@ -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('> 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]} ") + 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() \ No newline at end of file diff --git a/extract.py b/data_dump_tools/extract.py similarity index 96% rename from extract.py rename to data_dump_tools/extract.py index 03e5d91..3155b45 100644 --- a/extract.py +++ b/data_dump_tools/extract.py @@ -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]} ") - 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]} ") + 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) diff --git a/src/rom_31F6C.c b/src/rom_31F6C.c index 39845d7..b76a58a 100644 --- a/src/rom_31F6C.c +++ b/src/rom_31F6C.c @@ -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++;