// 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;
}
}
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) {