I use no opcodes. I store only lengths:
[SKIP-LENGTH] [COPY-LENGHT] [DATA…] [SKIP-LENGTH] [COPY-LENGHT] [DATA…]
That might be even better, though as you noted you have to wrap runs across
scan lines. It would be very interesting to benchmark the different methods
against each other.
I haven’t found a good way for blitting text, though - I’m still doing
colour-keyed blitting with a test for each pixel. It is tempting to
use some RLE variant for this as well; has anyone tried it?