; *************************************************************************** ; *************************************************************************** ; ; lzsa2_6502.s ; ; NMOS 6502 decompressor for data stored in Emmanuel Marty's LZSA2 format. ; ; This code is written for the ACME assembler. ; ; Optional code is presented for two minor 6502 optimizations that break ; compatibility with the current LZSA2 format standard. ; ; The code is 241 bytes for the small version, and 267 bytes for the normal. ; ; Copyright John Brandwood 2019. ; ; Distributed under the Boost Software License, Version 1.0. ; (See accompanying file LICENSE_1_0.txt or copy at ; http://www.boost.org/LICENSE_1_0.txt) ; ; *************************************************************************** ; *************************************************************************** ; *************************************************************************** ; *************************************************************************** ; ; Decompression Options & Macros ; ; ; Save 7 bytes of code, and 21 cycles every time that a ; 16-bit length is decoded? ; ; N.B. Setting this breaks compatibility with LZSA v1.2 ; LZSA_SWAP_LEN16 = 0 ; ; Save 3 bytes of code, and 4 or 8 cycles when decoding ; an offset? ; ; N.B. Setting this breaks compatibility with LZSA v1.2 ; LZSA_SWAP_XZY = 0 ; ; Choose size over space (within sane limits)? ; LZSA_SMALL_SIZE = 0 ; ; Remove code inlining to save space? ; ; This saves 15 bytes of code at the cost of 7% speed. ; !if LZSA_SMALL_SIZE { LZSA_NO_INLINE = 1 } else { LZSA_NO_INLINE = 0 } ; ; Use smaller code for copying literals? ; ; This saves 11 bytes of code at the cost of 5% speed. ; !if LZSA_SMALL_SIZE { LZSA_SHORT_CP = 1 } else { LZSA_SHORT_CP = 0 } ; ; Assume that we're decompressing from a large multi-bank ; compressed data file, and that the next bank may need to ; paged in when a page-boundary is crossed. ; LZSA_FROM_BANK = 0 ; ; We will read from or write to $FFFF. This prevents the ; use of the "INC ptrhi / BNE" trick and reduces speed. ; LZSA_USE_FFFF = 0 ; ; Macro to increment the source pointer to the next page. ; !if LZSA_FROM_BANK { !macro LZSA_INC_PAGE { jsr lzsa2_next_page } } else { !macro LZSA_INC_PAGE { inc