?login_element?

Subversion Repositories NedoOS

Rev

Rev 344 | Blame | Compare with Previous | Last modification | View Log | Download

  1. PACKfil
  2. ;hl=addr
  3. ;[b=size in sectors]
  4. ;[de=first sector]
  5. ;hl'=fout+
  6. ;de'=0?
  7. packfilsz=0x8000
  8.  
  9. ;TODO предварительно проверить, что файл существует
  10.  
  11.         ld a,(filehandle)
  12.         ld b,a
  13.         OS_GETFILESIZE ;dehl=filesize
  14.         ld (filesize),hl
  15.         ld (filesizeHSW),de
  16.  
  17.         ld hl,0
  18.         ;ld (paksz),hl
  19.         ;ld (paksz+2),hl
  20.         ld (unpsz),hl
  21.         ld (unpsz+2),hl
  22.  
  23.         ;ld a,pgTEXT
  24.         ;call OUTME
  25. ;включена pgTEXT?
  26.         EXX
  27.         LD de,0;D,0 ;saved ;TODO de?
  28.        ;LD (oldsaved),DE ;для перепаковки в режиме store
  29.        ;LD (oldhl_),HL ;для перепаковки в режиме store
  30.        EXX
  31.         LD A,(tmethod)
  32.         SUB "p"
  33.         JR Z,$+4 ;store
  34.         LD A,4   ;pack
  35. dic0
  36.        ;PUSH HL
  37.        ;LD HL,(SAVE1st)
  38.        ;LD (oldSAVE1st),HL ;для перепаковки в режиме store?
  39.        ;LD HL,(lded)
  40.        ;LD (oldlded),HL ;для перепаковки в режиме store
  41. pACKREP
  42.          ;xor a ;"store"
  43.         LD (POISKIP),A
  44.        
  45.         ;LD HL,(unpsz)
  46.         ;LD (remainsz),HL
  47.        
  48.          call BYTEsPP_startfile ;сохранить или пропустить первые 2 сектора файла
  49.        
  50.         LD A,62
  51.         LD (p2NOjr),A ;первый раз пропускаем jr
  52.         LD HL,0
  53.         LD (CURCRC),HL
  54.         LD (CURCRC2),HL
  55.        ;POP HL
  56. LZ
  57.        ;PUSH BC
  58.         call OUTpgTEXT
  59.  
  60.         exx
  61.         push bc
  62.         push de
  63.         push hl
  64.         exx
  65.         ld de,-packfilsz
  66.         ld (ADRfrom),de
  67.         ld hl,packfilsz
  68. ;de=buf
  69. ;hl=size
  70.         call readstream_file
  71.          push hl
  72.          ld de,(unpsz)
  73.          add hl,de
  74.          ld (unpsz),hl
  75.          ld hl,(unpsz+2)
  76.          jr nc,$+3
  77.          inc hl
  78.          ld (unpsz+2),hl
  79.          pop hl
  80.          ;ld (remainsz),hl
  81.         exx
  82.         pop hl
  83.         pop de
  84.         pop bc
  85.         exx
  86. ;hl=block length
  87.  
  88. p2NOjr=$
  89.        JR p2NO1stKUS ;первый раз ld a,N
  90. ;первый блок файла:
  91.         EXX
  92.        PUSH HL ;fheadCRC arc pos
  93.         EXX
  94.        LD A,(THEADON)
  95.        CP "n" ;заголовки разрешены?
  96.          push hl
  97.         LD IX,fihd-2
  98.         LD A,(fihdsz)
  99.         LD B,A
  100.         CALL Z,BLOCK ;записываем заголовок файла
  101.          pop hl
  102.         EXX
  103.         LD C,1 ;bit collector
  104.        PUSH DE
  105.        PUSH HL ;file start pos
  106.         EXX
  107. p2NO1stKUS
  108.  
  109.          ld a,h
  110.          or l
  111.          jp z,packnoremain ;пустой файл/пустой 32к блок файла ;правильный выход при длине 0 (на стеке 3 числа)
  112.  
  113.        exx
  114.        PUSH BC,DE,HL
  115.        exx
  116.  
  117.         push hl ;block length
  118.        
  119.         call mktcrc ;TODO один раз при старте
  120.         call clearhashes
  121.        
  122.         exx
  123. ;       LD HL,pgLZ*256+pgTEXT ;TODO убрать эти константы в регистрах
  124. ;      IF k256
  125. ;      LD DE,#352
  126. ;      ELSE
  127. ;       LD DE,#3EC
  128. ;      ENDIF
  129.         ;LD BC,32765
  130.         ;OUT (C),L
  131.         call OUTpgTEXT
  132.         exx
  133.  
  134.        pop bc ;block length      
  135. ADRfrom=$+1
  136.         LD HL,0
  137.         push bc
  138.         push hl
  139. ;hl=addr, bc=length
  140.        call gencrc
  141.  
  142.         ld hl,frqs
  143.         ld bc,frqend-frqs-1
  144.         ld (hl),-1
  145.         call fillmem ;чистим frqs
  146.         ld hl,ddfrq
  147.         ld bc,ddfrqend-ddfrq-1
  148.         ld (hl),-1
  149.         call fillmem ;чистим ddfrq+rdfrq
  150.  
  151.         pop hl
  152.         pop bc
  153.         LD DE,pakto
  154. ;hl=TEKADR
  155. ;de=PUTBITB=pakto (TODO 0)
  156. ;bc=length
  157.         LD A,1
  158.         LD (PUTBITC),A
  159.         LD (PUTBITB),DE
  160.        PUSH HL
  161.         ADD HL,BC
  162.         LD (INEND),HL
  163.        POP HL ;TEKADR
  164.         ;jr $
  165.         CALL CRUNgo;LZPP
  166.  
  167.         if 1==1
  168.        LD A,(POISKIP) ;method (0=store)
  169.        OR A
  170.        JR Z,NO269 ;store
  171.       ;добавим 269
  172. filesize=$+1
  173.        ld hl,0
  174.        ld de,(unpsz)
  175.        ;or a
  176.        sbc hl,de
  177.        ld a,h
  178.        or l
  179. filesizeHSW=$+1
  180.        ld hl,0
  181.        ld de,(unpsz+2)
  182.        ;or a
  183.        sbc hl,de
  184.        or h
  185.        or l
  186.         ADD A,-1 ;если это был последний блок файла (FILEremain=0), то будет NC - не запишем литерал
  187.        LD A,269&0xff
  188.         CALL C,PUTBYTi ;записали литерал обновления деревьев? после блока! т.е между блоками
  189. NO269
  190.         endif
  191.  
  192.        SCF
  193.        SBC A,A
  194.        CALL PUTBIT
  195.        CALL PUTBYTE ;записали литерал конца блока (невозможный)
  196.         LD B,7
  197.         CALL PUT0
  198.         DJNZ $-3 ;flush битового буфера
  199.  
  200. ;;Huffman:
  201.        EXX
  202.         ;OUT (C),H
  203.         ld a,pgLZ
  204.         call OUTME
  205.        IF ramdisk
  206.         LD A,pgLZ;H
  207.         LD (BYTEPG),A
  208.        ENDIF
  209.        POP HL,DE,BC
  210.        EXX
  211.        
  212.         call packmktrees
  213.  
  214.        LD HL,LBYTE
  215.        LD A,(POISKIP)
  216.        OR A
  217.        JR Z,infa ;"store"
  218.         call packwrtrees ;в первом блоке файла принудительно пишем деревья без команды, в последующих это будет после команды (которая в конце всех блоков, кроме последнего)
  219.        LD HL,PKLHPP
  220. infa
  221.        LD (pkiCALL+1),HL ;PKLHPP (кодируем через дерево)/LBYTE (просто копируем байты)
  222.  
  223.         LD A,24
  224.         LD (p2NOjr),A
  225.        
  226.        IF fastWRI
  227.         LD A,(PUTBITB+1) ;где остановился LZ кодер (HSB)
  228.         CP #C0
  229.         JR NC,$+4 ;LZ кодер всё уместил в страницу - можно иметь большой буфер записи и сохранять большим блоком
  230. ;если lz data вышло за пределы страницы и уже в pak9+ - нельзя иметь большой буфер записи
  231.           LD A,fout/256+2+(svbfsz/256);fout/256+4 ;сюда не попадаем при блоках 4K
  232.         LD (BYTEend),A ;адрес (HSB), при достижении которого процедура BYTE пишет на диск
  233.        ENDIF
  234.        
  235.         call packencodehuff
  236.        CALL OUTpgTEXT ;!!! разве до этого было не включено? для pkiL2 могло испортиться???
  237.        
  238.        IF fastWRI ;??? TODO
  239.      ;save buf
  240.         EXX
  241.         LD A,H
  242.         CP fout/256+2
  243.        JR C,FremNS ;в буфере записи сгенерировано не более 512 байт
  244.         PUSH BC
  245.        PUSH HL
  246.         CALL BYTEsPP ;сохранили целое число секторов
  247.        ;HL=fout+512
  248.       ;TODO двигать de, если сохраняли от fout? сейчас костыль в конце файла
  249.         EX DE,HL ;saved
  250.        EX (SP),HL
  251.         LD C,L
  252.         LD B,E
  253.         LD L,E
  254.         INC BC
  255.         LDIR ;остаток переносим в fout+512
  256.         DEC DE
  257.         EX DE,HL
  258.        POP DE ;saved TODO
  259.         POP BC
  260. FremNS
  261.         EXX
  262.        ENDIF
  263.      ;догрузить
  264.         JP LZ
  265.  
  266. PKST
  267.         EXX
  268.         LD HL,fout
  269.         LD E,L;0
  270.        LD D,L ;for CREATE empty (de=SAVEsz in sectors)
  271.         EXX
  272.         RET
  273.  
  274. packnoremain
  275. ;в стеке 3 числа
  276.         LD B,7
  277.        CALL PKBDpp ;довыгрузить байт
  278. ;---continue filehead
  279.         EXX
  280.         PUSH DE ;saved сейчас
  281.         EXX
  282.         POP HL
  283.        POP DE ;file start pos
  284.        POP BC ;saved было
  285.        inc bc
  286.        inc bc ;костыль TODO
  287.         XOR A
  288.         SBC HL,BC ;add H
  289.         LD B,L
  290.         ld C,A ;c=0
  291.       LD A,H
  292.         EXX
  293.         PUSH HL
  294.         EXX
  295.         POP HL ;current outfile pos
  296.         SBC HL,DE
  297.         ADD HL,BC ;add H
  298.       ADC A,C ;c=0
  299.        POP DE ;filehead CRC outfile pos
  300.         LD IX,2
  301.         ADD IX,DE
  302. ;HL=filehead paksz
  303. ;c=0
  304.         LD (paksz),HL ;TODO убрать (сейчас для показа цифр?)
  305.         ;ld bc,0
  306.       LD B,A
  307.        ;EI
  308.        ;ld hl,(paksz)
  309.        ;ld bc,(paksz+2)
  310. ;bchl=paksz
  311.        LD A,(CPn)
  312.        CP "n"
  313.        RET NZ ;no CRC??? TODO
  314.        LD A,(THEADON)
  315.        CP "n"
  316.        ret nz;jr NZ,SAVE_ ;no rar header
  317.         PUSH DE ;filehead CRC outfile pos
  318.         LD (IX+5),L
  319.         LD (IX+6),H
  320.       LD (IX+7),c
  321.       LD (IX+8),b
  322.      
  323.       ld hl,(unpsz)
  324.       ld (ix+9),l
  325.       ld (ix+10),h
  326.       ld hl,(unpsz+2)
  327.       ld (ix+11),l
  328.       ld (ix+12),h
  329.      
  330. POISKIP=$+1
  331.        JR $+6
  332.        LD (IX+23),"0"
  333.         LD HL,(CURCRC)
  334.         LD (IX+14),L
  335.         LD (IX+15),H
  336.         LD HL,(CURCRC2)
  337.         LD (IX+16),L
  338.         LD (IX+17),H
  339.         LD A,(fihdsz)
  340.         SUB 2 ;размер заголовка - 2
  341.         LD B,A
  342.         CALL UPCRC1
  343.         POP HL ;filehead CRC outfile pos
  344.         LD (HL),E
  345.         INC HL
  346.         LD (HL),D
  347.        
  348.         if 1==1
  349.         ;xor a
  350.         ;jp pACKREP
  351.         ret
  352.         else
  353.        
  354.         LD HL,(unpsz)
  355.         LD BC,(paksz)
  356.        OR A
  357.         SBC HL,BC
  358.        ret nc;jr NC,SAVE_ ;unpsz >= paksz
  359. ;пересохраняем в режиме stored
  360. ;TODO
  361.  
  362. ;oldSAVE1st=$+1
  363. ;       LD HL,0
  364. ;       LD (SAVE1st),HL
  365. oldlded=$+1
  366.        LD HL,0
  367.        LD (lded),HL
  368. oldsaved=$+1
  369.         LD DE,0
  370. oldhl_=$+1
  371.         LD HL,0
  372.         EXX
  373.         CALL CON1NAM
  374.         XOR A ;"store"
  375.        PUSH HL
  376.         JP pACKREP
  377.  
  378.         endif
  379.        
  380. ;flush and close outfile
  381. SAVE_
  382.         EXX
  383.         ;LD A,L
  384.         ;LD (SAVElenLS1),A
  385.  
  386.         push hl
  387.         call BYTEsPP_endfile ;сохраняем, что не успели сохранить
  388.        
  389. ;SAVE1st=$+1
  390.         ;LD HL,0 ;1stfree
  391.         ;LD (BYTEsvTS),HL
  392.  
  393.         pop hl
  394.        
  395.          ret;jp SAVECLOSE
  396.  
  397.        IF dolds
  398. copdd
  399.        LD C,48
  400.        LD A,3
  401. copdd0 PUSH BC,DE,HL
  402.        LDIR
  403.        POP HL,DE,BC
  404.        INC H,D
  405.        DEC A
  406.        jr NZ,copdd0
  407.        RET
  408.        ENDIF
  409.  
  410. clearhashes
  411. ;чистим хэш-таблицу
  412.       IF k256
  413.       LD A,k256
  414.       CALL CLPG
  415.       else
  416.         ld hl,keys
  417.         ld bc,+((keymask+1)*512)-1
  418.         ld (hl),0
  419.         call fillmem
  420.       ENDIF
  421.       ;TODO потом вернуть это ускорение очистки
  422.        ;LD A,(ADRfrom+1)
  423.        ;CP #E0
  424.         LD A,3;#17
  425.         CALL CLPG
  426.        ;ret nc ;JR NC,LZncl
  427.         DEC A
  428.         CALL CLPG
  429.        ;LD A,(ADRfrom+1)
  430.        ;CP #C0
  431.        ;ret nc ;JR NC,LZncl
  432.         dec a;LD A,#14
  433.         CALL CLPG
  434.         DEC A
  435.         jp CLPG
  436.  
  437. packmktrees
  438. ;сейчас в frqs частоты всех литералов
  439.         LD HL,ldbit
  440.         LD BC,298
  441.         call HUFFMAN
  442. ;теперь в ldbit - длины кодов и сами коды
  443.         LD DE,lens
  444.         LDIR
  445.         PUSH DE
  446. ;строим дерево dd
  447.         ;jr $
  448.         LD HL,ddfrq
  449.         LD DE,frqs
  450.         LD BC,298*2
  451.         LDIR
  452.         LD HL,ddbit
  453.         LD C,48
  454.         call HUFFMAN
  455.         POP DE
  456.         LDIR
  457.        IF dolds
  458.        PUSH DE
  459. ;дерево rd
  460.        LD HL,ddfrq;rdfrq ;(rd лежит как литералы 48..75 в dd)
  461.        LD DE,frqs
  462.        LD BC,298*2
  463.        LDIR
  464.         LD HL,frqs
  465.         LD B,2*48 ;листья dd
  466.         LD (HL),-1 ;не встречались
  467.         INC L
  468.         DJNZ $-3
  469.      LD HL,ddbit
  470.      LD DE,ddbit+48+28 ;тихое место
  471.      PUSH DE
  472.      push HL
  473.      CALL copdd
  474.         LD HL,ddbit;rdbit
  475.         LD C,48+28;28
  476.         call HUFFMAN
  477.      POP DE
  478.      pop HL
  479.      CALL copdd
  480.       LD HL,rdbit
  481.        POP DE
  482.        LD C,28
  483.        LDIR
  484.        ELSE
  485.         LD H,D
  486.         ld L,E
  487.         INC DE
  488.         LD C,27
  489.         LD (HL),B
  490.         LDIR
  491.        ENDIF
  492.        LD A,-1
  493.        LD (DE),A
  494. ;строим дерево bd
  495. ;для начала преобразуем lens
  496. ;коды 16,17,18 - в 2-байтном формате
  497.         LD HL,lens-1
  498.         LD D,H
  499.         ld E,L
  500. prlensN
  501.         LD A,(HL)
  502. prlensD LD (DE),A
  503.         INC HL
  504.         inc DE
  505.         LD BC,255 ;вместо -1;INC B:DJNZ
  506.         LD A,(HL)
  507.         CP C
  508.         JR Z,prlensQ
  509.         PUSH HL
  510. prlensR INC BC
  511.         inc HL
  512.         CP (HL)
  513.         JR Z,prlensR
  514.         POP HL
  515.         OR A
  516.         LD A,C
  517.         JR Z,prlensZ
  518.         DJNZ prlR256
  519.         CP 4-1
  520.         JR C,prlensN
  521.         CP 4+4-1
  522.         JR C,prlen16
  523. prlR256 LD BC,4+3-1 ;max repeat
  524. prlen16 LD A,(HL)
  525.         ADD HL,BC
  526.         LD (DE),A
  527.         INC DE
  528.         LD A,16
  529.         LD (DE),A
  530.         INC DE
  531.         LD A,C
  532.         SUB 4-1
  533.         JR prlensD
  534. prlensZ
  535.         DJNZ prlZ256
  536.         CP 3-1
  537.         JR C,prlensN
  538.         CP 11-1
  539.         JR C,prlen17
  540.         CP 11+128-1
  541.         JR C,prlen18
  542. prlZ256 LD BC,11+127-1 ;max repeat zero
  543. prlen18 ADD HL,BC
  544.         LD A,18
  545.         LD (DE),A
  546.         INC DE
  547.         LD A,C
  548.         SUB 11-1
  549.         JR prlensD
  550. prlen17 ADD HL,BC
  551.         LD A,17
  552.         LD (DE),A
  553.         INC DE
  554.         LD A,C
  555.         SUB 3-1
  556.         JR prlensD
  557. prlensQ
  558.         LD (DE),A ;-1
  559.         LD HL,frqs
  560.       ;PUSH HL
  561.         LD BC,298*2
  562.         LD (HL),A;-1
  563.         CALL fillmem;CLSA
  564.        DEC B
  565.         LD HL,lens
  566.       ;POP DE
  567.         LD DE,frqs
  568. FRQL0   PUSH HL
  569.         LD L,(HL)
  570.        LD H,B;0
  571.         ADD HL,HL
  572.         ADD HL,DE
  573.         INC (HL)
  574.         JR NZ,$+4
  575.         INC HL
  576.         INC (HL)
  577.         POP HL
  578.        BIT 4,(HL)
  579.        JR Z,$+3
  580.        INC HL
  581.         INC HL
  582.         LD A,(HL)
  583.         INC A
  584.         JR NZ,FRQL0
  585.         LD HL,bdbit
  586.         LD C,19
  587.         jp HUFFMAN
  588.  
  589. packwrtrees
  590.              ;no MMC
  591.         CALL bit0
  592.              ;clear old
  593.         CALL bit0
  594. ;---tree
  595.         LD HL,bdbit
  596.         LD C,19
  597. pkbdli
  598.         LD A,(HL)
  599.         RLA
  600.         RLA
  601.         RLA
  602.         RLA
  603.         INC L
  604.         LD B,4
  605.         CALL PKBDpp
  606.         DEC C
  607.         JR NZ,pkbdli
  608.  
  609.         LD HL,lens
  610. pkiL    PUSH HL
  611.         LD L,(HL)
  612.         LD H,bdbit/256
  613.         CALL PKNNpp ;пишем код Хаффмана (в hl через 256: длина, HSB, LSB) - пишем старшие биты
  614.         POP HL
  615.        LD A,(HL)
  616.         CP 16
  617.         JR C,pkLN16
  618.         CP 17
  619.         INC HL
  620.         LD A,(HL)
  621.         LD B,3
  622.         JR Z,pkL17
  623.         DEC B
  624.         JR C,pkL16
  625.         LD B,7
  626.         RLA
  627.         JR pkLadd
  628. pkL17   RRCA
  629. pkL16   RRCA
  630.         RRCA
  631. pkLadd  CALL PKBDpp
  632. pkLN16  INC HL
  633.         LD A,(HL)
  634.         INC A
  635.         JR NZ,pkiL
  636.         ret
  637.  
  638. packencodehuff
  639.         LD HL,pakto
  640.        LD DE,(ADRfrom) ;для opt2s
  641.         LD A,128
  642. pki0
  643.         ADD A,A
  644.         JR NZ,GET9Q
  645.         LD A,(HL)
  646.         INC L
  647.         CALL Z,INCH
  648.         RLA
  649. GET9Q
  650.         PUSH HL
  651.         LD L,(HL)
  652.        LD H,ldbit/512
  653.        RL H
  654.         LD B,(HL)
  655.         INC H
  656.         inc H
  657.         LD C,(HL)
  658.         INC H
  659.         inc H
  660.        EXA
  661.         LD A,H
  662.         RRA
  663.         JR NC,pkiNC
  664.         LD A,L
  665.         OR A
  666.         JP M,pki0Q ;литерал конца текста (невозможный)
  667.         SUB 261&0xff
  668.         CP 8
  669.        JP C,pkiL2
  670.          LD A,1
  671. pkiNC
  672.        LD A,H
  673. pkiCALL CALL PKLHPP ;/LBYTE для "store"
  674.         POP HL
  675.        CP ldbit/256+5
  676.        JP NZ,pkiN ;byte
  677.         LD A,(HL)
  678.        IF dolds
  679.          OR A
  680.          JP Z,pkiYOLD
  681.        ENDIF
  682.         CP 269&0xff
  683.         JP Z,pkinewtrees;pkiNDE ;обновление деревьев?
  684.         INC L
  685.         CALL Z,INCH
  686.        IF dolds
  687.         CP 261&0xff
  688.         JR NC,pkiN4
  689. ;olddisp 257..260=+1..4,len8
  690.         LD B,A
  691.        PUSH HL
  692.         LD A,(HL) ;len
  693.         DJNZ $+5
  694.         LD HL,(OLDSMES)
  695.         DJNZ $+5
  696.         LD HL,(OL2SMES)
  697.         DJNZ $+5
  698.         LD HL,(OL3SMES)
  699.         DJNZ $+5
  700.         LD HL,(OL4SMES)
  701.         LD (SMESH),HL
  702.         LD (pkiOLD),A
  703.        POP HL
  704.       INC L
  705.       CALL Z,INCH
  706.         LD A,(HL) ;скорректированный len
  707.         CALL LZMID
  708.       ;C=токен
  709.         PUSH BC,HL
  710.       ;A=остаток,B=число бит
  711.        PUSH AF
  712.         LD A,C
  713.         ADD A,rdbit&0xff
  714.         LD L,A ;литералы 48..75 вместо 0..27
  715.        POP AF
  716.         LD H,rdbit/256
  717.         LD B,(HL)
  718.         INC H
  719.         LD C,(HL)
  720.         INC H
  721.         LD L,(HL)
  722.         LD H,C
  723.         ADD HL,HL
  724.         CALL bit
  725.         DJNZ $-4
  726.         POP HL,BC
  727.         INC B
  728.         DEC B
  729.         JR Z,pkioQ
  730.        CPL ;!
  731.         LD C,B
  732.         RRCA
  733.         DJNZ $-1
  734.         LD B,C
  735.         RLA
  736.         CALL bit
  737.         DJNZ $-4
  738. pkioQ   JP pkiYOLD
  739. pkiN4
  740.        ENDIF
  741.         CP 278&0xff
  742.         JP NC,pkiLL
  743. ;len<=10 270..277=+E..15,-disp16
  744.         SUB 0xff&(270-3)
  745.        LD (pkiOLD),A
  746.         JP pkiLQ
  747. ;len=2 261..268=+5..C,-disp8
  748. pkiL2
  749.       ;dolds после len=2 не будет 4 раза
  750.         LD L,(HL)
  751.         LD H,C
  752.        LD (codeL2),HL
  753.         POP HL
  754.         INC L
  755.         CALL Z,INCH
  756.        IF dolds
  757.        LD A,-1
  758.        LD (SMESH+1),A
  759.        ENDIF
  760.         LD A,(HL)
  761.        IF dolds
  762.        LD (SMESH),A
  763.        ENDIF
  764.       PUSH HL
  765.         PUSH BC
  766.         CALL LZLITPP
  767.       ;A=остаток,B=число бит
  768.        CPL ;!
  769.         LD C,B
  770.         RRCA
  771.         DJNZ $-1
  772.         LD B,C
  773.         ld C,A
  774.         POP AF
  775.        IF opt2s
  776.         ADD A,B
  777.         LD LX,A
  778. ;считаем 2 байта в DE, если их не затерли
  779. ;и если они есть в tree (а они есть, т.к. tree одно)
  780.         LD HL,(PUTBITB) ;HL' не важен
  781.         LD A,H
  782.        ADD A,pak9/256
  783.        LD H,A
  784.        JR C,pkiL2CP
  785.         SBC HL,DE
  786.        INC DE
  787.         JR NC,pkiL2Z ;затерли
  788.        DEC DE
  789. pkiL2CP PUSH BC
  790.        LD A,pgTEXT;16
  791.        CALL OUTNO ;временно включаем 0-ю страницу
  792.         LD A,(DE)
  793.         INC DE
  794.         LD L,A
  795.         LD H,ldbit/256+4
  796.         LD C,(HL)
  797.         DEC H
  798.         dec H
  799.         LD B,(HL)
  800.         DEC H
  801.         dec H
  802.        LD (code1),BC
  803.         LD B,(HL)
  804.         EX DE,HL
  805.         LD E,(HL)
  806.         EX DE,HL
  807.        CALL OUTBYTEPG ;включаем старую страницу TODO
  808.         LD A,B
  809.         ADD A,(HL)
  810.        PUSH HL
  811.         INC H
  812.         inc H
  813.         LD C,(HL)
  814.         INC H
  815.         inc H
  816.         CP LX
  817.         LD A,(HL)
  818.         JR NC,pkiL2Y ;выгоднее ссылка
  819.       ;выгоднее символы
  820. code1=$+1
  821.         LD HL,0
  822.        CALL PKHLPP
  823.        POP HL
  824.         LD B,(HL)
  825.         LD H,C
  826.         ld L,A
  827.        CALL PKHLPP
  828.         POP AF
  829.         JR pkiNPOPnSSYL
  830. pkiL2Y POP AF
  831.         POP BC
  832. pkiL2Z  LD A,LX
  833.         SUB B
  834.        ENDIF
  835. codeL2=$+1
  836.         LD HL,0
  837.        PUSH BC
  838.        LD B,A
  839.        CALL PKHLPP
  840.        POP BC
  841.         LD A,C
  842.         CALL PKBDpp
  843.      ;IFN dolds ;в v0.33 уже закомментировано
  844.      ;LD A,2
  845.      ;LD (pkiOLD),A
  846.      ;ENDIF
  847.         JR pkiNPOP
  848. ;len>10 278..297=+16..29,len8,-disp16
  849. pkiLL
  850.         LD A,(HL)
  851.        LD (pkiOLD),A
  852.       DEC A ;len декрементирован
  853.         CALL LZMIDPP
  854.       ;A=остаток,B=число бит
  855.        CPL ;!
  856.         LD C,B
  857.         RRCA
  858.         DJNZ $-1
  859.         LD B,C
  860.         CALL PKBDpp
  861.         INC L
  862.         CALL Z,INCH
  863. pkiLQ
  864. ;для обычных ссылок типа >=3 и типа >=11
  865.        PUSH DE
  866.         LD E,(HL)
  867.         INC L
  868.         CALL Z,INCH
  869.         LD D,(HL)
  870.        IF dolds
  871.        LD (SMESH),DE
  872.        ENDIF
  873.         PUSH HL
  874.        LD HL,#1FFF
  875.        ADD HL,DE
  876.        JR C,$+6
  877.        LD HL,pkiOLD
  878.        INC (HL) ;>=#2000
  879.      ;DE=-disp16
  880.         CALL LZDISPP
  881.      ;A=dd code
  882.      ;HL=остаток,B=число бит+1
  883.         PUSH BC
  884.         DEC B
  885.         JR Z,pkiLRQ
  886.         RR H
  887.         rr L
  888.         rr D
  889.         rr E
  890.         DJNZ $-8
  891. pkiLRQ ;PUSH DE
  892.         LD L,A
  893.         LD H,ddbit/256
  894.         CALL PKNNpp
  895.        ;POP HL
  896.        EX DE,HL
  897.        CALL INVHL
  898.         POP BC
  899.      ;HL=остаток<<,B=число бит+1
  900.         DEC B
  901.         CALL NZ,PKHLPP
  902. ;;
  903.         POP HL
  904.        POP DE
  905. pkiYOLD
  906. ;код 256, конец обработки 257..260 и простых ссылок
  907.         PUSH HL
  908. pkiOLD=$+1 ;для 256 и для opt2s
  909.         LD HL,0
  910.       DEC HL
  911.         ADD HL,DE
  912.         EX DE,HL
  913. pkiNPOP
  914. ;конец обработки len=2:ссылка (INC DE там внутри)
  915.        IF dolds
  916.         CALL LZPUTQQ ;сдвиг буфера SMESH'ей
  917.        ENDIF
  918. pkiNPOPnSSYL
  919. ;конец обработки len=2:символы
  920.         POP HL
  921. pkiN
  922.         ;or a
  923.         ;jr z,$
  924.         ;cp 3
  925.         ;jr z,$
  926.        INC DE ;непак. адрес для opt2s
  927. pkinewtrees
  928. pkiNDE  INC L
  929.         CALL Z,INCH
  930.        EXA
  931.         JP pki0
  932. pki0Q
  933.         POP HL
  934.         ret
  935.