Prinzipiell könntest du eine Art Schleife machen, die überprüft welcher Knopf gedrückt wurde und dann entsprechend zu ner anderen Schleife springt.

Also in der Art:
BTFSS PortA,0 ;also falls die Taster an PortA hängen
GOTO USE1
BTFSS PortA,1
GOTO USE2
BTFSS PortA,2
GOTO USE3

Und das eventuell in jede Schleife einbaun

Die Schleifen wären dann so aufgebaut:

USE1
MOVFW PortB ;gesamten PortB nach W
ANDLW B'11110000' ;wir wollen ja nur die Pins<4:7> z. B.
MOVWF TEMP ;zur Ausgabe müssen die Werte noch in den unteren Bereich
SWAPF TEMP ;daher einfach in nen Temp Register kopieren und die oberen 4 Bit mit den unteren 4 vertauschen
MOVFW TEMP ;wieder zurück
MOVWF PORTC ;Ausgabe an PortC
GOTO USE1 ;Und wieder von vorne

Die anderen würde ich ähnlich aufbauen
Wobei ich jetzt davon ausgegangen bin, daß IC3a ein Input und IC1a ein Output is. (Du hättest dann etwa eine Verzögerung von 17 µs)

Wenn die Daten auch in die andere Richtung müssen, müßte man vorher die Ports auf Out/Input entsprechend umschalten und das selbe Spiel in die andere Richtung durchführen.