Add scrolling (not correct yet), shells and missile, game is recognizable
authorNick Downing <nick@ndcode.org>
Sun, 3 Jul 2022 13:53:57 +0000 (23:53 +1000)
committerNick Downing <nick@ndcode.org>
Mon, 4 Jul 2022 04:59:23 +0000 (14:59 +1000)
emu_z80/emu_z80.c

index 7fdce2a..5da0a8f 100644 (file)
@@ -1983,17 +1983,30 @@ 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 palette_base =
-          ((mem[i | SPRITE_RAM] & 7) << 2) |
+          ((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);
           int tile_base0 = tile_base | ROM_1K_ADDR;
           int tile_base1 = tile_base | ROM_1H_ADDR;
           for (int k = 0; k < 8; ++k) {
-            int y = ((i << 3) | k) * WINDOW_Y_SCALE;
+            y1 = (y + k) * 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[
@@ -2006,12 +2019,13 @@ int main(int argc, char **argv) {
                 ((((colour & 0x38) * 0x49) & 0xff0) << 4) |
                 ((((colour & 0xc0) * 0x55) & 0x3fc0) >> 6) |
                 0xff000000;
-              int x = ((j << 3) | l) * WINDOW_X_SCALE;
+              x1 *= WINDOW_X_SCALE;
               for (int m = 0; m < WINDOW_Y_SCALE; ++m)
                 for (int n = 0; n < WINDOW_X_SCALE; ++n)
-                  frame[y + m][x + n] = rgb;
+                  frame[y1 + m][x1 + n] = rgb;
             }
           }
+          x += 8;
         }
       }
 
@@ -2096,6 +2110,25 @@ int main(int argc, char **argv) {
           }
         }
       }
+
+      // draw shells and missile
+      for (int i = 0; i < 8; ++i) {
+        int x = mem[0x61 | (i << 2) | SPRITE_RAM] - 16;
+        if (x < GALAXIAN_WIDTH) {
+          x *= WINDOW_X_SCALE;
+          uint32_t rgb = i < 7 ? 0xffffffff : 0xffffff00;
+          int y = 0xfc - mem[0x63 | (i << 2) | SPRITE_RAM];
+          for (int j = 0; j < 4; ++j) {
+            int y1 = y + j;
+            if (y1 >= 0 && y1 < GALAXIAN_HEIGHT) {
+              y1 *= WINDOW_Y_SCALE;
+              for (int k = 0; k < WINDOW_Y_SCALE; ++k)
+                for (int l = 0; l < WINDOW_X_SCALE; ++l)
+                  frame[y1 + k][x + l] = rgb;
+            }
+          }
+        }
+      } 
 #elif PACMAN
       // send z80 a vertical refresh interrupt
       if (mem[HW_INT_ENABLE] & 1) {
@@ -2117,7 +2150,7 @@ int main(int argc, char **argv) {
           int palette_base =
             ((mem[offset | PALETTE_RAM] & 0x3f) << 2) | ROM_82S126_4A_ADDR;
           for (int k = 0; k < 8; ++k) {
-            int y = ((i << 3) | k) * WINDOW_Y_SCALE;
+            int y = (k | (i << 3)) * WINDOW_Y_SCALE;
             for (int l = 0; l < 8; ++l) {
               int data = mem[l ^ ((k & 4) << 1) ^ tile_base] << (k & 3);
               uint32_t rgb = palette[
@@ -2125,7 +2158,7 @@ int main(int argc, char **argv) {
                   ((data & 8) >> 3) | ((data & 0x80) >> 6) | palette_base
                 ] & 0xf
               ];
-              int x = ((j << 3) | l) * WINDOW_X_SCALE;
+              int x = (l | (j << 3)) * WINDOW_X_SCALE;
               for (int m = 0; m < WINDOW_Y_SCALE; ++m)
                 for (int n = 0; n < WINDOW_X_SCALE; ++n)
                   frame[y + m][x + n] = rgb;