новый bzpack

 День сегодня не задался. Утром хотел залить на Ucoz исправленную версию интро RGBcubeiso. Как обычно, Ucoz меня не узнал. Ладно, решаемо.

На позднее меня ждала установка VS 2019, так как я вчера обнаружил изменения в упаковщике bzpack и решил скомпилировать заново - мне не нужно х64, надо х86.

Снес старое VS 2013, часа четыре ставил новую версию, часа два осиливал компиляцию. всем адептам сигавна надо разок уебать по кумполу, чтобы больше не плодили ублюдские сырки.

Обе программы в комплекте с исходниками лежат тут. Программа, которую я написал, дала неплохие результаты при упаковке.

Получается файл tbrm.C размером 378 байт, сжатие:

bzpack -e1 -r tbrm.C tbrm.bzp

на выходе tbrm.bzp 185 байт. Процедура распаковки:

device zxspectrum48
        ORG #8000
begin
; jr $
; call dcod
; jp $6000;jr $
ld b,$60
push bc
;---------------------------------------------------------------------
; Copyright (c) 2021, Aleksey "homospec" Pichugin-Drochugin, Milos "baze" Bazelides, Pavel "Zilog" Cimbal
; This code is licensed under the BSD 2-Clause License.
; Reverse E1 decoder (39 bytes with setup, 28 bytes excluding setup).
dcod
ld hl,pice-1;SrcAddr
ld de,$6000+378-1;DstAddr
ld bc,0
ld a,%11000000
EliasGamma add a,a
rl c
ret c ; Option to include the end-of-stream marker.
NextBit add a,a
jr nz,NoFetch
ld a,(hl)
dec hl
rla
NoFetch jr c,EliasGamma
rla
jr c,CopyBytes
push hl
ld l,(hl)
ld h,b
add hl,de
; inc hl ; Option to extend the offset range.
inc bc
CopyBytes lddr
inc c
jr c,NextBit
pop hl
dec hl
jr NextBit
;---------------------------------------------------------------------
db $FF
picb:incbin "tbrm.bzp"
pice:
end
display /d,end-begin
savesna "!bzpa.sna",begin
savebin "tbrm.code",begin,end-begin

итого 229 байт

Осилил еще один вариант:
bzpack -e -r -bx2 tbrm.C tbrm.bzp
вышло 172 байта. Код распаковки

device zxspectrum48
        ORG #8000
begin
;------------------------------------------------------------------
; Copyright (c) 2025, Milos "baze" Bazelides
; This code is licensed under the BSD 2-Clause License.

; Reverse BX2 decoder (58 bytes with setup, 52 bytes excluding setup).
; This work is inspired by Einar Saukas' ZX2 (https://github.com/einar-saukas/ZX2).
ld bc,$6000:push bc
ld hl,packe-1;SrcAddr
ld de,$6000+378-1;DstAddr

ld a,128
DecodeLoop call EliasGamma
rla
jr nc,NewOffset

lddr

call EliasGamma
rla
jr c,RepOffset

NewOffset ex af,af'
ld a,(hl)
or a
ret z
ex af,af'
dec hl
inc bc

RepOffset push hl
ex af,af'
ld h,0
ld l,a
ex af,af'
add hl,de
lddr
pop hl
jr DecodeLoop

EliasGamma ld bc,1
EliasLoop add a,a
jr nz,NoFetch
ld a,(hl)
dec hl
rla
NoFetch ret nc
add a,a
rl c
rl b
jr EliasLoop
;------------------------------------------------------------------
packb:
 incbin "tbrm.bzp"
packe:
end
display /d,end-begin
savesna "!void.sna",begin

Другие способы я пока не осилил, как с предыдущей версией. Иногда интереснее оптимизировать код, но здесь второй случай, когда данные выходят за пределы 256б, и только хитрый способ сжимает поделку до интро.

Комментарии