?login_element?

Subversion Repositories NedoOS

Rev

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

  1. ;кодирование 9bit (8+1):
  2. ;plain chr 0..255=-0..FF
  3. ;   rept 256     =+0
  4. ;olddisp 257..260=+1..4,len8
  5. ;  len=2 261..268=+5..C,-disp8
  6. ;   tree 269     =+D
  7. ;len3-10 270..277=+E..15,-disp16
  8. ; len>10 278..297=+16..29,len8,-disp16
  9. ;при переполнении 9bit буфера нужны (todo) новые деревья
  10. ;todo смешанный поток (или он уже смешанный?)
  11.  
  12. PUT0
  13.         OR A
  14. PUTBIT
  15.         PUSH HL
  16.         LD HL,PUTBITC
  17.         DEC (HL) ;??? TODO
  18.         JR Z,PUTBITZ
  19.         INC (HL)
  20.         RL (HL)
  21.         JR NC,POPHL
  22. BITADR=$+1
  23.         LD HL,0
  24.         PUSH AF
  25. PUTBITC=$+1
  26.         LD A,0
  27.         CALL CORRHL
  28.         POP AF
  29.         LD HL,PUTBITC
  30.         LD (HL),1
  31.         POP HL
  32.         RET
  33. PUTBITZ INC (HL)
  34.         RL (HL)
  35.         LD HL,(PUTBITB)
  36.         LD (BITADR),HL
  37. INCHL   INC HL
  38.         LD (PUTBITB),HL
  39. POPHL   POP HL
  40.         RET
  41. CORRHL
  42. ;hl=c000..>0 (переходим на pak9)??? TODO продолжать дальше в страницах
  43.         PUSH AF
  44.         LD A,H
  45.         ADD A,pak9/256
  46.         JR NC,_B0
  47.         EXX
  48.        ;OUT (C),H
  49.        ld a,pgLZ
  50.        call OUTME
  51.         EXX
  52.         LD A,H
  53. _B0     LD H,A
  54.         POP AF
  55.         LD (HL),A
  56.         EXX
  57.         ;OUT (C),L
  58.        push af
  59.        call OUTpgTEXT
  60.        pop af ;TODO надо ли?
  61.         EXX
  62.         RET
  63. ;todo LDAMINCHL (+18t/b)
  64. INCH
  65.         INC H
  66.         RET NZ
  67.         LD H,pak9/256
  68.        PUSH AF
  69.         CALL OUTpgTEXT ;TODO продолжать по страницам
  70.        POP AF
  71.         RET
  72.  
  73. NACH3
  74.     LD A,#7F
  75.     IN A,(-2)
  76.     RRA
  77.     jr C,$+7
  78.     LD A,#FE
  79.     IN A,(-2)
  80.     RRA ;TODO fix
  81.        JP NC,quitoperation;RELOAD
  82.         ld A,(KOLODIN)
  83.         OR A
  84.         JR NZ,LZPUT
  85.         LD HL,(TEKADR)
  86. NEPAK   ;NC
  87.        IF sureLE
  88.         EXX
  89.         ;OUT (C),L
  90.         call OUTpgTEXT
  91.         EXX
  92.        ENDIF
  93.         LD A,(HL)
  94.         INC HL
  95. PUTBYTi
  96.        PUSH AF,DE,HL
  97.         LD L,A
  98.         LD H,0
  99.         RL H
  100.         ADD HL,HL
  101.         LD DE,frqs
  102.         ADD HL,DE
  103.         INC (HL)
  104.         JR NZ,$+4
  105.         INC HL
  106.         INC (HL)
  107.        POP HL,DE,AF
  108.         CALL PUTBIT
  109. PUTBYTE
  110.         PUSH HL
  111. PUTBITB=$+1
  112.         LD HL,0
  113.        PUSH HL
  114.         CALL CORRHL
  115.        POP HL ;TODO надо ли сохранять A?
  116.         JR INCHL
  117. LZPUT2
  118.        IF dolds
  119.      ;эту и 3 пред.ссылки потом не повторять, иначе нельзя opt2s
  120.        LD A,#F0
  121.        LD (LZnorep+1),A ;HSB
  122.        ENDIF
  123.         LD A,E
  124.         CALL LZLITPP
  125.         LD A,C
  126.        SCF
  127.         CALL PUTBYTi
  128.         LD A,E
  129.         CALL PUTBYTE
  130.        JP LZPUTQ
  131. LZPUT
  132. SMESH=$+1
  133.         LD DE,0
  134. ;;
  135.        IF dolds
  136.        LD HL,doldson
  137.        BIT 0,(HL) ;" "/"+"
  138.        JR Z,LZn256
  139. LZnorep=$+1
  140.         LD HL,0
  141.         ADD HL,HL
  142.         LD (LZnorep),HL
  143. OLDSMES=$+1
  144.         LD HL,0
  145.         JR C,LZn256
  146.        CP 5 ;10
  147.        JR C,LZn256
  148.        ;OR A
  149.         SBC HL,DE
  150.         LD C,1
  151.         JR Z,LZ256
  152.         INC C
  153. OL2SMES=$+1
  154.         LD HL,0
  155.         OR A
  156.         SBC HL,DE
  157.         JR Z,LZ257
  158.         INC C
  159. OL3SMES=$+1
  160.         LD HL,0
  161.         OR A
  162.         SBC HL,DE
  163.         JR Z,LZ257
  164.         INC C
  165. OL4SMES=$+1
  166.         LD HL,0
  167.         OR A
  168.         SBC HL,DE
  169.         JR NZ,LZn256
  170. LZ257
  171.         LD H,D ;SMESH/256
  172.         INC H
  173.         JR Z,LZ257nd ;disp=1..256
  174.         DEC A ;disp>=257
  175.         LD HL,#1FFF
  176.         ADD HL,DE
  177.         JR C,$+3
  178.         DEC A ;disp>=#2000
  179. LZ257nd
  180.         PUSH AF
  181.         LD A,C
  182.        SCF
  183.         CALL PUTBYTi
  184.       ld A,(KOLODIN)
  185.       CALL PUTBYTE
  186.         POP AF
  187.         CALL PUTBYTE
  188.        CALL LZMID
  189.        LD A,C
  190.      ;A=rd code
  191.         ADD A,A
  192.        ADD A,rdfrq&0xff
  193.         LD L,A
  194.         LD H,rdfrq/256
  195.         INC (HL)
  196.         JR NZ,$+4
  197.         INC HL
  198.         INC (HL)
  199.         JR LZPUTQ
  200. LZ256
  201. OLDKOL=$+1
  202.         CP 0
  203.         JR NZ,LZ257
  204.     ;;;CP 20
  205.     ;;;JR C,LZn256
  206.         XOR A
  207.        SCF
  208.         CALL PUTBYTi
  209.         JR LZPUTQ
  210. LZn256
  211.        ENDIF
  212.         CP 2
  213.         JP Z,LZPUT2
  214. ;;
  215.         LD HL,#1FFF
  216.         ADD HL,DE
  217.         JR C,$+3
  218.         DEC A ;>=#2000
  219.         CP 11
  220.         JR NC,LZPUT11
  221.         SUB 0xff&(3-270)
  222.         CALL PUTBYTi
  223. LZDISP
  224.         LD A,E
  225.         CALL PUTBYTE
  226.         LD A,D
  227.         CALL PUTBYTE
  228.      ;DE=-disp16
  229.         CALL LZDISPP
  230.      ;A=dd code
  231.         ADD A,A
  232.         LD L,A
  233.         LD H,ddfrq/256
  234.         INC (HL)
  235.         JR NZ,$+4
  236.         INC HL
  237.         INC (HL)
  238. LZPUTQ
  239.         ld A,(KOLODIN)
  240.       IF dolds
  241.       LD (OLDKOL),A
  242.       ENDIF
  243.         DEC A
  244.         LD LX,A
  245. TEKADR=$+1
  246.         LD BC,0
  247.       ;INC BC
  248.       ;DEC A
  249.       ;JR Z,oboitifilpo
  250.       ;DEC BC
  251.         ;LD (FILLSP),SP ;todo fix
  252. ;bc=текущий адрес
  253. fILPO1  INC BC
  254.         LD H,B
  255.         ld L,C
  256.        IF sureLE
  257.         EXX
  258.         ;OUT (C),L
  259.         call OUTpgTEXT
  260.         EXX
  261.        ENDIF
  262.         LD D,(HL)
  263.        RLC D
  264.         INC HL
  265.         LD A,(HL)
  266.        RRCA
  267.        XOR D
  268.       IF k3b
  269.       INC HL
  270.       XOR (HL)
  271.       DEC HL
  272.       ENDIF
  273.        LD E,A
  274.        XOR D
  275.       IF k256
  276.       OR #E0
  277.       ELSE
  278.        AND keymask
  279.        OR keys/512
  280.       ENDIF
  281.         LD D,A
  282.         EX DE,HL
  283.         ADD HL,HL
  284.         ;LD SP,HL
  285.       IF k256
  286.       EXX
  287.       LD A,k256
  288.       ;OUT (C),A
  289.       call OUTME
  290.       EXX
  291.       ENDIF
  292. ;hl=ключ*2
  293. ;de=адрес 3-го символа
  294.         ;POP HL
  295.         ;PUSH DE
  296.         ;EX DE,HL
  297.         push de
  298.         ld a,(hl)
  299.         ld (hl),e
  300.         ld e,a
  301.         inc l
  302.         ld a,(hl)
  303.         ld (hl),d ;обновили голову цепочки
  304.         ld d,a
  305.         pop hl        
  306. ;hl=адрес 3-го символа
  307. ;de=старое начало цепочки, прочитанное из хэш-таблицы
  308.         ADD HL,HL ;по 2 байта на символ
  309.        LD A,H
  310.        RLCA
  311.        RLCA
  312.         SET 7,H
  313.         set 6,H
  314.         EXX
  315.        AND 3;D
  316.       ;IF k256
  317.       ;ADD A,E
  318.       ;ELSE
  319.       ; CP 2
  320.       ; SBC A,E
  321.       ;ENDIF
  322.         ;OUT (C),A
  323.         call OUTME
  324.         EXX
  325. ;дополняем цепочку новым адресом:
  326.         ;LD SP,HL
  327.         ;POP HL ;не важно
  328.         ;PUSH DE
  329.         ld (hl),e
  330.         inc l
  331.         ld (hl),d ;ссылка на старое начало цепочки
  332.        IF sureLE==0
  333.         EXX
  334.         ;OUT (C),L
  335.         call OUTpgTEXT
  336.         EXX
  337.        ENDIF
  338.         DEC LX
  339.         JR NZ,fILPO1
  340.  
  341. ;FILLSP=$+1
  342. ;        LD SP,0
  343. ;oboitifilpo
  344.        INC BC
  345.        IF dolds
  346. ;1:pkiNPOP
  347. LZPUTQQ
  348.         LD HL,(OL3SMES)
  349.         LD (OL4SMES),HL
  350.         LD HL,(OL2SMES)
  351.         LD (OL3SMES),HL
  352.         LD HL,(OLDSMES)
  353.         LD (OL2SMES),HL
  354.         LD HL,(SMESH)
  355.         LD (OLDSMES),HL
  356.        ENDIF
  357.        LD H,B
  358.        ld L,C
  359. ;LZafter=$+1
  360.        ;LD HL,0
  361.         RET
  362. LZPUT11
  363.   ;A=len (если disp>=#2000, то len-1)
  364.      ;;;DEC A ;депакер увеличит
  365.         PUSH AF
  366.       DEC A
  367.         CALL LZMIDPP
  368.         LD A,C
  369.         SUB 0xff&(-270)
  370.         CALL PUTBYTi
  371.         POP AF
  372.         CALL PUTBYTE
  373.        JP LZDISP
  374.  
  375. CRUN0   LD A,R
  376.         ADD A,A ;иначе +10s
  377.         CALL Z,PR1234
  378.        POP DE
  379.         LD L,-1
  380. CRUN1
  381. ;L=макс.длина ссылки
  382. ;DE=TEKADR
  383. ;lazy evaluation
  384.         CALL POISKm0
  385. ;;если там найдена ссылка, то она занесена в хэш-таблицу
  386.         ;jr $
  387.        ld A,(KOLODIN)
  388.        OR A
  389.        CALL Z,FiND2
  390. ;;
  391. CRUN2
  392.         LD HL,(TEKADR)
  393.         INC HL
  394.         EX DE,HL
  395.         LD HL,(INEND)
  396.         XOR A
  397.         SBC HL,DE
  398.        JP Z,NACH3 ;??? почему TODO
  399.         LD (TEKADR),DE ;!
  400.         OR H
  401.         JR NZ,CRUNLN1
  402.         LD A,L
  403.         ld (MAXPOSL),A
  404. CRUNLN1
  405.         ld A,(KOLODIN)
  406.        IF fast0s
  407.        CP fast0s
  408.        CCF
  409.        JR C,NLQ ;пропускаем LE, если ссылка >=fast0s
  410.                 ;(ускоряет до 3 раз!)
  411.         OR A
  412.         CCF
  413.        ELSE
  414.        SCF
  415.        INC A
  416.        JR Z,NLQ
  417.        DEC A
  418.        ENDIF
  419.        ;CY=1
  420. LEflag  JR Z,NLQ ;JR/JZ
  421.         LD HL,(SMESH)
  422.         PUSH HL
  423.         PUSH AF
  424.         CALL POISK
  425.        IF sureLE
  426.        LD (NLhl),HL
  427.        LD (NLbc),BC
  428.        ENDIF
  429.         POP BC
  430.         POP HL
  431.         ld A,(KOLODIN)
  432.         SCF
  433.         SBC A,B
  434.         JR Z,LONGn2
  435. NLCP    JR NC,LONGER
  436.         LD A,B
  437.         ld (KOLODIN),A
  438.         LD (SMESH),HL
  439.        IF sureLE
  440.    ;POISK положил старый ключ в окно
  441.    ;восстанавливаем
  442. NLbc=$+1
  443.         LD BC,0
  444. NLhl=$+1
  445.         LD HL,0
  446. SPoldky=$+1
  447.         LD DE,0
  448.        LD A,(HL)
  449.        LD (DE),A
  450.         LD (HL),C
  451.         INC L
  452.         inc E
  453.        LD A,(HL)
  454.        LD (DE),A
  455.         LD (HL),B
  456.        ELSE
  457.       IF k256
  458.       EXX
  459.       LD A,k256
  460.       ;OUT (C),A
  461.       call OUTME
  462.       EXX
  463.       ENDIF
  464.         ld HL,(LZoldky)
  465. SPoldky=$+1
  466.         LD (0),HL
  467.       IF k256
  468.       EXX
  469.       ;OUT (C),L
  470.       call OUTpgTEXT
  471.       EXX
  472.       ENDIF
  473.        ENDIF
  474.         JR NLQ ;CY
  475. ;1
  476. LONGER ;NC
  477. ;новая ссылка лучше
  478. ;не кодировать byte и ссылку, а закодировать byte и подождать
  479.      LD HL,(TEKADR)
  480.      DEC HL
  481.      CALL NEPAK ;hl++
  482.      LD (TEKADR),HL ;не EOF, т.к. до 2-го поиска была проверка
  483.      JP CRUN2 ;пропуск поиска, т.к. он уже проведен
  484. ;
  485.  
  486. NLQ    ;CY
  487.         LD HL,(TEKADR)
  488.         DEC HL
  489.        CALL NC,NEPAK ;hl++
  490.         LD (TEKADR),HL
  491.      ;запись в output
  492.      ;на основе TEKADR,KOLODIN и SMESH
  493. CRUNNACH3
  494.         CALL NACH3
  495. CRUNgo
  496. ;hl=TEKADR
  497.         LD (TEKADR),HL
  498.         EX DE,HL
  499. INEND=$+1
  500.         LD HL,0
  501.         XOR A
  502.         SBC HL,DE
  503.         RET Z ;конец упаковываемого блока?
  504.         OR H
  505.         JR Z,CRUN1 ;осталось <256 байт ;L=макс.длина ссылки
  506.        INC A
  507.         PUSH DE
  508.         JP NZ,CRUN0 ;L будет=255
  509. ;осталось отрицательное число байт
  510.        jr $ ;TODO error
  511. LONGn2
  512.         BIT 7,L
  513. SETA=$+1
  514.         LD C,#FD
  515.         JR NZ,$+4 ;very short
  516. SETB=$+1
  517.         LD C,#F4
  518.         LD A,H
  519.         INC A
  520.         JR Z,NO
  521.         BIT 7,L
  522. SETC=$+1
  523.         LD C,#F0
  524.        IF nastr
  525.         JR NZ,$+4
  526. SETD=$+1
  527.         LD C,#F0
  528.        ENDIF
  529.         INC A
  530.         JR Z,NO
  531. SETE=$+1
  532.         LD C,#FA
  533.        IF nastr
  534.         INC A
  535.         JR Z,NO
  536.         INC A
  537. SETF=$+1
  538.         LD C,#FA
  539.         JR Z,NO
  540.        ELSE
  541.         ADD A,2
  542.         JR C,NO
  543.        ENDIF
  544. SETG=$+1
  545.         LD C,#F8
  546.         ADD A,2
  547.         JR C,NO
  548. SETH=$+1
  549.         LD C,#F4
  550.         ADD A,2
  551.         JR C,NO
  552. SETI=$+1
  553.         LD C,#F0
  554.         ADD A,4
  555.         JR C,NO
  556. SETJ=$+1
  557.         LD C,#E8
  558.         ADD A,4
  559.         JR C,NO
  560. SETK=$+1
  561.         LD C,#E0
  562.         ADD A,8
  563.         JR C,NO
  564. SETL=$+1
  565.         LD C,#D0
  566.         ADD A,8
  567.         JR C,NO
  568. SETM=$+1
  569.         LD C,#C0
  570.         ADD A,16
  571.         JR C,NO
  572. SETN=$+1
  573.         LD C,#A0
  574.         ADD A,16
  575.         JR C,NO
  576. SETO=$+1
  577.         LD C,#80
  578. NO      LD A,(SMESH+1)
  579.         CP C
  580.        JP NLCP
  581. ;;
  582. ;A=-dispL
  583. LZLITPP
  584.        LD BC,#205
  585.         ADD A,4
  586.         RET C    ;1..4
  587.         INC C
  588.         ADD A,4
  589.         RET C    ;5..8
  590.         INC C
  591.        INC B ;3
  592.         ADD A,8
  593.         RET C    ;9..#10
  594.         INC C
  595.        INC B ;4
  596.         ADD A,16
  597.         RET C    ;11..20
  598.         INC C
  599.        INC B ;5
  600.         ADD A,32
  601.         RET C    ;21..40
  602.         INC C
  603.        INC B ;6
  604.         ADD A,64
  605.         RET C    ;41..80
  606.         INC C
  607.         ADD A,64
  608.         RET C    ;81..C0
  609.         INC C
  610.         ADD A,64
  611.         RET      ;C1..100
  612. LZMID
  613.        LD B,0
  614.         CP 10
  615.         JR NC,LZMIDPP
  616.         SUB 2
  617.         LD C,A
  618.         XOR A
  619.         RET      ;2..9
  620. ;;
  621. LZMIDPP
  622.         NEG
  623.         LD BC,#108
  624.         ADD A,11
  625.         RET C    ;A..B
  626.         INC C
  627.         ADD A,2
  628.         RET C    ;C..D
  629.         INC C
  630.         ADD A,2
  631.         RET C    ;E..F
  632.         INC C
  633.         ADD A,2
  634.         RET C    ;10..11
  635.         INC C
  636.        INC B ;2
  637.         ADD A,4
  638.         RET C    ;12..15
  639.         INC C
  640.         ADD A,4
  641.         RET C    ;16..19
  642.         INC C
  643.         ADD A,4
  644.         RET C    ;1A..1D
  645.         INC C
  646.         ADD A,4
  647.         RET C    ;1E..21
  648.         INC C
  649.        INC B ;3
  650.         ADD A,8
  651.         RET C    ;22..29
  652.         INC C
  653.         ADD A,8
  654.         RET C    ;2A..31
  655.         INC C
  656.         ADD A,8
  657.         RET C    ;32..39
  658.         INC C
  659.         ADD A,8
  660.         RET C    ;3A..41
  661.         INC C
  662.        INC B ;4
  663.         ADD A,16
  664.         RET C    ;42..51
  665.         INC C
  666.         ADD A,16
  667.         RET C    ;52..61
  668.         INC C
  669.         ADD A,16
  670.         RET C    ;62..71
  671.         INC C
  672.         ADD A,16
  673.         RET C    ;72..81
  674.         INC C
  675.        INC B ;5
  676.         ADD A,32
  677.         RET C    ;82..A1
  678.         INC C
  679.         ADD A,32
  680.         RET C    ;A2..C1
  681.         INC C
  682.         ADD A,32
  683.         RET C    ;C2..E1
  684.         INC C
  685.         ADD A,32
  686.         RET      ;E2..101
  687. LZDISPP
  688.        EX DE,HL
  689.         XOR A
  690.         LD DE,1
  691.        LD B,E;0+
  692.         ADD HL,DE
  693.         RET C        ;1
  694.         INC A
  695.         ADD HL,DE
  696.         RET C        ;2
  697.         INC A
  698.         ADD HL,DE
  699.         RET C        ;3
  700.         INC A
  701.         ADD HL,DE
  702.         RET C        ;4
  703.         INC A
  704.        INC B ;1+
  705.         INC E
  706.         ADD HL,DE
  707.         RET C        ;5..6
  708.         INC A
  709.         ADD HL,DE
  710.         RET C        ;7..8
  711.         INC A
  712.        INC B ;2+
  713.         LD E,4
  714.         ADD HL,DE
  715.         RET C        ;9..C
  716.         INC A
  717.         ADD HL,DE
  718.         RET C        ;D..10
  719.         INC A
  720.        INC B ;3+
  721.         LD E,8
  722.         ADD HL,DE
  723.         RET C        ;11..18
  724.         INC A
  725.         ADD HL,DE
  726.         RET C        ;19..20
  727.         INC A
  728.        INC B ;4+
  729.         LD E,#10
  730.         ADD HL,DE
  731.         RET C        ;21..30
  732.         INC A
  733.         ADD HL,DE
  734.         RET C        ;31..40
  735.         INC A
  736.        INC B ;5+
  737.         LD E,#20
  738.         ADD HL,DE
  739.         RET C        ;41..60
  740.         INC A
  741.         ADD HL,DE
  742.         RET C        ;61..80
  743.         INC A
  744.        INC B ;6+
  745.         LD E,#40
  746.         ADD HL,DE
  747.         RET C        ;81..C0
  748.         INC A
  749.         ADD HL,DE
  750.         RET C        ;C1..101
  751.         INC A
  752.        INC B ;7+
  753.         LD E,#80
  754.         ADD HL,DE
  755.         RET C        ;101..180
  756.         INC A
  757.         ADD HL,DE
  758.         RET C        ;181..200
  759.         INC A
  760.        INC B ;8+
  761.         INC H
  762.         RET Z        ;201..300
  763.         INC A
  764.         INC H
  765.         RET Z        ;301..400
  766.         INC A
  767.        INC B ;9+
  768.         LD DE,#200
  769.         ADD HL,DE
  770.         RET C        ;401..600
  771.         INC A
  772.         ADD HL,DE
  773.         RET C        ;601..800
  774.         INC A
  775.        INC B ;10+
  776.         SLA D
  777.         ADD HL,DE
  778.         RET C        ;801..C00
  779.         INC A
  780.         ADD HL,DE
  781.         RET C        ;C01..1000
  782.         INC A
  783.        INC B ;11+
  784.         SLA D
  785.         ADD HL,DE
  786.         RET C        ;1001..1800
  787.         INC A
  788.         ADD HL,DE
  789.         RET C        ;1801..2000
  790.         INC A
  791.        INC B ;12+
  792.         SLA D
  793.         ADD HL,DE
  794.         RET C        ;2001..3000
  795.         INC A
  796.         ADD HL,DE
  797.         RET C        ;3001..4000
  798.         INC A
  799.        INC B ;13+
  800.         SLA D
  801.         ADD HL,DE
  802.         RET C        ;4001..6000
  803.         INC A
  804.         ADD HL,DE
  805.         RET          ;6001..8000
  806.  
  807. POISKm0
  808.         ;jr $
  809.         LD A,L
  810.         ld (MAXPOSL),A
  811.         XOR A
  812.         ld (KOLODIN),A
  813. ;DE=TEKADR
  814. POISK   ;ld (POISKSP),SP ;not fix
  815.        IF sureLE
  816.         EXX
  817.         ;OUT (C),L
  818.         call OUTpgTEXT
  819.         EXX
  820.        ENDIF
  821.          LD A,(dicszM)
  822.          OR A
  823.          JR Z,$+6
  824.        LD A,(POISKIP)
  825.        OR A
  826.        jp Z,LZnfnd ;вместо dicsz=0k POISKIP=0
  827.         ld A,(MAXPOSL)
  828.        IF fastCPIQ
  829.         DEC A
  830.         ld (MAXPOSLm1),A
  831.         INC A
  832.        ENDIF
  833.         ADD A,-3
  834.        jp NC,LZnfnd
  835.         ld (MAXPOSLm3),A
  836.        ld HL,KOLODIN
  837.        SBC A,(HL)
  838.        jp C,LZnfnd
  839.         LD BC,(PUTBITB) ;#C000..>0
  840.         LD A,B
  841.        ADD A,pak9/256 ;#7C00
  842.        LD B,A
  843. dicszM=$+2
  844.        LD HL,1-#8000 ;вместо 0 POISKIP=0
  845.        ADD HL,DE ;арифметич.нач.окна
  846.        ;может получиться <0
  847.        JR NC,pushbc
  848.         PUSH HL
  849.         SBC HL,BC
  850.         JR NC,$+4 ;HL>BC,берем HL
  851.          POP HL   ;HL<=BC,берем BC
  852. pushbc   PUSH BC
  853.         POP IX ;реальное нач.окна
  854.         LD A,(DE)
  855.        RLCA
  856.         LD C,A
  857.         INC DE
  858.         LD A,(DE)
  859.         ld (LZbyte2),A
  860.        RRCA
  861.        XOR C
  862.       IF k3b
  863.       EX DE,HL
  864.       INC HL
  865.       XOR (HL)
  866.       DEC HL
  867.       EX DE,HL
  868.       ENDIF
  869.        LD L,A
  870.        XOR C
  871.       IF k256
  872.       OR #E0
  873.       ELSE
  874.        AND keymask
  875.        OR keys/512
  876.       ENDIF
  877.         LD H,A
  878.         ADD HL,HL
  879.        LD (SPoldky),HL
  880.         ;LD SP,HL
  881.       IF k256
  882.       EXX
  883.       LD A,k256
  884.       ;OUT (C),A
  885.       call OUTME
  886.       EXX
  887.       ENDIF
  888.         ;POP HL
  889.         ;PUSH DE
  890.         push de
  891.         ld a,(hl)
  892.         ld (hl),e
  893.         ld e,a
  894.         inc l
  895.         ld a,(hl)
  896.         ld (hl),d ;обновили голову цепочки
  897.         ld d,a
  898.         ex de,hl
  899.         pop de    
  900. ;hl=старое начало цепочки, прочитанное из хэш-таблицы
  901. ;de=адрес 3-го символа
  902.         ld (LZoldky),HL
  903.         EX DE,HL
  904.         ld (LZnxadr),HL
  905.         INC HL
  906.         ld (LZadol3),HL
  907.         EX DE,HL
  908.         jp LZGO
  909.  
  910. ;cache начался
  911.        IF fastCPIQ
  912. LZCPImx
  913. MAXPOSL=$+1
  914.         LD A,0
  915.         ld (KOLODIN),A
  916.         OR A
  917.         SBC HL,DE
  918.         LD (SMESH),HL ;отрицательное смещение
  919.        jp LZnfnd;SM
  920.        ENDIF
  921. LZCPIQ
  922.         DEC HL
  923.        IF fastCPIQ==0
  924.         INC C
  925. LZCPImx
  926. MAXPOSL=$+1
  927.         LD A,0
  928.        ELSE
  929. MAXPOSLm1=$+1
  930.         LD A,0
  931.        ENDIF
  932.         SUB C ;NC
  933.         SBC HL,DE
  934. LZn3
  935.         ld (KOLODIN),A
  936.         LD (SMESH),HL ;отрицательное смещение
  937.        IF fast0s
  938. ;todo:
  939. ;если oldSMESH было SMESH+1, то мы имеем дело с повт.байтами
  940. ;считаем их число от курсора =L
  941. ;двигаем SMESH назад, инкрементируя KOLODIN, until:
  942.                                      ;байт изменился | KOLODIN>L
  943.        CP 64;fast0s
  944.        JR NC,LZnfnd
  945.    ;  JC LZnf0s ;глюк на tapecool.W после 8 нулей
  946.    ;  INC A
  947.    ;  j Z,LZnfnd
  948.    ;  LD A,H
  949.    ;  AND L
  950.    ;  INC A
  951.    ;j Z,LZnfnd ;хотя может быть ссылка лучше, включающая
  952.                ;следующие неповт.байты
  953.      ;JNZ LZnf0s
  954.      ;LD HL,(LZadr3)
  955.      ;LD A,(HL)
  956.      ;DEC HL,HL,HL ;-1-й байт
  957.      ;CP (HL)
  958.      ;JNZ LZnf0s
  959.      ;DEC HL
  960.      ;CP (HL)
  961.      ;JZ $-2
  962.      ;INC HL
  963.      ;INC HL ;2-й байт
  964.      ;LD DE,(LZadol3)
  965.      ;JR LZokn77
  966. LZnf0s
  967.        ELSE
  968.        INC A
  969.        JR Z,LZnfnd
  970.        ENDIF
  971. LZadol3=$+1
  972. LZcont  LD DE,0 ;адрес курсорного 3 байта
  973. LZadr3=$+1
  974.         LD HL,0 ;адрес 3-го байта
  975. LZbad3  DEC HL
  976. LZbad2  ADD HL,HL ;по 2 байта на символ
  977.        LD A,H
  978.        RLCA
  979.        RLCA
  980.         SET 7,H
  981.         set 6,H
  982.         EXX
  983.        AND 3;D
  984.       ;IF k256
  985.       ;ADD A,E
  986.       ;ELSE
  987.       ; CP 2
  988.       ; SBC A,E
  989.       ;ENDIF
  990.         ;OUT (C),A
  991.         call OUTME
  992.         EXX
  993.         ;LD SP,HL
  994.         ;POP HL
  995.         ld a,(hl)
  996.         inc l
  997.         ld h,(hl)
  998.         ld l,a
  999. LZGO
  1000. ;hl=старое начало цепочки, прочитанное из хэш-таблицы
  1001. ;de=адрес 3-го символа
  1002.         EXX
  1003.         ;OUT (C),L
  1004.         call OUTpgTEXT
  1005.         EXX
  1006. LZokn77 LD A,HX
  1007.         CP H
  1008.         JR NC,LZokno7 ;м.б.кончилось окно?
  1009. LZbyte2=$+1
  1010. LZwokne LD A,0  ;проверка 2-го байта, т.к.
  1011.         CP (HL) ;он был маскирован в ключе
  1012.        jp NZ,LZbad2
  1013.         INC HL
  1014.      ;сравниваем 3-й байт
  1015.         LD A,(DE)
  1016.         CP (HL)
  1017.        jp NZ,LZbad3
  1018.         ld (LZadr3),HL
  1019.         INC HL
  1020.         inc DE
  1021. MAXPOSLm3=$+1
  1022.         LD BC,0
  1023. KOLODIN=$+1
  1024.        LD A,0
  1025.        SUB 3
  1026.        JR NC,LZPREC
  1027. LZCPI_  LD A,(DE)
  1028.         CPI
  1029.         JR NZ,LZCPIQ
  1030. LZCPIi  INC DE
  1031.         jp PE,LZCPI_
  1032.        jp LZCPImx
  1033.  
  1034. ;KOLODIN>=4
  1035. LZPREC
  1036. ;bc=MAXPOSLm3
  1037.          CP C
  1038.          JR NC,LZnfnd ;снарк2
  1039.          ;KOLODIN+1<=MAXPOSL
  1040.         INC A ;>=1
  1041.         LD B,A ;KOLODIN-2 (3 уже сравнили)
  1042. LZPRE0 LD A,(DE)
  1043.        CPI
  1044.        JR NZ,LZcont
  1045.        INC DE
  1046.        DJNZ LZPRE0
  1047. ;сравнили KOLODIN+1 байт ок
  1048.          INC C
  1049.          DEC C
  1050.           jp Z,LZCPImx ;снарк2
  1051.         LD A,(DE)
  1052.         CPI
  1053.        JR Z,LZCPIi
  1054. ;+2-й не совпал - len=KOLODIN+1
  1055.        SCF
  1056.         SBC HL,DE
  1057.         LD A,(SMESH+1)
  1058.         INC A
  1059.        JR Z,LZmF
  1060.         INC A
  1061.        ;IFN cache
  1062.        ; LD A,(SET2)
  1063.        ;ENDIF
  1064.        JR Z,LZmE
  1065. LZmEQ
  1066.         ld A,(KOLODIN)
  1067.         INC A
  1068.        jp LZn3
  1069.  
  1070. LZokno7 JR NZ,LZnfnd
  1071.         LD A,L
  1072.         CP LX
  1073.         JR NC,LZwokne
  1074. LZnfnd
  1075.          ld A,(KOLODIN)
  1076.          CP 3
  1077.          JR NZ,LZnfnn3
  1078.         LD HL,(SMESH)
  1079.         DEC HL
  1080.         LD A,H
  1081.         CP #E0 ;#E000 уже нельзя
  1082.         JR NC,LZnfnn3
  1083.          XOR A
  1084.          ld (KOLODIN),A
  1085. LZnfnn3
  1086. LZnxadr=$+1
  1087.         LD HL,0
  1088. LZoldky=$+1
  1089.         LD DE,0
  1090.         ADD HL,HL ;по 2 байта на символ
  1091.        LD A,H
  1092.        RLCA
  1093.        RLCA
  1094.         SET 7,H
  1095.         set 6,H
  1096.         EXX
  1097.        AND 3;D
  1098.       ;IF k256
  1099.       ;ADD A,E
  1100.       ;ELSE
  1101.       ; CP 2
  1102.       ; SBC A,E
  1103.       ;ENDIF
  1104.         ;OUT (C),A
  1105.         call OUTME
  1106.         EXX
  1107.         ;LD SP,HL
  1108.         ;POP BC
  1109.         ;PUSH DE
  1110.         ld c,(hl)
  1111.         ld (hl),e
  1112.         inc l
  1113.         ld b,(hl)
  1114.         ld (hl),d ;обновили голову цепочки
  1115.          dec l
  1116. ;hl=не нужно? TODO
  1117. ;bc=старое начало цепочки, прочитанное из хэш-таблицы
  1118.  
  1119.        IF sureLE==0
  1120.         EXX
  1121.         ;OUT (C),L
  1122.         call OUTpgTEXT
  1123.         EXX
  1124.        ENDIF
  1125. ;POISKSP=$+1
  1126. ;        LD SP,#F0F4
  1127.         RET
  1128.  
  1129. LZmF    LD A,H
  1130. SET1=$+1
  1131.         CP #F4
  1132. LZmC    JR NC,LZmEQ
  1133.         jp LZcont
  1134. LZmE    LD A,H
  1135. SET2=$+1
  1136.         CP #F0
  1137.         JR LZmC
  1138.  
  1139. FiND2
  1140.          ;ret ;TODO сделать потом эти 2-символьные ссылки
  1141.         LD A,(POISKIP)
  1142.         OR A
  1143.         RET Z
  1144.         ;LD A,(extext)
  1145.         ;CP "a" ;"rar" extension
  1146.         ;RET NZ
  1147.         ld A,(MAXPOSL)
  1148.         CP 2
  1149.         RET C
  1150.         LD HL,(TEKADR)
  1151.         LD DE,(ADRfrom)
  1152.        SBC HL,DE
  1153.        RET Z
  1154.        LD B,L
  1155.        XOR A
  1156.        CP H
  1157.        ADD HL,DE
  1158.        JR Z,$+3
  1159.        LD B,A;-1
  1160.         LD E,(HL)
  1161.         INC HL
  1162.         LD D,(HL)
  1163.         DEC HL
  1164.         LD A,D
  1165. FiND20  CP (HL)
  1166.         DEC HL
  1167.         JR NZ,FiND20N ;RET NZ
  1168.         LD A,(HL)
  1169.         CP E
  1170.         JR Z,FiND20Y
  1171.         LD A,D
  1172. FiND20N DJNZ FiND20
  1173.         RET
  1174. FiND20Y
  1175.         LD A,2
  1176.         ld (KOLODIN),A
  1177.         LD DE,(TEKADR)
  1178.         SBC HL,DE
  1179.         LD (SMESH),HL
  1180.         RET
  1181.