home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ENTERPRS / CPM / UTILS / S / 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.     add    hl,de
  623.     ld    a,(hl)
  624.     inc    hl
  625.     and    (hl)
  626.     inc    a
  627.     ld    hl,(code)
  628.     jr    nz,noKwKw
  629.     ld    a,(finchar)
  630.     call    savstk
  631.     ld    hl,(oldcode)
  632. noKwKw:    ex    de,hl
  633. staklp: ld    hl,suffix_of
  634.     add    hl,de
  635.     ld    a,(hl)
  636.     call    savstk
  637.     ld    hl,100h
  638.     or    a
  639.     sbc    hl,de
  640.     jr    nc,unstak
  641.     ld    hl,prefix_of
  642.     add    hl,de
  643.     add    hl,de
  644.     ld    e,(hl)
  645.     inc    hl
  646.     ld    d,(hl)
  647.     jr    staklp
  648. unstak:    ld    (finchar),a
  649.     ld    de,(stackp)
  650. unslp:    ld    hl,stack + 8192
  651.     or    a
  652.     sbc    hl,de
  653.     jr    z,newent
  654.     ld    a,(de)
  655.     inc    de
  656.     push    de
  657.     call    outbyte
  658.     pop    de
  659.     jr    unslp
  660. newent:    ld    hl,(free_ent)
  661.     ld    (code),hl
  662.     ex    de,hl
  663.     ld    hl,1fffh
  664.     or    a
  665.     sbc    hl,de
  666.     jr    c,full
  667.     ld    hl,prefix_of
  668.     add    hl,de
  669.     add    hl,de
  670.     ld    bc,(oldcode)
  671.     ld    (hl),c
  672.     inc    hl
  673.     ld    (hl),b
  674.     ld    hl,suffix_of
  675.     add    hl,de
  676.     ld    a,(finchar)
  677.     ld    (hl),a
  678. getfre:    inc    de
  679.     ld    hl,1fffh
  680.     or    a
  681.     sbc    hl,de
  682.     jr    c,full1
  683.     ld    hl,prefix_of
  684.     add    hl,de
  685.     add    hl,de
  686.     ld    a,(hl)
  687.     inc    hl
  688.     and    (hl)
  689.     inc    a
  690.     jr    nz,getfre
  691. full1:    ld    (free_ent),de
  692. full:    ld    hl,(incode)
  693.     ld    (oldcode),hl
  694.     jp    unshlp
  695.  
  696. partial_clear:
  697.     ld    de,first_ent
  698. l8:    ld    hl,(free_ent)
  699.     or    a
  700.     sbc    hl,de
  701.     jr    z,br8
  702.     ld    hl,prefix_of + 1
  703.     add    hl,de
  704.     add    hl,de
  705.     set    7,(hl)
  706.     inc    de
  707.     jr    l8
  708. br8:    ld    de,first_ent
  709. l9:    ld    hl,(free_ent)
  710.     or    a
  711.     sbc    hl,de
  712.     jr    z,br9
  713.     ld    hl,prefix_of
  714.     add    hl,de
  715.     add    hl,de
  716.     push    de
  717.     ld    e,(hl)
  718.     inc    hl
  719.     ld    d,(hl)
  720.     res    7,d
  721.     ld    hl,first_ent - 1
  722.     or    a
  723.     sbc    hl,de
  724.     jr    nc,ei10
  725.     ld    hl,prefix_of + 1
  726.     add    hl,de
  727.     add    hl,de
  728.     res    7,(hl)
  729. ei10:    pop    de
  730.     inc    de
  731.     jr    l9
  732. br9:    ld    de,first_ent
  733. l10:    ld    hl,(free_ent)
  734.     or    a
  735.     sbc    hl,de
  736.     jr    z,br10
  737.     ld    hl,prefix_of + 1
  738.     add    hl,de
  739.     add    hl,de
  740.     bit    7,(hl)
  741.     jr    z,ei11
  742.     ld    (hl),-1
  743.     dec    hl
  744.     ld    (hl),-1
  745. ei11:    inc    de
  746.     jr    l10
  747. br10:    ld    de,first_ent
  748. l11:    ld    hl,maxcmax
  749.     or    a
  750.     sbc    hl,de
  751.     jr    z,br11
  752.     ld    hl,prefix_of
  753.     add    hl,de
  754.     add    hl,de
  755.     ld    a,(hl)
  756.     inc    hl
  757.     and    (hl)
  758.     inc    a
  759.     jr    z,br11
  760.     inc    de
  761.     jr    l11
  762. br11:    ld    (free_ent),de
  763.     ret
  764.  
  765. loadfollowers:
  766.     ld    hl,Slen + 255
  767.     ld    b,0
  768. lflp:    push    bc
  769.     push    hl
  770.     ld    a,6
  771.     call    readbits
  772.     pop    hl
  773.     pop    de
  774.     ld    (hl),a
  775.     push    de
  776.     push    hl
  777.     dec    d
  778.     ld    hl,followers
  779.     call    shftadd
  780.     ld    b,a
  781.     or    a
  782.     jr    z,nofoll
  783. ldfllp:    push    hl
  784.     push    bc
  785.     ld    a,8
  786.     call    readbits
  787.     pop    bc
  788.     pop    hl
  789.     ld    (hl),a
  790.     inc    hl
  791.     djnz    ldfllp
  792. nofoll:    pop    hl
  793.     pop    bc
  794.     dec    hl
  795.     djnz    lflp
  796.     ret
  797. ;.cseg
  798.  
  799. unreduce:
  800.  
  801. ;.cseg
  802.     ld    e,a
  803.     ld    d,0
  804.     ld    hl,_L_table
  805.     add    hl,de
  806.     ld    a,(hl)
  807.     ld    (L_table),a
  808.     ld    hl,_D_shift
  809.     add    hl,de
  810.     ld    a,(hl)
  811.     ld    (D_shift),a
  812.     xor    a
  813.     ld    (ExState),a
  814.     ld    (lchar),a
  815.     call    loadfollowers
  816. ur1:    ld    a,(zipeof)
  817.     and    1
  818.     ret    nz
  819.     call    slenlch
  820.     or    a
  821.     jr    nz,ur2
  822. ur4:    ld    a,8
  823.     call    readbits
  824.     jr    ur3
  825. ur2:    ld    a,1
  826.     call    readbits
  827.     dec    l
  828.     jr    z,ur4
  829.     call    slenlch
  830.     dec    a
  831.     or    1
  832.     ld    l,a
  833.     xor    a
  834. btlp:    inc    a
  835.     srl    l
  836.     jr    nz,btlp
  837.     call    readbits
  838.     ld    de,followers
  839.     add    hl,de
  840.     ld    de,(lchar - 1)
  841.     call    shftadd
  842.     ld    a,(hl)
  843. ur3:    ld    (nchar),a
  844.     ld    l,a
  845.     ld    a,(ExState)
  846.     or    a
  847.     jr    nz,ur5
  848.     ld    a,l
  849.     cp    DLE    
  850.     jr    nz,ur9
  851.     ld    a,1
  852.     ld    (ExState),a
  853.     jr    ur6
  854. ur5:    dec    a
  855.     jr    nz,ur7
  856.     ld    a,l
  857.     or    a
  858.     jr    z,ur10
  859.     ld    (V),a
  860.     ld    a,(L_table)
  861.     ld    h,a
  862.     and    l
  863.     cp    h
  864.     ld    l,a
  865.     ld    h,0
  866.     ld    (Len),hl
  867.     jr    nz,ur12
  868.     ld    a,2
  869.     jr    ur11
  870. ur10:    ld    (ExState),a
  871.     ld    a,DLE
  872. ur9:    call    outb
  873.     jr    ur6
  874. ur7:    dec    a
  875.     jr    nz,ur8
  876.     ld    a,l
  877.     ld    hl,Len
  878.     add    a,(hl)
  879.     ld    (hl),a
  880.     jr    nc,ur12
  881.     inc    hl
  882.     inc    (hl)
  883. ur12:    ld    a,3
  884.     jr    ur11
  885. ur8:    dec    a
  886.     jr    nz,ur13
  887.     ld    a,(D_shift)
  888.     ld    b,a
  889.     ld    a,(V)
  890. ur14:    srl    a
  891.     djnz    ur14
  892.     ld    h,a
  893.     inc    hl
  894.     ld    bc,(Len)
  895.     inc    bc
  896.     inc    bc
  897.     inc    bc
  898.     call    callback
  899. ur13:    xor    a
  900. ur11:    ld    (ExState),a
  901. ur6:    ld    a,(nchar)
  902.     ld    (lchar),a
  903.     jp    ur1
  904.  
  905. slenlch:
  906.     ld    hl,(lchar)
  907.     ld    h,0
  908.     ld    de,Slen
  909.     add    hl,de
  910.     ld    a,(hl)
  911.     ret
  912.  
  913. shftadd:
  914.     ld    e,0
  915.     srl    d
  916.     rr    e
  917.     srl    d
  918.     rr    e
  919.     add    hl,de
  920.     ret
  921.  
  922. callback:
  923.     push    bc
  924.     push    hl
  925.     ld    hl,(outpos)
  926.     ld    de,(outpos + 2)
  927.     pop    bc
  928.     or    a
  929.     sbc    hl,bc
  930.     jr    nc,cb2
  931.     dec    de
  932. cb2:    pop    bc
  933. cb3:    bit    7,d
  934.     jr    z,cb4
  935.     ld    a,b
  936.     or    c
  937.     jr    z,cb4
  938.     xor    a
  939.     call    outbp
  940.     inc    hl
  941.     ld    a,h
  942.     or    l
  943.     jr    nz,cb5
  944.     inc    de
  945. cb5:    dec    bc
  946.     jr    cb3
  947. cb4:    ex    de,hl
  948. cb6:    ld    a,b
  949.     or    c
  950.     ret    z
  951.     ld    a,d
  952.     and    1fh
  953.     ld    d,a
  954.     ld    hl,outbuf
  955.     add    hl,de
  956.     ld    a,(hl)
  957.     call    outbp
  958.     inc    de
  959.     dec    bc
  960.     jr    cb6
  961.  
  962. outbp:    push    hl
  963.     push    de
  964.     push    bc
  965.     call    outb
  966.     pop    bc
  967.     pop    de
  968.     pop    hl
  969.     ret
  970.  
  971. ;.cseg
  972.  
  973. readlengths:
  974.     ld    a,8
  975.     call    readbits
  976.     ld    d,h
  977.     ld    e,d
  978.     inc    hl
  979.     ld    b,h
  980.     ld    c,l
  981.     ld    (ix + _maxlength),e
  982.     ld    (ix + _maxlength + 1),d
  983.     push    ix
  984.     pop    hl
  985.     inc    hl
  986.     inc    hl
  987.     inc    hl
  988. rl1:    ld    a,b
  989.     or    c
  990.     ret    z
  991.     push    bc
  992.     push    de
  993.     push    hl
  994.     ld    a,4
  995.     call    readbits
  996.     inc    a
  997.     push    af
  998.     ld    a,4
  999.     call    readbits
  1000.     inc    a
  1001.     ld    b,a
  1002.     pop    af
  1003.     ld    c,a
  1004.     pop    hl
  1005.     pop    de
  1006.     ld    a,(ix + _maxlength)
  1007.     cp    c
  1008.     jr    nc,rl2
  1009.     ld    (ix + _maxlength),c
  1010. rl2:    inc    hl
  1011.     inc    hl
  1012.     inc    hl
  1013.     ld    (hl),e
  1014.     inc    hl
  1015.     ld    (hl),c
  1016.     inc    e
  1017.     djnz    rl2
  1018.     pop    bc
  1019.     dec    bc
  1020.     jr    rl1
  1021.  
  1022. sortlengths:
  1023.     ld    h,(ix + _entries + 1)
  1024.     ld    l,(ix + _entries)
  1025.     ld    b,h
  1026.     ld    c,l
  1027.     ld    (entrs),hl
  1028. ;.cseg
  1029. sl7:    srl    b
  1030.     rr    c
  1031. sl1:    ld    a,b
  1032.     or    c
  1033.     ret    z
  1034.     ld    (noswps),a
  1035.     push    ix
  1036.     ld    de,4
  1037.     add    ix,de
  1038.     push    ix
  1039.     pop    iy
  1040.     add    iy,bc
  1041.     add    iy,bc
  1042.     add    iy,bc
  1043.     add    iy,bc
  1044.     ld    hl,(entrs)
  1045.     or    a
  1046.     sbc    hl,bc
  1047. sl2:    ld    a,(ix + _bitlength)
  1048.     cp    (iy + _bitlength)
  1049.     jr    c,sl4
  1050.     jr    nz,sl3
  1051.     ld    a,(iy + _value)
  1052.     cp    (ix + _value)
  1053.     jr    nc,sl4
  1054. sl3:    ld    d,e
  1055. sl5:    ld    a,(ix)
  1056.     push    af
  1057.     ld    a,(iy)
  1058.     ld    (ix),a
  1059.     pop    af
  1060.     ld    (iy),a
  1061.     inc    ix
  1062.     inc    iy
  1063.     dec    d
  1064.     jr    nz,sl5
  1065.     ld    a,d
  1066.     ld    (noswps),a
  1067.     jr    sl6
  1068. sl4:    add    ix,de
  1069.     add    iy,de
  1070. sl6:    dec    hl
  1071.     ld    a,h
  1072.     or    l
  1073.     jr    nz,sl2
  1074.     pop    ix
  1075.     ld    a,(noswps)
  1076.     or    a
  1077.     jr    nz,sl7
  1078.     jr    sl1
  1079.  
  1080. ;.cseg
  1081.  
  1082. generatetrees:
  1083.     ld    l,(ix + _entries)
  1084.     ld    h,(ix + _entries + 1)
  1085.     ld    c,l
  1086.     ld    b,h
  1087.     push    ix
  1088.     pop    de
  1089.     add    hl,hl
  1090.     add    hl,hl
  1091.     add    hl,de
  1092.     push    hl
  1093.     pop    iy
  1094.     xor    a
  1095.     ld    d,a
  1096.     ld    e,a
  1097.     ld    h,a
  1098.     ld    l,a
  1099.     ld    (lbl),a
  1100. gt1:    ld    a,b
  1101.     or    c
  1102.     ret    z
  1103.     dec    bc
  1104.     add    hl,de    
  1105.     ld    a,(lbl)
  1106.     cp    (iy + _bitlength)
  1107.     jr    z,gt2
  1108.     ld    a,(iy + _bitlength)
  1109.     ld    (lbl),a
  1110.     sub    16
  1111.     ex    de,hl
  1112.     ld    hl,1
  1113.     jr    z,gt3
  1114. gt4:    add    hl,hl
  1115.     inc    a
  1116.     jr    nz,gt4
  1117. gt3:    ex    de,hl
  1118. gt2:    ld    (iy + _code),l
  1119.     ld    (iy + _code + 1),h
  1120.     push    de
  1121.     ld    de,-4
  1122.     add    iy,de
  1123.     pop    de
  1124.     jr    gt1
  1125.  
  1126. ldtrees:
  1127.     ld    a,(gpbf)
  1128.     rra
  1129.     ld    l,a
  1130.     and    1
  1131.     add    a,6
  1132.     ld    (dictb),a
  1133.     ld    a,l
  1134.     rra
  1135.     and    1
  1136.     ld    (ltp),a
  1137.     set    1,a
  1138.     ld    (mml),a
  1139.     ld    ix,lit_tree
  1140.     ld    hl,256
  1141.     call    nz,ld_tree
  1142.     ld    hl,64
  1143.     ld    ix,len_tree
  1144.     call    ld_tree
  1145.     ld    hl,64
  1146.     ld    ix,dist_tre
  1147.  
  1148. ld_tree:
  1149.     ld    (ix + _entries),l
  1150.     ld    (ix + _entries + 1),h
  1151.     call    readlengths
  1152.     call    sortlengths
  1153.     call    generatetrees
  1154.  
  1155. reversebits:
  1156.     push    ix
  1157.     pop    hl
  1158.     ld    e,(hl)
  1159.     inc    hl
  1160.     ld    d,(hl)
  1161. rb1:    inc    hl
  1162.     inc    hl
  1163.     inc    hl
  1164.     ld    c,(hl)
  1165.     ld    b,8
  1166. rb2:    srl    c
  1167.     adc    a,a
  1168.     djnz    rb2
  1169.     push    af
  1170.     inc    hl
  1171.     ld    c,(hl)
  1172.     ld    b,8
  1173. rb3:    srl    c
  1174.     adc    a,a
  1175.     djnz    rb3
  1176.     dec    hl
  1177.     ld    (hl),a
  1178.     pop    af
  1179.     inc    hl
  1180.     ld    (hl),a
  1181.     dec    de
  1182.     ld    a,d
  1183.     or    e
  1184.     jr    nz,rb1
  1185.     ret
  1186.  
  1187. readtree:
  1188.     push    ix
  1189.     pop    iy
  1190.     ld    de,4
  1191.     add    iy,de
  1192.     ld    b,d
  1193.     ld    e,d
  1194.     ld    h,d
  1195.     ld    l,d
  1196. rt1:    push    hl
  1197.     push    de
  1198.     push    bc
  1199.     ld    a,1
  1200.     call    readbits
  1201.     pop    af
  1202.     push    af
  1203.     or    a
  1204.     jr    z,rt2
  1205. rt3:    add    hl,hl
  1206.     dec    a
  1207.     jr    nz,rt3
  1208. rt2:    pop    bc
  1209.     pop    de
  1210.     add    hl,de
  1211.     ex    de,hl
  1212.     inc    b
  1213.     pop    hl
  1214. rt4:    ld    a,(iy + _bitlength)
  1215.     cp    b
  1216.     jr    nc,rt5
  1217.     push    de
  1218.     ld    de,4
  1219.     add    iy,de
  1220.     pop    de
  1221.     inc    hl
  1222.     ld    a,(ix + _entries)
  1223.     sub    l
  1224.     jr    nz,rt4
  1225.     ld    a,(ix + _entries + 1)
  1226.     sub    h
  1227.     jr    nz,rt4
  1228. rt6:    dec    a
  1229.     ret
  1230. rt5:    ld    a,(iy + _bitlength)
  1231.     cp    b
  1232.     jr    nz,rt1
  1233.     ld    a,(iy + _code)
  1234.     cp    e
  1235.     jr    nz,rt7
  1236.     ld    a,(iy + _code + 1)
  1237.     cp    d
  1238.     jr    nz,rt7
  1239.     ld    a,(iy + _value)
  1240.     ret
  1241. rt7:    push    de
  1242.     ld    de,4
  1243.     add    iy,de
  1244.     pop    de
  1245.     inc    hl
  1246.     ld    a,(ix + _entries)
  1247.     sub    l
  1248.     jr    nz,rt5
  1249.     ld    a,(ix + _entries + 1)
  1250.     sub    h
  1251.     jr    nz,rt5
  1252.     jr    rt6
  1253.  
  1254. unimplode:
  1255.     call    ldtrees
  1256. ui1:    ld    a,(zipeof)
  1257.     and    1
  1258.     ret    nz
  1259.     inc    a
  1260.     call    readbits
  1261.     or    a
  1262.     jr    z,ui2
  1263.     ld    a,(ltp)
  1264.     or    a
  1265.     jr    z,ui3
  1266.     ld    ix,lit_tree
  1267.     call    readtree
  1268.     jr    ui4
  1269. ui3:    ld    a,8
  1270.     call    readbits
  1271. ui4:    call    outb
  1272.     jr    ui1
  1273. ui2:    ld    a,(dictb)
  1274.     call    readbits
  1275.     push    hl
  1276.     ld    ix,dist_tre
  1277.     call    readtree
  1278.     ld    bc,(dictb - 1)
  1279. ui5:    add    hl,hl
  1280.     djnz    ui5
  1281.     pop    bc
  1282.     add    hl,bc
  1283.     push    hl
  1284.     ld    ix,len_tree
  1285.     call    readtree
  1286.     ld    l,a
  1287.     ld    h,0
  1288.     cp    63
  1289.     jr    nz,ui6
  1290.     push    hl
  1291.     ld    a,8
  1292.     call    readbits
  1293.     pop    de
  1294.     add    hl,de
  1295. ui6:    ld    de,(mml)
  1296.     ld    d,0
  1297.     add    hl,de
  1298.     ld    b,h
  1299.     ld    c,l
  1300.     pop    hl
  1301.     inc    hl
  1302.     call    callback
  1303.     jr    ui1
  1304.     
  1305. ;======================
  1306. ;    DSEG
  1307. ;.dseg
  1308. zipeof:    db    2
  1309. counting:
  1310.     db    0
  1311. ;.dseg
  1312. init:
  1313. ;.dseg
  1314.     db    0
  1315. ;.dseg
  1316.     db    0
  1317. ;.dseg
  1318.     dw    0,0
  1319. ;.dseg
  1320.     dw    -1,-1
  1321. endinit:
  1322. ;.dseg
  1323. readpt:    db    0
  1324. ;.dseg
  1325. _L_table:
  1326.     db    7fh, 3fh, 1fh, 0fh
  1327.  
  1328. _D_shift:
  1329.     db    07h, 06h, 05h, 04h
  1330.  
  1331.  
  1332.  
  1333.  
  1334. ;.useg
  1335. mode:    ds    1
  1336. ;.useg
  1337. junk:    ds    STRSIZ
  1338. ;.useg
  1339. lfh:
  1340. vnte:    ds    2
  1341. gpbf:    ds    2
  1342. cm:    ds    2
  1343. lmft:    ds    2
  1344. lmfd:    ds    2
  1345. crc:    ds    4
  1346. cs:    ds    4
  1347. ucs:    ds    4
  1348. fnl:    ds    2
  1349. efl:    ds    2
  1350. endlfh:
  1351.     ds    1
  1352. ;.useg
  1353. opfcb:    ds    1
  1354. opfn:    ds    8
  1355. opext:    ds    3
  1356.     ds    4 + 16 + 1
  1357. ;.useg
  1358. bitbuf:    ds    1
  1359.  
  1360. ;.useg
  1361. vars:
  1362. ;.useg
  1363. bleft:    ds    1
  1364. ;.useg
  1365. wrtpt:    ds    1
  1366. ;.useg
  1367. outpos:    ds    4
  1368. ;.useg
  1369. crc32:
  1370.     ds    4
  1371. ;.useg
  1372. curmode:
  1373.     ds    1
  1374. ;.useg
  1375. opbuf:    ds    128
  1376. ;.useg
  1377. L_table:
  1378.     ds    1
  1379. D_shift:
  1380.     ds    1
  1381.  
  1382. ;.useg
  1383. V:    ds    1
  1384. nchar:    ds    1
  1385. lchar:    ds    1
  1386. ExState:
  1387.     ds    1
  1388. Len:    ds    2
  1389. ;.useg
  1390. ltp:    ds    1
  1391. mml:    ds    1
  1392. dictb:    ds    1
  1393. noswps:    ds    1
  1394. ;.useg
  1395. entrs:    ds    2
  1396. ;.useg
  1397. lbl:    ds    1
  1398.  
  1399.  
  1400.  
  1401.  
  1402. ;.useg
  1403. oldcode:
  1404.     ds    2
  1405. offset:
  1406.     ds    2
  1407. codesize:
  1408.     ds    1
  1409. maxcode:
  1410.     ds    2
  1411. free_ent:
  1412.     ds    2
  1413. finchar:
  1414.     ds    1
  1415. stackp:
  1416.     ds    2
  1417. incode:
  1418.     ds    2
  1419. code:
  1420.     ds    2
  1421.  
  1422. outbuf:
  1423. suffix_of:
  1424.     ds    8192
  1425.  
  1426. prefix_of:
  1427. Slen:
  1428. lit_tree:
  1429.     ds    _sf_tree_
  1430. len_tree:
  1431.     ds    _sf_tree_
  1432. dist_tre:
  1433.     ds    _sf_tree_
  1434.  
  1435.     ds    16384 + 2 - [3 * _sf_tree_]
  1436.  
  1437. followers:
  1438. stack:
  1439.     ds    16384
  1440.