?login_element?

Subversion Repositories NedoOS

Rev

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

  1.         DEVICE ZXSPECTRUM128
  2.         include "../_sdk/sys_h.asm"
  3. FR_EXIST=8 ;fatfs4os/ff.h
  4.  
  5.        MACRO ziprdbyte
  6.         INC LY
  7.         LD A,(IY)
  8.         CALL Z,RDBYH
  9.        ENDM
  10.  
  11. STACK=0x4000
  12. ziptrees=0x4000;0x8000;0x4000 ;чтобы было bit 6 ;size = 0xa60 + 2*288?
  13. TCRC=0x6800 ;size 0x400, divisible by 0x400
  14. DISKBUF=0x6c00
  15. DISKBUFsz=0x1000
  16. READZIPDIR=1;0 пока не работает
  17. ;в обычном заголовке файла длина имени файла в другом месте и вообще заголовок другой!
  18. ;READ не должна будет содержать позиционирование
  19. ;надо не проверять число файлов. выход по какому-то другому условию - любой заголовок, кроме PK,3,4 (в директории PK,1,2. Archive decryption header, Archive extra data record наверняка имеют другие заголовки, примеров нет)
  20.  
  21. SEEK32BIT=1
  22.  
  23. depkbuf=0x7c00;0 for pages
  24. buf64k=0;0 for nopages
  25.  
  26.         org PROGSTART
  27. cmd_begin
  28.         ld sp,STACK
  29.         call initstdio
  30.         ;ld e,6 ;textmode
  31.         ;OS_SETGFX
  32.        
  33.         ;OS_GETMAINPAGES
  34. ;dehl=номера страниц в 0000,4000,8000,c000
  35.         if depkbuf==0
  36.         ld hl,PTABL
  37.         ld b,4;6
  38. getpgs0
  39.         push bc
  40.         push hl
  41.         OS_NEWPAGE
  42.         pop hl
  43.         ld (hl),e
  44.         inc hl
  45.         pop bc
  46.         djnz getpgs0
  47.         endif
  48.        
  49.         ld hl,COMMANDLINE
  50.         call skipword
  51.         call skipspaces
  52.         ld a,(hl)
  53.         or a
  54.         jr nz,$+5
  55.          ld hl,defaultfilename
  56.         ex de,hl
  57.        
  58.         call openstream_file
  59.         or a
  60.         jr nz,openerror
  61.        
  62.         ld a,(filehandle)
  63.         ld b,a
  64.         OS_GETFILESIZE ;dehl=filesize
  65.         ld (ML_FLEN),hl
  66.        if SEEK32BIT
  67.         ld (ST_FLENw),de
  68.        else
  69.         ld a,e
  70.         ld (ST_FLEN),a
  71.        endif
  72.  
  73.         CALL initdepk;Z6629 ;ИНИЦИАЛИЗАЦИЯ ДЕПAKEPA
  74.        LD IY,DISKBUF+DISKBUFsz-1
  75.  
  76. ;0x1f,0x8b = *.gz
  77. ;"PK" = *.zip
  78.         call RDBYTE
  79.         cp 'P'
  80.         jr nz,depack_gz
  81.  
  82.         call depack
  83.        
  84.         if 1==0
  85.         ld de,0
  86.         ld hl,1
  87.         ;dehl=shift
  88.         ld a,(filehandle)
  89.         ld b,a
  90.         OS_SEEKHANDLE
  91.        
  92.        LD IY,DISKBUF+DISKBUFsz-1
  93.  
  94. loop0
  95.         ziprdbyte
  96.         push iy
  97.         PRCHAR_
  98.         pop iy
  99.         jp loop0
  100.         endif
  101.  
  102. depack_gz_q
  103.         call closestream_file
  104. openerror
  105. mkdirerror
  106. error
  107.         QUIT
  108.  
  109. ;readerror
  110. ;TODO restore stack
  111.         ;call closestream_file
  112.         ;jr error
  113.  
  114. depack_gz
  115.         call RDBYTE ;rest of magic header 0x8b
  116.         call RDBYTE ;method (TODO 0=store)
  117.         call RDBYTE ;flags (bit 3 set: original file name present)
  118.         push af
  119.  
  120.         ld b,6 ;4time+1extraflags+1os
  121.         call RDBYTE
  122.         djnz $-3
  123.  
  124.         pop af
  125.         bit 3,a
  126.         jr z,depack_gz_skipname ;TODO делать из имени архива
  127. ;сформировать filename:
  128.         ld hl,filename
  129. depack_gz_getfn0
  130.         call RDBYTE
  131.         ld (hl),a
  132.         inc hl
  133.         or a
  134.         jr nz,depack_gz_getfn0
  135.         ld hl,filename
  136.         ld de,filename
  137.         call copyname83
  138. depack_gz_skipname
  139.         call SAVECREATE
  140.  
  141.         ld hl,1
  142.         ld (KOL_F),hl
  143.         call depack_gz_pp
  144.         jr depack_gz_q
  145. depack_gz_pp
  146.         LD (exit_sp),SP
  147.         call INFLATING
  148.         jp SKIP ;call SAVECLOSE
  149.        
  150. copyname83
  151. ;hl->de
  152. copyname83_element
  153.         ld b,8
  154. copyname83_0
  155.         ld a,(hl)
  156.         inc hl
  157.         or a
  158.         jr z,copyname83_q
  159.         cp '/'
  160.         jr z,copyname83_endelement
  161.         cp '.'
  162.         jr z,copyname83_ext
  163.         ld (de),a
  164.         inc de
  165.         djnz copyname83_0
  166. ;8 chars of name copied, wait for dot or slash or terminator
  167. copyname83_skipname0
  168.         ld a,(hl)
  169.         inc hl
  170.         or a
  171.         jr z,copyname83_q
  172.         cp '/'
  173.         jr z,copyname83_endelement
  174.         cp '.'
  175.         jr nz,copyname83_skipname0
  176. copyname83_ext
  177.         ld (de),a ;'.'
  178.         inc de
  179.         ld b,3
  180. copyname83_ext0
  181.         ld a,(hl)
  182.         inc hl
  183.         or a
  184.         jr z,copyname83_q
  185.         cp '/'
  186.         jr z,copyname83_endelement
  187.         cp '.'
  188.         jr z,copyname83_skipext0
  189.         ld (de),a
  190.         inc de
  191.         djnz copyname83_ext0
  192. copyname83_skipext0
  193.         ld a,(hl)
  194.         inc hl
  195.         or a
  196.         jr z,copyname83_q
  197.         cp '/'
  198.         jr nz,copyname83_skipext0
  199. copyname83_endelement
  200.         ld (de),a ;'/'
  201.         inc de
  202.         jr copyname83_element
  203. copyname83_q
  204.         ld (de),a ;0
  205.         ret
  206.  
  207. skipword
  208. ;hl=string
  209. ;out: hl=terminator/space addr
  210. getword0
  211.         ld a,(hl)
  212.         or a
  213.         ret z
  214.         cp ' '
  215.         ret z
  216.         inc hl
  217.         jr getword0
  218.  
  219. skipspaces
  220. ;hl=string
  221. ;out: hl=after last space
  222.         ld a,(hl)
  223.         cp ' '
  224.         ret nz
  225.         inc hl
  226.         jr skipspaces
  227.        
  228.  
  229. strcopy
  230. ;hl->de
  231. strcopy0
  232.         ld a,(hl)
  233.         ldi
  234.         or a
  235.         jr nz,strcopy0
  236.         ret
  237.  
  238.         if depkbuf==0
  239. PTABL
  240.         ;DB #11,#13,#14,#17,#10,#16
  241.         ds 4;6 ;patched
  242.         endif
  243.  
  244. ;T61F7   DS 14 ;???
  245. T6221   DS 4 ;time(2), date(2) of depacked file
  246. CRC_ISH DS 4
  247.  
  248. ML_LEN_ISH DB 0
  249. T622A   DB 0
  250. ST_LEN_ISH DB 0
  251. T622C   DB 0
  252.  
  253. ;T622D   DB 0
  254. ;T622E   DB 0
  255. ;T622F   DB 0
  256.  
  257. ML_CRC32 DW 0
  258. ST_CRC32 DW 0
  259.  
  260. ;текущий размер файла для процентомера
  261. ;B1      DB 0
  262. ;B2      DB 0
  263. ;B3      DB 0
  264.  
  265.         if depkbuf==0
  266. ;a=4: for Z631F
  267. ;a=5: default
  268. ;a=0..3: for keep byte
  269. ;не должна портить hl,de, a' (а что насчёт bc?)
  270. ON_BANK
  271.         ;CP 0
  272.         ;RET Z ;для такого поведения надо перед каждой распаковкой делать паразитное переключение, чтобы потом сработало фактическое?
  273.         ;LD (TPAGE),A
  274.         push bc
  275.        LD b,PTABL/256
  276.        ADD A,PTABL&0xff
  277.         LD c,A
  278.         LD A,(bc)
  279.         SETPG32KHIGH
  280.         pop bc
  281.         RET
  282.         endif
  283.  
  284. ;TPAGE=ON_BANK+1
  285.  
  286. ;ЧTEHИE ЧACTИ ФAЙЛА
  287. ;de=len
  288. ;ix=buffer
  289. ;ahl=position in file
  290. ;SEEK32BIT: bchl=position in file
  291. READ    
  292.         PUSH IX,DE,BC,HL,AF
  293.  
  294.         push de ;len
  295.         push ix ;buf
  296.        
  297.        if SEEK32BIT
  298.         ld d,b
  299.         ld e,c
  300.        else
  301.         ld d,0
  302.         ld e,a
  303.        endif
  304.         ;dehl=shift
  305.         ld a,(filehandle)
  306.         ld b,a
  307.         OS_SEEKHANDLE
  308.        
  309.         pop de ;buf
  310.         pop hl ;len
  311.         call readstream_file
  312.  
  313.         ;CALL LOAD
  314.         ;LD HL,0
  315.         ;LD (OSTAT),HL
  316.         ;LD (SMEV),HL
  317.         POP AF,HL,BC,DE,IX
  318.         RET
  319.  
  320. ;процентомер?
  321. COUNT
  322.         LD A,0
  323. NOPR=$-1
  324.         INC A
  325.         AND 3
  326.         LD (NOPR),A
  327.         RET NZ
  328.         ;EXX
  329.         ;CALL P_IND
  330.         ;EXX
  331.         RET
  332.  
  333.         if 1==0
  334. P_IND   DI
  335.         LD (P_IND1+1),SP
  336.         LD SP,TABLICA
  337.         LD B,48
  338.         LD HL,(Z6546)
  339.         LD DE,(B2)
  340.         ADD HL,DE
  341.         EX DE,HL
  342.         LD A,(B1)
  343.         ADC A,0
  344.         LD C,A
  345. PI2     POP HL,AF
  346.         OR A
  347.         SBC HL,DE
  348.         SBC A,C
  349.         JR C,PI1
  350.         JR NZ,NE_0
  351.         OR H
  352.         OR L
  353.         JR Z,PI1
  354. NE_0    DJNZ PI2
  355. PI1     DEC SP,SP
  356.         POP HL
  357. P_IND1  LD SP,0
  358.         LD A,L
  359.         CP -1
  360. PNP=$-1
  361.         RET Z
  362.         LD (PNP),A
  363.         LD HL,#0A08
  364.         LD (COR),HL
  365.         LD E,A
  366.         LD D,0
  367.         LD HL,SKAL
  368.         OR A
  369.         SBC HL,DE
  370.         LD A,#4F
  371.         LD (TEKATR+1),A
  372.         JP PRINTS
  373. ;?
  374.        DS 48,#0A0A
  375. SKAL=$-1
  376.         NOP
  377.         endif
  378.  
  379. minhl_bc_tobc
  380.         or a
  381.         sbc hl,bc
  382.         add hl,bc
  383.         ret nc ;bc<=hl
  384.         ld b,h
  385.         ld c,l
  386.         ret
  387.  
  388. ; HL = ДЛИНА ФАЙЛА
  389. ;de=0
  390. ;имя файла лежит в filename
  391. ;out: hl=0
  392. SAVE
  393.         ;LD A,4
  394.         ;CALL ON_BANK
  395.  
  396.         ;LD A,3
  397.         ;LD (NOPR),A ;форсировать процентомер?
  398.         ;CALL COUNT ;процентомер?
  399.  
  400.         ;LD (#5CE8),HL ;length
  401.         ld de,0
  402.         LD (IST),DE
  403.        
  404.         ld a,h
  405.         or l
  406.         ret z
  407.        
  408.         if depkbuf
  409.         ex de,hl
  410. IST=$+1
  411.         LD HL,0;(IST)
  412.         ld bc,depkbuf
  413.         add hl,bc
  414.         ex de,hl
  415.         ld a,(savefilehandle)
  416.         ld b,a
  417.         push iy
  418.         OS_WRITEHANDLE
  419.         pop iy
  420.        
  421.         else
  422. ;RE_READ
  423.         ;push hl
  424.         ;call SAVECREATE
  425.         ;pop hl ;size
  426. SAVE_pg
  427.         push hl
  428. IST=$+1
  429.         LD HL,0;(IST)
  430.         LD A,H
  431.         RLCA
  432.         RLCA
  433.         AND 3
  434.         CALL ON_BANK
  435.         pop hl
  436.  
  437.         ld bc,0x4000
  438.         call minhl_bc_tobc ;bc=block size
  439.         or a
  440.         sbc hl,bc
  441.         push hl ;remaining size
  442.         ld h,b
  443.         ld l,c
  444.         ld de,0xc000
  445.         ld a,(savefilehandle)
  446.         ld b,a
  447.         push iy
  448.         OS_WRITEHANDLE
  449.         pop iy
  450.        
  451.         LD DE,#4000
  452.         LD HL,(IST)
  453.         ADD HL,DE
  454.         LD (IST),HL
  455.         pop hl ;remaining size
  456.         ld a,h
  457.         or l
  458.         jr nz,SAVE_pg
  459.         ;call SAVECLOSE
  460.        
  461.         endif
  462.        
  463.         ;LD A,5
  464.         ;call ON_BANK
  465.         ld hl,0 ;OK
  466.         ret
  467.  
  468. findslash_or_zero
  469. ;hl=filename
  470. ;out: hl=at slash or zero, a=code
  471. findslash_or_zero0
  472.         ld a,(hl)
  473.         or a
  474.         ret z
  475.         cp '/'
  476.         ret z
  477.         inc hl
  478.         jr findslash_or_zero0
  479.        
  480. SAVECREATE
  481.         ;jr $
  482.         push iy
  483. SAVECREATE_retry
  484.         ld de,filename
  485.         OS_CREATEHANDLE
  486.          or a
  487.          jr z,SAVECREATE_nomkdir
  488. ;5=FR_NO_PATH
  489. ;надо создать путь элемент за элементом: md 1, md 1/2, md 1/2/3...
  490.         ld hl,filename
  491. SAVECREATE_mkdir0
  492.         call findslash_or_zero ;hl=at slash or zero, a=code
  493.         or a
  494.         jr z,SAVECREATE_retry ;path created
  495.         push hl ;hl=at slash or zero
  496.         ld (hl),0 ;end path at this slash
  497.         ld de,filename
  498.         OS_MKDIR ;возможно, такая директория уже есть!
  499.         pop hl ;hl=at slash or zero
  500.         ld (hl),'/' ;restore slash
  501.          cp FR_EXIST
  502.          jr z,SAVECREATE_mkdir_exist
  503.          or a
  504.          jp nz,mkdirerror
  505. SAVECREATE_mkdir_exist
  506.         inc hl ;after slash
  507.         jr SAVECREATE_mkdir0
  508. SAVECREATE_nomkdir
  509. ;b=new file handle
  510.         ld a,b
  511.         ld (savefilehandle),a
  512.         pop iy
  513.         ret
  514.  
  515. SAVECLOSE
  516.         push iy
  517. savefilehandle=$+1
  518.         ld b,0
  519.         OS_CLOSEHANDLE
  520.         pop iy
  521.         ret
  522.        
  523.        
  524. RDBYTE
  525.         INC LY
  526.         LD A,(IY)
  527.         RET NZ
  528. RDBYH
  529.         INC HY
  530.         LD A,HY
  531. ;RDBYHend=$+1
  532.         CP DISKBUF/256+(DISKBUFsz/256)
  533.         ;JR Z,rDDSK
  534.         LD A,(IY)
  535.          ccf ;CY=0: OK
  536.         RET nz
  537. ;rDDSK
  538.        PUSH HL
  539.        PUSH DE
  540.         PUSH BC
  541.         push IX
  542.        ;CALL rdCS
  543.        ex af,af' ;'
  544.        PUSH AF
  545.         exx
  546.         push bc
  547.         push de
  548.         push hl
  549.         ld de,DISKBUF
  550.         ld hl,DISKBUFsz
  551.          push de
  552.         call readstream_file
  553.          pop de
  554.          push de ;addr
  555. ;hl=actual size
  556.          ld a,h
  557.          or l
  558.          jp z,readerror
  559. ;move block to end of buf:
  560.         ld b,h
  561.         ld c,l
  562.         dec de ;ld de,DISKBUF-1
  563.         add hl,de ;end of data
  564.         ld de,DISKBUF+DISKBUFsz-1
  565.         sbc hl,de
  566.         add hl,de
  567.         jr z,ZIPRDBYHq
  568.          pop af
  569.         lddr
  570.         inc de ;begin of data
  571.          push de
  572. ZIPRDBYHq
  573.          pop iy ;addr = DISKBUF+
  574.        
  575.         pop hl
  576.         pop de
  577.         pop bc
  578.         exx
  579.        POP AF
  580.        ex af,af' ;'
  581.         POP IX
  582.         pop BC
  583.        POP DE
  584.          pop hl
  585.        ;ld iy,DISKBUF
  586.        LD A,(IY)
  587.        or a ;CY=0: OK
  588.         RET
  589.  
  590. ;Z61B7   LD A,#2E
  591. ;        LD (DE),A
  592. ;        INC DE
  593. ;Z61BB   LDI
  594. ;        RET PO
  595. ;        JR Z61BB
  596.  
  597. ML_FLEN DW 0
  598.        if SEEK32BIT
  599. ST_FLENw DW 0
  600.        else
  601. ST_FLEN DB 0
  602.        endif
  603.  
  604. prcrlf
  605.         ld hl,tcrlf
  606. prtext
  607.         ld a,(hl)
  608.         or a
  609.         ret z
  610.         push hl
  611.         push iy
  612.         PRCHAR_
  613.         pop iy
  614.         pop hl
  615.         inc hl
  616.         jr prtext
  617.        
  618. tcrcerror
  619.         db "CRC error"
  620. tcrlf
  621.         db 13,10,0
  622.  
  623.         include "../_sdk/file.asm"
  624.         include "../_sdk/stdio.asm"
  625.         include "zipfile.asm"
  626.         include "depk.asm"
  627.        
  628. defaultfilename
  629.         db "0:/12345/DOWNLOAD.ZIP",0
  630. filename
  631.         db "depkfile.fil"
  632.         ds filename+256-$ ;для длинных имён
  633.  
  634. CAT
  635. ;каждый файл по 16 байт:
  636. ;11 байт имя, 3 байта длина, 2 байта пропускаем
  637.         ds 0x900 ;TODO убрать
  638.        
  639. cmd_end
  640.  
  641. ;BUFER используется при парсинге архива и при печати комментария, не используется при распаковке
  642. BUFER=0x8000;$
  643. ;B_LEN=0x3f00-BUFER
  644. B_LEN=0xbfff-BUFER
  645. T6624=BUFER+8 ;flags
  646. T6626=BUFER+#0A ;T6626=METOД CЖATИЯ: 0:STORED, 8:DEFLATE, others unknown
  647. T6628=BUFER+#0C ;file last modification time
  648. Z6630=BUFER+#14
  649. Z6632=BUFER+#16
  650. Z6634=BUFER+#18
  651. Z6636=BUFER+#1A
  652. Z6638=BUFER+#1C ;file name length
  653. Z663A=BUFER+#1E ;extra field length
  654. Z663C=BUFER+#20 ;file comment length
  655. Z6646=BUFER+#2A ;(4)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.
  656. Z6648=BUFER+#2C
  657. Z664A=BUFER+#2E ;сюда кладётся имя файла
  658.  
  659.         display "Size ",/d,cmd_end-cmd_begin," bytes"
  660.  
  661.         savebin "pkunzip.com",cmd_begin,cmd_end-cmd_begin
  662.        
  663.         LABELSLIST "../../us/user.l",1
  664.