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];
18 *dst++ = src[j * 64 + 2];
19 *dst++ = src[j * 64 + 3];
24 src += 7 * 64; /* skip to the next row of tiles (skip 7 rows of pixels) */
28 cptr = (uint16_t*)CRAM_OBJ_ADDR;
29 for(i=0; i<256; i++) {
30 unsigned char r = *cmap++ >> 3;
31 unsigned char g = *cmap++ >> 3;
32 unsigned char b = *cmap++ >> 3;
33 *cptr++ = r | ((uint16_t)g << 5) | ((uint16_t)b << 10);
41 for(i=0; i<128; i++) {
46 void spr_oam(uint16_t *oam, int idx, int spr, int x, int y, unsigned int flags)
48 if(!oam) oam = (uint16_t*)OAM_ADDR;
52 oam[0] = (y & 0xff) | (flags & 0xff00);
53 oam[1] = (x & 0x1ff) | ((flags >> 8) & 0xfe00);
54 oam[2] = (spr & 0x3ff) | ((flags & 3) << 10);
57 void spr_spr_oam(uint16_t *oam, int idx, struct sprite *spr)
63 for(i=0; i<spr->num_hwspr; i++) {
64 spr_oam(oam, idx, s->id, spr->x + s->x, spr->y + s->y, s->flags);
69 void spr_transform(uint16_t *oam, int idx, int16_t *mat)
71 if(!oam) oam = (uint16_t*)OAM_ADDR;
73 oam += (idx << 4) + 3;