starting part_dna
[mdlife] / src / part_dna.c
1 #include "sprite.h"
2 #include "vdp.h"
3 #include "demo.h"
4 #include "parts.h"
5
6 static void particle(int x, int y, int sz);
7
8 #define SPRITE_BASE             0x8000
9 extern uint16_t cellspr_data[], cellspr_data_end[];
10 extern unsigned char cellspr_cmap[], cellspr_cmap_end[];
11
12
13 void dna_init(void)
14 {
15         int i;
16         uint16_t *src;
17         unsigned char *cptr;
18
19         cptr = cellspr_cmap;
20         for(i=0; i<16; i++) {
21                 vdp_setcolor(0, i, i, i, i);
22                 vdp_setcolor(1, i, cptr[0] >> 4, cptr[1] >> 4, cptr[2] >> 4);
23                 cptr += 3;
24         }
25
26         /* upload sprite tiles */
27         src = cellspr_data;
28         vdp_setup_addr(VDP_VRAM, SPRITE_BASE);
29         while(src < cellspr_data_end) {
30                 VDP_DATA = *src++;
31         }
32 }
33
34 void dna_update(void)
35 {
36         particle(160, 120, frameno & 0x1f);
37 }
38
39 static void particle(int x, int y, int sz)
40 {
41         int tile;
42
43         sz >>= 3;       /* pixels to levels */
44         if(sz > 4) sz = 4;
45         tile = VDP_ADDR2TILE(SPRITE_BASE) + sz;
46
47         switch(sz) {
48         case 0:
49         case 1:
50         case 2:
51                 spr_add(x - 4, y - 4, VDP_TILENAME(tile, 1, VDP_TILE_FG), SPR_SIZE(1, 1));
52                 break;
53
54         case 3:
55                 spr_add(x - 8, y - 8, VDP_TILENAME(tile, 1, VDP_TILE_FG), SPR_SIZE(1, 1));
56                 spr_add(x, y - 8, VDP_TILENAME(tile, 1, VDP_TILE_FG | VDP_TILE_HFLIP), SPR_SIZE(1, 1));
57                 spr_add(x - 8, y, VDP_TILENAME(tile, 1, VDP_TILE_FG | VDP_TILE_VFLIP), SPR_SIZE(1, 1));
58                 spr_add(x, y, VDP_TILENAME(tile, 1, VDP_TILE_FG | VDP_TILE_HVFLIP), SPR_SIZE(1, 1));
59                 break;
60
61         case 4:
62                 spr_add(x - 16, y - 16, VDP_TILENAME(tile, 1, VDP_TILE_FG), SPR_SIZE(2, 2));
63                 spr_add(x, y - 16, VDP_TILENAME(tile, 1, VDP_TILE_FG | VDP_TILE_HFLIP), SPR_SIZE(2, 2));
64                 spr_add(x - 16, y, VDP_TILENAME(tile, 1, VDP_TILE_FG | VDP_TILE_VFLIP), SPR_SIZE(2, 2));
65                 spr_add(x, y, VDP_TILENAME(tile, 1, VDP_TILE_FG | VDP_TILE_HVFLIP), SPR_SIZE(2, 2));
66                 break;
67         }
68 }