?login_element?

Subversion Repositories NedoOS

Rev

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

  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.         CALL PROWERKA ;ищем central directory, достаём таблицу файлов в CAT, заполняем переменные про файл
  45.        
  46.         if 1==0
  47.         LD A,(SKIPING)
  48.         OR A
  49.         JR Z,NOSKIP1
  50.         LD HL,T_KEY1
  51.         LD (MODECAT+1),HL
  52.         CALL VIEWCAT
  53.         LD A,#4F
  54.         LD (TEKATR+1),A
  55.         LD HL,0
  56.         LD DE,#440
  57.         CALL RAMKA
  58.         LD HL,T6935
  59.         CALL PRINTS_
  60.         LD HL,T6935_
  61.         CALL PRINTS_
  62.         LD HL,#400
  63.         LD DE,#C40
  64.         CALL RAMKA
  65. NOSKIP1
  66.         endif
  67.        
  68.         ;LD A,1
  69.         ;LD (D_INST),A ;это было для инициализации TR-DOS после смены диска
  70.  
  71.         LD DE,0
  72. LEN_KOM=$-2
  73.         LD A,D
  74.         OR E
  75.         JR Z,PR700
  76.         LD HL,#4000
  77.         OR A
  78.         SBC HL,DE
  79.         JR C,PR700 ;комментарий > 0x4000?
  80.         EX DE,HL
  81.         LD DE,0 ;size of central directory
  82. SM1=$-2
  83.         LD C,0
  84. SM2=$-1
  85.         LD HL,(SME_ML) ;start of central directory
  86.         LD A,(SME_ST)
  87.  
  88.         ADD HL,DE
  89.         ADC A,C
  90.         LD DE,#16
  91.        LD C,0
  92.         ADD HL,DE
  93.         ADC A,C
  94.         LD IX,BUFER
  95.         LD DE,(LEN_KOM) ;комментарий может быть до 0x4000 (реально формат позволяет больше)
  96.         CALL READ
  97.  
  98.         ;LD HL,TEXT20
  99.         ;CALL PRINTS_
  100.  
  101.         if 1==0
  102.         LD A,0
  103. MEN=$-1
  104.         OR A
  105.         JR Z,NM1
  106.         CALL INS_DEST
  107.  
  108. NM1     LD A,(DESTIN)
  109.         CP "*"
  110.         JR NZ,$+5
  111.         LD A,(SOURCE)
  112.         SUB #41
  113.         LD C,1
  114.         CALL TRDOS
  115.         LD C,#18
  116.         CALL TRDOS
  117.         LD HL,FNAME1
  118.         LD DE,23773
  119.         LD BC,9
  120.         LDIR
  121.         LD HL,BUFER
  122.         LD DE,(LEN_KOM)
  123.         LD C,#B
  124.         CALL TRDOS
  125.         LD A,(MEN)
  126.         OR A
  127.        JR Z,PR700
  128.        CALL INS_SOURC
  129.         endif
  130. PR700  
  131.         ;LD HL,TEXT21
  132.         ;CALL PRINTS_
  133.        
  134.         LD HL,0
  135. KOL_F=$-2
  136.         ;XOR A
  137.         ;LD IX,T_BUF
  138.         ;CALL DS100
  139.         ;LD HL,T_KOL_F
  140.         ;CALL PRINTS_
  141.  
  142. nextfile
  143.            ;LD A,5
  144.            ;call ON_BANK
  145.        
  146.         LD HL,0 ;start of central directory (сделал, чтобы он обновлялся с каждым новым файлом)
  147. SME_ML=$-2
  148.         LD A,0
  149. SME_ST=$-1
  150.         ;EXA
  151.  
  152.         if 1==0
  153.         LD BC,(KOL_F)
  154.         LD A,C
  155.         LD (F_KOL),A
  156. Z6013   PUSH BC
  157.         LD A,0
  158. F_KOL=$-1
  159.         SUB C
  160.  
  161.         INC A
  162.         LD (NUM_F),A ;номер файла
  163.         endif
  164.        
  165.         if 1==0
  166.         PUSH HL
  167.         LD HL,#71A ;координаты
  168.         LD (COR),HL
  169.         LD B,13
  170. CLS1    PUSH BC
  171.         LD A,#20
  172.         CALL PR
  173.         POP BC
  174.         DJNZ CLS1
  175.         POP HL
  176.         endif
  177.  
  178.         ;EXA
  179.         LD B,A ;SME_ST
  180.  
  181.         LD IX,BUFER
  182.         LD DE,#2E
  183.         LD C,41
  184.         CALL READ ;читаем описатель одного файла
  185.  
  186.         if 1==0
  187.         EXX
  188.         LD A,(BUFER+#24)
  189.         LD HL,CODE
  190.        BIT 0,A
  191.        JR Z,LL20
  192.         LD HL,TEXT
  193. LL20    LD DE,T_TYPE
  194.         LD BC,4
  195.         LDIR
  196.         EXX
  197.         endif
  198.  
  199.         LD A,B ;SME_ST
  200.         ADD HL,DE
  201.         ADC A,D ;перемещаем указатель на имя
  202.  
  203.         LD DE,(Z6638) ;file name length
  204.         LD B,A
  205.         LD IX,Z664A
  206.         CALL READ ;читаем имя файла
  207.  
  208. ;Z664A=ИMЯ TEKУЩEГO ФAЙЛА B APXИBE
  209.         ADD IX,DE
  210.         LD (IX),0 ;кладём 0 в конец имени (получится ASCIIZ)
  211.         LD A,B
  212.         ADD HL,DE
  213.         ADC A,0 ;перемещаем указатель после имени
  214.  
  215.         LD B,E
  216.        DEC D
  217.        INC D
  218.         JR Z,Z604D ;длина имени <256
  219.        LD B,0 ;длина имени >=256, считаем, что 256
  220. Z604D   LD DE,(Z663A) ;extra field length
  221.         ADD HL,DE
  222.        ADC A,0 ;пропускаем extra field
  223.         LD DE,(Z663C) ;file comment length
  224.         ADD HL,DE
  225.         ADC A,0 ;пропускаем file comment length
  226.  
  227.        ld (SME_ML),hl
  228.        ld (SME_ST),a
  229.        
  230. ;сформировать filename 8.3 (во всех элементах):
  231.         ld hl,Z664A
  232.         ld de,filename
  233.         ;call strcopy
  234.         call copyname83
  235. ; если это директория, то create directory (например, "md scr/1" без слеша в конце):
  236. ; это только для пустых директорий! nedoos-1.zip не содержит записи о директориях с файлами (в отличие от .tar)
  237.  
  238.         ;LD A,(T6624) ;flags
  239.         ;and 8 ;TODO где этот флаг?
  240.         ;jr nz,readzip_nodir
  241. ;убираем слеш в конце
  242.         ld hl,filename
  243.         push hl
  244.         pop de ;ld de,filename
  245.         xor a
  246.         ld b,-1
  247.         cpir
  248.         ld a,'/'
  249.         dec hl ;на терминаторе
  250.         dec hl ;перед терминатором
  251.         sub (hl)
  252.         jr nz,readzip_nodir;$+3
  253.         ld (hl),a ;0
  254.         OS_MKDIR
  255.         jp SKIP_noclose
  256. readzip_nodir
  257.        
  258.         ld hl,Z664A;filename
  259.         call prtext
  260.         call prcrlf
  261.        
  262.         if 1==0
  263.        
  264.         LD HL,#5CE5
  265.         LD DE,T_PKT
  266.         LD B,3
  267.         CALL PROVERK
  268.         JR C,NX600
  269.         LD A,"C"
  270.         LD (#5CE5),A
  271.         LD A,(#5CDD)
  272.         CP "0"
  273.         JR C,$+6
  274.         CP ":"
  275.         JR NC,NX600
  276.         AND 7
  277.         OR #30
  278.         LD (#5CDD),A
  279. NX600
  280.         endif
  281.        
  282.         if 1==0
  283.         LD A,(SKIPING)
  284.        OR A
  285.         JR Z,NOSKIP
  286.        LD A,(NUM_F)
  287.        LD L,A
  288.         LD H,'MARKBUF
  289.       LD A,(HL)
  290.       AND A
  291.        JP Z,SKIP_noclose
  292. NOSKIP  
  293.        endif
  294.        if 1==0
  295.        LD IX,T_TEK
  296.        LD HL,0
  297. NUM_F=$-2
  298.        CALL DS100
  299.        LD HL,T_FILE
  300.        CALL PRINTS_
  301.        endif
  302.  
  303.        ;LD HL,#71A ;координаты
  304.        ;LD (COR),HL
  305.        ;LD HL,T61F7
  306.        ;CALL PRINTS
  307.        ;LD A,#4F
  308.        ;LD (TEKATR+1),A
  309.        
  310.        ;XOR A
  311.  
  312.        LD HL,-1
  313.        LD (ML_CRC32),HL
  314.        LD (ST_CRC32),HL
  315.  
  316.        LD HL,(Z6634)
  317.        ;OR H
  318.        ;OR L
  319.        LD (ML_LEN_ISH),HL
  320.  
  321. ;HL= МЛАДШИE БAЙTЫ ДЛИHЫ ИCXOДHOГO ФAЙЛA
  322.        LD HL,(Z6636)
  323.        ;OR H
  324.        ;OR L
  325.        LD (ST_LEN_ISH),HL
  326.  
  327. ;HL= CTAPШИE БAЙТЫ ДЛИНЫ ИCXOДHOГO ФAЙЛA
  328.        ;JP Z,SKIP_noclose; HУЛЕВАЯ ДЛИHA (теперь проверяется ниже, чтобы создать файл)
  329.  
  330.        ;LD A,L
  331.        ;LD HL,(ML_LEN_ISH)
  332.        ;LD IX,T_ORIG
  333.        ;CALL DES_
  334.  
  335.        LD HL,T6628 ;file last modification time
  336.        LD DE,T6221
  337.        LD BC,8
  338.        LDIR ;??? TODO установить дату после распаковки
  339.  
  340.        LD A,(T6624) ;flags
  341.        RRA
  342.        JR NC,Z60E3
  343.  
  344. ;ФAЙЛ 3AKOДИPOBAH
  345.        LD A,3
  346.        LD (FLAGS),A ;CRYPTED
  347.  
  348. Z60E3   LD HL,(T6626)
  349.  
  350. ;T6626=METOД CЖATИЯ: 0:STORED, 8:DEFLATE, others unknown
  351.        LD A,H
  352.        OR A
  353.        JR NZ,Z60F1
  354.        OR L
  355.        JR Z,Z60FC
  356.        CP 8
  357.        JR Z,Z60FC
  358.  
  359. Z60F1   ;LD HL,UNKNOWN
  360.        ;LD DE,T_METOD
  361.        ;LD BC,7
  362.        ;LDIR
  363.        LD A,2
  364.        LD (FLAGS),A ;UNKNOWN (число в A не должно совпадать с 0 или 8!)
  365.        ;JR UNK_
  366.  
  367. Z60FC  
  368.        if 1==0
  369.        BIT 3,A
  370.        LD HL,STORED
  371.        JR Z,ST_
  372.        LD HL,DEFLATE
  373. ST_     LD DE,T_METOD
  374.        LD BC,7
  375.        LDIR
  376.        endif
  377.  
  378. UNK_    PUSH AF ;0:STORED, 8:DEFLATE, others unknown ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  379.        ;LD HL,(Z6630)
  380.        ;LD A,(Z6632)
  381.  
  382. ;A,HL= ДЛИHA CЖATOГO ФAЙЛА
  383.        ;LD (ML_PAC_LEN),HL
  384.        ;LD (ST_PAC_LEN),A
  385.        
  386.        if 1==0
  387.        LD IX,T_PACK
  388.        CALL DES_
  389.        LD B,4
  390.        LD HL,CRC_ISH+3
  391.        LD DE,T_CRC
  392. L100    LD A,(HL)
  393.        CALL HEX
  394.        DEC HL
  395.        DJNZ L100
  396.  
  397.        CALL T_IND ;инициализация процентомера?
  398.  
  399.        LD HL,0 ;текущий размер файла для процентомера
  400.        LD (B1),HL
  401.        LD (B2),HL
  402.        endif
  403.  
  404.        ;CALL DATA_COR ;печать даты?
  405.  
  406.        ;LD HL,T_PACK_L
  407.        ;CALL PRINTS_
  408.  
  409. FLAGS=$+1
  410.        LD A,0;(FLAGS) ;2:UNKNOWN, 3:CRYPTED, other=OK (формируется выше)
  411.        ;LD HL,T_UNK
  412.        CP 2
  413.        JR Z,SK__
  414.  
  415.        ;LD HL,T_CRYPT
  416.        CP 3;:JR Z,SK__
  417.  
  418. ;LD A,(SKIPING):OR A;JR Z,PROD10
  419.        JR NZ,PROD10
  420. SK__    ;CALL PRINTS_
  421.        ;CALL KEY10_
  422.        POP AF ;TODO убрать
  423.        JP SKIP_noclose
  424.  
  425. PROD10  
  426.        if 1==0
  427.        LD HL,#5CE5
  428.        LD DE,T_TRD
  429.        LD B,3
  430.        CALL PROVERK
  431.  
  432.        JR C,NXSCL
  433.        LD HL,TRDOBR
  434.        CALL PRINTS_
  435.  
  436. KEY11   XOR A
  437.       LD (#5C08),A
  438.        EI
  439.        HALT
  440.       LD A,(#5C08)
  441.       OR A
  442.        JR Z,KEY11
  443.        CP "Y"
  444.        JR Z,nX601_
  445.        CP 13
  446.       JR NZ,NX601
  447. nX601_
  448.        XOR A
  449.        LD (MEN),A
  450.        LD A,(DESTIN)
  451.        CP "*"
  452.        JR Z,MEN100
  453.       LD A,(DESTIN)
  454.       LD L,A
  455.        LD A,(SOURCE)
  456.       CP L
  457.        JR NZ,MEN100
  458.       LD A,1
  459.        LD (MEN),A
  460. MEN100
  461.        LD A,#C3
  462.        LD (SAVE),A
  463.        LD HL,SAVETRD
  464.        LD (SAVE+1),HL
  465.        LD HL,0
  466.        LD (TRK_SECT),HL
  467.  
  468.        JR NX602
  469. NXSCL
  470.        LD HL,#5CE5
  471.        LD DE,T_SCL
  472.        LD B,3
  473.        CALL PROVERK
  474.  
  475.        JR C,NX601
  476. ;EXTRACTING FROM SCL
  477.  
  478.       IF 1==1
  479.        LD HL,SCLOBR
  480.        CALL PRINTS_
  481.  
  482. KEY11S  XOR A
  483.       LD (#5C08),A
  484.        EI
  485.        HALT
  486.       LD A,(#5C08)
  487.       OR A
  488.        JR Z,KEY11S
  489.        CP "Y"
  490.        JR Z,nX601_S
  491.        CP 13
  492.       JR NZ,NX601
  493. nX601_S
  494.        LD A,"S
  495.        LD (YESSCL),A
  496.       ELSE
  497.       LD A,#C3
  498.       LD (SAVE),A
  499.       LD HL,SAVESCL
  500.       LD (SAVE+1),HL
  501.       LD HL,0
  502.       LD (TRK_SECT),HL
  503.       JR NX602
  504.       ENDIF
  505.      
  506. ;NORMAL FILE (NOT TRD OR SCL)
  507. NX601   LD A,#3E
  508.        LD (SAVE),A
  509.        LD HL,#CD04
  510.        LD (SAVE+1),HL
  511.  
  512.       endif
  513.        
  514.        if 1==0
  515.        LD A,(ST_LEN_ISH)
  516.        OR A
  517.        JR NZ,NX602
  518.        LD HL,(ML_LEN_ISH)
  519.       LD DE,#FF12
  520.       OR A
  521.       SBC HL,DE
  522.        JR NC,NX602
  523.        LD A,(#5CE5)
  524.        CP "$"
  525.        JR NZ,NX602
  526.        LD (HOB),A
  527. NX602  
  528.        endif
  529.  
  530.        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.
  531.        LD A,(Z6648)
  532.        ;jr $
  533.  
  534. ;A,HL= CMEЩEHИE ДO ЛOKAЛЬНOГO 3AГОЛОBKA
  535.        LD IX,BUFER
  536.        LD DE,#1E
  537.        LD C,#29
  538.        LD B,A
  539.        CALL READ
  540.  
  541.        XOR A
  542.        ADD HL,DE
  543.        ADC A,B
  544.        LD DE,(Z6636)
  545. ;DE= ДЛИНA ИMEHИ ФAЙЛA
  546.        ADD HL,DE
  547.        ADC A,0
  548.        LD DE,(Z6638)
  549. ;DE= ДOПOЛHИTEЛЬНOE ПOЛE ДЛИНЫ
  550.        ADD HL,DE
  551.        ADC A,0
  552.        ;LD (Z634C),HL ;текущая позиция чтения в файле
  553.        ;LD (Z634F),A
  554.  
  555. ;теперь физически установим указатель файла туда
  556.        ld d,0
  557.        ld e,a
  558.        ;ld hl,1
  559.        ;dehl=shift
  560.        ld a,(filehandle)
  561.        ld b,a
  562.        OS_SEEKHANDLE
  563.        
  564.        call SAVECREATE
  565.  
  566.        LD hl,(ML_LEN_ISH)
  567.        ld a,h
  568.        or l
  569.        LD hl,(ST_LEN_ISH)
  570.        or h
  571.        or l
  572.        jr z,SKIP ;файл нулевой длины
  573.        
  574.       LD IY,DISKBUF+DISKBUFsz-1
  575.        
  576.        ;LD HL,0
  577.        ;LD (T622D),HL
  578.        ;LD (T622E),HL
  579.        
  580. ;DEPACK
  581.       LD HL,0
  582.       LD (U6546),HL ;сколько байт сохранить = текущий адрес в буфере
  583.      
  584.        POP BC ;0:STORED, 8:DEFLATE, others unknown ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  585.        
  586.        BIT 3,B
  587.        ;LD (inflateq_sp),SP ;??? TODO
  588.        CALL Z635E ;nz=INFLATING
  589.       ;LD A,(YESSCL)
  590.       ;CP "S
  591.       ;CALL Z,DESCLPP
  592.       ; XOR A
  593.       ;LD (YESSCL),A
  594.        ;LD (NO_HOB),A
  595.        ;LD (HOB),A
  596.        LD A,(CRC32_)
  597.        CP #C9
  598.        JR Z,SKIP
  599.        LD HL,ML_CRC32
  600.        LD DE,CRC_ISH
  601.        LD B,4
  602. Z6159   LD A,(DE)
  603.        XOR (HL)
  604.        INC HL
  605.        inc DE
  606.        inc A
  607. C1      JR NZ,crcerror;Z6164
  608.        DJNZ Z6159
  609.        JR SKIP
  610.  
  611. crcerror;Z6164
  612. ;CRC ERROR
  613.        ;CALL E_CRC ;!!!!!!!!!!
  614.        ld hl,tcrcerror
  615.        call prtext
  616.  
  617. SKIP
  618. readerror
  619.        call SAVECLOSE
  620. SKIP_noclose
  621.        ld bc,(KOL_F)
  622.        cpi
  623.        ld (KOL_F),bc
  624.        ld sp,(exit_sp)
  625.        jp pe,nextfile
  626.  
  627. E_ZIP
  628. EXIT
  629. exit_sp=$+1
  630.        LD SP,#3131
  631.         ret
  632.  
  633. BUFCAT
  634.        dw 0
  635. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  636.  
  637.  
  638. PROWERKA
  639.        if 1==0
  640.        LD A,#4F
  641.        LD (TEKATR+1),A
  642.        LD HL,#400
  643.        LD DE,#C40
  644.        CALL RAMKA
  645.  
  646.        LD HL,FNAME
  647.        LD DE,T6927
  648.        LD BC,8
  649.        LDIR
  650.        LD A,"."
  651.        LD (DE),A
  652.        INC DE
  653.        LDI
  654.        LD A,(HL)
  655.        CP #20
  656.        JR C,NOEXN
  657.        INC HL
  658.        LD A,(HL)
  659.        DEC HL
  660.        CP #20
  661.        JR C,NOEXN
  662.        LDI
  663.        LDI
  664.        JR NOEXN+5
  665. NOEXN   LD A,#20
  666.        LD (DE),A
  667.        INC DE
  668.        LD (DE),A
  669.  
  670.        LD HL,FNAME
  671.        LD DE,N_ARC
  672.        LD BC,8
  673.        LDIR
  674.       LD A,"."
  675.       LD (DE),A
  676.       INC DE
  677.       LDI
  678.       LD A,(HL)
  679.       CP #20
  680.       JR C,NOEHN
  681.       INC HL
  682.       LD A,(HL)
  683.       DEC HL
  684.       CP #20
  685.       JR C,NOEHN
  686.       LDI
  687.       LDI
  688.       JR NOEHN+5
  689. NOEHN  LD A,#20
  690.       LD (DE),A
  691.       INC DE
  692.       LD (DE),A
  693.  
  694.        LD HL,T6918
  695.        CALL PRINTS_
  696.        
  697.        endif
  698.        
  699.        ;CALL F_OPEN
  700.        LD HL,CAT
  701.        LD DE,CAT+1
  702.        LD BC,#63F
  703.        LD (HL),0
  704.        LDIR ;TODO убрать
  705.        LD HL,CAT
  706.        LD (BUFCAT),HL
  707.  
  708. ;ПPOBEPKA APXИBA
  709.  
  710. ;каталог лежит в конце файла, как до него добраться?
  711.  
  712. ;Z66FA
  713. ;a=??? после F_OPEN (!=0 разрешает искать назад -0x800 даже в маленьком файле любого размера) TODO
  714.        LD A,(ST_FLEN)
  715.        LD HL,(ML_FLEN) ;ahl=длина файла
  716.        LD DE,#800
  717.         OR A
  718.         JR NZ,Z6727
  719.        LD A,H
  720.        CP 8
  721.        LD A,E;0
  722.        JR NC,Z6727 ;длина файла >=0x800, так что начнём поиск с длина файла-0x800
  723.        OR H
  724.        JR NZ,Z6714
  725. ;длина файла < 0x100
  726.        LD A,L
  727.        CP #64
  728.        JR C,Z6780 ;длина файла < 0x64 - нет ни одного файла, ошибка
  729. Z6714   PUSH HL
  730.        XOR A
  731.        LD HL,BUFER
  732.        LD DE,BUFER+1
  733.        LD (HL),A
  734.        LD BC,#7FF
  735.        LDIR ;очистили буфер, чтобы случайно не найти end of central directory не там
  736.        POP DE
  737. Z6723   LD L,A ;ищем в начале файла
  738.        LD H,A
  739.        JR _Z672A
  740.  
  741. Z6727   SBC HL,DE
  742.        SBC A,E
  743.  
  744. _Z672A   LD B,A
  745.        LD IX,BUFER
  746.        ;de=0x800
  747.        CALL LOAD_B ;поиск блока end of central directory
  748.        LD A,B
  749.        JR Z,Z6747 ;end of central directory
  750.        OR L
  751.        OR H
  752.        JR Z,Z6780 ;дошли до начала файла, а end of central directory не нашли
  753.        LD A,B
  754.        LD BC,#7EA ;смещаем указатель файла назад почти на 0x800
  755.        SBC HL,BC
  756.        SBC A,0
  757.        JR NC,_Z672A ;ищем назад
  758.        XOR A
  759.        JR Z6723 ;ищем в начале файла
  760.  
  761. Z6747
  762. ;нашли end of central directory (ix = адрес этого блока в BUFER+)
  763.        PUSH IX
  764.        POP BC
  765.        ADD HL,BC
  766.       ADC A,0
  767.        LD BC,BUFER
  768.        SBC HL,BC
  769.       SBC A,0 ;ahl=смещение end of central directory в файле
  770.        LD (Z6896),HL ;текущее смещение в файле? TODO убрать
  771.        LD (Z6894),A
  772.        EX DE,HL
  773.        LD H,(IX+#11)
  774.        LD L,(IX+#10) ;offset of start of central directory
  775.  
  776. ;МЛАДШИЕ БAЙTЫ CMEЩEHИЯ HAЧAЛА ЦEHTPAЛЬHOГO KATAЛOГA
  777.        LD (SME_ML),HL
  778.        LD (IX+2),A ;???
  779.        LD A,(IX+#12) ;offset of start of central directory HSB
  780.  
  781. ;CTAPШИЙ БAЙT CMEЩЕНИЯ
  782.        LD (SME_ST),A
  783.        LD B,(IX+#D)
  784.        LD C,(IX+#C)
  785.        LD (SM1),BC ;size of central directory
  786.  
  787. ;BC=ДЛИНA ЦEHTPAЛЬHOЙ ДИPEKTOPИИ, МЛАДШИЕ БAЙТЫ
  788.        ADD HL,BC
  789.        ADC A,(IX+#E) ;size of central directory HSB
  790.        XOR (IX+2) ;???
  791.        JR NZ,Z6780 ;конец central directory не соответствует смещению блока end of central directory - ошибка
  792.        SBC HL,DE
  793.       JR Z,Z6783 ;конец central directory соответствует смещению блока end of central directory
  794. Z6780  JP ERR_Z1 ;дошли до начала файла, а end of central directory не нашли
  795.  
  796. Z6783   LD L,(IX+#14)
  797.        LD H,(IX+#15)
  798.        LD (LEN_KOM),HL
  799.  
  800.        LD A,(IX+#E)
  801.        LD (SM2),A ;size of central directory HSB
  802.  
  803.        LD C,(IX+#A)
  804.        LD B,(IX+#B)
  805.        LD H,(IX+9)
  806.        LD L,(IX+8)
  807. ;cy=0
  808. ;BC=ОБЩEE ЧИСЛO ФAЙЛОB B APXИBE
  809. ;HL=ЧИСЛО 3AПИCEЙ B KATAЛOГE HA ЭTOM ДИCKE
  810.        LD (KOL_F),HL
  811.        SBC HL,BC
  812.        JP NZ,ERR_Z2
  813.        LD HL,(SME_ML) ;start of central directory
  814.        LD A,(SME_ST)
  815.        EXA
  816. Z679E   PUSH BC
  817.        EXA
  818.        LD B,A
  819.        LD A,1 ;тип сигнатуры
  820.        LD DE,#2E
  821.        LD IX,BUFER
  822.        CALL Z6886 ;читаем блок и проверяем сигнатуру (выход по ошибке - ERR_Z1)
  823.  
  824.        LD A,(IX+#1D)
  825.  
  826. ;A= МЛАДШИЙ БAЙT ДЛИНЫ ИMEHИ ФAЙЛА
  827.        CP 2
  828.        JP NC,ERR_Z3
  829.        LD D,A
  830.        LD E,(IX+#1C)
  831.  
  832. ;DE=ДЛИНА ИMEHИ ФAЙЛА
  833.        CALL Z68D9 ;сдвинуть указатель в файле (ahl) на bde байт и проверить, что не вышли за границу файла?
  834.        LD D,(IX+#1F)
  835.        LD E,(IX+#1E)
  836.  
  837. ;DE=ДOПOЛНИTEЛЬHOE ПОЛE ДЛИHЫ
  838.        CALL Z68D9 ;сдвинуть указатель в файле (ahl) на bde байт и проверить, что не вышли за границу файла?
  839.        LD D,(IX+#21)
  840.        LD E,(IX+#20)
  841.  
  842. ;DE=ДЛИHA KOMEHTAPИЯ K ФAЙЛУ
  843.        CALL Z68D9 ;сдвинуть указатель в файле (ahl) на bde байт и проверить, что не вышли за границу файла?
  844.        PUSH BC,HL
  845.        LD B,(IX+#2C)
  846.        LD L,(IX+#2A)
  847.        LD H,(IX+#2B)
  848.  
  849. ;B,HL=CMEЩEHИE OT HAЧAЛA ПEPBOГO ДИCKA C ЭTИM ФAЙЛOM
  850. ;     ДO ЛОКАЛЬHOГO 3AГOЛOBKA.
  851.        INC IX,IX,HX
  852.        LD A,3 ;тип сигнатуры
  853.        LD DE,#30
  854.        CALL Z68B1 ;сдвигаем указатель bhl на de байт, читаем и проверяем сигнатуру?
  855.        PUSH IX
  856.        POP HL
  857.        LD DE,#1E
  858.        ADD HL,DE
  859.        LD (NAMEF3+1),HL
  860.        LD E,(IX+#1A)
  861.        LD D,(IX+#1B)
  862.        ADD HL,DE
  863.        LD DE,(BUFCAT)
  864.        PUSH DE,DE
  865.        LD A," "
  866.        LD B,11
  867.        LD (DE),A
  868.        INC DE
  869.        DJNZ $-2
  870. NAMEF3  LD DE,0
  871. NAMEF4  DEC HL
  872.        PUSH HL
  873.        AND A
  874.        SBC HL,DE
  875.        POP HL
  876.       JR NC,NAMEF5
  877.       EX DE,HL
  878.       DEC HL
  879.       JR NAMEF6
  880.  
  881. NAMEF5  LD A,(HL)
  882.        CP "/"
  883.        JR NZ,NAMEF4
  884. NAMEF6  POP DE
  885.        INC HL
  886.        LD B,8
  887. NAMEF2  LD A,(HL)
  888.        INC HL
  889.        CP "."
  890.        JR Z,NAMEF1
  891.        LD (DE),A
  892.        INC DE
  893.        DJNZ NAMEF2
  894.        LD A,(HL)
  895.        INC HL
  896.        CP "."
  897.        JR NZ,$-4
  898. NAMEF1  POP DE
  899.        LD B,8
  900.        INC DE
  901.        DJNZ $-1
  902.       LD BC,3
  903.        LDIR
  904.        LD A,(IX+#16)
  905.        LD (DE),A
  906.        INC DE
  907.        LD A,(IX+#17)
  908.        LD (DE),A
  909.        INC DE
  910.        LD A,(IX+#18)
  911.        LD (DE),A
  912.        INC DE,DE,DE
  913.        EX DE,HL
  914.        LD (BUFCAT),HL
  915.        LD HL,#1E
  916.        LD A,(IX+#1B)
  917.  
  918. ;A=СТАРШИЙ БAЙT ДЛИHЫ СMEHЫ ФAЙЛА
  919.        CP 2
  920.        JP NC,ERR_Z3
  921.        LD D,A
  922.        LD E,(IX+#1A)
  923.  
  924. ;DE=ДЛИHA СMEHЫ ФAЙЛА
  925.        CALL Z68ED ;сдвинуть указатель в файле (bhl) на de байт и проверить, что не вышли за границу файла?
  926.        LD D,(IX+#1D)
  927.        LD E,(IX+#1C)
  928.  
  929. ;DE=ДATA ПOCЛEДHEЙ MOДИФИKAЦИИ
  930.        CALL Z68ED ;сдвинуть указатель в файле (bhl) на de байт и проверить, что не вышли за границу файла?
  931.        LD D,(IX+#13)
  932.        LD E,(IX+#12)
  933.        LD A,(IX+#14)
  934.  
  935. ;A,DE=ДЛИHA CЖATOГO ФAЙЛA
  936.        CALL Z68EE ;сдвинуть указатель в файле (bhl) на ade байт и проверить, что не вышли за границу файла?
  937.        LD A,(IX+#16)
  938.        OR (IX+#17)
  939.        OR (IX+#18)
  940.        OR (IX+#19)
  941.  
  942. ;ИCXOДHAЯ ДЛИHA ФAЙЛA
  943.        EXA
  944.        PUSH IX
  945.        POP HL
  946.        LD BC,7
  947.        ADD HL,BC
  948.        RES 7,(IX+7)
  949.  
  950. ;METOД CЖATИЯ, CTAPШИЙ БAЙT
  951.        LD B,#18-3
  952. Z6825   LD A,(HL)
  953.        DEC H
  954.        SUB (HL) ;TODO что с чем сравниваем?
  955.        JR NZ,ERR_Z1
  956.        INC H,HL
  957.        DJNZ Z6825
  958.        POP HL,BC
  959.        LD A,B
  960.        POP BC
  961.        EXA
  962.        JR Z,Z6838 ;файл длиной 0?
  963.        LD (Z683F),A
  964. Z6838   DEC BC
  965.        LD A,B
  966.        OR C
  967.        JP NZ,Z679E
  968.  
  969. Z683E   LD A,0
  970. Z683F=Z683E+1
  971.  
  972.        OR A
  973.        RET NZ ;файл длиной не 0?
  974. ;TODO файл длиной 0
  975. ERR_Z1
  976. ERR_Z2
  977. ERR_Z3
  978.        JP E_ZIP
  979.  
  980. ;поиск блока end of central directory
  981. LOAD_B
  982. ;ahl=смещение в файле
  983. ;ix=буфер
  984. ;de=len
  985. ;out: z=end of central directory, bhl=kept
  986.        CALL READ
  987.        PUSH BC
  988.        LD BC,#7EA ;???
  989.        ADD IX,BC
  990. ;поиск заголовка блока
  991. Z6861   LD A,#50 ;'P'
  992.        CP (IX)
  993.        JR NZ,Z687C
  994.        LD A,#4B ;'K'
  995.        CP (IX+1)
  996.        JR NZ,Z687C
  997.        LD A,5
  998.        CP (IX+2)
  999.        JR NZ,Z687C
  1000.        INC A
  1001.        CP (IX+3)
  1002.        JR Z,Z6884 ;05, 06 = end of central directory
  1003. Z687C   DEC BC
  1004.        DEC IX
  1005.        LD A,B
  1006.        OR C
  1007.        JR NZ,Z6861 ;поиск заголовка блока дальше
  1008.        DEC A ;-1, NZ
  1009. Z6884   POP BC
  1010.        RET
  1011.  
  1012. Z6886
  1013.        PUSH HL,DE
  1014.        LD (signaturetype),A
  1015.        ADD HL,DE
  1016.       LD A,B
  1017.       ADC A,0
  1018.        JR C,ERR_Z1
  1019.        EX DE,HL
  1020.        LD C,A
  1021.  
  1022. Z6894=$+1
  1023.        LD A,0
  1024. Z6896=$+1
  1025.        LD HL,0
  1026.  
  1027.        SBC HL,DE
  1028.        SBC A,C
  1029.        JR C,ERR_Z1
  1030.        EX DE,HL
  1031.        POP DE
  1032.        EX (SP),HL
  1033.        LD A,B
  1034.        LD B,C
  1035.        CALL READ
  1036.        POP HL
  1037.        JR Z68AB
  1038.  
  1039. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1040. Z68AB   CALL checksignature;Z6901
  1041.        RET Z
  1042. Z68AF   JR ERR_Z1
  1043.  
  1044. Z68B1
  1045. ;сдвигаем указатель bhl на de байт, читаем и проверяем сигнатуру?
  1046.        PUSH HL
  1047.        PUSH DE
  1048.        LD (signaturetype),A
  1049.       ADD HL,DE
  1050.       LD A,B
  1051.       ADC A,0
  1052.        JR C,ERR_Z1
  1053.        EX DE,HL
  1054.        LD C,A
  1055.        LD A,(SME_ST)
  1056.        LD HL,(SME_ML) ;start of central directory
  1057.        SBC HL,DE
  1058.        SBC A,C
  1059.        JR C,Z68AF
  1060.        EX DE,HL
  1061.        POP DE
  1062.        EX (SP),HL
  1063.        LD A,B
  1064.        LD B,C
  1065.        CALL READ
  1066.        POP HL
  1067.        JR Z68AB ;check signature
  1068.  
  1069. Z68D9
  1070. ;сдвинуть указатель в файле (ahl) на bde байт и проверить, что не вышли за границу файла?
  1071.        XOR A
  1072.        ADD HL,DE
  1073.        ADC A,B
  1074.        JR C,Z68AF ;ERR_Z1
  1075.        LD B,A
  1076.        EX DE,HL
  1077.        LD A,(Z6894)
  1078.        LD HL,(Z6896) ;текущее смещение в файле?
  1079.        SBC HL,DE
  1080.        SBC A,B
  1081.        EX DE,HL
  1082.        RET NC
  1083.       JR Z68AF ;ERR_Z1
  1084.  
  1085. Z68ED
  1086.        XOR A
  1087. Z68EE
  1088.        ADD HL,DE
  1089.        ADC A,B
  1090.        JR C,Z68AF
  1091.        LD B,A
  1092.        EX DE,HL
  1093.        LD A,(SME_ST)
  1094.        LD HL,(SME_ML) ;start of central directory
  1095.        SBC HL,DE
  1096.        SBC A,B
  1097.        EX DE,HL
  1098.        RET NC
  1099.       JR Z68AF ;ERR_Z1
  1100.  
  1101. checksignature;Z6901
  1102.        LD A,#50
  1103.        CP (IX)
  1104.        RET NZ
  1105.        LD A,#4B
  1106.        CP (IX+1)
  1107.        RET NZ
  1108. signaturetype=$+1;Z690E
  1109.        LD A,0 ;тип сигнатуры: 03: local file header, 01: central directory file header, 07: optional data descriptor, 05: end of central directory
  1110.        CP (IX+2)
  1111.        RET NZ
  1112.        INC A
  1113.        CP (IX+3)
  1114.        RET  
  1115.  
  1116.        if 1==0
  1117. Z631F  PUSH BC
  1118.       POP DE
  1119.        PUSH HL
  1120.        POP IX
  1121.        LD A,0
  1122. ST_PAC_LEN=$-1
  1123.        LD HL,0
  1124. ML_PAC_LEN=$-2
  1125.        OR A
  1126.        JR NZ,Z633D
  1127.        PUSH HL
  1128.        SBC HL,DE
  1129.        POP HL
  1130.        JR NC,Z633D
  1131.        LD E,L
  1132.        LD D,H
  1133. Z633D   OR A
  1134.        SBC HL,DE
  1135.        SBC A,0
  1136.        LD (ST_PAC_LEN),A
  1137.        LD (ML_PAC_LEN),HL
  1138.        LD A,D
  1139.        OR E
  1140.        RET Z
  1141.        LD HL,0
  1142. Z634C=$-2
  1143.        LD A,0
  1144. Z634F=$-1
  1145.        LD B,A
  1146.        CALL READ
  1147.        XOR A
  1148.        ADD HL,DE
  1149.        ADC A,B
  1150.        LD (Z634C),HL
  1151.        LD (Z634F),A
  1152.       ;CALL STOP_DRV
  1153.       RET
  1154.        else
  1155. ;Z634C
  1156. ;        dw 0
  1157. ;Z634F
  1158. ;        db 0
  1159.        endif
  1160.      
  1161. Z635E
  1162.        jp NZ,INFLATING
  1163. ;stored
  1164.         ld hl,tstored
  1165.         call prtext
  1166.        ;LD HL,PROCES
  1167.        ;CALL PRINTS_
  1168.           ;LD A,5
  1169.           ;call ON_BANK
  1170.        ld hl,(ML_LEN_ISH)
  1171.        ld a,(ST_LEN_ISH)
  1172.        ;ld c,a
  1173.        ;or h
  1174.        ;or l
  1175.        ;ld a,c
  1176.        ;jr z,storedq
  1177.        jr stored0go
  1178. stored0
  1179.        push af
  1180.        ;push hl
  1181.        ziprdbyte
  1182.        CALL SBYTE
  1183.        ;pop hl
  1184.        pop af
  1185. stored0go
  1186.        ld bc,1
  1187.        or a
  1188.        sbc hl,bc
  1189.        sbc a,b;0
  1190.        jr nc,stored0
  1191.           ;LD A,5
  1192.           ;call ON_BANK
  1193. ;storedq
  1194.        ;jp savelastblock;_ZD1C4 ;save whole buffer (end of file)
  1195.        
  1196. savelastblock;_ZD1C4
  1197.        ;jr $
  1198. ;save whole buffer
  1199. ;сюда попадаем в конце файла
  1200.         ld hl,tsavelast
  1201.         call prtext
  1202.        LD HL,(U6546)
  1203.        ;ld a,h
  1204.        ;cp 0x50
  1205.        ;jr z,$
  1206. savehlbytes;ZD1C7
  1207.        LD DE,0
  1208.        JP SAVE
  1209.  
  1210. saveblock;Z65B8
  1211. ;save whole buffer
  1212. ;сюда не попадаем на коротких файлах
  1213.        PUSH HL,DE,BC,AF
  1214.         ;push ix
  1215.         ;exx
  1216.         ;exa
  1217.         ;push af
  1218.         ;push bc
  1219.         ;push de
  1220.         ;push hl
  1221.         ld hl,tsaveblock
  1222.         call prtext
  1223.        ;LD A,5
  1224.        ;CALL ON_BANK
  1225.        LD HL,(Z6546) ;сколько байт сохранить
  1226.        LD (TD198),HL ;сколько байт сохраняли
  1227.        CALL savehlbytes;ZD1C7 ;SAVE hl bytes
  1228. ;hl=0
  1229.        LD (Z6546),HL ;сколько байт сохранить (=0)
  1230.        if 1==0 ;обновление размера для процентомера
  1231.        EX DE,HL
  1232.        LD HL,(TD198) ;сколько байт сохраняли
  1233.       AND A
  1234.        SBC HL,DE
  1235.        JR C,CON1 ;???
  1236.        LD DE,(B2)
  1237.        ADD HL,DE
  1238.        LD (B2),HL
  1239.       LD A,(B1)
  1240.       ADC A,0
  1241.       LD (B1),A
  1242. CON1
  1243.        endif
  1244.         ;pop hl
  1245.         ;pop de
  1246.         ;pop bc
  1247.         ;pop af
  1248.         ;exa
  1249.         ;exx
  1250.         ;pop ix
  1251.        POP AF,BC,DE,HL
  1252.        RET
  1253.  
  1254. tsaveblock
  1255.        db "save block",13,10,0
  1256. tsavelast
  1257.        db "save last block",13,10,0
  1258.  
  1259.  
  1260. tstored
  1261.        db "stored",13,10,0
  1262.  
  1263. ST_LEN  DW 0
  1264.  
  1265.        if 1==0
  1266. INFLATING
  1267.        ;ld (inflateq_sp),sp
  1268.        ;LD HL,PROCES
  1269.        ;CALL PRINTS_
  1270.        ;LD A,5
  1271.        ;CALL ON_BANK
  1272.        CALL ZD140 ;init read buffer, inflate file
  1273.        ;LD A,4
  1274.        ;JP ON_BANK
  1275.        ret
  1276.        endif
  1277.  
  1278. depkqerror;B_TABL
  1279. ;ошибка в файле
  1280.        ;jr $
  1281.         ld hl,terror
  1282.         call prtext
  1283. ;save whole buffer (Z6546) байт и выйти
  1284. ;Z63B4
  1285. ;inflateq_sp=$+1;Z63B5=$+1
  1286. ;        LD SP,0
  1287.        ;LD HL,(Z6546) ;сколько байт сохранить = текущий адрес в буфере
  1288.        ;LD DE,0
  1289.        ;CALL SAVE
  1290.        call savelastblock
  1291.        ;LD A,4
  1292.        ;CALL ON_BANK
  1293.        ;CALL E_TABL
  1294.        JP SKIP ;восстанавливает sp
  1295. terror
  1296.        db "error",13,10,0
  1297.  
  1298. ;PAСЧET CRC-32
  1299. ;тут может быть патч RET (TODO)
  1300. ;a=byte
  1301. CRC32_  EXX
  1302.        LD DE,(ST_CRC32)
  1303.        LD HL,(ML_CRC32)
  1304. CRCPR_  XOR L
  1305.        LD B,H
  1306.        LD L,A
  1307.         LD H,TCRC/1024 ;#18
  1308.        ADD HL,HL
  1309.        ADD HL,HL
  1310.        LD A,B
  1311.        XOR (HL)
  1312.        LD C,A
  1313.        INC L
  1314.        LD A,E
  1315.        XOR (HL)
  1316.        LD B,A
  1317.        INC L
  1318.        LD A,D
  1319.        XOR (HL)
  1320.        LD E,A
  1321.        INC L
  1322.        LD D,(HL)
  1323.        LD (ST_CRC32),DE
  1324.        LD (ML_CRC32),BC
  1325.        EXX
  1326.        RET
  1327. ;ГEHEPAЦИЯ TAБЛИЦЫ ДЛЯ PAСЧETA CRC-32
  1328. initCRC
  1329.        LD IX,TCRC+#3FC
  1330.        LD C,0
  1331. Z669B   LD B,8
  1332.        LD DE,0
  1333.        LD H,D
  1334.        LD L,C
  1335.        DEC L
  1336. Z66A3   SRL D
  1337.        RR E
  1338.        RR H
  1339.        RR L
  1340.        JR NC,Z66BD
  1341.        LD A,#ED
  1342.        XOR D
  1343.        LD D,A
  1344.        LD A,#B8
  1345.        XOR E
  1346.        LD E,A
  1347.        LD A,#83
  1348.        XOR H
  1349.        LD H,A
  1350.        LD A,#20
  1351.        XOR L
  1352.        LD L,A
  1353. Z66BD   DJNZ Z66A3
  1354.        LD (IX),L
  1355.        LD (IX+1),H
  1356.        LD (IX+2),E
  1357.        LD (IX+3),D
  1358.        LD DE,-4
  1359.        ADD IX,DE
  1360.        DEC C
  1361.        JR NZ,Z669B
  1362.        ;LD A,4
  1363.        ;JP ON_BANK
  1364.        ret
  1365.