]> git.sur5r.net Git - cc65/blobdiff - libsrc/common/lz4.s
atari5200: name conio constructor 'initconio'
[cc65] / libsrc / common / lz4.s
index 5a07a42ed2049a2d58f7e59f625912dbdae1411c..4702137bc31f580e060a276cc488925168fc5148 100644 (file)
@@ -2,6 +2,9 @@
 ; Lauri Kasanen, 6 Jun 2017
 ; (C) Mega Cat Studios
 ; An optimized LZ4 decompressor
+;
+; Almost 7 times faster, uses no RAM (vs 14 bytes BSS), and takes 1/4 the space
+; vs the official C source.
 ;
 
         .importzp       sp, sreg, regsave, regbank
         .import         memcpy_upwards,pushax,popax
         .export         _decompress_lz4
 
-_out = regsave
-_written = regsave + 2
-_tmp = tmp1
-_token = tmp2
-_offset = ptr3
-_in = sreg
-_outlen = ptr4
+out = regsave
+written = regsave + 2
+tmp = tmp1
+token = tmp2
+offset = ptr3
+in = sreg
+outlen = ptr4
 
 ; ---------------------------------------------------------------
 ; void decompress_lz4 (const u8 *in, u8 * const out, const u16 outlen)
@@ -26,22 +29,22 @@ _outlen = ptr4
 
 .proc   _decompress_lz4: near
 
-        sta     _outlen
-        stx     _outlen+1
+        sta     outlen
+        stx     outlen+1
 
         jsr     popax
-        sta     _out
-        stx     _out+1
+        sta     out
+        stx     out+1
 
         jsr     popax
-        sta     _in
-        stx     _in+1
+        sta     in
+        stx     in+1
 
 ;
 ; written = 0;
 ;
         lda     #$00
