Subversion Repositories pentevo

Rev

Rev 635 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1.  
  2. ;LAST UPDATE: 03.02.2014 savelij
  3.  
  4. maintree        EQU RARS
  5. tree            EQU (298-6)*4-4+maintree
  6. bdlens          EQU tree
  7. ldlens          EQU tree
  8. ddlens          EQU 298+ldlens
  9. ;rdlens=ddlens+48
  10. tabend          EQU ddlens+48+28
  11. NEWBYTE
  12.         LD      A,(IX)
  13.         RLA    
  14.         INC     IX
  15.         RET    
  16. dPPbr16
  17.         PUSH    BC
  18.         JR      NZ,dPPn16
  19. ;16=prev len copies-3
  20.         CALL    LDA2
  21.         DEC     HL
  22.         LD      A,(HL)
  23.         INC     HL
  24.         LD      (dPPdupV),A
  25.         LD      A,3
  26.         JR      dPPfil
  27. UNILDRAR
  28.         ADD     HL,DE
  29.         LD      (theEnd),HL;сам HL не нужен!
  30. ;IX->DE
  31.         LD      A,128
  32.         EX AF,AF'      
  33. NEWTREE
  34.        PUSH     DE
  35.         CALL    LDA2
  36.         LD      HL,bdlens
  37.        LD       E,19
  38. dPPtetr LD      B,4
  39.         CALL    LDA18B
  40.         LD      (HL),C
  41.         INC     HL
  42.        DEC      E
  43.         JR      NZ,dPPtetr
  44.      ;EXX
  45.      ;PUSH DE
  46.         LD      DE,19+1
  47.         CALL    MKMAINTREE ;делаем из них дерево
  48.      ;POP DE
  49.      ;EXX
  50.         LD      BC,298+48+28 ;tabsize
  51.         LD      HL,ldlens;UnpOldTable
  52. dPP0   PUSH     HL
  53.         CALL    DEHUFFMAIN
  54.        POP      HL
  55.         CP      16
  56.        JR       NC,dPPbr16
  57. ;<16 delta from prev codelen tab
  58.         LD      (HL),A
  59.         INC     HL
  60.         DEC     BC
  61.         JR      dPPQ
  62. dPPn16  CP      17
  63.         JR      NZ,dPPn3b
  64. ;17=zerolens-3
  65.         LD      B,3
  66.         LD      A,B
  67. dPPfilG CALL    LDA18B
  68. dPPfil  ADD     A,C
  69.         POP     BC
  70. dPPdupV := $+1
  71. dPPdup0 LD      (HL),0
  72.         INC     HL
  73.         DEC     BC
  74.         DEC     A
  75.         JR      NZ,dPPdup0
  76.         LD      (dPPdupV),A
  77. dPPQ    LD      A,B
  78.         OR      C
  79.         JR      NZ,dPP0
  80.      ;EXX
  81.      ;PUSH DE
  82.         LD      DE,298+1
  83.         CALL    MKMAINTREE ;делаем из них дерево
  84.         LD      HL,ddlens+49
  85.         LD      DE,48+1
  86.         LD      BC,tree
  87.         CALL    MKTREE ;делаем из них дерево
  88.        POP      DE
  89.      ;EXX
  90. DEPK0
  91.         CALL    DEHUFFMAIN
  92.         DEC     H
  93.        JR       NZ,yBYTE
  94.        SUB      LOW (269)
  95.        JR       Z,NEWTREE
  96.        JR       C,len2
  97.        DEC      A
  98.       ;SUB 270
  99.         LD      L,A
  100.         CP      8
  101.        CALL     NC,EMMTPP
  102.                 REPT 3
  103.         INC     HL
  104.                 ENDM
  105.        PUSH     HL ;len
  106.         LD      HL,tree
  107.         CALL    DEHUFF
  108.         ADD     A,-4
  109.        JR       NC,EMBBTQ
  110.         LD      L,1
  111.         ADC     A,L
  112.         RRA    
  113.         RL      L
  114.         LD      B,A
  115.        CALL     EM_TPP
  116. EMBBTQ  INC     HL
  117.       ;NC
  118.         LD      B,H
  119.        LD C,L
  120. GPldir  LD      C,L
  121.         LD      H,D
  122.        LD L,E
  123.       ;OR A
  124.         SBC     HL,BC
  125.         LD      A,B
  126.        POP      BC ;3..255
  127.         AND     0XE0
  128.         JR      Z,$+3
  129.         INC     C
  130.      ;CALL UNILDIR
  131.         LDIR   
  132. GPq
  133. ;или просто BIT 7,D
  134. theEnd := $+1
  135.         LD      HL,0
  136.        SCF     
  137.         SBC     HL,DE
  138.     ;LD A,H ;!
  139.     ;ADD A,2;!
  140.        JR       NC,DEPK0
  141.         RET    
  142.      ;LD A,(UNIpg)
  143.      ;JP OUTME
  144. ;18=zerolens-11
  145. dPPn3b
  146.         LD      B,7
  147.         LD      A,11
  148.         JR      dPPfilG
  149. yBYTE
  150.        LD       A,L
  151.         LD      (DE),A
  152.         INC     DE
  153.         JR      GPq
  154. len2
  155. ;261..268=>-8..-1
  156.        ADD      A,A
  157.        LD       L,A
  158.         LD      H,HIGH (tlen2);'tlen2
  159.         LD      B,(HL) ;bits
  160.         INC     L
  161.         LD      L,(HL) ;N>>bits
  162.         CALL    EM_TPP
  163.         LD      C,2
  164.        PUSH     BC
  165.        ;CY
  166.        JR       GPldir
  167.  
  168. DEHUFFMAIN
  169.         LD      HL,maintree
  170. DEHUFF
  171.        EX AF,AF'       
  172.         ADD     A,A
  173.         CALL    Z,NEWBYTE
  174.         JR      NC,$+4 ;ноль
  175.         INC     L  ;единица
  176.         INC     L;HL
  177.        EX AF,AF'       
  178.         LD      A,(HL)
  179.         INC     L
  180.         LD      H,(HL)
  181.         LD      L,A
  182.                 IF LOW (maintree&0X40)=0;       IFN     'maintree&0X40
  183.        BIT      6,H
  184.        ELSE    
  185.                 IF LOW (maintree&0X80)=0;       IFN     'maintree&0X80
  186.        BIT      7,H
  187.        ENDIF   
  188.        ENDIF   
  189.        JR       NZ,DEHUFF
  190.         RET    
  191.  
  192. ;создание дерева. нули - более короткие ветки
  193. ;сначала создаются все ветки для
  194. ;символов с bitlen=1, потом 2 и т.д. до 15
  195. ;by Roman Petrov
  196. MKMAINTREE
  197.         LD      HL,ldlens ;было просто tree
  198.         ADD     HL,DE
  199.         LD      BC,maintree
  200. MKTREE
  201.         PUSH    BC
  202.         EXX    
  203.         POP     DE ;начало буфера
  204.         LD      H,D
  205.         LD      L,E
  206.         XOR     A ;=0 признак выхода
  207.         PUSH    AF
  208.         INC     A ;=1
  209.         PUSH    HL
  210.         PUSH    AF
  211.         LD      C,A
  212. MKTREE0 EXX          ;HL=кон.bitlens+1
  213.         LD      B,D
  214.         LD      C,E
  215.        ;ADD HL,BC;указ.на последний bitlen
  216.       ;OR A
  217.        SBC      HL,BC;указ.на 1й bitlen
  218.         EXX    
  219. MKTREE1 LD      B,A
  220.         LD      A,C
  221.         EXX    
  222.        ;CPDR ;BC=число листьев+1
  223.        CPIR    
  224.         LD      A,B
  225.         OR      C
  226.         EXX    
  227.         LD      A,B
  228.         JR      NZ,MKTREEY;найден символ с таким bitlen
  229.         INC     C ;не найден такой символ
  230.        JR       NZ,MKTREE0
  231.        JR       MTREEbug
  232. MKTREE_DEEPER
  233.         INC     DE ;новое место
  234.         INC     DE ;для
  235.         INC     DE ;новых
  236.         INC     DE ;узлов
  237.         LD      (HL),E
  238.         INC     HL
  239.         LD      (HL),D ;указатель для "0"
  240.         LD      H,D
  241.         LD      L,E ;адрес для "код+0"
  242.         INC     A  ;длина этого кода
  243.         PUSH    HL ;заносим это
  244.         PUSH    AF ;в стек
  245. MKTREEY CP      C
  246.         JR      NZ,MKTREE_DEEPER ;пока не углубимся до нужной длины
  247.        ;A=C
  248.         EXX    
  249.         PUSH    BC ;антиномер литерала+1
  250.        PUSH     DE ;Q+1
  251.         EXX    
  252. MTREEbug
  253.        LD       (MKhl),HL
  254.        POP      HL
  255.         POP     BC
  256.        ;DEC BC ;номер литерала
  257.        ;LD (HL),C
  258.        ;INC HL
  259.        ;LD (HL),B ;формируем лист
  260.        SCF     
  261.        SBC      HL,BC
  262. MKhl := $+1
  263.        LD       (0),HL
  264.         LD      C,A
  265.         POP     AF
  266.         RET     Z ;=0 признак выхода
  267.         POP     HL
  268.         INC     HL
  269.         INC     HL ;следующий свободный узел
  270.            ;A=его глубина
  271.            ;DE=адрес места для новых узлов
  272.         JR      MKTREE1
  273.  
  274. EMMTPP
  275.         LD      B,A
  276.         AND     3
  277.         OR      4
  278.         LD      L,A
  279.         SRL     B
  280.         SRL B
  281.         DEC     B
  282. EM_TPP  EX AF,AF'      
  283. MLEN0   ADD     A,A
  284.         CALL    Z,NEWBYTE
  285.         ADC     HL,HL
  286.        DJNZ     MLEN0
  287.         EX AF,AF'      
  288.         RET    
  289.  
  290. LDA2    LD      A,2
  291. LDA
  292.         CP      9
  293.         JR      NC,LDA915
  294. LDA18   LD      B,A
  295. LDA18B
  296.         LD      C,0
  297.         EX AF,AF'      
  298. LDA0    ADD     A,A
  299.         CALL    Z,NEWBYTE
  300.         RL      C
  301.         DJNZ    LDA0
  302.         EX AF,AF'      
  303.         RET    
  304. LDA915
  305.         SUB     8
  306.         CALL    LDA18
  307.         LD      A,C
  308.         LD      B,8
  309.         CALL    LDA0-1
  310.         LD      B,A
  311.         RET    
  312.  
  313. ;        DISPLAY        $
  314.                 DUPL (HIGH ($)<<8)+0XF0-$,0;            DUPL $+15/256<8+0XF0-$,0
  315. ;        DISPLAY        "=",$
  316. tlen2
  317.         DB      2,0>>2
  318.         DB      2,4>>2
  319.         DB      3,8>>3
  320.         DB      4,16>>4
  321.         DB      5,32>>5
  322.         DB      6,64>>6
  323.         DB      6,128>>6
  324.         DB      6,192>>6
  325.  
  326.