?login_element?

Subversion Repositories NedoOS

Rev

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

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