Deja Vu #08
31 мая 1999

CODING - The Оптимизация - построение таблицы частоты повторения байтов.

<b>CODING</b> - The Оптимизация - построение таблицы частоты повторения байтов.
AY-Track:       L  I  G  H  T             
__________________________________________


(C)1999 DaniEl/PGC/BDA and MAX/Cyberax/BDA
__________________________________________


           The оптимизация #02


   Если вы уже закодили и  соптимизиривали
все что смогли, то сегодня я вам предлагаю
поломать голову.
   Задача: Построить таблицу частоты  пов-
торения байтов. На основе  массива  длиной
CODLEN. Первый  байт таблицы самый частый,
последний,  соответственно, самый  редкий,
если какие-то коды в  массиве  отсуствуют,
то частота  повторения данного байта равна
нулю.
   Ниже  приводится  листинг,  выполняющий
данную задачу. От вас требуется попытаться
соптимизировать данную  процедурку (сокра-
тить  объем  объектного  кода). Результаты
обязательно опубликуем в последующих номе-
рах Deja VU.
   Описывать алгоритм работы не  буду, по-
пытайтесь сами разобраться. Скажу  только,
что сначала создается таблица размером 512
байтов; первые два байта - количество  ко-
дов #00 в  массиве  длиной  CODLEN, вторые
два байта - количество кодов #01, и т. д.,
до #FF.


;(C) 19.02.1999 DaniEl/BDA
;Last optimization 22.02.1999


       ORG #8000


CODLEN EQU #4000; длина кодового блока
STRTAD EQU #C000; старт кодового блока

START  DI
       LD HL,D_BUFF
       PUSH HL
       LD DE,D_BUFF+1
       LD BC,#2FF
       SUB A
       LD (HL),A
       LDIR


       LD B,A
       POP IX; IX=D_BUFF
M1     PUSH BC
       LD DE,0
       LD BC,CODLEN
       LD HL,STRTAD
LOOP   CPIR
       JR NZ,JUMP
       INC DE
       JP PE,LOOP
JUMP   LD (IX+0),E
       LD (IX+1),D
       INC IX
       INC IX
       POP BC
       INC A
       DJNZ M1


       LD IY,KERNAL
       LD DE,CODLEN
L2     LD IX,D_BUFF
       LD BC,0
L1     LD L,(IX+0)
       LD H,(IX+1)
       OR A
       SBC HL,DE
       CALL Z,MAX
L3     INC IX
       INC IX
       INC C
       DJNZ L1


       DEC DE
       LD A,D
       OR E
       JR NZ,L2
       LD IY,23610
       EI
       RET


MAX    LD (IY+0),C
       INC IY
       RET


D_BUFF DEFS #200; Первые  2  байта - коли-
                ;чество  байтов #00, далее
                ;два байта - кол-во байтов
                ;#01 и т.д., до #FF.

KERNAL DEFS #100; Результат работы-таблич-
                ;ка   частоты   повторений
                ;байтов. Первый-самый час-
                ;тый, последний-самый ред-
                ;кий.

   Длина  процедуры  ровно 100 байтов. Не-
достаток - очень медленная работа,около 40
секунд на  один  банк  памяти (зависит  от
плотности данных).
   После написания этой процедуры, ее  ре-
шил  соптимизировать  MAX/Cyberax/BDA. Ре-
зультатом  его  работы  явилась  процедура
длиной 93 байта и  работающая  максимум  4
секунды на один банк.
   Недостатки - привязка к адресам, вырав-
ненным по границе 256 байтов (с начала па-
раграфа), кроме того, небольшое отклонение
от поставленной цели, а конкретно, резуль-
тирующая таблица содержит полный  диапазон
байтов от #00 до #FF,в то время как она не
должна содержать  байтов, отсутствующих  в
исследуемом массиве.
   Алгоритм   данной  процедуры  абсолютно
другой. Сначала создается таблица 512 бай-
тов (два параграфа),в первом параграфе на-
ходятся младшие байты, во втором- старшие.
Вместе, старший и  младший  байт, образуют
количество повторений в исследуемом масси-
ве в диапазоне от #00 до #FF. Далее проис-
ходит сортировка по следующему  принципу -
сравниваются два первых элемента в  табли-
це, если второй больше первого, то они ме-
няются местами, и далее сравниваются  эле-
менты второй и третий ..., и т.д. В  итоге
сортируются  обе  таблицы. (но  нам  нужна
только вторая - 256 байтов)
   Для  максимального  быстродействия  MAX
решил почти полностью  отказаться  от  ис-
пользования  индексных  регистров, а также
использовать в больших циклах  команды  JP
вместо JR.
   Вот листинг данной процедуры:

;(C) MAX/CYBERAX/BDA, 02.1999
;OPTIMIZATION

       ORG #7000


