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 / A / CRLZH20.LBR / CRLZH20.ZY0 / CRLZH20.ZY0
Text File  |  2000-06-30  |  25KB  |  750 lines

  1.     .SALL
  2.     TITLE 'CRrunch LZH v2.0  20 July 1991'
  3. ;************************************************************************
  4. ;*                                    *
  5. ;*                CRunch LZH v2.0                *
  6. ;*                  20 July 1991                *
  7. ;*                           - Roger Warren    *
  8. ;************************************************************************
  9. ;
  10. ;    With the kind permission of Mr. Steven Greenberg, author of 
  11. ;    CRunch, this program was generated from his CRunch v2.4 code
  12. ;    dated 15 Sept 1987.  Accordingly, the following notifications
  13. ;    are in order:
  14. ;
  15. ;     Portions Copyright (c)   S. Greenberg  09/15/87
  16. ;     Portions Copyright (c)   R. Warren     07/20/91
  17. ;    May be reproduced for non-profit use only
  18. ;
  19. ;    You can distribute it AS IS or modify it for your OWN use,
  20. ;    but public release of modified versions (source or object
  21. ;    files) without permission is prohibited, nor can it be sold.
  22.  
  23. ;CRLZH HISTORY:
  24. ; v2.0 Re-released because of new CRLZH algorithm changes.  Version 2.0
  25. ;    of CRLZH is 10% FASTER and compresses further than V1.1.  The output
  26. ;    files must be de-compressed with UCRLZH version 2.0, which replaces
  27. ;    UNCRLZH 1.1.  UNCRLZH 2.0 handles LZH encoded files of both versions
  28. ;    as well as CRUCNCHED and SQUEEZED files.
  29. ;    With the kind permission of Gene Pizzetta, changes made to CRUNCH
  30. ;    thru version 2.8 have been incorporated into this stripped down
  31. ;    driver taken from Steve Greenberg's version 2.4.  This program will
  32. ;    NOW handle date stamps ala ZSDOS.
  33. ;
  34. ; v1.1 Official first release.  No functional changes from Beta version.
  35. ;     Merely stepped version for differentiation.
  36. ;
  37. ; v1.0 Beta test version
  38.  
  39. VERS    EQU    20
  40. SUBVERS    EQU    ' '        ; modification level
  41.  
  42.     .Z80
  43.  
  44.     CSEG
  45.  
  46. NO    EQU    0
  47. YES    EQU    NOT NO
  48. N    EQU    NO
  49. Y    EQU    YES
  50. CRUNCH    EQU    YES        ; Yes for CRLZH, No for UNCRLZH (for common)
  51. ;ZSYS    EQU    NO        ; Yes if exclusively for Z-System
  52. .ACCEPT    'ZCPR3-Only Version [Y/N] ? ',ZSYS
  53.  
  54. ;=======================================================================
  55.  
  56.   IF ZSYS
  57. MEMPAG    EQU    1F00H        ; <== set! [see comment near end of program]
  58.   ELSE    ; ZSYS
  59. MEMPAG    EQU    2100H        ; <== set! [see comment near end of program]
  60.   ENDIF    ; ZSYS
  61.  
  62. ;=======================================================================
  63.  
  64. REV    EQU    (VERS/10*16)+(VERS MOD 10) ; Program revision level in BCD
  65. SIGREV    EQU    20H        ; "Significant" revision level (compatibility)
  66.  
  67. NOPRED    EQU    0FFFFH        ; "no predecessor"
  68. SCRUPT1    EQU    03H        ; Screen update speeds
  69. SCRUPT2    EQU    0FH
  70.  
  71. ; --- Ascii equates ---
  72.  
  73. CTRLC    EQU    03H        ; ^c
  74. BELL    EQU    07H        ; Beep
  75. BS    EQU    08H        ; Backspace
  76. LF    EQU    0AH        ; Linefeed
  77. CR    EQU    0DH        ; Carriage return
  78.  
  79. ; --- CP/M address equates ---
  80.  
  81. DFCB    EQU    5CH        ; Default FCB #1
  82. DFCB2    EQU    6CH        ; Default FCG #2
  83. DDMA    EQU    80H        ; Default DMA address
  84. BDOS    EQU    0005H        ; BDOS entry point
  85.  
  86. ; --- BDOS function equates ---
  87.  
  88. CONIN    EQU    1        ; Input a character from the console
  89. CONOUT    EQU    2        ; Output single char to console
  90. PRTSTR    EQU    9        ; Print string to console
  91. CONST    EQU    11        ; Get console status
  92. GETVER    EQU    12        ; Get CP/M version #
  93. SELDSK    EQU    14        ; Select disk
  94. OPEN    EQU    15        ; Open file
  95. CLOSE    EQU    16        ; Close file
  96. SFIRST    EQU    17        ; Search for first file
  97. SNEXT    EQU    18        ; Search for next file
  98. ERASE    EQU    19        ; Erase file
  99. READ    EQU    20        ; Read file (sequential)
  100. WRITE    EQU    21        ; Write file (sequential)
  101. MAKE    EQU    22        ; Make file
  102. GETDSK    EQU    25        ; Get currently logged drive
  103. SETDMA    EQU    26        ; Set DMA address
  104. SETATR    EQU    30        ; Set file attributes
  105. GSUSER    EQU    32        ; Get/set user code
  106. RSTDRV    EQU    37        ; Reset disk drive
  107. SETMS    EQU    44        ; Set multi-sector count (CP/M+ only)
  108. GETDMA    equ    47        ; get current DMA address
  109. EXDOSV    equ    48        ; extended BDOS version
  110. GETFSTP    equ    102        ; get file stamp
  111. SETFSTP    equ    103        ; set file stamp
  112.  
  113. ;.......................................................................
  114.  
  115.   IF NOT ZSYS
  116.     EXTRN    PARSEU
  117.   ENDIF    ; NOT ZSYS
  118.  
  119.     EXTRN    CRLZH        ; CRLZH module
  120.     PUBLIC    GLZHEN        ; CRLZH 'gets' thru this routine
  121.     PUBLIC     PLZHEN        ; CRLZH 'puts' thru this routine
  122.  
  123. ;.......................................................................
  124.  
  125. START:    JP    STRT        ; <--- entry
  126.     DB    'Z3ENV',01h    ; ZCPR3 environment descriptor
  127. Z3ED:    DW    00h
  128.  
  129. ;-----------------------------------------------------------------------
  130.  
  131.     DW    0        ; filler
  132.     DB    'CRLZH'        ; for ZCNFG
  133.     DB    VERS/10+'0',VERS MOD 10+'0'
  134.     DB    ' '        ; Filler
  135. ARCHIV:    DB    0        ; Archive bit mode flag
  136. QUIFL:    DB    0        ; Quiet mode flag
  137. NPROFL:    DB    0        ; No prompt before overwrite flag
  138. TRBOFL:    DB    0        ; Defeat multi-sector i/o flag
  139. CNFRFL:    DB    0        ; Confirm every file flag
  140. WRMFLG:    DB    0        ; Warm boot flag
  141. BIGFLG:    DB    0        ; Bigger file prompt flag
  142. MAXUSR:    DB    31        ; Maximum user # allowed by program
  143. MAXDRV:    DB    16        ; Maximum drive allowed by program
  144. SYSFL:    DB    0        ; System file inclusion flag
  145. TYPFL:    DB    ' '        ; Default filetype (UNCR only)
  146.  
  147. ;.......................................................................
  148. ;
  149. ; File type exclusion list. Must end with zero.
  150. ;           |<-1->|<-2->|<-3->|<-4->|<-5->|
  151. EXTBL:    DB    'ARC','ARK','LBR','FOR','ARK'
  152. ;           |<-6->|<-7->|<-8->|<-9->|<10->|
  153.     DB    'ARK','ARK','ARK','ARK','ARK'
  154.     DB    0        ; Must leave this terminating zero.
  155.  
  156. ;=*=-=*=*=-=*=-=*=-=*=-=*=-=*=-=*=-=*=-=*=-=*=-=*=-=*=-=*=-=*=-=*=-=*=-=
  157.  
  158. CPYRT:    DB    'CRLZH '
  159.   IF ZSYS
  160.     DB    'Z-'
  161.   ENDIF    ; ZSYS
  162.     DB    'Version ',VERS/10+'0','.',VERS MOD 10+'0',SUBVERS
  163.     DB    ' Copyright (c) 1987 by S. Greenberg',CR,LF
  164.         DB    '      Portions  Copyright (c) 1991 by R. Warren',CR,LF
  165.     DB    ' May be used/reproduced for non-profit use only',CR,LF,LF,'$'
  166.  
  167. ;=*=-=*=*=-=*=-=*=-=*=-=*=-=*=-=*=-=*=-=*=-=*=-=*=-=*=-=*=-=*=-=*=-=*=-=
  168.  
  169. STRT:
  170.   IF ZSYS
  171.     LD    HL,(Z3ED)    ; check for ZCPR3
  172.     LD    A,H
  173.     OR    L
  174.     JP    NZ,Z80
  175.   ELSE    ; ZSYS
  176.     SUB    A        ; Z-80 test [RAF]
  177.     JP    PO,Z80        ;
  178.   ENDIF    ; ZSYS
  179.     LD    DE,WRNGUP    ; "Program requires Z-80 Processor"
  180.     JP    MESS80        ; Special no frills exit w/ message
  181.  
  182. Z80:    LD    (OLDSTK),SP    ; Save os's stack
  183.     LD    SP,TOPSTK    ; Set local stack
  184.     CALL    STRTUP        ; Does a lot of stuff
  185.  
  186. ;.......................................................................
  187. ;
  188. ;    *****    Re-enter here for each matching file *****
  189. ;
  190. ; General wildcard operation:  When the program is first invoked, all
  191. ; matching filenames are put end to end in FNBUFF, 12 bytes each, in
  192. ; alphabetical order.  Since a filename is only 11 characters long the
  193. ; spare byte, which precedes each filename, is used as a "tag/flag".  By
  194. ; the time file processing starts (now), a number of routines have al-
  195. ; ready run (parts of the STRTUP routine).  These routines set the tag-
  196. ; flag which indicates to us now in what manner the file should be pro-
  197. ; cessed: "00" = "skip it", "01" = process it", "02" = "perform a direct
  198. ; copy (if possible)", "FF" = "no more files".
  199.  
  200. NXTFIL:    LD    SP,TOPSTK    ; Reset SP
  201.     XOR    A        ; clear embedded date stamp flag
  202.     LD    (DATFLG),A
  203.     LD    DE,INFCB    ; Input file's fcb
  204.     CALL    CLRFCB        ; Init it to blanks and zeroes
  205.     INC    DE        ; Leave "DE" pointing at "INFCB+1" for below
  206.     LD    HL,(BUFPTR)    ; Pntr to name of next file from expansion bfr
  207. NXTSEL:    LD    A,(HL)
  208.     OR    A        ; If zero, the file is "unselected"
  209.     JR    NZ,ISSEL    ; Br if it is selected
  210.     LD    BC,12        ; Else just quietly skip to the next file
  211.     ADD    HL,BC
  212.     LD    (BUFPTR),HL
  213.     JR    NXTSEL
  214.  
  215. ;...............................
  216. ;
  217. ; The file is "selected"; prepare to process it
  218.  
  219. ISSEL:    CP    0FFH        ; (FF means done)
  220.     JP    Z,RETCCP    ; Br if that is the case
  221.     PUSH    AF        ; Save stat (to see if file is "excluded" blw)
  222.     INC    HL        ; Skip to 1st filename char
  223.     LD    BC,11        ; Filename character count
  224.     LDIR            ; Put next file name into input fcb
  225.     LD    (BUFPTR),HL    ; Save new pointer for next file
  226.     CALL    INTRAM        ; Initialize all ram
  227.     LD    A,01H        ; This loc req's diff init for crunch vs uncr
  228.     LD    (CSAVE),A    ; Goes there
  229.     POP    AF        ; Get file's status byte back again
  230.  
  231.     CP    02H        ; 02 if file matched the "exclusion" list
  232.     JR    NZ,COPNIN    ; If not, definitely attempt to compress it
  233.     LD    A,(WLDFLG)    ; If so, see if prgm was invoked w/ wildcards
  234.     OR    A
  235.     JR    Z,COPNIN    ; If not, go attempt compression
  236.     LD    A,(DIFDU)    ; Else see if a direct copy is in order
  237.     OR    A        ; (flag set if data flow is to distinct DU:'s)
  238.     JP    Z,NXTFIL    ; If not, forget the whole thing
  239.  
  240. ;.......................................................................
  241. ;
  242. ; Perform a direct straight copy of the file
  243.  
  244.     LD    A,(QUIFM)
  245.     OR    A
  246.     LD    DE,DASHES    ; "-----" for visual separation
  247.     CALL    Z,MESAG2
  248.     JP    COPY9        ; Performs the copy
  249.  
  250. ;.......................................................................
  251. ;
  252. ; Normal Processing;  Prepare to compress the input file.  First, open
  253. ; the input file.  A failure here is unusual, since the file existed at
  254. ; the time the filename expansion took place.  There are "normal" series
  255. ; of events which could lead up to this, however.
  256.  
  257. COPNIN:    LD    A,(QUIFM)
  258.     OR    A
  259.     LD    DE,DASHES    ; "-----" for visual separation
  260.     CALL    Z,MESAG2
  261.     CALL    OPNIN        ; Attempt to open the next input file "INFCB"
  262.     JR    NC,OPOK        ; Br if ok
  263.     LD    DE,ERR1        ; "input file not found"
  264.     JP    SKIP1        ; Skip to next file
  265.  
  266. OPOK:    CALL    GETCHR        ; Start input machine
  267.     JR    NC,NOTMT    ; If carry is set on 1st byte, file is empty
  268.     LD    DE,ERR0        ; "input file empty"
  269.     JP    SKP991
  270. ; If file starts with 76FFh, it's already squeezed.  If it starts with 76FEh,
  271. ; it's already crunched (LZW, by us).  If it starts with 76FDh, it's already
  272. ; crunched (LZH).
  273. NOTMT:    CP    76H        ; does it start with 76h?
  274.     JR    NZ,CBL        ; (no, it's not compressed..is it?)
  275.     PUSH    AF        ; 1st byte was "76H", take advance peek at 2nd
  276.     EXX            ; Carefully check next byte, w/o norm call
  277.     LD    A,(HL)
  278.     EXX
  279.     INC    A        ; Well?  FFh?
  280.     JR    Z,ALRDSQ    ; Br if already squeezed
  281.     INC    A        ; FEh?
  282.     JR    Z,ALRDCR    ; Br if already crunched
  283.     INC    A        ; FDh?
  284.     JR    Z,ALRDLZ    ; Br if already crunched (LZH)
  285.     POP    AF
  286.  
  287. NOTSQ:    JR    CBL        ; Continue below
  288.  
  289. ;.......................................................................
  290.  
  291. ALRDCR:    POP    AF
  292.     LD    DE,MSGCR    ; "Already crunched"
  293.     JP    SKP991
  294.  
  295. ALRDSQ:    POP    AF
  296.     LD    DE,MSGSQ    ; "Already squeezed"
  297.     JP    SKP991
  298.  
  299. ALRDLZ:    POP    AF
  300.     LD    DE,MSGLZH    ; "Already LZH encoded"
  301.     JP    SKP991
  302.  
  303. ;.......................................................................
  304. ;
  305. ; So far the input file is open. The output file is not.
  306.  
  307. CBL:    LD    A,' '        ; For aesthetic alignment purposes
  308.     CALL    TYPE
  309.     LD    HL,INFCB    ; Print input filename to console
  310.     CALL    PRNFIL
  311.     LD    DE,OUTFCB    ; Now for the output fcb
  312.     CALL    CLRFCB        ; Clear it
  313.     INC    DE        ; Leave "DE" pointing at filename area
  314.     CALL    CPYNAM        ; Copies filename from input fcb to output fcb
  315.  
  316. ; The following routine allows files with a "Y" as the second character
  317. ; of their filetype to have a compressed filetype of "xYY".  This code
  318. ; was released to the public domain as a patch for CRUNCH24.  The
  319. ; author is unknown.
  320.  
  321.     LD    HL,OUTFCB+9    ; point to first filetype character
  322.     LD    A,' '        ; see if filetype is blank
  323.     CP    (HL)
  324.     LD    A,'Y'        ; we'll need a Y later
  325.     JR    Z,ZZZ        ; (yes, force a filetype of "YYY"
  326.     INC    HL        ; point to second filetype character
  327.     CP    (HL)        ; is middle character a "Y"
  328.     JR    NZ,XZY        ; (no, so make type "1Y3"
  329.     INC    HL        ; point to last filetype character
  330.     CP    (HL)        ; is last character a "Y"
  331.     JR    NZ,XZZ        ; (no, so make type "1YY")
  332.     DEC    HL        ; point back to first character
  333.     DEC    HL
  334.     CP    (HL)        ; is first character a "Y"?
  335.     JR    NZ,ZZZ        ; (no, "YYY" is okay)
  336.     LD    DE,ERR7        ; it's "YYY", so we can't do it
  337.     JP    SKP991        ; ..but make a straight copy anyway
  338. ZZZ:    LD    (HL),A        ; make first character "Y"
  339.     INC    HL
  340.     LD    (HL),A        ; make second character "Y"
  341.     INC    HL
  342. XZY:
  343. XZZ:    LD    (HL),A        ; make pointed-to character "Y"
  344.  
  345. ;.......................................................................
  346. ;
  347. ; Now open the output file. "OPNOUT" will check for duplicate filenames,
  348. ; and prompt if indicated.  If carry is set on return, the file was not
  349. ; opened.  DE points to an appropriate error message, if any.  The rou-
  350. ; tine also types an arrow to the screen, followed by a "PRNFIL" call to
  351. ; type the DU: and filename to the screen.
  352.  
  353.     CALL    OPNOUT        ; Do all that
  354.     JP    C,SKIP2A    ; Skips to next file if so deemed by "OPNOUT"
  355.  
  356. ;.......................................................................
  357. ;
  358. ; Now both files are open. Eventually either both will be closed, or the
  359. ; input closed and the output deleted.
  360.  
  361.     LD    A,76H        ; Output the "76FE" header
  362.     CALL    OUTB        ; Each call to "OUTB" outputs one byte
  363.     LD    A,0FDH
  364.     CALL    OUTB
  365.     LD    HL,INFCB    ; Pointer to original (input) file's name
  366.     CALL    OUTFIL        ; Embed it into the output file at bytes 2+
  367.     CALL    OUTDAT        ; Include date stamp, if available
  368.     LD    HL,STAMP    ; Pointer to possible additional "stamp" chars
  369.  
  370. IDOULP:    LD    A,(HL)        ; Possibly get a stamp char
  371.     INC    HL        ; Incr bfr pntr
  372.     CALL    OUTB        ; (output at least one zero no matter what)
  373.     OR    A        ; End of stamp bfr?
  374.     JR    NZ,IDOULP    ; Loop till so
  375.  
  376. ;.......................................................................
  377.  
  378.     LD    A,(QUIFM)    ; Print "heading" if in verbose mode
  379.     OR    A
  380.     JR    NZ,QUIET1
  381.     LD    DE,HEADNG    ; (the "in / out  ca  cr" stuff)
  382.     CALL    MESAGE
  383.  
  384. QUIET1:
  385.     LD    A,0FFH        ; Flag as 'old' to COMMON.LIB
  386.     LD    (OLDFLG),A
  387.  
  388. ;=======================================================================
  389. ;
  390. ;            *** Main encoding loop ***
  391. ;
  392. ; --- End-of file processing ---
  393.  
  394.     EXX            ; Go back to the start of file (already
  395.                 ; read some)
  396.     LD    HL,IBUF        ; Point 
  397.     EXX
  398.     LD    HL,SECNT    ; Bugger up sector counter since we just
  399.     INC    (HL)        ; - reset the input pointer
  400.     LD    HL,(INCTR)    ; Decr INCTR for same reason
  401.     DEC    HL
  402.     LD    (INCTR),HL
  403.     LD    A,'0'        ; Reset ASCII display to '0'
  404.     LD    (PROGBF+5),A
  405.  
  406.     LD    HL,TABLE    ; Point to large data space
  407.     LD    A,0        ; ZERO (Actually xx00xxxx) for
  408.                 ; Normal checksum flag to CRLZH
  409.  
  410.     CALL    CRLZH        
  411.     JP    C,INSUFF    ; Only error can be insufficient memory
  412.  
  413. ONBND:    LD    A,(CHKSUM+0)    ; Now output the checksum
  414.     CALL    OUTB        ; (lo byte)
  415.     LD    A,(CHKSUM+1)
  416.     CALL    OUTB        ; (high byte). This completes all output.
  417.  
  418.     CALL    DONE        ; Writes out partial output bfr, thru cur loc
  419.     CALL    CLSOUT        ; Close the output file
  420.     CALL    CLSIN        ; Close the input file (prevents inadvertent
  421.                 ; Accumulation of open files).
  422.  
  423. ;.......................................................................
  424. ;
  425. ; Now we are done with the file.  The size of the resulting file will be
  426. ; compared with the original.  If the resulting file is larger, the file
  427. ; will be erased and the original will be copied in uncompressed format
  428. ; instead.  This will only be done if the source and destination DU:'s
  429. ; are different (obviously a direct copy to the same drive and user is
  430. ; nonsensical).  When this is the case, the user will be given the op-
  431. ; tion of saving the "crunched" file - if he doesn't, then it will be
  432. ; erased.
  433.  
  434.     LD    A,(BIGFLG)    ; Get size question override flag
  435.     AND    A        ; Check if non-0, clear carry at same time
  436.     JP    NZ,NEXT        ; Skip if bigger
  437.     LD    DE,(INCTR)    ; Size of input file
  438.     LD    HL,(OUTCTR)    ; Size of resulting file
  439.     SBC    HL,DE        ; Compare
  440.     JP    C,NEXT        ; (normally the case)
  441.  
  442.     LD    A,(DIFDU)    ; Dest du: differ from origin?
  443.     OR    A
  444.     JP    Z,ASKHIM    ; If not, give option of saving larger file
  445.  
  446.     LD    DE,MSG998    ; "not smaller..."
  447.     CALL    MESAG2
  448.     CALL    ERAOUT        ; Erase the output file
  449.  
  450. COPY9:    CALL    COPY        ; Perform a straight copy
  451.     JP    C,NXTFIL    ; If the copy did not actually take place
  452.     JR    NEXT        ; If it did, count it
  453.  
  454. ;.......................................................................
  455.  
  456. SKP991:    CALL    MESAG2        ; Type predefined message
  457.     CALL    CRLF        ; Pretty up line
  458.     LD    A,(DIFDU)    ; Dest du: differ from origin?
  459.     OR    A
  460.     JP    Z,NXTFIL
  461.     JR    COPY9
  462.  
  463. ;.......................................................................
  464.  
  465. ASKHIM:    LD    DE,QUES1    ; Result file not smaller than original
  466.     CALL    MESAGE        ; Ask the guy if he wants it anyway
  467.     CALL    RSPNSE        ; Get his response
  468.     PUSH    AF        ; Nec?
  469.     CALL    CRLF
  470.     POP    AF
  471.     JR    NZ,SKIP4A    ; "skip4a" erases output file, goes to next
  472.  
  473. ;.......................................................................
  474.  
  475. NEXT:    LD    HL,(NFP)    ; Increment # of files processed
  476.     INC    HL
  477.     LD    (NFP),HL
  478.     CALL    ARCIT        ; Flag input file as archived
  479.     CALL    DATSTP        ; Move date stamp
  480.     JP    NXTFIL        ; Repeat if still more files
  481.  
  482. ;.......................................................................
  483.  
  484. SKIP1:    CALL    MESAGE        ; Entry if neither input nor output files
  485.                 ;   have been opened yet
  486. SKIP1A:    JP    NXTFIL        ; (Entry here if no error text desired)
  487.  
  488. ;...............................
  489.  
  490. SKIP2A:    CALL    CLSIN        ; (Entry here for no message)
  491.     JP    NXTFIL
  492.  
  493. ;...............................
  494.  
  495. SKIP4A:    CALL    CLSOUT        ; (Entry here for no message)
  496.     LD    DE,OUTFCB    ; Close, then erase output file
  497.     LD    C,ERASE
  498.     CALL    BDOSAV
  499.     CALL    CLSIN        ; Close input file as well
  500.     JP    NXTFIL
  501.  
  502. ;=======================================================================
  503. ;
  504. ; Subroutine gets a character from the input stream and adds its value
  505. ; to running checksum.
  506.  
  507. GETC:    CALL    GETCHR        ; Get a character into A
  508.     RET    C        ; Don't add in the garbage char recv'd on eof
  509.     CALL    CKSUM        ; Add it in
  510.     AND    A        ; Guarantee clear carry when no eof
  511.     RET            ; That's it
  512.  
  513. ;-----------------------------------------------------------------------
  514. ;
  515. ; Like "PRNFIL", but send chars to the output stream instead of typing.
  516. ; This routine WILL explicitly output blanks in the filename extension.
  517.  
  518. OUTFIL:    LD    BC,0C20H    ; B = loop counter, c = blank character
  519.  
  520. CHARL2:    INC    HL        ; Pre-incr pointer
  521.     LD    A,(HL)        ; Get a char
  522.     CP    C        ; Blank?
  523.     JR    Z,SKPTY2    ; Suppress them (but not in the .ext)
  524.  
  525. TYPEI2:    CALL    OUTB        ; Send char to the output stream
  526.  
  527. SKPTY2:    DEC    B        ; Loop counter
  528.     RET    Z        ; Return when done
  529.  
  530.     LD    A,B        ; Check loop counter
  531.     CP    4        ; At this point, type a "."
  532.     JR    NZ,CHARL2
  533.     LD    A,"."        ; This is also a convenient char to set "C" to
  534.     LD    C,A        ; A "." cannot be found in an fcb filename
  535.     JR    TYPEI2        ; Type the ".".  do no incr hl.
  536.  
  537. ;.......................................................................
  538. ;
  539. ; Like OUTFIL, but outputs date stamp to the output stream
  540.  
  541. OUTDAT:    LD    A,(DATFLG)    ; do we have a date stamp?
  542.     OR    A
  543.     RET    Z        ; (no, do nothing)
  544.     LD    A,1        ; a 1 byte is the date stamp lead-in
  545.     CALL    OUTB
  546.     LD    HL,DATBUF    ; point to date stamp buffer
  547.     LD    B,15        ; 15 bytes
  548. OUTDT2:    LD    A,(HL)        ; get date byte
  549.     OR    A        ; zero?
  550.     JR    NZ,OUTDT3    ; (no)
  551.     CPL            ; yes, make it FFh
  552. OUTDT3:    CALL    OUTB
  553.     INC    HL        ; increment pointer
  554.     DJNZ    OUTDT2        ; and loop
  555.     RET
  556.  
  557. ;=======================================================================
  558. ;
  559. ; "Stamp" processing.
  560.  
  561. PRCSTM:    PUSH    DE        ; Called w/ "HL" pointing to text of "stamp"
  562.     LD    DE,STAMP    ; Buffer for holding the date stamp or text
  563.     LD    B,7FH        ; Put a limit on its length
  564.  
  565. STMPLP:    LD    A,(HL)        ; Get a character
  566.     LD    (DE),A        ; Put it in the buffer
  567.     INC    DE
  568.     OR    A        ; Zero denotes end of cmnd tail, ending stamp
  569.     JR    Z,PRCDN1
  570.     INC    HL
  571.     SUB    ']'        ; The "proper" way the stamp should end
  572.     JR    Z,PRCDN2
  573.     DJNZ    STMPLP        ; Get more chars
  574.  
  575. ERR8:    LD    DE,PRSER8    ; Stamp overflow, probably impossible
  576.     JP    FATALU
  577.  
  578. PRCDN1:    POP    DE        ; Come here if null terminated the stamp
  579.     RET            ; Return with the null in "A" & z set
  580.  
  581. PRCDN2:    LD    (DE),A        ; Make sure a null (a has one now) gets here
  582.  
  583. NBLP:    LD    A,(HL)        ; Advance to first non-blank after stamp
  584.     CP    ' '
  585.     JR    NZ,NBC        ; Branch if we have one
  586.     INC    HL        ; Else advance
  587.     DJNZ    NBLP        ; And continue
  588.     JR    ERR8        ; Overflow error
  589.  
  590. NBC:    POP    DE        ; Rtn with "HL" pointing to 1st non-blank char
  591.     OR    A        ; (Return z stat if that character is null)
  592.     RET
  593.  
  594. ;.......................................................................
  595. ;
  596. ; Flag files matching the "exclusion list"
  597.  
  598. EXCLUD:    LD    BC,12        ; Leave 12 in bc for incrementing ix
  599.     LD    IX,FNBUFF    ; Points to beg of filenames
  600.  
  601. OUTLP:    LD    A,(IX+0)    ; Get flag byte for this entry
  602.     CP    0FFH        ; Final [non-] entry?
  603.     RET    Z        ; (return if so)
  604.     OR    A        ; Is it an untagged filename?
  605.     JR    Z,NXTFN        ; If so, leave it that way & move to next
  606.     LD    HL,EXTBL-3    ; Beginning of "exclusion" list
  607.  
  608. INRLP0:    INC    HL
  609.  
  610. INRLP1:    INC    HL        ; (If HL already incremnted once)
  611.  
  612. INRLP2:    INC    HL        ; ( "          "    twice)
  613.     LD    A,(HL)        ; Get a char from list
  614.     OR    A        ; End of list?
  615.     JR    Z,NXTFN        ; If so, move on to next filename in "fnbuff"
  616.     CP    '?'        ; Wildcard?
  617.     JR    Z,AUTOM1    ; Yes, automatically matches
  618.     CP    (IX+9)        ; Else see if it matches first ft char
  619.     JR    NZ,INRLP0    ; No match, forget it and move to next filename
  620.  
  621. AUTOM1:    INC    HL
  622.     LD    A,(HL)        ; Repeat twice more for other 2 chars
  623.     CP    '?'
  624.     JR    Z,AUTOM2
  625.     CP    (IX+10)
  626.     JR    NZ,INRLP1
  627.  
  628. AUTOM2:    INC    HL
  629.     LD    A,(HL)        ; As above
  630.     CP    '?'
  631.     JR    Z,AUTOM3
  632.     CP    (IX+11)
  633.     JR    NZ,INRLP2
  634.  
  635. AUTOM3:    LD    A,02H        ; File type matches; flag file as "excluded"
  636.     LD    (IX+0),A
  637.  
  638. NXTFN:    ADD    IX,BC        ; Move to next filename in "fnbuff"
  639.     JR    OUTLP
  640.  
  641. ;=======================================================================
  642. ;
  643. ; All ASCII centralized here as a service to disassembly hobbyists.
  644.  
  645. INTRO:    DB    'LZH Cruncher  Version ',VERS/10+'0','.',VERS MOD 10+'0'
  646.     DB    SUBVERS,CR,LF,'$'
  647. ERR7:    DB    ' [ Can''t compress .YYY files ]$'
  648. MSGCR:    DB    ' [ Already crunched ] $'
  649. MSGSQ:    DB    ' [ Already squeezed ] $'
  650. MSGLZH:    DB    ' [ Already LZH encoded ] $'
  651. MSG998:    DB    ' [ Result not smaller ] $'
  652. QUES1:    DB    'Result not smaller--Save anyway (Y/[N])? ',BELL,'$'
  653. USAGE:    DB    'Usage:',CR,LF
  654.     DB    '   $'
  655. PRGNAM:    DB    'CRLZH  '    ; must end in space, if < 8 characters
  656. COMNAM:    DB    '        '
  657. SYNTX1:    DB    ' {d$'
  658. SYNTX2:    DB    ':}afn {d$'
  659. USAGE1:    DB    ':} {[text]} {/options}',CR,LF
  660.     DB    'Second parameter is destination.',CR,LF
  661.     DB    '"[text]" is any text enclosed in brackets.',CR,LF
  662.     DB    'Options following slash:',CR,LF
  663.     DB    '   Q   Quiet mode o$'
  664. USAGE2:    DB    CR,LF
  665.     DB    '   I   Inspect (Tag) mode o$'
  666. USAGE3:    DB    CR,LF
  667.     DB    '   T   Same as I',CR,LF
  668.     DB    '   E   $'
  669. USAGE4:    DB    'Erase existing files',CR,LF
  670.     DB    '   A   Archive mode o$'
  671. USAGE5:    DB    CR,LF
  672.     DB    '   S   $'
  673. USAGE6:    DB    'clude System files$'
  674.  
  675. ;=======================================================================
  676.  
  677. ; ** Include file begins here **
  678.  
  679.     INCLUDE    COMMONLZ.LIB
  680.  
  681. ; ** Include file ends here **
  682.  
  683. ;=======================================================================
  684. ; File I/O For LZH
  685. ;
  686.  
  687. PLZHEN    EQU    OUTB
  688. GLZHEN    EQU    GETC
  689.  
  690. ;=======================================================================
  691.  
  692. ; Additional misc ram locs which need not be initialized, or are init-
  693. ; ialized by the routines which use them.
  694.  
  695. CSAVE:    DS    1
  696.  
  697. ;...............................
  698.  
  699. SAFETY:    DS    16        ; Safety region beyond stack limit check
  700. ENDPRG    EQU    $        ; (approx bottom of stack)
  701.  
  702. ;_______________________________________________________________________
  703.  
  704. STKSZ    EQU    8        ; Minimum stack size (pages)
  705. IBUFSZ    EQU    8        ; Input buffer size (pages)
  706.  
  707. ;=======================================================================
  708. ;
  709. ; ===> All tables will begin at "MEMPAG", defined at the top of the
  710. ;      program.  This should be set to a page aligned value i.e., ad-
  711. ;      dress that ends in "00")  which is ABOVE the end all program and
  712. ;      data segments.  You may have to do one test link to determine the
  713. ;      proper value (changing "MEMPAG" will not change the length of the
  714. ;      segments on the subsequent link).
  715. ;
  716. ; "MEMPAG" is defined at the beginning of this program to remind you to
  717. ; set it properly.  If you set it higher than necessary, there will be
  718. ; no negative effect other than an increase in the TPA required to run
  719. ; the program.    If you set it too low, you will be in big trouble.  The
  720. ; value must be set manually because most linkers cannot resolve an
  721. ; "and", "shift" or "hi" byte extraction at link time to determine the
  722. ; page boundary.
  723. ;
  724. ;=======================================================================
  725.  
  726. ; "MAXFLS" is  buffer size (in files) for wildcard expansions.    Room for
  727. ; this many files will be allocated.
  728.  
  729. MAXFLS    EQU    256
  730.  
  731. TOPSTK    EQU    MEMPAG+(STKSZ*256) ; Top of stack
  732. IBUF    EQU    TOPSTK           ; (= beginning of input buffer)
  733. EIBUF    EQU    IBUF+(IBUFSZ*256)  ; End of input buffer
  734. TABLE    EQU    EIBUF           ; (= beginning of table)
  735. EOTBL    EQU    TABLE+(5*20*256)   ; End of table
  736. FNBUFF    EQU    EOTBL           ; (= beginning of wildcard expansion buffer)
  737. ENDFNB    EQU    FNBUFF+(12*MAXFLS) ; End of expansion buffer
  738.  
  739. STAMP    EQU    ENDFNB           ; File "stamp" buffer ** size temp ***
  740. ENDALL    EQU    STAMP+100H       ; End of everything, except output buffer
  741. OBUF    EQU    ENDALL           ; Beginning of dynamically sized output buffer
  742.  
  743. ;-----------------------------------------------------------------------
  744.  
  745. ENDHI    EQU    HIGH ENDALL    ;
  746. OBUFHI    EQU    HIGH OBUF    ; Output buffer addrress, high byte likewise
  747.  
  748.     END
  749.