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 / UNZIP15.LBR / UNZIP15.ZZ0 / UNZIP15.Z80
Text File  |  1991-06-01  |  22KB  |  1,610 lines

  1. ; UNZIP.Z80
  2. ;
  3. ;    Dissolves MS-DOS ZIP files.
  4. ;
  5. Vers    equ    15
  6. ;
  7. ;
  8. ; Version 1.5 -- june 1, 1991 -- Howard Goldstein
  9. ;    Fixed bug at WILDLP which was causing an output spec of "dir:"
  10. ;    not to work correctly.  Corrected problems that were causing
  11. ;    writes to disk when a non-matching member file was being skipped.
  12. ;    Changed "disk full" logic to close and erase partial output file
  13. ;    and abort the program immediately.  Made several minor changes to
  14. ;    allow assembly with ZMAC or M80.
  15.  
  16. ; Version 1.4 -- May 16, 1991 -- Bruce Morgen
  17. ;    Fixed bug at "setusr" and added output filename wildcard
  18. ;    support.  If the selected output filespec is NOT wild,
  19. ;    (and d: or dir: alone IS wild) UNZIP will exit after the
  20. ;    first extraction.  Boy, do I have a headache....
  21.  
  22. ; Version 1.3 -- May 12, 1991 -- Gene Pizzetta
  23. ;    Some quick and dirty mods to make this utility more useful.
  24. ;    The original has to be the most God-awful source code I've
  25. ;    ever come across.  It is totally uncommented, and I have
  26. ;    no idea what kind of strange assembler it was written for.
  27. ;    This code now assembles with SLR's Z80ASM and it's a little
  28. ;    more orderly.
  29. ;
  30. ;    New syntax:
  31. ;        UNZIP {dir:}zipfile {dir:}{afn}
  32. ;    Under ZCPR3 "dir" can be a DU or DIR spec; otherwise, just
  33. ;    a drive.  If no destination is given, member files are checked
  34. ;    and listed.  If a destination is given, member files are
  35. ;    extracted if they match "afn" if given, otherwise the entire
  36. ;    ZIPfile is extracted.
  37. ;
  38. ;    You can now abort this thing with ^C (and the partial output
  39. ;    file, if any, will be closed and erased).  Usage screen now
  40. ;    responds to "//".  This program still needs a lot of work.
  41. ;    It's probably not bullet-proof and testing has been very
  42. ;    limited, but it seems to work.
  43. ;
  44. ; Version 1.2 -- July 3, 1990 -- David P. Goodenough
  45. ;
  46. ; System addresses
  47. ;
  48. wboot    equ    0
  49. bdos    equ    5
  50. infcb    equ    5Ch
  51. altfcb    equ    6Ch
  52. ;
  53. ; BDOS service functions
  54. ;
  55. conout    equ    2
  56. dircon    equ    6
  57. fopen    equ    15
  58. fclose    equ    16
  59. ferase    equ    19
  60. fread    equ    20
  61. fwrite    equ    21
  62. fmake    equ    22
  63. getdrv    equ    25
  64. setdma    equ    26
  65. setusr    equ    32
  66. ;
  67. ; Other
  68. ;
  69. STRSIZ    equ    256
  70. DLE    equ    144
  71. max_bits equ    13
  72. init_bits equ    9
  73. hsize    equ    8192
  74. first_ent equ    257
  75. clear    equ    256
  76. maxcmax    equ    1 shl max_bits
  77. maxSF    equ    256
  78. _code    equ    0
  79. _value    equ    2
  80. _bitlength equ    3
  81. _entries equ    0
  82. _maxlength equ    2
  83. _entry    equ    4
  84. _sf_tree_ equ    4 + 4 * maxSF
  85. ;
  86. ; ASCII
  87. ;
  88. CtrlC    equ    03h
  89. CR    equ    0Dh
  90. LF    equ    0Ah
  91. CtrlZ    equ    1Ah
  92. ;
  93.     aseg
  94.     org    100h
  95. ;
  96.     jp    start
  97. ;
  98.     db    'Z3ENV',1
  99. Z3EAdr:    dw    0
  100. ;
  101. start:    ld    (oldstk),sp    ; save old stack here for future use
  102.     ld    sp,(6)        ; set the stack pointer
  103.     call    ilprt
  104.     db    'UNZIP  Version '
  105.     db    Vers/10+'0','.',Vers mod 10+'0','  -  DPG',CR,LF,0
  106.     ld    a,(infcb+1)    ; filename?
  107.     cp    ' '
  108.     jp    z,usage
  109.     cp    '/'
  110.     jp    z,usage
  111. ;
  112. wasfil:    ld    de,altfcb
  113.     ld    a,(de)        ; output drive given?
  114.     ld    (opfcb),a    ; store it in output file control block
  115.     ld    (mode),a    ; set the mode (non-zero = extract)
  116.     call    getusr        ; get input and output users, if ZCPR3
  117.     ld    hl,mtchfcb
  118.     ld    bc,11
  119.     inc    de
  120.     ld    a,(de)
  121.     cp    20h
  122.     jr    z,wildfill
  123.     ex    de,hl
  124.     ldir
  125.     ld    a,(altfcb)
  126.     or    a
  127.     jr    nz,filldn
  128.     ld    c,getdrv
  129.     call    bdos
  130.     inc    a
  131.     ld    (opfcb),a    ; store it in output file control block
  132.     ld    (mode),a    ; set the mode (non-zero = extract)
  133.     jr    filldn
  134. wildfill:
  135.     ld    b,c
  136. wildlp:    ld    (hl),'?'
  137.     inc    hl
  138.     djnz    wildlp
  139. filldn:    ld    a,(infcb+9)    ; check for filetype
  140.     cp    20h
  141.     jr    nz,wasext
  142.     ld    hl,+('I' shl 8) + 'Z'    ; set default type to ZIP
  143.     ld    (infcb+9),hl
  144.     ld    a,'P'
  145.     ld    (infcb+11),a
  146. wasext:    call    setin        ; log input user
  147.     ld    de,infcb
  148.     ld    c,fopen
  149.     call    bdos        ; try and open ZIP file
  150.     inc    a
  151.     jr    nz,openok    ; ok
  152.     call    ilprt        ; complain and fall through to exit
  153.     db    'Couldn''t find ZIP file',CR,LF,0
  154. ;
  155. ; All exits point here for possible future enhancements, such
  156. ; as elimination of warm boot.
  157. ;
  158. exit:    jp    wboot
  159. ;
  160. sigerr:    call    ilprt
  161.     db    'Bad signature in ZIP file',CR,LF,0
  162.     jr    exit
  163. ;
  164. openok:    call    getword
  165.     ld    de,-(('K' shl 8) + 'P')
  166.     add    hl,de
  167.     ld    a,h
  168.     or    l
  169.     jr    nz,sigerr
  170.     call    getword
  171.     dec    l
  172.     jr    nz,nocfhs
  173.     dec    h
  174.     dec    h
  175.     jr    nz,sigerr
  176.     call    pcfh
  177.     jr    openok
  178. ;
  179. nocfhs:    dec    l
  180.     dec    l
  181.     jr    nz,nolfhs
  182.     ld    a,h
  183.     sub    4
  184.     jr    nz,sigerr
  185.     call    plfh
  186.     jr    openok
  187. ;
  188. nolfhs:    dec    l
  189.     dec    l
  190.     jr    nz,sigerr
  191.     ld    a,h
  192.     sub    6
  193.     jr    nz,sigerr
  194.     call    pecd
  195.     jr    exit
  196. ;
  197. pcfh:    ld    b,12
  198. pcfhl1:    push    bc
  199.     call    getword
  200.     pop    bc
  201.     djnz    pcfhl1
  202.     call    getword
  203.     push    hl
  204.     call    getword
  205.     push    hl
  206.     call    getword
  207.     pop    de
  208.     pop    bc
  209.     push    hl
  210.     push    de
  211.     push    bc
  212.     ld    b,6
  213. pcfhl2:    push    bc
  214.     call    getword
  215.     pop    bc
  216.     djnz    pcfhl2
  217.     pop    hl
  218.     ld    de,junk
  219.     call    getstring
  220.     pop    hl
  221.     ld    de,junk
  222.     call    getstring
  223.     pop    hl
  224.     ld    de,junk
  225.     call    getstring
  226.     ret
  227. ;
  228. pecd:    ld    b,8
  229. pecdl:    push    bc
  230.     call    getword
  231.     pop    bc
  232.     djnz    pecdl
  233.     call    getword
  234.     ld    de,junk
  235.     call    getstring
  236.     ret
  237. ;
  238. plfh:    ld    de,lfh
  239.     ld    hl,endlfh-lfh
  240.     call    getstring
  241.     ld    hl,opfcb+1
  242.     ld    de,opfcb+2
  243.     ld    bc,33
  244.     ld    (hl),b
  245.     ldir
  246.     ld    de,junk
  247.     ld    hl,(fnl)
  248.     call    getstring
  249.     ld    de,junk + 20
  250.     ld    hl,(efl)
  251.     call    getstring
  252.     ld    de,junk
  253.     ld    hl,opfn
  254.     ld    b,8
  255.     call    scanfn
  256.     ld    a,(de)
  257.     cp    '.'
  258.     jr    nz,nodot
  259.     inc    de
  260. nodot:    ld    b,3
  261.     call    scanfn
  262.     ld    hl,init
  263.     ld    de,vars
  264.     ld    bc,endinit-init
  265.     ldir
  266.     ld    a,(mode)
  267. resmod:    ld    (curmode),a
  268.     or    a
  269.     jr    z,extrct
  270. mtched:    call    setout        ; log output user
  271.     ld    de,opfcb    ; see if output file already exists
  272.     ld    c,fopen
  273.     call    bdos
  274.     inc    a
  275.     jr    nz,exists
  276.     ld    b,11
  277.     ld    hl,opfn
  278.     ld    de,mtchfcb
  279. mtchlp:    ld    a,(de)
  280.     ld    c,(hl)
  281.     inc    hl
  282.     inc    de
  283.     cp    '?'
  284.     jr    z,mtch1
  285.     res    7,c
  286.     cp    c
  287.     jr    nz,nomtch
  288. mtch1:    djnz    mtchlp
  289.     jr    creok        ; (nope, so continue)
  290. nomtch:    ld    hl,junk
  291.     call    pstr
  292.     call    ilprt
  293.     db    ' doesn''t match',0
  294.     jr    noex
  295. exists:    ld    hl,junk        ; it exists, so skip it
  296.     call    pstr
  297.     call    ilprt
  298.     db    ' exists',0
  299. noex:    call    ilprt
  300.     db    ' -- not extracting  ',0
  301.     xor    a
  302.     jr    resmod
  303. ;
  304. extrct:    xor    a
  305.     ld    (zipeof),a
  306.     ld    a,(curmode)
  307.     or    a
  308.     jr    nz,doext
  309.     call    ilprt
  310.     db    'Checking ',0
  311.     jr    pjunk
  312. ;
  313. creok:    call    setout
  314.     ld    de,opfcb    ; create output file
  315.     ld    c,fmake
  316.     call    bdos
  317.     inc    a
  318.     jr    nz,opnok1
  319.     call    ilprt
  320.     db    'Error creating ',0
  321.     ld    hl,junk
  322.     call    pstr
  323.     jr    noex
  324. ;
  325. opnok1:    call    ilprt
  326.     db    'Extracting ',0
  327. pjunk:    ld    hl,junk
  328.     call    pstr
  329. doext:    call    ilprt
  330.     db    ' -- ',0
  331.     ld    hl,counting
  332.     inc    (hl)
  333.     ld    a,(cm)
  334.     or    a
  335.     jr    nz,case1
  336. case0w:    ld    a,(zipeof)
  337.     and    1
  338.     jr    nz,closeo
  339. savcs0:    call    getbyte
  340.     call    outbyte
  341.     jr    case0w
  342. ;
  343. case1:    dec    a
  344.     jr    nz,case2p
  345.     call    unshrink
  346.     jr    closeo
  347. ;
  348. case2p:    dec    a
  349.     cp    4
  350.     jr    nc,tryimp
  351.     call    unreduce
  352.     jr    closeo
  353. ;
  354. tryimp:    jr    nz,badzip
  355.     call    unimplode
  356.     jr    closeo
  357. ;
  358. badzip:    call    ilprt
  359.     db    'Unknown compression method',CR,LF,0
  360.     ret
  361. ;
  362. closeo:    ld    hl,zipeof
  363.     dec    (hl)
  364.     inc    hl
  365.     dec    (hl)
  366.     ld    a,(curmode)
  367.     or    a
  368.     jr    z,nocls
  369. ;    jr    nz,nocls
  370.     ld    hl,wrtpt
  371.     ld    a,(hl)
  372.     or    a
  373.     jr    z,noflsh
  374.     ld    de,opbuf
  375.     ld    c,setdma
  376.     call    bdos
  377.     call    setout
  378.     ld    de,opfcb
  379.     ld    c,fwrite
  380.     call    bdos
  381. noflsh:    call    setout
  382.     ld    de,opfcb
  383.     ld    c,fclose
  384.     call    bdos
  385. nocls:    ld    hl,crc32
  386.     ld    de,crc
  387.     scf
  388.     ld    bc,4 shl 8
  389. crcclp:    ld    a,(de)
  390.     adc    a,(hl)
  391.     push    af
  392.     or    c
  393.     ld    c,a
  394.     pop    af
  395.     inc    hl
  396.     inc    de
  397.     djnz    crcclp
  398.     ld    a,c
  399.     or    a
  400.     jr    z,crcok
  401.     call    ilprt
  402.     db    'CRC error',CR,LF,0
  403.     jr    wildck
  404. ;
  405. crcok:    call    ilprt
  406.     db    'CRC OK',CR,LF,0
  407. wildck:    ld    a,(curmode)
  408.     or    a
  409.     ret    z
  410.     ld    hl,mtchfcb
  411.     ld    bc,11
  412.     ld    a,'?'
  413.     cpir
  414.     jp    nz,exit
  415.     ret
  416. ;
  417. getchla:
  418.     call    getcode
  419.     ld    (code),hl
  420.     ld    a,(zipeof)
  421.     and    1
  422.     ret
  423. ;
  424. savstk:    ld    hl,(stackp)
  425.     dec    hl
  426.     ld    (stackp),hl
  427.     ld    (hl),a
  428.     ret
  429. ;
  430. getcode:
  431.     ld    a,(codesize)
  432. readbits:
  433.     ld    hl,8000h
  434. bitlp:    push    af
  435.     push    hl
  436. getbit:    ld    hl,bleft
  437.     dec    (hl)
  438.     jp    m,readbt
  439.     dec    hl
  440.     rr    (hl)
  441.     pop    hl
  442.     rr    h
  443.     rr    l
  444.     pop    af
  445.     dec    a
  446.     jr    nz,bitlp
  447. finbit:    srl    h
  448.     rr    l
  449.     jr    nc,finbit
  450.     ld    a,l
  451.     ret
  452. ;
  453. readbt:    push    hl
  454.     call    getbyte
  455.     pop    hl
  456.     ld    (hl),8
  457.     dec    hl
  458.     ld    (hl),a
  459.     jr    getbit
  460. ;
  461. scanfn:    ld    a,(de)
  462.     cp    '.'
  463.     jr    z,nocopy
  464.     or    a
  465.     jr    z,nocopy
  466.     inc    de
  467.     dec    b
  468.     jp    m,scanfn
  469.     ld    (hl),a
  470.     inc    hl
  471.     jr    scanfn
  472. ;
  473. nocopy:    dec    b
  474.     ret    m
  475.     ld    (hl),' '
  476.     inc    hl
  477.     jr    nocopy
  478. ;
  479. ilprt:    pop    hl
  480.     call    pstr
  481.     jp    (hl)
  482. ;
  483. pstr:    ld    a,(hl)
  484.     or    a
  485.     ret    z
  486.     push    hl
  487.     ld    e,a
  488.     ld    c,conout
  489.     call    bdos
  490.     pop    hl
  491.     inc    hl
  492.     jr    pstr
  493. ;
  494. getstring:
  495.     ld    a,h
  496.     or    l
  497.     ld    (de),a
  498.     ret    z
  499.     push    de
  500.     push    hl
  501.     call    getbyte
  502.     pop    hl
  503.     pop    de
  504.     ld    (de),a
  505.     inc    de
  506.     dec    hl
  507.     jr    getstring
  508. ;
  509. getword:
  510.     call    getbyte
  511.     push    af
  512.     call    getbyte
  513.     pop    hl
  514.     ld    l,h
  515.     ld    h,a
  516.     ret
  517. ;
  518. getbyte:
  519.     ld    a,(zipeof)
  520.     and    1
  521.     ld    a,CtrlZ
  522.     ret    nz
  523.     ld    a,(counting)
  524.     or    a
  525.     jr    z,skpdci
  526.     ld    hl,(cs)
  527.     ld    de,(cs + 2)
  528.     ld    a,d
  529.     or    e
  530.     or    h
  531.     or    l
  532.     jr    nz,noteof
  533.     ld    hl,zipeof
  534.     inc    (hl)
  535.     ld    a,CtrlZ
  536.     ret
  537. ;
  538. noteof:    ld    a,h
  539.     or    l
  540.     dec    hl
  541.     ld    (cs),hl
  542.     jr    nz,skpdci
  543.     dec    de
  544.     ld    (cs + 2),de
  545. skpdci:    call    ckcon        ; check console for abort
  546.     ld    hl,readpt
  547.     ld    a,(hl)
  548.     or    a
  549.     jr    nz,ptok
  550.     ld    de,80h
  551.     ld    (hl),e
  552.     push    hl
  553.     ld    c,setdma
  554.     call    bdos
  555.     call    setin
  556.     ld    de,infcb
  557.     ld    c,fread
  558.     call    bdos
  559.     or    a
  560.     pop    hl
  561.     jr    nz,ateof
  562. ptok:    ld    a,(hl)
  563.     inc    (hl)
  564.     ld    l,a
  565.     ld    h,0
  566.     ld    a,(hl)
  567.     ret
  568. ;
  569. ateof:    ld    a,CtrlZ
  570.     ret
  571. ;
  572. outb:    ld    hl,(outpos)
  573.     push    hl
  574.     push    af
  575.     ld    a,h
  576.     and    1fh
  577.     ld    h,a
  578.     pop    af
  579.     ld    de,outbuf
  580.     add    hl,de
  581.     ld    (hl),a
  582.     pop    hl
  583.     inc    hl
  584.     ld    (outpos),hl
  585.     push    af
  586.     ld    a,h
  587.     or    l
  588.     jr    nz,nopos
  589.     ld    hl,(outpos + 2)
  590.     inc    hl
  591.     ld    (outpos + 2),hl
  592. nopos:    pop    af
  593. outbyte:
  594.     push    af
  595.     call    updcrc
  596.     ld    hl,(ucs)
  597.     ld    de,(ucs + 2)
  598.     ld    a,h
  599.     or    l
  600.     dec    hl
  601.     ld    (ucs),hl
  602.     jr    nz,tsthl0
  603.     dec    de
  604.     ld    (ucs + 2),de
  605. tsthl0:    ld    a,h
  606.     or    l
  607.     or    d
  608.     or    e
  609.     jr    nz,noeof
  610.     ld    hl,zipeof
  611.     inc    (hl)
  612. noeof:    ld    a,(curmode)
  613.     or    a
  614.     jr    nz,noeof1
  615.     pop    af
  616.     ret
  617. ;
  618. noeof1:    ld    hl,wrtpt
  619.     ld    a,(hl)
  620.     add    a,a
  621.     jr    nc,wptok
  622.     ld    de,opbuf
  623.     ld    c,setdma
  624.     call    bdos
  625.     call    setout
  626.     ld    de,opfcb
  627.     ld    c,fwrite
  628.     call    bdos
  629.     or    a
  630.     jr    z,wptok
  631.     call    ilprt
  632.     db    'Write Error (Disk full)',CR,LF,0
  633.     jp    ckcon0
  634. ;
  635. wptok:    jr    nz,nofilb
  636.     ld    hl,opbuf
  637.     ld    de,opbuf + 1
  638.     ld    bc,127
  639.     ld    (hl),CtrlZ
  640.     ldir
  641.     xor    a
  642.     ld    (wrtpt),a
  643. nofilb:    pop    af
  644.     ld    hl,wrtpt
  645.     inc    (hl)
  646.     ld    l,(hl)
  647.     ld    h,0
  648.     ld    de,opbuf - 1
  649.     add    hl,de
  650.     ld    (hl),a
  651.     ret
  652. ;
  653. updcrc:    ld    hl,(crc32)
  654.     ld    de,(crc32 + 2)
  655.     ld    c,a
  656.     ld    b,8
  657. crclp:    ld    a,l
  658.     xor    c
  659.     srl    c
  660.     srl    d
  661.     rr    e
  662.     rr    h
  663.     rr    l
  664.     rra
  665.     jr    nc,noxor
  666.     ld    a,d
  667.     xor    0edh
  668.     ld    d,a
  669.     ld    a,e
  670.     xor    0b8h
  671.     ld    e,a
  672.     ld    a,h
  673.     xor    83h
  674.     ld    h,a
  675.     ld    a,l
  676.     xor    20h
  677.     ld    l,a
  678. noxor:    djnz    crclp
  679.     ld    (crc32),hl
  680.     ld    (crc32 + 2),de
  681.     ret
  682. ;
  683. unshrink:
  684.     ld    a,init_bits
  685.     ld    (codesize),a
  686.     ld    hl,+(1 shl init_bits) - 1;
  687.     ld    (maxcode),hl
  688.     ld    hl,first_ent
  689.     ld    (free_ent),hl
  690.     ld    hl,prefix_of
  691.     ld    de,prefix_of + 1
  692.     ld    bc,512
  693.     ld    (hl),c
  694.     ldir
  695.     ld    bc,16386 - 512
  696.     ld    (hl),-1
  697.     ldir
  698.     ld    hl,suffix_of
  699. sol:    ld    (hl),c
  700.     inc    hl
  701.     inc    c
  702.     jr    nz,sol
  703.     call    getchla
  704.     ld    (oldcode),hl
  705.     ret    nz
  706.     ld    a,l
  707.     ld    (finchar),a
  708.     call    outbyte
  709. unshlp:    ld    hl,stack + 8192
  710.     ld    (stackp),hl
  711.     ld    a,(zipeof)
  712.     and    1
  713.     ret    nz
  714. clrlp:    call    z,getchla
  715.     ret    nz
  716.     ld    a,h
  717.     dec    a
  718.     or    l
  719.     jr    nz,noclr
  720.     call    getchla
  721.     ld    a,h
  722.     or    a
  723.     jr    nz,clrlp
  724.     dec    l
  725.     jr    z,bumpcs
  726.     dec    l
  727.     call    z,partial_clear
  728.     jr    clrlp
  729. ;
  730. bumpcs:    ld    hl,codesize
  731.     inc    (hl)
  732.     ld    a,(hl)
  733.     cp    max_bits
  734.     ld    hl,maxcmax
  735.     jr    z,atmax
  736.     ld    hl,1
  737. maxclp:    add    hl,hl
  738.     dec    a
  739.     jr    nz,maxclp
  740.     dec    hl
  741. atmax:    ld    (maxcode),hl
  742.     jr    clrlp
  743. ;
  744. noclr:    ld    (incode),hl
  745.     add    hl,hl
  746.     ld    de,prefix_of
  747.     add    hl,de
  748.     ld    a,(hl)
  749.     inc    hl
  750.     and    (hl)
  751.     inc    a
  752.     ld    hl,(code)
  753.     jr    nz,noKwKw
  754.     ld    a,(finchar)
  755.     call    savstk
  756.     ld    hl,(oldcode)
  757. noKwKw:    ex    de,hl
  758. staklp: ld    hl,suffix_of
  759.     add    hl,de
  760.     ld    a,(hl)
  761.     call    savstk
  762.     ld    hl,100h
  763.     or    a
  764.     sbc    hl,de
  765.     jr    nc,unstak
  766.     ld    hl,prefix_of
  767.     add    hl,de
  768.     add    hl,de
  769.     ld    e,(hl)
  770.     inc    hl
  771.     ld    d,(hl)
  772.     jr    staklp
  773. ;
  774. unstak:    ld    (finchar),a
  775.     ld    de,(stackp)
  776. unslp:    ld    hl,stack + 8192
  777.     or    a
  778.     sbc    hl,de
  779.     jr    z,newent
  780.     ld    a,(de)
  781.     inc    de
  782.     push    de
  783.     call    outbyte
  784.     pop    de
  785.     jr    unslp
  786. ;
  787. newent:    ld    hl,(free_ent)
  788.     ld    (code),hl
  789.     ex    de,hl
  790.     ld    hl,1fffh
  791.     or    a
  792.     sbc    hl,de
  793.     jr    c,full
  794.     ld    hl,prefix_of
  795.     add    hl,de
  796.     add    hl,de
  797.     ld    bc,(oldcode)
  798.     ld    (hl),c
  799.     inc    hl
  800.     ld    (hl),b
  801.     ld    hl,suffix_of
  802.     add    hl,de
  803.     ld    a,(finchar)
  804.     ld    (hl),a
  805. getfre:    inc    de
  806.     ld    hl,1fffh
  807.     or    a
  808.     sbc    hl,de
  809.     jr    c,full1
  810.     ld    hl,prefix_of
  811.     add    hl,de
  812.     add    hl,de
  813.     ld    a,(hl)
  814.     inc    hl
  815.     and    (hl)
  816.     inc    a
  817.     jr    nz,getfre
  818. full1:    ld    (free_ent),de
  819. full:    ld    hl,(incode)
  820.     ld    (oldcode),hl
  821.     jp    unshlp
  822. ;
  823. partial_clear:
  824.     ld    de,first_ent
  825. l8:    ld    hl,(free_ent)
  826.     or    a
  827.     sbc    hl,de
  828.     jr    z,br8
  829.     ld    hl,prefix_of + 1
  830.     add    hl,de
  831.     add    hl,de
  832.     set    7,(hl)
  833.     inc    de
  834.     jr    l8
  835. ;
  836. br8:    ld    de,first_ent
  837. l9:    ld    hl,(free_ent)
  838.     or    a
  839.     sbc    hl,de
  840.     jr    z,br9
  841.     ld    hl,prefix_of
  842.     add    hl,de
  843.     add    hl,de
  844.     push    de
  845.     ld    e,(hl)
  846.     inc    hl
  847.     ld    d,(hl)
  848.     res    7,d
  849.     ld    hl,first_ent - 1
  850.     or    a
  851.     sbc    hl,de
  852.     jr    nc,ei10
  853.     ld    hl,prefix_of + 1
  854.     add    hl,de
  855.     add    hl,de
  856.     res    7,(hl)
  857. ei10:    pop    de
  858.     inc    de
  859.     jr    l9
  860. ;
  861. br9:    ld    de,first_ent
  862. l10:    ld    hl,(free_ent)
  863.     or    a
  864.     sbc    hl,de
  865.     jr    z,br10
  866.     ld    hl,prefix_of + 1
  867.     add    hl,de
  868.     add    hl,de
  869.     bit    7,(hl)
  870.     jr    z,ei11
  871.     ld    (hl),-1
  872.     dec    hl
  873.     ld    (hl),-1
  874. ei11:    inc    de
  875.     jr    l10
  876. ;
  877. br10:    ld    de,first_ent
  878. l11:    ld    hl,maxcmax
  879.     or    a
  880.     sbc    hl,de
  881.     jr    z,br11
  882.     ld    hl,prefix_of
  883.     add    hl,de
  884.     add    hl,de
  885.     ld    a,(hl)
  886.     inc    hl
  887.     and    (hl)
  888.     inc    a
  889.     jr    z,br11
  890.     inc    de
  891.     jr    l11
  892. br11:    ld    (free_ent),de
  893.     ret
  894. ;
  895. loadfollowers:
  896.     ld    hl,Slen + 255
  897.     ld    b,0
  898. lflp:    push    bc
  899.     push    hl
  900.     ld    a,6
  901.     call    readbits
  902.     pop    hl
  903.     pop    de
  904.     ld    (hl),a
  905.     push    de
  906.     push    hl
  907.     dec    d
  908.     ld    hl,followers
  909.     call    shftadd
  910.     ld    b,a
  911.     or    a
  912.     jr    z,nofoll
  913. ldfllp:    push    hl
  914.     push    bc
  915.     ld    a,8
  916.     call    readbits
  917.     pop    bc
  918.     pop    hl
  919.     ld    (hl),a
  920.     inc    hl
  921.     djnz    ldfllp
  922. nofoll:    pop    hl
  923.     pop    bc
  924.     dec    hl
  925.     djnz    lflp
  926.     ret
  927. ;
  928. unreduce:
  929.     ld    e,a
  930.     ld    d,0
  931.     ld    hl,_L_table
  932.     add    hl,de
  933.     ld    a,(hl)
  934.     ld    (L_table),a
  935.     ld    hl,_D_shift
  936.     add    hl,de
  937.     ld    a,(hl)
  938.     ld    (D_shift),a
  939.     xor    a
  940.     ld    (ExState),a
  941.     ld    (lchar),a
  942.     call    loadfollowers
  943. ur1:    ld    a,(zipeof)
  944.     and    1
  945.     ret    nz
  946.     call    slenlch
  947.     or    a
  948.     jr    nz,ur2
  949. ur4:    ld    a,8
  950.     call    readbits
  951.     jr    ur3
  952. ;
  953. ur2:    ld    a,1
  954.     call    readbits
  955.     dec    l
  956.     jr    z,ur4
  957.     call    slenlch
  958.     dec    a
  959.     or    1
  960.     ld    l,a
  961.     xor    a
  962. btlp:    inc    a
  963.     srl    l
  964.     jr    nz,btlp
  965.     call    readbits
  966.     ld    de,followers
  967.     add    hl,de
  968.     ld    de,(lchar - 1)
  969.     call    shftadd
  970.     ld    a,(hl)
  971. ur3:    ld    (nchar),a
  972.     ld    l,a
  973.     ld    a,(ExState)
  974.     or    a
  975.     jr    nz,ur5
  976.     ld    a,l
  977.     cp    DLE    
  978.     jr    nz,ur9
  979.     ld    a,1
  980.     ld    (ExState),a
  981.     jr    ur6
  982. ;
  983. ur5:    dec    a
  984.     jr    nz,ur7
  985.     ld    a,l
  986.     or    a
  987.     jr    z,ur10
  988.     ld    (V),a
  989.     ld    a,(L_table)
  990.     ld    h,a
  991.     and    l
  992.     cp    h
  993.     ld    l,a
  994.     ld    h,0
  995.     ld    (Len),hl
  996.     jr    nz,ur12
  997.     ld    a,2
  998.     jr    ur11
  999. ;
  1000. ur10:    ld    (ExState),a
  1001.     ld    a,DLE
  1002. ur9:    call    outb
  1003.     jr    ur6
  1004. ;
  1005. ur7:    dec    a
  1006.     jr    nz,ur8
  1007.     ld    a,l
  1008.     ld    hl,Len
  1009.     add    a,(hl)
  1010.     ld    (hl),a
  1011.     jr    nc,ur12
  1012.     inc    hl
  1013.     inc    (hl)
  1014. ur12:    ld    a,3
  1015.     jr    ur11
  1016. ;
  1017. ur8:    dec    a
  1018.     jr    nz,ur13
  1019.     ld    a,(D_shift)
  1020.     ld    b,a
  1021.     ld    a,(V)
  1022. ur14:    srl    a
  1023.     djnz    ur14
  1024.     ld    h,a
  1025.     inc    hl
  1026.     ld    bc,(Len)
  1027.     inc    bc
  1028.     inc    bc
  1029.     inc    bc
  1030.     call    callback
  1031. ur13:    xor    a
  1032. ur11:    ld    (ExState),a
  1033. ur6:    ld    a,(nchar)
  1034.     ld    (lchar),a
  1035.     jp    ur1
  1036. ;
  1037. slenlch:
  1038.     ld    hl,(lchar)
  1039.     ld    h,0
  1040.     ld    de,Slen
  1041.     add    hl,de
  1042.     ld    a,(hl)
  1043.     ret
  1044. ;
  1045. shftadd:
  1046.     ld    e,0
  1047.     srl    d
  1048.     rr    e
  1049.     srl    d
  1050.     rr    e
  1051.     add    hl,de
  1052.     ret
  1053. ;
  1054. callback:
  1055.     push    bc
  1056.     push    hl
  1057.     ld    hl,(outpos)
  1058.     ld    de,(outpos + 2)
  1059.     pop    bc
  1060.     or    a
  1061.     sbc    hl,bc
  1062.     jr    nc,cb2
  1063.     dec    de
  1064. cb2:    pop    bc
  1065. cb3:    bit    7,d
  1066.     jr    z,cb4
  1067.     ld    a,b
  1068.     or    c
  1069.     jr    z,cb4
  1070.     xor    a
  1071.     call    outbp
  1072.     inc    hl
  1073.     ld    a,h
  1074.     or    l
  1075.     jr    nz,cb5
  1076.     inc    de
  1077. cb5:    dec    bc
  1078.     jr    cb3
  1079. ;
  1080. cb4:    ex    de,hl
  1081. cb6:    ld    a,b
  1082.     or    c
  1083.     ret    z
  1084.     ld    a,d
  1085.     and    1fh
  1086.     ld    d,a
  1087.     ld    hl,outbuf
  1088.     add    hl,de
  1089.     ld    a,(hl)
  1090.     call    outbp
  1091.     inc    de
  1092.     dec    bc
  1093.     jr    cb6
  1094. ;
  1095. outbp:    push    hl
  1096.     push    de
  1097.     push    bc
  1098.     call    outb
  1099.     pop    bc
  1100.     pop    de
  1101.     pop    hl
  1102.     ret
  1103. ;
  1104. readlengths:
  1105.     ld    a,8
  1106.     call    readbits
  1107.     ld    d,h
  1108.     ld    e,d
  1109.     inc    hl
  1110.     ld    b,h
  1111.     ld    c,l
  1112.     ld    (ix + _maxlength),e
  1113.     ld    (ix + _maxlength + 1),d
  1114.     push    ix
  1115.     pop    hl
  1116.     inc    hl
  1117.     inc    hl
  1118.     inc    hl
  1119. rl1:    ld    a,b
  1120.     or    c
  1121.     ret    z
  1122.     push    bc
  1123.     push    de
  1124.     push    hl
  1125.     ld    a,4
  1126.     call    readbits
  1127.     inc    a
  1128.     push    af
  1129.     ld    a,4
  1130.     call    readbits
  1131.     inc    a
  1132.     ld    b,a
  1133.     pop    af
  1134.     ld    c,a
  1135.     pop    hl
  1136.     pop    de
  1137.     ld    a,(ix + _maxlength)
  1138.     cp    c
  1139.     jr    nc,rl2
  1140.     ld    (ix + _maxlength),c
  1141. rl2:    inc    hl
  1142.     inc    hl
  1143.     inc    hl
  1144.     ld    (hl),e
  1145.     inc    hl
  1146.     ld    (hl),c
  1147.     inc    e
  1148.     djnz    rl2
  1149.     pop    bc
  1150.     dec    bc
  1151.     jr    rl1
  1152. ;
  1153. sortlengths:
  1154.     ld    h,(ix + _entries + 1)
  1155.     ld    l,(ix + _entries)
  1156.     ld    b,h
  1157.     ld    c,l
  1158.     ld    (entrs),hl
  1159. sl7:    srl    b
  1160.     rr    c
  1161. sl1:    ld    a,b
  1162.     or    c
  1163.     ret    z
  1164.     ld    (noswps),a
  1165.     push    ix
  1166.     ld    de,4
  1167.     add    ix,de
  1168.     push    ix
  1169.     pop    iy
  1170.     add    iy,bc
  1171.     add    iy,bc
  1172.     add    iy,bc
  1173.     add    iy,bc
  1174.     ld    hl,(entrs)
  1175.     or    a
  1176.     sbc    hl,bc
  1177. sl2:    ld    a,(ix + _bitlength)
  1178.     cp    (iy + _bitlength)
  1179.     jr    c,sl4
  1180.     jr    nz,sl3
  1181.     ld    a,(iy + _value)
  1182.     cp    (ix + _value)
  1183.     jr    nc,sl4
  1184. sl3:    ld    d,e
  1185. sl5:    ld    a,(ix)
  1186.     push    af
  1187.     ld    a,(iy)
  1188.     ld    (ix),a
  1189.     pop    af
  1190.     ld    (iy),a
  1191.     inc    ix
  1192.     inc    iy
  1193.     dec    d
  1194.     jr    nz,sl5
  1195.     ld    a,d
  1196.     ld    (noswps),a
  1197.     jr    sl6
  1198. ;
  1199. sl4:    add    ix,de
  1200.     add    iy,de
  1201. sl6:    dec    hl
  1202.     ld    a,h
  1203.     or    l
  1204.     jr    nz,sl2
  1205.     pop    ix
  1206.     ld    a,(noswps)
  1207.     or    a
  1208.     jr    nz,sl7
  1209.     jr    sl1
  1210. ;
  1211. generatetrees:
  1212.     ld    l,(ix + _entries)
  1213.     ld    h,(ix + _entries + 1)
  1214.     ld    c,l
  1215.     ld    b,h
  1216.     push    ix
  1217.     pop    de
  1218.     add    hl,hl
  1219.     add    hl,hl
  1220.     add    hl,de
  1221.     push    hl
  1222.     pop    iy
  1223.     xor    a
  1224.     ld    d,a
  1225.     ld    e,a
  1226.     ld    h,a
  1227.     ld    l,a
  1228.     ld    (lbl),a
  1229. gt1:    ld    a,b
  1230.     or    c
  1231.     ret    z
  1232.     dec    bc
  1233.     add    hl,de    
  1234.     ld    a,(lbl)
  1235.     cp    (iy + _bitlength)
  1236.     jr    z,gt2
  1237.     ld    a,(iy + _bitlength)
  1238.     ld    (lbl),a
  1239.     sub    16
  1240.     ex    de,hl
  1241.     ld    hl,1
  1242.     jr    z,gt3
  1243. gt4:    add    hl,hl
  1244.     inc    a
  1245.     jr    nz,gt4
  1246. gt3:    ex    de,hl
  1247. gt2:    ld    (iy + _code),l
  1248.     ld    (iy + _code + 1),h
  1249.     push    de
  1250.     ld    de,-4
  1251.     add    iy,de
  1252.     pop    de
  1253.     jr    gt1
  1254. ;
  1255. ldtrees:
  1256.     ld    a,(gpbf)
  1257.     rra
  1258.     ld    l,a
  1259.     and    1
  1260.     add    a,6
  1261.     ld    (dictb),a
  1262.     ld    a,l
  1263.     rra
  1264.     and    1
  1265.     ld    (ltp),a
  1266.     set    1,a
  1267.     ld    (mml),a
  1268.     ld    ix,lit_tree
  1269.     ld    hl,256
  1270.     call    nz,ld_tree
  1271.     ld    hl,64
  1272.     ld    ix,len_tree
  1273.     call    ld_tree
  1274.     ld    hl,64
  1275.     ld    ix,dist_tre
  1276. ld_tree:
  1277.     ld    (ix + _entries),l
  1278.     ld    (ix + _entries + 1),h
  1279.     call    readlengths
  1280.     call    sortlengths
  1281.     call    generatetrees
  1282. reversebits:
  1283.     push    ix
  1284.     pop    hl
  1285.     ld    e,(hl)
  1286.     inc    hl
  1287.     ld    d,(hl)
  1288. rb1:    inc    hl
  1289.     inc    hl
  1290.     inc    hl
  1291.     ld    c,(hl)
  1292.     ld    b,8
  1293. rb2:    srl    c
  1294.     adc    a,a
  1295.     djnz    rb2
  1296.     push    af
  1297.     inc    hl
  1298.     ld    c,(hl)
  1299.     ld    b,8
  1300. rb3:    srl    c
  1301.     adc    a,a
  1302.     djnz    rb3
  1303.     dec    hl
  1304.     ld    (hl),a
  1305.     pop    af
  1306.     inc    hl
  1307.     ld    (hl),a
  1308.     dec    de
  1309.     ld    a,d
  1310.     or    e
  1311.     jr    nz,rb1
  1312.     ret
  1313. ;
  1314. readtree:
  1315.     push    ix
  1316.     pop    iy
  1317.     ld    de,4
  1318.     add    iy,de
  1319.     ld    b,d
  1320.     ld    e,d
  1321.     ld    h,d
  1322.     ld    l,d
  1323. rt1:    push    hl
  1324.     push    de
  1325.     push    bc
  1326.     ld    a,1
  1327.     call    readbits
  1328.     pop    af
  1329.     push    af
  1330.     or    a
  1331.     jr    z,rt2
  1332. rt3:    add    hl,hl
  1333.     dec    a
  1334.     jr    nz,rt3
  1335. rt2:    pop    bc
  1336.     pop    de
  1337.     add    hl,de
  1338.     ex    de,hl
  1339.     inc    b
  1340.     pop    hl
  1341. rt4:    ld    a,(iy + _bitlength)
  1342.     cp    b
  1343.     jr    nc,rt5
  1344.     push    de
  1345.     ld    de,4
  1346.     add    iy,de
  1347.     pop    de
  1348.     inc    hl
  1349.     ld    a,(ix + _entries)
  1350.     sub    l
  1351.     jr    nz,rt4
  1352.     ld    a,(ix + _entries + 1)
  1353.     sub    h
  1354.     jr    nz,rt4
  1355. rt6:    dec    a
  1356.     ret
  1357. ;
  1358. rt5:    ld    a,(iy + _bitlength)
  1359.     cp    b
  1360.     jr    nz,rt1
  1361.     ld    a,(iy + _code)
  1362.     cp    e
  1363.     jr    nz,rt7
  1364.     ld    a,(iy + _code + 1)
  1365.     cp    d
  1366.     jr    nz,rt7
  1367.     ld    a,(iy + _value)
  1368.     ret
  1369. ;
  1370. rt7:    push    de
  1371.     ld    de,4
  1372.     add    iy,de
  1373.     pop    de
  1374.     inc    hl
  1375.     ld    a,(ix + _entries)
  1376.     sub    l
  1377.     jr    nz,rt5
  1378.     ld    a,(ix + _entries + 1)
  1379.     sub    h
  1380.     jr    nz,rt5
  1381.     jr    rt6
  1382. ;
  1383. unimplode:
  1384.     call    ldtrees
  1385. ui1:    ld    a,(zipeof)
  1386.     and    1
  1387.     ret    nz
  1388.     inc    a
  1389.     call    readbits
  1390.     or    a
  1391.     jr    z,ui2
  1392.     ld    a,(ltp)
  1393.     or    a
  1394.     jr    z,ui3
  1395.     ld    ix,lit_tree
  1396.     call    readtree
  1397.     jr    ui4
  1398. ;
  1399. ui3:    ld    a,8
  1400.     call    readbits
  1401. ui4:    call    outb
  1402.     jr    ui1
  1403. ;
  1404. ui2:    ld    a,(dictb)
  1405.     call    readbits
  1406.     push    hl
  1407.     ld    ix,dist_tre
  1408.     call    readtree
  1409.     ld    bc,(dictb - 1)
  1410. ui5:    add    hl,hl
  1411.     djnz    ui5
  1412.     pop    bc
  1413.     add    hl,bc
  1414.     push    hl
  1415.     ld    ix,len_tree
  1416.     call    readtree
  1417.     ld    l,a
  1418.     ld    h,0
  1419.     cp    63
  1420.     jr    nz,ui6
  1421.     push    hl
  1422.     ld    a,8
  1423.     call    readbits
  1424.     pop    de
  1425.     add    hl,de
  1426. ui6:    ld    de,(mml)
  1427.     ld    d,0
  1428.     add    hl,de
  1429.     ld    b,h
  1430.     ld    c,l
  1431.     pop    hl
  1432.     inc    hl
  1433.     call    callback
  1434.     jr    ui1
  1435. ;
  1436. ; ckcon -- checks console for character; aborts if ^C
  1437. ;
  1438. ckcon:    ld    e,0FFh        ; check for character
  1439.     ld    c,dircon
  1440.     call    bdos
  1441.     or    a
  1442.     ret    z
  1443.     cp    CtrlC        ; ^C ?
  1444.     ret    nz        ; (no, continue)
  1445.     ld    a,(curmode)    ; are we writing a file?
  1446.     or    a
  1447.     jr    z,ckcon1    ; (no)
  1448.     call    setout
  1449. ckcon0:    ld    de,opfcb
  1450.     ld    c,fclose    ; yes, close it
  1451.     call    bdos
  1452.     ld    de,opfcb
  1453.     ld    c,ferase    ; and delete it
  1454.     call    bdos
  1455.     call    ilprt
  1456.     db    'Partial file erased -- ',0
  1457. ckcon1:    call    ilprt
  1458.     db    'Aborted',0
  1459.     jp    exit
  1460. ;
  1461. ; getusr -- gets and stores source and destination users
  1462. ;
  1463. getusr:    ld    hl,(Z3EAdr)    ; ZCPR3?
  1464.     ld    a,h
  1465.     or    l
  1466.     ret    z        ; (no, skip this)
  1467.     ld    a,(infcb+13)    ; get source user
  1468.     ld    (inusr),a
  1469.     ld    a,(altfcb+13)    ; get destination user
  1470.     ld    (outusr),a
  1471.     ret
  1472. ;
  1473. ; setin, setout -- logs to source or destination user
  1474. ;
  1475. setin:    ld    a,(inusr)
  1476.     jr    setbth
  1477. ;
  1478. setout:    ld    a,(outusr)
  1479. setbth:    ld    e,a
  1480.     ld    hl,(Z3EAdr)    ; ZCPR3?
  1481.     ld    a,h
  1482.     or    l
  1483.     ret    z        ; (no, skip this)
  1484.     ld    c,setusr
  1485.     jp    bdos        ; = call bdos!ret
  1486. ;
  1487. ; usage -- show syntax for ZCPR3 ("dir:") or vanilla CP/M ("d:")
  1488. ;
  1489. usage:    call    ilprt
  1490.     db    'Usage:',CR,LF
  1491.     db    '   UNZIP {d',0
  1492.     ld    hl,(Z3EAdr)
  1493.     ld    a,h
  1494.     or    l
  1495.     jr    z,usage2
  1496.     call    ilprt
  1497.     db    'ir',0
  1498. usage2:    call    ilprt
  1499.     db    ':}zipfile {d',0
  1500.     ld    hl,(Z3EAdr)
  1501.     ld    a,h
  1502.     or    l
  1503.     jr    z,usage3
  1504.     call    ilprt
  1505.     db    'ir',0
  1506. usage3:    call    ilprt
  1507.     db    ':}{afn.typ}',CR,LF
  1508.     db    'If a destination is given, files are extracted.',CR,LF
  1509.     db    'If not, files are checked and listed.',0
  1510.     jp    exit
  1511. ;
  1512. ; data storage . . .
  1513. ;    
  1514. zipeof:    db    2
  1515. counting:
  1516.     db    0
  1517. init:
  1518.     db    0
  1519.     db    0
  1520.     dw    0,0
  1521.     dw    -1,-1
  1522. endinit:
  1523. readpt:    db    0
  1524. _L_table:
  1525.     db    7fh, 3fh, 1fh, 0fh
  1526. _D_shift:
  1527.     db    07h, 06h, 05h, 04h
  1528. ;
  1529. ; uninitialized storage
  1530. ;
  1531. oldstk:    ds    2
  1532. inusr:    ds    1
  1533. outusr:    ds    1
  1534. mode:    ds    1
  1535. junk:    ds    STRSIZ
  1536. lfh:
  1537. vnte:    ds    2
  1538. gpbf:    ds    2
  1539. cm:    ds    2
  1540. lmft:    ds    2
  1541. lmfd:    ds    2
  1542. crc:    ds    4
  1543. cs:    ds    4
  1544. ucs:    ds    4
  1545. fnl:    ds    2
  1546. efl:    ds    2
  1547. endlfh:    ds    1
  1548. opfcb:    ds    1        ; output file control block
  1549. opfn:    ds    8
  1550. opext:    ds    3
  1551.     ds    24
  1552. bitbuf:    ds    1
  1553. mtchfcb:
  1554.     ds    11
  1555.     ds    1
  1556. vars:
  1557. bleft:    ds    1
  1558. wrtpt:    ds    1
  1559. outpos:    ds    4
  1560. crc32:    ds    4
  1561. curmode:
  1562.     ds    1
  1563. opbuf:    ds    128
  1564. L_table:
  1565.     ds    1
  1566. D_shift:
  1567.     ds    1
  1568. V:    ds    1
  1569. nchar:    ds    1
  1570. lchar:    ds    1
  1571. ExState:
  1572.     ds    1
  1573. Len:    ds    2
  1574. ltp:    ds    1
  1575. mml:    ds    1
  1576. dictb:    ds    1
  1577. noswps:    ds    1
  1578. entrs:    ds    2
  1579. lbl:    ds    1
  1580. oldcode:
  1581.     ds    2
  1582. offset:    ds    2
  1583. codesize:
  1584.     ds    1
  1585. maxcode:
  1586.     ds    2
  1587. free_ent:
  1588.     ds    2
  1589. finchar:
  1590.     ds    1
  1591. stackp:    ds    2
  1592. incode:    ds    2
  1593. code:    ds    2
  1594. outbuf:
  1595. suffix_of:
  1596.     ds    8192
  1597. prefix_of:
  1598. Slen:
  1599. lit_tree:
  1600.     ds    _sf_tree_
  1601. len_tree:
  1602.     ds    _sf_tree_
  1603. dist_tre:
  1604.     ds    _sf_tree_
  1605.     ds    16384 + 2 - (3 * _sf_tree_)
  1606. followers:
  1607. stack:    ds    16384
  1608.  
  1609.     end
  1610.