blitter test
[retrocrawl] / src / game.c
1 #include <string.h>
2 #include "game.h"
3 #include "data_test.h"
4 #include "gfx.h"
5
6 #include "hwregs.h"     /* XXX */
7
8 #define TILE_W  32
9 #define TILE_H  16
10
11 void draw_tile(int tid, int x, int y, int light);
12 void convert_tile_data(unsigned char *dest, const char *src);
13
14 static unsigned char test_tiles[2][TILE_W * TILE_H / 8 * NBPL];
15 static unsigned char tile_mask[TILE_W * TILE_H / 8 * NBPL];
16
17 int game_init(void)
18 {
19         int i;
20
21         for(i=0; i<2; i++) {
22                 convert_tile_data(test_tiles[i], test_tiles_cpix[i][0]);
23         }
24         convert_tile_data(tile_mask, tile_mask_cpix[0]);
25         return 0;
26 }
27
28 void game_draw(void)
29 {
30         draw_tile(0, 32, 16, 0);
31 }
32
33
34 void draw_tile(int tid, int x, int y, int light)
35 {
36         unsigned char *dest = bplptr[0] + (y * SCANSZ * NBPL) + x / 8;
37         unsigned char *src = test_tiles[tid];
38
39         wait_blit();
40
41         REG32_BLTCON = BLTCON_USEA | BLTCON_USEB | BLTCON_USEC | BLTCON_USED |
42                 BLTCON_LF(0xca);
43         REG32_BLTAFLWM = 0xffffffff;
44         REG_BLTAMOD = 0;
45         REG_BLTBMOD = 0;
46         REG_BLTCMOD = SCANSZ - TILE_W / 8;
47         REG_BLTDMOD = SCANSZ - TILE_W / 8;
48         REG32_BLTAPT = (intptr_t)tile_mask;
49         REG32_BLTBPT = (intptr_t)src;
50         REG32_BLTCPT = (intptr_t)dest;
51         REG32_BLTDPT = (intptr_t)dest;
52         REG_BLTSIZE = BLTSIZE(TILE_W, TILE_H * NBPL);
53 }
54
55 static inline int charpix_color(char c)
56 {
57         switch(c) {
58         case '0':
59                 return 0;
60         case '#':
61                 return 1;
62         case 'x':
63                 return 2;
64         case '@':
65                 return 3;
66         case 'o':
67                 return 4;
68         case '.':
69                 return 0x1f;
70         default:
71                 break;
72         }
73         return 0;
74 }
75
76 #define TILE_SCANSZ     (TILE_W / 8)
77 void convert_tile_data(unsigned char *dest, const char *src)
78 {
79         int i, j, k;
80         unsigned char *bptr[NBPL];
81
82         for(i=0; i<NBPL; i++) {
83                 bptr[i] = dest + TILE_SCANSZ * i;
84         }
85
86         for(i=0; i<TILE_H; i++) {
87                 for(j=0; j<TILE_W; j++) {
88                         int col = charpix_color(*src++);
89
90                         for(k=0; k<NBPL; k++) {
91                                 *bptr[k] = (*bptr[k] << 1) | (col & 1);
92                                 col >>= 1;
93
94                                 if((j & 7) == 7) {
95                                         bptr[k]++;
96                                 }
97                         }
98                 }
99
100                 for(j=0; j<NBPL; j++) {
101                         bptr[j] += TILE_SCANSZ * (NBPL - 1);
102                 }
103         }
104 }