; this one is from passport ; This source code is altered and is not the original version found on ; the Exomizer homepage. ; It contains modifications made by qkumba to depack a packed file ; optionally crunched forward, and additional modifications by 4am ; for an optional progress UI. ; ; Original copyright statement follows: ; ; Copyright (c) 2002 - 2018 Magnus Lind. ; ; 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 distribution. ; ; 4. The names of this software and/or it's copyright holders may not be ; used to endorse or promote products derived from this software without ; specific prior written permission. ; ; ------------------------------------------------------------------- ; The decruncher jsr:s to the get_crunched_byte address when it wants to ; read a crunched byte into A. This subroutine has to preserve X and Y ; register and must not modify the state of the carry nor the overflow flag. ; ------------------------------------------------------------------- ;.import get_crunched_byte ; ------------------------------------------------------------------- ; this function is the heart of the decruncher. ; It initializes the decruncher zeropage locations and precalculates the ; decrunch tables and decrunches the data ; This function will not change the interrupt status bit and it will not ; modify the memory configuration. ; ------------------------------------------------------------------- ;.export decrunch ; ------------------------------------------------------------------- ; Controls if the shared get_bits routines should be inlined or not. ;INLINE_GET_BITS=1 ; ------------------------------------------------------------------- ; if literal sequences is not used (the data was crunched with the -c ; flag) then the following line can be uncommented for shorter and. ; slightly faster code. ;LITERAL_SEQUENCES_NOT_USED = 1 ; ------------------------------------------------------------------- ; if the sequence length is limited to 256 (the data was crunched with ; the -M256 flag) then the following line can be uncommented for ; shorter and slightly faster code. ;MAX_SEQUENCE_LENGTH_256 = 1 ; ------------------------------------------------------------------- ; if the sequence length 3 has its own offset table then the following ; line can be uncommented for in some situations slightly better ; compression at the cost of a larger decrunch table. EXTRA_TABLE_ENTRY_FOR_LENGTH_THREE = 1 ; ------------------------------------------------------------------- ; optional progress UI .ifndef SHOW_PROGRESS_DURING_DECRUNCH SHOW_PROGRESS_DURING_DECRUNCH = 0 .endif ; ------------------------------------------------------------------- ; zero page addresses used ; ------------------------------------------------------------------- zp_len_lo = $a7 zp_len_hi = $a8 zp_src_lo = $ae zp_src_hi = zp_src_lo + 1 zp_bits_hi = $fc zp_bitbuf = $fd zp_dest_lo = zp_bitbuf + 1 ; dest addr lo zp_dest_hi = zp_bitbuf + 2 ; dest addr hi .ifdef EXTRA_TABLE_ENTRY_FOR_LENGTH_THREE encoded_entries = 68 .else encoded_entries = 52 .endif tabl_bi = decrunch_table tabl_lo = decrunch_table + encoded_entries tabl_hi = decrunch_table + encoded_entries * 2 ;; refill bits is always inlined .macro mac_refill_bits pha jsr get_crunched_byte rol sta zp_bitbuf pla .endmacro .ifdef INLINE_GET_BITS .macro mac_get_bits adc #$80 ; needs c=0, affects v asl bpl gb_skip gb_next: asl zp_bitbuf bne gb_ok mac_refill_bits gb_ok: rol bmi gb_next gb_skip: bvc skip gb_get_hi: sec sta zp_bits_hi jsr get_crunched_byte skip: .endmacro .else .macro mac_get_bits jsr get_bits .endmacro get_bits: adc #$80 ; needs c=0, affects v asl bpl gb_skip gb_next: asl zp_bitbuf bne gb_ok mac_refill_bits gb_ok: rol bmi gb_next gb_skip: bvs gb_get_hi rts gb_get_hi: sec sta zp_bits_hi jmp get_crunched_byte .endif ; ------------------------------------------------------------------- ; no code below this comment has to be modified in order to generate ; a working decruncher of this source file. ; However, you may want to relocate the tables last in the file to a ; more suitable address. ; ------------------------------------------------------------------- ; ------------------------------------------------------------------- ; jsr this label to decrunch, it will in turn init the tables and ; call the decruncher ; no constraints on register content, however the ; decimal flag has to be #0 (it almost always is, otherwise do a cld) decrunch: .if SHOW_PROGRESS_DURING_DECRUNCH = 1 lda $FBB3 cmp #$EA bne + lda #$A1 ; use ! instead of | for initial spinner animation sta progress_char+1 sta progress_char+5 + ; ------------------------------------------------------------------- ; show initial on-screen progress UI ; ldy #7 init_progress_loop: lda progress_char,y jsr show_one_progress_char dey bpl init_progress_loop done_init_progress_loop: .endif ; ------------------------------------------------------------------- ; init zeropage, x and y regs. (12 bytes) ; ldy #0 ldx #3 init_zp: jsr get_crunched_byte sta zp_bitbuf - 1,x dex bne init_zp ; ------------------------------------------------------------------- ; calculate tables (62 bytes) + get_bits macro ; x and y must be #0 when entering ; clc table_gen: tax tya and #$0f sta tabl_lo,y beq shortcut ; start a new sequence ; ------------------------------------------------------------------- txa adc tabl_lo - 1,y sta tabl_lo,y lda zp_len_hi adc tabl_hi - 1,y shortcut: sta tabl_hi,y ; ------------------------------------------------------------------- lda #$01 sta