diff --git a/README.md b/README.md index d35da3f..172276d 100755 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ Performance over well-known compression corpus files: Large 11159482 3771025 (33,79%) 3649821 (32,70%) enwik9 1000000000 371841591 (37,18%) 355429941 (35,54%) -As an example of LZSA's simplicity, a size-optimized decompressor on 8088 has been implemented in 105 bytes. +As an example of LZSA's simplicity, a size-optimized decompressor on 8088 has been implemented in 91 bytes. The compressor is approximately 2X slower than LZ4_HC but compresses better while maintaining similar decompression speeds and decompressor simplicity. diff --git a/asm/8088/decompress_small.S b/asm/8088/decompress_small.S index 2daacb3..5f3453c 100755 --- a/asm/8088/decompress_small.S +++ b/asm/8088/decompress_small.S @@ -22,9 +22,9 @@ bits 16 ; --------------------------------------------------------------------------- -; Decompress LZSA frame +; Decompress raw LZSA block ; inputs: -; * ds:si: LZSA frame +; * ds:si: raw LZSA block ; * es:di: output buffer ; output: ; * ax: decompressed size @@ -33,12 +33,6 @@ lzsa_decompress: push di ; remember decompression offset cld ; make string operations (lods, movs, stos..) move forward - lodsw ; grab first 2 bytes of block size - mov bp,ax ; keep block size in dx - lodsb ; grab last byte of block size / compression flag - test al,al ; if the compressed data is larger than 65,535 bytes, or if it is uncompressed, bail - jne .done_decompressing - add bp,si ; point at the end of the compressed data xor cx,cx @@ -60,9 +54,6 @@ lzsa_decompress: .copy_literals: rep movsb ; copy cx literals from ds:si to es:di - cmp si,bp ; did we reach the end of the compressed data? - je .done_decompressing ; we did, bail. the last token does not include a match copy - test dl,dl ; check match offset size in token (O bit, ie. bit 7, the sign bit) js .get_long_offset @@ -75,6 +66,7 @@ lzsa_decompress: .get_match_length: inc ax ; the match offset is stored off-by-1, increase it + je short .done_decompressing ; bail if we hit EOD xchg ax,dx ; dx: match offset ax: original token and al,0FH ; isolate match length in token (MMMM)