Accurately emulate Window X = Object X
This commit is contained in:
parent
5ca602fbd2
commit
b7194402eb
@ -728,7 +728,6 @@ void GB_display_run(GB_gameboy_t *gb, uint8_t cycles)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
GB_object_t *objects = (GB_object_t *) &gb->oam;
|
GB_object_t *objects = (GB_object_t *) &gb->oam;
|
||||||
bool window_got_activated = false;
|
|
||||||
|
|
||||||
GB_STATE_MACHINE(gb, display, cycles, 2) {
|
GB_STATE_MACHINE(gb, display, cycles, 2) {
|
||||||
GB_STATE(gb, display, 1);
|
GB_STATE(gb, display, 1);
|
||||||
@ -772,7 +771,6 @@ void GB_display_run(GB_gameboy_t *gb, uint8_t cycles)
|
|||||||
GB_STATE(gb, display, 40);
|
GB_STATE(gb, display, 40);
|
||||||
GB_STATE(gb, display, 41);
|
GB_STATE(gb, display, 41);
|
||||||
GB_STATE(gb, display, 42);
|
GB_STATE(gb, display, 42);
|
||||||
GB_STATE(gb, display, 43);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(gb->io_registers[GB_IO_LCDC] & 0x80)) {
|
if (!(gb->io_registers[GB_IO_LCDC] & 0x80)) {
|
||||||
@ -961,13 +959,12 @@ void GB_display_run(GB_gameboy_t *gb, uint8_t cycles)
|
|||||||
/* TODO: Verify fetcher access timings in this case */
|
/* TODO: Verify fetcher access timings in this case */
|
||||||
if (gb->io_registers[GB_IO_WX] == 0 && (gb->io_registers[GB_IO_SCX] & 7)) {
|
if (gb->io_registers[GB_IO_WX] == 0 && (gb->io_registers[GB_IO_SCX] & 7)) {
|
||||||
gb->cycles_for_line++;
|
gb->cycles_for_line++;
|
||||||
GB_SLEEP(gb, display, 43, 1);
|
GB_SLEEP(gb, display, 42, 1);
|
||||||
}
|
}
|
||||||
gb->wx_triggered = true;
|
gb->wx_triggered = true;
|
||||||
gb->window_tile_x = 0;
|
gb->window_tile_x = 0;
|
||||||
fifo_clear(&gb->bg_fifo);
|
fifo_clear(&gb->bg_fifo);
|
||||||
gb->fetcher_state = 0;
|
gb->fetcher_state = 0;
|
||||||
window_got_activated = true;
|
|
||||||
gb->window_is_being_fetched = true;
|
gb->window_is_being_fetched = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -997,14 +994,7 @@ void GB_display_run(GB_gameboy_t *gb, uint8_t cycles)
|
|||||||
(gb->io_registers[GB_IO_LCDC] & 2 || GB_is_cgb(gb)) &&
|
(gb->io_registers[GB_IO_LCDC] & 2 || GB_is_cgb(gb)) &&
|
||||||
gb->obj_comparators[gb->n_visible_objs - 1] == (uint8_t)(gb->position_in_line + 8)) {
|
gb->obj_comparators[gb->n_visible_objs - 1] == (uint8_t)(gb->position_in_line + 8)) {
|
||||||
|
|
||||||
/* TODO: This is wrong. It is only correct for a single object, not for more than one. */
|
while (gb->fetcher_state < 5 || fifo_size(&gb->bg_fifo) == 0) {
|
||||||
if (window_got_activated) {
|
|
||||||
window_got_activated = false;
|
|
||||||
gb->cycles_for_line += 6;
|
|
||||||
GB_SLEEP(gb, display, 42, 6);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (gb->fetcher_state < 5) {
|
|
||||||
advance_fetcher_state_machine(gb);
|
advance_fetcher_state_machine(gb);
|
||||||
gb->cycles_for_line++;
|
gb->cycles_for_line++;
|
||||||
GB_SLEEP(gb, display, 27, 1);
|
GB_SLEEP(gb, display, 27, 1);
|
||||||
|
Loading…
Reference in New Issue
Block a user