]> git.sur5r.net Git - cc65/commitdiff
Fix more than 256 codes of same length. 514/head
authorPiotr Fusik <fox@scene.pl>
Tue, 7 Nov 2017 19:10:19 +0000 (20:10 +0100)
committerPiotr Fusik <fox@scene.pl>
Tue, 7 Nov 2017 19:10:19 +0000 (20:10 +0100)
Fix all 256 literal codes of same length.

libsrc/zlib/inflatemem.s

index f49c5fc7978eaaa9caec70f63d72d4c18a47619a..bc89f2016caa4d6b9223002a35215480f4b04e39 100644 (file)
@@ -1,5 +1,5 @@
 ;
-; 2017-11-06, Piotr Fusik
+; 2017-11-07, Piotr Fusik
 ;
 ; unsigned __fastcall__ inflatemem (char* dest, const char* source);
 ;
@@ -344,6 +344,9 @@ buildHuffmanTree_clear:
 buildHuffmanTree_countCodeLengths:
         ldx     literalSymbolCodeLength,y
         inc     nBitCode_literalCount,x
+        bne     buildHuffmanTree_notAllLiterals
+        stx     allLiteralsCodeLength
+buildHuffmanTree_notAllLiterals:
         cpy     #CONTROL_SYMBOLS
         bcs     buildHuffmanTree_noControlSymbol
         ldx     controlSymbolCodeLength,y
@@ -394,12 +397,33 @@ fetchCode_nextBit:
         jsr     getBit
         rol     a
         inx
+        bcs     fetchCode_ge256
+; are all 256 literal codes of this length?
+        cpx     allLiteralsCodeLength
+        beq     fetchCode_allLiterals
+; is it literal code of length X?
         sec
         sbc     nBitCode_literalCount,x
-        bcc     fetchCode_literal
+        bcs     fetchCode_notLiteral
+; literal code
+;       clc
+        adc     nBitCode_literalOffset,x
+        tax
+        lda     codeToLiteralSymbol,x
+fetchCode_allLiterals:
+        clc
+        rts
+; code >= 256, must be control
+fetchCode_ge256:
+;       sec
+        sbc     nBitCode_literalCount,x
+        sec
+; is it control code of length X?
+fetchCode_notLiteral:
 ;       sec
         sbc     nBitCode_controlCount,x
         bcs     fetchCode_nextBit
+; control code
 ;       clc
         adc     nBitCode_controlOffset,x
         tax
@@ -408,13 +432,6 @@ fetchCode_nextBit:
         tax
 ;       sec
         rts
-fetchCode_literal:
-;       clc
-        adc     nBitCode_literalOffset,x
-        tax
-        lda     codeToLiteralSymbol,x
-        clc
-        rts
 
 ; Read A minus 1 bits, but no more than 8
 getAMinus1BitsMax8:
@@ -523,6 +540,8 @@ nBitCode_literalOffset:
         .res    2*TREE_SIZE
 nBitCode_controlOffset:
         .res    2*TREE_SIZE
+allLiteralsCodeLength:
+        .res    1
 
 codeToLiteralSymbol:
         .res    256