?login_element?

Subversion Repositories NedoOS

Rev

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