BUFF   EQU #80; СТАРШИЙ БАЙТ  АДРЕСА #8000
               ;ДЛЯ ТАБЛИЦЫ 512 БАЙТОВ.
TABLE  EQU BUFF+2; СТАРШ.БАЙТ АДРЕСА #8200
                 ;ДЛЯ ТАБЛИЦЫ 256 БАЙТОВ.

BLOCK  EQU #C000; СТАРТОВЫЙ АДРЕС БЛОКА.
CODLEN EQU #4000; ДЛИНА БЛОКА

MK_TAB  LD HL,BUFF*256
        LD DE,BUFF*256+1
        LD BC,#200
        LD (HL),L
        LDIR
MK_TB   LD (HL),L
        INC L
        JP NZ,MK_TB
        LD H,BUFF
        LD DE,BLOCK
        LD C,CODLEN/256;СТАРШИЙ БАЙТ ДЛИНЫ
                      ;B=0
TB_LP   LD A,(DE)
        LD L,A
        INC (HL)
        JP NZ,NO_HIGH
        INC H
        INC (HL)
        DEC H
NO_HIGH INC DE
        DJNZ TB_LP
        DEC C
        JP NZ,TB_LP


;Начало сортировки

SORT0   LD HL,BUFF*256
        LD HX,0
SORT1   LD E,(HL)
        INC H
        LD D,(HL)
        INC H
        LD A,(HL)
        INC L
        DEC H
        LD B,(HL)
        DEC H
        LD C,(HL)
        EX DE,HL
        AND A
        SBC HL,BC
        EX AF,AF'
        ADD HL,BC
        EX AF,AF'
        EX DE,HL
        JR NC,NO_SWAP
        LD (HL),E
        INC H
        LD (HL),D
        INC H
        LD E,(HL)
        LD (HL),A
        DEC L
        LD (HL),E
        DEC H
        LD (HL),B
        DEC H
        LD (HL),C
        INC L
        LD HX,#FF
NO_SWAP LD A,L
        INC A
        JP NZ,SORT1
        INC HX
        JP Z,SORT0
        RET


   Может  быть  вас  заинтересует  область
применения данных процедур? Отвечу, что их
можно  применить, например, при  написании
различных  упаковщиков. А  интересно - что
думает по этому поводу Дмитрий Пъянков  из
Горно-Алтайска?

      И пусть удача вас не покидает!



Другие статьи номера:

Аперативчик - Об управлении в оболочке DEJA VU

Аперативчик - Номер вышел с опозданием на месяц.

Аперативчик - Халявы больше не будет.

Тема - Резервы #2. Перспектива.

Тема - О работе с электронным диском в IS-Dos.

Тема - Новый перекресток - кое-что из сложностей игры The Castle.

Тема - Принтер и ZX-Spectrum (система команд принтеров семейства Epson).

Капля припоя - Ода часам.

Капля припоя - Сканер v1.3.

Капля припоя - Disk protector v1.4 (схема).

SOFTWARE - Обзор новинок демок: Iris UltraDemo, Lazarus Trackmo, Russian Fields of Experiments, Pressure Trackmo.

SOFTWARE - Обзор новинок игр: Белый Орел, Leprekon,Козел,Puzzle (prerelease от Flash), Space, Translate Worlds,Devil-s Curse, Choppers: death match, Twilight: The Land of Shadows, Falen Angel, 12 Тайных книг, The Cezar,Chainick horror in Flat.

SOFTWARE - Обзор системок: ASCII Convertor v2.71 , Global Commander v1.31, BA v1.0, X-Copy.

SOFTWARE - Люди, как боги: сценарий к игре Elite III

SOFTWARE - О работе с программой для печати изображений XL-graph.

CODING - The Оптимизация - построение таблицы частоты повторения байтов.

CODING - Универсальный Player - Pro Tracker v3.31.

CODING - Недокументированные особенности процессора Z80.

CODING - Конверсия графики в текст-формат ASCII.

CODING - Как создать некопируемый сектор.

CODING - BUGS в Plaeyer-e Pro Tracker 3.x

ANOTHER WORLD - Процессор Pentium III.

ANOTHER WORLD - На стыке трех миров.

ANOTHER WORLD - Новости из мира Амиги.

ANOTHER WORLD - Мой выбор - ПЦ?.

Доска почета - Что мы думает о сцене.

Доска почета - Все на party!

Доска почета - О CD-ROM проекте из города Кемерово.

Семь и 1/2 - День дурака.

Семь и 1/2 - Нарочно не придумаешь: семь историй от продацов ZX софта.

Семь и 1/2 - Анекдоты.

Проба пера - Амига rulez или suxx?

Реклама - Реклама и объявления ...


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Эпилог - авторы газеты.
Sofтинка - Video Player для ATM.
О наболевшем III - частухи!
Пользователь - Ах новые программы, знать бы как они работают, я бы тогда...
BBS INFO - График работы BBS на неделю.

В этот день...   21 ноября