From a990b07cb580eb8847621b4f4b4ac9797b0b5c26 Mon Sep 17 00:00:00 2001 From: Treeki Date: Mon, 6 May 2013 09:30:59 +0200 Subject: optimised copying for animated tiles --- animtiles.yaml | 6 ++++++ src/animtiles.cpp | 17 +++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/animtiles.yaml b/animtiles.yaml index 3f8f8ab..879693b 100644 --- a/animtiles.yaml +++ b/animtiles.yaml @@ -20,3 +20,9 @@ hooks: addr_ntsc: 0xdeadbeef addr_pal: 0x80087544 data: '3880 1000' # 128 tiles should be enough for anyone + + - name: AnimTileOptimisedCopy + type: branch_insn + branch_type: bl + src_addr_pal: 0x80087AD0 + target_func: 'CopyAnimTile' diff --git a/src/animtiles.cpp b/src/animtiles.cpp index 4213e6a..53a204b 100644 --- a/src/animtiles.cpp +++ b/src/animtiles.cpp @@ -51,3 +51,20 @@ void DoTiles(void* self) { void DestroyTiles(void *self) { FreeFile(&fh); } + + +extern "C" void CopyAnimTile(u8 *target, int tileNum, u8 *source, int frameNum) { + int tileRow = tileNum >> 5; // divided by 32 + int tileColumn = tileNum & 31; // modulus by 32 + + u8 *baseRow = target + (tileRow * 2 * 32 * 1024); + u8 *baseTile = baseRow + (tileColumn * 32 * 4 * 2); + + u8 *sourceRow = source + (frameNum * 2 * 32 * 32); + + for (int i = 0; i < 8; i++) { + memcpy(baseTile, sourceRow, 32*4*2); + baseTile += (2 * 4 * 1024); + sourceRow += (2 * 32 * 4); + } +} -- cgit v1.2.3