45 lines
1.1 KiB
C++
45 lines
1.1 KiB
C++
/*
|
|
* Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved.
|
|
*/
|
|
|
|
#include <teagba/addresses.hpp>
|
|
#include <teagba/bios.hpp>
|
|
#include <teagba/irq.hpp>
|
|
|
|
#include <teagba/gfx.hpp>
|
|
|
|
namespace teagba {
|
|
|
|
static ox::Array<GbaSpriteAttrUpdate, 128> 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<uint16_t>(~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<uint64_t>(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;
|
|
}
|
|
|
|
}
|