home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols200 / vol210 / crc-64.a86 < prev    next >
Text File  |  1994-07-13  |  27KB  |  1,494 lines

  1. TITLE        'CRCK.A86 Version 6.3'
  2. ;
  3. ;    A file CRC checking and generating utility for CP/M-86,
  4. ;    MP/M-86 and Concurrent PCDOS
  5. ;
  6. ;    This version by    Bill Bolton,
  7. ;            Software Tools RCPM,
  8. ;            P.O. Box 357,
  9. ;            Kenmore,
  10. ;            Queensland, 4069
  11. ;            Australia
  12. ;
  13. ;International 61-7-378-9530+
  14. ;Domestic      (07) 378-9530    300 bps CCITT V.21 Standard
  15. ;
  16. ;
  17. ;    This is a fairly literal translation by XLT86,
  18. ;    most of the hard work in preparing the 16 bit version
  19. ;    was done at the 8 bit code level before presenting to
  20. ;    XLT86. From even a cursory examination I can see quite
  21. ;    a lot of code that could be made much more efficent by
  22. ;    using new 8086 instructions to replace the mechanical
  23. ;    translations from 8080 instructions that XLT86 performs.
  24. ;    However the program works as it is, which is what I was
  25. ;    after, so its up to someone else to make it "elegent"
  26. ;    in 8086 code terms. Bill Bolton
  27. ;
  28. ;    *********** NOTE WELL ************
  29. ;
  30. ;    This version uses the "old" CRC polynomial code as
  31. ;    incorrectly described in EDN all those years back
  32. ;    and generates the same CRCKs as most other CRC programs,
  33. ;    including the CRC options in YAM, MODEM and MEX. I have
  34. ;    incremented the version number to 6 to get away from
  35. ;    the "new" CRC polynomial version of CRCK which, although
  36. ;    a technically correct implementation of the polynomial,
  37. ;    produces entirely different CRC values than those found in
  38. ;    the CRCKLIST, CRCKFILE and -CATALOG files on most public
  39. ;    domain disks. Even though the "old" polynomial code doesn't
  40. ;    implement the polynomial correctly, it still works just as
  41. ;    effectively as the correct polynomial for the purposes of
  42. ;    identifying the integrity of files on a disk.
  43. ;
  44. ;    Assemble this program with ASM86
  45. ;
  46. ;    GENCMD CRC7 
  47. ;
  48. ;
  49. ;CREDITS
  50. ;
  51. ;    The 8 bit version of the program was originally
  52. ;    conceived by Keith Petersen, W8SDZ, to whom all
  53. ;    glory and honour.
  54. ;
  55. ;The CYCLIC-REDUNDANCY-CHECK number used is based on the
  56. ;CCITT standard polynominal:
  57. ;
  58. ;   X^16 + X^15 + X^13 + X^7 + X^4 + X^2 + X + 1
  59. ;
  60. ;    (well almost, see comments above)
  61. ;
  62. ;Useful for checking accuracy of file transfers.
  63. ;More accurate than a simple checksum.
  64. ;
  65. ;This utility will optionally will write an output file to the
  66. ;default drive, listing the CRC's of all files checked in a
  67. ;single session. See CRCBUILD.A86 for a companion utility which
  68. ;will build -CATALOG files with embedded CRCs which can be
  69. ;checked with this CRC.CMD utility.
  70. ;
  71. ;COMMANDS:   CRCK [drive:]<filename.filetype> [F]
  72. ;
  73. ;Examples:
  74. ;    CRCK MYFILE.ASM    ;CHECK ONLY MYFILE.ASM
  75. ;    CRCK *.ASM    ;CHECK ALL .ASM FILES
  76. ;    CRCK *.* F    ;CHECK ALL FILES, MAKE FILE OF RESULTS
  77. ;            ; WITH NAME F.CRC
  78. ;    CRCK        ;Will attempt to find CRCKLIST.???
  79. ;            ; or CRCKFILE.??? or -CATALOG.???    
  80. ;            ; and try to match recorded CRC values
  81. ;            ; in that file with values calculated
  82. ;            ; on the fly for files on the disk. 
  83. ;
  84. ;
  85. ;VERSION LIST, most recent version first
  86. ;
  87. ;30/Oct/84 Added CLOSE to file read routines, as Concurrent DOS
  88. ;          was reporting "Too many Files Open" error when CRCing
  89. ;       disks with lots of directory entries. Made the same
  90. ;       changes to the 8 bit versions.
  91. ;       CP/M-86/Concurrent version 6.4. Bill Bolton
  92. ;    
  93. ;10/Oct/84 Fixed CP/M-86 version to also work with Concurrent PCDOS,
  94. ;       and MP/M-86. The "?" in the OPEN function calls was
  95. ;       upsetting them. CP/M-86/Concurrent version 6.3. Bill Bolton
  96. ;
  97. ;09/Oct/84 XLT86 translation of 8 bit source code version, massaged
  98. ;       by hand to make it assemble with ASM86 for CP/M-86.
  99. ;          CP/M-86 version 6.2. Bill Bolton
  100. ;
  101. ;07/Oct/84 Tightened 8 bit disassembly considerably and moved all
  102. ;       the data together preparatory to XLT86ing for CP/M-86.
  103. ;       CP/M-80 version 6.2. Bill Bolton
  104. ;
  105. ;04/Oct/84 Disassembled CRC version 5.0 as distributed for some years
  106. ;       on SIG/M disks, but no source has even been available from
  107. ;       SIG/M. This version checks the -CATALOG files built with
  108. ;       CRCBUILD as well as CRCKLIST and CRCKFILE. Obviously used
  109. ;       SEQIO macros for much of the file I/O but as the aim is
  110. ;       translation to CP/M-86 I left the macros expanded. Lifted
  111. ;       recognisable bits of code (like MFNAME) from other sources
  112. ;       to get comments. Version number 6.1. 
  113. ;       Bill Bolton, Software Tools RCPM, Brisbane Australia
  114. ;
  115. ;
  116. BDOS    EQU    224
  117. ;
  118. RDCON    EQU    1        ;BDOS console input
  119. WRCON    EQU    2        ;BDOS console output
  120. PRINT    EQU    9        ;BDOS display string
  121. CSTAT    EQU    11        ;BDOS console status
  122. OPEN    EQU    15        ;BDOS file open
  123. CLOSE    EQU    16        ;BDOS file close
  124. SRCHF    EQU    17        ;BDOS search for first
  125. SRCHN    EQU    18        ;BDOS search for next
  126. DELETE    EQU    19        ;BDOS delete file
  127. READ    EQU    20        ;BDOS read file
  128. WRITE    EQU    21        ;BDOS write file
  129. MAKE    EQU    22        ;BDOS create file
  130. RENAME    EQU    23        ;BDOS rename existing file
  131. SETDMA    EQU    26        ;BDOS set transfer address
  132. ;
  133. FCB    EQU    5CH        ;Default file control block
  134. FCBEXT    EQU    FCB+12
  135. FCB2    EQU    FCB+16
  136. FCBRNO    EQU    7CH
  137. SECTBUFF EQU    80H        ;Defualt transfer buffer
  138. ;
  139. TAB    EQU    09H        ;ASCII modulo 8 tab
  140. ALF    EQU    0AH        ;ASCII line feed
  141. ACR    EQU    0DH        ;ASCII carriage returnq
  142. EOF    EQU    1AH        ;CP/M end of file marker
  143. ;
  144. BUFSIZE    EQU    4000H        ;File buffers
  145. ;
  146. M    EQU    Byte Ptr 0[BX]    ;XLT86 strikes again
  147. ;
  148.     CSEG
  149. ;
  150. START:
  151.     MOV    AX,DS
  152.     MOV    SS,AX
  153.     MOV    SP,(Offset STACK)    ;start local stack
  154.     CALL    CRLF
  155.     MOV    DX,(Offset SIGNON)    ;Tell them who we are
  156.     CALL    DISPLAY
  157.     MOV    AL,Byte Ptr .FCB+1    ;Point to file name
  158.     CMP    AL,' '            ;Is it there?
  159.     JZ    CONTINUE
  160.     JMP    FILE@OUT@CHECK        ;Yes
  161. ;
  162. CONTINUE:
  163.     MOV    DX,(Offset SRCH@LIST)    ;Searching for CRCKLIST.??? file
  164.     CALL    DISPLAY
  165.     CALL    OPENCRCFILE
  166.     JZ    PROCESSIT
  167.     MOV    DX,(Offset SRCH@FILE)
  168.     CALL    DISPLAY            ;Searching for CRCKFILE.??? file
  169.     MOV    DX,(Offset FCBCRCFILE)+1
  170.     MOV    BX,(Offset FIRST@TRY)
  171.     MOV    CX,11
  172.     CALL    MOVER
  173.     CALL    OPENCRCFILE
  174.     JZ    PROCESSIT
  175.     JMP    CATCHECK
  176. ;
  177. PROCESSIT:
  178.     MOV    SP,(Offset STACK)    ;Reinitialise stack
  179.     CALL    FINDCRC
  180.     JZ    PROCESS2
  181.     JMP    ABEXT2
  182. ;
  183. PROCESS2:
  184.     MOV    DX,(Offset ARROW)
  185.     MOV    BX,(Offset BUFFER)
  186.     MOV    CX,11
  187.     CALL    COMPARE
  188.     JNZ    NONSENSE
  189.     CALL    ISNAME
  190.     JNZ    NONSENSE
  191.     MOV    DX,(Offset EQUALS)
  192.     MOV    CL,31
  193.     CALL    COMPARE
  194.     JNZ    NONSENSE
  195.     CALL    STORECRC
  196.     JNZ    NONSENSE
  197.     MOV    BX,(Offset BUFFER)+11
  198.     CALL    SHOWNAME
  199.     JMPS    PROCESSIT
  200. ;
  201. NONSENSE:
  202.     CALL    NOPARSE
  203.     JMPS    PROCESSIT
  204. ;
  205. READFILE:
  206.     MOV    BX,Word Ptr CRCFILELEN
  207.     XCHG    BX,DX
  208.     MOV    BX,Word Ptr CRCFILEPTR
  209.     MOV    AL,BL
  210.     SUB    AL,DL
  211.     MOV    AL,BH
  212.     SBB    AL,DH
  213.     JB    READABYTE
  214.     MOV    BX,0
  215.     MOV    Word Ptr CRCFILEPTR,BX
  216. READLOOP:
  217.     XCHG    BX,DX
  218.     MOV    BX,Word Ptr CRCFILELEN
  219.     MOV    AL,DL
  220.     SUB    AL,BL
  221.     MOV    AL,DH
  222.     SBB    AL,BH
  223.     JNB    READASEC
  224.     MOV    BX,Word Ptr CRCFILEADR
  225.     ADD    BX,DX
  226.     XCHG    BX,DX
  227.     MOV    CL,SETDMA
  228.     INT    BDOS
  229.     MOV    DX,(Offset FCBCRCFILE)
  230.     MOV    CL,READ
  231.     INT    BDOS
  232.     OR    AL,AL
  233.     JNZ    LASTREAD
  234.     MOV    DX,SECTBUFF
  235.     MOV    BX,Word Ptr CRCFILEPTR
  236.     ADD    BX,DX
  237.     MOV    Word Ptr CRCFILEPTR,BX
  238.     JMPS    READLOOP
  239. ;
  240. LASTREAD:
  241.     MOV    BX,Word Ptr CRCFILEPTR
  242.     MOV    Word Ptr CRCFILELEN,BX
  243. READASEC:
  244.     MOV    DX,SECTBUFF
  245.     MOV    CL,SETDMA
  246.     INT    BDOS
  247.     MOV    BX,0
  248.     MOV    Word Ptr CRCFILEPTR,BX
  249. READABYTE:
  250.     XCHG    BX,DX
  251.     MOV    BX,Word Ptr CRCFILEADR
  252.     ADD    BX,DX
  253.     XCHG    BX,DX
  254.     MOV    BX,Word Ptr CRCFILELEN
  255.     MOV    AL,BL
  256.     OR    AL,BH
  257.     MOV    AL,EOF
  258.     JNZ    READBYTE1
  259.     RET
  260. ;
  261. READBYTE1:
  262.     MOV    SI,DX
  263.     MOV    AL,[SI]
  264.     MOV    BX,Word Ptr CRCFILEPTR
  265.     LAHF
  266.     INC    BX
  267.     SAHF
  268.     MOV    Word Ptr CRCFILEPTR,BX
  269.     RET
  270. ;
  271. OPENCRCFILE:
  272.     XOR    AL,AL
  273.     MOV    Byte Ptr FCBCRCFILE+12,AL
  274.     MOV    Byte Ptr FCBCRCFILE+32,AL
  275.     MOV    BX,BUFSIZE
  276.     MOV    Word Ptr CRCFILELEN,BX
  277.     MOV    Word Ptr CRCFILEPTR,BX
  278.     MOV    BX,(Offset FCBCRCFILE)    ;CCP/M doesn't like "?" in
  279.     MOV    DX,(Offset FCB)        ; OPEN function calls, so 
  280.     MOV    CX,12            ; since we already have
  281.     CALL    MOVER            ; MFNAME in the code, use it to 
  282.     CALL    MFNAME            ; get a definitive filename
  283.     JB    OPENFAIL        ; to attempt an open. Only
  284.     MOV    BX,(Offset FCB)        ; the first matching name is
  285.     MOV    DX,(Offset FCBCRCFILE)    ; tried for an open, but this is all
  286.     MOV    CX,12            ; the orginal code achieved anyway.
  287.     CALL    MOVER            
  288.     MOV    CL,OPEN
  289.     MOV    DX,(Offset FCBCRCFILE)
  290.     INT    BDOS
  291.     INC    AL
  292.     JNZ    FILEMATCH
  293. OPENFAIL:
  294.     MOV    CL,PRINT
  295.     MOV    DX,(Offset NOFILECRC)
  296.     INT    BDOS
  297.     JMP    FILERR
  298. ;
  299. FILEMATCH:
  300.     MOV    BX,(Offset FCBCRCFILE)+1
  301.     MOV    DX,(Offset BUFFER)
  302.     MOV    CX,8
  303.     CALL    MOVER
  304.     MOV    AL,'.'
  305.     MOV    SI,DX
  306.     MOV    [SI],AL
  307.     INC    DX
  308.     MOV    CX,3
  309.     CALL    MOVER
  310.     XOR    AL,AL
  311.     MOV    SI,DX
  312.     MOV    [SI],AL
  313.     MOV    DX,(Offset CHECKING)    ;Show which file we are checking
  314.     CALL    DISPLAY
  315.     MOV    BX,(Offset BUFFER)
  316. MATCHLOOP:
  317.     MOV    AL,M
  318.     OR    AL,AL
  319.     JZ    MATCHINIT
  320.     CALL    TYPER
  321.     INC    BX
  322.     JMPS    MATCHLOOP
  323. ;
  324. MATCHINIT:
  325.     CALL    CRLF
  326.     CALL    CRLF
  327.     XOR    AL,AL
  328.     MOV    Byte Ptr MATCHNO,AL
  329.     MOV    Byte Ptr NOMATCH,AL
  330.     MOV    Byte Ptr FAILED,AL
  331.     MOV    Byte Ptr FILES,AL
  332.     RET
  333. ;
  334. FINDCRC:
  335.     MOV    BX,(Offset BUFFER)
  336.     MOV    AL,0
  337.     MOV    Byte Ptr CURSOR,AL    ;Reset cursor counter to start of line
  338. FINDCRC1:
  339.     PUSH    BX
  340.     CALL    READFILE
  341.     POP    BX
  342.     CMP    AL,EOF
  343.     JNZ    FINDCRC2
  344.     MOV    AL,Byte Ptr CURSOR
  345.     OR    AL,AL
  346.     JNZ    FINDDONE
  347.     MOV    AL,Byte Ptr CRCENTRY
  348.     OR    AL,AL
  349.     JNZ    FINDCRC1A
  350.     JMP    DONEIT
  351. ;
  352. FINDCRC1A:
  353.     MOV    DX,(Offset NOFIND)    ;File not found
  354.     CALL    DISPLAY
  355.     MOV    AL,EOF
  356.     OR    AL,AL
  357.     RET
  358. ;
  359. FINDCRC2:
  360.     AND    AL,07FH            ;Make sure its ASCII
  361.     CMP    AL,ACR            ;End of line?
  362.     JZ    ENDOFLINE        ;Yes
  363.     CMP    AL,ALF            ;End of line?
  364.     JZ    ENDOFLINE        ;Yes
  365.     MOV    M,AL            ;No
  366.     INC    BX
  367.     MOV    AL,Byte Ptr CURSOR    ;Bump cursor pointer
  368.     INC    AL
  369.     MOV    Byte Ptr CURSOR,AL
  370.     CMP    AL,80            ;End of line?
  371.     JB    FINDCRC1        ;No
  372. ENDOFLINE:
  373.     MOV    AL,Byte Ptr CURSOR
  374.     OR    AL,AL
  375.     JZ    FINDCRC
  376. FINDDONE:
  377.     MOV    M,0
  378.     XOR    AL,AL
  379.     RET
  380. ;
  381. NOPARSE:
  382.     MOV    DX,(Offset CANTPARSE)    ;Cant parse string
  383.     CALL    DISPLAY
  384.     MOV    BX,(Offset BUFFER)
  385. PARSELOOP:
  386.     MOV    AL,M
  387.     OR    AL,AL
  388.     JZ    SHOWERR
  389.     CALL    TYPER
  390.     INC    BX
  391.     JMPS    PARSELOOP
  392. ;
  393. SHOWERR:
  394.     CALL    CRLF
  395.     MOV    BX,(Offset BUFFER)
  396.     INC    CH
  397.     DEC    CH
  398.     JZ    SHOWERR3
  399. SHOWERR1:
  400.     MOV    AL,TAB
  401.     CMP    AL,M
  402.     JZ    SHOWERR2
  403.     MOV    M,' '
  404. SHOWERR2:
  405.     INC    BX
  406.     DEC    CH
  407.     JNZ    SHOWERR1
  408. SHOWERR3:
  409.     MOV    M,'^'
  410.     INC    BX
  411.     MOV    M,0
  412.     MOV    BX,(Offset BUFFER)
  413. SHOWERR4:
  414.     MOV    AL,M
  415.     OR    AL,AL
  416.     JZ    RECORDERR
  417.     CALL    TYPER
  418.     INC    BX
  419.     JMPS    SHOWERR4
  420. ;
  421. RECORDERR:
  422.     MOV    BX,(Offset FAILED)
  423.     INC    M
  424.     CALL    CRLF
  425.     RET
  426. ;
  427. COMPARE:
  428.     MOV    SI,DX
  429.     MOV    AL,[SI]
  430.     CMP    AL,M
  431.     JZ    COMPARE1
  432.     RET
  433. ;
  434. COMPARE1:
  435.     INC    BX
  436.     INC    DX
  437.     INC    CH
  438.     MOV    AL,CH
  439.     CMP    AL,CL
  440.     JNZ    COMPARE2
  441.     RET
  442. ;
  443. COMPARE2:
  444.     JMPS    COMPARE
  445. ;
  446. SHOWNAME:
  447.     PUSH    BX
  448.     MOV    DX,FCB+1
  449.     MOV    CX,8
  450.     CALL    MOVER
  451.     INC    BX
  452.     MOV    CX,3
  453.     MOV    DX,FCB+9
  454.     CALL    MOVER
  455.     XOR    AL,AL
  456.     MOV    M,AL
  457.     POP    BX
  458. SHOWLOOP:
  459.     MOV    AL,M
  460.     OR    AL,AL
  461.     JZ    SHOWDONE
  462.     CALL    TYPER
  463.     INC    BX
  464.     JMPS    SHOWLOOP
  465. ;
  466. SHOWDONE:
  467.     MOV    AL,1
  468.     MOV    Byte Ptr MFFLG1,AL
  469.     MOV    DX,(Offset DASH)    ;Display delimiter
  470.     CALL    DISPLAY
  471.     CALL    MFNAME
  472.     JNB    TRYMATCH
  473.     MOV    DX,(Offset NOFIND2)
  474.     CALL    DISPLAY
  475.     MOV    BX,(Offset FILES)
  476.     INC    M
  477.     XOR    AL,AL
  478.     INC    AL
  479.     RET
  480. ;
  481. TRYMATCH:
  482.     MOV    AL,1
  483.     MOV    Byte Ptr MATCHFLG,AL    ;We found some filenames to check
  484.     CALL    OPENIT
  485.     JZ    TRYMATCH1
  486.     RET
  487. ;
  488. TRYMATCH1:
  489.     MOV    AL,Byte Ptr OLDCRC+1
  490.     MOV    CH,AL
  491.     MOV    AL,Byte Ptr REM
  492.     CMP    AL,CH
  493.     JNZ    MISMATCH
  494.     MOV    AL,Byte Ptr OLDCRC
  495.     MOV    CH,AL
  496.     MOV    AL,Byte Ptr REM+1
  497.     CMP    AL,CH
  498.     JNZ    MISMATCH
  499.     MOV    DX,(Offset MATCHMSG)    ;**Match**
  500.     CALL    DISPLAY
  501.     XOR    AL,AL
  502.     MOV    Byte Ptr CRCENTRY,AL
  503.     MOV    BX,(Offset MATCHNO)
  504.     INC    M
  505.     XOR    AL,AL
  506.     RET
  507. ;
  508. MISMATCH:
  509.     MOV    DX,(Offset ISWAS)    ; <--is, was -->
  510.     CALL    DISPLAY
  511.     MOV    AL,Byte Ptr OLDCRC
  512.     CALL    HEXO
  513.     MOV    AL,' '
  514.     CALL    TYPER
  515.     MOV    AL,Byte Ptr OLDCRC+1
  516.     CALL    HEXO
  517.     CALL    CRLF
  518.     XOR    AL,AL
  519.     MOV    Byte Ptr CRCENTRY,AL
  520.     MOV    BX,(Offset NOMATCH)
  521.     INC    M
  522.     XOR    AL,AL
  523.     INC    AL
  524.     RET
  525. ;
  526. STORECRC:
  527.     CALL    HEXBIN
  528.     JZ    STORECRC0
  529.     RET
  530. ;
  531. STORECRC0:
  532.     MOV    Byte Ptr OLDCRC,AL
  533.     MOV    AL,M
  534.     INC    BX
  535.     CMP    AL,' '
  536.     JZ    STORECRC1
  537.     MOV    DX,(Offset NOTSPACE)    ;No space between CRC values
  538.     CALL    DISPLAY
  539.     XOR    AL,AL
  540.     INC    AL
  541.     RET
  542. ;
  543. STORECRC1:
  544.     CALL    HEXBIN
  545.     JZ    STORECRC2
  546.     RET
  547. ;
  548. STORECRC2:
  549.     MOV    Byte Ptr OLDCRC+1,AL
  550.     MOV    CH,AL
  551.     XOR    AL,AL
  552.     RET
  553. ;
  554. CATCHECK:
  555.     MOV    DX,(Offset SRCH@CAT)    ;Searching -CATALOG file
  556.     CALL    DISPLAY
  557.     MOV    DX,(Offset FCBCRCFILE)+1
  558.     MOV    BX,(Offset CATALOG)
  559.     MOV    CX,11
  560.     CALL    MOVER
  561.     CALL    OPENCRCFILE
  562.     JZ    PARSELINE
  563.     JMP    ABEXT2
  564. ;
  565. PARSELINE:
  566.     CALL    FINDCRC
  567.     JZ    PARSE2
  568.     JMP    ABEXT2
  569. ;
  570. PARSE2:
  571.     MOV    CH,0
  572.     MOV    BX,(Offset BUFFER)    ;Point to catalog entry
  573.     CALL    THREENUM        ;Check for 3 digit volume number
  574.     JNZ    TRYAGAIN
  575.     MOV    AL,'.'            ;Followed by separator
  576.     CMP    AL,M
  577.     JNZ    TRYAGAIN
  578.     LAHF
  579.     INC    BX
  580.     SAHF
  581.     INC    CH
  582.     CALL    TWONUM            ;Check for 2 digit entry number
  583.     JNZ    TRYAGAIN
  584.     CALL    ISWHITE            ;Skip over white space
  585.     JNZ    TRYAGAIN
  586.     CALL    ISNAME            ;Check for valid file name
  587.     JNZ    TRYAGAIN
  588.     CALL    ISWHITE            ;Skip over white space
  589.     JNZ    NOGOOD
  590.     CALL    ISNUM            ;Check for first digit of filesize
  591.     JNZ    NOGOOD
  592. SKIP:
  593.     CALL    ISNUM
  594.     JZ    SKIP
  595.     CMP    AL,'K'            ;Filesize ends in K
  596.     JNZ    NOGOOD
  597.     CALL    ISWHITE            ;Skip over white space
  598.     JNZ    NOGOOD
  599.     CALL    STORECRC        ;Now we should be at the CRC
  600.     JNZ    NOGOOD
  601.     MOV    BX,Word Ptr POINTER
  602.     CALL    SHOWNAME
  603.     JMPS    PARSELINE
  604. ;
  605. TRYAGAIN:
  606.     MOV    AL,Byte Ptr CRCENTRY
  607.     OR    AL,AL
  608.     JNZ    PARSELINE
  609. NOGOOD:
  610.     CALL    NOPARSE
  611.     JMP    PARSELINE
  612. ;
  613. ISNAME:
  614.     MOV    Word Ptr POINTER,BX
  615.     CALL    ISALPHA            ;Check first character
  616.     JZ    ISNAME0
  617.     RET
  618. ;
  619. ISNAME0:
  620.     MOV    CL,7            ;7 left in rest of filename
  621. ISNAME1:
  622.     CALL    ISALPHA
  623.     JZ    ISNAME2
  624.     CMP    AL,' '            ;Maybe padded with spaces?
  625.     JZ    ISNAME2
  626.     RET
  627. ;
  628. ISNAME2:
  629.     DEC    CL            ;Done?
  630.     JNZ    ISNAME1            ;No
  631.     MOV    AL,M            ;Yes
  632.     INC    BX
  633.     INC    CH
  634.     CMP    AL,'.'            ;Valid separator?
  635.     JZ    ISNAME3
  636.     RET
  637. ;
  638. ISNAME3:
  639.     MOV    CL,3            ;3 in filetype
  640. ISNAME4:
  641.     CALL    ISALPHA
  642.     JZ    ISNAME5
  643.     CMP    AL,' '            ;Padded with spaces
  644.     JZ    ISNAME5
  645.     RET
  646. ;
  647. ISNAME5:
  648.     DEC    CL            ;Done?
  649.     JNZ    ISNAME4            ;No
  650.     RET                ;Yes
  651. ;
  652. ISWHITE:
  653.     MOV    AL,M
  654.     CMP    AL,' '            ;Space?
  655.     JZ    WHITELOOP        ;Yes, check some more
  656.     CMP    AL,TAB            ;No, maybe a TAB?
  657.     JZ    WHITELOOP
  658.     RET                ;No, something else
  659. ;
  660. WHITELOOP:
  661.     INC    BX            ;Point to next char
  662.     INC    CH
  663.     MOV    AL,M
  664.     CMP    AL,' '            ;Space?
  665.     JZ    WHITELOOP        ;Yes, check some more
  666.     CMP    AL,TAB            ;No, maybe a TAB? 
  667.     JZ    WHITELOOP        ;Yes, check some more
  668.     CMP    AL,AL            ;No, something else
  669.     RET
  670. ;
  671. THREENUM:
  672.     CALL    TWONUM
  673.     JZ    THREENUM1
  674.     RET
  675. ;
  676. THREENUM1:
  677.     CALL    ISNUM
  678.     JNZ    THREENUM2
  679.     RET
  680. ;
  681. THREENUM2:
  682.     CMP    AL,'.'
  683.     JZ    THREENUM3
  684.     RET
  685. ;
  686. THREENUM3:
  687.     DEC    BX
  688.     DEC    CH
  689.     CMP    AL,AL
  690.     RET
  691. ;
  692. TWONUM:
  693.     CALL    ISNUM
  694.     JZ    ISNUM
  695.     RET
  696. ;
  697. ISNUM:
  698.     MOV    AL,M
  699.     INC    BX
  700.     INC    CH
  701.     CMP    AL,'0'
  702.     JB    NOTNUM
  703.     CMP    AL,'9'+1
  704.     JNB    NOTNUM
  705.     CMP    AL,AL
  706.     RET
  707. ;
  708. NOTNUM:
  709.     CMP    AL,'0'
  710.     RET
  711. ;
  712. ISALPHA:
  713.     MOV    AL,M
  714.     INC    BX
  715.     INC    CH
  716.     CMP    AL,' '+1
  717.     JB    ALPHA1
  718.     CMP    AL,07FH
  719.     JNB    ALPHA1
  720.     CMP    AL,AL
  721.     RET
  722. ;
  723. ALPHA1:
  724.     CMP    AL,'A'
  725.     RET
  726. ;
  727. HEXBIN:
  728.     CALL    MAKEBIN
  729.     JZ    HEXBIN1
  730.     RET
  731. ;
  732. HEXBIN1:
  733.     ROL    AL,1
  734.     ROL    AL,1
  735.     ROL    AL,1
  736.     ROL    AL,1
  737.     MOV    CL,AL
  738.     CALL    MAKEBIN
  739.     JZ    HEXBIN2
  740.     RET
  741. ;
  742. HEXBIN2:
  743.     MOV    CH,AL
  744.     MOV    AL,CL
  745.     OR    AL,CH
  746.     CMP    AL,AL
  747.     RET
  748. ;
  749. MAKEBIN:
  750.     MOV    AL,M
  751.     INC    BX
  752.     INC    CH
  753.     CMP    AL,'0'
  754.     JB    MAKEBIN2
  755.     SUB    AL,'0'
  756.     CMP    AL,10
  757.     JB    MAKEBIN1
  758.     AND    AL,1FH
  759.     SUB    AL,7H
  760.     CMP    AL,10
  761.     JB    MAKEBIN2
  762.     CMP    AL,16
  763.     JNB    MAKEBIN2
  764. MAKEBIN1:
  765.     CMP    AL,AL            ;Return zero flag not set
  766.     RET
  767. ;
  768. MAKEBIN2:
  769.     OR    AL,AL            ;Return zero flag set
  770.     RET
  771. ;
  772. FILE@OUT@CHECK:
  773.     MOV    AL,Byte Ptr .FCB2+1    ;Point to possible file write command
  774.     MOV    Byte Ptr FFLAG,AL    ;Save as a flag
  775.     CMP    AL,'F'            ;Is it the correct one?
  776.     JZ    FILE@OUT@CHK
  777.     JMP    AGAIN            ;Yes
  778.  
  779. FILE@OUT@CHK:
  780.     JMP    MAKEOUTFILE        ;No
  781. ;
  782. PUTCRCFILE:
  783.     LAHF
  784.     XCHG    AL,AH
  785.     PUSH    AX
  786.     MOV    BX,Word Ptr OUTFILELEN
  787.     XCHG    BX,DX
  788.     MOV    BX,Word Ptr OUTFILEPTR
  789.     MOV    AL,BL
  790.     SUB    AL,DL
  791.     MOV    AL,BH
  792.     SBB    AL,DH
  793.     JB    WRITEABYTE
  794.     MOV    BX,0
  795.     MOV    Word Ptr OUTFILEPTR,BX
  796. PUTCRCLOOP:
  797.     XCHG    BX,DX
  798.     MOV    BX,Word Ptr OUTFILELEN
  799.     MOV    AL,DL
  800.     SUB    AL,BL
  801.     MOV    AL,DH
  802.     SBB    AL,BH
  803.     JNB    STARTASEC
  804.     MOV    BX,Word Ptr OUTFILEADR
  805.     ADD    BX,DX
  806.     XCHG    BX,DX
  807.     MOV    CL,SETDMA
  808.     INT    BDOS
  809.     MOV    DX,(Offset FCBOUTFILE)
  810.     MOV    CL,WRITE
  811.     INT    BDOS
  812.     OR    AL,AL
  813.     JNZ    FULLDISK
  814.     MOV    DX,SECTBUFF
  815.     MOV    BX,Word Ptr OUTFILEPTR
  816.     ADD    BX,DX
  817.     MOV    Word Ptr OUTFILEPTR,BX
  818.     JMPS    PUTCRCLOOP
  819. ;
  820. FULLDISK:
  821.     MOV    CL,PRINT
  822.     MOV    DX,(Offset DISKFULL)
  823.     INT    BDOS
  824.     POP    AX
  825.     XCHG    AL,AH
  826.     JMP    FILERR
  827. ;
  828. STARTASEC:
  829.     MOV    DX,SECTBUFF
  830.     MOV    CL,SETDMA
  831.     INT    BDOS
  832.     MOV    BX,0
  833.     MOV    Word Ptr OUTFILEPTR,BX
  834. WRITEABYTE:
  835.     XCHG    BX,DX
  836.     MOV    BX,Word Ptr OUTFILEADR
  837.     ADD    BX,DX
  838.     XCHG    BX,DX
  839.     POP    AX
  840.     XCHG    AL,AH
  841.     SAHF
  842.     MOV    SI,DX
  843.     MOV    [SI],AL
  844.     MOV    BX,Word Ptr OUTFILEPTR
  845.     LAHF
  846.     INC    BX
  847.     SAHF
  848.     MOV    Word Ptr OUTFILEPTR,BX
  849.     RET
  850. ;
  851. MAKEOUTFILE:
  852.     XOR    AL,AL
  853.     MOV    Byte Ptr FCBOUTFILE+12,AL
  854.     MOV    Byte Ptr FCBOUTFILE+32,AL
  855.     MOV    BX,BUFSIZE
  856.     MOV    Word Ptr OUTFILELEN,BX
  857.     MOV    BX,0
  858.     MOV    Word Ptr OUTFILEPTR,BX
  859.     MOV    CL,DELETE
  860.     MOV    DX,(Offset FCBOUTFILE)
  861.     INT    BDOS
  862.     MOV    CL,MAKE
  863.     MOV    DX,(Offset FCBOUTFILE)
  864.     INT    BDOS
  865.     INC    AL
  866.     JNZ    AGAIN
  867.     MOV    CL,PRINT
  868.     MOV    DX,(Offset NODIRSPACE)
  869.     INT    BDOS
  870.     JMP    FILERR
  871. ;
  872. AGAIN:
  873.     MOV    SP,(Offset STACK)    ;Reinit stack pointer
  874.     MOV    AL,0
  875.     MOV    Byte Ptr MATCHFLG,AL
  876.     CALL    MFNAME
  877.     JNAE    AGAIN1
  878.     JMP    DOFILECRC
  879. ;
  880. AGAIN1:
  881.     MOV    AL,Byte Ptr MFFLG1
  882.     OR    AL,AL
  883.     JZ    DONE
  884.     MOV    DX,(Offset NOFIND3)
  885.     MOV    CL,PRINT
  886.     INT    BDOS
  887.     JMP    ABEXT2
  888. ;
  889. DONE:
  890.     MOV    AL,Byte Ptr FFLAG
  891.     CMP    AL,'F'
  892.     JNZ    DONEIT
  893. CLEANUP:
  894.     MOV    BX,Word Ptr OUTFILEPTR
  895.     MOV    AL,BL
  896.     AND    AL,07FH
  897.     JNZ    CLOSEIT
  898.     MOV    Word Ptr OUTFILELEN,BX
  899. CLOSEIT:                ;Close CRCKLIST.$$$
  900.     MOV    AL,EOF
  901.     LAHF
  902.     XCHG    AL,AH
  903.     PUSH    AX
  904.     XCHG    AL,AH
  905.     CALL    PUTCRCFILE
  906.     POP    AX
  907.     XCHG    AL,AH
  908.     SAHF
  909.     JNZ    CLEANUP
  910.     MOV    CL,CLOSE
  911.     MOV    DX,(Offset FCBOUTFILE)
  912.     INT    BDOS
  913.     INC    AL
  914.     JNZ    ERASEIT
  915.     MOV    CL,PRINT
  916.     MOV    DX,(Offset CANTCLOSE)
  917.     INT    BDOS
  918.     JMPS    ERASEIT
  919. ;
  920. ERASEIT:                ;Erase any existing CRCKLIST.CRC file
  921.     MOV    CL,DELETE
  922.     MOV    DX,(Offset FCBFINAL)
  923.     INT    BDOS
  924.     MOV    BX,(Offset FCBOUTFILE)
  925.     MOV    DX,(Offset FCBFINAL)
  926.     PUSH    BX
  927.     MOV    CX,16
  928.     ADD    BX,CX
  929. RENLOOP:
  930.     MOV    SI,DX
  931.     MOV    AL,[SI]
  932.     MOV    M,AL
  933.     INC    DX
  934.     INC    BX
  935.     DEC    CL
  936.     JNZ    RENLOOP
  937.     POP    DX
  938.     MOV    CL,RENAME        ;Rename CRCKLIST.$$$ to CRCKLIST.CRC
  939.     INT    BDOS
  940. DONEIT:
  941.     MOV    DX,(Offset FINITO)
  942.     JMP    SIGNOFF
  943. ;
  944. DOFILECRC:
  945.     MOV    BX,FCB+9
  946.     CALL    TSTBAD
  947.     JNZ    DOFILECRC1
  948.     JMP    AGAIN
  949. ;
  950. DOFILECRC1:
  951.     MOV    BX,FCB+1
  952.     MOV    DX,(Offset FNAME)
  953.     MOV    CX,8
  954.     CALL    MOVER
  955.     MOV    BX,FCB+9
  956.     MOV    DX,(Offset FNAME)+9
  957.     MOV    CX,3
  958.     CALL    MOVER
  959.     MOV    DX,(Offset ACRALF)
  960.     CALL    DISPLAY
  961.     CALL    OPENIT
  962.     JNZ    DOFILECRC3
  963.     JMP    AGAIN
  964. ;
  965. DOFILECRC3:
  966.     JMP    ABEXT2
  967. ;
  968. OPENIT:
  969.     MOV    DX,FCB
  970.     MOV    CL,OPEN
  971.     INT    BDOS
  972.     INC    AL
  973.     JNZ    RDINIT
  974.     MOV    DX,(Offset BADOPEN)
  975.     CALL    DISPLAY
  976.     XOR    AL,AL
  977.     INC    AL
  978.     RET
  979. ;
  980. RDINIT:
  981.     MOV    BX,0
  982.     MOV    Word Ptr REM,BX
  983.     MOV    BX,256            ;100H
  984.     MOV    Word Ptr BUFAD,BX
  985. READIT:
  986.     MOV    BX,Word Ptr BUFAD
  987.     MOV    AL,BH            ;Time to read?
  988.     CMP    AL,0
  989.     JZ    NORD            ;No
  990.     MOV    CL,CSTAT        ;Check for operator abort
  991.     INT    BDOS
  992.     OR    AL,AL
  993.     JZ    READ2            ;Nothing from operator
  994.     MOV    CL,RDCON
  995.     INT    BDOS
  996.     CMP    AL,'C' - 40H        ;Control-C ?
  997.     JNZ    READ2
  998.     JMP    ABEXT2
  999. ;
  1000. READ2:
  1001.     MOV    DX,FCB
  1002.     MOV    CL,READ            ;Read another sector of file
  1003.     INT    BDOS
  1004.     OR    AL,AL            ;Check return code
  1005.     JNZ    FINISH
  1006.     MOV    BX,SECTBUFF
  1007. NORD:
  1008.     MOV    AL,M            ;Get a character
  1009.     MOV    Byte Ptr MESS,AL    ;Save for DIVP
  1010.     INC    BX
  1011.     MOV    Word Ptr BUFAD,BX    ;Update buffer address
  1012.     CALL    DIVP            ;Calculate new CRC
  1013.     JMPS    READIT            ;Read some more characters
  1014. ;
  1015. FINISH:
  1016.     CMP    AL,1            ;Normal end of file?
  1017.     JZ    FINISH1            ;Yes
  1018.     CALL    CLOSER
  1019.     JMP    FILERR            ;No, it was a read error
  1020.  
  1021. FINISH1:
  1022.     MOV    AL,Byte Ptr REM+1    ;Get MSP of CRC
  1023.     CALL    HEXO            ;Display it
  1024.     MOV    AL,' '
  1025.     CALL    TYPER
  1026.     MOV    AL,Byte Ptr REM        ;Get LSP of CRC
  1027.     CALL    HEXO            ;Display it
  1028.     CALL    CLOSER
  1029.     XOR    AL,AL
  1030.     RET
  1031. ;
  1032. FILERR:
  1033.     MOV    DX,(Offset READERR)
  1034.     CALL    DISPLAY
  1035.     XOR    AL,AL
  1036.     INC    AL
  1037.     RET
  1038. ;
  1039. CLOSER:
  1040.     MOV    DX,FCB
  1041.     MOV    CL,CLOSE
  1042.     INT    BDOS
  1043.     RET
  1044. ;
  1045. ;---------------------------------------------
  1046. ;An 808& routine for generating a CYCLIC-
  1047. ;REDUNDANCY-CHECK.  Character leaes that
  1048. ;character in location REM.  By Fred Gutman.
  1049. ;From 'EDN' magazine, June 5, 1979 issue, page 84.
  1050. ;
  1051. DIVP:
  1052.     MOV    BX,Word Ptr REM        ;GET REMAINDER
  1053.     MOV    AL,BH
  1054.     AND    AL,128            ;Q-BIT MASK
  1055.     LAHF                ;SAVE STATUS
  1056.     XCHG    AL,AH
  1057.     PUSH    AX
  1058.     SHL    BX,1            ;2 X R(X)
  1059.     MOV    AL,Byte Ptr MESS    ;MESSAGE BIT IN LSB
  1060.     ADD    AL,BL
  1061.     MOV    BL,AL
  1062.     POP    AX
  1063.     XCHG    AL,AH
  1064.     SAHF
  1065.     JZ    QB2            ;IF Q-BIT IS ZERO
  1066. ;
  1067. QB:
  1068.     MOV    AL,BH
  1069.     XOR    AL,0A0H            ;MS HALF OF GEN. POLY
  1070.     MOV    BH,AL
  1071.     MOV    AL,BL
  1072.     XOR    AL,97H            ;LS HALF OF GEN. POLY
  1073.     MOV    BL,AL
  1074. ;
  1075. QB2:
  1076.     MOV    Word Ptr REM,BX
  1077.     RET
  1078. ;
  1079. ;--------------------------------------------
  1080. ;
  1081. ;Hex output
  1082. ;
  1083. HEXO:
  1084.     LAHF                ;SAVE FOR RIGHT DIGIT
  1085.     XCHG    AL,AH
  1086.     PUSH    AX
  1087.     XCHG    AL,AH
  1088.     RCR    AL,1            ;RIGHT..
  1089.     RCR    AL,1            ;..JUSTIFY..
  1090.     RCR    AL,1            ;..LEFT..
  1091.     RCR    AL,1            ;..DIGIT..
  1092.     CALL    NIBBL            ;PRINT LEFT DIGIT
  1093.     POP    AX            ;RESTORE RIGHT
  1094.     XCHG    AL,AH
  1095. ;
  1096. NIBBL:
  1097.     AND    AL,0FH            ;ISOLATE DIGIT
  1098.     CMP    AL,10            ;IS IS <10?
  1099.     JB    NOTALPHA        ;YES, NOT ALPHA
  1100.     ADD    AL,7            ;ADD ALPHA BIAS
  1101. ;
  1102. NOTALPHA:
  1103.     ADD    AL,'0'            ;MAKE PRINTABLE
  1104.     JMPS    TYPER            ;PRINT IT, THEN RETURN
  1105. ;
  1106. DISPLAY:
  1107.     PUSH    BX
  1108.     XCHG    BX,DX
  1109. ILPLP:
  1110.     MOV    AL,M
  1111.     CALL    TYPER
  1112.     INC    BX
  1113.     MOV    AL,M
  1114.     OR    AL,AL
  1115.     JNZ    ILPLP
  1116.     POP    BX
  1117.     RET
  1118. ;
  1119. CRLF:
  1120.     MOV    AL,ACR
  1121.     CALL    TYPER
  1122.     MOV    AL,ALF
  1123. TYPER:
  1124.     PUSH    CX
  1125.     PUSH    DX
  1126.     PUSH    BX
  1127.     AND    AL,07FH            ;ASCII mask
  1128.     MOV    DL,AL
  1129.     PUSH    DX
  1130.     CALL    WRFLAG            ;Write to file if needed
  1131.     POP    DX
  1132.     MOV    CL,WRCON
  1133.     INT    BDOS
  1134.     POP    BX
  1135.     POP    DX
  1136.     POP    CX
  1137.     RET
  1138. ;
  1139. WRFLAG:
  1140.     MOV    AL,Byte Ptr FFLAG
  1141.     CMP    AL,'F'            ;Write to file?
  1142.     JZ    WRFLAG1
  1143.     RET                ;No
  1144. ;
  1145. WRFLAG1:
  1146.     MOV    AL,DL            ;Yes
  1147.     CALL    PUTCRCFILE
  1148.     RET
  1149. ;
  1150. ;
  1151. ;Multi-file access subroutine.  Allows processing
  1152. ;of multiple files (i.e. *.ASM) from disk.  This
  1153. ;routine builds the proper name in the FCB each
  1154. ;time it is called. Carry is set if no more names
  1155. ;can be found. The routine is commented in Pseudo
  1156. ;code, each Pseudo code statement is in <<...>>
  1157. ;
  1158. MFNAME:                ;<<init DMA addr and FCB>>
  1159.     MOV    CL,SETDMA
  1160.     MOV    DX,SECTBUFF
  1161.     INT    BDOS
  1162.     XOR    AL,AL
  1163.     MOV    Byte Ptr .FCBEXT,AL
  1164.     MOV    Byte Ptr .FCBRNO,AL
  1165. ;<<if first time>>
  1166.     MOV    AL,Byte Ptr MFFLG1
  1167.     OR    AL,AL
  1168.     JZ    MFN01
  1169. ;<<save the requested name>>
  1170. ;Save orig request
  1171.     MOV    BX,FCB
  1172.     MOV    DX,(Offset MFREQ)
  1173.     MOV    CX,12
  1174.     CALL    MOVER
  1175.     MOV    AL,Byte Ptr .FCB
  1176.     MOV    Byte Ptr MFCUR,AL    ;SAVE DISK IN CURR FCB
  1177. ;<<SRCHF requested name>>
  1178.     MOV    BX,(Offset MFREQ)
  1179.     MOV    DX,FCB
  1180.     MOV    CX,12
  1181.     CALL    MOVER
  1182.     MOV    CL,SRCHF
  1183.     MOV    DX,FCB
  1184.     INT    BDOS
  1185. ;<<else>>
  1186.     JMPS    MFN02
  1187. ;
  1188. MFN01:                    ;<<SRCHF current name>>
  1189.     MOV    BX,(Offset MFCUR)
  1190.     MOV    DX,FCB
  1191.     MOV    CX,12
  1192.     CALL    MOVER
  1193.     MOV    CL,SRCHF
  1194.     MOV    DX,FCB
  1195.     INT    BDOS
  1196. ;<<SRCHN requested name>>
  1197.     MOV    BX,(Offset MFREQ)
  1198.     MOV    DX,FCB
  1199.     MOV    CX,12
  1200.     CALL    MOVER
  1201.     MOV    CL,SRCHN
  1202.     MOV    DX,FCB
  1203.     INT    BDOS
  1204. ;<<endif>>
  1205. MFN02:                    ;<<return carry if not found>>
  1206.     INC    AL
  1207.     STC
  1208.     JNZ    MFN03
  1209.     RET
  1210. ;
  1211. ;<<move name found to current name>>
  1212. MFN03:
  1213.     DEC    AL
  1214.     AND    AL,3
  1215.     ADD    AL,AL
  1216.     ADD    AL,AL
  1217.     ADD    AL,AL
  1218.     ADD    AL,AL
  1219.     ADD    AL,AL
  1220.     ADD    AL,81H
  1221.     MOV    BL,AL
  1222.     MOV    BH,0
  1223.     PUSH    BX            ;SAVE NAME POINTER
  1224.     MOV    DX,(Offset MFCUR)+1
  1225.     MOV    CX,11
  1226.     CALL    MOVER
  1227. ;<<move name found to FCB>>
  1228.     POP    BX
  1229.     MOV    DX,FCB+1
  1230.     MOV    CX,11
  1231.     CALL    MOVER
  1232. ;<<setup FCB>>
  1233.     XOR    AL,AL
  1234.     MOV    Byte Ptr .FCBEXT,AL
  1235.     MOV    Byte Ptr .FCBRNO,AL
  1236.     MOV    Byte Ptr MFFLG1,AL    ;TURN OFF 1ST TIME SW
  1237. ;<<return>>
  1238.     RET
  1239. ;
  1240. TSTBAD:
  1241.     CALL    TESTIT            ;Check first one for $
  1242.     JZ    TSTBAD1
  1243.     RET
  1244. ;
  1245. TSTBAD1:
  1246.     CALL    TESTIT            ;Check second on
  1247.     JZ    TESTIT
  1248.     RET
  1249. ;
  1250. TESTIT:                    ;Fall through to test third
  1251.     MOV    AL,M
  1252.     AND    AL,07FH
  1253.     CMP    AL,'$'
  1254.     LAHF
  1255.     INC    BX
  1256.     SAHF
  1257.     RET
  1258. ;
  1259. MOVER:
  1260.     MOV    AL,M
  1261.     MOV    SI,DX
  1262.     MOV    [SI],AL
  1263.     INC    BX
  1264.     INC    DX
  1265.     DEC    CX
  1266.     MOV    AL,CH
  1267.     OR    AL,CL
  1268.     JNZ    MOVER
  1269.     RET
  1270. ;
  1271. ABEXT2:
  1272.     MOV    AL,Byte Ptr FFLAG
  1273.     CMP    AL,'F'            ;Writing to file?
  1274.     JNZ    ABEXT3            ;No
  1275. ABEXT2A:                ;Close incomplete file
  1276.     MOV    BX,Word Ptr OUTFILEPTR
  1277.     MOV    AL,BL
  1278.     AND    AL,07FH
  1279.     JNZ    ABEXT2B
  1280.     MOV    Word Ptr OUTFILELEN,BX
  1281. ABEXT2B:
  1282.     MOV    AL,EOF
  1283.     LAHF
  1284.     XCHG    AL,AH
  1285.     PUSH    AX
  1286.     XCHG    AL,AH
  1287.     CALL    PUTCRCFILE
  1288.     POP    AX
  1289.     XCHG    AL,AH
  1290.     SAHF
  1291.     JNZ    ABEXT2A
  1292.     MOV    CL,CLOSE
  1293.     MOV    DX,(Offset FCBOUTFILE)
  1294.     INT    BDOS
  1295.     INC    AL
  1296.     JNZ    ABEXT2C
  1297.     MOV    CL,PRINT
  1298.     MOV    DX,(Offset ABTEXT)
  1299.     INT    BDOS
  1300.     JMPS    ABEXT2C
  1301. ;
  1302. ABEXT2C:
  1303.     MOV    CL,DELETE
  1304.     MOV    DX,(Offset FCBOUTFILE)
  1305.     INT    BDOS
  1306. ABEXT3:
  1307.     MOV    DX,(Offset ABORT)
  1308. SIGNOFF:
  1309.     MOV    CL,PRINT
  1310.     INT    BDOS
  1311.     MOV    AL,Byte Ptr MATCHFLG
  1312.     OR    AL,AL
  1313.     JZ    EXIT
  1314.     XOR    AL,AL
  1315.     MOV    Byte Ptr FFLAG,AL
  1316.     CALL    CRLF
  1317.     MOV    DX,(Offset CRCMATCH)
  1318.     CALL    DISPLAY
  1319.     MOV    AL,Byte Ptr MATCHNO
  1320.     CALL    DECIMAL
  1321.     MOV    AL,Byte Ptr NOMATCH
  1322.     OR    AL,AL
  1323.     JZ    PARSE
  1324.     CALL    CRLF
  1325.     MOV    DX,(Offset CRCNOMATCH)
  1326.     CALL    DISPLAY
  1327.     MOV    AL,Byte Ptr NOMATCH
  1328.     CALL    DECIMAL
  1329. PARSE:
  1330.     MOV    AL,Byte Ptr FAILED
  1331.     OR    AL,AL
  1332.     JZ    NOTFOUND
  1333.     CALL    CRLF
  1334.     MOV    DX,(Offset BADPARSE)
  1335.     CALL    DISPLAY
  1336.     MOV    AL,Byte Ptr FAILED
  1337.     CALL    DECIMAL
  1338. NOTFOUND:
  1339.     MOV    AL,Byte Ptr FILES
  1340.     OR    AL,AL
  1341.     JZ    EXIT
  1342.     CALL    CRLF
  1343.     MOV    DX,(Offset QTYNOFIND)
  1344.     CALL    DISPLAY
  1345.     MOV    AL,Byte Ptr FILES
  1346.     CALL    DECIMAL
  1347. EXIT:
  1348.     MOV    CX,0
  1349.     MOV    DX,0
  1350.     INT    BDOS        ;We're off to see the wizard...
  1351. ;
  1352. DECIMAL:
  1353.     MOV    DL,0
  1354.     MOV    CH,064H
  1355.     CALL    DEC1
  1356.     MOV    CH,10
  1357.     CALL    DEC1
  1358.     ADD    AL,'0'
  1359.     JMP    TYPER
  1360. ;
  1361. DEC1:
  1362.     MOV    CL,0FFH
  1363. DEC2:
  1364.     INC    CL
  1365.     SUB    AL,CH
  1366.     JNB    DEC2
  1367.     ADD    AL,CH
  1368.     MOV    DH,AL
  1369.     MOV    AL,CL
  1370.     OR    AL,DL
  1371.     JZ    DEC3
  1372.     OR    AL,'0'
  1373.     CALL    TYPER
  1374.     MOV    DL,'0'
  1375. DEC3:
  1376.     MOV    AL,DH
  1377.     RET
  1378. ;
  1379.     DSEG
  1380. ;
  1381.     ORG    100H
  1382. ;
  1383. FIRST@TRY    DB    'CRCKFILE???',0
  1384. ;
  1385. SIGNON        DB    'CRC, CP/M-86 Ver 6.4, 30/Oct/84, Bill Bolton',ACR,ALF
  1386.         DB    'CTL-S pauses, CTL-C aborts',ACR,ALF,0
  1387. ;
  1388. SRCH@LIST    DB    '++Searching for CRCKLIST file++',0
  1389. ;
  1390. SRCH@FILE    DB    'Now searching for "CRCKFILE" file++',0
  1391. ;
  1392. NOFILECRC    DB    ACR,ALF
  1393.         DB    'NO FILECRC FILE$'
  1394. ;
  1395. CHECKING    DB    TAB,'Checking with file - ',0
  1396. ;
  1397. NOFIND        DB    '***No CRC Files found***$',0
  1398. ;
  1399. CANTPARSE    DB    'Can not parse string',ACR,ALF,0
  1400. ;
  1401. DASH        DB    ' - ',0
  1402. ;
  1403. NOFIND2        DB    'File not found',ACR,ALF,0
  1404. ;
  1405. MATCHMSG    DB    ' *Match*',ACR,ALF,0
  1406. ;
  1407. ISWAS        DB    ' <-- is, was --> ',0
  1408. ;
  1409. NOTSPACE    DB    'Not a space between CRC values',0
  1410. ;
  1411. SRCH@CAT    DB    '++ Now searching for "-CATALOG" file++',0
  1412. ;
  1413. DISKFULL    DB    ACR,ALF
  1414.         DB    'DISK FULL: CRCFILE$'
  1415. ;
  1416. NODIRSPACE    DB    ACR,ALF
  1417.         DB    'NO DIR SPACE: CRCFILE$'
  1418. ;
  1419. NOFIND3        DB    '++FILE NOT FOUND++$'
  1420. ;
  1421. CANTCLOSE    DB    ACR,ALF
  1422.         DB    'CANNOT CLOSE CRCFILE$'
  1423. ;
  1424. FINITO        DB    ACR,ALF
  1425.         DB    'DONE$'
  1426. ;
  1427. ACRALF        DB    ACR,ALF
  1428. ARROW        DB    '--> FILE:  '
  1429. FNAME        DB    'XXXXXXXX.XXX'
  1430. EQUALS        DB    TAB,TAB,'CRC = ',0
  1431. ;
  1432. BADOPEN        DB    '++OPEN FAILED++',0
  1433. ;
  1434. READERR        DB    TAB,TAB,'++FILE READ ERROR++',ACR,ALF,0
  1435. ;
  1436. ABTEXT        DB    ACR,ALF
  1437.         DB    'CANNOT CLOSE CRCFILE$'
  1438. ;
  1439. ABORT        DB    ACR,ALF,ACR,ALF
  1440.         DB    '++ABORTED++$'
  1441. ;
  1442. CRCMATCH    DB    'Quantity of file CRC that matched - ',0
  1443. ;
  1444. CRCNOMATCH    DB    'Quantity of file CRC that did not match - ',0
  1445. ;
  1446. BADPARSE    DB    'Quantity of lines failed parse test - ',0
  1447. ;
  1448. QTYNOFIND    DB    'Quantity of file(s) not found - ',0
  1449. ;
  1450. FCBCRCFILE    DB    0,'CRCKLIST???',0
  1451.         DB    0,'CRCKFILE???',0
  1452.         RS    7
  1453. CRCFILEADR    DW    (Offset CRCFILEBUF)
  1454. CRCFILELEN    DW    BUFSIZE
  1455. CRCFILEPTR    RS    2
  1456. ;
  1457. FCBOUTFILE    DB    0,'CRCKLIST$$$'
  1458.         DB    0
  1459.         RS    20
  1460. OUTFILEADR    DW    (Offset OUTFILEBUF)
  1461. OUTFILELEN    DW    BUFSIZE
  1462. OUTFILEPTR    RS    2
  1463. ;
  1464. CATALOG        DB    '-CATALOG???',0
  1465. ;
  1466. FCBFINAL    DB    0,'CRCKLISTCRC',0
  1467.         RS    20
  1468. ;
  1469. POINTER        RS    2
  1470. MATCHNO        RS    1
  1471. NOMATCH        RS    1
  1472. FAILED        RS    1
  1473. FILES        RS    1
  1474. FFLAG        RS    1
  1475. REM        RS    2
  1476. OLDCRC        RS    2
  1477. MESS        RS    1
  1478. MFFLG1        DB    1
  1479. CRCENTRY    DW    1
  1480. MFREQ        RS    12
  1481. MFCUR        RS    12
  1482. MATCHFLG    RS    1
  1483. BUFAD        RS    2
  1484. CURSOR        RS    2
  1485. BUFFER        RB    80
  1486. ;
  1487.         RB    96
  1488. STACK        DB    0
  1489. ;
  1490. CRCFILEBUF    RB    BUFSIZE
  1491. OUTFILEBUF    RB    BUFSIZE
  1492. ;
  1493.     END
  1494.