Есть исходники, а текстового описания я не находил.
Вид для печати
Есть исходники, а текстового описания я не находил.
Сократил на 2 байта и чуть-чуть ускорил распаковщик zx0. Это распаковщик для "классического" формата, не для второй версии. У меня не получилось выигрыша от перехода ко второй версии ни для 8080 ни для pdp11. К счастью степень сжатия одинаковая и вторая версия упаковщика может сжимать в "классический" формат.
Грац за готовый код и утилиту под винду. Заюзал для УКНЦ. Работоспособно и шустренько так.
Единственно кажется для УКНЦ вот эта команда может быть из разряда "не все йогурты одинаково полезны":
Дело в том что на УКНЦ чтение из некоторых ячеек памяти вызывает какие-то действия (например при чтении @#177024 загрузятся некими значениями ячейки памяти @#177020, @#177022). Разумеется случай нереально маловероятный, но "а вдруг".Код:BISB (R1)+,R0 ; read low byte
TST (SP)+ ; skip saved R0
RET
На БК наверное таких ужасов нету и там все окей.
UPD: туплю-же. это ведь стек и он туда не залезет, просто привычка такая не юзать сокращения вида tst (Rn)+ или cmp (Rn)+,(Rn)+
Исходник распаковщика, использующего алгоритм NRV2d из библиотеки UCL. Для других платформ такой уже делали давно (это кстати основной способ упаковки для утилиты UPX).
Распаковка одна из самых быстрых, но по степени сжатия уступает остальным, в целом - неплохо.
Скрытый текст
Код:; Алгоритм распаковки NRV2d (UCL) для БК / PDP
; Вход:
; R0 - адрес сжатых данных;
; R1 - адрес распаковки.
N2DUNPK:
MOV #-1, R4
XOR R2, R2
BR DCL
NXDC: MOVB (R0)+, (R1)+
DCL: CALL RB
BCS NXDC
MOV #1, R3
OFN: ADD R3, R3
CALL RB
ADC R3
CALL RB
BCS OFE
DEC R3
ADD R3, R3
CALL RB
ADC R3
BR OFN
RB: ADD R2, R2
BEQ RBZ
RET
RBZ: MOVB (R0)+, R2
SWAB R2
BIC #177, R2
BIS #200, R2
ADD R2, R2
RET
OFE: SUB #3, R3
BCC OF2
MOV R4, R3
XOR R5, R5
CALL RB
ADC R5
BR OF3
OF2: SWAB R3
MOVB (R0)+, R5
BIC #177400, R5
BIS R5, R3
COM R3
BEQ BRK
XOR R5, R5
SEC
ROR R3
ADC R5
MOV R3, R4
OF3: ADD R5, R5
CALL RB
ADC R5
BNE LF1
INC R5
NXLF: ADD R5, R5
CALL RB
ADC R5
CALL RB
BCC NXLF
ADD #2, R5
LF1: CMP R3, #175400
ADC R5
INC R5
ADD R1, R3
NXMV: MOVB (R3)+, (R1)+
SOB R5, NXMV
BR DCL
BRK: RET
[свернуть]
Для упаковки используется приложенная утилита `n2dpack`. Отличие от оригинального алгоритма - переделанный финальный маркер (с длинного на короткий).
Пример использования: Вложение 77229.
Еще один распаковщик - это хорошо, но сейчас он представляет скорее исторический интерес, современные намного лучше. Если взять например zx1, то он сжимает сильнее. А распаковщик 108 байт против 160 и почти в два раза быстрее.