Hi,

du musst an allen genutzten Tastern die Pullups aktivieren ("//oder müsste das 0xFF sein?" - Ja)
Die 5000 Schleifendurchläufe sind auf realer Hardware vermutlich als Schutz gegen prellende Kontakte gedacht.
Sonst kann ich auf die schnelle keinen Fehler entdecken, ich bin aber auch lausig im Fehlersuchen ohne Debugger/Hardware

mfG
Markus

Edit: Ich habs mal schnell durchsimuliert, der Code funktioniert so wie du ihn eingestellt hast wunderbar (abgesehen von den fehlenden 0xFF, die aber nur auf echter Hardware auffallen weil die Taster nichts tun) - im übrigen finde ich die Lösung mit der 16-Bit Value richtig pfiffig, ich hätte da vermutlich versucht etwas über den ASM-Befehl ROL (Linksrotation durch das Carry-Bit) gedreht