mirror of
https://github.com/emmanuel-marty/lzsa.git
synced 2024-08-29 21:29:04 +00:00
Improve hotpath of 6502 depacker further
This commit is contained in:
parent
2451d5802e
commit
4c5d44fff4
@ -82,14 +82,13 @@ COPY_LITERALS
|
|||||||
NO_LITERALS
|
NO_LITERALS
|
||||||
PLA ; retrieve token from stack
|
PLA ; retrieve token from stack
|
||||||
PHA ; preserve token again
|
PHA ; preserve token again
|
||||||
AND #$80 ; isolate match offset mode (O)
|
BMI GET_LONG_OFFSET ; $80: 16 bit offset
|
||||||
BNE GET_LONG_OFFSET ; $80: 16 bit offset
|
|
||||||
|
|
||||||
JSR GETSRC ; get 8 bit offset from stream in A
|
JSR GETSRC ; get 8 bit offset from stream in A
|
||||||
; Y (high 8 bits) is already set to 0 here
|
; Y (high 8 bits) is already set to 0 here
|
||||||
JMP FIX_OFFSET ; go increase offset
|
JMP FIX_OFFSET ; go increase offset
|
||||||
|
|
||||||
GET_LONG_OFFSET ; $00: 2-byte 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
|
||||||
TAY ; put high 8 bits in Y
|
TAY ; put high 8 bits in Y
|
||||||
TXA ; put low 8 bits in A
|
TXA ; put low 8 bits in A
|
||||||
@ -113,17 +112,9 @@ OFFSET_FIXED
|
|||||||
|
|
||||||
JSR GETSRC ; get extra byte of variable match length
|
JSR GETSRC ; get extra byte of variable match length
|
||||||
CMP #$FF ; FF <low 8 bits> <high 8 bits>?
|
CMP #$FF ; FF <low 8 bits> <high 8 bits>?
|
||||||
BEQ LARGE_VARLEN_MATCHLEN ; yes, go grab it
|
BNE SHORT_VARLEN_MATCHLEN ; if not, handle <8 bits> or <FE> <8 extra bits> sequence
|
||||||
|
|
||||||
JSR GETSINGLEVARLENSRC ; handle single extra byte of variable match len
|
; Handle FF <low 8 bits> <high 8 bits>:
|
||||||
|
|
||||||
CLC ; add extra byte to len from token
|
|
||||||
ADC #$0F ; (MATCH_RUN_LEN)
|
|
||||||
BCC PREPARE_COPY_MATCH
|
|
||||||
INY
|
|
||||||
JMP PREPARE_COPY_MATCH
|
|
||||||
|
|
||||||
LARGE_VARLEN_MATCHLEN ; FF <low 8 bits> <high 8 bits>
|
|
||||||
; match length = directly these 16 bits
|
; match length = 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
|
||||||
@ -131,6 +122,14 @@ LARGE_VARLEN_MATCHLEN ; FF <low 8 bits> <high 8 bits>
|
|||||||
BEQ DECOMPRESSION_DONE ; if so, this is the EOD code, bail
|
BEQ DECOMPRESSION_DONE ; if so, this is the EOD code, bail
|
||||||
JMP PREPARE_COPY_MATCH_Y
|
JMP PREPARE_COPY_MATCH_Y
|
||||||
|
|
||||||
|
SHORT_VARLEN_MATCHLEN
|
||||||
|
JSR GETSINGLEVARLENSRC ; handle single extra byte of variable match len
|
||||||
|
|
||||||
|
CLC ; add extra byte to len from token
|
||||||
|
ADC #$0F ; (MATCH_RUN_LEN)
|
||||||
|
BCC PREPARE_COPY_MATCH
|
||||||
|
INY
|
||||||
|
|
||||||
PREPARE_COPY_MATCH
|
PREPARE_COPY_MATCH
|
||||||
CLC ; add MIN_MATCH_SIZE to match length
|
CLC ; add MIN_MATCH_SIZE to match length
|
||||||
ADC #$03
|
ADC #$03
|
||||||
|
Loading…
Reference in New Issue
Block a user