; unaplib_b.s - aPLib backward decompressor for 6809 - 154 bytes ; ; in: x = last byte of compressed data ; y = last byte of decompression buffer ; out: y = first byte of decompressed data ; ; Copyright (C) 2020 Emmanuel Marty ; ; This software is provided 'as-is', without any express or implied ; warranty. In no event will the authors be held liable for any damages ; arising from the use of this software. ; ; Permission is granted to anyone to use this software for any purpose, ; including commercial applications, and to alter it and redistribute it ; freely, subject to the following restrictions: ; ; 1. The origin of this software must not be misrepresented; you must not ; claim that you wrote the original software. If you use this software ; in a product, an acknowledgment in the product documentation would be ; appreciated but is not required. ; 2. Altered source versions must be plainly marked as such, and must not be ; misrepresented as being the original software. ; 3. This notice may not be removed or altered from any source distribution. apl_decompress lda #$80 ; initialize empty bit queue sta = 32000 ? bge apincby2 ; if so, increase match len by 2 cmpx #$0500 ; offset >= 1280 ? bge apincby1 ; if so, increase match len by 1 cmpx #$80 ; offset < 128 ? bge apgotlen ; if so, increase match len by 2 apincby2 addd #1 apincby1 addd #1 apgotlen pshs u ; save source compressed data pointer tfr d,x ; copy match length to X aprepof leau $aaaa,y ; put backreference start address in U (dst+offset) apcpymt lda ,-u ; copy matched byte sta ,-y leax -1,x ; decrement X bne apcpymt ; loop until all matched bytes are copied puls u ; restore source compressed data pointer lda #$02 ; clear 'follows literal' flag bra aptoken apdibits bsr apgetbit ; read bit rolb ; push into B apgetbit lsl