It makes me happy to see you back on this
Unless I'm missing something, isn't your keyboard decoder going to suffer from a storm of glitches as the PIC changes the keys pressed?
I think you need another set of registers (following the shift-register outputs) that will present the new keyboard state to the decoder array as one atomic change.
Question for you -- have you tried generating a <shift>+@ with your keyboard design? I've discovered that I have an issue with that style of key combination and I'm curious whether yours has the same problem.
The basic issue is when I try to type a shifted version of a key that on the original keyboard was not shifted, but on the PS/2 keyboard is shifted.
The "@" key on the original keyboard was its own key, on the PS/2 keyboard you have to type <shift>-2 to get "@" (so the shift key is overridden back to off in this case), but on the original keyboard I could type <SHIFT>+@ and both keys are asserted. With my approach (and I suspect yours) it becomes an unachievable combination.
I was considering implementing something along the lines of: If BOTH shift keys are held down this is an indication that <SHIFT> should be asserted even if the key-mapping indicates it should be overridden to not-asserted (but continue to assert the key that the mapping otherwise expressed). I haven't tried this approach yet, and I'm not sure it would be very intuitive even if I did implement it. I'm hoping a simpler cleaner approach surfaces eventually...