Subversion Repositories NedoOS

Rev

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

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