?login_element?

Subversion Repositories NedoOS

Rev

Rev 99 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. HUFFMAN
  2. ;hl=ldbit/ddbit
  3. ;bc=nodes
  4.         ;jr $
  5.        ld (nodes),BC
  6.        PUSH BC,HL
  7.        
  8.        LD HL,frqs-1
  9.        ADD HL,BC
  10.        add HL,BC
  11.        ld (nodend),HL
  12.         LD HL,bitlens
  13.         LD BC,255
  14.         LD D,H
  15.         ld E,L
  16.         INC DE
  17.         ld (hl),l ;0
  18.         LDIR
  19.         LD HL,huff
  20.        LD IX,0
  21. mkhuf0   PUSH HL
  22. nodend=$+1
  23.         LD HL,huff;frqend-1 ;нечетный адрес
  24. nodes=$+1
  25.         LD BC,255;298
  26.        XOR A
  27.        PUSH AF
  28.         LD D,#FE ;last maximum <#FFXX (#FFFF - нет литерала)
  29. mkhuf1
  30.         LD A,D
  31. mkhuf1A CP (HL)
  32.         JR NC,mkhufNC
  33.         DEC L
  34.         CPD
  35.         jp PE,mkhuf1A
  36.         JR frskipQ
  37. mkhufNC
  38.         DEC HL
  39.         JR NZ,frless
  40.         LD A,(HL)
  41.         CP E
  42.         JR NC,frskip
  43. frless
  44.        POP DE
  45.         LD E,(HL)
  46.         INC L
  47.        PUSH HL
  48.         LD D,(HL)
  49. frskipDL
  50.         DEC L
  51. frskip  CPD
  52.         jp PE,mkhuf1
  53. frskipQ  DEC B ;-1
  54.        POP HL
  55.        XOR A
  56.        OR H
  57.        JR Z,mkhufQ ;кончились частоты>0
  58. ;DE=MINfrq-1
  59.         INC DE
  60. ;HL=adrMINfrq+1(H)
  61.         LD (HL),B;-1 ;шоп боле не попадалась
  62.         LD BC,-frqs-1
  63.         ADD HL,BC
  64.         SRL H
  65.         RR L ;HL=литерал
  66.           LD B,D
  67.           ld C,E
  68.          POP DE
  69.         EX DE,HL
  70.         LD (HL),B ;frq
  71.         INC HL
  72.         LD (HL),C
  73.         INC HL
  74.         LD (HL),D ;вместо adrA (литерал)
  75.         INC HL
  76.         LD (HL),E
  77.         INC HL
  78.        INC IX
  79.         JR mkhuf0
  80. mkhufQ
  81.          POP HL
  82.         OR HX
  83.         JR NZ,HUFN1L
  84.         OR LX
  85.      IF skipnotree
  86.        jp Z,MHUFCOD ;нет дерева
  87.      ELSE
  88.       jr NZ,HUFN0L
  89.       INC LX ;будет лист
  90.       LD (HL),C;0
  91.       INC HL
  92.       LD (HL),1
  93.       INC HL
  94.       LD (HL),C;0
  95.       INC HL
  96.       LD (HL),C;0
  97.       INC HL
  98.       INC A
  99. HUFN0L
  100.      ENDIF
  101.         CP 1
  102.         JR NZ,HUFN1L
  103.        INC LX ;будет 2 листа
  104.        DEC HL
  105.        XOR (HL) ;второй лист фиктивный
  106.        INC HL
  107.       LD (HL),C ;чтобы не #FF dem029
  108.        INC HL
  109.          LD (HL),1 ;dem08
  110.          INC HL
  111.         LD (HL),C;0
  112.         INC HL
  113.         LD (HL),A
  114.         INC HL
  115. HUFN1L  LD (HL),B;-1;end
  116. ;на всякий случай запомним отсорт.частоты
  117. ;ГДЕ ИСПОЛЬЗУЕТСЯ?
  118.       ;LD BC,1-huff
  119.       ;ADD HL,BC
  120.       ;LD B,H,C,L
  121.         LD HL,huff
  122.         LD DE,frqs
  123.        LD BC,298*4+1 ;end
  124.         LDIR
  125.         ;jr $ ;ix=#127
  126. ;IX=кол-во НЕЗАНЯТЫХ листьев
  127. ;теперь объединяем узлы
  128.         LD DE,huffend-1 ;ЗАНЯТЫЕ-1
  129. obhuf0
  130.         LD A,LX
  131.         DEC A
  132.         OR HX
  133.         JR Z,obhufQ ;остался один узел, нечего объединять
  134.      ;первые 2 НЕЗАНЯТЫХ узла
  135.      ;перемещаем в ЗАНЯТЫЕ
  136.         LD HL,huff+7
  137.         LD BC,8
  138.         LDDR
  139.        PUSH DE
  140.         INC HL
  141.         LD B,(HL) ;frq1
  142.         INC HL
  143.         LD C,(HL)
  144.         INC HL,HL,HL
  145.         LD D,(HL) ;frq2
  146.         INC HL
  147.         LD E,(HL)
  148.         EX DE,HL
  149.         ADD HL,BC
  150.         LD B,H
  151.         ld C,L
  152.      ;ищем первую бОльшую частоту
  153.    ;и перекидываем в начало меньшие/равные
  154.         LD HL,huff+8
  155.         LD DE,huff
  156.        IF fastTREE
  157.         LD A,B
  158.         PUSH BC
  159. obhuf1  CP (HL)
  160.         LDI
  161.         JR Z,obhCP
  162. obhCPQ  LDI
  163.         LDI
  164.         LDI
  165.         jp NC,obhuf1
  166.         DEC HL,DE
  167.         DEC HL,DE
  168.         DEC HL,DE
  169. obhufG  DEC HL,DE
  170.         POP BC
  171.        ELSE
  172. obhuf1
  173.         LD A,(HL)
  174.         CP B
  175.         JR C,obhufi
  176.         JR NZ,obhufG
  177.         INC HL
  178.         LD A,C
  179.         CP (HL)
  180.         DEC HL
  181.         JR C,obhufG ;(HL)>C
  182. obhufi  LDI
  183.         INC BC
  184.         LDI
  185.         INC BC
  186.         LDI
  187.         INC BC
  188.         LDI
  189.         INC BC
  190.         JR obhuf1
  191. obhufG
  192.        ENDIF
  193. ;HL=адрес первой бОльшей частоты (или end)
  194. ;DE=куда вставлять
  195.        EX (SP),HL ;HL=adrA-1=ЗАНЯТЫЕ-1
  196.                   ;(SP)=адр.п.бОл.ч
  197.         EX DE,HL
  198.         LD (HL),B ;frq
  199.         INC HL
  200.         LD (HL),C
  201.         INC HL
  202.        INC DE
  203.         LD (HL),D ;adrA
  204.         INC HL
  205.         LD (HL),E
  206.        DEC DE
  207.         INC HL
  208.         EX DE,HL
  209.        EX (SP),HL ;HL=адр.п.бОл.ч
  210.                   ;(SP)=ЗАНЯТЫЕ-1
  211.         LD A,-1
  212.         JR obhufcE
  213.  
  214.        IF fastTREE
  215. obhCP   POP BC
  216.         LD A,C
  217.         CP (HL)
  218.         LD A,B
  219.         PUSH BC
  220.         jp NC,obhCPQ
  221.         JR obhufG ;(HL)>C
  222.        ENDIF
  223. obhufco LDI
  224.         LDI
  225.         LDI
  226.         LDI
  227. obhufcE CP (HL)
  228.         JR NZ,obhufco
  229.        LD (DE),A
  230.         DEC IX;свободных стало на 1 меньше
  231.        POP DE
  232.         JR obhuf0 ;объединяем следующие...
  233. obhufQ
  234. ;считаем bitlens
  235.        LD BC,0
  236.        PUSH BC ;=0
  237.        PUSH BC
  238.         LD HL,huff
  239.      ;смотрим правую,левую(PUSH)
  240. CNTbl
  241.         INC HL,HL
  242.         LD A,(HL) ;adrA
  243.         CP 2
  244.         JR C,CNTli
  245.         LD D,A
  246.         INC HL
  247.         LD E,(HL)
  248.         PUSH DE ;LEFT
  249.        INC C
  250.         PUSH BC
  251.         INC DE,DE,DE,DE ;RIGHT
  252.         EX DE,HL
  253.         JR CNTbl
  254. CNTli   LD L,C
  255.        ADD HL,HL
  256.         LD H,bitlens/256 ;0,1,...
  257.         INC (HL)
  258.         JR NZ,$+4
  259.         INC L
  260.         INC (HL)
  261.        XOR A
  262.        POP BC
  263.        POP HL
  264.        OR H
  265.         JR NZ,CNTbl
  266. ;исправляем длины>15
  267.   ;bad:
  268. ;2*(N+1),(N-1) -> 3*(N)
  269. ;4*(N+1),(N-2) -> 4*(N),(N-1)
  270. ;и т.д.
  271.   ;fixed:
  272. ;X=первый ненулевой от N-1 и менее
  273. ;(X)--
  274. ;(X+1)+=2
  275. ;(N)++
  276. ;(N+1)-=2
  277.         ;jr $
  278. ispr15
  279.         LD HL,bitlens ;таблица сколько листьев в ярусе
  280. ispr150 DEC L
  281.         LD A,(HL)
  282.         DEC L
  283.         OR (HL)
  284.         JR Z,ispr150
  285.         LD A,L
  286.         CP 32
  287.        JR C,MHUFCOD ;все глубины <15
  288.        ;LD BC,1 ;сколько листьев на обмен
  289.         DEC L,L
  290.         LD E,L ;запомним ADR (N)
  291. ispr151;SLA C
  292.        ;RL B
  293.         DEC L
  294.         LD A,(HL)
  295.         DEC L
  296.         OR (HL)
  297.         JR Z,ispr151;глубин (N-1) нету
  298.        ;нашли X
  299.         LD A,(HL)
  300.         DEC (HL)
  301.         INC L
  302.         OR A
  303.         jr NZ,$+3
  304.         DEC (HL)
  305.        ;INC L,(HL)
  306.        ;JR Z,$-2
  307.        INC L ;ADR (X+1)
  308.        LD A,(HL)
  309.        ADD A,2
  310.        LD (HL),A
  311.        INC L
  312.        jr NC,$+3
  313.        INC (HL)
  314.         LD L,E ;вспомним ADR (N)
  315.        ;LD A,(HL)
  316.        ;ADD A,C
  317.        ;LD (HL),A
  318.        ;INC L
  319.        ;LD A,(HL)
  320.        ;ADC A,B
  321.        ;LD (HL),A
  322.        INC (HL)
  323.        INC HL
  324.        jr NZ,$+3
  325.        INC (HL)
  326.         INC L ;ADR (N+1)
  327.         LD A,(HL)
  328.         SUB 2;C
  329.         LD (HL),A
  330.         INC L
  331.        ;LD A,(HL)
  332.        ;SBC A,B
  333.        ;LD (HL),A
  334.        jr NC,$+3
  335.        DEC (HL)
  336.         JR ispr15
  337.  
  338. ;составляем новое дерево по длинам и frqs
  339. ;сейчас в frqs: (Hfrq,Lfrq,Hlit,Llit)
  340. ;end=-1
  341.      ;сначала присваиваем литералам bitlen
  342. MHUFCOD
  343.        POP HL,BC
  344. ;bc=nodes?
  345. ;hl=?
  346.        PUSH BC,HL
  347.        DEC BC
  348.         LD D,H
  349.         ld E,L
  350.        LD A,E
  351.        ld (licoLOW),A
  352.        LD HX,D
  353.         INC DE
  354.         XOR A
  355.         LD (HL),A
  356.         CP B
  357.         LDIR
  358.        JR Z,$+4
  359.        LD A,20 ;+D
  360.        ld (licoI1),A
  361.        ld (licoI2),A
  362.        ld (lico0+1),HL
  363.         LD DE,frqs
  364.         LD HL,bitlens+31
  365.         LD B,15 ;текущая глубина
  366.        LD LX,B
  367. libi0   LD A,(HL)
  368.         DEC L
  369.         OR (HL)
  370.         JR Z,libiZ
  371. libiNZ  LD A,(HL)
  372.         DEC (HL)
  373.         INC L
  374.         OR A
  375.        JR NZ,$+3
  376.        DEC (HL)
  377.      ;берем номер литерала
  378.         INC DE,DE
  379.         PUSH HL
  380.         LD A,(DE)
  381.         INC DE
  382.        ADD A,HX
  383.         LD H,A
  384.         LD A,(DE)
  385.         INC DE
  386.         LD L,A
  387.         LD (HL),B
  388.         POP HL
  389.         JR libi0
  390.      ;кончились листья этой глубины
  391. libiZ   DEC L
  392.        DJNZ libi0
  393. libiQ
  394.     ;внутри каждого яруса - не по частоте,
  395.     ;а по алфавиту!
  396.         LD H,B
  397.         ld L,B;HUFF CODE<<
  398.         LD C,2 ;HUFF SUBer
  399. lico0
  400.        LD DE,0 ;ldbit+297 CHANGEABLE
  401. lico1   LD A,(DE)
  402.         CP LX
  403.         JR NZ,lico1N
  404.      ;теперь код Хаффмана<<
  405.         PUSH DE
  406. licoI1 INC D
  407.        inc D
  408.         SBC HL,BC
  409.         LD A,H
  410.         LD (DE),A
  411. licoI2 INC D
  412.        inc D
  413.         LD A,L
  414.         LD (DE),A
  415.         POP DE
  416. lico1N
  417.        LD A,E
  418. licoLOW=$+1
  419.         CP 0
  420.         LD A,D
  421.         DEC DE
  422.        JR NZ,lico1
  423.         CP HX
  424.        JR NZ,lico1
  425.         SLA C
  426.         RL B
  427.         DEC LX
  428.         JR NZ,lico0
  429.        POP HL,BC
  430.         RET  
  431.