37c39b2e252255fc5987f11acbedc36e8fc6091d
[retrocrawl] / src / game.c
1 #include <string.h>
2 #include "game.h"
3 #include "gfx.h"
4 #include "copper.h"
5 #include "data.h"
6
7 #include "hwregs.h"     /* XXX */
8
9 #define TILE_W  64
10 #define TILE_H  32
11
12 void draw_tile(int tid, int x, int y, int light);
13
14 static uint16_t *sprdata[NUM_HWSPRITES];
15 static uint16_t nullspr[] = {
16         0x2000, 0x2100,
17         0x0000, 0x0000,
18         0x0000, 0x0000
19 };
20
21 #define SPR_POS(x, y) \
22         (((uint16_t)((x) + 0x40) & 0xff) | ((uint16_t)((y) + 0x2c) << 8))
23
24
25 int game_init(void)
26 {
27         int i, sprpos[] = {136, 76};
28         uint32_t nullspr_addr = (intptr_t)nullspr;
29
30         REG_COLOR0 = 0x221;
31         REG_COLOR1 = 0x222;
32         REG_COLOR2 = 0x332;
33         REG_COLOR3 = 0x433;
34         REG_COLOR4 = 0x543;
35         REG_COLOR5 = 0x554;
36         REG_COLOR6 = 0x654;
37         REG_COLOR7 = 0x765;
38
39         for(i=0; i<16; i++) {
40                 REG_COLOR_PTR[i + 16] = sprpal[i];
41         }
42
43         sprdata[0] = spr0a;
44         sprdata[1] = spr0b;
45         sprdata[2] = spr1a;
46         sprdata[3] = spr1b;
47         sprdata[4] = spr2a;
48         sprdata[5] = spr2b;
49
50         for(i=0; i<8; i++) {
51                 int reg = REGN_SPR0PTH + i * 4;
52                 if(i < NUM_HWSPRITES) {
53                         uint16_t sx, sy, vstop;
54                         /* initialize active sprites, and set the sprite pointers */
55                         uint32_t addr = (intptr_t)sprdata[i];
56                         add_copper(COPPER_MOVE(reg, addr >> 16));
57                         add_copper(COPPER_MOVE(reg + 2, addr));
58
59                         sx = 0x80 + sprpos[0] + (i >> 1) * 16;
60                         sy = 0x2c + sprpos[1];
61                         vstop = sy + SPRITE_HEIGHT;
62
63                         sprdata[i][0] = (sx >> 1) | (sy << 8);
64                         sprdata[i][1] = (vstop << 8) | ((vstop >> 7) & 2) |
65                                 (sx & 1) | ((i & 1) ? 0x80 : 0);
66                 } else {
67                         /* point the sprite pointers to the null sprite for the rest */
68                         add_copper(COPPER_MOVE(reg, nullspr_addr >> 16));
69                         add_copper(COPPER_MOVE(reg + 2, nullspr_addr));
70                 }
71         }
72
73         *copperlist_end = COPPER_END;
74
75         return 0;
76 }
77
78 #define XTILES  5
79 #define YTILES  13
80
81 void game_draw(void)
82 {
83         int i, j, xoffs, yoffs, ntiles;
84
85         /* reset sprite data */
86
87         yoffs = 0;
88         for(i=0; i<YTILES; i++) {
89                 xoffs = i & 1 ? TILE_W / 2 : 0;
90                 ntiles = i & 1 ? XTILES - 1 : XTILES;
91                 for(j=0; j<ntiles; j++) {
92                         draw_tile(0, xoffs, yoffs, 0);
93                         xoffs += TILE_W;
94                 }
95                 yoffs += TILE_H / 2;
96         }
97 }
98
99
100 void draw_tile(int tid, int x, int y, int light)
101 {
102         unsigned char *dest = bplptr[0] + (y * SCANSZ * NBPL) + x / 8;
103         unsigned char *src = test_tile;
104
105         wait_blit();
106
107         REG32_BLTCON = BLTCON_USEA | BLTCON_USEB | BLTCON_USEC | BLTCON_USED |
108                 BLTCON_LF(0xca);
109         REG32_BLTAFLWM = 0xffffffff;
110         REG_BLTAMOD = 0;
111         REG_BLTBMOD = 0;
112         REG_BLTCMOD = SCANSZ - TILE_W / 8;
113         REG_BLTDMOD = SCANSZ - TILE_W / 8;
114         REG32_BLTAPT = (intptr_t)test_tile_mask;
115         REG32_BLTBPT = (intptr_t)src;
116         REG32_BLTCPT = (intptr_t)dest;
117         REG32_BLTDPT = (intptr_t)dest;
118         REG_BLTSIZE = BLTSIZE(TILE_W, TILE_H * NBPL);
119 }