День сегодня не задался. Утром хотел залить на 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
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б, и только хитрый способ сжимает поделку до интро.
Комментарии
Отправить комментарий