/* * Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved. */ #include #include #include #include namespace teagba { static ox::Array g_spriteBuffer; GbaSpriteAttrUpdate &spriteAttr(size_t i) noexcept { return g_spriteBuffer[i]; } void addSpriteUpdate(const GbaSpriteAttrUpdate &upd) noexcept { const auto ie = REG_IE; // disable vblank interrupt handler REG_IE = REG_IE & static_cast(~teagba::Int_vblank); // disable vblank interrupt handler g_spriteBuffer[upd.idx] = upd; REG_IE = ie; // enable vblank interrupt handler } void applySpriteUpdates() noexcept { for (auto const&oa : g_spriteBuffer) { MEM_OAM[oa.idx] = std::bit_cast(oa); } } }