?login_element?

Subversion Repositories NedoOS

Rev

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

  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.         if 1==0
  877. PRCUR
  878.         ld e,CURSORCOLOR
  879.         jr RECUR_go
  880. RECUR
  881.         ld e,COLOR
  882. RECUR_go
  883. ;        ld hl,0
  884. ;CURX=$-2
  885. ;CURY=$-1
  886. PRCURHL
  887.         push iy
  888.         push de
  889.         ex de,hl
  890.         ;OS_SETXY
  891.         pop de
  892.         OS_PRATTR
  893.         pop iy
  894.         ret
  895.         endif
  896.  
  897. IYKEY
  898.         ;XOR A
  899.         ;LD (SCROLLINES),A
  900.        ;SCF ;флаг был нужен только в одном месте
  901. flgALL  EI ;/ret
  902. SUREKEY PUSH IX,HL,DE,BC
  903.        PUSH IY
  904.         ;CALL PRCUR
  905. iykey_nokey
  906.         call yieldgetkeyloop ;YIELDGETKEYLOOP
  907.         or a
  908.         jr z,iykey_nokey
  909.         ;push af
  910.         ;CALL RECUR
  911.         ;pop af
  912.        POP IY
  913.         POP BC,DE,HL,IX
  914.         RET
  915.  
  916. PRNUM  
  917.         LD A,H
  918.         CALL PRHEX
  919.         LD A,L
  920. PRHEX  
  921.         PUSH HL
  922.         LD HL,HEXBUF
  923.         LD (HL),A
  924.         CALL HEXDIG
  925.         call HEXDIG
  926.         POP HL
  927.         RET
  928. HEXDIG  
  929.         XOR A
  930.         RLD
  931.         CP 10
  932.         CCF
  933.         ADC A,"0"
  934.         DAA
  935. PRSYM  
  936.         push AF
  937.         push BC
  938.         push DE
  939.         push HL
  940.         PUSH IX
  941.         push iy
  942.         PRCHAR_;CALL PR64
  943.         pop iy
  944.         pop IX
  945.         pop HL
  946.         pop DE
  947.         pop BC
  948.         POP AF
  949.         RET
  950.  
  951. ;HL'HL/DE'DE*100%
  952. PERCENT
  953.         EXX
  954.          LD A,H
  955.          OR L
  956.         EXX
  957.         JR NZ,perN0 ;>ffff
  958.         LD A,H,H,L
  959.         EXX
  960.          LD L,A
  961.         EXX
  962.         LD A,D,D,E
  963.         EXX
  964.          LD E,A
  965.         EXX
  966. perN0  LD BC,#2164
  967.        XOR A
  968. perDIV RLA
  969.        SUB C
  970.        JR NC,$+3
  971.        ADD A,C
  972.        CCF
  973.        ADC HL,HL
  974.        EXX
  975.         ADC HL,HL
  976.        EXX
  977.        DJNZ perDIV
  978.         EX DE,HL
  979.        LD A,D
  980.        OR E
  981.         EXX
  982.         EX DE,HL
  983.        OR D,E
  984.         EXX
  985.        RET Z
  986.         XOR A
  987. perSUB  SBC HL,DE
  988.         EXX
  989.          SBC HL,DE
  990.         EXX
  991.         INC A
  992.         JR NC,perSUB
  993.         DEC A
  994.         CP 101
  995.         RET C
  996.         LD A,100
  997.         RET
  998.  
  999. TSTOLD
  1000.         XOR A
  1001.        LD (VOLFLG),A
  1002.        LD (SOLFLG),A
  1003.        LD (TSTARES),A
  1004.         LD DE,ARCBEG
  1005.         LD BC,7
  1006.         CALL LOADBLK ;load bc bytes to de
  1007.         RET C
  1008.        ;LD HL,ARCBEG
  1009.         LD A,"R"
  1010.         CPI
  1011.         JR NZ,TSTRARH
  1012.         LD A,#45
  1013.         CPI
  1014.         JR NZ,TSTRARH
  1015.         LD A,#7E
  1016.         CPI
  1017.         JR NZ,TSTRARH
  1018.         LD A,#5E
  1019.         CP (HL)
  1020.         JR NZ,TSTRARH
  1021.         call RST16
  1022.         DB "old RAR"
  1023.        IF opt==0
  1024.         DB " format detected"
  1025.        ENDIF
  1026.         DB #D,#a,0
  1027.         LD A,1
  1028.         LD (TSTARES),A
  1029.         LD HL,0
  1030.        LD D,H
  1031.        ld E,L
  1032.        CALL SEEKst
  1033.        ;RET C
  1034.         SCF
  1035.         RET
  1036. TSTRARH
  1037.         LD HL,ARCBEG
  1038.         LD A,"R"
  1039.        SCF
  1040.         CPI
  1041.        RET NZ
  1042.         LD A,"a"
  1043.         CPI
  1044.        RET NZ
  1045.         LD A,"r"
  1046.         CPI
  1047.        RET NZ
  1048.         LD A,"!"
  1049.         CPI
  1050.        RET NZ
  1051.         LD A,#1A
  1052.         CPI
  1053.        RET NZ
  1054.         LD A,7
  1055.         SUB (HL)
  1056.         INC HL
  1057.         OR (HL)
  1058.        SCF
  1059.        RET NZ
  1060.         LD A,2
  1061.         LD (TSTARES),A
  1062.         LD DE,CRCA
  1063.         LD BC,13
  1064.         CALL upcrc;archead
  1065.         RET C
  1066.         LD A,(FLAGA)
  1067.         AND 1
  1068.        INC A
  1069.         LD (VOLFLG),A
  1070.        IF crc
  1071.         LD HL,-1
  1072.         LD DE,(CRCArea)
  1073.         AND A
  1074.         SBC HL,DE
  1075.         LD DE,(CRCA)
  1076.         SBC HL,DE
  1077.         JR Z,_9436
  1078.         call RST16
  1079.         DB "Archive header broken",#D,#a,0
  1080.         SCF
  1081.         RET
  1082. _9436
  1083.        ENDIF
  1084.         LD A,(FLAGA)
  1085.         AND 8
  1086.        RRCA
  1087.        RRCA
  1088.        RRCA
  1089.         LD (SOLFLG),A
  1090.        ;AND A
  1091.         RET
  1092.  
  1093. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1094. ;TWICE
  1095. ;CURPOS used only here
  1096. SCAN
  1097. ;scan archive for block type=hl
  1098.         LD (EXPTYP),HL
  1099.        
  1100.         if 1==0
  1101. SCAN0
  1102.        LD DE,CRCF
  1103.        LD BC,7
  1104.        call upcrc ;read 7 bytes
  1105.        RET C
  1106.        ;LD (CRCLO),HL
  1107.         LD DE,(SIZEF) ;from file header ;head size
  1108.        
  1109.         LD HL,7
  1110.        ;OR A
  1111.         SBC HL,DE
  1112.        CCF
  1113.         RET C ;<=7
  1114.  
  1115.        push de
  1116.        ld de,CRCF+7
  1117.        ld bc,32-7
  1118.        call addcrc ;read 32-7 bytes
  1119.        pop de
  1120.        ret c
  1121.  
  1122.         ld hl,0
  1123.  
  1124.       LD A,(FLAGF+1)
  1125.         RLA
  1126.         JR NC,nADD
  1127. ;Поле ADD_SIZE присутствует, только если (HEAD_FLAGS & 0x8000) != 0
  1128.         LD HL,(ADDSZF)
  1129.         ADD HL,DE
  1130.         LD de,(ADDSZF+2)
  1131.         jr nc,$+3
  1132.         inc de
  1133. nADD
  1134. ;dehl=add to curpos before TSTPP
  1135.  
  1136.         push hl
  1137.         LD HL,EXPTYP
  1138.         LD A,(TYPEF)
  1139.         CP (HL)
  1140.         pop hl
  1141.         JR Z,SCANREAD
  1142. SCANSKIP
  1143. ;dehl=add to curpos before TSTPP
  1144.         ld bc,32
  1145.         or a
  1146.         sbc hl,bc
  1147.         jr nc,$+3
  1148.         dec de
  1149.  
  1150.        CALL SEEKpos ;skip dehl bytes
  1151.         jr SCAN0
  1152.  
  1153.         else
  1154.        
  1155. SCAN0
  1156.         if 1==0
  1157.         LD HL,(DESCRIP+14)
  1158.         CALL GETPOSp
  1159.         PUSH HL
  1160.         LD HL,(TRSEC)
  1161.         CALL GETPOSp
  1162.         POP DE
  1163.        ;XOR A
  1164.         SBC HL,DE
  1165. ;TODO hly=current position in file
  1166.         LD E,ly;LX
  1167.         LD D,L,L,H
  1168.         LD H,A ;DEHL наоборот
  1169.         LD (CURPOS),DE
  1170.         LD (CURPOS+2),HL
  1171.         endif
  1172.  
  1173.        LD DE,CRCF
  1174.        LD BC,7
  1175.        ;jr $
  1176.        call upcrc ;read 7 bytes
  1177.        RET C
  1178.        ;LD (CRCLO),HL
  1179.         LD DE,(SIZEF)
  1180.         LD HL,7
  1181.        ;OR A
  1182.         SBC HL,DE
  1183.        CCF
  1184.         RET C ;<=7
  1185.        push de
  1186.        ld de,CRCF+7
  1187.        ld bc,32-7
  1188.        call addcrc ;read 32-7 bytes ;TODO fix CRC
  1189.        pop de
  1190.        ret c
  1191. ;было: CURPOS=позиция начала заголовка
  1192. ;теперь: CURPOS=позиция начала заголовка + 32
  1193.         LD HL,(CURPOS)
  1194.        ;LD DE,(SIZEF)
  1195.         ADD HL,DE
  1196.        EX DE,HL
  1197.         LD HL,(CURPOS+2)
  1198.         JR NC,$+3
  1199.         INC HL
  1200.       ;JR Z,nADD ;BLOCK #7B
  1201.         LD A,(FLAGF+1)
  1202.         RLA
  1203.         JR NC,nADD
  1204.        PUSH HL
  1205.         LD HL,(ADDSZF)
  1206.         ADD HL,DE
  1207.        EX DE,HL
  1208.        POP BC
  1209.         LD HL,(ADDSZF+2)
  1210.         ADC HL,BC
  1211. nADD
  1212.         ex de,hl
  1213.          ld bc,32
  1214.          or a
  1215.          sbc hl,bc
  1216.          jr nc,$+3
  1217.          dec de
  1218.         LD (NXTPOS),hl
  1219.         LD (NXTPOS+2),de
  1220.       CALL EOF
  1221.       RET C
  1222. _nUNE
  1223.         LD HL,EXPTYP
  1224.         LD A,(TYPEF)
  1225.         CP (HL)
  1226.         JR Z,SCANREAD
  1227. SCANSKIP
  1228.         LD HL,(NXTPOS)
  1229.        LD DE,(NXTPOS+2)
  1230.        CALL SEEKst
  1231.         JP SCAN0
  1232.       endif
  1233.  
  1234. SCANREAD
  1235. ;выход из scan
  1236.         LD HL,(NAMSIZE)
  1237.         LD DE,namln-1
  1238.         AND A
  1239.         SBC HL,DE
  1240.         ADD HL,DE
  1241.         JR C,$+3
  1242.         EX DE,HL
  1243.        ;LD (NAMSIZE),HL
  1244.         LD DE,CURFILE
  1245.         LD B,H
  1246.         ld C,L ;длина имени файла
  1247.         CALL LOADBLK ;load bc bytes to de
  1248.         LD (DE),A;0
  1249.       IF crc==0
  1250.        OR A
  1251.        RET
  1252.       ELSE
  1253.        ;LD A,(TSTARES)
  1254.        ;CP 2 ;?
  1255.        ;JR NZ,nBROKEN
  1256.        PUSH HL
  1257.         LD HL,(CRCArea+2)
  1258.         LD DE,(CRCArea)
  1259.         ;LD BC,(NAMSIZE)
  1260.        EX (SP),iy;IX
  1261.         CALL UPCRC ;считаем CRC iy=CURFILE
  1262.        POP iy;IX
  1263.         LD HL,(CRCF)
  1264.         SCF
  1265.         ADC HL,DE
  1266.        CCF
  1267.        RET Z ;NC
  1268.         call RST16
  1269.         DB #D,#a,1
  1270.         DW CURFILE
  1271.         DB " bad header",#D,#a,0
  1272.         SCF
  1273.         RET
  1274.       ENDIF
  1275.      
  1276.      
  1277.  
  1278. ;CY=error
  1279. upcrc
  1280. ;de=addr, bc=size
  1281.       ;LD A,(TSTARES)
  1282.       ;DEC A
  1283.       ;SCF ;oldRAR
  1284.       ;RET Z
  1285.       IF crc==0
  1286. addcrc
  1287.        JP LOADBLK ;load bc bytes to de
  1288.       ELSE
  1289.         CALL LOADBLK ;load bc bytes to de
  1290.         RET C
  1291.         INC HL
  1292.         inc HL
  1293.        PUSH HL
  1294.         DEC C
  1295.         dec C ;2 байта в начале блока не учитываем в CRC
  1296.         LD HL,-1
  1297.         ld D,H
  1298.         ld E,L
  1299. addcrcq
  1300.        EX (SP),iy;IX
  1301.         CALL UPCRC ;считаем CRC iy=CRCF/CRCA
  1302.        POP iy;IX
  1303.         LD (CRCArea),DE
  1304.         LD (CRCArea+2),HL
  1305.        ;AND A
  1306.         RET
  1307.  
  1308. addcrc
  1309.         CALL LOADBLK ;load bc bytes to de
  1310.         RET C
  1311.        push hl
  1312.         ld de,(CRCArea)
  1313.         ld hl,(CRCArea+2)
  1314.         jr addcrcq
  1315.       ENDIF
  1316.  
  1317. EXTRACT
  1318.        CALL PREPAR
  1319.        RET C
  1320. EXTR0
  1321.         LD HL,#8074
  1322.         CALL SCAN
  1323.        ;LD (SCANres),HL
  1324.        ;LD A,H
  1325.        ;OR L
  1326.        JP C,SHOWQUI
  1327.        IF masks
  1328.        CALL CPMASK
  1329.        JR NZ,EXnMSK
  1330.        ENDIF
  1331.         LD A,(TYPEF)
  1332.         CP #74
  1333.         JR Z,EXTR74 ;file
  1334. EXnMSK
  1335.         LD HL,(NXTPOS)
  1336.        LD DE,(NXTPOS+2)
  1337.        CALL SEEKst
  1338.         JP EXTRq
  1339.        ;jp _DEPKOK ;TODO как проверить?
  1340. EXTR74
  1341.         LD A,(FLAGF)
  1342.        RRA
  1343.        JR NC,EXnBAD
  1344.        ;LD A,(SOLFLG)
  1345.        ;OR A
  1346.        ;JR Z,EXnBAD
  1347.         call RST16
  1348.  DB "bad RAR type",0
  1349.         SCF
  1350.         RET
  1351. EXnBAD
  1352.         ;if 1==0
  1353.         LD HL,(NXTPOS)
  1354.         LD DE,(ADDSZF)
  1355.         SBC HL,DE
  1356.        EX DE,HL
  1357.        LD HL,(NXTPOS+2)
  1358.        LD BC,(ADDSZF+2)
  1359.        SBC HL,BC
  1360.        EX DE,HL
  1361.        CALL SEEKst
  1362.         ;endif ;TODO
  1363.        
  1364.         LD HL,CURFILE
  1365.         LD DE,OUTNAM
  1366.         LD BC,namln
  1367.         LDIR
  1368.        LD A,1
  1369.        LD (known),A
  1370.         LD A,(UNPVER)
  1371.         CP 13
  1372.         JR C,badver
  1373.         DEC A
  1374.         CP 20
  1375.         JR C,goodver
  1376. badver  call RST16
  1377.         DB #D,#a,"Bad method ",1
  1378.         DW CURFILE
  1379.         DB 0
  1380.        XOR A
  1381.        LD (known),A
  1382. goodver;LD A,(ATTR)
  1383.        ;BIT 3,A
  1384.        ;JP NZ,EXTRq
  1385.        ;AND 16
  1386.        ;JP NZ,EXTRq
  1387.         call RST16
  1388.         DB #D,#a,1
  1389.         DW OUTNAM
  1390.         DB "(Y,N,All)"
  1391.         DB 0
  1392.         LD HL,(UNPSIZE+2)
  1393.         LD (uNPremn+2),HL
  1394.         LD HL,(UNPSIZE)
  1395.         LD (uNPremn),HL
  1396.  
  1397.         CALL IYKEY
  1398.        cp key_esc
  1399.         JP z,SHOWQUI ;NC
  1400.         AND #DF
  1401.        LD (doSAVEk),A
  1402.         CP "N"
  1403.         JR NZ,KnN
  1404.         LD A,(FLAGA)
  1405.         AND 8
  1406.         JP Z,_DEPKOK ;not 'all'
  1407.        JR EXTRnOK
  1408. KnN     CP "A"
  1409.         JR NZ,KnALL
  1410.        LD A,201
  1411.        LD (flgALL),A
  1412. KnALL
  1413.         call SAVECREATE ;OUTNAM
  1414.  
  1415.         LD A,(METHOD)
  1416.         CP #30 ;storing
  1417.        JR NZ,NSTORE
  1418.         LD A,16
  1419.         LD (FLAGF),A
  1420.        LD HL,dd
  1421.        LD DE,dd+1
  1422.        LD BC,256
  1423.        LD (HL),8
  1424.        LDIR
  1425.        LD C,297&0xff
  1426.        LD (HL),B
  1427.        LDIR
  1428.        LD DE,299
  1429.        INC HL,HL
  1430.        LD BC,ld
  1431.        CALL MKTREE
  1432.        LD HL,(DEPADR)
  1433.        LD (stAD),HL
  1434.        LD A,(curPG)
  1435.        LD (stPG),A
  1436. NSTORE
  1437.         CALL DEPK
  1438.         call SAVECLOSE
  1439.         ;ld hl,0
  1440.         ;ld (ADDSZF),hl
  1441.         ;ld (ADDSZF+2),hl
  1442. _DEPKOK
  1443.         LD HL,(NXTPOS)
  1444.        LD DE,(NXTPOS+2)
  1445.        CALL SEEKst
  1446.        ; LD HL,(ADDSZF)
  1447.        ; LD de,(ADDSZF+2)
  1448.        ;CALL SEEKpos ;skip dehl bytes
  1449.  
  1450. EXTROK
  1451.         call RST16
  1452.         DB " Ok",0
  1453. EXTRnOK
  1454.         LD A,(known)
  1455.         OR A
  1456.         LD HL,(NXTPOS)
  1457.         LD DE,(NXTPOS+2)
  1458.        CALL Z,SEEKst
  1459. EXTRq
  1460.        CALL SCFEOF
  1461.         JP NC,EXTR0
  1462.        IF unexp
  1463.        CALL UNEXP
  1464.        ENDIF
  1465. SHOWQUI
  1466.         LD HL,(ERRORS)
  1467.         LD A,H
  1468.         OR L
  1469.         JR NZ,EXTRnAOK
  1470.         call RST16
  1471.         DB #D,#a,"All OK",0
  1472.         RET
  1473. EXTRnAOK
  1474.         call RST16
  1475.         DB #D,#a,"Total errors: ",0
  1476.         LD HL,(ERRORS)
  1477.         LD A,#10
  1478.         JP PRDEC
  1479.  
  1480. CONTENTS
  1481.        CALL PREPAR
  1482.        RET C
  1483.         call RST16
  1484.         DB "    Size Packed Ratio Date Met Ver"
  1485.         db #d,#a
  1486.         db 0
  1487. CONTENTS0;_9549
  1488.        ;CALL 8020
  1489.        ;RET NC
  1490.         LD HL,#0074
  1491.         CALL SCAN
  1492.         JP C,VOLpars
  1493.        IF masks
  1494.        CALL CPMASK
  1495.        JP NZ,CONTskip
  1496.        ENDIF
  1497.         LD A,(FLAGF)
  1498.         AND 4
  1499.        LD A,"*" ;encrypted
  1500.        JR NZ,$+4
  1501.        LD A,32
  1502.         CALL PRSYM
  1503.        ; call RST16
  1504.        ;DB 1
  1505.        ;DW CURFILE
  1506.        ;DB 0
  1507.         ;call RST16
  1508.         ;DB #D,#a,0
  1509.         LD HL,(UNPSIZE+2)
  1510.         LD DE,(UNPSIZE)
  1511.         LD A,7;unpacked size
  1512.         CALL PRDECHLDE
  1513.         LD HL,(ADDSZF+2)
  1514.         LD DE,(ADDSZF)
  1515.         LD A,7;packed size
  1516.         CALL PRDECHLDE
  1517.         call RST16
  1518.        DB " ",0
  1519.         LD A,(FLAGF)
  1520.         AND 3
  1521.         CP 3
  1522.         JR NZ,_npvnx
  1523.         call RST16
  1524. ;from prev to next vol
  1525.        DB " <->",0
  1526.         JR FILETIM
  1527. _npvnx CP 1
  1528.         JR NZ,_npv
  1529.         call RST16;from prev
  1530.        DB " <--",0
  1531.         JR FILETIM
  1532. _npv   CP 2
  1533.         JR NZ,_nnx
  1534.         call RST16;to next vol
  1535.        DB " -->",0
  1536.         JR FILETIM
  1537. _nnx    EXX
  1538.         LD HL,(UNPSIZE+2)
  1539.         LD DE,(ADDSZF+2)
  1540.         EXX
  1541.         LD HL,(UNPSIZE)
  1542.         LD DE,(ADDSZF)
  1543.         CALL PERCENT
  1544.         LD H,0,L,A
  1545.         LD A,3
  1546.         CALL PRDEC;ratio%
  1547.         call RST16
  1548.         DB "% ",0
  1549. FILETIM LD A,"0"
  1550.         LD (DECSPACE),A
  1551.         LD HL,(FTIME+2)
  1552.         LD DE,(FTIME)
  1553.         LD A,L
  1554.         AND 31
  1555.         ADD HL,HL
  1556.         add HL,HL
  1557.         add HL,HL
  1558.         LD L,A
  1559.         ld A,H
  1560.         AND #F
  1561.         LD H,A
  1562.         ld A,E
  1563.         SRL D
  1564.         RRA
  1565.         SRL D
  1566.         RRA
  1567.         SRL D
  1568.         RRA
  1569.         RRA
  1570.         RRA
  1571.         AND 63
  1572.         LD E,A
  1573.        LD A,L
  1574.         PUSH HL
  1575.         LD H,0
  1576.         LD A,2
  1577.         CALL PRDEC
  1578.         POP HL
  1579.         LD L,H
  1580.         ld H,0
  1581.         LD A,2
  1582.         CALL PRDEC
  1583.         LD A,(FTIME+3)
  1584.         SRL A
  1585.         LD L,A
  1586.         ld H,0
  1587.         LD DE,#7BC
  1588.         ADD HL,DE
  1589.         LD DE,100
  1590.         SBC HL,DE
  1591.         JR NC,$-2
  1592.         ADD HL,DE ;HL=остаток mod 100
  1593.         LD A,2
  1594.         CALL PRDEC;напечатать 2 цифры
  1595.         LD A,32
  1596.         LD (DECSPACE),A
  1597.         LD A,(METHOD)
  1598.         LD (_meth),A
  1599.         call RST16
  1600.         DB " ",0,0
  1601. _meth=$-2
  1602.         LD A,(FLAGF)
  1603.         AND #E0
  1604.         CP #81
  1605.         JR NC,directory
  1606.         RLCA
  1607.         RLCA
  1608.         RLCA
  1609.        AND 7
  1610.         ADD A,"a"
  1611.         CALL PRSYM
  1612. directory call RST16
  1613.         DB " ",0
  1614.         LD HL,#2F0A
  1615.         LD A,(UNPVER)
  1616.         INC H
  1617.         SUB L
  1618.         JR NC,$-2
  1619.         ADD A,"0"+10
  1620.         LD (_96fd+2),A
  1621.         LD A,H
  1622.         LD (_96fd),A
  1623.         call RST16
  1624. _96fd  DB "0.0",0
  1625.  
  1626.         call RST16
  1627.         db " "
  1628.        DB 1
  1629.        DW CURFILE
  1630.         DB #D,#a
  1631.        DB 0
  1632.  
  1633.         LD A,(FLAGF)
  1634.        RRA
  1635.        JR C,Nfrprev
  1636.         LD HL,(volUNSZ)
  1637.         LD DE,(UNPSIZE)
  1638.         ADD HL,DE
  1639.         LD (volUNSZ),HL
  1640.         LD HL,(volUNSZ+2)
  1641.         LD DE,(UNPSIZE+2)
  1642.         ADC HL,DE
  1643.         LD (volUNSZ+2),HL
  1644.         LD HL,(pieces)
  1645.        INC HL
  1646.         LD (pieces),HL
  1647. Nfrprev LD HL,(volPKSZ)
  1648.         LD DE,(ADDSZF)
  1649.         ADD HL,DE
  1650.         LD (volPKSZ),HL
  1651.         LD HL,(volPKSZ+2)
  1652.         LD DE,(ADDSZF+2)
  1653.         ADC HL,DE
  1654.         LD (volPKSZ+2),HL
  1655. CONTskip
  1656.         LD HL,(NXTPOS)
  1657.        LD DE,(NXTPOS+2)
  1658.        CALL SEEKst
  1659.        
  1660.        ; LD HL,(ADDSZF)
  1661.        ; LD de,(ADDSZF+2)
  1662.        ;CALL SEEKpos ;skip dehl bytes
  1663.        
  1664.         CALL SCFEOF
  1665.         JP NC,CONTENTS0;_9549 ;next file
  1666. ;какая-то ошибка? внезапный конец архива?
  1667.        IF unexp
  1668.        CALL UNEXP
  1669.        ENDIF
  1670. VOLpars
  1671.         call RST16
  1672.         DB #D,#a,0
  1673.  
  1674.        ;LD HL,(pieces+2)
  1675.        LD HL,(pieces)
  1676.        LD A,5
  1677.        CALL PRDEC
  1678.         LD HL,(volUNSZ+2)
  1679.         LD DE,(volUNSZ)
  1680.         LD A,9;17
  1681.         CALL PRDECHLDE
  1682.         LD HL,(volPKSZ+2)
  1683.         LD DE,(volPKSZ)
  1684.         LD A,9
  1685.         CALL PRDECHLDE
  1686.         call RST16
  1687.         DB " ",0
  1688.         EXX
  1689.         LD HL,(volUNSZ+2)
  1690.         LD DE,(volPKSZ+2)
  1691.         EXX
  1692.         LD HL,(volUNSZ)
  1693.         LD DE,(volPKSZ)
  1694.         CALL PERCENT
  1695.         LD H,0
  1696.         ld L,A
  1697.         LD A,3
  1698.         CALL PRDEC
  1699.         call RST16
  1700.         DB "%",#D,#a,0
  1701.         AND A
  1702.         RET
  1703.  
  1704. readerror
  1705.         call SAVECLOSE
  1706.         ;jp SPGO
  1707. SPGO
  1708.         call closestream_file
  1709. SPGO_sp=$+1
  1710.         LD SP,0;STACK;#6000
  1711. CLSGO
  1712.         ;CALL CLS
  1713.         call RST16
  1714.         ;DB "UNRAR",v1,".",v2,v3
  1715. ;        DB "A>A"
  1716. ;src=$-3
  1717. ;dst=$-1
  1718.         DB #D,#a,"Workfile"
  1719.         ;db " "
  1720. ;TWORK  DB "masm_src"
  1721.         db 0
  1722.         call PRRARNAME
  1723.         call RST16
  1724.         DB "Mask "
  1725.        db 1
  1726.        dw CURMASK
  1727.         db 0
  1728. LOOP
  1729.        LD A,251
  1730.        LD (flgALL),A
  1731.         call RST16
  1732.         DB #D,#a,">",0
  1733.         CALL IYKEY
  1734.         CP key_enter
  1735.         JR Z,CLSGO
  1736.        
  1737.         if 1==0
  1738.         LD HL,TDRIVS
  1739.         LD BC,8
  1740.         CPIR
  1741.         JR Z,loopDRV
  1742.         endif
  1743.        
  1744.         AND #DF
  1745.         CALL PRSYM
  1746.         call RST16
  1747.         DB #D,#a,0
  1748.         LD (COMSYM),A
  1749.         CP "E"
  1750.         JR Z,loopE
  1751.         CP "V"
  1752.         JR Z,loopV
  1753.         CP "Q"
  1754.         jp Z,quit
  1755.        IF masks
  1756.         CP "M"
  1757.         JP Z,loopM
  1758.        ENDIF
  1759. ;start here
  1760. loopW
  1761.         if 1==0
  1762. ;TODO
  1763.         CALL PRCAT
  1764.         JR C,CLSGO
  1765.         LD DE,TWORK
  1766.         LD BC,8
  1767.         LDIR
  1768.         endif
  1769.         JR CLSGO
  1770. loopE   CALL EXTRACT
  1771.         call closestream_file
  1772.         JR LOOP
  1773. loopV   CALL CONTENTS
  1774.         call closestream_file
  1775.         JR LOOP
  1776.        
  1777.         if 1==0
  1778. loopDRV LD A,7
  1779.         SUB C
  1780.         LD HL,src
  1781.         CP 4
  1782.         JR C,lDRVsrc
  1783.         LD HL,dst
  1784.         SUB 4
  1785. lDRVsrc ADD A,"A"
  1786.         LD (HL),A
  1787.         JR CLSGO
  1788.         endif
  1789.        
  1790. ;konec
  1791.  
  1792. GO
  1793.         ld (SPGO_sp),sp
  1794.        IFN tcrc
  1795.         LD L,A
  1796. MKTCRC0 EXX
  1797.         LD HL,0
  1798.         ld D,H
  1799.         ld E,A
  1800.         LD B,8
  1801. MKTCRC1 SRL H
  1802.         RR L
  1803.         rr D
  1804.         rr E
  1805.         JR NC,MKTCRCe
  1806.         EXA
  1807.         LD A,E
  1808.         XOR #20
  1809.         LD E,A
  1810.         ld A,D
  1811.         XOR #83
  1812.         LD D,A
  1813.         ld A,L
  1814.         XOR #B8
  1815.         LD L,A
  1816.         ld A,H
  1817.         XOR #ED
  1818.         LD H,A
  1819.         EXA
  1820. MKTCRCe DJNZ MKTCRC1
  1821.         PUSH HL
  1822.         PUSH DE
  1823.         EXX
  1824.        LD H,TCRC/256
  1825.         POP DE
  1826.         LD (HL),E
  1827.         INC H
  1828.         LD (HL),D
  1829.         INC H
  1830.         POP DE
  1831.         LD (HL),E
  1832.         INC H
  1833.         LD (HL),D
  1834.         INC L
  1835.         INC A
  1836.         JR NZ,MKTCRC0
  1837.        ENDIF  
  1838.        CALL PRAUTH;ONCE
  1839.         JP loopW
  1840.  
  1841. ;TODO
  1842. p48
  1843.         EXX
  1844.         LD H,D
  1845.         ld L,E
  1846.         LD BC,(disp)
  1847.         LD A,(curPG)
  1848.         SBC HL,BC
  1849.         SET 7,H
  1850. p48sz=$-p48
  1851.  
  1852. PRAUTH
  1853.         call RST16
  1854.         ;DB "UNRAR",v1,".",v2,v3,"lite",#D,#a
  1855.         db "v = view, e = extract, m = set mask, q = quit"
  1856.         ;DB "4=48",#D,#a
  1857.         ;DB "other keys=1M"
  1858.         db 0
  1859.         if 1==0
  1860.         CALL IYKEY
  1861.         OR 32
  1862.         CP "4"
  1863.         JR NZ,Npatch48
  1864.        LD HL,GPmem+GPmemsz-p48sz
  1865.        LD (GPaddrpatch),HL
  1866.        EX DE,HL
  1867.         LD HL,p48
  1868.         LD BC,p48sz
  1869.         LDIR
  1870.        LD A,201
  1871.        LD (OUTME),A
  1872.        ;LD (hobetasym),A ;no hobeta
  1873.         xor a
  1874.        JR patch2
  1875.        endif
  1876. Npatch48
  1877.         LD C,64;64-2;+1 ;число страниц памяти?
  1878.         LD A,C
  1879.         LD (_p1+1),A ;изначально там INITIALMEMPAGES;6
  1880. patch2
  1881.         LD (_4+1),A
  1882.         LD (_3+1),A
  1883.         LD (_5+1),A
  1884.         ;LD (_6+1),A
  1885.        LD (L_pg+1),A
  1886.         NEG
  1887.         LD L,A
  1888.         ld H,-1
  1889.         INC HL
  1890.         dup 6
  1891.         add hl,hl
  1892.         edup
  1893.         LD DE,THEEND/256-256
  1894.         ADD HL,DE
  1895.         LD (_2+1),HL
  1896.         RET
  1897.  
  1898.         ;DISPLAY /T,konec,"(",CODETOP,")"
  1899.