This commit is contained in:
Peter Ferrie 2019-07-11 17:20:38 -07:00
parent 4d7d90b893
commit 6797fe6268
3 changed files with 34 additions and 50 deletions

View File

@ -42,7 +42,7 @@ DECODE_TOKEN
LSR A LSR A
LSR A LSR A
CMP #$07 ; LITERALS_RUN_LEN? CMP #$07 ; LITERALS_RUN_LEN?
BNE PREPARE_COPY_LITERALS ; if not, count is directly embedded in token BCC PREPARE_COPY_LITERALS ; if not, count is directly embedded in token
JSR GETSRC ; get extra byte of variable literals count JSR GETSRC ; get extra byte of variable literals count
; the carry is always set by the CMP above ; the carry is always set by the CMP above
@ -62,7 +62,6 @@ LARGE_VARLEN_LITERALS ; handle 16 bits literals count
BYTE $A9 ; mask TAX (faster than BCS) BYTE $A9 ; mask TAX (faster than BCS)
PREPARE_COPY_LITERALS PREPARE_COPY_LITERALS
TAX TAX
PREPARE_COPY_LITERALS_HIGH
INY INY
COPY_LITERALS COPY_LITERALS
@ -95,7 +94,8 @@ PREPARE_COPY_MATCH_Y
COPY_MATCH_LOOP COPY_MATCH_LOOP
LDA $AAAA ; get one byte of backreference LDA $AAAA ; get one byte of backreference
INC COPY_MATCH_LOOP+1 INC COPY_MATCH_LOOP+1
BEQ GETMATCH_INC_HI BNE GETMATCH_DONE
INC COPY_MATCH_LOOP+2
GETMATCH_DONE GETMATCH_DONE
JSR PUTDST ; copy to destination JSR PUTDST ; copy to destination
DEX DEX
@ -104,10 +104,6 @@ GETMATCH_DONE
BNE COPY_MATCH_LOOP BNE COPY_MATCH_LOOP
BEQ DECODE_TOKEN ; (*like JMP DECODE_TOKEN but shorter) BEQ DECODE_TOKEN ; (*like JMP DECODE_TOKEN but shorter)
GETMATCH_INC_HI
INC COPY_MATCH_LOOP+2
BNE GETMATCH_DONE ; (*like JMP GETMATCH_DONE but shorter)
GET_LONG_OFFSET ; handle 16 bit offset: GET_LONG_OFFSET ; handle 16 bit offset:
JSR GETLARGESRC ; grab low 8 bits in X, high 8 bits in A JSR GETLARGESRC ; grab low 8 bits in X, high 8 bits in A
@ -128,7 +124,7 @@ OFFSHI = *+1
AND #$0F ; isolate match len (MMMM) AND #$0F ; isolate match len (MMMM)
ADC #$02 ; plus carry which is always set by the high ADC ADC #$02 ; plus carry which is always set by the high ADC
CMP #$12 ; MATCH_RUN_LEN? CMP #$12 ; MATCH_RUN_LEN?
BNE PREPARE_COPY_MATCH ; if not, count is directly embedded in token BCC PREPARE_COPY_MATCH ; if not, count is directly embedded in token
JSR GETSRC ; get extra byte of variable match length JSR GETSRC ; get extra byte of variable match length
; the carry is always set by the CMP above ; the carry is always set by the CMP above
@ -142,7 +138,7 @@ OFFSHI = *+1
TAY ; put high 8 bits in Y TAY ; put high 8 bits in Y
; large match length with zero high byte? ; large match length with zero high byte?
BNE PREPARE_COPY_MATCH_Y ; if not, continue BNE PREPARE_COPY_MATCH_Y ; if not, continue
; (*like JMP PREPARE_COPY_MATCH_Y but shorter)
DECOMPRESSION_DONE DECOMPRESSION_DONE
RTS RTS
@ -153,11 +149,9 @@ LZSA_DST_LO = *+1
LZSA_DST_HI = *+2 LZSA_DST_HI = *+2
STA $AAAA STA $AAAA
INC PUTDST+1 INC PUTDST+1
BEQ PUTDST_INC_HI BNE PUTDST_DONE
PUTDST_DONE
RTS
PUTDST_INC_HI
INC PUTDST+2 INC PUTDST+2
PUTDST_DONE
RTS RTS
GETLARGESRC GETLARGESRC
@ -170,9 +164,7 @@ LZSA_SRC_LO = *+1
LZSA_SRC_HI = *+2 LZSA_SRC_HI = *+2
LDA $AAAA LDA $AAAA
INC GETSRC+1 INC GETSRC+1
BEQ GETSRC_INC_HI BNE GETSRC_DONE
INC GETSRC+2
GETSRC_DONE GETSRC_DONE
RTS RTS
GETSRC_INC_HI
INC GETSRC+2
RTS

