This is something I found from observing the input file and ram dump output. I'm not sure if it can apply to all files or not, though.
YKCMP format
0x00 chars(8) YKCMP_V1
0x08 uInt32 unknown (0x00000004)
0x0C uInt32 compressed file size
0x10 uInt32 decompressed file size
After 0x14 are compressed data.
From 0x14
Read 1 byte (I'll call it b1.)
If b1 < 0x80 Read and output b1 bytes.
If b1 >= 0x80 there will be 2 indicators which are number of bytes to move back (Y) and number of bytes to read (X).
If b1 >= 0x80 but < 0xC0 split it to XY.
If b1 >= 0xC0 but < 0xE0 read 1 more byte (I'll call it b2) and split it to XXYY
If b1 >= 0xE0 read 2 more bytes and split it to XXXYYY
Note: The values will be something like move back Y+1 bytes, and then for X, you have to subtract from its base first. (Ex. If XY then X-8, if XXYY, then XX-0xC0, if XXXYYY then XXX-0xE00)
Ex. From your compressed file example, starting from 0x14.
@0x14: b1 = 0B, so read 0B bytes and output.
@0x20: b1 = 91, so X = 9, Y = 1. Move back 1+1= 2 bytes. Read 9-8+1= 2 bytes and output. (You got 00 00.)
@0x21: b1 = A3, Move back 3+1= 4 bytes. Read A-8+1 = 3 bytes and output. (00 00 00)
@0x22: b1 = 8D, Move back D+1= 0xE bytes. Read 8-8+1= 1 byte and output. (41)
@0x23: b1 = 04, read 04 bytes and output. (4E 4D 30 30)
@0x28: b1 = 91. Move back 2 bytes, read 2 bytes. (30 30)
@0x29: b1 = 04, read 04 bytes and output. (2E 44 41 54)
@0x2E: b1 = C5, b2= 11. Move back 0x11+1= 0x12 bytes. Read C5-C0+2=7 byte and output. (00 00 00 00 00 00 00)
Ex. for 0xE0 base is b1 = FF, b2 = F3, b3 = FF. So you get FFF3FF. XXX = FFF, YYY = 3FF. Move back 3FF+1 bytes. Read FFF-E00=1FF+3 bytes.
(I think if it's 0xC0 base, you add 2 to number of byte read, and if it's 0XE00 base, you add 3 to number of byte read, but I'm not 100% sure. You can try to experiment with these numbers.)