blitter test
[retrocrawl] / src / game.c
index b4baeca..a4dc4c7 100644 (file)
@@ -3,6 +3,8 @@
 #include "data_test.h"
 #include "gfx.h"
 
+#include "hwregs.h"    /* XXX */
+
 #define TILE_W 32
 #define TILE_H 16
 
@@ -10,6 +12,7 @@ void draw_tile(int tid, int x, int y, int light);
 void convert_tile_data(unsigned char *dest, const char *src);
 
 static unsigned char test_tiles[2][TILE_W * TILE_H / 8 * NBPL];
+static unsigned char tile_mask[TILE_W * TILE_H / 8 * NBPL];
 
 int game_init(void)
 {
@@ -18,6 +21,7 @@ int game_init(void)
        for(i=0; i<2; i++) {
                convert_tile_data(test_tiles[i], test_tiles_cpix[i][0]);
        }
+       convert_tile_data(tile_mask, tile_mask_cpix[0]);
        return 0;
 }
 
@@ -29,21 +33,30 @@ void game_draw(void)
 
 void draw_tile(int tid, int x, int y, int light)
 {
-       int i;
-
        unsigned char *dest = bplptr[0] + (y * SCANSZ * NBPL) + x / 8;
        unsigned char *src = test_tiles[tid];
 
-       for(i=0; i<TILE_H * NBPL; i++) {
-               memcpy(dest, src, TILE_W / 8);
-               dest += SCANSZ;
-               src += TILE_W / 8;
-       }
+       wait_blit();
+
+       REG32_BLTCON = BLTCON_USEA | BLTCON_USEB | BLTCON_USEC | BLTCON_USED |
+               BLTCON_LF(0xca);
+       REG32_BLTAFLWM = 0xffffffff;
+       REG_BLTAMOD = 0;
+       REG_BLTBMOD = 0;
+       REG_BLTCMOD = SCANSZ - TILE_W / 8;
+       REG_BLTDMOD = SCANSZ - TILE_W / 8;
+       REG32_BLTAPT = (intptr_t)tile_mask;
+       REG32_BLTBPT = (intptr_t)src;
+       REG32_BLTCPT = (intptr_t)dest;
+       REG32_BLTDPT = (intptr_t)dest;
+       REG_BLTSIZE = BLTSIZE(TILE_W, TILE_H * NBPL);
 }
 
 static inline int charpix_color(char c)
 {
        switch(c) {
+       case '0':
+               return 0;
        case '#':
                return 1;
        case 'x':
@@ -52,8 +65,9 @@ static inline int charpix_color(char c)
                return 3;
        case 'o':
                return 4;
-       default:
        case '.':
+               return 0x1f;
+       default:
                break;
        }
        return 0;