Insert the pixel at the correct position

This commit is contained in:
Lior Halphon 2022-07-23 01:52:33 +03:00
parent f75f170448
commit f5f79f88ab
1 changed files with 15 additions and 15 deletions

View File

@ -908,6 +908,21 @@ static void advance_fetcher_state_machine(GB_gameboy_t *gb, unsigned *cycles)
}
if (fifo_size(&gb->bg_fifo) > 0) break;
if (unlikely(gb->wy_triggered && !(gb->io_registers[GB_IO_LCDC] & 0x20) && !GB_is_cgb(gb))) {
/* See https://github.com/LIJI32/SameBoy/issues/278 for documentation */
uint8_t logical_position = gb->position_in_line + 7;
if (logical_position > 167) {
logical_position = 0;
}
if (gb->io_registers[GB_IO_WX] == logical_position) {
gb->bg_fifo.read_end--;
gb->bg_fifo.read_end &= GB_FIFO_LENGTH - 1;
gb->bg_fifo.fifo[gb->bg_fifo.read_end] = (GB_fifo_item_t){0,};
gb->bg_fifo.size = 1;
break;
}
}
fifo_push_bg_row(&gb->bg_fifo, gb->current_tile_data[0], gb->current_tile_data[1],
gb->current_tile_attributes & 7, gb->current_tile_attributes & 0x80, gb->current_tile_attributes & 0x20);
gb->fetcher_state = 0;
@ -1703,21 +1718,6 @@ void GB_display_run(GB_gameboy_t *gb, unsigned cycles, bool force)
gb->window_is_being_fetched = false;
}
/* TODO: WX=0 behaves wrong, but WX=0 behaves wrong regardless in DMG mode */
if (!GB_is_cgb(gb) && gb->wy_triggered && !(gb->io_registers[GB_IO_LCDC] & 0x20) && gb->bg_fifo.size == 1) {
/* See https://github.com/LIJI32/SameBoy/issues/278 for documentation */
uint8_t logical_position = gb->position_in_line + 8;
if (logical_position > 167) {
logical_position = 0;
}
if (gb->io_registers[GB_IO_WX] == logical_position) {
gb->bg_fifo.read_end--;
gb->bg_fifo.read_end &= GB_FIFO_LENGTH - 1;
gb->bg_fifo.fifo[gb->bg_fifo.read_end] = (GB_fifo_item_t){0,};
gb->bg_fifo.size = 2;
}
}
/* Handle objects */
/* When the object enabled bit is off, this proccess is skipped entirely on the DMG, but not on the CGB.
On the CGB, this bit is checked only when the pixel is actually popped from the FIFO. */