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 / UNZIP02.ARC / UNZIP.Z80 < prev    next >
Text File  |  1991-04-25  |  18KB  |  1,428 lines

  1.  
  2.  
  3.     extrn    IPuser,OPuser
  4.     extrn    mode,junk,lfh,gpbf,cm,lmft
  5.     extrn    lmfd,crc,cs,ucs,fnl,efl
  6.     extrn    endlfh,lfhsiz,opfcb,opfn,opext,bitbuf,vars
  7.     extrn    bleft,wrtpt,outpos,crc32,curmode,opbuf
  8.     extrn    L_table,D_shift,V,nchar,lchar,ExState
  9.     extrn    Len,ltp,mml,dictb,noswps,entrs
  10.     extrn    lbl,oldcode,offset,codesize,maxcode,free_ent,
  11.     extrn    finchar,stackp,incode,code,outbuf,suffix_of
  12.     extrn    prefix_of,Slen,lit_tree,len_tree,dist_tre,followers,stack
  13.     extrn    fcb2sav
  14.  
  15.     extrn    Z3VINIT
  16.     extrn    vprint
  17.     extrn    vpstr
  18.     extrn    PFN1,PFN2
  19.     extrn    cout
  20.     extrn    pafdc
  21.                     
  22.     .request    vlib,z3lib,syslib
  23.  
  24.     .request    udatzi    
  25.                 
  26.     .in        unzipequ 
  27.     
  28.     jp    start
  29.     db    'Z3ENV'
  30.     db    3
  31. ENVPTR:    dw    0
  32.     dw    100h
  33.  
  34. usage:    db    'Syntax:  ',1,'UNZIP [du:]ufn[.ZIP][ du:][afn ][/o]',CR,LF
  35.     db    2,'If no option specified, UNZIP checks the CRC of the files.',CR,LF
  36.     db    'Options: E - extract files.',CR,LF,0
  37.  
  38. start:    call    z3vinit        
  39.     call    vprint
  40.     db    'UNZIPZ  vers 0.2',CR,LF,LF,0
  41.     ld    hl,(5dh)
  42.     or    a
  43.     ld    de,['/' SHL 8]+'/'
  44.     sbc    hl,de
  45.     jr    nz,notHELP
  46. help:    ld    hl,usage
  47.     call    vpstr
  48.     rst    0
  49.         
  50. notHELP:
  51.     ld    a,(infcb+1)    
  52.     cp    ' '
  53.     jr    z,HELP        
  54.     ld    a,(infcb+13)    
  55.     ld    (IPuser),a    
  56.     ld    a,(fcb2+13)    
  57.     ld    (OPuser),a    
  58.     ld    hl,fcb2
  59.     ld    a,(hl)        
  60.     ld    (opfcb),a    
  61.     inc    hl
  62.     ld    bc,11
  63.     ld    de,fcb2sav
  64.     ldir            
  65.     
  66.     ld    a,(fcb2+1)    
  67.     cp    '/'        
  68.     jr    z,nofspec    
  69.     cp    ' '
  70.     jr    nz,notall
  71. nofspec:    
  72.     ld    bc,10
  73.     ld    hl,fcb2sav
  74.     ld    de,fcb2sav+1    
  75.     ld    (hl),'?'
  76.     ldir            
  77. notall:    ld    a,(80h)        
  78.     ld    b,a
  79.     ld    hl,81h
  80.     ld    a,'/'
  81. optLOOP:
  82.     inc    hl
  83.     cp    (hl)
  84.     jr    z,OPTIONfnd    
  85.     djnz    optLOOP        
  86.     jr    noOPT
  87.  
  88. OPTIONfnd:    
  89.     inc    hl
  90.     ld    a,(hl)
  91.     sub    EXTRACT        
  92.     jr    z,setOPT
  93.     djnz    OPTIONfnd    
  94. noOPT:    or    1
  95. setOPT:    ld    (mode),a    
  96.     ld    a,(065h)
  97.     cp    ' '
  98.     jr    nz,wasext
  99.     ld    hl,['I' SHL 8] + 'Z'
  100.     ld    (065h),hl
  101.     ld    a,'P'
  102.     ld    (067h),a    
  103. wasext:
  104.     call    vprint
  105.     db    'ZIP archive  = ',0
  106.     ld    a,(INfcb)    
  107.     ld    h,a
  108.     ld    a,(IPuser)    
  109.     ld    l,a
  110.     call    printDU        
  111.     ld    de,infcb+1
  112.     call    PFN2        
  113.     call    crlf        
  114.     ld    c,open
  115.     call    bdosIP        
  116.     inc    a
  117.     jr    nz,startit    
  118.     call    vprint
  119.     db    'Couldn''t find ZIP file',CR,LF,0
  120.     rst    0        
  121.  
  122. crlf:    call    vprint
  123.     db    CR,LF,0
  124.     ret
  125.  
  126.  
  127. startit:
  128.     ld    a,(mode)    
  129.     or    a
  130.     jr    z,startex
  131.     call    vprint
  132.     db    'Checking...',0
  133.     jr    startcommon
  134.  
  135.  
  136. startex:
  137.     call    vprint
  138.     db    'Output drive = ',0
  139.     ld    a,(OPfcb)    
  140.     ld    h,a
  141.     ld    a,(OPuser)
  142.     ld    l,a
  143.     call    printDU        
  144. startcommon:
  145.     call    vprint        
  146.     db    cr,lf
  147.     db    'Name          Length  Disk   Method   Ver  Stored Save Date'
  148.     db    ' . Time     CRC',CR,LF
  149.     db    '============ =======  ====  ========  ===  ====== ==== ===='
  150.     db    '   ====   ========',CR,LF,0
  151. openok:    call    getword        
  152.     ld    de,-[['K' SHL 8] + 'P']
  153.     add    hl,de        
  154.     ld    a,h
  155.     or    l
  156.     jr    nz,sigerr    
  157.     call    getword        
  158.     ld    de,0201h
  159.     or    a
  160.     sbc    hl,de        
  161.     jr    nz,nocfhs    
  162.     call    pcfh        
  163.     jr    openok        
  164.  
  165. nocfhs:    ld    de,0202h
  166.     or    a
  167.     sbc    hl,de        
  168.     jr    nz,nolfhs
  169.     call    plfh        
  170.     jr    openok        
  171.  
  172. nolfhs:    or    a
  173.     sbc    hl,de        
  174.     jr    nz,sigerr    
  175.     call    vprint
  176.     db    10,13,'Done.',0
  177.     rst    0
  178.  
  179. sigerr:    call    vprint
  180.     db    'Bad signature in ZIP file',CR,LF,0
  181.     rst    0
  182.  
  183. pcfh:    
  184.     
  185.     ld    b,12+1
  186. pcfhl1:    push    bc        
  187.     call    getword        
  188.     pop    bc
  189.     djnz    pcfhl1        
  190.     push    hl        
  191.     call    getword        
  192.     push    hl        
  193.     call    getword        
  194.     pop    de        
  195.     pop    bc        
  196.     push    hl        
  197.     push    de        
  198.     push    bc        
  199.     ld    b,6
  200. pcfhl2:    push    bc
  201.     call    getword        
  202.     pop    bc
  203.     djnz    pcfhl2
  204.     pop    hl        
  205.     ld    de,junk
  206.     call    getstring    
  207.                 
  208.     pop    hl        
  209.     ld    de,junk        
  210.                 
  211.     call    getstring
  212.     pop    hl        
  213.     ld    de,junk        
  214.                 
  215.     jp    getstring
  216.  
  217.  
  218. plfh:    
  219.     ld    de,lfh            
  220.     ld    hl,lfhsiz        
  221.     call    getstring        
  222.     ld    hl,opfcb + 1        
  223.     ld    de,opfcb + 2
  224.     ld    bc,31
  225.     ld    (hl),b
  226.     ldir                
  227.     ld    de,junk            
  228.     ld    hl,(fnl)        
  229.     call    getstring        
  230.  
  231.     ld    de,junk + 20        
  232.     ld    hl,(efl)        
  233.     call    getstring        
  234.  
  235.     ld    de,junk            
  236.     ld    hl,opfn            
  237.     ld    b,8            
  238.     call    scanfn
  239.     ld    a,(de)
  240.     cp    '.'
  241.     jr    nz,nodot
  242.     inc    de
  243. nodot:    ld    b,3            
  244.     call    scanfn
  245.     ld    hl,init
  246.     ld    de,vars
  247.     ld    bc,[endinit - init]
  248.     ldir
  249.     ld    a,(mode)
  250. resmod:    ld    (curmode),a        
  251.                     
  252.     or    a
  253.     jr    nz,extrct
  254.     ld    b,11            
  255.     ld    de,fcb2sav        
  256.     ld    hl,opfcb+1        
  257. fchkL:    ld    a,(de)            
  258.     cp    '?'            
  259.     jr    z,fmatch
  260.     cp    (hl)
  261.     ld    a,1            
  262.     jr    nz,resmod        
  263. fmatch:    
  264.     inc    hl
  265.     inc    de
  266.     djnz    fchkL    
  267.     ld    c,open            
  268.     call    bdosOP
  269.     inc    a
  270.     jr    z,creok            
  271.     ld    hl,junk
  272.     call    vpstr
  273.     call    vprint
  274.     db    ' already exists',0
  275. noex:    call    vprint
  276.     db    ' -- not extracting',0
  277.     ld    a,0ffh
  278.     jr    resmod
  279.  
  280. extrct:    xor    a
  281.     ld    (zipeof),a
  282.     ld    a,(curmode)
  283.     dec    a
  284.     jp    m,doext            
  285.     jr    pjunk            
  286.  
  287. creok:    ld    c,create        
  288.     call    bdosOP
  289.     inc    a
  290.     jr    nz,pjunk
  291.     call    vprint
  292.     db    'Error creating ',0
  293.     ld    hl,junk
  294.     call    vpstr
  295.     jr    noex
  296.  
  297. pjunk:
  298.     ld    de,OPfcb+1
  299.     call    PFN1            
  300. doext:    call    vprint
  301.     db    '                ',0
  302.     ld    hl,counting
  303.     inc    (hl)
  304.     ld    a,(cm)            
  305.     or    a
  306.     jr    nz,case1
  307.     call    vprint
  308.     db    ' Stored ',0
  309. case0w:    ld    a,(zipeof)        
  310.     and    1            
  311.     jr    nz,closeo        
  312.     call    getbyte            
  313.     call    outbyte            
  314.     jr    case0w            
  315.  
  316. case1:    dec    a
  317.     jr    nz,case2p
  318.     call    unshrink
  319.     jr    closeo
  320.  
  321. case2p:    dec    a
  322.     cp    4
  323.     jr    nc,tryimp
  324.     call    unreduce
  325.     jr    closeo
  326.  
  327. tryimp:    jr    nz,badzip
  328.     call    unimplode
  329.     jr    closeo
  330.  
  331. badzip:    call    vprint
  332.     db    'Unknown compression method',CR,LF,0
  333.     ret
  334.  
  335. closeo:    ld    hl,zipeof
  336.     dec    (hl)
  337.     inc    hl
  338.     dec    (hl)
  339.     ld    a,(curmode)
  340.     or    a
  341.     jr    nz,nocls
  342.     ld    hl,wrtpt
  343.     ld    a,(hl)
  344.     or    a
  345.     jr    z,noflsh
  346.     ld    de,opbuf
  347.     ld    c,setdma
  348.     call    bdos
  349.     ld    c,write
  350.     call    bdosOP
  351. noflsh:
  352.     ld    c,close
  353.     call    bdosOP
  354. nocls:    ld    hl,crc32        
  355.     ld    de,crc            
  356.     scf
  357.     ld    bc,400h
  358. crcclp:    ld    a,(de)
  359.     adc    a,(hl)
  360.     push    af
  361.     or    c
  362.     ld    c,a
  363.     pop    af
  364.     inc    hl
  365.     inc    de
  366.     djnz    crcclp            
  367.     ld    a,c
  368.     or    a
  369.     jr    z,crcok
  370.     call    vprint
  371.     db    '                               CRC error',CR,LF,0
  372.     ret
  373.  
  374. crcok:    call    vprint
  375.     db    '                                  CRC OK',CR,LF,0
  376.     ret
  377.  
  378. getchla:
  379.     call    getcode
  380.     ld    (code),hl
  381.     ld    a,(zipeof)
  382.     and    1
  383.     ret
  384.  
  385. savstk:
  386.     ld    hl,(stackp)
  387.     dec    hl
  388.     ld    (stackp),hl
  389.     ld    (hl),a
  390.     ret
  391.  
  392. getcode:
  393.     ld    a,(codesize)
  394. readbits:
  395.     ld    hl,08000h
  396. bitlp:    push    af
  397.     push    hl
  398. getbit:    ld    hl,bleft
  399.     dec    (hl)
  400.     jp    m,readbt
  401.     dec    hl
  402.     rr    (hl)
  403.     pop    hl
  404.     rr    h
  405.     rr    l
  406.     pop    af
  407.     dec    a
  408.     jr    nz,bitlp
  409. finbit:    srl    h
  410.     rr    l
  411.     jr    nc,finbit
  412.     ld    a,l
  413.     ret
  414.  
  415. readbt:    push    hl
  416.     call    getbyte
  417.     pop    hl
  418.     ld    (hl),8
  419.     dec    hl
  420.     ld    (hl),a
  421.     jr    getbit
  422.  
  423. scanfn:    ld    a,(de)
  424.     cp    '.'
  425.     jr    z,nocopy
  426.     or    a
  427.     jr    z,nocopy
  428.     inc    de
  429.     dec    b
  430.     jp    m,scanfn
  431.     ld    (hl),a
  432.     inc    hl
  433.     jr    scanfn
  434. nocopy:    dec    b
  435.     ret    m
  436.     ld    (hl),' '
  437.     inc    hl
  438.     jr    nocopy
  439.  
  440. getstring:            
  441.     ld    a,h        
  442.     or    l
  443.     ld    (de),a        
  444.     ret    z
  445.     push    de
  446.     push    hl
  447.     call    getbyte
  448.     pop    hl
  449.     pop    de
  450.     ld    (de),a
  451.     inc    de
  452.     dec    hl
  453.     jr    getstring
  454.  
  455. getword:        
  456.     call    getbyte
  457.     push    af
  458.     call    getbyte
  459.     pop    hl
  460.     ld    l,h
  461.     ld    h,a
  462.     ret
  463.  
  464. getbyte:
  465.     ld    a,(zipeof)
  466.     and    1
  467.     ld    a,01ah
  468.     ret    nz        
  469.     ld    a,(counting)
  470.     or    a
  471.     jr    z,skpdci
  472.     ld    hl,(cs)
  473.     ld    de,(cs + 2)
  474.     ld    a,d
  475.     or    e
  476.     or    h
  477.     or    l        
  478.     jr    nz,noteof    
  479.     ld    hl,zipeof
  480.     inc    (hl)
  481.     ld    a,01ah
  482.     ret
  483.  
  484. noteof:    ld    a,h
  485.     or    l
  486.     dec    hl
  487.     ld    (cs),hl
  488.     jr    nz,skpdci
  489.     dec    de
  490.     ld    (cs + 2),de
  491. skpdci:    ld    hl,readpt
  492.     ld    a,(hl)
  493.     or    a
  494.     jr    nz,ptok
  495.     ld    de,080h
  496.     ld    (hl),e
  497.     push    hl
  498.     ld    c,setdma
  499.     call    bdos
  500.     ld    c,read
  501.     call    bdosIP            
  502.     or    a
  503.     pop    hl
  504.     jr    nz,ateof
  505. ptok:    ld    a,(hl)
  506.     inc    (hl)
  507.     ld    l,a
  508.     ld    h,0
  509.     ld    a,(hl)
  510.     ret
  511.  
  512. ateof:    ld    a,01ah
  513.     ret
  514.  
  515. outb:    ld    hl,(outpos)
  516.     push    hl
  517.     push    af            
  518.     ld    a,h
  519.     and    01fh
  520.     ld    h,a            
  521.     pop    af
  522.     ld    de,outbuf
  523.     add    hl,de
  524.     ld    (hl),a            
  525.     pop    hl
  526.     inc    hl
  527.     ld    (outpos),hl        
  528.     push    af
  529.     ld    a,h
  530.     or    l
  531.     jr    nz,nopos
  532.     ld    hl,(outpos + 2)
  533.     inc    hl
  534.     ld    (outpos + 2),hl
  535. nopos:    pop    af
  536.  
  537. outbyte:            
  538.     push    af
  539.     call    updcrc            
  540.     ld    hl,(ucs)
  541.     ld    de,(ucs + 2)
  542.     ld    a,h
  543.     or    l
  544.     dec    hl
  545.     ld    (ucs),hl
  546.     jr    nz,tsthl0
  547.     dec    de
  548.     ld    (ucs + 2),de
  549. tsthl0:    ld    a,h
  550.     or    l
  551.     or    d
  552.     or    e        
  553.     jr    nz,noeof    
  554.     ld    hl,zipeof
  555.     inc    (hl)
  556. noeof:
  557.     ld    a,(curmode)
  558.     or    a
  559.     jr    nz,popret    
  560.     ld    hl,wrtpt
  561.     ld    a,(hl)
  562.     add    a,a
  563.     jr    nc,wptok
  564.     ld    de,opbuf
  565.     ld    c,setdma
  566.     call    bdos
  567.     ld    c,write            
  568.     call    bdosOP
  569.     or    a
  570.     jr    z,wptok            
  571.     ld    (mode),a        
  572.     call    vprint
  573.     db    'Write Error',CR,LF,0
  574. popret:    pop    af
  575.     ret
  576.  
  577. wptok:    jr    nz,nofilb
  578.     ld    hl,opbuf
  579.     ld    de,opbuf + 1
  580.     ld    bc,127
  581.     ld    (hl),01ah
  582.     ldir                
  583.     xor    a
  584.     ld    (wrtpt),a
  585. nofilb:    pop    af
  586.     ld    hl,wrtpt
  587.     inc    (hl)
  588.     ld    l,(hl)
  589.     ld    h,0
  590.     ld    de,opbuf - 1
  591.     add    hl,de
  592.     ld    (hl),a
  593.     ret
  594.  
  595. bdosIP:    
  596.     
  597.     ld    a,(IPuser)
  598.     ld    de,infcb
  599.     jr    bdosIOP
  600.     
  601. bdosOP:    
  602.     
  603.     ld    a,(OPuser)
  604.     ld    de,opfcb
  605. bdosIOP:
  606.     push    bc
  607.     push    de
  608.     ld    c,32
  609.     ld    e,a
  610.     call    bdos
  611.     pop    de
  612.     pop    bc
  613.     jp    bdos
  614.  
  615.  
  616. updcrc:    ld    hl,(crc32)        
  617.     ld    de,(crc32 + 2)        
  618.     ld    c,a            
  619.     ld    b,8            
  620. crclp:    ld    a,l
  621.     xor    c
  622.     srl    c
  623.     srl    d
  624.     rr    e
  625.     rr    h
  626.     rr    l
  627.     rra
  628.     jr    nc,noxor
  629.     ld    a,d
  630.     xor    0edh
  631.     ld    d,a
  632.     ld    a,e
  633.     xor    0b8h
  634.     ld    e,a
  635.     ld    a,h
  636.     xor    083h
  637.     ld    h,a
  638.     ld    a,l
  639.     xor    020h
  640.     ld    l,a
  641. noxor:    djnz    crclp
  642.     ld    (crc32),hl        
  643.     ld    (crc32 + 2),de
  644.     ret
  645.  
  646. unshrink:    
  647.     call    vprint
  648.     db    ' Shrunk ',0
  649.     ld    a,init_bits
  650.     ld    (codesize),a
  651.     ld    hl,[1 SHL init_bits] - 1
  652.     ld    (maxcode),hl
  653.     ld    hl,first_ent
  654.     ld    (free_ent),hl
  655.     ld    hl,prefix_of
  656.     ld    de,prefix_of + 1
  657.     ld    bc,512
  658.     ld    (hl),c
  659.     ldir
  660.     ld    bc,16386 - 512
  661.     ld    (hl),-1
  662.     ldir
  663.     ld    hl,suffix_of
  664. sol:    ld    (hl),c
  665.     inc    hl
  666.     inc    c
  667.     jr    nz,sol
  668.     call    getchla
  669.     ld    (oldcode),hl
  670.     ret    nz
  671.     ld    a,l
  672.     ld    (finchar),a
  673.     call    outbyte            
  674. unshlp:    ld    hl,stack + 8192
  675.     ld    (stackp),hl
  676.     ld    a,(zipeof)
  677.     and    1
  678.     ret    nz
  679. clrlp:    call    z,getchla
  680.     ret    nz
  681.     ld    a,h
  682.     dec    a
  683.     or    l
  684.     jr    nz,noclr
  685.     call    getchla
  686.     ld    a,h
  687.     or    a
  688.     jr    nz,clrlp
  689.     dec    l
  690.     jr    z,bumpcs
  691.     dec    l
  692.     call    z,partial_clear
  693.     jr    clrlp
  694. bumpcs:    ld    hl,codesize
  695.     inc    (hl)
  696.     ld    a,(hl)
  697.     cp    max_bits
  698.     ld    hl,maxcmax
  699.     jr    z,atmax
  700.     ld    hl,1
  701. maxclp:    add    hl,hl
  702.     dec    a
  703.     jr    nz,maxclp
  704.     dec    hl
  705. atmax:    ld    (maxcode),hl
  706.     jr    clrlp
  707. noclr:    ld    (incode),hl
  708.     add    hl,hl
  709.     ld    de,prefix_of
  710.     add    hl,de
  711.     ld    a,(hl)
  712.     inc    hl
  713.     and    (hl)
  714.     inc    a
  715.     ld    hl,(code)
  716.     jr    nz,noKwKw
  717.     ld    a,(finchar)
  718.     call    savstk
  719.     ld    hl,(oldcode)
  720. noKwKw:    ex    de,hl
  721. staklp: ld    hl,suffix_of
  722.     add    hl,de
  723.     ld    a,(hl)
  724.     call    savstk
  725.     ld    hl,0100h
  726.     or    a
  727.     sbc    hl,de
  728.     jr    nc,unstak
  729.     ld    hl,prefix_of
  730.     add    hl,de
  731.     add    hl,de
  732.     ld    e,(hl)
  733.     inc    hl
  734.     ld    d,(hl)
  735.     jr    staklp
  736. unstak:    ld    (finchar),a
  737.     ld    de,(stackp)
  738. unslp:    ld    hl,stack + 8192
  739.     or    a
  740.     sbc    hl,de
  741.     jr    z,newent
  742.     ld    a,(de)
  743.     inc    de
  744.     push    de
  745.     call    outbyte        
  746.     pop    de
  747.     jr    unslp
  748.  
  749. newent:    ld    hl,(free_ent)
  750.     ld    (code),hl
  751.     ex    de,hl
  752.     ld    hl,01fffh
  753.     or    a
  754.     sbc    hl,de
  755.     jr    c,full
  756.     ld    hl,prefix_of
  757.     add    hl,de
  758.     add    hl,de
  759.     ld    bc,(oldcode)
  760.     ld    (hl),c
  761.     inc    hl
  762.     ld    (hl),b
  763.     ld    hl,suffix_of
  764.     add    hl,de
  765.     ld    a,(finchar)
  766.     ld    (hl),a
  767. getfre:    inc    de
  768.     ld    hl,01fffh
  769.     or    a
  770.     sbc    hl,de
  771.     jr    c,full1
  772.     ld    hl,prefix_of
  773.     add    hl,de
  774.     add    hl,de
  775.     ld    a,(hl)
  776.     inc    hl
  777.     and    (hl)
  778.     inc    a
  779.     jr    nz,getfre
  780. full1:    ld    (free_ent),de
  781. full:    ld    hl,(incode)
  782.     ld    (oldcode),hl
  783.     jp    unshlp
  784.  
  785. partial_clear:
  786.     ld    de,first_ent
  787. l8:    ld    hl,(free_ent)
  788.     or    a
  789.     sbc    hl,de
  790.     jr    z,br8
  791.     ld    hl,prefix_of + 1
  792.     add    hl,de
  793.     add    hl,de
  794.     set    7,(hl)
  795.     inc    de
  796.     jr    l8
  797. br8:    ld    de,first_ent
  798. l9:    ld    hl,(free_ent)
  799.     or    a
  800.     sbc    hl,de
  801.     jr    z,br9
  802.     ld    hl,prefix_of
  803.     add    hl,de
  804.     add    hl,de
  805.     push    de
  806.     ld    e,(hl)
  807.     inc    hl
  808.     ld    d,(hl)
  809.     res    7,d
  810.     ld    hl,first_ent - 1
  811.     or    a
  812.     sbc    hl,de
  813.     jr    nc,ei10
  814.     ld    hl,prefix_of + 1
  815.     add    hl,de
  816.     add    hl,de
  817.     res    7,(hl)
  818. ei10:    pop    de
  819.     inc    de
  820.     jr    l9
  821. br9:    ld    de,first_ent
  822. l10:    ld    hl,(free_ent)
  823.     or    a
  824.     sbc    hl,de
  825.     jr    z,br10
  826.     ld    hl,prefix_of + 1
  827.     add    hl,de
  828.     add    hl,de
  829.     bit    7,(hl)
  830.     jr    z,ei11
  831.     ld    (hl),-1
  832.     dec    hl
  833.     ld    (hl),-1
  834. ei11:    inc    de
  835.     jr    l10
  836. br10:    ld    de,first_ent
  837. l11:    ld    hl,maxcmax
  838.     or    a
  839.     sbc    hl,de
  840.     jr    z,br11
  841.     ld    hl,prefix_of
  842.     add    hl,de
  843.     add    hl,de
  844.     ld    a,(hl)
  845.     inc    hl
  846.     and    (hl)
  847.     inc    a
  848.     jr    z,br11
  849.     inc    de
  850.     jr    l11
  851. br11:    ld    (free_ent),de
  852.     ret
  853.  
  854. loadfollowers:
  855.     ld    hl,Slen + 255
  856.     ld    b,0
  857. lflp:    push    bc
  858.     push    hl
  859.     ld    a,6
  860.     call    readbits
  861.     pop    hl
  862.     pop    de
  863.     ld    (hl),a
  864.     push    de
  865.     push    hl
  866.     dec    d
  867.     ld    hl,followers
  868.     call    shftadd
  869.     ld    b,a
  870.     or    a
  871.     jr    z,nofoll
  872. ldfllp:    push    hl
  873.     push    bc
  874.     ld    a,8
  875.     call    readbits
  876.     pop    bc
  877.     pop    hl
  878.     ld    (hl),a
  879.     inc    hl
  880.     djnz    ldfllp
  881. nofoll:    pop    hl
  882.     pop    bc
  883.     dec    hl
  884.     djnz    lflp
  885.     ret
  886.  
  887.  
  888. unreduce:
  889.     push    af
  890.     call    vprint
  891.     db    'Reduced ',0
  892.     pop    af
  893.     ld    e,a        
  894.     ld    d,0
  895.     ld    hl,_L_table
  896.     add    hl,de
  897.     ld    a,(hl)
  898.     ld    (L_table),a
  899.     ld    hl,_D_shift
  900.     add    hl,de
  901.     ld    a,(hl)
  902.     ld    (D_shift),a
  903.     xor    a
  904.     ld    (ExState),a
  905.     ld    (lchar),a
  906.     call    loadfollowers
  907. ur1:    ld    a,(zipeof)
  908.     and    1
  909.     ret    nz
  910.     call    slenlch
  911.     or    a
  912.     jr    nz,ur2
  913. ur4:    ld    a,8
  914.     call    readbits
  915.     jr    ur3
  916. ur2:    ld    a,1
  917.     call    readbits
  918.     dec    l
  919.     jr    z,ur4
  920.     call    slenlch
  921.     dec    a
  922.     or    1
  923.     ld    l,a
  924.     xor    a
  925. btlp:    inc    a
  926.     srl    l
  927.     jr    nz,btlp
  928.     call    readbits
  929.     ld    de,followers
  930.     add    hl,de
  931.     ld    de,(lchar - 1)
  932.     call    shftadd
  933.     ld    a,(hl)
  934. ur3:    ld    (nchar),a
  935.     ld    l,a
  936.     ld    a,(ExState)
  937.     or    a
  938.     jr    nz,ur5
  939.     ld    a,l
  940.     cp    DLE    
  941.     jr    nz,ur9
  942.     ld    a,1
  943.     ld    (ExState),a
  944.     jr    ur6
  945. ur5:    dec    a
  946.     jr    nz,ur7
  947.     ld    a,l
  948.     or    a
  949.     jr    z,ur10
  950.     ld    (V),a
  951.     ld    a,(L_table)
  952.     ld    h,a
  953.     and    l
  954.     cp    h
  955.     ld    l,a
  956.     ld    h,0
  957.     ld    (Len),hl
  958.     jr    nz,ur12
  959.     ld    a,2
  960.     jr    ur11
  961. ur10:    ld    (ExState),a
  962.     ld    a,DLE
  963. ur9:    call    outb        
  964.     jr    ur6
  965.  
  966. ur7:    dec    a
  967.     jr    nz,ur8
  968.     ld    a,l
  969.     ld    hl,Len
  970.     add    a,(hl)
  971.     ld    (hl),a
  972.     jr    nc,ur12
  973.     inc    hl
  974.     inc    (hl)
  975. ur12:    ld    a,3
  976.     jr    ur11
  977. ur8:    dec    a
  978.     jr    nz,ur13
  979.     ld    a,(D_shift)
  980.     ld    b,a
  981.     ld    a,(V)
  982. ur14:    srl    a
  983.     djnz    ur14
  984.     ld    h,a
  985.     inc    hl
  986.     ld    bc,(Len)
  987.     inc    bc
  988.     inc    bc
  989.     inc    bc
  990.     call    callback
  991. ur13:    xor    a
  992. ur11:    ld    (ExState),a
  993. ur6:    ld    a,(nchar)
  994.     ld    (lchar),a
  995.     jp    ur1
  996.  
  997. slenlch:
  998.     ld    hl,(lchar)
  999.     ld    h,0
  1000.     ld    de,Slen
  1001.     add    hl,de
  1002.     ld    a,(hl)
  1003.     ret
  1004.  
  1005. shftadd:
  1006.     ld    e,0
  1007.     srl    d
  1008.     rr    e
  1009.     srl    d
  1010.     rr    e
  1011.     add    hl,de
  1012.     ret
  1013.  
  1014. callback:
  1015.     push    bc
  1016.     push    hl
  1017.     ld    hl,(outpos)
  1018.     ld    de,(outpos + 2)
  1019.     pop    bc
  1020.     or    a
  1021.     sbc    hl,bc
  1022.     jr    nc,cb2
  1023.     dec    de
  1024. cb2:    pop    bc
  1025. cb3:    bit    7,d
  1026.     jr    z,cb4
  1027.     ld    a,b
  1028.     or    c
  1029.     jr    z,cb4
  1030.     xor    a
  1031.     call    outbp
  1032.     inc    hl
  1033.     ld    a,h
  1034.     or    l
  1035.     jr    nz,cb5
  1036.     inc    de
  1037. cb5:    dec    bc
  1038.     jr    cb3
  1039. cb4:    ex    de,hl
  1040. cb6:    ld    a,b
  1041.     or    c
  1042.     ret    z
  1043.     ld    a,d
  1044.     and    01fh
  1045.     ld    d,a
  1046.     ld    hl,outbuf
  1047.     add    hl,de
  1048.     ld    a,(hl)
  1049.     call    outbp
  1050.     inc    de
  1051.     dec    bc
  1052.     jr    cb6
  1053.  
  1054. outbp:    push    hl        
  1055.     push    de
  1056.     push    bc
  1057.     call    outb
  1058.     pop    bc
  1059.     pop    de
  1060.     pop    hl
  1061.     ret
  1062.  
  1063. readlengths:
  1064.     ld    a,8
  1065.     call    readbits
  1066.     ld    d,h
  1067.     ld    e,d
  1068.     inc    hl
  1069.     ld    b,h
  1070.     ld    c,l
  1071.     ld    (ix + _maxlength),e
  1072.     ld    (ix + _maxlength + 1),d
  1073.     push    ix
  1074.     pop    hl
  1075.     inc    hl
  1076.     inc    hl
  1077.     inc    hl
  1078. rl1:    ld    a,b
  1079.     or    c
  1080.     ret    z
  1081.     push    bc
  1082.     push    de
  1083.     push    hl
  1084.     ld    a,4
  1085.     call    readbits
  1086.     inc    a
  1087.     push    af
  1088.     ld    a,4
  1089.     call    readbits
  1090.     inc    a
  1091.     ld    b,a
  1092.     pop    af
  1093.     ld    c,a
  1094.     pop    hl
  1095.     pop    de
  1096.     ld    a,(ix + _maxlength)
  1097.     cp    c
  1098.     jr    nc,rl2
  1099.     ld    (ix + _maxlength),c
  1100. rl2:    inc    hl
  1101.     inc    hl
  1102.     inc    hl
  1103.     ld    (hl),e
  1104.     inc    hl
  1105.     ld    (hl),c
  1106.     inc    e
  1107.     djnz    rl2
  1108.     pop    bc
  1109.     dec    bc
  1110.     jr    rl1
  1111.  
  1112. sortlengths:
  1113.     ld    h,(ix + _entries + 1)
  1114.     ld    l,(ix + _entries)
  1115.     ld    b,h
  1116.     ld    c,l
  1117.     ld    (entrs),hl
  1118. sl7:    srl    b
  1119.     rr    c
  1120. sl1:    ld    a,b
  1121.     or    c
  1122.     ret    z
  1123.     ld    (noswps),a
  1124.     push    ix
  1125.     ld    de,4
  1126.     add    ix,de
  1127.     push    ix
  1128.     pop    iy
  1129.     add    iy,bc
  1130.     add    iy,bc
  1131.     add    iy,bc
  1132.     add    iy,bc
  1133.     ld    hl,(entrs)
  1134.     or    a
  1135.     sbc    hl,bc
  1136. sl2:    ld    a,(ix + _bitlength)
  1137.     cp    (iy + _bitlength)
  1138.     jr    c,sl4
  1139.     jr    nz,sl3
  1140.     ld    a,(iy + _value)
  1141.     cp    (ix + _value)
  1142.     jr    nc,sl4
  1143. sl3:    ld    d,e
  1144. sl5:    ld    a,(ix)
  1145.     push    af
  1146.     ld    a,(iy)
  1147.     ld    (ix),a
  1148.     pop    af
  1149.     ld    (iy),a
  1150.     inc    ix
  1151.     inc    iy
  1152.     dec    d
  1153.     jr    nz,sl5
  1154.     ld    a,d
  1155.     ld    (noswps),a
  1156.     jr    sl6
  1157. sl4:    add    ix,de
  1158.     add    iy,de
  1159. sl6:    dec    hl
  1160.     ld    a,h
  1161.     or    l
  1162.     jr    nz,sl2
  1163.     pop    ix
  1164.     ld    a,(noswps)
  1165.     or    a
  1166.     jr    nz,sl7
  1167.     jr    sl1
  1168.  
  1169.  
  1170. generatetrees:
  1171.     ld    l,(ix + _entries)
  1172.     ld    h,(ix + _entries + 1)
  1173.     ld    c,l
  1174.     ld    b,h
  1175.     push    ix
  1176.     pop    de
  1177.     add    hl,hl
  1178.     add    hl,hl
  1179.     add    hl,de
  1180.     push    hl
  1181.     pop    iy
  1182.     xor    a
  1183.     ld    d,a
  1184.     ld    e,a
  1185.     ld    h,a
  1186.     ld    l,a
  1187.     ld    (lbl),a
  1188. gt1:    ld    a,b
  1189.     or    c
  1190.     ret    z
  1191.     dec    bc
  1192.     add    hl,de    
  1193.     ld    a,(lbl)
  1194.     cp    (iy + _bitlength)
  1195.     jr    z,gt2
  1196.     ld    a,(iy + _bitlength)
  1197.     ld    (lbl),a
  1198.     sub    16
  1199.     ex    de,hl
  1200.     ld    hl,1
  1201.     jr    z,gt3
  1202. gt4:    add    hl,hl
  1203.     inc    a
  1204.     jr    nz,gt4
  1205. gt3:    ex    de,hl
  1206. gt2:    ld    (iy + _code),l
  1207.     ld    (iy + _code + 1),h
  1208.     push    de
  1209.     ld    de,-4
  1210.     add    iy,de
  1211.     pop    de
  1212.     jr    gt1
  1213.  
  1214. ldtrees:
  1215.     ld    a,(gpbf)
  1216.     rra
  1217.     ld    l,a
  1218.     and    1
  1219.     add    a,6
  1220.     ld    (dictb),a
  1221.     ld    a,l
  1222.     rra
  1223.     and    1
  1224.     ld    (ltp),a
  1225.     set    1,a
  1226.     ld    (mml),a
  1227.     ld    ix,lit_tree
  1228.     ld    hl,256
  1229.     call    nz,ld_tree
  1230.     ld    hl,64
  1231.     ld    ix,len_tree
  1232.     call    ld_tree
  1233.     ld    hl,64
  1234.     ld    ix,dist_tre
  1235.  
  1236. ld_tree:
  1237.     ld    (ix + _entries),l
  1238.     ld    (ix + _entries + 1),h
  1239.     call    readlengths
  1240.     call    sortlengths
  1241.     call    generatetrees
  1242.  
  1243. reversebits:
  1244.     push    ix
  1245.     pop    hl
  1246.     ld    e,(hl)
  1247.     inc    hl
  1248.     ld    d,(hl)
  1249. rb1:    inc    hl
  1250.     inc    hl
  1251.     inc    hl
  1252.     ld    c,(hl)
  1253.     ld    b,8
  1254. rb2:    srl    c
  1255.     adc    a,a
  1256.     djnz    rb2
  1257.     push    af
  1258.     inc    hl
  1259.     ld    c,(hl)
  1260.     ld    b,8
  1261. rb3:    srl    c
  1262.     adc    a,a
  1263.     djnz    rb3
  1264.     dec    hl
  1265.     ld    (hl),a
  1266.     pop    af
  1267.     inc    hl
  1268.     ld    (hl),a
  1269.     dec    de
  1270.     ld    a,d
  1271.     or    e
  1272.     jr    nz,rb1
  1273.     ret
  1274.  
  1275. readtree:
  1276.     push    ix
  1277.     pop    iy
  1278.     ld    de,4
  1279.     add    iy,de
  1280.     ld    b,d
  1281.     ld    e,d
  1282.     ld    h,d
  1283.     ld    l,d
  1284. rt1:    push    hl
  1285.     push    de
  1286.     push    bc
  1287.     ld    a,1
  1288.     call    readbits
  1289.     pop    af
  1290.     push    af
  1291.     or    a
  1292.     jr    z,rt2
  1293. rt3:    add    hl,hl
  1294.     dec    a
  1295.     jr    nz,rt3
  1296. rt2:    pop    bc
  1297.     pop    de
  1298.     add    hl,de
  1299.     ex    de,hl
  1300.     inc    b
  1301.     pop    hl
  1302. rt4:    ld    a,(iy + _bitlength)
  1303.     cp    b
  1304.     jr    nc,rt5
  1305.     push    de
  1306.     ld    de,4
  1307.     add    iy,de
  1308.     pop    de
  1309.     inc    hl
  1310.     ld    a,(ix + _entries)
  1311.     sub    l
  1312.     jr    nz,rt4
  1313.     ld    a,(ix + _entries + 1)
  1314.     sub    h
  1315.     jr    nz,rt4
  1316. rt6:    dec    a
  1317.     ret
  1318. rt5:    ld    a,(iy + _bitlength)
  1319.     cp    b
  1320.     jr    nz,rt1
  1321.     ld    a,(iy + _code)
  1322.     cp    e
  1323.     jr    nz,rt7
  1324.     ld    a,(iy + _code + 1)
  1325.     cp    d
  1326.     jr    nz,rt7
  1327.     ld    a,(iy + _value)
  1328.     ret
  1329.  
  1330. rt7:    push    de
  1331.     ld    de,4
  1332.     add    iy,de
  1333.     pop    de
  1334.     inc    hl
  1335.     ld    a,(ix + _entries)
  1336.     sub    l
  1337.     jr    nz,rt5
  1338.     ld    a,(ix + _entries + 1)
  1339.     sub    h
  1340.     jr    nz,rt5
  1341.     jr    rt6
  1342.  
  1343. unimplode:
  1344.     call    vprint
  1345.     db    'Imploded',0
  1346.     call    ldtrees
  1347. ui1:    ld    a,(zipeof)
  1348.     and    1
  1349.     ret    nz
  1350.     inc    a
  1351.     call    readbits
  1352.     or    a
  1353.     jr    z,ui2
  1354.     ld    a,(ltp)
  1355.     or    a
  1356.     jr    z,ui3
  1357.     ld    ix,lit_tree
  1358.     call    readtree
  1359.     jr    ui4
  1360. ui3:    ld    a,8
  1361.     call    readbits
  1362. ui4:    call    outb            
  1363.     jr    ui1
  1364.  
  1365. ui2:    ld    a,(dictb)
  1366.     call    readbits
  1367.     push    hl
  1368.     ld    ix,dist_tre
  1369.     call    readtree
  1370.     ld    bc,(dictb - 1)
  1371. ui5:    add    hl,hl
  1372.     djnz    ui5
  1373.     pop    bc
  1374.     add    hl,bc
  1375.     push    hl
  1376.     ld    ix,len_tree
  1377.     call    readtree
  1378.     ld    l,a
  1379.     ld    h,0
  1380.     cp    63
  1381.     jr    nz,ui6
  1382.     push    hl
  1383.     ld    a,8
  1384.     call    readbits
  1385.     pop    de
  1386.     add    hl,de
  1387. ui6:    ld    de,(mml)
  1388.     ld    d,0
  1389.     add    hl,de
  1390.     ld    b,h
  1391.     ld    c,l
  1392.     pop    hl
  1393.     inc    hl
  1394.     call    callback
  1395.     jr    ui1
  1396.  
  1397.  
  1398. printDU:    
  1399.     ld    a,h        
  1400.     dec    a
  1401.     jp    p,notDEF    
  1402.     ld    c,25h
  1403.     call    bdos        
  1404. notDEF:
  1405.     add    'A'
  1406.     call    cout        
  1407.     ld    a,l        
  1408.     call    PAFDC        
  1409.     ld    a,':'
  1410.     jp    cout    
  1411.  
  1412.  
  1413. zipeof:    db    2
  1414. counting:
  1415.     db    0
  1416. init:
  1417.     db    0
  1418.     db    0
  1419.     dw    0,0
  1420.     dw    -1,-1
  1421. endinit:
  1422. readpt:    db    0
  1423. _L_table:
  1424.     db    07fh, 03fh, 01fh, 0fh
  1425. _D_shift:
  1426.     db    07h, 06h, 05h, 04h
  1427.  
  1428.