View File

@ -41,34 +41,32 @@ DECODE_TOKEN
AND #$18 ; isolate literals count (LL) AND #$18 ; isolate literals count (LL)
BEQ NO_LITERALS ; skip if no literals to copy BEQ NO_LITERALS ; skip if no literals to copy
CMP #$18 ; LITERALS_RUN_LEN_V2 << 3? LSR A ; shift literals count into place
BNE EMBEDDED_LITERALS ; if less, count is directly embedded in token LSR A
LSR A
CMP #$03 ; LITERALS_RUN_LEN_V2?
BCC PREPARE_COPY_LITERALS ; if less, count is directly embedded in token
JSR GETNIBBLE ; get extra literals length nibble JSR GETNIBBLE ; get extra literals length nibble
; add nibble to len from token ; add nibble to len from token
ADC #$02 ; (LITERALS_RUN_LEN_V2) minus carry ADC #$02 ; (LITERALS_RUN_LEN_V2) minus carry
CMP #$12 ; LITERALS_RUN_LEN_V2 + 15 ? CMP #$12 ; LITERALS_RUN_LEN_V2 + 15 ?
BNE PREPARE_COPY_LITERALS ; if less, literals count is complete BCC PREPARE_COPY_LITERALS ; if less, literals count is complete
JSR GETSRC ; get extra byte of variable literals count JSR GETSRC ; get extra byte of variable literals count
; the carry is always set by the CMP above ; the carry is always set by the CMP above
; GETSRC doesn't change it ; GETSRC doesn't change it
SBC #$EE ; overflow? SBC #$EE ; overflow?
BCC PREPARE_COPY_LITERALS ; if not, literals count is complete
PREPARE_COPY_LITERALS
TAX
BCC PREPARE_COPY_LITERALS_HIGH ; if not, literals count is complete
; handle 16 bits literals count ; handle 16 bits literals count
; literals count = directly these 16 bits ; literals count = directly these 16 bits
JSR GETLARGESRC ; grab low 8 bits in X, high 8 bits in A JSR GETLARGESRC ; grab low 8 bits in X, high 8 bits in A
TAY ; put high 8 bits in Y TAY ; put high 8 bits in Y
BCS PREPARE_COPY_LITERALS_HIGH ; (*like JMP PREPARE_COPY_LITERALS_HIGH but shorter)
EMBEDDED_LITERALS
LSR A ; shift literals count into place
LSR A
LSR A
PREPARE_COPY_LITERALS
TAX
PREPARE_COPY_LITERALS_HIGH PREPARE_COPY_LITERALS_HIGH
INY INY
@ -144,35 +142,36 @@ OFFSHI = *+1
AND #$07 ; isolate match len (MMM) AND #$07 ; isolate match len (MMM)
ADC #$01 ; add MIN_MATCH_SIZE_V2 and carry ADC #$01 ; add MIN_MATCH_SIZE_V2 and carry
CMP #$09 ; MIN_MATCH_SIZE_V2 + MATCH_RUN_LEN_V2? CMP #$09 ; MIN_MATCH_SIZE_V2 + MATCH_RUN_LEN_V2?
BNE PREPARE_COPY_MATCH ; if less, length is directly embedded in token BCC PREPARE_COPY_MATCH ; if less, length is directly embedded in token
JSR GETNIBBLE ; get extra match length nibble JSR GETNIBBLE ; get extra match length nibble
; add nibble to len from token ; add nibble to len from token
ADC #$08 ; (MIN_MATCH_SIZE_V2 + MATCH_RUN_LEN_V2) minus carry ADC #$08 ; (MIN_MATCH_SIZE_V2 + MATCH_RUN_LEN_V2) minus carry
CMP #$18 ; MIN_MATCH_SIZE_V2 + MATCH_RUN_LEN_V2 + 15? CMP #$18 ; MIN_MATCH_SIZE_V2 + MATCH_RUN_LEN_V2 + 15?
BNE PREPARE_COPY_MATCH ; if less, match length is complete BCC PREPARE_COPY_MATCH ; if less, match length is complete
JSR GETSRC ; get extra byte of variable match length JSR GETSRC ; get extra byte of variable match length
; the carry is always set by the CMP above ; the carry is always set by the CMP above
; GETSRC doesn't change it ; GETSRC doesn't change it
SBC #$E8 ; overflow? SBC #$E8 ; overflow?
BCC PREPARE_COPY_MATCH ; if not, the match length is complete
PREPARE_COPY_MATCH
TAX
BCC PREPARE_COPY_MATCH_Y ; if not, the match length is complete
BEQ DECOMPRESSION_DONE ; if EOD code, bail BEQ DECOMPRESSION_DONE ; if EOD code, bail
; Handle 16 bits match length ; Handle 16 bits match length
JSR GETLARGESRC ; grab low 8 bits in X, high 8 bits in A JSR GETLARGESRC ; grab low 8 bits in X, high 8 bits in A
TAY ; put high 8 bits in Y TAY ; put high 8 bits in Y
BYTE $A9 ; mask TAX, faster than TXA/TAX
PREPARE_COPY_MATCH
TAX
PREPARE_COPY_MATCH_Y PREPARE_COPY_MATCH_Y
INY INY
COPY_MATCH_LOOP COPY_MATCH_LOOP
LDA $AAAA ; get one byte of backreference LDA $AAAA ; get one byte of backreference
INC COPY_MATCH_LOOP+1 INC COPY_MATCH_LOOP+1
BEQ GETMATCH_INC_HI BNE GETMATCH_DONE
INC COPY_MATCH_LOOP+2
GETMATCH_DONE GETMATCH_DONE
JSR PUTDST ; copy to destination JSR PUTDST ; copy to destination
DEX DEX
@ -180,9 +179,6 @@ GETMATCH_DONE
DEY DEY
BNE COPY_MATCH_LOOP BNE COPY_MATCH_LOOP
JMP DECODE_TOKEN JMP DECODE_TOKEN
GETMATCH_INC_HI
INC COPY_MATCH_LOOP+2
BNE GETMATCH_DONE ; (*like JMP GETMATCH_DONE but shorter)
GETCOMBINEDBITS GETCOMBINEDBITS
EOR #$80 EOR #$80
@ -193,6 +189,7 @@ GETCOMBINEDBITS
PLP ; merge Z bit as the carry bit (for offset bit 0) PLP ; merge Z bit as the carry bit (for offset bit 0)
COMBINEDBITZ COMBINEDBITZ
ROL ; nibble -> bits 1-4; carry(!Z bit) -> bit 0 ; carry cleared ROL ; nibble -> bits 1-4; carry(!Z bit) -> bit 0 ; carry cleared
DECOMPRESSION_DONE
RTS RTS
GETNIBBLE GETNIBBLE
@ -221,12 +218,9 @@ LZSA_DST_LO = *+1
LZSA_DST_HI = *+2 LZSA_DST_HI = *+2
STA $AAAA STA $AAAA
INC PUTDST+1 INC PUTDST+1
BEQ PUTDST_INC_HI BNE PUTDST_DONE
PUTDST_DONE
DECOMPRESSION_DONE
RTS
PUTDST_INC_HI
INC PUTDST+2 INC PUTDST+2
PUTDST_DONE
RTS RTS
GETLARGESRC GETLARGESRC
@ -239,9 +233,7 @@ LZSA_SRC_LO = *+1
LZSA_SRC_HI = *+2 LZSA_SRC_HI = *+2
LDA $AAAA LDA $AAAA
INC GETSRC+1 INC GETSRC+1
BEQ GETSRC_INC_HI BNE GETSRC_DONE
INC GETSRC+2
GETSRC_DONE GETSRC_DONE
RTS RTS
GETSRC_INC_HI
INC GETSRC+2
RTS

View File

@ -89,8 +89,8 @@ lzsa2_decompress:
jmp short .get_match_length jmp short .get_match_length
.rep_match_or_large_offset: .rep_match_or_large_offset:
cmp dl,0c0H ; check if this is a 13-bit offset or a 16-bit offset/rep match (Y bit) ;;cmp dl,0c0H ; check if this is a 13-bit offset or a 16-bit offset/rep match (Y bit)
jnb .rep_match_or_16_bit jpe .rep_match_or_16_bit
; 13 bit offset ; 13 bit offset