5 void spr_setup(int xtiles, int ytiles, unsigned char *pixels, unsigned char *cmap)
8 uint16_t *cptr, *src, *dst;
10 num_tiles = xtiles * ytiles;
11 dst = (uint16_t*)VRAM_LFB_OBJ_ADDR;
12 src = (uint16_t*)pixels;
13 for(i=0; i<num_tiles; i++) {
14 /* copy every row of tile i (8x8) */
17 *dst++ = src[j * 64 + 1];
22 src += 7 * 64; /* skip to the next row of tiles (skip 7 rows of pixels) */
26 cptr = (uint16_t*)CRAM_OBJ_ADDR;
28 unsigned char r = *cmap++ >> 3;
29 unsigned char g = *cmap++ >> 3;
30 unsigned char b = *cmap++ >> 3;
31 *cptr++ = r | ((uint16_t)g << 5) | ((uint16_t)b << 10);
39 for(i=0; i<128; i++) {
44 void spr_oam(uint16_t *oam, int idx, int spr, int x, int y, unsigned int flags)
46 if(!oam) oam = (uint16_t*)OAM_ADDR;
50 oam[0] = (y & 0xff) | (flags & 0xff00);
51 oam[1] = (x & 0x1ff) | ((flags >> 8) & 0xfe00);
52 oam[2] = (spr & 0x3ff) | ((flags & 3) << 10);
55 void spr_spr_oam(uint16_t *oam, int idx, struct sprite *spr)
61 for(i=0; i<spr->num_hwspr; i++) {
62 spr_oam(oam, idx, s->id, spr->x + s->x, spr->y + s->y, s->flags);
67 void spr_transform(uint16_t *oam, int idx, int16_t *mat)
69 if(!oam) oam = (uint16_t*)OAM_ADDR;
71 oam += (idx << 4) + 3;