/* * 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 const i) noexcept { return g_spriteBuffer[i]; } void addSpriteUpdate(GbaSpriteAttrUpdate const &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); } } void setBgOffset(uint16_t const bg, int16_t const x, int16_t const y) noexcept { auto &o = regBgOfs(bg); o.x = x; o.y = y; } void scrollBgOffset(uint16_t const bg, int16_t const x, int16_t const y) noexcept { auto &o = regBgOfs(bg); o.x = o.x + x; o.y = o.y + y; } }