-        sta     _written
+        sta     written
 ;
 ; while (written < outlen) {
 ;
@@ -49,13 +52,13 @@ _outlen = ptr4
 ;
 ; token = *in++;
 ;
-L0004:  ldy     #0
-        lda     (_in),y
-        sta     _token
+L0004:  ldy     #$00
+        lda     (in),y
+        sta     token
 
-        inc     _in
+        inc     in
         bne     L000A
-        inc     _in+1
+        inc     in+1
 L000A:
 ;
 ; offset = token >> 4;
@@ -65,47 +68,47 @@ L000A:
         lsr     a
         lsr     a
         lsr     a
-        sta     _offset
-        stx     _offset+1
+        sta     offset
+        stx     offset+1
 ;
 ; token &= 0xf;
 ; token += 4; // Minmatch
 ;
-        lda     _token
+        lda     token
         and     #$0F
         clc
-        adc     #4
-        sta     _token
+        adc     #$04
+        sta     token
 ;
 ; if (offset == 15) {
 ;
-        lda     _offset
+        lda     offset
         cmp     #$0F
 L0013:  bne     L001A
 ;
 ; tmp = *in++;
 ;
-        ldy     #0
-        lda     (_in),y
-        sta     _tmp
+        ldy     #$00
+        lda     (in),y
+        sta     tmp
 
-        inc     _in
+        inc     in
         bne     L0017
-        inc     _in+1
+        inc     in+1
 L0017:
 ;
 ; offset += tmp;
 ;
         clc
-        adc     _offset
-        sta     _offset
+        adc     offset
+        sta     offset
         lda     #$00
-        adc     _offset+1
-        sta     _offset+1
+        adc     offset+1
+        sta     offset+1
 ;
 ; if (tmp == 255)
 ;
-        lda     _tmp
+        lda     tmp
         cmp     #$FF
 ;
 ; goto moreliterals;
@@ -114,55 +117,55 @@ L0017:
 ;
 ; if (offset) {
 ;
-L001A:  lda     _offset
-        ora     _offset+1
+L001A:  lda     offset
+        ora     offset+1
         beq     L001C
 ;
 ; memcpy(&out[written], in, offset);
 ;
-        lda     _out
+        lda     out
         clc
-        adc     _written
+        adc     written
         sta     ptr2
-        lda     _out+1
-        adc     _written+1
+        lda     out+1
+        adc     written+1
         tax
         lda     ptr2
         stx     ptr2+1
         jsr     pushax
-        lda     _in
-        ldx     _in+1
+        lda     in
+        ldx     in+1
         sta     ptr1
         stx     ptr1+1
-        ldy     #0
+;        ldy     #$00 - not needed as pushax zeroes Y
         jsr     memcpy_upwards
 ;
 ; written += offset;
 ;
-        lda     _offset
+        lda     offset
         clc
-        adc     _written
-        sta     _written
-        lda     _offset+1
-        adc     _written+1
-        sta     _written+1
+        adc     written
+        sta     written
+        lda     offset+1
+        adc     written+1
+        sta     written+1
 ;
 ; in += offset;
 ;
-        lda     _offset
+        lda     offset
         clc
-        adc     _in
-        sta     _in
-        lda     _offset+1
-        adc     _in+1
-        sta     _in+1
+        adc     in
+        sta     in
+        lda     offset+1
+        adc     in+1
+        sta     in+1
 ;
 ; if (written >= outlen)
 ;
-L001C:  lda     _written
-        cmp     _outlen
-        lda     _written+1
-        sbc     _outlen+1
+L001C:  lda     written
+        cmp     outlen
+        lda     written+1
+        sbc     outlen+1
 ;
 ; return;
 ;
@@ -171,45 +174,45 @@ L001C:  lda     _written
 ;
 ; memcpy(&offset, in, 2);
 ;
-L0047:  ldy     #0
-        lda     (_in),y
-        sta     _offset
+L0047:  ldy     #$00
+        lda     (in),y
+        sta     offset
         iny
-        lda     (_in),y
-        sta     _offset+1
+        lda     (in),y
+        sta     offset+1
 ;
 ; in += 2;
 ;
         lda     #$02
         clc
-        adc     _in
-        sta     _in
+        adc     in
+        sta     in
         bcc     L002F
-        inc     _in+1
+        inc     in+1
 ;
 ; copysrc = out + written - offset;
 ;
-L002F:  lda     _out
+L002F:  lda     out
         clc
-        adc     _written
-        pha
-        lda     _out+1
-        adc     _written+1
+        adc     written
+        tay
+        lda     out+1
+        adc     written+1
         tax
-        pla
+        tya
         sec
-        sbc     _offset
+        sbc     offset
         sta     ptr1
         txa
-        sbc     _offset+1
+        sbc     offset+1
         sta     ptr1+1
 ;
 ; offset = token;
 ;
         lda     #$00
-        sta     _offset+1
-        lda     _token
-        sta     _offset
+        sta     offset+1
+        lda     token
+        sta     offset
 ;
 ; if (token == 19) {
 ;
@@ -218,27 +221,27 @@ L0045:  bne     L003C
 ;
 ; tmp = *in++;
 ;
-        ldy     #0
-        lda     (_in),y
-        sta     _tmp
+        ldy     #$00
+        lda     (in),y
+        sta     tmp
 
-        inc     _in
+        inc     in
         bne     L0039
-        inc     _in+1
+        inc     in+1
 L0039:
 ;
 ; offset += tmp;
 ;
         clc
-        adc     _offset
-        sta     _offset
+        adc     offset
+        sta     offset
         tya
-        adc     _offset+1
-        sta     _offset+1
+        adc     offset+1
+        sta     offset+1
 ;
 ; if (tmp == 255)
 ;
-        lda     _tmp
+        lda     tmp
         cmp     #$FF
 ;
 ; goto morematches;
@@ -247,12 +250,12 @@ L0039:
 ;
 ; memcpy(&out[written], copysrc, offset);
 ;
-L003C:  lda     _out
+L003C:  lda     out
         clc
-        adc     _written
+        adc     written
         sta     ptr2
-        lda     _out+1
-        adc     _written+1
+        lda     out+1
+        adc     written+1
         tax
         lda     ptr2
         stx     ptr2+1
@@ -261,20 +264,20 @@ L003C:  lda     _out
 ;
 ; written += offset;
 ;
-        lda     _offset
+        lda     offset
         clc
-        adc     _written
-        sta     _written
-        lda     _offset+1
-        adc     _written+1
-L0046:  sta     _written+1
+        adc     written
+        sta     written
+        lda     offset+1
+        adc     written+1
+L0046:  sta     written+1
 ;
 ; while (written < outlen) {
 ;
-        lda     _written
-        cmp     _outlen
-        lda     _written+1
-        sbc     _outlen+1
+        lda     written
+        cmp     outlen
+        lda     written+1
+        sbc     outlen+1
         jcc     L0004
 
         rts