User Tag List

Страница 7 из 9 ПерваяПервая ... 3456789 ПоследняяПоследняя
Показано с 61 по 70 из 85

Тема: Упаковщики

  1. #61

    Регистрация
    06.12.2017
    Адрес
    г. Москва
    Сообщений
    1,724
    Спасибо Благодарностей отдано 
    167
    Спасибо Благодарностей получено 
    406
    Поблагодарили
    257 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ivagor Посмотреть сообщение
    Да, только я не помню, какой версией сжимал. Сейчас уже есть 1.3.7, а там была или 1.3.5 или 1.3.6. На всякий случай размер сжатого файла 7965 байт, md5=2f8f9105e2bca7710256195fdb347fb4
    Разбираюсь с chipdale.rom, почти получилось Визуально распакованные файлы совпадают, но у меня получается на 6 байт больше оригинала, ищу проблему.
    Опять же, в документации туманно написано:
    233: a second and third byte follow, forming a little-endian 16-bit value. The final encoded match length is that 16-bit value.
    Казалось бы, финальный результат. Но выше было написано the encoded match length is the actual match length offset by the minimum, which is 2 bytes. For instance, an actual match length of 5 bytes to be copied, is encoded as 3.
    Непонятно, то 16-битное final всё-таки финальное, или ещё надо добавить 2? Потому что в других случаях "финальным" называлось значение после добавления 2: and then the minmatch of 2 is added, to compose the final match length.
    Автор документации, конечно, не слишком следит за терминологией.
    Последний раз редактировалось Manwe; 08.08.2021 в 12:40.
    manwe.pdp-11.ru

  2. #61
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #62

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,393
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,367
    Поблагодарили
    1,317 сообщений
    Mentioned
    39 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Manwe Посмотреть сообщение
    Непонятно, то 16-битное final всё-таки финальное, или ещё надо добавить 2?
    То 16 битное финальное, в других случаях добавляется 2.

  4. #63

    Регистрация
    06.12.2017
    Адрес
    г. Москва
    Сообщений
    1,724
    Спасибо Благодарностей отдано 
    167
    Спасибо Благодарностей получено 
    406
    Поблагодарили
    257 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ivagor Посмотреть сообщение
    То 16 битное финальное, в других случаях добавляется 2.
    Архитектурный косяк, конечно. Из-за этого приходится заводить отдельный признак для 16-битных значений и делать лишнюю проверку. Итого, две лишние инструкции.
    В общем, поборол я chipdale.rom, распаковщик работает корректно. Размер 254 байта (244 байт для неперемещаемого варианта). И чуть быстрей исполняется (на 6% быстрей твоего оригинального).
    Оптимизация привела к тому, что появляется один артефакт: рандомный байт в памяти после распакованного файла. Это мешает, если данные выводятся сразу на экран. В таком случае после распаковки надо очищать содержимое байта, на который указывает R2. Чуть сложней случай - распаковка впритык к границе ПЗУ - тогда лишний байт попытается записать себя в ПЗУ и произойдёт прерывание (впрочем, означающее конец распаковки).

    Код:
    ; LZSA2 PDP-11 decompressor by Manwe/SandS
    ; Thanks to Ivan Gorodetsky
    ; Usage:
    ; MOV #src_adr,R1
    ; MOV #dst_adr,R2
    ; CALL Unpack
    
    
    Unpack: MOV PC,Table+2      ; correct table address
            ADD #XYZ-Unpack-2,Table+2
            CLR R4              ; no nibbles sign
    Token:  MOVB (R1)+,R3       ; read token
    
    Liter:  MOV R3,R0
            ASR R0
            ASR R0
            ASR R0
            BIC #177774,R0      ; get 2 bits
            BEQ Decode
            CMP R0,#3           ; literals length
            BNE Copy
                MOVB #239.,(R2) ; set limit
                CALL Extend
    Copy:   MOVB (R1)+,(R2)+    ; literals length in R0
            SOB R0,Copy
    
    Decode: MOV R3,-(SP)    
            COM R3              ; invert for faster detect
            ROLB R3             ; get 2 bits
            ROL R0
            ROLB R3
            ROL R0
    Table:  MOVB XYZ(R0),R0
            ADD R0,PC           ; run subroutine
    Save:   MOV R0,(PC)+        ; save offset for future
    Offset: .WORD 0
    
    Match:  MOV (SP)+,R0
            BIC #177770,R0      ; get 3 bits
            CMP R0,#7
            BNE Clone
                MOVB #233.,(R2) ; set limit
                CALL Extend
                BCS Clone+4     ; skip minimal match length
    Clone:  ADD #2,R0           ; match length
            TSTB R0
            BEQ Exit
    
            MOV R2,R3
            ADD Offset,R3
    1:      MOVB (R3)+,(R2)+
            SOB R0,1
            BR Token
    
    
    XYZ:    .BYTE oOther-Save, o13bit-Save, o9bit-Save, o5bit-Save
    
    o5bit:  CALL Nibble         ; get nibble in R0
            ROLB R3
            ROL R0
            BIS #177740,R0      ; set bits 5-15
            BR Save
    
    o9bit:  ROLB R3
            ROL R0
            SWAB R0
            BISB (R1)+,R0
            BIS #177000,R0      ; set bits 9-15
            BR Save
    
    o13bit: CALL Nibble         ; get nibble in R0
            ROLB R3
            ROL R0
            SWAB R0
            BISB (R1)+,R0       ; 8 bits
            BIS #160000,R0      ; set bits 13-15
            SUB #512.,R0
            BR Save
    
    oOther: ROLB R3
            BCS 1
                MOV Offset,R0   ; reuse offset
                BR Match
    1:      MOVB (R1)+,R0
            SWAB R0
            CLRB R0
            BISB (R1)+,R0
            BR Save
    
    Nibble: COM R4
            BNE 1
                MOV R5,R0
                BR 2
    1:      MOVB (R1)+,R5       ; read 2 nibbles
            MOV R5,R0
            ASR R0
            ASR R0
            ASR R0
            ASR R0
    2:      BIC #177760,R0      ; leave 4 low bits
            RET
    
    Extend: MOV R0,-(SP)        ; save original value
            CALL Nibble         ; get nibble in R0
            CMP R0,#15.
            BNE Ext2
                CLR R0
                BISB (R1)+,R0
                CMPB R0,(R2)    ; compare with limit
                BNE Ext1
                    ; unnecessary for short files
                    MOVB (R1)+,R0   ; read low byte
                    SWAB R0
                    CLRB R0
                    BISB (R1)+,R0   ; read high byte
                    SWAB R0
                    TST (SP)+       ; skip saved R0
                    SEC             ; set sign of 16 bit vslue
                    RET
    Ext1:       ADD #15.,R0
    Ext2:   ADD (SP)+,R0        ; add original value
    Exit:   RET
    
    .END
    Если интересно как я проверяю скорость: пишу такой код, он замеряет сколько тиков таймера распаковывается файл и выводит 10-чное число на экран (средствами MKDOS, в других операционных системах не выведет). Чем меньше число, тем быстрей исполнение. Один тик таймера равен 128-и тактам процессора.
    Код:
            TimerCommand    = 177712    ; timer port address
            TimerCounter    = 177710
            TimerInitial    = 177706
            DecOut          = 120060    ; MKDOS subroutine
    
            MOV #1,@#TimerInitial
            MOV #1,@#TimerCommand       ; stop and init timer   
            MOV #TimerCounter,R4
            MTPS #340                   ; disable all interruptions
            MOV #32,@#TimerCommand      ; start timer
    1:      TST (R4)                    ; wait till it's really started
            BNE 1
    
        MOV #File,R1
        MOV #40000,R2
        CALL Unpack
    
            MOV @#TimerCounter,R0       ; get timer value
            NEG R0
            MTPS #0                     ; enable all interruptions
            CALL   @DecOut
    
        HALT
    - - - Добавлено - - -

    Цитата Сообщение от ivagor Посмотреть сообщение
    Да, только я не помню, какой версией сжимал. Сейчас уже есть 1.3.7, а там была или 1.3.5 или 1.3.6. На всякий случай размер сжатого файла 7965 байт
    7963 байт выдаёт последняя версия упаковщика
    manwe.pdp-11.ru

  5. #64

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,393
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,367
    Поблагодарили
    1,317 сообщений
    Mentioned
    39 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Manwe Посмотреть сообщение
    Архитектурный косяк, конечно. Из-за этого приходится заводить отдельный признак для 16-битных значений и делать лишнюю проверку. Итого, две лишние инструкции.
    Для 8-биток, на которые ориентирован lzsa, это (отдельное 16 битное значение) удачное решение, которое экономит одну или две команды.
    Цитата Сообщение от Manwe Посмотреть сообщение
    Размер 254 байта (244 байт для неперемещаемого варианта). И чуть быстрей исполняется (на 6% быстрей твоего оригинального).
    У меня последний вариант на 8% быстрее, но 264 байта.

  6. #65

    Регистрация
    06.12.2017
    Адрес
    г. Москва
    Сообщений
    1,724
    Спасибо Благодарностей отдано 
    167
    Спасибо Благодарностей получено 
    406
    Поблагодарили
    257 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ivagor Посмотреть сообщение
    Для 8-биток, на которые ориентирован lzsa, это (отдельное 16 битное значение) удачное решение, которое экономит одну или две команды.
    если бы это 16-битное значение было уменьшено на 2, то ещё 2 команды сэкономилось бы
    manwe.pdp-11.ru

  7. #66

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,393
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,367
    Поблагодарили
    1,317 сообщений
    Mentioned
    39 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вот так неожиданно выявляются различающиеся требования к упаковщику/распаковщику для 8/16 бит, ну или по крайней мере для pdp11. Про это я не думал, больше на виду лежит другой ресурс для ускорения распаковки на pdp11 - использование где можно 16 битных пересылок. Если это включить явно в компрессор, то на степени сжатия это скажется отрицательно, но это именно опция для быстрой распаковки, там где скорость важнее.

  8. #67

    Регистрация
    06.12.2017
    Адрес
    г. Москва
    Сообщений
    1,724
    Спасибо Благодарностей отдано 
    167
    Спасибо Благодарностей получено 
    406
    Поблагодарили
    257 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ivagor Посмотреть сообщение
    Вот так неожиданно выявляются различающиеся требования к упаковщику/распаковщику для 8/16 бит, ну или по крайней мере для pdp11. Про это я не думал, больше на виду лежит другой ресурс для ускорения распаковки на pdp11 - использование где можно 16 битных пересылок. Если это включить явно в компрессор, то на степени сжатия это скажется отрицательно, но это именно опция для быстрой распаковки, там где скорость важнее.
    Да, согласен. Но и так простой перестановкой битов и байтов можно подготовить файл к более быстрой распаковке на PDP-11.

    Вот, кстати, очередная оптимизация: 242 байта, на 6.6% быстрей оригинала.
    Код:
    ; LZSA2 PDP-11 decompressor by Manwe/SandS
    ; Thanks to Ivan Gorodetsky
    ; Usage:
    ; MOV #src_adr,R1
    ; MOV #dst_adr,R2
    ; CALL Unpack
    
    
    Unpack: CLR R4              ; no nibbles sign
    Token:  MOVB (R1)+,R3       ; read token
    
    Liter:  MOV R3,R0
            ASR R0
            ASR R0
            ASR R0
            BIC #177774,R0      ; get 2 bits
            BEQ Decode
            CMP R0,#3           ; literals length
            BNE Copy
                MOVB #239.,(R2) ; set limit
                CALL Extend
    Copy:   MOVB (R1)+,(R2)+    ; literals length in R0
            SOB R0,Copy
    
    Decode: MOV R3,-(SP)    
            COM R3              ; invert for faster detect
            ROLB R3             ; get 2 bits
            ROL R0
            ROLB R3
            ROL R0
            ASL R0
            ADD R0,PC           ; run subroutine
            BR oOther
            BR o13bit
            BR o9bit
    o5bit:  CALL Nibble         ; get nibble in R0
            ROLB R3
            ROL R0
            BIS #177740,R0      ; set bits 5-15
    Save:   MOV R0,(PC)+        ; save offset for future
    Offset: .WORD 0
    
    Match:  MOV (SP)+,R0
            BIC #177770,R0      ; get 3 bits
            CMP R0,#7
            BNE Clone
                MOVB #233.,(R2) ; set limit
                CALL Extend
                BCS Clone+4     ; skip minimal match length
    Clone:  ADD #2,R0           ; match length
            TSTB R0
            BEQ Exit
    
            MOV R2,R3
            ADD Offset,R3
    1:      MOVB (R3)+,(R2)+
            SOB R0,1
            BR Token
    
    
    o9bit:  ROLB R3
            ROL R0
            SWAB R0
            BISB (R1)+,R0
            BIS #177000,R0      ; set bits 9-15
            BR Save
    
    o13bit: CALL Nibble         ; get nibble in R0
            ROLB R3
            ROL R0
            SWAB R0
            BISB (R1)+,R0       ; 8 bits
            BIS #160000,R0      ; set bits 13-15
            SUB #512.,R0
            BR Save
    
    oOther: ROLB R3
            BCS 1
                MOV Offset,R0   ; reuse offset
                BR Match
    1:      MOVB (R1)+,R0
            SWAB R0
            CLRB R0
            BISB (R1)+,R0
            BR Save
    
    Nibble: COM R4
            BNE 1
                MOV R5,R0
                BR 2
    1:      MOVB (R1)+,R5       ; read 2 nibbles
            MOV R5,R0
            ASR R0
            ASR R0
            ASR R0
            ASR R0
    2:      BIC #177760,R0      ; leave 4 low bits
            RET
    
    Extend: MOV R0,-(SP)        ; save original value
            CALL Nibble         ; get nibble in R0
            CMP R0,#15.
            BNE Ext2
                CLR R0
                BISB (R1)+,R0
                CMPB R0,(R2)    ; compare with limit
                BNE Ext1
                    ; unnecessary for short files
                    MOVB (R1)+,R0   ; read low byte
                    SWAB R0
                    CLRB R0
                    BISB (R1)+,R0   ; read high byte
                    SWAB R0
                    TST (SP)+       ; skip saved R0
                    SEC             ; set sign of 16 bit vslue
                    RET
    Ext1:       ADD #15.,R0
    Ext2:   ADD (SP)+,R0        ; add original value
    Exit:   RET
    
    .END
    Последний раз редактировалось Manwe; 08.08.2021 в 18:04.
    manwe.pdp-11.ru

  9. #68

    Регистрация
    06.12.2017
    Адрес
    г. Москва
    Сообщений
    1,724
    Спасибо Благодарностей отдано 
    167
    Спасибо Благодарностей получено 
    406
    Поблагодарили
    257 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Пришлось модифицировать упаковщик LZSA2, чтобы формат лучше подходил для PDP-11.
    Итого, распаковщик занимает 200 байт (на 27% меньше оригинала). Быстрей на 18% (в 1.22 раз).
    ivagor, как это в сравнении с zx0 и zx1?
    Последний раз редактировалось Manwe; 12.08.2021 в 11:09.
    manwe.pdp-11.ru

  10. #69

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,393
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,367
    Поблагодарили
    1,317 сообщений
    Mentioned
    39 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Если принять твой последний распаковщик за точку отсчета, то zx0 (102 байта) медленнее на 16%, zx1 (144 байта) медленнее на 7%. Это уже встраивает lzsa2 в линейку как для z80 и 8080: lzsa1-lzsa2-zx1-zx0. Чем левее, тем быстрее; чем правее, тем лучше сжатие. Но все же 7% при распаковке файлов для 0010 сравнительно сложно заметить, а вот степень сжатия и размер распаковщика на стороне zx1. Тут в каждом конкретном случае надо смотреть, что важнее.

  11. #70

    Регистрация
    06.12.2017
    Адрес
    г. Москва
    Сообщений
    1,724
    Спасибо Благодарностей отдано 
    167
    Спасибо Благодарностей получено 
    406
    Поблагодарили
    257 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ivagor Посмотреть сообщение
    а вот степень сжатия и размер распаковщика на стороне zx1. Тут в каждом конкретном случае надо смотреть, что важнее.
    А можешь дать ссылку на zx1 для PDP-11? Прогоню своим тестом
    manwe.pdp-11.ru

Страница 7 из 9 ПерваяПервая ... 3456789 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •