home *** CD-ROM | disk | FTP | other *** search
/ Brotikasten / BROTCD01.iso / cpm / unzip18.lbr / UNZIP12.ZZ0 / UNZIP12.Z80
Text File  |  1991-05-12  |  18KB  |  1,440 lines

  1. ; UNZIP.Z80
  2. ;
  3. ; Version 1.2 -- July 3, 1990 -- David P. Goodenough
  4. ;
  5. ; This file has been converted to assemble with SLR's Z80ASM, resulting
  6. ; in a COM file identical to the 1.2 release version.
  7. ;                    Gene Pizzetta, May 11, 1991
  8. ;
  9. CR    equ    0Dh
  10. LF    equ    0Ah
  11. CtrlZ    equ    1Ah
  12.  
  13. STRSIZ    equ    256
  14. EXTRACT    equ    'E'
  15. bdos    equ    5
  16. open    equ    0fh
  17. close    equ    10h
  18. read    equ    14h
  19. write    equ    15h
  20. create    equ    16h
  21. setdma    equ    1ah
  22. infcb    equ    5ch
  23. DLE    equ    144
  24. max_bits    equ    13
  25. init_bits    equ    9
  26. hsize    equ    8192
  27. first_ent    equ    257
  28. clear    equ    256
  29. maxcmax    equ    1 << max_bits
  30.  
  31. maxSF    equ    256
  32.  
  33. _code    equ    0
  34. _value    equ    2
  35. _bitlength    equ    3
  36.  
  37. _entries    equ    0
  38. _maxlength    equ    2
  39. _entry    equ    4
  40.  
  41. _sf_tree_    equ    4 + 4 * maxSF
  42.  
  43.  
  44.     jr    start
  45.     db    CR
  46. usage:    db    'Usage: UNZIP ZIPFILE [E]',CR,LF
  47.     db    'E - extract files',CR,LF
  48.     db    '    default is to just list files',CR,LF,0,CtrlZ
  49. start:    ld    sp,(6)        ; set the stack pointer
  50.     call    ilprt
  51.     db    'UNZIP  V1.2 - DPG  1990',CR,LF,LF,0
  52.     ld    a,(5dh)        ; filename?
  53.     cp    ' '
  54.     jr    nz,wasfil
  55.     ld    hl,usage
  56.     call    pstr
  57.     rst    0
  58. wasfil:    ld    a,(6dh)        ; option letter?
  59. ;.cseg
  60.     xor    EXTRACT        ; 'E' for extract
  61.     ld    (mode),a    ; set the mode
  62.     ld    a,(65h)
  63.     cp    20h
  64.     jr    nz,wasext
  65.     ld    hl,['I' << 8] + 'Z'
  66.     ld    (65h),hl
  67.     ld    a,'P'
  68.     ld    (67h),a    ; install .ZIP extent
  69. wasext:    ld    de,5ch
  70.     ld    c,open
  71.     call    bdos        ; try and open it
  72.     inc    a
  73.     jr    nz,openok    ; ok
  74.     call    ilprt
  75.     db    'Couldn''t find ZIP file',CR,LF,0
  76.     rst    0        ; complain and exit
  77. sigerr:    call    ilprt
  78.     db    'Bad signature in ZIP file',CR,LF,0
  79.     rst    0
  80. openok:    call    getword
  81.     ld    de,-[['K' << 8] + 'P']
  82.     add    hl,de
  83.     ld    a,h
  84.     or    l
  85.     jr    nz,sigerr
  86.     call    getword
  87.     dec    l
  88.     jr    nz,nocfhs
  89.     dec    h
  90.     dec    h
  91.     jr    nz,sigerr
  92.     call    pcfh
  93.     jr    openok
  94. nocfhs:    dec    l
  95.     dec    l
  96.     jr    nz,nolfhs
  97.     ld    a,h
  98.     sub    4
  99.     jr    nz,sigerr
  100.     call    plfh
  101.     jr    openok
  102. nolfhs:    dec    l
  103.     dec    l
  104.     jr    nz,sigerr
  105.     ld    a,h
  106.     sub    6
  107.     jr    nz,sigerr
  108.     call    pecd
  109.     rst    0
  110.  
  111. pcfh:    ld    b,12
  112. pcfhl1:    push    bc
  113.     call    getword
  114.     pop    bc
  115.     djnz    pcfhl1
  116.     call    getword
  117.     push    hl
  118.     call    getword
  119.     push    hl
  120.     call    getword
  121.     pop    de
  122.     pop    bc
  123.     push    hl
  124.     push    de
  125.     push    bc
  126.     ld    b,6
  127. pcfhl2:    push    bc
  128.     call    getword
  129.     pop    bc
  130.     djnz    pcfhl2
  131.     pop    hl
  132.     ld    de,junk
  133. ;.cseg
  134.     call    getstring
  135.     pop    hl
  136.     ld    de,junk
  137.     call    getstring
  138.     pop    hl
  139.     ld    de,junk
  140.     call    getstring
  141.     ret
  142.  
  143. pecd:    ld    b,8
  144. pecdl:    push    bc
  145.     call    getword
  146.     pop    bc
  147.     djnz    pecdl
  148.     call    getword
  149.     ld    de,junk
  150.     call    getstring
  151.     ret
  152.  
  153. ;.cseg
  154.  
  155. plfh:    ld    de,lfh
  156.     ld    hl,endlfh-lfh
  157. ;    ld    hl,{endlfh - lfh}
  158.     call    getstring
  159.     ld    hl,opfcb
  160.     ld    de,opfcb + 1
  161.     ld    bc,32
  162.     ld    (hl),b
  163.     ldir
  164. ;.cseg
  165.     ld    de,junk
  166.     ld    hl,(fnl)
  167.     call    getstring
  168.     ld    de,junk + 20
  169.     ld    hl,(efl)
  170.     call    getstring
  171.     ld    de,junk
  172.     ld    hl,opfn
  173.     ld    b,8
  174.     call    scanfn
  175.     ld    a,(de)
  176.     cp    '.'
  177.     jr    nz,nodot
  178.     inc    de
  179. nodot:    ld    b,3
  180.     call    scanfn
  181.     ld    hl,init
  182.     ld    de,vars
  183.     ld    bc,endinit-init
  184. ;    ld    bc,{endinit - init}
  185.     ldir
  186. ;.cseg
  187.  
  188.     ld    a,(mode)
  189. resmod:    ld    (curmode),a
  190.     or    a
  191.     jr    nz,extrct
  192.     ld    de,opfcb
  193.     ld    c,0fh
  194.     call    bdos
  195.     inc    a
  196.     jr    z,creok
  197.     ld    hl,junk
  198.     call    pstr
  199.     call    ilprt
  200.     db    ' already exists',0
  201. noex:    call    ilprt
  202.     db    ' -- not extracting',0
  203.     ld    a,0ffh
  204.     jr    resmod
  205. extrct:    xor    a
  206.     ld    (zipeof),a
  207.     ld    a,(curmode)
  208.     dec    a
  209.     jp    m,doext
  210.     call    ilprt
  211.     db    'Checking ',0
  212.     jr    pjunk
  213. creok:    ld    de,opfcb
  214.     ld    c,create
  215.     call    bdos
  216.     inc    a
  217.     jr    nz,opnok1
  218.     call    ilprt
  219.     db    'Error creating ',0
  220.     ld    hl,junk
  221.     call    pstr
  222.     jr    noex
  223. opnok1:    call    ilprt
  224.     db    'Extracting ',0
  225. pjunk:    ld    hl,junk
  226.     call    pstr
  227. doext:    call    ilprt
  228.     db    ' -- ',0
  229.     ld    hl,counting
  230.     inc    (hl)
  231.     ld    a,(cm)
  232.     or    a
  233.     jr    nz,case1
  234. case0w:    ld    a,(zipeof)
  235.     and    1
  236.     jr    nz,closeo
  237. savcs0:    call    getbyte
  238.     call    outbyte
  239.     jr    case0w
  240. case1:    dec    a
  241.     jr    nz,case2p
  242.     call    unshrink
  243.     jr    closeo
  244. case2p:    dec    a
  245.     cp    4
  246.     jr    nc,tryimp
  247.     call    unreduce
  248.     jr    closeo
  249. tryimp:    jr    nz,badzip
  250.     call    unimplode
  251.     jr    closeo
  252. badzip:    call    ilprt
  253.     db    'Unknown compression method',CR,LF,0
  254.     ret
  255. closeo:    ld    hl,zipeof
  256.     dec    (hl)
  257.     inc    hl
  258.     dec    (hl)
  259.     ld    a,(mode)
  260.     or    a
  261.     jr    nz,nocls
  262.     ld    hl,wrtpt
  263.     ld    a,(hl)
  264.     or    a
  265.     jr    z,noflsh
  266.     ld    de,opbuf
  267. ;.cseg
  268.     ld    c,setdma
  269.     call    bdos
  270.     ld    de,opfcb
  271.     ld    c,write
  272.     call    bdos
  273. noflsh:    ld    de,opfcb
  274.     ld    c,close
  275.     call    bdos
  276. nocls:    ld    hl,crc32
  277.     ld    de,crc
  278.     scf
  279.     ld    bc,4 << 8
  280. crcclp:    ld    a,(de)
  281.     adc    a,(hl)
  282.     push    af
  283.     or    c
  284.     ld    c,a
  285.     pop    af
  286.     inc    hl
  287.     inc    de
  288.     djnz    crcclp
  289.     ld    a,c
  290.     or    a
  291.     jr    z,crcok
  292.     call    ilprt
  293.     db    'CRC error',CR,LF,0
  294.     ret
  295. crcok:    call    ilprt
  296.     db    'CRC OK',CR,LF,0
  297.     ret
  298.  
  299. getchla:
  300.     call    getcode
  301.     ld    (code),hl
  302.     ld    a,(zipeof)
  303.     and    1
  304.     ret
  305.  
  306. savstk:
  307.     ld    hl,(stackp)
  308.     dec    hl
  309.     ld    (stackp),hl
  310.     ld    (hl),a
  311.     ret
  312.  
  313. getcode:
  314.     ld    a,(codesize)
  315. readbits:
  316.     ld    hl,8000h
  317. bitlp:    push    af
  318.     push    hl
  319. getbit:    ld    hl,bleft
  320.     dec    (hl)
  321.     jp    m,readbt
  322.     dec    hl
  323.     rr    (hl)
  324.     pop    hl
  325.     rr    h
  326.     rr    l
  327.     pop    af
  328.     dec    a
  329.     jr    nz,bitlp
  330. finbit:    srl    h
  331.     rr    l
  332.     jr    nc,finbit
  333.     ld    a,l
  334.     ret
  335. readbt:    push    hl
  336.     call    getbyte
  337.     pop    hl
  338.     ld    (hl),8
  339.     dec    hl
  340.     ld    (hl),a
  341.     jr    getbit
  342.  
  343. scanfn:    ld    a,(de)
  344.     cp    '.'
  345.     jr    z,nocopy
  346.     or    a
  347.     jr    z,nocopy
  348.     inc    de
  349.     dec    b
  350.     jp    m,scanfn
  351.     ld    (hl),a
  352.     inc    hl
  353.     jr    scanfn
  354. nocopy:    dec    b
  355.     ret    m
  356.     ld    (hl),' '
  357.     inc    hl
  358.     jr    nocopy
  359.  
  360. ilprt:    pop    hl
  361.     call    pstr
  362.     jp    (hl)
  363.  
  364. pstr:    ld    a,(hl)
  365.     or    a
  366.     ret    z
  367.     push    hl
  368.     ld    e,a
  369.     ld    c,2
  370.     call    bdos
  371.     pop    hl
  372.     inc    hl
  373.     jr    pstr
  374.  
  375. getstring:
  376.     ld    a,h
  377.     or    l
  378.     ld    (de),a
  379.     ret    z
  380.     push    de
  381.     push    hl
  382.     call    getbyte
  383.     pop    hl
  384.     pop    de
  385.     ld    (de),a
  386.     inc    de
  387.     dec    hl
  388.     jr    getstring
  389.  
  390. getword:
  391.     call    getbyte
  392.     push    af
  393.     call    getbyte
  394.     pop    hl
  395.     ld    l,h
  396.     ld    h,a
  397.     ret
  398.  
  399. getbyte:
  400.     ld    a,(zipeof)
  401.     and    1
  402.     ld    a,CtrlZ
  403.     ret    nz
  404.     ld    a,(counting)
  405.     or    a
  406.     jr    z,skpdci
  407.     ld    hl,(cs)
  408.     ld    de,(cs + 2)
  409.     ld    a,d
  410.     or    e
  411.     or    h
  412.     or    l
  413.     jr    nz,noteof
  414.     ld    hl,zipeof
  415.     inc    (hl)
  416.     ld    a,CtrlZ
  417.     ret
  418. noteof:    ld    a,h
  419.     or    l
  420.     dec    hl
  421.     ld    (cs),hl
  422.     jr    nz,skpdci
  423.     dec    de
  424.     ld    (cs + 2),de
  425. skpdci:    ld    hl,readpt
  426. ;.cseg
  427.     ld    a,(hl)
  428.     or    a
  429.     jr    nz,ptok
  430.     ld    de,80h
  431.     ld    (hl),e
  432.     push    hl
  433.     ld    c,setdma
  434.     call    bdos
  435.     ld    de,infcb
  436.     ld    c,read
  437.     call    bdos
  438.     or    a
  439.     pop    hl
  440.     jr    nz,ateof
  441. ptok:    ld    a,(hl)
  442.     inc    (hl)
  443.     ld    l,a
  444.     ld    h,0
  445.     ld    a,(hl)
  446.     ret
  447. ateof:    ld    a,CtrlZ
  448.     ret
  449.  
  450. outb:
  451.     ld    hl,(outpos)
  452.     push    hl
  453.     push    af
  454.     ld    a,h
  455.     and    1fh
  456.     ld    h,a
  457.     pop    af
  458.     ld    de,outbuf
  459.     add    hl,de
  460.     ld    (hl),a
  461.     pop    hl
  462.     inc    hl
  463.     ld    (outpos),hl
  464.     push    af
  465.     ld    a,h
  466.     or    l
  467.     jr    nz,nopos
  468.     ld    hl,(outpos + 2)
  469.     inc    hl
  470.     ld    (outpos + 2),hl
  471. nopos:    pop    af
  472.  
  473. outbyte:
  474.     push    af
  475.     call    updcrc
  476.     ld    hl,(ucs)
  477.     ld    de,(ucs + 2)
  478.     ld    a,h
  479.     or    l
  480.     dec    hl
  481.     ld    (ucs),hl
  482.     jr    nz,tsthl0
  483.     dec    de
  484.     ld    (ucs + 2),de
  485. tsthl0:    ld    a,h
  486.     or    l
  487.     or    d
  488.     or    e
  489.     jr    nz,noeof
  490.     ld    hl,zipeof
  491.     inc    (hl)
  492. noeof:    ld    a,(mode)
  493.     or    a
  494.     jr    nz,popret
  495.     ld    hl,wrtpt
  496.     ld    a,(hl)
  497.     add    a,a
  498.     jr    nc,wptok
  499.     ld    de,opbuf
  500.     ld    c,setdma
  501.     call    bdos
  502.     ld    de,opfcb
  503.     ld    c,write
  504.     call    bdos
  505.     or    a
  506.     jr    z,wptok
  507.     ld    (mode),a
  508.     call    ilprt
  509.     db    'Write Error',CR,LF,0
  510. popret:    pop    af
  511.     ret
  512. wptok:    jr    nz,nofilb
  513.     ld    hl,opbuf
  514.     ld    de,opbuf + 1
  515.     ld    bc,127
  516.     ld    (hl),CtrlZ
  517.     ldir
  518.     xor    a
  519.     ld    (wrtpt),a
  520. nofilb:    pop    af
  521.     ld    hl,wrtpt
  522.     inc    (hl)
  523.     ld    l,(hl)
  524.     ld    h,0
  525.     ld    de,opbuf - 1
  526.     add    hl,de
  527.     ld    (hl),a
  528.     ret
  529.  
  530. updcrc:    ld    hl,(crc32)
  531.     ld    de,(crc32 + 2)
  532.     ld    c,a
  533.     ld    b,8
  534. crclp:    ld    a,l
  535.     xor    c
  536.     srl    c
  537.     srl    d
  538.     rr    e
  539.     rr    h
  540.     rr    l
  541.     rra
  542.     jr    nc,noxor
  543.     ld    a,d
  544.     xor    0edh
  545.     ld    d,a
  546.     ld    a,e
  547.     xor    0b8h
  548.     ld    e,a
  549.     ld    a,h
  550.     xor    83h
  551.     ld    h,a
  552.     ld    a,l
  553.     xor    20h
  554.     ld    l,a
  555. noxor:    djnz    crclp
  556.     ld    (crc32),hl
  557.     ld    (crc32 + 2),de
  558.     ret
  559.  
  560. unshrink:
  561.     ld    a,init_bits
  562.     ld    (codesize),a
  563.     ld    hl,[1 << init_bits] - 1;
  564.     ld    (maxcode),hl
  565.     ld    hl,first_ent
  566.     ld    (free_ent),hl
  567.     ld    hl,prefix_of
  568.     ld    de,prefix_of + 1
  569.     ld    bc,512
  570.     ld    (hl),c
  571.     ldir
  572.     ld    bc,16386 - 512
  573.     ld    (hl),-1
  574.     ldir
  575.     ld    hl,suffix_of
  576. sol:    ld    (hl),c
  577.     inc    hl
  578.     inc    c
  579.     jr    nz,sol
  580.     call    getchla
  581.     ld    (oldcode),hl
  582.     ret    nz
  583.     ld    a,l
  584.     ld    (finchar),a
  585.     call    outbyte
  586. unshlp:    ld    hl,stack + 8192
  587.     ld    (stackp),hl
  588.     ld    a,(zipeof)
  589.     and    1
  590.     ret    nz
  591. clrlp:    call    z,getchla
  592.     ret    nz
  593.     ld    a,h
  594.     dec    a
  595.     or    l
  596.     jr    nz,noclr
  597.     call    getchla
  598.     ld    a,h
  599.     or    a
  600.     jr    nz,clrlp
  601.     dec    l
  602.     jr    z,bumpcs
  603.     dec    l
  604.     call    z,partial_clear
  605.     jr    clrlp
  606. bumpcs:    ld    hl,codesize
  607.     inc    (hl)
  608.     ld    a,(hl)
  609.     cp    max_bits
  610.     ld    hl,maxcmax
  611.     jr    z,atmax
  612.     ld    hl,1
  613. maxclp:    add    hl,hl
  614.     dec    a
  615.     jr    nz,maxclp
  616.     dec    hl
  617. atmax:    ld    (maxcode),hl
  618.     jr    clrlp
  619. noclr:    ld    (incode),hl
  620.     add    hl,hl
  621.     ld    de,prefix_of
  622.