The rolled loop has been taken from MSXgl, it works fine. The unrolled loop shows corruption once every 3~4 frames on OpenMSX (https://youtu.be/ceRuUXIWX2M) , as if it was copying data to the wrong destination. It seens to work fine in emulicious and the webMSX emulator.
any tips on how to debug this are welcome!
Rolled version and working as expected:
void VDP_write_16K(u8 count, const u8* src) __sdcccall(1) { src, count; __asm //exit if count is 0 or a jr z, vdp_write_wrt16_exit_loop ld b, a // count ld c, #P_VDP_DATA ex de, hl // Fast loop write_wrt16_loop_start: outi // out(c) ; hl++ ; b-- jp nz, write_wrt16_loop_start vdp_write_wrt16_exit_loop: __endasm; }
Unrolled version
void VDP_write_16K_unrolled(u8 count, const u8* src) __sdcccall(1) { src, count; __asm //exit if count is 0 or a jr z, vdp_write_wrt16_exit_loop_unrolled ld c, #P_VDP_DATA ex de, hl ld d, a // count // slow loop, individual outs and a, #0x07 jr z, write_wrt16_loop_start_unrolled ld b,a write_wrt16_loop_start_1: outi // out(c) ; hl++ ; b-- jp nz, write_wrt16_loop_start_1 write_wrt16_loop_start_unrolled: ld a, d // fast loop, outs unrolled in blocks of 8 and a, #0xf8 jr z, vdp_write_wrt16_exit_loop ld b,a write_wrt16_loop_start_2: .rept 8 outi // out(c) ; hl++ ; b-- .endm jp nz, write_wrt16_loop_start_2 vdp_write_wrt16_exit_loop_unrolled: __endasm; }
Entrar ou registrar-se para comentar