I was thinking about your approach to the keyboard. I'm making assumptions about what's going on inside the PIC, but I suspect they're correct...
If correct, it doesn't look like you'll be able to express multiple keys down at the same time (exclusive of shift)? Not sure if you care, but that was something used in at least the 'mini-dos' feature of NEWDOS/80... If that's not correct, I'd be curious how you're handling that case with only the 6 lines coming out of the PIC to choose-a-character.
I only noticed this because I recently had to redo a bit of my keyboard interface to deal with more of the oddness surrounding the mapping of an event driven keyboard (the PS2) to the very-simple (yet basically instantaneous) nature of the TRS80 approach.
If you get a chance, try the following on your keyboard and see what the results are:
<Press Shift><Press :|;><Release Shift><Release :|;> -- I suspect the TRS80 code will see ":", followed by ";".
From what I can discern, the original keyboard scan routines deal with the fact the user may release shift out-of-order, but the fake-"shift"ing/Un"Shift"ing that we need to do when doing the mapping, generally (unless cared for), results in the shift signal changing state in a way that causes the TRS80 code to see both keys being typed. I've found similar issues with the "+|=", "'|"" (single/double quote key), and issues with "@". Basically any keys where the PS2 keys map to two separate TRS80 keys.
I was able to correct that behavior on my design by only allowing my "ForceShift" and "ForceNoShift" signals to change at the beginning of each PS2 keypress. I realize that doesn't "mean anything" without having the internals of my design, but I suspect you're doing something very similar in your PIC code - so perhaps it will make sense

Interestingly enough (to me at least) the TRS32 emulator suffers from exactly the same symptoms I was seeing. (So I at least take solace in the fact I'm not the only one who missed it

)