Mode 0x03 (80x25 text) and the 0xB8000 framebuffer you write to directly here are exactly what GRUB's text menu and countless OSDev-wiki 'print to screen' tutorials rely on before any real driver exists. Getting the row-stride math wrong (each row is 160 bytes, not 80) is a classic off-by-factor-of-two bug that scrambles text across the wrong rows on real VGA hardware.