Scrolling much better with 29x32 field and tile memory wraparound at 0x400
authorNick Downing <nick@ndcode.org>
Sun, 3 Jul 2022 14:25:35 +0000 (00:25 +1000)
committerNick Downing <nick@ndcode.org>
Mon, 4 Jul 2022 04:59:23 +0000 (14:59 +1000)
emu_z80/emu_z80.c

index 5da0a8f..3f6eb9b 100644 (file)
@@ -1983,49 +1983,45 @@ int main(int argc, char **argv) {
 
       // draw tiles
       for (int i = 0; i < 32; ++i) {
-        int x = ((mem[(i << 1) | SPRITE_RAM] + 0x24) & 0xff) - 0x14;
-        x += GALAXIAN_WIDTH;
-        int y = i << 3;
-        int x1; // = x * WINDOW_X_SCALE;
-        int y1; // = y * WINDOW_Y_SCALE;
-        //for (int j = 0; j < 8 * WINDOW_Y_SCALE; ++j)
-        //  for (int k = 0; k < x1; ++k)
-        //    frame[y1 + j][k] = 0xff404040;
+        int scroll = mem[(i << 1) | SPRITE_RAM] + 0x10;
+        int origin = i | ((scroll & 0xf8) << 2);
         int palette_base =
           ((mem[1 | (i << 1) | SPRITE_RAM] & 7) << 2) |
           ROM_GALAXIAN_CLR_ADDR;
-        for (int j = 0; j < 28; ++j) {
-          //if (x >= GALAXIAN_WIDTH)
-          //  break;
-          int offset = i + ((27 - j) << 5);
-          int tile_base = 7 | (mem[TILE_RAM | offset] << 3);
+        for (int j = 0; j < 29; ++j) {
+          int tile_base =
+            7 |
+            (
+              mem[
+                ((origin + ((28 - j) << 5)) & 0x3ff) | TILE_RAM
+              ] << 3
+            );
           int tile_base0 = tile_base | ROM_1K_ADDR;
           int tile_base1 = tile_base | ROM_1H_ADDR;
           for (int k = 0; k < 8; ++k) {
-            y1 = (y + k) * WINDOW_Y_SCALE;
+            int y1 = (k | (i << 3)) * WINDOW_Y_SCALE;
             for (int l = 0; l < 8; ++l) {
-              x1 = (x + l) % GALAXIAN_WIDTH;
-              //if (x1 >= GALAXIAN_WIDTH)
-              //  break;
-              int data0 = mem[l ^ tile_base0] << (k & 7);
-              int data1 = mem[l ^ tile_base1] << (k & 7);
-              int colour = mem[
-                ((data0 & 0x80) >> 7) |
-                ((data1 & 0x80) >> 6) |
-                palette_base
-              ]; // approximately bbgggrrr
-              uint32_t rgb =
-                ((((colour & 7) * 0x49) & 0x1fe) << 15) |
-                ((((colour & 0x38) * 0x49) & 0xff0) << 4) |
-                ((((colour & 0xc0) * 0x55) & 0x3fc0) >> 6) |
-                0xff000000;
-              x1 *= WINDOW_X_SCALE;
-              for (int m = 0; m < WINDOW_Y_SCALE; ++m)
-                for (int n = 0; n < WINDOW_X_SCALE; ++n)
-                  frame[y1 + m][x1 + n] = rgb;
+              int x1 = (l | (j << 3)) + (scroll & 7) - 8;
+              if (x1 >= 0 && x1 < GALAXIAN_WIDTH) {
+                int data0 = mem[l ^ tile_base0] << (k & 7);
+                int data1 = mem[l ^ tile_base1] << (k & 7);
+                int colour = mem[
+                  ((data0 & 0x80) >> 7) |
+                  ((data1 & 0x80) >> 6) |
+                  palette_base
+                ]; // approximately bbgggrrr
+                uint32_t rgb =
+                  ((((colour & 7) * 0x49) & 0x1fe) << 15) |
+                  ((((colour & 0x38) * 0x49) & 0xff0) << 4) |
+                  ((((colour & 0xc0) * 0x55) & 0x3fc0) >> 6) |
+                  0xff000000;
+                x1 *= WINDOW_X_SCALE;
+                for (int m = 0; m < WINDOW_Y_SCALE; ++m)
+                  for (int n = 0; n < WINDOW_X_SCALE; ++n)
+                    frame[y1 + m][x1 + n] = rgb;
+              }
             }
           }
-          x += 8;
         }
       }
 
@@ -2117,7 +2113,7 @@ int main(int argc, char **argv) {
         if (x < GALAXIAN_WIDTH) {
           x *= WINDOW_X_SCALE;
           uint32_t rgb = i < 7 ? 0xffffffff : 0xffffff00;
-          int y = 0xfc - mem[0x63 | (i << 2) | SPRITE_RAM];
+          int y = 0xfb - mem[0x63 | (i << 2) | SPRITE_RAM];
           for (int j = 0; j < 4; ++j) {
             int y1 = y + j;
             if (y1 >= 0 && y1 < GALAXIAN_HEIGHT) {