#include "th01/hardware/graph.h" #include "th01/formats/ptn.hpp" static inline ptn_t* ptn_with_id_shift(int id) { // Before we bother with doing compile-time integer logarithms... // (MODDERS: This function shouldn't exist. Just use the regular // ptn_with_id().) if(PTN_IMAGES_PER_SLOT == 64) { return &ptn_images[id >> 6][id % PTN_IMAGES_PER_SLOT]; } return &ptn_images[id / PTN_IMAGES_PER_SLOT][id % PTN_IMAGES_PER_SLOT]; } #define grcg_clear_masked(vram_offset, w, mask) \ grcg_setcolor_rmw(0); \ VRAM_PUT(B, vram_offset, mask, w); \ grcg_off(); #define vram_snap_masked(planar_dots, vram_offset, w, mask) \ planar_dots.B = VRAM_CHUNK(B, vram_offset, w) & mask; \ planar_dots.R = VRAM_CHUNK(R, vram_offset, w) & mask; \ planar_dots.G = VRAM_CHUNK(G, vram_offset, w) & mask; \ planar_dots.E = VRAM_CHUNK(E, vram_offset, w) & mask; #define vram_or(vram_offset, w, planar) \ VRAM_CHUNK(B, vram_offset, w) |= planar.B; \ VRAM_CHUNK(R, vram_offset, w) |= planar.R; \ VRAM_CHUNK(G, vram_offset, w) |= planar.G; \ VRAM_CHUNK(E, vram_offset, w) |= planar.E; void ptn_unput_8(int left, int top, int ptn_id) { ptn_dots_t mask = 0; uint16_t vram_offset = vram_offset_shift(left, top); ptn_t *ptn = ptn_with_id_shift(ptn_id); for(unsigned int y = 0; y < PTN_H; y++) { mask = ptn->alpha[y]; graph_accesspage_func(0); if(mask) { planar_t(PTN_W) page1; grcg_clear_masked(vram_offset, PTN_W, mask); graph_accesspage_func(1); vram_snap_masked(page1, vram_offset, PTN_W, mask); graph_accesspage_func(0); vram_or(vram_offset, PTN_W, page1); } vram_offset += ROW_SIZE; if(vram_offset > PLANE_SIZE) { break; } } }