?login_element?

Subversion Repositories NedoOS

Rev

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

  1. maxmasksz=namln;20;24
  2.        IF masks
  3. loopM
  4.         LD HL,CURMASK
  5. MASK0   CALL IYKEY
  6.         CP key_enter
  7.         JR Z,MASKe
  8.          cp 0x20
  9.         JR C,MASK0 ;прочие управляющие кнопки не нужны
  10.         LD (HL),A
  11.         INC HL
  12.         CALL PRSYM
  13.         ;LD A,(CURX)
  14.         push hl
  15.         ld de,CURMASK
  16.         scf
  17.         sbc hl,de
  18.         ld a,l
  19.         pop hl
  20.         CP maxmasksz-1
  21.         JR C,MASK0
  22. MASKe   LD (HL),0
  23.         JP LOOP
  24.  
  25. ;можно маску типа M*.EXE
  26. CURMASK
  27.         DB "*"
  28.         DS maxmasksz-1
  29.         NOP
  30. CPMASK
  31. ;HL=filename,DE=mask
  32. ;both zeroend
  33. ;"?"=1sym,"*">=0sym
  34. ;символ после "*" не д.б внутри "*"
  35. ;Z=ok
  36.         LD HL,CURFILE
  37.         LD DE,CURMASK
  38. CPMASK0 LD A,(DE)
  39.         OR A
  40.         RET Z ;fff=fff*
  41.         INC DE
  42.         CP "?"
  43.         JR Z,CPMASKY
  44.         CP "*"
  45.         JR NZ,CPMASKN
  46.         LD A,(DE)
  47.         OR A
  48.         RET Z ;fff*
  49. CPMSKZ  LD A,(DE)
  50.         SUB (HL)
  51.         JR Z,CPMASK0
  52.         INC HL
  53.         CP (HL)
  54.         JR NZ,CPMSKZ
  55.        ;ff*d<>ff1
  56.         INC A
  57.         RET
  58. CPMASKN CP (HL)
  59.         RET NZ
  60. CPMASKY INC HL
  61.         LD A,(HL)
  62.         OR A
  63.         JR NZ,CPMASK0
  64.         RET
  65.        ENDIF
  66. ;TWICE
  67. RdTabs
  68.         LD B,2
  69.         CALL LDA18B
  70.        LD A,C
  71.         RRA
  72.       ;LD (Bit2),A ;UnpAudioBlock
  73.        JR C,dpPnKIL
  74.         LD HL,FRIY2
  75.        LD (HL),B
  76.         LD DE,FRIY2+1
  77.         LD BC,FRIY2ln-1
  78.         LDIR
  79. dpPnKIL
  80.        IF mmc
  81.       ;Bit2=$+1
  82.       ;LD A,0
  83.        RRA
  84.        JR NC,dPPn2b
  85.         IF 1==0
  86.         call RST16
  87.         DB #D,#a,"Audio blocks are not supported",0
  88.        LD A,251
  89.        LD (flgALL),A
  90.         CALL IYKEY
  91.         JP SPGO
  92.         ELSE
  93.         LD B,2
  94.         CALL LDA18B
  95.         LD A,C
  96.      ;LD HL,_7604 ;CurChannel
  97.      ;CP (HL) ;=0
  98.      ;JR NC,$+4
  99.      ;LD (HL),0
  100.        ADD A,1 ;A=1..4
  101.         LD H,A
  102.         ld L,A
  103.         JR $+5
  104.         ENDIF
  105.        ENDIF
  106. dPPn2b
  107.         LD HL,bdlens
  108. dPPtetr LD B,4
  109.         CALL LDA18B
  110.         LD (HL),C
  111.         INC L
  112.         JR NZ,dPPtetr
  113.         LD DE,19+1
  114.        INC L
  115.        inc H
  116.        ;LD HL,bdlens+19+1
  117.         LD BC,bd
  118.         ;jr $
  119.         CALL MKTREE
  120.         LD BC,298+48+28 ;tabsize
  121.         LD HL,FRIY2 ;UnpOldTable
  122. dPP0   PUSH HL
  123.        PUSH BC
  124.         LD HL,bd
  125.         CALL DEHUFF
  126.         LD A,L
  127.        POP BC
  128.        POP HL
  129.         SUB 16
  130.         JR NC,dPPbr16
  131. ;<16 delta from prev codelen tab
  132.         ADD A,(HL)
  133.         AND #F
  134.         LD (HL),A
  135.         INC HL
  136.         DEC BC
  137.         JR dPPQ
  138. dPPbr16
  139.         PUSH BC
  140.         JR NZ,dPPn16
  141. ;16=prev len copies-3
  142.         LD B,2
  143.         CALL LDA18B
  144.        DEC HL
  145.        LD A,(HL)
  146.        INC HL
  147.        LD (dPPdupV),A
  148.         JR dPPfil3
  149. ;18=zerolens-11
  150. dPPn3b
  151.         LD B,7
  152.         CALL LDA18B
  153.         LD A,11
  154.         JR dPPfil
  155. dPPn16  DEC A
  156.         JR NZ,dPPn3b
  157. ;17=zerolens-3
  158.         LD B,3
  159.         CALL LDA18B
  160. dPPfil3 LD A,3
  161. dPPfil  ADD A,C
  162.         POP BC
  163. dPPdupV=$+1
  164. dPPdup0 LD (HL),0
  165.         INC HL
  166.         DEC BC
  167.         DEC A
  168.         JR NZ,dPPdup0
  169.         LD (dPPdupV),A
  170. dPPQ    LD A,B
  171.        OR A
  172.        JP M,qqqq ;??ERROR?
  173.         OR C
  174.         JP NZ,dPP0
  175. qqqq
  176.         LD DE,299
  177.         LD HL,ldlens+299
  178.         LD BC,ld
  179.         CALL MKTREE
  180.        if retree
  181.        LD BC,ld
  182.        LD DE,reld
  183.        CALL RETREE
  184.        ENDIF
  185.       ifdef optbigBT
  186.        LD A,14
  187.        LD (obig),A
  188.       ENDIF
  189.         LD DE,49
  190.         LD HL,ddlens+49
  191.         LD BC,dd
  192.         CALL MKTREE
  193.       ifdef optbigBT
  194.        LD A,24
  195.        LD (obig),A
  196.       ENDIF
  197.         LD DE,29
  198.         LD HL,rdlens+29
  199.         LD BC,rd
  200. ;создание дерева. нули - более короткие ветки
  201. ;сначала создаются все ветки для
  202. ;символов с bitlen=1, потом 2 и т.д. до 15
  203. ;by Roman Petrov
  204. ;FIXED:не строил пустое дерево
  205. MKTREE
  206.         PUSH BC
  207.         EXX
  208.         POP DE ;начало буфера
  209.         LD H,D
  210.         LD L,E
  211.         XOR A ;=0 признак выхода
  212.         PUSH AF
  213.         INC A ;=1
  214.         PUSH HL
  215.         PUSH AF
  216.         LD C,A
  217. MKTREE0 EXX      ;HL=кон.bitlens+1
  218.         LD B,D
  219.         LD C,E
  220.        ;ADD HL,BC;указ.на последний bitlen
  221.       ;OR A
  222.        SBC HL,BC;указ.на 1й bitlen
  223.         EXX
  224. MKTREE1 LD B,A
  225.         LD A,C
  226.         EXX
  227.        ;CPDR ;BC=число листьев+1
  228.        CPIR
  229.         LD A,B
  230.         OR C
  231.         EXX
  232.         LD A,B
  233.         JR NZ,MKTREEY;найден символ с таким bitlen
  234.         INC C ;не найден такой символ
  235.        JR NZ,MKTREE0
  236.        JR MTREEbug
  237. MKTREE_DEEPER
  238.         INC DE ;новое место
  239.         INC DE ;для
  240.         INC DE ;новых
  241.         INC DE ;узлов
  242.         LD (HL),E
  243.         INC HL
  244.         LD (HL),D ;указатель для "0"
  245.         LD H,D
  246.         LD L,E ;адрес для "код+0"
  247.         INC A  ;длина этого кода
  248.         PUSH HL ;заносим это
  249.         PUSH AF ;в стек
  250. MKTREEY CP C
  251.         JR NZ,MKTREE_DEEPER ;пока не углубимся до нужной длины
  252.        ;A=C
  253.         EXX
  254.         PUSH BC ;антиномер литерала+1
  255.        PUSH DE ;Q+1
  256.         EXX
  257. MTREEbug
  258.        LD (MKhl),HL
  259.        POP HL
  260.         POP BC
  261.        ;DEC BC ;номер литерала
  262.        ;LD (HL),C
  263.        ;INC HL
  264.        ;LD (HL),B ;формируем лист
  265.        SCF
  266.        SBC HL,BC
  267.       ifdef optbigBT
  268. obig   JR $+8
  269.        SLA L
  270.        sla L
  271.        LD H,bigBT/256
  272.       ENDIF
  273. MKhl=$+1
  274.        LD (0),HL
  275.         LD C,A
  276.         POP AF
  277.         RET Z ;=0 признак выхода
  278.         POP HL
  279.         INC HL
  280.         INC HL ;следующий свободный узел
  281.            ;A=его глубина
  282.            ;DE=адрес места для новых узлов
  283.         JR MKTREE1
  284.        if retree
  285. RETRp
  286.         LD A,218;JPC
  287.         LD (DE),A
  288.         INC DE
  289.        PUSH HL
  290.        PUSH DE
  291.        INC DE
  292.        inc DE
  293.        LD H,B
  294.        ld L,C
  295.        CALL RETREE ;для Ladr
  296.        POP HL
  297.        LD (HL),E ;адрес Radr
  298.        INC HL
  299.        LD (HL),D
  300.        POP HL
  301.         LD C,(HL)
  302.         INC HL
  303.         LD B,(HL)
  304. RETREE
  305.         LD H,B
  306.         ld L,C
  307.         EX DE,HL
  308.         LD (HL),135;AAA
  309.         INC HL
  310.         LD (HL),204;CZ
  311.         INC HL
  312.         LD (HL),bitik&0xff
  313.         INC HL
  314.         LD (HL),bitik/256
  315.         INC HL
  316.         EX DE,HL
  317.         LD C,(HL)
  318.         INC HL
  319.         LD B,(HL)
  320.         INC HL
  321.        IF (ld/256)&#40
  322.         BIT 6,B
  323.        ELSE
  324.        if (ld/256)&#80
  325.         BIT 7,B
  326.        else
  327.        IF (ld/256)&#20
  328.         BIT 5,B
  329.        ENDIF
  330.        endif
  331.        ENDIF
  332.         JR NZ,RETRp
  333.         EX DE,HL
  334.         LD (HL),1
  335.         INC HL
  336.         LD (HL),C
  337.         INC HL
  338.         LD (HL),B
  339.         INC HL
  340.         LD (HL),208;RNC
  341.         INC HL
  342.         EX DE,HL
  343.         LD C,(HL)
  344.         INC HL
  345.         LD B,(HL)
  346.         INC HL
  347.        IF (ld/256)&#40
  348.         BIT 6,B
  349.        ELSE
  350.        if (ld/256)&#80
  351.         BIT 7,B
  352.        else
  353.        IF (ld/256)&#20
  354.         BIT 5,B
  355.        ENDIF
  356.        endif
  357.        ENDIF
  358.         JR NZ,RETREE;для Radr
  359.         EX DE,HL
  360.         LD (HL),1
  361.         INC HL
  362.         LD (HL),C
  363.         INC HL
  364.         LD (HL),B
  365.         INC HL
  366.         LD (HL),201
  367.         INC HL
  368.         EX DE,HL
  369.         RET
  370. reldstored
  371.         LD B,8
  372.         EXA
  373.         CALL LDA18B ;B=0,C=rez
  374.         EXA
  375.         RET
  376. lnreldstored=$-reldstored
  377. bitik
  378.         ;LD A,(IX)
  379.         ;INC LX
  380.         ;CALL Z,LDAsec
  381.         rarrdbyte
  382.       ;SCF ;?
  383.         RLA
  384.         RET
  385.        ENDIF
  386. ;----------
  387. SCFEOF  SCF
  388. EOF
  389. lnLSW=$+1
  390.         LD HL,0
  391.         LD DE,(NXTPOS)
  392.        ;OR A
  393.         SBC HL,DE
  394.        PUSH HL
  395. lnHSW=$+1
  396.         LD HL,0
  397.         LD DE,(NXTPOS+2)
  398.         SBC HL,DE
  399.        POP DE
  400.         RET
  401.  
  402.        IF unexp
  403. UNEXP
  404.        LD A,H
  405.        AND L,D,E
  406.        INC A
  407.        RET Z
  408.         call RST16
  409.         DB #D,#a,"Unexpected end"
  410.         DB 13,0
  411.        ;SCF
  412.         RET
  413.        ENDIF
  414.  
  415. PREPAR
  416.         ;jr $
  417.         CALL FINDFIL
  418.         RET C
  419.         XOR A
  420.         LD L,A,H,L
  421.         LD (volPKSZ),HL
  422.         LD (volPKSZ+2),HL
  423.         LD (volUNSZ),HL
  424.         LD (volUNSZ+2),HL
  425.         LD (pieces),HL
  426.        ;LD (pieces+2),HL
  427.        LD (ERRORS),HL
  428.        CALL PRTHEE
  429.         CALL TSTOLD
  430.         JR NC,_nISN
  431.         call RST16
  432.         DB "not RAR",0
  433.         SCF
  434.         RET
  435. PRTHEE
  436.       ;XOR A
  437.        LD HL,THEEND
  438.        LD (DEPADR),HL
  439.        LD (stAD),HL
  440.        LD (stPG),A
  441.        JP OUTMEcu
  442. _nISN
  443.         LD HL,(SIZEA)
  444.         LD DE,-13
  445.         ADD HL,DE
  446.        LD DE,0
  447.        CALL SEEKpos ;TODO
  448.        ;RET C
  449.         call RST16
  450.        DB #D,#a,0
  451.         LD A,(SOLFLG)
  452.         AND A
  453.         JR Z,NOTsol
  454.         call RST16
  455.        DB "Solid ",0
  456. NOTsol
  457.         LD A,(VOLFLG)
  458.         CP 2
  459.        JR NZ,NOTvol
  460.         call RST16
  461.        DB "volume",0
  462.         JR NOTarc
  463. NOTvol  call RST16
  464.        DB "archive",0
  465. NOTarc  
  466. PRRARNAME
  467. ;out: CY=0
  468.         call RST16
  469.         db " "
  470.        ;if 1==0
  471.        DB 1
  472. curfilenameaddr=$
  473.        DW 0;TWORK
  474.        ;endif      
  475.        DB #D,#a,0
  476.         OR A
  477.         RET
  478.  
  479. FINDFIL
  480.         ld de,(curfilenameaddr)
  481.         call openstream_file
  482.         or a
  483.         jp nz,openerror
  484.  
  485.         ld a,(filehandle)
  486.         ld b,a
  487.         OS_GETFILESIZE ;dehl=filesize
  488.        LD (lnLSW),hl
  489.        ld a,e
  490.        LD (lnHSW),A
  491.        ld a,d
  492.        LD (lnHSW+1),A
  493.        
  494.         LD HL,0
  495.        LD D,h
  496.         LD E,L
  497. SEEKst
  498. ;set position in archive file to dehl
  499.         ld (CURPOS),hl
  500.         ld (CURPOS+2),de
  501.  
  502.         ;ld de,0
  503.         ;ld hl,0 ;dehl=shift
  504.         ld a,(filehandle)
  505.         ld b,a
  506.         OS_SEEKHANDLE
  507.  
  508.        ;LD A,L
  509.        ;LD ly,a;LX,A
  510.        LD IY,DISKBUF+DISKBUFsz-1 ;TODO SEEK только если куска нет в буфере
  511.         or a
  512.         ret
  513.  
  514. SEEKpos
  515. ;skip dehl bytes
  516.         ld a,h
  517.         or l
  518.         or d
  519.         or e
  520.         ret z
  521. SEEKpos0
  522.         rarrdbyte
  523.         dec hl
  524.         ld a,h
  525.         or l
  526.         jr nz,SEEKpos0
  527.         ld a,d
  528.         or e
  529.         dec de
  530.         jr nz,SEEKpos0
  531.         ret
  532.        
  533. LOADBLK
  534.         ;if 1==0
  535.         ld hl,(CURPOS)
  536.         add hl,bc
  537.         ld (CURPOS),hl
  538.         ld hl,(CURPOS+2)
  539.         jr nc,$+3
  540.         inc hl
  541.         ld (CURPOS+2),hl
  542.         ;endif        
  543. ;load bc bytes to de
  544.         PUSH BC
  545.         push DE
  546.        
  547. LOADBL0
  548.         ;LD A,(IX)
  549.         ;INC LX
  550.         ;CALL Z,LDAsec
  551.         rarrdbyte
  552.         LD (DE),A
  553.         INC DE
  554.         DEC BC
  555.         LD A,B
  556.         OR C
  557.         JR NZ,LOADBL0
  558.         POP HL
  559.         pop BC
  560.       ;OR A
  561.         RET
  562.  
  563.        IF crc
  564. UPCRC
  565.         PUSH BC
  566.        IF tcrc==0
  567.         LD C,(iy);(IX)
  568.         LD B,8
  569. crclp   LD A,E
  570.         XOR C
  571.         SRL C
  572.         srl H
  573.         RR L
  574.         rr D
  575.         rr E
  576.         RRA
  577.         JR NC,noxor
  578.         LD A,H
  579.         XOR #ED
  580.         LD H,A
  581.         LD A,L
  582.         XOR #B8
  583.         LD L,A
  584.         LD A,D
  585.         XOR #83
  586.         LD D,A
  587.         LD A,E
  588.         XOR #20
  589.         LD E,A
  590. noxor   DJNZ crclp
  591.        ELSE
  592.         LD B,H
  593.         ld C,L
  594.         LD A,E
  595.         XOR (iy);(IX)
  596.         LD L,A
  597.         LD H,TCRC/256
  598.         LD A,(HL)
  599.         XOR D
  600.         LD E,A
  601.         INC H
  602.         LD A,(HL)
  603.         XOR C
  604.         LD D,A
  605.         INC H
  606.         LD A,(HL)
  607.         XOR B
  608.         INC H
  609.         LD H,(HL)
  610.         ld L,A
  611.        ENDIF
  612.         POP BC
  613.         INC iy;IX
  614.         DEC BC
  615.         LD A,B
  616.         OR C
  617.         JR NZ,UPCRC
  618. UPPASS  RET
  619.        ENDIF
  620. DEHUFF
  621.         EXA
  622. DEHUFF0 ADD A,A
  623.         JR Z,NEWDEHF
  624.         JR NC,$+4 ;ноль
  625. DEHFC   INC L  ;единица
  626.         INC L;HL
  627. DEHFNC  LD C,(HL)
  628.         INC L
  629.         LD H,(HL)
  630.         LD L,C
  631.        IF (rd/256)&#40
  632.         BIT 6,H
  633.        ELSE
  634.        if (rd/256)&#80
  635.         BIT 7,H
  636.        else
  637.        if (rd/256)&#20
  638.         BIT 5,H
  639.        endif
  640.        endif
  641.        ENDIF
  642.         JP NZ,DEHUFF0
  643.         EXA
  644.         RET
  645.  
  646. NEWDEHF
  647. ;?/frame
  648.         ;LD A,(IX)
  649.         ;INC LX
  650.         ;CALL Z,LDAsec
  651.         rarrdbyte
  652.        SCF
  653.         RLA
  654.         JR C,DEHFC
  655.         JP DEHFNC
  656. LDAldb0
  657. ;3t/frame
  658.         ;LD A,(IX)
  659.         ;INC LX
  660.         ;CALL Z,LDAsec
  661.         rarrdbyte
  662.        SCF
  663.         RLA
  664.         JP LDA0C
  665. LDAldb1
  666. ;4t/frame
  667.         ;LD A,(IX)
  668.         ;INC LX
  669.         ;CALL Z,LDAsec
  670.         rarrdbyte
  671.        SCF
  672.         RLA
  673.         JP LDA1C
  674. LDAldb2
  675. ;?/frame
  676.         ;LD A,(IX)
  677.         ;INC LX
  678.         ;CALL Z,LDAsec
  679.         rarrdbyte
  680.        SCF
  681.         RLA
  682.         JP LDA2C
  683. ;4 times
  684. LDA
  685.         CP 9
  686.         JR NC,lDA915
  687. ;3 times
  688. LDA18   LD B,A
  689. LDA18B
  690.       LD C,0
  691.         EXA
  692. LDA0    ADD A,A
  693.         JR Z,LDAldb0
  694. LDA0C   RL C
  695.         DJNZ LDA0
  696.         EXA
  697.         RET
  698. lDA915  SUB 8
  699. LDAB
  700.         LD B,A
  701.       LD C,0
  702.         EXA
  703. LDA1    ADD A,A
  704.         JR Z,LDAldb1
  705. LDA1C   RL C
  706.         DJNZ LDA1
  707.         LD B,C
  708.         LD C,1
  709. LDA2    ADD A,A
  710.         JR Z,LDAldb2
  711. LDA2C   RL C
  712.         JP NC,LDA2
  713.         EXA
  714. OLDdepk RET
  715.  
  716. restore
  717. ;чтение сектора destination file: restoreLAST (??? TODO) в stBUF
  718.         PUSH DE
  719. ;resec=$+1
  720. ;       LD HL,0
  721. ;        PUSH HL
  722. restoreLAST=$+1
  723.         LD DE,0
  724. ;а был ли глюк? ничего не понимаю
  725.         LD (restoreLAST),HL
  726.        EX DE,HL
  727.         XOR A
  728.         SBC HL,DE
  729.        JR Z,restQ ;SAME SEC
  730.        ;IF border
  731.        ;LD A,2
  732.        ;OUT (-2),A
  733.        ;ENDIF
  734.         ;LD HL,stBUF
  735.         PUSH BC
  736.         push ix
  737.         push iy
  738.         ;LD BC,#105
  739.         ;CALL DOD
  740.         ld de,stBUF
  741.         ld hl,0x100
  742.         ld a,(savefilehandle)
  743.         ld b,a
  744.         OS_READHANDLE
  745.         pop iy
  746.         pop ix
  747.         POP BC
  748.        ;IF border
  749.        ;XOR A
  750.        ;OUT (-2),A
  751.        ;ENDIF
  752.       IF frmcnt
  753.       LD HL,(swaps)
  754.       INC HL
  755.       LD (swaps),HL
  756.       ENDIF
  757. restQ
  758.        if 1==0
  759.         POP HL
  760.         LD DE,stBUF
  761.         INC L
  762.         BIT 4,L
  763.         JR Z,$+4
  764.         INC H
  765.         LD L,E
  766.        LD A,H
  767.        SUB 160
  768.        JR C,$+3
  769.        LD H,A
  770.         LD (resec),HL
  771.        EX DE,HL ;??? TODO
  772.        endif
  773.  
  774.         POP DE
  775.         RET
  776.  
  777. GETPOSp
  778.         XOR A
  779.        LD E,L,L,H
  780.         LD H,A,D,A
  781.         ADD HL,HL,HL,HL,HL,HL
  782.         ADD HL,HL,HL,DE
  783.         RET
  784. ;------------------
  785.  
  786. PRHLDE
  787.         CALL PRNUM
  788.         EX DE,HL
  789.         CALL PRNUM
  790.         EX DE,HL
  791.         RET
  792. PDECPP
  793.         EXA
  794.         PUSH HL
  795.         EXX
  796.         POP HL
  797.         LD A,H
  798.         OR L
  799.         EXX
  800.         OR E,D
  801.         EX DE,HL
  802.         LD DE,DECBUF-1
  803.         JR NZ,pRDN0
  804.         LD A,"0"
  805.         LD (DE),A
  806.         DEC DE
  807. pRDN0   EXA
  808.         PUSH AF
  809. prd0
  810.         EXA
  811.         LD BC,#210A
  812.         XOR A
  813. prdDIV  RLA
  814.         SUB C
  815.         JR NC,$+3
  816.         ADD A,C
  817.         CCF
  818.         ADC HL,HL
  819.         EXX
  820.         ADC HL,HL
  821.         EXX
  822.         DJNZ prdDIV
  823.         LD C,A
  824.         OR H,L
  825.         EXX
  826.         OR H,L
  827.         EXX
  828.         LD A,"0"
  829.         JR NZ,$+4
  830.         LD A,32
  831. DECSPACE=$-1
  832.         ADD A,C
  833.         LD (DE),A
  834.         DEC DE
  835.         EXA
  836.         DEC A
  837.         JR NZ,prd0
  838.         POP AF
  839.         LD E,A
  840.        XOR A
  841.        LD D,A
  842.         LD HL,DECBUF
  843.         SBC HL,DE
  844.         RET
  845. PRDEC
  846.         EX DE,HL
  847.         LD HL,0
  848. PRDECHLDE
  849.        CALL PDECPP
  850. ;1,addr=TOKEN
  851. PRRST   LD A,(HL)
  852.         INC HL
  853.         DEC A
  854.         JR NZ,rstNat
  855.         LD E,(HL)
  856.         INC HL
  857.         LD D,(HL)
  858.         INC HL
  859.         PUSH HL
  860.         EX DE,HL
  861.         CALL PRRST
  862.         POP HL
  863.         JR PRRST
  864. rstNat  INC A
  865.         RET Z
  866.         CALL PRSYM
  867.        JR PRRST
  868.  
  869. RST16
  870.         pop hl
  871.         push af
  872.         call PRRST
  873.         pop af
  874.         jp (hl)
  875.  
  876. PRCUR
  877.         ld e,CURSORCOLOR
  878.         jr RECUR_go
  879. RECUR
  880.         ld e,COLOR
  881. RECUR_go
  882. ;        ld hl,0
  883. ;CURX=$-2
  884. ;CURY=$-1
  885. PRCURHL
  886.         push iy
  887.         push de
  888.         ex de,hl
  889.         ;OS_SETXY
  890.         pop de
  891.         OS_PRATTR
  892.         pop iy
  893.         ret
  894.  
  895. IYKEY
  896.         ;XOR A
  897.         ;LD (SCROLLINES),A
  898.        ;SCF ;флаг был нужен только в одном месте
  899. flgALL  EI ;/ret
  900. SUREKEY PUSH IX,HL,DE,BC
  901.        PUSH IY
  902.         CALL PRCUR
  903.         YIELDGETKEYLOOP
  904.         push af
  905.         CALL RECUR
  906.         pop af
  907.        POP IY
  908.         POP BC,DE,HL,IX
  909.         RET
  910.  
  911. PRNUM  
  912.         LD A,H
  913.         CALL PRHEX
  914.         LD A,L
  915. PRHEX  
  916.         PUSH HL
  917.         LD HL,HEXBUF
  918.         LD (HL),A
  919.         CALL HEXDIG
  920.         call HEXDIG
  921.         POP HL
  922.         RET
  923. HEXDIG  
  924.         XOR A
  925.         RLD
  926.         CP 10
  927.         CCF
  928.         ADC A,"0"
  929.         DAA
  930. PRSYM  
  931.         push AF
  932.         push BC
  933.         push DE
  934.         push HL
  935.         PUSH IX
  936.         push iy
  937.         PRCHAR;CALL PR64
  938.         pop iy
  939.         pop IX
  940.         pop HL
  941.         pop DE
  942.         pop BC
  943.         POP AF
  944.         RET
  945.  
  946. ;HL'HL/DE'DE*100%
  947. PERCENT
  948.         EXX
  949.          LD A,H
  950.          OR L
  951.         EXX
  952.         JR NZ,perN0 ;>ffff
  953.         LD A,H,H,L
  954.         EXX
  955.          LD L,A
  956.         EXX
  957.         LD A,D,D,E
  958.         EXX
  959.          LD E,A
  960.         EXX
  961. perN0  LD BC,#2164
  962.        XOR A
  963. perDIV RLA
  964.        SUB C
  965.        JR NC,$+3
  966.        ADD A,C
  967.        CCF
  968.        ADC HL,HL
  969.        EXX
  970.         ADC HL,HL
  971.        EXX
  972.        DJNZ perDIV
  973.         EX DE,HL
  974.        LD A,D
  975.        OR E
  976.         EXX
  977.         EX DE,HL
  978.        OR D,E
  979.         EXX
  980.        RET Z
  981.         XOR A
  982. perSUB  SBC HL,DE
  983.         EXX
  984.          SBC HL,DE
  985.         EXX
  986.         INC A
  987.         JR NC,perSUB
  988.         DEC A
  989.         CP 101
  990.         RET C
  991.         LD A,100
  992.         RET
  993.  
  994. TSTOLD
  995.         XOR A
  996.        LD (VOLFLG),A
  997.        LD (SOLFLG),A
  998.        LD (TSTARES),A
  999.         LD DE,ARCBEG
  1000.         LD BC,7
  1001.         CALL LOADBLK ;load bc bytes to de
  1002.         RET C
  1003.        ;LD HL,ARCBEG
  1004.         LD A,"R"
  1005.         CPI
  1006.         JR NZ,TSTRARH
  1007.         LD A,#45
  1008.         CPI
  1009.         JR NZ,TSTRARH
  1010.         LD A,#7E
  1011.         CPI
  1012.         JR NZ,TSTRARH
  1013.         LD A,#5E
  1014.         CP (HL)
  1015.         JR NZ,TSTRARH
  1016.         call RST16
  1017.         DB "old RAR"
  1018.        IF opt==0
  1019.         DB " format detected"
  1020.        ENDIF
  1021.         DB #D,#a,0
  1022.         LD A,1
  1023.         LD (TSTARES),A
  1024.         LD HL,0
  1025.        LD D,H
  1026.        ld E,L
  1027.        CALL SEEKst
  1028.        ;RET C
  1029.         SCF
  1030.         RET
  1031. TSTRARH
  1032.         LD HL,ARCBEG
  1033.         LD A,"R"
  1034.        SCF
  1035.         CPI
  1036.        RET NZ
  1037.         LD A,"a"
  1038.         CPI
  1039.        RET NZ
  1040.         LD A,"r"
  1041.         CPI
  1042.        RET NZ
  1043.         LD A,"!"
  1044.         CPI
  1045.        RET NZ
  1046.         LD A,#1A
  1047.         CPI
  1048.        RET NZ
  1049.         LD A,7
  1050.         SUB (HL)
  1051.         INC HL
  1052.         OR (HL)
  1053.        SCF
  1054.        RET NZ
  1055.         LD A,2
  1056.         LD (TSTARES),A
  1057.         LD DE,CRCA
  1058.         LD BC,13
  1059.         CALL upcrc;archead
  1060.         RET C
  1061.         LD A,(FLAGA)
  1062.         AND 1
  1063.        INC A
  1064.         LD (VOLFLG),A
  1065.        IF crc
  1066.         LD HL,-1
  1067.         LD DE,(CRCArea)
  1068.         AND A
  1069.         SBC HL,DE
  1070.         LD DE,(CRCA)
  1071.         SBC HL,DE
  1072.         JR Z,_9436
  1073.         call RST16
  1074.         DB "Archive header broken",#D,#a,0
  1075.         SCF
  1076.         RET
  1077. _9436
  1078.        ENDIF
  1079.         LD A,(FLAGA)
  1080.         AND 8
  1081.        RRCA
  1082.        RRCA
  1083.        RRCA
  1084.         LD (SOLFLG),A
  1085.        ;AND A
  1086.         RET
  1087.  
  1088. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1089. ;TWICE
  1090. ;CURPOS used only here
  1091. SCAN
  1092. ;scan archive for block type=hl
  1093.         LD (EXPTYP),HL
  1094.        
  1095.         if 1==0
  1096. SCAN0
  1097.        LD DE,CRCF
  1098.        LD BC,7
  1099.        call upcrc ;read 7 bytes
  1100.        RET C
  1101.        ;LD (CRCLO),HL
  1102.         LD DE,(SIZEF) ;from file header ;head size
  1103.        
  1104.         LD HL,7
  1105.        ;OR A
  1106.         SBC HL,DE
  1107.        CCF
  1108.         RET C ;<=7
  1109.  
  1110.        push de
  1111.        ld de,CRCF+7
  1112.        ld bc,32-7
  1113.        call addcrc ;read 32-7 bytes
  1114.        pop de
  1115.        ret c
  1116.  
  1117.         ld hl,0
  1118.  
  1119.       LD A,(FLAGF+1)
  1120.         RLA
  1121.         JR NC,nADD
  1122. ;Поле ADD_SIZE присутствует, только если (HEAD_FLAGS & 0x8000) != 0
  1123.         LD HL,(ADDSZF)
  1124.         ADD HL,DE
  1125.         LD de,(ADDSZF+2)
  1126.         jr nc,$+3
  1127.         inc de
  1128. nADD
  1129. ;dehl=add to curpos before TSTPP
  1130.  
  1131.         push hl
  1132.         LD HL,EXPTYP
  1133.         LD A,(TYPEF)
  1134.         CP (HL)
  1135.         pop hl
  1136.         JR Z,SCANREAD
  1137. SCANSKIP
  1138. ;dehl=add to curpos before TSTPP
  1139.         ld bc,32
  1140.         or a
  1141.         sbc hl,bc
  1142.         jr nc,$+3
  1143.         dec de
  1144.  
  1145.        CALL SEEKpos ;skip dehl bytes
  1146.         jr SCAN0
  1147.  
  1148.         else
  1149.        
  1150. SCAN0
  1151.         if 1==0
  1152.         LD HL,(DESCRIP+14)
  1153.         CALL GETPOSp
  1154.         PUSH HL
  1155.         LD HL,(TRSEC)
  1156.         CALL GETPOSp
  1157.         POP DE
  1158.        ;XOR A
  1159.         SBC HL,DE
  1160. ;TODO hly=current position in file
  1161.         LD E,ly;LX
  1162.         LD D,L,L,H
  1163.         LD H,A ;DEHL наоборот
  1164.         LD (CURPOS),DE
  1165.         LD (CURPOS+2),HL
  1166.         endif
  1167.  
  1168.        LD DE,CRCF
  1169.        LD BC,7
  1170.        ;jr $
  1171.        call upcrc ;read 7 bytes
  1172.        RET C
  1173.        ;LD (CRCLO),HL
  1174.         LD DE,(SIZEF)
  1175.         LD HL,7
  1176.        ;OR A
  1177.         SBC HL,DE
  1178.        CCF
  1179.         RET C ;<=7
  1180.        push de
  1181.        ld de,CRCF+7
  1182.        ld bc,32-7
  1183.        call addcrc ;read 32-7 bytes ;TODO fix CRC
  1184.        pop de
  1185.        ret c
  1186. ;было: CURPOS=позиция начала заголовка
  1187. ;теперь: CURPOS=позиция начала заголовка + 32
  1188.         LD HL,(CURPOS)
  1189.        ;LD DE,(SIZEF)
  1190.         ADD HL,DE
  1191.        EX DE,HL
  1192.         LD HL,(CURPOS+2)
  1193.         JR NC,$+3
  1194.         INC HL
  1195.       ;JR Z,nADD ;BLOCK #7B
  1196.         LD A,(FLAGF+1)
  1197.         RLA
  1198.         JR NC,nADD
  1199.        PUSH HL
  1200.         LD HL,(ADDSZF)
  1201.         ADD HL,DE
  1202.        EX DE,HL
  1203.        POP BC
  1204.         LD HL,(ADDSZF+2)
  1205.         ADC HL,BC
  1206. nADD
  1207.         ex de,hl
  1208.          ld bc,32
  1209.          or a
  1210.          sbc hl,bc
  1211.          jr nc,$+3
  1212.          dec de
  1213.         LD (NXTPOS),hl
  1214.         LD (NXTPOS+2),de
  1215.       CALL EOF
  1216.       RET C
  1217. _nUNE
  1218.         LD HL,EXPTYP
  1219.         LD A,(TYPEF)
  1220.         CP (HL)
  1221.         JR Z,SCANREAD
  1222. SCANSKIP
  1223.         LD HL,(NXTPOS)
  1224.        LD DE,(NXTPOS+2)
  1225.        CALL SEEKst
  1226.         JP SCAN0
  1227.       endif
  1228.  
  1229. SCANREAD
  1230. ;выход из scan
  1231.         LD HL,(NAMSIZE)
  1232.         LD DE,namln-1
  1233.         AND A
  1234.         SBC HL,DE
  1235.         ADD HL,DE
  1236.         JR C,$+3
  1237.         EX DE,HL
  1238.        ;LD (NAMSIZE),HL
  1239.         LD DE,CURFILE
  1240.         LD B,H
  1241.         ld C,L ;длина имени файла
  1242.         CALL LOADBLK ;load bc bytes to de
  1243.         LD (DE),A;0
  1244.       IF crc==0
  1245.        OR A
  1246.        RET
  1247.       ELSE
  1248.        ;LD A,(TSTARES)
  1249.        ;CP 2 ;?
  1250.        ;JR NZ,nBROKEN
  1251.        PUSH HL
  1252.         LD HL,(CRCArea+2)
  1253.         LD DE,(CRCArea)
  1254.         ;LD BC,(NAMSIZE)
  1255.        EX (SP),iy;IX
  1256.         CALL UPCRC ;считаем CRC iy=CURFILE
  1257.        POP iy;IX
  1258.         LD HL,(CRCF)
  1259.         SCF
  1260.         ADC HL,DE
  1261.        CCF
  1262.        RET Z ;NC
  1263.         call RST16
  1264.         DB #D,#a,1
  1265.         DW CURFILE
  1266.         DB " bad header",#D,#a,0
  1267.         SCF
  1268.         RET
  1269.       ENDIF
  1270.      
  1271.      
  1272.  
  1273. ;CY=error
  1274. upcrc
  1275. ;de=addr, bc=size
  1276.       ;LD A,(TSTARES)
  1277.       ;DEC A
  1278.       ;SCF ;oldRAR
  1279.       ;RET Z
  1280.       IF crc==0
  1281. addcrc
  1282.        JP LOADBLK ;load bc bytes to de
  1283.       ELSE
  1284.         CALL LOADBLK ;load bc bytes to de
  1285.         RET C
  1286.         INC HL
  1287.         inc HL
  1288.        PUSH HL
  1289.         DEC C
  1290.         dec C ;2 байта в начале блока не учитываем в CRC
  1291.         LD HL,-1
  1292.         ld D,H
  1293.         ld E,L
  1294. addcrcq
  1295.        EX (SP),iy;IX
  1296.         CALL UPCRC ;считаем CRC iy=CRCF/CRCA
  1297.        POP iy;IX
  1298.         LD (CRCArea),DE
  1299.         LD (CRCArea+2),HL
  1300.        ;AND A
  1301.         RET
  1302.  
  1303. addcrc
  1304.         CALL LOADBLK ;load bc bytes to de
  1305.         RET C
  1306.        push hl
  1307.         ld de,(CRCArea)
  1308.         ld hl,(CRCArea+2)
  1309.         jr addcrcq
  1310.       ENDIF
  1311.  
  1312. EXTRACT
  1313.        CALL PREPAR
  1314.        RET C
  1315. EXTR0
  1316.         LD HL,#8074
  1317.         CALL SCAN
  1318.        ;LD (SCANres),HL
  1319.        ;LD A,H
  1320.        ;OR L
  1321.        JP C,SHOWQUI
  1322.        IF masks
  1323.        CALL CPMASK
  1324.        JR NZ,EXnMSK
  1325.        ENDIF
  1326.         LD A,(TYPEF)
  1327.         CP #74
  1328.         JR Z,EXTR74 ;file
  1329. EXnMSK
  1330.         LD HL,(NXTPOS)
  1331.        LD DE,(NXTPOS+2)
  1332.        CALL SEEKst
  1333.         JP EXTRq
  1334.        ;jp _DEPKOK ;TODO как проверить?
  1335. EXTR74
  1336.         LD A,(FLAGF)
  1337.        RRA
  1338.        JR NC,EXnBAD
  1339.        ;LD A,(SOLFLG)
  1340.        ;OR A
  1341.        ;JR Z,EXnBAD
  1342.         call RST16
  1343.  DB "bad RAR type",0
  1344.         SCF
  1345.         RET
  1346. EXnBAD
  1347.         ;if 1==0
  1348.         LD HL,(NXTPOS)
  1349.         LD DE,(ADDSZF)
  1350.         SBC HL,DE
  1351.        EX DE,HL
  1352.        LD HL,(NXTPOS+2)
  1353.        LD BC,(ADDSZF+2)
  1354.        SBC HL,BC
  1355.        EX DE,HL
  1356.        CALL SEEKst
  1357.         ;endif ;TODO
  1358.        
  1359.         LD HL,CURFILE
  1360.         LD DE,OUTNAM
  1361.         LD BC,namln
  1362.         LDIR
  1363.        LD A,1
  1364.        LD (known),A
  1365.         LD A,(UNPVER)
  1366.         CP 13
  1367.         JR C,badver
  1368.         DEC A
  1369.         CP 20
  1370.         JR C,goodver
  1371. badver  call RST16
  1372.         DB #D,#a,"Bad method ",1
  1373.         DW CURFILE
  1374.         DB 0
  1375.        XOR A
  1376.        LD (known),A
  1377. goodver;LD A,(ATTR)
  1378.        ;BIT 3,A
  1379.        ;JP NZ,EXTRq
  1380.        ;AND 16
  1381.        ;JP NZ,EXTRq
  1382.         call RST16
  1383.         DB #D,#a,1
  1384.         DW OUTNAM
  1385.         DB "(Y,N,All)"
  1386.         DB 0
  1387.         LD HL,(UNPSIZE+2)
  1388.         LD (uNPremn+2),HL
  1389.         LD HL,(UNPSIZE)
  1390.         LD (uNPremn),HL
  1391.  
  1392.         CALL IYKEY
  1393.        cp key_esc
  1394.         JP z,SHOWQUI ;NC
  1395.         AND #DF
  1396.        LD (doSAVEk),A
  1397.         CP "N"
  1398.         JR NZ,KnN
  1399.         LD A,(FLAGA)
  1400.         AND 8
  1401.         JP Z,_DEPKOK ;not 'all'
  1402.        JR EXTRnOK
  1403. KnN     CP "A"
  1404.         JR NZ,KnALL
  1405.        LD A,201
  1406.        LD (flgALL),A
  1407. KnALL
  1408.         call SAVECREATE ;OUTNAM
  1409.  
  1410.         LD A,(METHOD)
  1411.         CP #30 ;storing
  1412.        JR NZ,NSTORE
  1413.         LD A,16
  1414.         LD (FLAGF),A
  1415.        LD HL,dd
  1416.        LD DE,dd+1
  1417.        LD BC,256
  1418.        LD (HL),8
  1419.        LDIR
  1420.        LD C,297&0xff
  1421.        LD (HL),B
  1422.        LDIR
  1423.        LD DE,299
  1424.        INC HL,HL
  1425.        LD BC,ld
  1426.        CALL MKTREE
  1427.        LD HL,(DEPADR)
  1428.        LD (stAD),HL
  1429.        LD A,(curPG)
  1430.        LD (stPG),A
  1431. NSTORE
  1432.         CALL DEPK
  1433.         call SAVECLOSE
  1434.         ;ld hl,0
  1435.         ;ld (ADDSZF),hl
  1436.         ;ld (ADDSZF+2),hl
  1437. _DEPKOK
  1438.         LD HL,(NXTPOS)
  1439.        LD DE,(NXTPOS+2)
  1440.        CALL SEEKst
  1441.        ; LD HL,(ADDSZF)
  1442.        ; LD de,(ADDSZF+2)
  1443.        ;CALL SEEKpos ;skip dehl bytes
  1444.  
  1445. EXTROK
  1446.         call RST16
  1447.         DB " Ok",0
  1448. EXTRnOK
  1449.         LD A,(known)
  1450.         OR A
  1451.         LD HL,(NXTPOS)
  1452.         LD DE,(NXTPOS+2)
  1453.        CALL Z,SEEKst
  1454. EXTRq
  1455.        CALL SCFEOF
  1456.         JP NC,EXTR0
  1457.        IF unexp
  1458.        CALL UNEXP
  1459.        ENDIF
  1460. SHOWQUI
  1461.         LD HL,(ERRORS)
  1462.         LD A,H
  1463.         OR L
  1464.         JR NZ,EXTRnAOK
  1465.         call RST16
  1466.         DB #D,#a,"All OK",0
  1467.         RET
  1468. EXTRnAOK
  1469.         call RST16
  1470.         DB #D,#a,"Total errors: ",0
  1471.         LD HL,(ERRORS)
  1472.         LD A,#10
  1473.         JP PRDEC
  1474.  
  1475. CONTENTS
  1476.        CALL PREPAR
  1477.        RET C
  1478.         call RST16
  1479.         DB "    Size Packed Ratio Date Met Ver"
  1480.         db #d,#a
  1481.         db 0
  1482. CONTENTS0;_9549
  1483.        ;CALL 8020
  1484.        ;RET NC
  1485.         LD HL,#0074
  1486.         CALL SCAN
  1487.         JP C,VOLpars
  1488.        IF masks
  1489.        CALL CPMASK
  1490.        JP NZ,CONTskip
  1491.        ENDIF
  1492.         LD A,(FLAGF)
  1493.         AND 4
  1494.        LD A,"*" ;encrypted
  1495.        JR NZ,$+4
  1496.        LD A,32
  1497.         CALL PRSYM
  1498.        ; call RST16
  1499.        ;DB 1
  1500.        ;DW CURFILE
  1501.        ;DB 0
  1502.         ;call RST16
  1503.         ;DB #D,#a,0
  1504.         LD HL,(UNPSIZE+2)
  1505.         LD DE,(UNPSIZE)
  1506.         LD A,7;unpacked size
  1507.         CALL PRDECHLDE
  1508.         LD HL,(ADDSZF+2)
  1509.         LD DE,(ADDSZF)
  1510.         LD A,7;packed size
  1511.         CALL PRDECHLDE
  1512.         call RST16
  1513.        DB " ",0
  1514.         LD A,(FLAGF)
  1515.         AND 3
  1516.         CP 3
  1517.         JR NZ,_npvnx
  1518.         call RST16
  1519. ;from prev to next vol
  1520.        DB " <->",0
  1521.         JR FILETIM
  1522. _npvnx CP 1
  1523.         JR NZ,_npv
  1524.         call RST16;from prev
  1525.        DB " <--",0
  1526.         JR FILETIM
  1527. _npv   CP 2
  1528.         JR NZ,_nnx
  1529.         call RST16;to next vol
  1530.        DB " -->",0
  1531.         JR FILETIM
  1532. _nnx    EXX
  1533.         LD HL,(UNPSIZE+2)
  1534.         LD DE,(ADDSZF+2)
  1535.         EXX
  1536.         LD HL,(UNPSIZE)
  1537.         LD DE,(ADDSZF)
  1538.         CALL PERCENT
  1539.         LD H,0,L,A
  1540.         LD A,3
  1541.         CALL PRDEC;ratio%
  1542.         call RST16
  1543.         DB "% ",0
  1544. FILETIM LD A,"0"
  1545.         LD (DECSPACE),A
  1546.         LD HL,(FTIME+2)
  1547.         LD DE,(FTIME)
  1548.         LD A,L
  1549.         AND 31
  1550.         ADD HL,HL
  1551.         add HL,HL
  1552.         add HL,HL
  1553.         LD L,A
  1554.         ld A,H
  1555.         AND #F
  1556.         LD H,A
  1557.         ld A,E
  1558.         SRL D
  1559.         RRA
  1560.         SRL D
  1561.         RRA
  1562.         SRL D
  1563.         RRA
  1564.         RRA
  1565.         RRA
  1566.         AND 63
  1567.         LD E,A
  1568.        LD A,L
  1569.         PUSH HL
  1570.         LD H,0
  1571.         LD A,2
  1572.         CALL PRDEC
  1573.         POP HL
  1574.         LD L,H
  1575.         ld H,0
  1576.         LD A,2
  1577.         CALL PRDEC
  1578.         LD A,(FTIME+3)
  1579.         SRL A
  1580.         LD L,A
  1581.         ld H,0
  1582.         LD DE,#7BC
  1583.         ADD HL,DE
  1584.         LD DE,100
  1585.         SBC HL,DE
  1586.         JR NC,$-2
  1587.         ADD HL,DE ;HL=остаток mod 100
  1588.         LD A,2
  1589.         CALL PRDEC;напечатать 2 цифры
  1590.         LD A,32
  1591.         LD (DECSPACE),A
  1592.         LD A,(METHOD)
  1593.         LD (_meth),A
  1594.         call RST16
  1595.         DB " ",0,0
  1596. _meth=$-2
  1597.         LD A,(FLAGF)
  1598.         AND #E0
  1599.         CP #81
  1600.         JR NC,directory
  1601.         RLCA
  1602.         RLCA
  1603.         RLCA
  1604.        AND 7
  1605.         ADD A,"a"
  1606.         CALL PRSYM
  1607. directory call RST16
  1608.         DB " ",0
  1609.         LD HL,#2F0A
  1610.         LD A,(UNPVER)
  1611.         INC H
  1612.         SUB L
  1613.         JR NC,$-2
  1614.         ADD A,"0"+10
  1615.         LD (_96fd+2),A
  1616.         LD A,H
  1617.         LD (_96fd),A
  1618.         call RST16
  1619. _96fd  DB "0.0",0
  1620.  
  1621.         call RST16
  1622.         db " "
  1623.        DB 1
  1624.        DW CURFILE
  1625.         DB #D,#a
  1626.        DB 0
  1627.  
  1628.         LD A,(FLAGF)
  1629.        RRA
  1630.        JR C,Nfrprev
  1631.         LD HL,(volUNSZ)
  1632.         LD DE,(UNPSIZE)
  1633.         ADD HL,DE
  1634.         LD (volUNSZ),HL
  1635.         LD HL,(volUNSZ+2)
  1636.         LD DE,(UNPSIZE+2)
  1637.         ADC HL,DE
  1638.         LD (volUNSZ+2),HL
  1639.         LD HL,(pieces)
  1640.        INC HL
  1641.         LD (pieces),HL
  1642. Nfrprev LD HL,(volPKSZ)
  1643.         LD DE,(ADDSZF)
  1644.         ADD HL,DE
  1645.         LD (volPKSZ),HL
  1646.         LD HL,(volPKSZ+2)
  1647.         LD DE,(ADDSZF+2)
  1648.         ADC HL,DE
  1649.         LD (volPKSZ+2),HL
  1650. CONTskip
  1651.         LD HL,(NXTPOS)
  1652.        LD DE,(NXTPOS+2)
  1653.        CALL SEEKst
  1654.        
  1655.        ; LD HL,(ADDSZF)
  1656.        ; LD de,(ADDSZF+2)
  1657.        ;CALL SEEKpos ;skip dehl bytes
  1658.        
  1659.         CALL SCFEOF
  1660.         JP NC,CONTENTS0;_9549 ;next file
  1661. ;какая-то ошибка? внезапный конец архива?
  1662.        IF unexp
  1663.        CALL UNEXP
  1664.        ENDIF
  1665. VOLpars
  1666.         call RST16
  1667.         DB #D,#a,0
  1668.  
  1669.        ;LD HL,(pieces+2)
  1670.        LD HL,(pieces)
  1671.        LD A,5
  1672.        CALL PRDEC
  1673.         LD HL,(volUNSZ+2)
  1674.         LD DE,(volUNSZ)
  1675.         LD A,9;17
  1676.         CALL PRDECHLDE
  1677.         LD HL,(volPKSZ+2)
  1678.         LD DE,(volPKSZ)
  1679.         LD A,9
  1680.         CALL PRDECHLDE
  1681.         call RST16
  1682.         DB " ",0
  1683.         EXX
  1684.         LD HL,(volUNSZ+2)
  1685.         LD DE,(volPKSZ+2)
  1686.         EXX
  1687.         LD HL,(volUNSZ)
  1688.         LD DE,(volPKSZ)
  1689.         CALL PERCENT
  1690.         LD H,0
  1691.         ld L,A
  1692.         LD A,3
  1693.         CALL PRDEC
  1694.         call RST16
  1695.         DB "%",#D,#a,0
  1696.         AND A
  1697.         RET
  1698.  
  1699. readerror
  1700.         call SAVECLOSE
  1701.         ;jp SPGO
  1702. SPGO
  1703.         call closestream_file
  1704. SPGO_sp=$+1
  1705.         LD SP,0;STACK;#6000
  1706. CLSGO
  1707.         ;CALL CLS
  1708.         call RST16
  1709.         ;DB "UNRAR",v1,".",v2,v3
  1710. ;        DB "A>A"
  1711. ;src=$-3
  1712. ;dst=$-1
  1713.         DB #D,#a,"Workfile"
  1714.         ;db " "
  1715. ;TWORK  DB "masm_src"
  1716.         db 0
  1717.         call PRRARNAME
  1718.         call RST16
  1719.         DB "Mask "
  1720.        db 1
  1721.        dw CURMASK
  1722.         db 0
  1723. LOOP
  1724.        LD A,251
  1725.        LD (flgALL),A
  1726.         call RST16
  1727.         DB #D,#a,">",0
  1728.         CALL IYKEY
  1729.         CP key_enter
  1730.         JR Z,CLSGO
  1731.        
  1732.         if 1==0
  1733.         LD HL,TDRIVS
  1734.         LD BC,8
  1735.         CPIR
  1736.         JR Z,loopDRV
  1737.         endif
  1738.        
  1739.         AND #DF
  1740.         CALL PRSYM
  1741.         call RST16
  1742.         DB #D,#a,0
  1743.         LD (COMSYM),A
  1744.         CP "E"
  1745.         JR Z,loopE
  1746.         CP "V"
  1747.         JR Z,loopV
  1748.         CP "Q"
  1749.         jp Z,quit
  1750.        IF masks
  1751.         CP "M"
  1752.         JP Z,loopM
  1753.        ENDIF
  1754. ;start here
  1755. loopW
  1756.         if 1==0
  1757. ;TODO
  1758.         CALL PRCAT
  1759.         JR C,CLSGO
  1760.         LD DE,TWORK
  1761.         LD BC,8
  1762.         LDIR
  1763.         endif
  1764.         JR CLSGO
  1765. loopE   CALL EXTRACT
  1766.         call closestream_file
  1767.         JR LOOP
  1768. loopV   CALL CONTENTS
  1769.         call closestream_file
  1770.         JR LOOP
  1771.        
  1772.         if 1==0
  1773. loopDRV LD A,7
  1774.         SUB C
  1775.         LD HL,src
  1776.         CP 4
  1777.         JR C,lDRVsrc
  1778.         LD HL,dst
  1779.         SUB 4
  1780. lDRVsrc ADD A,"A"
  1781.         LD (HL),A
  1782.         JR CLSGO
  1783.         endif
  1784.        
  1785. ;konec
  1786.  
  1787. GO
  1788.         ld (SPGO_sp),sp
  1789.        IFN tcrc
  1790.         LD L,A
  1791. MKTCRC0 EXX
  1792.         LD HL,0
  1793.         ld D,H
  1794.         ld E,A
  1795.         LD B,8
  1796. MKTCRC1 SRL H
  1797.         RR L
  1798.         rr D
  1799.         rr E
  1800.         JR NC,MKTCRCe
  1801.         EXA
  1802.         LD A,E
  1803.         XOR #20
  1804.         LD E,A
  1805.         ld A,D
  1806.         XOR #83
  1807.         LD D,A
  1808.         ld A,L
  1809.         XOR #B8
  1810.         LD L,A
  1811.         ld A,H
  1812.         XOR #ED
  1813.         LD H,A
  1814.         EXA
  1815. MKTCRCe DJNZ MKTCRC1
  1816.         PUSH HL
  1817.         PUSH DE
  1818.         EXX
  1819.        LD H,TCRC/256
  1820.         POP DE
  1821.         LD (HL),E
  1822.         INC H
  1823.         LD (HL),D
  1824.         INC H
  1825.         POP DE
  1826.         LD (HL),E
  1827.         INC H
  1828.         LD (HL),D
  1829.         INC L
  1830.         INC A
  1831.         JR NZ,MKTCRC0
  1832.        ENDIF  
  1833.        CALL PRAUTH;ONCE
  1834.         JP loopW
  1835.  
  1836. ;TODO
  1837. p48
  1838.         EXX
  1839.         LD H,D
  1840.         ld L,E
  1841.         LD BC,(disp)
  1842.         LD A,(curPG)
  1843.         SBC HL,BC
  1844.         SET 7,H
  1845. p48sz=$-p48
  1846.  
  1847. PRAUTH
  1848.         call RST16
  1849.         ;DB "UNRAR",v1,".",v2,v3,"lite",#D,#a
  1850.         db "v = view, e = extract, m = set mask, q = quit"
  1851.         ;DB "4=48",#D,#a
  1852.         ;DB "other keys=1M"
  1853.         db 0
  1854.         if 1==0
  1855.         CALL IYKEY
  1856.         OR 32
  1857.         CP "4"
  1858.         JR NZ,Npatch48
  1859.        LD HL,GPmem+GPmemsz-p48sz
  1860.        LD (GPaddrpatch),HL
  1861.        EX DE,HL
  1862.         LD HL,p48
  1863.         LD BC,p48sz
  1864.         LDIR
  1865.        LD A,201
  1866.        LD (OUTME),A
  1867.        ;LD (hobetasym),A ;no hobeta
  1868.         xor a
  1869.        JR patch2
  1870.        endif
  1871. Npatch48
  1872.         LD C,64;64-2;+1 ;число страниц памяти?
  1873.         LD A,C
  1874.         LD (_p1+1),A ;изначально там INITIALMEMPAGES;6
  1875. patch2
  1876.         LD (_4+1),A
  1877.         LD (_3+1),A
  1878.         LD (_5+1),A
  1879.         ;LD (_6+1),A
  1880.        LD (L_pg+1),A
  1881.         NEG
  1882.         LD L,A
  1883.         ld H,-1
  1884.         INC HL
  1885.         dup 6
  1886.         add hl,hl
  1887.         edup
  1888.         LD DE,THEEND/256-256
  1889.         ADD HL,DE
  1890.         LD (_2+1),HL
  1891.         RET
  1892.  
  1893.         ;DISPLAY /T,konec,"(",CODETOP,")"
  1894.