Subversion Repositories NedoOS

Rev

Rev 92 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

  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.