A few things right off the bat. Your
uint8_t status = inportb(0x64);
while (status & 0x01)
will instantly return if there is no input ready rather than waiting for input to be ready. However, since the controller fired the interrupt, that means there is a byte ready to be read. No need to check.
Also, and this is what catches most people, the controller will fire an interrupt once for each byte sent to the single-byte
output buffer. You must only read one byte per interrupt. Therefore, you must maintain a running buffer of your own and keep track of the start of the packet, which you have done with your mouseCycle member.
Please note that you must exit your interrupt handler as soon as you have stored that byte and updated your mouseCycle member, allowing the controller to fire the next interrupt so that you can come back and do it again.
I believe that all you need to do is re-write your handler to be called once for each byte, handling only a single byte per call, and you will get the result you are looking for. Also, no need to check to see if a byte is available, the interrupt fired, so a byte is available.