Есть исходники, а текстового описания я не находил.
Есть исходники, а текстового описания я не находил.
Сократил на 2 байта и чуть-чуть ускорил распаковщик zx0. Это распаковщик для "классического" формата, не для второй версии. У меня не получилось выигрыша от перехода ко второй версии ни для 8080 ни для pdp11. К счастью степень сжатия одинаковая и вторая версия упаковщика может сжимать в "классический" формат.
lexarr(26.04.2022), Manwe(05.10.2021), Oleg N. Cher(06.10.2021)
Грац за готовый код и утилиту под винду. Заюзал для УКНЦ. Работоспособно и шустренько так.
Единственно кажется для УКНЦ вот эта команда может быть из разряда "не все йогурты одинаково полезны":
Дело в том что на УКНЦ чтение из некоторых ячеек памяти вызывает какие-то действия (например при чтении @#177024 загрузятся некими значениями ячейки памяти @#177020, @#177022). Разумеется случай нереально маловероятный, но "а вдруг".Код:BISB (R1)+,R0 ; read low byte TST (SP)+ ; skip saved R0 RET
На БК наверное таких ужасов нету и там все окей.
UPD: туплю-же. это ведь стек и он туда не залезет, просто привычка такая не юзать сокращения вида tst (Rn)+ или cmp (Rn)+,(Rn)+
Последний раз редактировалось BlaireCas; 07.11.2021 в 13:02.
Manwe(08.11.2021)
Исходник распаковщика, использующего алгоритм 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`. Отличие от оригинального алгоритма - переделанный финальный маркер (с длинного на короткий).
Пример использования: sreverz.zip.
Последний раз редактировалось lexarr; 27.01.2025 в 18:43.
Еще один распаковщик - это хорошо, но сейчас он представляет скорее исторический интерес, современные намного лучше. Если взять например zx1, то он сжимает сильнее. А распаковщик 108 байт против 160 и почти в два раза быстрее.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)