home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / utils / squsq / crlzh11.lbr / CRLZH11.ZY0 / CRLZH11.ZY0
Text File  |  1989-12-12  |  25KB  |  717 lines

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