?login_element?

Subversion Repositories NedoOS

Rev

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

  1.  
  2. depack        
  3. ;       JR NOSTART_
  4. ;START_
  5. ;YESAUTOEX=$+1
  6. ;       LD A,0
  7. ;       CP "U
  8. ;       JP Z,QUIT_
  9. ;NOSTART_
  10.         LD (exit_sp),SP
  11. START_1
  12.         ;LD SP,#5FE6
  13.         if 1==0
  14.         LD HL,ANYKEY_P
  15.         LD (MOD1+1),HL
  16.         LD A,#C3
  17.         LD HL,START_
  18.         LD (MOD2),A
  19.         LD (MOD2+1),HL
  20.         LD HL,SPISOK+1
  21.         LD (UKAZ1),HL
  22.         ;XOR A
  23.         ;LD (NO_HOB),A
  24.         ;LD (HOB),A
  25.         LD HL,T_KEY
  26.         LD (MODECAT+1),HL
  27.         CALL PRCAT
  28.  
  29.         LD A,#4F
  30.         LD (TEKATR+1),A
  31.         LD HL,0
  32.         LD DE,#440
  33.         CALL RAMKA
  34.         LD HL,T6935
  35.         CALL PRINTS_
  36.         LD HL,T6935_
  37.         CALL PRINTS_
  38.         endif
  39.        
  40. ;MANYF   LD HL,0
  41. ;        LD (ML_FLEN),HL
  42. ;        LD (ML_FLEN+1),HL
  43.         ;CALL CLS_LINE
  44.        if READZIPDIR
  45.         ;jr $
  46.         CALL PROWERKA ;ищем central directory, достаём таблицу файлов в CAT, заполняем переменные про файл
  47.        
  48.         if 1==0
  49.         LD A,(SKIPING)
  50.         OR A
  51.         JR Z,NOSKIP1
  52.         LD HL,T_KEY1
  53.         LD (MODECAT+1),HL
  54.         CALL VIEWCAT
  55.         LD A,#4F
  56.         LD (TEKATR+1),A
  57.         LD HL,0
  58.         LD DE,#440
  59.         CALL RAMKA
  60.         LD HL,T6935
  61.         CALL PRINTS_
  62.         LD HL,T6935_
  63.         CALL PRINTS_
  64.         LD HL,#400
  65.         LD DE,#C40
  66.         CALL RAMKA
  67. NOSKIP1
  68.         endif
  69.        
  70.         ;LD A,1
  71.         ;LD (D_INST),A ;это было для инициализации TR-DOS после смены диска
  72.  
  73.         LD DE,0
  74. LEN_KOM=$-2
  75.         LD A,D
  76.         OR E
  77.         JR Z,PR700
  78.         LD HL,#4000
  79.         OR A
  80.         SBC HL,DE
  81.         JR C,PR700 ;комментарий > 0x4000?
  82.         EX DE,HL
  83.         LD DE,0 ;size of central directory
  84. SM1=$-2
  85.        if SEEK32BIT
  86.         LD HL,(SME_ML) ;start of central directory
  87.         ADD HL,DE
  88.        push hl
  89.         LD bc,0
  90. SM2w=$-2
  91.         LD hl,(SME_STw)
  92.         ADC hl,bc
  93.         ld b,h
  94.         ld c,l
  95.        pop hl
  96.         LD DE,#16
  97.         ADD HL,DE
  98.         jr nc,$+3
  99.         inc bc
  100. ;bchl=position in file
  101.        else
  102.         LD C,0
  103. SM2=$-1
  104.         LD HL,(SME_ML) ;start of central directory
  105.         LD A,(SME_ST)
  106.         ADD HL,DE
  107.         ADC A,C
  108.         LD DE,#16
  109.        LD C,0
  110.         ADD HL,DE
  111.         ADC A,C
  112. ;ahl=position in file
  113.        endif
  114.         LD IX,BUFER
  115.         LD DE,(LEN_KOM) ;комментарий может быть до 0x4000 (реально формат позволяет больше)
  116.         CALL READ
  117.  
  118.         ;LD HL,TEXT20
  119.         ;CALL PRINTS_
  120.        endif
  121.  
  122.         if 1==0
  123.         LD A,0
  124. MEN=$-1
  125.         OR A
  126.         JR Z,NM1
  127.         CALL INS_DEST
  128.  
  129. NM1     LD A,(DESTIN)
  130.         CP "*"
  131.         JR NZ,$+5
  132.         LD A,(SOURCE)
  133.         SUB #41
  134.         LD C,1
  135.         CALL TRDOS
  136.         LD C,#18
  137.         CALL TRDOS
  138.         LD HL,FNAME1
  139.         LD DE,23773
  140.         LD BC,9
  141.         LDIR
  142.         LD HL,BUFER
  143.         LD DE,(LEN_KOM)
  144.         LD C,#B
  145.         CALL TRDOS
  146.         LD A,(MEN)
  147.         OR A
  148.        JR Z,PR700
  149.        CALL INS_SOURC
  150.         endif
  151. PR700  
  152.         ;LD HL,TEXT21
  153.         ;CALL PRINTS_
  154.        
  155.         LD HL,0
  156. KOL_F=$-2
  157.         ;XOR A
  158.         ;LD IX,T_BUF
  159.         ;CALL DS100
  160.         ;LD HL,T_KOL_F
  161.         ;CALL PRINTS_
  162.  
  163. nextfile
  164.            ;LD A,5
  165.            ;call ON_BANK
  166.        
  167.         LD HL,0 ;start of central directory (сделал, чтобы он обновлялся с каждым новым файлом)
  168. SME_ML=$-2
  169.        if SEEK32BIT
  170.         LD bc,0
  171. SME_STw=$-2
  172. ;bchl=position in file
  173.        else
  174.         LD A,0
  175. SME_ST=$-1
  176. ;ahl=position in file
  177.        endif
  178.         ;EXA
  179.  
  180.         if 1==0
  181.         LD BC,(KOL_F)
  182.         LD A,C
  183.         LD (F_KOL),A
  184. Z6013   PUSH BC
  185.         LD A,0
  186. F_KOL=$-1
  187.         SUB C
  188.  
  189.         INC A
  190.         LD (NUM_F),A ;номер файла
  191.         endif
  192.        
  193.         if 1==0
  194.         PUSH HL
  195.         LD HL,#71A ;координаты
  196.         LD (COR),HL
  197.         LD B,13
  198. CLS1    PUSH BC
  199.         LD A,#20
  200.         CALL PR
  201.         POP BC
  202.         DJNZ CLS1
  203.         POP HL
  204.         endif
  205.  
  206.        if SEEK32BIT
  207. ;bchl=position in file
  208.        else
  209.         ;EXA
  210.         LD B,A ;SME_ST
  211. ;ahl=position in file
  212.        endif
  213.  
  214. ;куда сейчас указывает указатель в архиве?
  215. ;с READZIPDIR на начало директории
  216. ;без READZIPDIR на 0
  217.         ;jr $
  218.         LD IX,BUFER
  219.         LD DE,#2E
  220.         ;LD C,41 ;???
  221.         CALL READ ;читаем описатель одного файла
  222.  
  223.         if 1==0
  224.         EXX
  225.         LD A,(BUFER+#24)
  226.         LD HL,CODE
  227.        BIT 0,A
  228.        JR Z,LL20
  229.         LD HL,TEXT
  230. LL20    LD DE,T_TYPE
  231.         LD BC,4
  232.         LDIR
  233.         EXX
  234.         endif
  235.  
  236.        if SEEK32BIT
  237.         ADD HL,DE
  238.         jr nc,$+3
  239.         inc bc
  240. ;bchl=position in file
  241.        else
  242.         LD A,B ;SME_ST на начало описателя
  243.         ADD HL,DE ;de=0x002e
  244.         ADC A,D;=0 ;перемещаем указатель на имя
  245. ;ahl=position in file
  246.         LD B,A
  247.        endif
  248.  
  249.         LD DE,(Z6638) ;file name length
  250.         LD IX,Z664A
  251.         CALL READ ;читаем имя файла
  252. ;Z664A=ИMЯ TEKУЩEГO ФAЙЛА B APXИBE
  253.         ADD IX,DE
  254.         LD (IX),0 ;кладём 0 в конец имени (получится ASCIIZ)
  255.  
  256.        if SEEK32BIT
  257.         ADD HL,DE
  258.         jr nc,$+3
  259.         inc bc
  260. ;bchl=position in file
  261.        else
  262.         LD A,B
  263.         ADD HL,DE
  264.         ADC A,0 ;перемещаем указатель после имени
  265. ;ahl=position in file
  266.        endif
  267.  
  268.        if 0 ;???
  269.         LD B,E
  270.        DEC D
  271.        INC D
  272.         JR Z,Z604D ;длина имени <256
  273.        LD B,0 ;длина имени >=256, считаем, что 256
  274. Z604D
  275.        endif
  276.         LD DE,(Z663A) ;extra field length
  277.         ADD HL,DE ;пропускаем extra field
  278.        if SEEK32BIT
  279.         jr nc,$+3
  280.         inc bc
  281. ;bchl=position in file
  282.        else
  283.        ADC A,0
  284. ;ahl=position in file
  285.        endif
  286.         LD DE,(Z663C) ;file comment length
  287.         ADD HL,DE ;пропускаем file comment length
  288.        if SEEK32BIT
  289.         jr nc,$+3
  290.         inc bc
  291. ;bchl=position in file
  292.        else
  293.        ADC A,0
  294. ;ahl=position in file
  295.        endif
  296.  
  297.        ld (SME_ML),hl
  298.        if SEEK32BIT
  299.        ld (SME_STw),bc
  300.        else
  301.        ld (SME_ST),a
  302.        endif
  303.        
  304. ;сформировать filename 8.3 (во всех элементах):
  305.         ld hl,Z664A
  306.         ld de,filename
  307.         ;call strcopy
  308.         call copyname83
  309. ; если это директория, то create directory (например, "md scr/1" без слеша в конце):
  310. ; это только для пустых директорий! nedoos-1.zip не содержит записи о директориях с файлами (в отличие от .tar)
  311.  
  312.         ;LD A,(T6624) ;flags
  313.         ;and 8 ;TODO где этот флаг?
  314.         ;jr nz,readzip_nodir
  315. ;убираем слеш в конце
  316.         ld hl,filename
  317.         push hl
  318.         pop de ;ld de,filename
  319.         xor a
  320.         ld b,-1
  321.         cpir
  322.         ld a,'/'
  323.         dec hl ;на терминаторе
  324.         dec hl ;перед терминатором
  325.         sub (hl)
  326.         jr nz,readzip_nodir;$+3
  327.         ld (hl),a ;0
  328.         OS_MKDIR
  329.         jp SKIP_noclose
  330. readzip_nodir
  331.         ld hl,Z664A;filename
  332.         call prtext
  333.         call prcrlf
  334.        
  335.         if 1==0
  336.        
  337.         LD HL,#5CE5
  338.         LD DE,T_PKT
  339.         LD B,3
  340.         CALL PROVERK
  341.         JR C,NX600
  342.         LD A,"C"
  343.         LD (#5CE5),A
  344.         LD A,(#5CDD)
  345.         CP "0"
  346.         JR C,$+6
  347.         CP ":"
  348.         JR NC,NX600
  349.         AND 7
  350.         OR #30
  351.         LD (#5CDD),A
  352. NX600
  353.         endif
  354.        
  355.         if 1==0
  356.         LD A,(SKIPING)
  357.        OR A
  358.         JR Z,NOSKIP
  359.        LD A,(NUM_F)
  360.        LD L,A
  361.         LD H,MARKBUF/256
  362.        LD A,(HL)
  363.        AND A
  364.         JP Z,SKIP_noclose
  365. NOSKIP  
  366.         endif
  367.         if 1==0
  368.         LD IX,T_TEK
  369.         LD HL,0
  370. NUM_F=$-2
  371.         CALL DS100
  372.         LD HL,T_FILE
  373.         CALL PRINTS_
  374.         endif
  375.  
  376.         ;LD HL,#71A ;координаты
  377.         ;LD (COR),HL
  378.         ;LD HL,T61F7
  379.         ;CALL PRINTS
  380.         ;LD A,#4F
  381.         ;LD (TEKATR+1),A
  382.        
  383.         ;XOR A
  384.  
  385.         LD HL,-1
  386.         LD (ML_CRC32),HL
  387.         LD (ST_CRC32),HL
  388.  
  389.         LD HL,(Z6634) ;внутри BUFER
  390.         ;OR H
  391.         ;OR L
  392.         LD (ML_LEN_ISH),HL
  393.  
  394. ;HL= МЛАДШИE БAЙTЫ ДЛИHЫ ИCXOДHOГO ФAЙЛA
  395.         LD HL,(Z6636) ;внутри BUFER
  396.         ;OR H
  397.         ;OR L
  398.         LD (ST_LEN_ISH),HL
  399.  
  400. ;HL= CTAPШИE БAЙТЫ ДЛИНЫ ИCXOДHOГO ФAЙЛA
  401.         ;JP Z,SKIP_noclose; HУЛЕВАЯ ДЛИHA (теперь проверяется ниже, чтобы создать файл)
  402.  
  403.         ;LD A,L
  404.         ;LD HL,(ML_LEN_ISH)
  405.         ;LD IX,T_ORIG
  406.         ;CALL DES_
  407.  
  408.         LD HL,T6628 ;file last modification time ;внутри BUFER
  409.         LD DE,T6221
  410.         LD BC,8
  411.         LDIR ;??? TODO установить дату после распаковки
  412.  
  413.         LD A,(T6624) ;flags ;внутри BUFER
  414.         RRA
  415.         JR NC,Z60E3
  416.  
  417. ;ФAЙЛ 3AKOДИPOBAH
  418.         LD A,3
  419.         LD (FLAGS),A ;CRYPTED
  420.  
  421. Z60E3   LD HL,(T6626) ;внутри BUFER
  422.  
  423. ;T6626=METOД CЖATИЯ: 0:STORED, 8:DEFLATE, others unknown
  424.         LD A,H
  425.         OR A
  426.         JR NZ,Z60F1
  427.         OR L
  428.         JR Z,Z60FC
  429.         CP 8
  430.         JR Z,Z60FC
  431.  
  432. Z60F1   ;LD HL,UNKNOWN
  433.         ;LD DE,T_METOD
  434.         ;LD BC,7
  435.         ;LDIR
  436.         LD A,2
  437.         LD (FLAGS),A ;UNKNOWN (число в A не должно совпадать с 0 или 8!)
  438.         ;JR UNK_
  439.  
  440. Z60FC  
  441.         if 1==0
  442.         BIT 3,A
  443.         LD HL,STORED
  444.         JR Z,ST_
  445.         LD HL,DEFLATE
  446. ST_     LD DE,T_METOD
  447.         LD BC,7
  448.         LDIR
  449.         endif
  450.  
  451. UNK_    PUSH AF ;0:STORED, 8:DEFLATE, others unknown ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  452.         ;LD HL,(Z6630)
  453.         ;LD A,(Z6632)
  454.  
  455. ;A,HL= ДЛИHA CЖATOГO ФAЙЛА
  456.         ;LD (ML_PAC_LEN),HL
  457.         ;LD (ST_PAC_LEN),A
  458.        
  459.         if 1==0
  460.         LD IX,T_PACK
  461.         CALL DES_
  462.         LD B,4
  463.         LD HL,CRC_ISH+3
  464.         LD DE,T_CRC
  465. L100    LD A,(HL)
  466.         CALL HEX
  467.         DEC HL
  468.         DJNZ L100
  469.  
  470.         CALL T_IND ;инициализация процентомера?
  471.  
  472.         LD HL,0 ;текущий размер файла для процентомера
  473.         LD (B1),HL
  474.         LD (B2),HL
  475.         endif
  476.  
  477.         ;CALL DATA_COR ;печать даты?
  478.  
  479.         ;LD HL,T_PACK_L
  480.         ;CALL PRINTS_
  481.  
  482. FLAGS=$+1
  483.         LD A,0;(FLAGS) ;2:UNKNOWN, 3:CRYPTED, other=OK (формируется выше)
  484.         ;LD HL,T_UNK
  485.         CP 2
  486.         JR Z,SK__
  487.  
  488.         ;LD HL,T_CRYPT
  489.         CP 3;:JR Z,SK__
  490.  
  491. ;LD A,(SKIPING):OR A;JR Z,PROD10
  492.         JR NZ,PROD10
  493. SK__    ;CALL PRINTS_
  494.         ;CALL KEY10_
  495.         POP AF ;TODO убрать
  496.         JP SKIP_noclose
  497.  
  498. PROD10  
  499.         if 1==0
  500.         LD HL,#5CE5
  501.         LD DE,T_TRD
  502.         LD B,3
  503.         CALL PROVERK
  504.  
  505.         JR C,NXSCL
  506.         LD HL,TRDOBR
  507.         CALL PRINTS_
  508.  
  509. KEY11   XOR A
  510.        LD (#5C08),A
  511.         EI
  512.         HALT
  513.        LD A,(#5C08)
  514.        OR A
  515.         JR Z,KEY11
  516.         CP "Y"
  517.         JR Z,nX601_
  518.         CP 13
  519.        JR NZ,NX601
  520. nX601_
  521.         XOR A
  522.         LD (MEN),A
  523.         LD A,(DESTIN)
  524.         CP "*"
  525.         JR Z,MEN100
  526.        LD A,(DESTIN)
  527.        LD L,A
  528.         LD A,(SOURCE)
  529.        CP L
  530.         JR NZ,MEN100
  531.        LD A,1
  532.         LD (MEN),A
  533. MEN100
  534.         LD A,#C3
  535.         LD (SAVE),A
  536.         LD HL,SAVETRD
  537.         LD (SAVE+1),HL
  538.         LD HL,0
  539.         LD (TRK_SECT),HL
  540.  
  541.         JR NX602
  542. NXSCL
  543.         LD HL,#5CE5
  544.         LD DE,T_SCL
  545.         LD B,3
  546.         CALL PROVERK
  547.  
  548.         JR C,NX601
  549. ;EXTRACTING FROM SCL
  550.  
  551.        IF 1==1
  552.         LD HL,SCLOBR
  553.         CALL PRINTS_
  554.  
  555. KEY11S  XOR A
  556.        LD (#5C08),A
  557.         EI
  558.         HALT
  559.        LD A,(#5C08)
  560.        OR A
  561.         JR Z,KEY11S
  562.         CP "Y"
  563.         JR Z,nX601_S
  564.         CP 13
  565.        JR NZ,NX601
  566. nX601_S
  567.         LD A,"S"
  568.         LD (YESSCL),A
  569.        ELSE
  570.        LD A,#C3
  571.        LD (SAVE),A
  572.        LD HL,SAVESCL
  573.        LD (SAVE+1),HL
  574.        LD HL,0
  575.        LD (TRK_SECT),HL
  576.        JR NX602
  577.        ENDIF
  578.        
  579. ;NORMAL FILE (NOT TRD OR SCL)
  580. NX601   LD A,#3E
  581.         LD (SAVE),A
  582.         LD HL,#CD04
  583.         LD (SAVE+1),HL
  584.  
  585.        endif
  586.        
  587.         if 1==0
  588.         LD A,(ST_LEN_ISH)
  589.         OR A
  590.         JR NZ,NX602
  591.         LD HL,(ML_LEN_ISH)
  592.        LD DE,#FF12
  593.        OR A
  594.        SBC HL,DE
  595.         JR NC,NX602
  596.         LD A,(#5CE5)
  597.         CP "$"
  598.         JR NZ,NX602
  599.         LD (HOB),A
  600. NX602  
  601.         endif
  602.  
  603.         LD HL,(Z6646) ;Relative offset of local file header. This is the number of bytes between the start of the first disk on which the file occurs, and the start of the local file header. This allows software reading the central directory to locate the position of the file inside the ZIP file.
  604.        if SEEK32BIT
  605.         LD bc,(Z6648)
  606. ;bchl=position in file
  607.        else
  608.         LD A,(Z6648)
  609. ;ahl=position in file
  610.        endif
  611.         ;jr $
  612.  
  613. ;position in file = CMEЩEHИE ДO ЛOKAЛЬНOГO 3AГОЛОBKA
  614.         LD IX,BUFER
  615.         LD DE,#1E
  616.        if SEEK32BIT
  617.        else
  618.         ;LD C,#29 ;???
  619.         LD B,A
  620.        endif
  621.         CALL READ
  622.  
  623.        if SEEK32BIT
  624.         ADD HL,DE
  625.         jr nc,$+3
  626.         inc bc
  627.        else
  628.         XOR A
  629.         ADD HL,DE
  630.         ADC A,B
  631.        endif
  632.         LD DE,(Z6636)
  633. ;DE= ДЛИНA ИMEHИ ФAЙЛA
  634.         ADD HL,DE
  635.        if SEEK32BIT
  636.         jr nc,$+3
  637.         inc bc
  638.        else
  639.         ADC A,0
  640.        endif
  641.         LD DE,(Z6638)
  642. ;DE= ДOПOЛHИTEЛЬНOE ПOЛE ДЛИНЫ
  643.         ADD HL,DE
  644.        if SEEK32BIT
  645.         jr nc,$+3
  646.         inc bc
  647.        else
  648.         ADC A,0
  649.        endif
  650.         ;LD (Z634C),HL ;текущая позиция чтения в файле
  651.         ;LD (Z634F),A;bc
  652.  
  653. ;теперь физически установим указатель файла туда
  654.        if SEEK32BIT
  655.         ld d,b
  656.         ld e,c
  657.        else
  658.         ld d,0
  659.         ld e,a
  660.        endif
  661.         ;dehl=shift
  662.         ld a,(filehandle)
  663.         ld b,a
  664.         OS_SEEKHANDLE
  665.        
  666.         call SAVECREATE
  667.  
  668.         LD hl,(ML_LEN_ISH)
  669.         ld a,h
  670.         or l
  671.         LD hl,(ST_LEN_ISH)
  672.         or h
  673.         or l
  674.         jr z,SKIP ;файл нулевой длины
  675.        
  676.        LD IY,DISKBUF+DISKBUFsz-1
  677.        
  678.         ;LD HL,0
  679.         ;LD (T622D),HL
  680.         ;LD (T622E),HL
  681.        
  682. ;DEPACK
  683.        LD HL,0
  684.        LD (U6546),HL ;сколько байт сохранить = текущий адрес в буфере
  685.        
  686.         POP BC ;0:STORED, 8:DEFLATE, others unknown ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  687.        
  688.         BIT 3,B
  689.         ;LD (inflateq_sp),SP ;??? TODO
  690.         CALL Z635E ;nz=INFLATING
  691.        ;LD A,(YESSCL)
  692.        ;CP "S
  693.        ;CALL Z,DESCLPP
  694.        ; XOR A
  695.        ;LD (YESSCL),A
  696.         ;LD (NO_HOB),A
  697.         ;LD (HOB),A
  698.         LD A,(CRC32_)
  699.         CP #C9
  700.         JR Z,SKIP
  701.         LD HL,ML_CRC32
  702.         LD DE,CRC_ISH
  703.         LD B,4
  704. Z6159   LD A,(DE)
  705.         XOR (HL)
  706.         INC HL
  707.         inc DE
  708.         inc A
  709. C1      JR NZ,crcerror;Z6164
  710.         DJNZ Z6159
  711.         JR SKIP
  712.  
  713. crcerror;Z6164
  714. ;CRC ERROR
  715.         ;CALL E_CRC ;!!!!!!!!!!
  716.         ld hl,tcrcerror
  717.         call prtext
  718.  
  719. SKIP
  720. readerror
  721.         call SAVECLOSE
  722. SKIP_noclose
  723.         ld bc,(KOL_F)
  724.         cpi
  725.         ld (KOL_F),bc
  726.         ld sp,(exit_sp)
  727.         jp pe,nextfile
  728.  
  729. E_ZIP
  730. EXIT
  731. exit_sp=$+1
  732.         LD SP,#3131
  733.          ret
  734.  
  735. BUFCAT
  736.         dw 0
  737. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  738.  
  739.        if READZIPDIR
  740. PROWERKA
  741.         if 1==0
  742.         LD A,#4F
  743.         LD (TEKATR+1),A
  744.         LD HL,#400
  745.         LD DE,#C40
  746.         CALL RAMKA
  747.  
  748.         LD HL,FNAME
  749.         LD DE,T6927
  750.         LD BC,8
  751.         LDIR
  752.         LD A,"."
  753.         LD (DE),A
  754.         INC DE
  755.         LDI
  756.         LD A,(HL)
  757.         CP #20
  758.         JR C,NOEXN
  759.         INC HL
  760.         LD A,(HL)
  761.         DEC HL
  762.         CP #20
  763.         JR C,NOEXN
  764.         LDI
  765.         LDI
  766.         JR NOEXN+5
  767. NOEXN   LD A,#20
  768.         LD (DE),A
  769.         INC DE
  770.         LD (DE),A
  771.  
  772.         LD HL,FNAME
  773.         LD DE,N_ARC
  774.         LD BC,8
  775.         LDIR
  776.        LD A,"."
  777.        LD (DE),A
  778.        INC DE
  779.        LDI
  780.        LD A,(HL)
  781.        CP #20
  782.        JR C,NOEHN
  783.        INC HL
  784.        LD A,(HL)
  785.        DEC HL
  786.        CP #20
  787.        JR C,NOEHN
  788.        LDI
  789.        LDI
  790.        JR NOEHN+5
  791. NOEHN  LD A,#20
  792.        LD (DE),A
  793.        INC DE
  794.        LD (DE),A
  795.  
  796.         LD HL,T6918
  797.         CALL PRINTS_
  798.        
  799.         endif
  800.        
  801.         ;CALL F_OPEN
  802.         LD HL,CAT
  803.         LD DE,CAT+1
  804.         LD BC,#63F
  805.         LD (HL),0
  806.         LDIR ;TODO убрать
  807.         LD HL,CAT
  808.         LD (BUFCAT),HL
  809.  
  810. ;ПPOBEPKA APXИBA
  811.  
  812. ;каталог лежит в конце файла, как до него добраться?
  813.  
  814. ;Z66FA
  815. ;a=??? после F_OPEN (!=0 разрешает искать назад -0x800 даже в маленьком файле любого размера) TODO
  816.        if SEEK32BIT
  817.         LD bc,(ST_FLENw)
  818.        else
  819.         LD A,(ST_FLEN)
  820.        endif
  821.         LD HL,(ML_FLEN) ;ahl(bchl)=длина файла
  822.         LD DE,#800
  823.        if SEEK32BIT
  824.          ld a,b
  825.          or c
  826.        else
  827.          OR A
  828.        endif
  829.          JR NZ,Z6727 ;длина файла >=0x10000
  830.         LD A,H
  831.         CP 8
  832.        if SEEK32BIT
  833.        else
  834.         LD A,E;0
  835.        endif
  836.         JR NC,Z6727 ;длина файла >=0x800, так что начнём поиск с длина файла-0x800
  837.        if SEEK32BIT
  838.         xor a
  839.        endif
  840.         OR H
  841.         JR NZ,Z6714
  842. ;длина файла < 0x100
  843.         LD A,L
  844.         CP #64
  845.         jp C,Z6780 ;длина файла < 0x64 - нет ни одного файла, ошибка
  846. Z6714   PUSH HL
  847.         XOR A
  848.         LD HL,BUFER
  849.         LD DE,BUFER+1
  850.         LD (HL),A
  851.         LD BC,#7FF
  852.         LDIR ;очистили буфер, чтобы случайно не найти end of central directory не там
  853.         POP DE
  854. Z6723 ;ищем в начале файла
  855.         LD L,A
  856.         LD H,A
  857.        if SEEK32BIT
  858.         ld c,a
  859.         ld b,a
  860.        endif
  861.         JR _Z672A
  862.  
  863. Z6727   SBC HL,DE
  864.        if SEEK32BIT
  865.         jr nc,$+3
  866.         dec bc
  867.        else
  868.         SBC A,E ;=0
  869.        endif
  870.  
  871. _Z672A
  872.        if SEEK32BIT
  873.        else
  874.         LD B,A
  875.        endif      
  876.         LD IX,BUFER
  877.         ;de=0x800
  878.         CALL LOAD_B ;поиск блока end of central directory
  879.        if SEEK32BIT
  880.         JR Z,Z6747 ;end of central directory
  881.         ld a,b
  882.         or c
  883.         OR L
  884.         OR H
  885.         JR Z,Z6780 ;дошли до начала файла, а end of central directory не нашли
  886.         push bc ;de занято
  887.         LD BC,#7EA ;смещаем указатель файла назад почти на 0x800
  888.         SBC HL,BC
  889.         pop bc
  890.         jr nc,_Z672A ;ищем назад
  891.         ld a,c
  892.         sbc a,0
  893.         ld c,a
  894.         ld a,b
  895.         sbc a,0
  896.         ld b,a
  897.         JR NC,_Z672A ;ищем назад
  898.         XOR A
  899.         JR Z6723 ;ищем в начале файла
  900.        else
  901.         LD A,B
  902.         JR Z,Z6747 ;end of central directory
  903.         OR L
  904.         OR H
  905.         JR Z,Z6780 ;дошли до начала файла, а end of central directory не нашли
  906.         LD A,B
  907.         LD BC,#7EA ;смещаем указатель файла назад почти на 0x800
  908.         SBC HL,BC
  909.         SBC A,0
  910.         JR NC,_Z672A ;ищем назад
  911.         XOR A
  912.         JR Z6723 ;ищем в начале файла
  913.        endif      
  914.  
  915. Z6747
  916. ;нашли end of central directory (ix = адрес этого блока в BUFER+)
  917.        if SEEK32BIT
  918.         push ix
  919.         pop de
  920.         ADD HL,de
  921.         jr nc,$+3
  922.         inc bc
  923.         or a
  924.         LD de,BUFER
  925.         SBC HL,de
  926.         jr nc,$+3
  927.         dec bc
  928.        else
  929.         PUSH IX
  930.         POP BC
  931.         ADD HL,BC
  932.        ADC A,0
  933.         LD BC,BUFER
  934.         SBC HL,BC
  935.        SBC A,0 ;ahl=смещение end of central directory в файле
  936.        endif
  937.         LD (Z6896),HL ;текущее смещение в файле?
  938.        if SEEK32BIT
  939.         LD (Z6894w),bc
  940.        else
  941.         LD (Z6894),A
  942.         EX DE,HL ;de=текущее смещение в файле?
  943.        endif
  944.         LD H,(IX+#11)
  945.         LD L,(IX+#10) ;offset of start of central directory
  946.  
  947. ;МЛАДШИЕ БAЙTЫ CMEЩEHИЯ HAЧAЛА ЦEHTPAЛЬHOГO KATAЛOГA
  948.         LD (SME_ML),HL
  949.        if SEEK32BIT
  950.        else
  951.         LD (IX+2),A ;???
  952.        endif
  953.  
  954. ;CTAPШИЙ БAЙT CMEЩЕНИЯ
  955.        if SEEK32BIT
  956.         LD c,(IX+#12) ;offset of start of central directory HSB
  957.         LD b,(IX+#13)
  958.         LD (SME_STw),bc
  959.        else
  960.         LD A,(IX+#12) ;offset of start of central directory HSB
  961.         LD (SME_ST),A
  962.        endif
  963.        if SEEK32BIT
  964.         LD d,(IX+#D)
  965.         LD e,(IX+#C)
  966.         LD (SM1),de ;size of central directory
  967. ;de=ДЛИНA ЦEHTPAЛЬHOЙ ДИPEKTOPИИ, МЛАДШИЕ БAЙТЫ
  968.         add hl,de
  969.         ld a,c
  970.         adc a,(ix+#e)
  971.         ld c,a
  972.         ld a,b
  973.         adc a,(ix+#f)
  974.         ld b,a
  975.         ld de,(Z6896) ;de=текущее смещение в файле?
  976.         sbc hl,de
  977.         JR NZ,Z6780 ;конец central directory не соответствует смещению блока end of central directory - ошибка
  978.         ld hl,(Z6894w) ;текущее смещение в файле HSW?
  979.         sbc hl,bc
  980.         JR Z,Z6783 ;конец central directory соответствует смещению блока end of central directory
  981. Z6780  JP ERR_Z1 ;дошли до начала файла, а end of central directory не нашли
  982.        else
  983.         LD B,(IX+#D)
  984.         LD C,(IX+#C)
  985.         LD (SM1),BC ;size of central directory
  986. ;BC=ДЛИНA ЦEHTPAЛЬHOЙ ДИPEKTOPИИ, МЛАДШИЕ БAЙТЫ
  987.         ADD HL,BC
  988.         ADC A,(IX+#E) ;size of central directory HSB
  989.         XOR (IX+2) ;???
  990.         JR NZ,Z6780 ;конец central directory не соответствует смещению блока end of central directory - ошибка
  991.         SBC HL,DE ;de=текущее смещение в файле?
  992.         JR Z,Z6783 ;конец central directory соответствует смещению блока end of central directory
  993. Z6780  JP ERR_Z1 ;дошли до начала файла, а end of central directory не нашли
  994.        endif
  995.  
  996. Z6783   LD L,(IX+#14)
  997.         LD H,(IX+#15)
  998.         LD (LEN_KOM),HL
  999.  
  1000.        if SEEK32BIT
  1001.         LD c,(IX+#E)
  1002.         LD b,(IX+#F)
  1003.         LD (SM2w),bc ;size of central directory HSW
  1004.        else
  1005.         LD A,(IX+#E)
  1006.         LD (SM2),A ;size of central directory HSB
  1007.        endif
  1008.  
  1009.         LD e,(IX+#A)
  1010.         LD d,(IX+#B)
  1011.         LD H,(IX+9)
  1012.         LD L,(IX+8)
  1013. ;cy=0
  1014. ;de=ОБЩEE ЧИСЛO ФAЙЛОB B APXИBE
  1015. ;HL=ЧИСЛО 3AПИCEЙ B KATAЛOГE HA ЭTOM ДИCKE
  1016.         LD (KOL_F),HL
  1017.         SBC HL,de
  1018.         JP NZ,ERR_Z2
  1019.         LD HL,(SME_ML) ;start of central directory
  1020.        if SEEK32BIT
  1021.         LD bc,(SME_STw)
  1022.        else
  1023.         LD A,(SME_ST)
  1024.         EXA
  1025.        endif
  1026. Z679E   PUSH de ;ОБЩEE ЧИСЛO ФAЙЛОB B APXИBE
  1027.        if SEEK32BIT
  1028.        else
  1029.         EXA
  1030.         LD B,A
  1031.        endif
  1032.         LD A,1 ;тип сигнатуры
  1033.         LD DE,#2E
  1034.         LD IX,BUFER
  1035.         CALL Z6886 ;читаем блок и проверяем сигнатуру (выход по ошибке - ERR_Z1)
  1036.  
  1037.         LD A,(IX+#1D) ;A= старШИЙ БAЙT ДЛИНЫ ИMEHИ ФAЙЛА
  1038.         CP 2
  1039.         JP NC,ERR_Z3
  1040.         LD D,A
  1041.         LD E,(IX+#1C) ;DE=ДЛИНА ИMEHИ ФAЙЛА
  1042.         CALL Z68D9 ;сдвинуть указатель в файле bhl(bchl) на de байт и проверить, что не вышли за границу файла?
  1043.         LD D,(IX+#1F)
  1044.         LD E,(IX+#1E) ;DE=ДOПOЛНИTEЛЬHOE ПОЛE ДЛИHЫ
  1045.         CALL Z68D9 ;сдвинуть указатель в файле bhl(bchl) на de байт и проверить, что не вышли за границу файла?
  1046.         LD D,(IX+#21)
  1047.         LD E,(IX+#20) ;DE=ДЛИHA KOMEHTAPИЯ K ФAЙЛУ
  1048.         CALL Z68D9 ;сдвинуть указатель в файле bhl(bchl) на de байт и проверить, что не вышли за границу файла?
  1049.        PUSH BC
  1050.        push HL
  1051.        if SEEK32BIT
  1052.         LD c,(IX+#2c)
  1053.         LD b,(IX+#2d)
  1054.        else
  1055.         LD B,(IX+#2C)
  1056.        endif
  1057.         LD L,(IX+#2A)
  1058.         LD H,(IX+#2B)
  1059. ;bhl(bchl)=CMEЩEHИE OT HAЧAЛA ПEPBOГO ДИCKA C ЭTИM ФAЙЛOM
  1060. ;     ДO ЛОКАЛЬHOГO 3AГOЛOBKA.
  1061.         INC IX
  1062.         inc IX
  1063.         inc HX
  1064.         LD A,3 ;тип сигнатуры
  1065.         LD DE,#30
  1066.         CALL Z68B1 ;сдвигаем указатель bhl(bchl) на de байт, читаем и проверяем сигнатуру?
  1067.         PUSH IX
  1068.         POP HL
  1069.         LD DE,#1E
  1070.         ADD HL,DE
  1071.         LD (NAMEF3+1),HL
  1072.         LD E,(IX+#1A)
  1073.         LD D,(IX+#1B)
  1074.         ADD HL,DE
  1075.         LD DE,(BUFCAT)
  1076.          PUSH DE
  1077.          push DE
  1078.         LD A," "
  1079.         LD B,11
  1080.         LD (DE),A
  1081.         INC DE
  1082.         DJNZ $-2
  1083. NAMEF3  LD DE,0
  1084. NAMEF4  DEC HL
  1085.         PUSH HL
  1086.         AND A
  1087.         SBC HL,DE
  1088.         POP HL
  1089.        JR NC,NAMEF5
  1090.        EX DE,HL
  1091.        DEC HL
  1092.        JR NAMEF6
  1093.  
  1094. NAMEF5  LD A,(HL)
  1095.         CP "/"
  1096.         JR NZ,NAMEF4
  1097. NAMEF6   POP DE
  1098.         INC HL
  1099.         LD B,8
  1100. NAMEF2  LD A,(HL)
  1101.         INC HL
  1102.         CP "."
  1103.         JR Z,NAMEF1
  1104.         LD (DE),A
  1105.         INC DE
  1106.         DJNZ NAMEF2
  1107.         LD A,(HL)
  1108.         INC HL
  1109.         CP "."
  1110.         JR NZ,$-4
  1111. NAMEF1   POP DE
  1112.         LD B,8
  1113.         INC DE
  1114.         DJNZ $-1
  1115.        LD BC,3
  1116.         LDIR
  1117.         LD A,(IX+#16) ;uncompressed size
  1118.         LD (DE),A
  1119.         INC DE
  1120.         LD A,(IX+#17)
  1121.         LD (DE),A
  1122.         INC DE
  1123.         LD A,(IX+#18) ;FIXME для 32bit длины файла
  1124.         LD (DE),A
  1125.         INC DE
  1126.         inc DE
  1127.         inc DE
  1128.         EX DE,HL
  1129.         ;LD (BUFCAT),HL
  1130.         LD HL,#1E
  1131.         LD A,(IX+#1B) ;A=СТАРШИЙ БAЙT ДЛИHЫ имени ФAЙЛА
  1132.         CP 2
  1133.         JP NC,ERR_Z3
  1134.         LD D,A
  1135.         LD E,(IX+#1A) ;DE=ДЛИHA имени ФAЙЛА
  1136.         CALL Z68ED ;сдвинуть указатель в файле bhl(bchl) на de байт и проверить, что не вышли за границу файла?
  1137.         LD D,(IX+#1D)
  1138.         LD E,(IX+#1C) ;DE=extra field len
  1139.         CALL Z68ED ;сдвинуть указатель в файле bhl(bchl) на de байт и проверить, что не вышли за границу файла?
  1140.         LD D,(IX+#13)
  1141.         LD E,(IX+#12)
  1142.        if SEEK32BIT
  1143.         LD A,(IX+#15)
  1144.         ld (Z68EEhswb),a
  1145.        endif
  1146.         LD A,(IX+#14) ;<Z68EEhswb>A,DE=ДЛИHA CЖATOГO ФAЙЛA
  1147.         CALL Z68EE ;сдвинуть указатель в файле bhl(bchl) на <Z68EEhswb>ade байт и проверить, что не вышли за границу файла?
  1148.         LD A,(IX+#16)
  1149.         OR (IX+#17)
  1150.         OR (IX+#18)
  1151.         OR (IX+#19) ;ИCXOДHAЯ ДЛИHA ФAЙЛA
  1152.         EXA  ;файл длиной 0?
  1153.         PUSH IX
  1154.         POP HL
  1155.         LD BC,7
  1156.         ADD HL,BC
  1157.         RES 7,(IX+7)
  1158.  
  1159. ;METOД CЖATИЯ, CTAPШИЙ БAЙT
  1160.         LD B,#18-3
  1161. Z6825   LD A,(HL)
  1162.         DEC H
  1163.         SUB (HL) ;TODO что с чем сравниваем?
  1164.         JR NZ,ERR_Z1 ;глобальная ошибка zip-файла
  1165.         INC H
  1166.         inc HL
  1167.         DJNZ Z6825
  1168.        POP HL
  1169.        pop BC
  1170.        if SEEK32BIT
  1171.        else
  1172.         LD A,B
  1173.        endif
  1174.         POP de ;общее число файлов в архиве
  1175.         EXA  ;файл длиной 0?
  1176.         JR Z,Z6838 ;файл длиной 0?
  1177.         LD (Z683F),A ;файл длиной не 0?
  1178. Z6838   DEC de
  1179.         LD A,d
  1180.         OR e
  1181.         JP NZ,Z679E
  1182.  
  1183.         LD A,0
  1184. Z683F=$-1
  1185.         OR A
  1186.         RET NZ ;хоть один файл длиной не 0?
  1187. ;TODO файл длиной 0
  1188. ERR_Z1
  1189. ERR_Z2
  1190. ERR_Z3
  1191.         JP E_ZIP
  1192.  
  1193. ;поиск блока end of central directory
  1194. LOAD_B
  1195. ;bhl(bchl)=смещение в файле
  1196. ;ix=буфер
  1197. ;de=len
  1198. ;out: z=end of central directory, bhl=kept
  1199.         CALL READ
  1200.         PUSH BC
  1201.         LD BC,#7EA ;???
  1202.         ADD IX,BC
  1203. ;поиск заголовка блока
  1204. Z6861   LD A,#50 ;'P'
  1205.         CP (IX)
  1206.         JR NZ,Z687C
  1207.         LD A,#4B ;'K'
  1208.         CP (IX+1)
  1209.         JR NZ,Z687C
  1210.         LD A,5
  1211.         CP (IX+2)
  1212.         JR NZ,Z687C
  1213.         INC A
  1214.         CP (IX+3)
  1215.         JR Z,Z6884 ;05, 06 = end of central directory
  1216. Z687C   DEC BC
  1217.         DEC IX
  1218.         LD A,B
  1219.         OR C
  1220.         JR NZ,Z6861 ;поиск заголовка блока дальше
  1221.         DEC A ;-1, NZ
  1222. Z6884   POP BC
  1223.         RET
  1224.  
  1225. Z6886
  1226.        PUSH HL ;keep old position in file
  1227.        if SEEK32BIT
  1228.        push bc ;keep old position in file HSW
  1229.        endif
  1230.        push DE ;keep size
  1231.         LD (signaturetype),A
  1232.         ADD HL,DE
  1233.        if SEEK32BIT
  1234.        jr nc,$+3
  1235.        inc bc
  1236.        else
  1237.        LD A,B
  1238.        ADC A,0
  1239.         JR C,ERR_Z1 ;глобальная ошибка zip-файла
  1240.        endif
  1241.  
  1242.         EX DE,HL
  1243.  
  1244.        if SEEK32BIT
  1245. ;bcde=next position in file
  1246. Z6896=$+1
  1247.         LD HL,0
  1248.         or a
  1249.         SBC HL,DE ;это просто сравнение, результат не используется
  1250. Z6894w=$+1
  1251.         LD hl,0
  1252.         sbc hl,bc ;bcde=next position in file
  1253.         JR C,ERR_Z1 ;глобальная ошибка zip-файла
  1254.        else
  1255.         LD C,A
  1256. ;cde=next position in file
  1257. Z6894=$+1
  1258.         LD A,0
  1259. Z6896=$+1
  1260.         LD HL,0
  1261.         SBC HL,DE ;это просто сравнение, результат не используется
  1262.         SBC A,C
  1263.         JR C,ERR_Z1 ;глобальная ошибка zip-файла
  1264.        endif
  1265.  
  1266.         EX DE,HL
  1267.  
  1268.        if SEEK32BIT
  1269. ;bchl=next position in file
  1270.         ld (Z6886bc),bc
  1271.        POP DE ;size
  1272.        pop bc
  1273.        EX (SP),HL ;keep next position in file, get old position in file
  1274.         CALL READ
  1275.        POP HL
  1276. Z6886bc=$+1
  1277.        ld bc,0 ;bchl=next position in file
  1278.        else
  1279. ;chl=next position in file
  1280.        POP DE ;size
  1281.        EX (SP),HL ;keep next position in file, get old position in file
  1282.         LD A,B
  1283.        LD B,C
  1284.         CALL READ
  1285.        POP HL ;bhl=next position in file
  1286.        endif
  1287.         JR Z68AB
  1288.  
  1289. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1290. Z68AB   CALL checksignature;Z6901
  1291.         RET Z
  1292. Z68AF   JR ERR_Z1 ;глобальная ошибка zip-файла
  1293.  
  1294. Z68B1
  1295. ;сдвигаем указатель bhl(bchl) на de байт, читаем и проверяем сигнатуру?
  1296.        PUSH HL ;keep old position in file
  1297.        if SEEK32BIT
  1298.        push bc ;keep old position in file HSW
  1299.        endif
  1300.        push DE ;keep size
  1301.         LD (signaturetype),A
  1302.        ADD HL,DE
  1303.        if SEEK32BIT
  1304.         jr nc,$+3
  1305.         inc bc
  1306.        else
  1307.        LD A,B
  1308.        ADC A,0
  1309.         JR C,ERR_Z1 ;глобальная ошибка zip-файла
  1310.        endif
  1311.  
  1312.         EX DE,HL
  1313.  
  1314.        if SEEK32BIT
  1315. ;bcde=next position in file
  1316.         LD HL,(SME_ML) ;start of central directory
  1317.         or a
  1318.         SBC HL,DE ;это просто сравнение, результат не используется
  1319.         LD hl,(SME_STw)
  1320.         SBC hl,bc
  1321.         JR C,Z68AF ;глобальная ошибка zip-файла
  1322.        else
  1323.         LD C,A
  1324. ;cde=next position in file
  1325.         LD A,(SME_ST)
  1326.         LD HL,(SME_ML) ;start of central directory
  1327.         SBC HL,DE ;это просто сравнение, результат не используется
  1328.         SBC A,C
  1329.         JR C,Z68AF ;глобальная ошибка zip-файла
  1330.        endif
  1331.  
  1332.         EX DE,HL
  1333.  
  1334.        if SEEK32BIT
  1335. ;bchl=next position in file
  1336.         ld (Z68B1bc),bc
  1337.        POP DE ;size
  1338.        pop bc
  1339.        EX (SP),HL ;keep next position in file, get old position in file
  1340.         CALL READ
  1341.        POP HL
  1342. Z68B1bc=$+1
  1343.        ld bc,0 ;bchl=next position in file
  1344.        else
  1345. ;chl=next position in file
  1346.        POP DE ;size
  1347.        EX (SP),HL ;keep next position in file, get old position in file
  1348.         LD A,B
  1349.        LD B,C
  1350.         CALL READ
  1351.         POP HL ;bhl=next position in file
  1352.        endif
  1353.         JR Z68AB ;check signature
  1354.  
  1355. Z68D9
  1356. ;сдвинуть указатель в файле (bhl)bchl на de байт и проверить, что не вышли за границу файла?
  1357.         XOR A
  1358.         ADD HL,DE
  1359.        if SEEK32BIT
  1360.         ADC A,c
  1361.         ld c,a
  1362.         ld a,b
  1363.         adc a,0
  1364.         LD B,A
  1365.         JR C,Z68AF ;ERR_Z1 ;глобальная ошибка zip-файла
  1366.        else
  1367.         ADC A,B
  1368.         JR C,Z68AF ;ERR_Z1 ;глобальная ошибка zip-файла
  1369.         LD B,A
  1370.        endif
  1371.         EX DE,HL
  1372.        if SEEK32BIT
  1373.         LD HL,(Z6896) ;текущее смещение в файле?
  1374.         SBC HL,DE ;это просто сравнение, результат не используется
  1375.         LD hl,(Z6894w)
  1376.         SBC hl,bc
  1377.        else
  1378.         LD A,(Z6894)
  1379.         LD HL,(Z6896) ;текущее смещение в файле?
  1380.         SBC HL,DE ;это просто сравнение, результат не используется
  1381.         SBC A,B
  1382.        endif
  1383.         EX DE,HL
  1384.         RET NC
  1385.        JR Z68AF ;ERR_Z1 ;глобальная ошибка zip-файла
  1386.  
  1387. Z68ED
  1388. ;сдвинуть указатель в файле (bhl)bchl на de байт и проверить, что не вышли за границу файла?
  1389.         XOR A
  1390.        if SEEK32BIT
  1391.         ld (Z68EEhswb),a
  1392.        endif
  1393. Z68EE
  1394. ;сдвинуть указатель в файле (bhl)bchl на <Z68EEhswb>ade байт и проверить, что не вышли за границу файла?
  1395.         ADD HL,DE
  1396.        if SEEK32BIT
  1397.         ADC A,c
  1398.         ld c,a
  1399.         ld a,b
  1400. Z68EEhswb=$+1
  1401.         adc a,0
  1402.         LD B,A
  1403.         JR C,Z68AF ;ERR_Z1 ;глобальная ошибка zip-файла
  1404.        else
  1405.         ADC A,B
  1406.         JR C,Z68AF ;ERR_Z1 ;глобальная ошибка zip-файла
  1407.         LD B,A
  1408.        endif
  1409.         EX DE,HL
  1410.        if SEEK32BIT
  1411.         LD HL,(SME_ML) ;start of central directory
  1412.         SBC HL,DE ;это просто сравнение, результат не используется
  1413.         LD hl,(SME_STw)
  1414.         SBC hl,bc
  1415.        else
  1416.         LD A,(SME_ST)
  1417.         LD HL,(SME_ML) ;start of central directory
  1418.         SBC HL,DE ;это просто сравнение, результат не используется
  1419.         SBC A,B
  1420.        endif
  1421.         EX DE,HL
  1422.         RET NC
  1423.        JR Z68AF ;ERR_Z1 ;глобальная ошибка zip-файла
  1424.  
  1425. checksignature;Z6901
  1426.         LD A,#50
  1427.         CP (IX)
  1428.         RET NZ
  1429.         LD A,#4B
  1430.         CP (IX+1)
  1431.         RET NZ
  1432. signaturetype=$+1;Z690E
  1433.         LD A,0 ;тип сигнатуры: 03: local file header, 01: central directory file header, 07: optional data descriptor, 05: end of central directory
  1434.         CP (IX+2)
  1435.         RET NZ
  1436.         INC A
  1437.         CP (IX+3)
  1438.         RET  
  1439.        
  1440.       endif ;READZIPDIR
  1441.  
  1442.         if 1==0
  1443. Z631F  PUSH BC
  1444.        POP DE
  1445.         PUSH HL
  1446.         POP IX
  1447.         LD A,0
  1448. ST_PAC_LEN=$-1
  1449.         LD HL,0
  1450. ML_PAC_LEN=$-2
  1451.         OR A
  1452.         JR NZ,Z633D
  1453.         PUSH HL
  1454.         SBC HL,DE
  1455.         POP HL
  1456.         JR NC,Z633D
  1457.         LD E,L
  1458.         LD D,H
  1459. Z633D   OR A
  1460.         SBC HL,DE
  1461.         SBC A,0
  1462.         LD (ST_PAC_LEN),A ;FIXME for SEEK32BIT
  1463.         LD (ML_PAC_LEN),HL
  1464.         LD A,D
  1465.         OR E
  1466.         RET Z
  1467.         LD HL,0
  1468. Z634C=$-2
  1469.         LD A,0 ;FIXME for SEEK32BIT
  1470. Z634F=$-1
  1471.         LD B,A
  1472.         CALL READ
  1473.         XOR A
  1474.         ADD HL,DE
  1475.         ADC A,B
  1476.         LD (Z634C),HL
  1477.         LD (Z634F),A ;FIXME for SEEK32BIT
  1478.        ;CALL STOP_DRV
  1479.        RET
  1480.         else
  1481. ;Z634C
  1482. ;        dw 0
  1483. ;Z634F
  1484. ;        db 0
  1485.         endif
  1486.        
  1487. Z635E
  1488.         jp NZ,INFLATING
  1489. ;stored
  1490.          ld hl,tstored
  1491.          call prtext
  1492.         ;LD HL,PROCES
  1493.         ;CALL PRINTS_
  1494.            ;LD A,5
  1495.            ;call ON_BANK
  1496.         ld hl,(ML_LEN_ISH)
  1497.         ld a,(ST_LEN_ISH) ;FIXME
  1498.         ;ld c,a
  1499.         ;or h
  1500.         ;or l
  1501.         ;ld a,c
  1502.         ;jr z,storedq
  1503.         jr stored0go
  1504. stored0
  1505.         push af
  1506.         ;push hl
  1507.         ziprdbyte
  1508.         CALL SBYTE
  1509.         ;pop hl
  1510.         pop af
  1511. stored0go
  1512.         ld bc,1
  1513.         or a
  1514.         sbc hl,bc
  1515.         sbc a,b;0
  1516.         jr nc,stored0
  1517.            ;LD A,5
  1518.            ;call ON_BANK
  1519. ;storedq
  1520.         ;jp savelastblock;_ZD1C4 ;save whole buffer (end of file)
  1521.        
  1522. savelastblock;_ZD1C4
  1523.         ;jr $
  1524. ;save whole buffer
  1525. ;сюда попадаем в конце файла
  1526. ;       ld hl,tsavelast
  1527. ;       call prtext
  1528.         LD HL,(U6546)
  1529.         ;ld a,h
  1530.         ;cp 0x50
  1531.         ;jr z,$
  1532. savehlbytes;ZD1C7
  1533.         LD DE,0
  1534.         JP SAVE
  1535.  
  1536. saveblock;Z65B8
  1537. ;save whole buffer
  1538. ;сюда не попадаем на коротких файлах
  1539.         PUSH HL,DE,BC,AF
  1540.          ;push ix
  1541.          ;exx
  1542.          ;exa
  1543.          ;push af
  1544.          ;push bc
  1545.          ;push de
  1546.          ;push hl
  1547.          call progressbar
  1548.         ;LD A,5
  1549.         ;CALL ON_BANK
  1550.         LD HL,(Z6546) ;сколько байт сохранить
  1551.         LD (TD198),HL ;сколько байт сохраняли
  1552.         CALL savehlbytes;ZD1C7 ;SAVE hl bytes
  1553. ;hl=0
  1554.         LD (Z6546),HL ;сколько байт сохранить (=0)
  1555.         if 1==0 ;обновление размера для процентомера
  1556.         EX DE,HL
  1557.         LD HL,(TD198) ;сколько байт сохраняли
  1558.        AND A
  1559.         SBC HL,DE
  1560.         JR C,CON1 ;???
  1561.         LD DE,(B2)
  1562.         ADD HL,DE
  1563.         LD (B2),HL
  1564.        LD A,(B1)
  1565.        ADC A,0
  1566.        LD (B1),A
  1567. CON1
  1568.         endif
  1569.          ;pop hl
  1570.          ;pop de
  1571.          ;pop bc
  1572.          ;pop af
  1573.          ;exa
  1574.          ;exx
  1575.          ;pop ix
  1576.         POP AF,BC,DE,HL
  1577.         RET
  1578.  
  1579. tsaveblock
  1580.         db "  save block #",0
  1581. tsavelast
  1582.         db 13,10,"save last block",13,10,0
  1583.  
  1584.  
  1585. tstored
  1586.         db "stored",13,10,0
  1587.  
  1588. ST_LEN  DW 0
  1589.  
  1590. progressbar
  1591.         ld hl,tsaveblock
  1592.         call prtext
  1593.         ld hl,(blockCounter)
  1594.         inc hl
  1595.         ld (blockCounter),hl
  1596.         call toDecimal
  1597.         ld hl,decimalS
  1598.         call prtext
  1599.         call prcrlf
  1600.         ret
  1601. toDecimal               ;конвертирует 2 байта в 5 десятичных цифр
  1602.                                 ;на входе в HL число
  1603.         ld de,10000 ;десятки тысяч
  1604.         ld a,255
  1605. toDecimal10k                   
  1606.         and a
  1607.         sbc hl,de
  1608.         inc a
  1609.         jr nc,toDecimal10k
  1610.         add hl,de
  1611.         add a,48
  1612.         ld (decimalS),a
  1613.         ld de,1000 ;тысячи
  1614.         ld a,255
  1615. toDecimal1k                    
  1616.         and a
  1617.         sbc hl,de
  1618.         inc a
  1619.         jr nc,toDecimal1k
  1620.         add hl,de
  1621.         add a,48
  1622.         ld (decimalS+1),a
  1623.         ld de,100 ;сотни
  1624.         ld a,255
  1625. toDecimal01k                   
  1626.         and a
  1627.         sbc hl,de
  1628.         inc a
  1629.         jr nc,toDecimal01k
  1630.         add hl,de
  1631.         add a,48
  1632.         ld (decimalS+2),a
  1633.         ld de,10 ;десятки
  1634.         ld a,255
  1635. toDecimal001k                  
  1636.         and a
  1637.         sbc hl,de
  1638.         inc a
  1639.         jr nc,toDecimal001k
  1640.         add hl,de
  1641.         add a,48
  1642.         ld (decimalS+3),a
  1643.         ld de,1 ;единицы
  1644.         ld a,255
  1645. toDecimal0001k                 
  1646.         and a
  1647.         sbc hl,de
  1648.         inc a
  1649.         jr nc,toDecimal0001k
  1650.         add hl,de
  1651.         add a,48
  1652.         ld (decimalS+4),a              
  1653.         ret
  1654. decimalS
  1655.         ds 5 ;десятичные цифры
  1656.         db 0
  1657. blockCounter
  1658.         dw 0000
  1659.  
  1660.  
  1661.         if 1==0
  1662. INFLATING
  1663.         ;ld (inflateq_sp),sp
  1664.         ;LD HL,PROCES
  1665.         ;CALL PRINTS_
  1666.         ;LD A,5
  1667.         ;CALL ON_BANK
  1668.         CALL ZD140 ;init read buffer, inflate file
  1669.         ;LD A,4
  1670.         ;JP ON_BANK
  1671.         ret
  1672.         endif
  1673.  
  1674. depkqerror;B_TABL
  1675. ;ошибка в файле
  1676.         ;jr $
  1677.          ld hl,terror
  1678.          call prtext
  1679. ;save whole buffer (Z6546) байт и выйти
  1680. ;Z63B4
  1681. ;inflateq_sp=$+1;Z63B5=$+1
  1682. ;        LD SP,0
  1683.         ;LD HL,(Z6546) ;сколько байт сохранить = текущий адрес в буфере
  1684.         ;LD DE,0
  1685.         ;CALL SAVE
  1686.         call savelastblock
  1687.         ;LD A,4
  1688.         ;CALL ON_BANK
  1689.         ;CALL E_TABL
  1690.         JP SKIP ;восстанавливает sp
  1691. terror
  1692.         db "error",13,10,0
  1693.  
  1694. ;PAСЧET CRC-32
  1695. ;тут может быть патч RET (TODO)
  1696. ;a=byte
  1697. CRC32_  EXX
  1698.         LD DE,(ST_CRC32)
  1699.         LD HL,(ML_CRC32)
  1700. CRCPR_  XOR L
  1701.         LD B,H
  1702.         LD L,A
  1703.          LD H,TCRC/1024 ;#18
  1704.         ADD HL,HL
  1705.         ADD HL,HL
  1706.         LD A,B
  1707.         XOR (HL)
  1708.         LD C,A
  1709.         INC L
  1710.         LD A,E
  1711.         XOR (HL)
  1712.         LD B,A
  1713.         INC L
  1714.         LD A,D
  1715.         XOR (HL)
  1716.         LD E,A
  1717.         INC L
  1718.         LD D,(HL)
  1719.         LD (ST_CRC32),DE
  1720.         LD (ML_CRC32),BC
  1721.         EXX
  1722.         RET
  1723. ;ГEHEPAЦИЯ TAБЛИЦЫ ДЛЯ PAСЧETA CRC-32
  1724. initCRC
  1725.         LD IX,TCRC+#3FC
  1726.         LD C,0
  1727. Z669B   LD B,8
  1728.         LD DE,0
  1729.         LD H,D
  1730.         LD L,C
  1731.         DEC L
  1732. Z66A3   SRL D
  1733.         RR E
  1734.         RR H
  1735.         RR L
  1736.         JR NC,Z66BD
  1737.         LD A,#ED
  1738.         XOR D
  1739.         LD D,A
  1740.         LD A,#B8
  1741.         XOR E
  1742.         LD E,A
  1743.         LD A,#83
  1744.         XOR H
  1745.         LD H,A
  1746.         LD A,#20
  1747.         XOR L
  1748.         LD L,A
  1749. Z66BD   DJNZ Z66A3
  1750.         LD (IX),L
  1751.         LD (IX+1),H
  1752.         LD (IX+2),E
  1753.         LD (IX+3),D
  1754.         LD DE,-4
  1755.         ADD IX,DE
  1756.         DEC C
  1757.         JR NZ,Z669B
  1758.         ;LD A,4
  1759.         ;JP ON_BANK
  1760.         ret
  1761.