/*
 * 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>(~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;
}

}
